From 7fb0a792148bf1c62ff32ae1d436e8235f2ce6d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 01:00:05 -0500 Subject: [PATCH 001/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.2 to 1.27.6 (#2979) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.2 to 1.27.6. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.2...service/s3/v1.27.6) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 16 ++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index e5ed90b004..ef1a353fcf 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.13.0 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.20.1 + github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.33 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 @@ -84,14 +84,14 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.32 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 // indirect - github.com/aws/smithy-go v1.14.1 // indirect + github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 604f38b70a..93e838fb1d 100644 --- a/go.sum +++ b/go.sum @@ -103,22 +103,25 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.20.1 h1:rZBf5DWr7YGrnlTK4kgDQGn1ltqOg5orCYb/UhOFZkg= github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= +github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= +github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2/config v1.18.33 h1:JKcw5SFxFW/rpM4mOPjv0VQ11E2kxW13F3exWOy7VZU= github.com/aws/aws-sdk-go-v2/config v1.18.33/go.mod h1:hXO/l9pgY3K5oZJldamP0pbZHdPqqk+4/maa7DSD3cA= github.com/aws/aws-sdk-go-v2/credentials v1.13.32 h1:lIH1eKPcCY1ylR4B6PkBGRWMHO3aVenOKJHWiS4/G2w= github.com/aws/aws-sdk-go-v2/credentials v1.13.32/go.mod h1:lL8U3v/Y79YRG69WlAho0OHIKUXCyFvSXaIvfo81sls= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 h1:DK/9C+UN/X+1+Wm8pqaDksQr2tSLzq+8X1/rI/ZxKEQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8/go.mod h1:ce7BgLQfYr5hQFdy67oX2svto3ufGtm6oBvmsHScI1Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38 h1:c8ed/T9T2K5I+h/JzmF5tpI46+OODQ74dzmdo+QnaMg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32 h1:hNeAAymUY5gu11WrrmFb3CVIp9Dar9hbo44yzzcQpzA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 h1:fc0ukRAiP1syoSGZYu+DaE+FulSYhTiJ8WpVu5jElU4= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2 h1:HbEoy5QzXicnGgGWF4moCgsbio2xytgVQcs70xD3j3w= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.2/go.mod h1:Fc5ZJyxghsjGp1KqbLb2HTJjsJjSv6AXUikHUJYmCHM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 h1:YUQGnci0QY+X+tu7XI7zy2vnUjmuUw0VT4OC1SikKIw= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 h1:dGAseBFEYxth10V23b5e2mAS+tX7oVbfYHD6dnDdAsg= @@ -129,8 +132,9 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 h1:OJELEgyaT2kmaBGZ+myyZbTT github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2/go.mod h1:ubDBBaDFs1GHijSOTi8ljppML15GLG0HxhILtbjNNYQ= github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 h1:ympg1+Lnq33XLhcK/xTG4yZHPs1Oyxu+6DEWbl7qOzA= github.com/aws/aws-sdk-go-v2/service/sts v1.21.2/go.mod h1:FQ/DQcOfESELfJi5ED+IPPAjI5xC6nxtSolVVB773jM= -github.com/aws/smithy-go v1.14.1 h1:EFKMUmH/iHMqLiwoEDx2rRjRQpI1YCn5jTysoaDujFs= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= +github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 8fc9021778c2d8fa1736f9e52f6ecdfa4464adaf Mon Sep 17 00:00:00 2001 From: Bart Smykla Date: Tue, 22 Aug 2023 08:03:25 +0200 Subject: [PATCH 002/264] fix(controller): typo fix ("Secrete" -> "Secret") in secret informer (#2965) fix: typo fix ("Secrete" -> "Secret") in secret informer Signed-off-by: Bart Smykla --- cmd/rollouts-controller/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 2b603ec8b6..ad7190c585 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -165,7 +165,7 @@ func newCommand() *cobra.Command { resyncDuration, kubeinformers.WithNamespace(notificationConfigNamespace), kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { - options.Kind = "Secrete" + options.Kind = "Secret" options.FieldSelector = fmt.Sprintf("metadata.name=%s", record.NotificationSecret) }), ) From addf856ce9310b09effb32cd07ecfe9b5477cef1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 08:54:35 -0500 Subject: [PATCH 003/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.33 to 1.18.36 (#2978) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.33 to 1.18.36. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.33...config/v1.18.36) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index ef1a353fcf..71d26b6f38 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.33 + github.com/aws/aws-sdk-go-v2/config v1.18.36 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.32 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.35 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 // indirect github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 93e838fb1d..39bead170e 100644 --- a/go.sum +++ b/go.sum @@ -106,32 +106,32 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.33 h1:JKcw5SFxFW/rpM4mOPjv0VQ11E2kxW13F3exWOy7VZU= -github.com/aws/aws-sdk-go-v2/config v1.18.33/go.mod h1:hXO/l9pgY3K5oZJldamP0pbZHdPqqk+4/maa7DSD3cA= -github.com/aws/aws-sdk-go-v2/credentials v1.13.32 h1:lIH1eKPcCY1ylR4B6PkBGRWMHO3aVenOKJHWiS4/G2w= -github.com/aws/aws-sdk-go-v2/credentials v1.13.32/go.mod h1:lL8U3v/Y79YRG69WlAho0OHIKUXCyFvSXaIvfo81sls= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8 h1:DK/9C+UN/X+1+Wm8pqaDksQr2tSLzq+8X1/rI/ZxKEQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.8/go.mod h1:ce7BgLQfYr5hQFdy67oX2svto3ufGtm6oBvmsHScI1Q= +github.com/aws/aws-sdk-go-v2/config v1.18.36 h1:mLNA12PWU1Y+ueOO79QgQfKIPhc1MYKl44RmvASkJ7Q= +github.com/aws/aws-sdk-go-v2/config v1.18.36/go.mod h1:8AnEFxW9/XGKCbjYDCJy7iltVNyEI9Iu9qC21UzhhgQ= +github.com/aws/aws-sdk-go-v2/credentials v1.13.35 h1:QpsNitYJu0GgvMBLUIYu9H4yryA5kMksjeIVQfgXrt8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.35/go.mod h1:o7rCaLtvK0hUggAGclf76mNGGkaG5a9KWlp+d9IpcV8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39 h1:fc0ukRAiP1syoSGZYu+DaE+FulSYhTiJ8WpVu5jElU4= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.39/go.mod h1:WLAW8PT7+JhjZfLSWe7WEJaJu0GNo0cKc2Zyo003RBs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 h1:GPUcE/Yq7Ur8YSUk6lVkoIMWnJNO0HT18GUzCWCgCI0= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 h1:YUQGnci0QY+X+tu7XI7zy2vnUjmuUw0VT4OC1SikKIw= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32 h1:dGAseBFEYxth10V23b5e2mAS+tX7oVbfYHD6dnDdAsg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.32/go.mod h1:4jwAWKEkCR0anWk5+1RbfSg1R5Gzld7NLiuaq5bTR/Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.2 h1:A2RlEMo4SJSwbNoUUgkxTAEMduAy/8wG3eB2b2lP4gY= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.2/go.mod h1:ju+nNXUunfIFamXUIZQiICjnO/TPlOmWcYhZcSy7xaE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2 h1:OJELEgyaT2kmaBGZ+myyZbTTLobfe3ox3FSh5eYK9Qs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.2/go.mod h1:ubDBBaDFs1GHijSOTi8ljppML15GLG0HxhILtbjNNYQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.2 h1:ympg1+Lnq33XLhcK/xTG4yZHPs1Oyxu+6DEWbl7qOzA= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.2/go.mod h1:FQ/DQcOfESELfJi5ED+IPPAjI5xC6nxtSolVVB773jM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.5 h1:oCvTFSDi67AX0pOX3PuPdGFewvLRU2zzFSrTsgURNo0= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.5/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 h1:dnInJb4S0oy8aQuri1mV6ipLlnZPfnsDNB9BGO9PDNY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 h1:CQBFElb0LS8RojMJlxRSo/HXipvTZW2S44Lt9Mk2aYQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.5/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= From 2b7fb7e54b3ced944a8e6297aa6dc7878429be66 Mon Sep 17 00:00:00 2001 From: izturn <44051386+izturn@users.noreply.github.com> Date: Thu, 24 Aug 2023 00:49:18 +0800 Subject: [PATCH 004/264] docs: add contour integration information to README.md (#2980) * add contour to README.md Signed-off-by: gang.liu * chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.33 to 1.18.36 (#2978) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.33 to 1.18.36. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.33...config/v1.18.36) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: gang.liu * little refactor Signed-off-by: gang.liu * Update docs/features/traffic-management/plugins.md Co-authored-by: Wilson Wu Signed-off-by: gang.liu --------- Signed-off-by: gang.liu Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wilson Wu --- README.md | 21 ++++++++++++--------- docs/features/traffic-management/plugins.md | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 977a35eaa6..29232308b8 100644 --- a/README.md +++ b/README.md @@ -48,20 +48,23 @@ For these reasons, in large scale high-volume production environments, a rolling * Metric provider integration: Prometheus, Wavefront, Kayenta, Web, Kubernetes Jobs, Datadog, New Relic, InfluxDB ## Supported Traffic Shaping Integrations -| Traffic Shaping Integration | SetWeight | SetWeightExperiments | SetMirror | SetHeader | -|-----------------------------------|------------------------------|-----------------------------|----------------------------|----------------------------| -| ALB Ingress Controller | :white_check_mark: (stable) | :white_check_mark: (stable) | :x: | :white_check_mark: (alpha) | -| Ambassador | :white_check_mark: (stable) | :x: | :x: | :x: | -| Apache APISIX Ingress Controller | :white_check_mark: (alpha) | :x: | :x: | :white_check_mark: (alpha) | -| Istio | :white_check_mark: (stable) | :white_check_mark: (stable) | :white_check_mark: (alpha) | :white_check_mark: (alpha) | -| Nginx Ingress Controller | :white_check_mark: (stable) | :x: | :x: | :x: | -| SMI | :white_check_mark: (stable) | :white_check_mark: (stable) | :x: | :x: | -| Traefik | :white_check_mark: (beta) | :x: | :x: | :x: | +| Traffic Shaping Integration | SetWeight | SetWeightExperiments | SetMirror | SetHeader | Implemented As Plugin | +|-----------------------------------|------------------------------|-----------------------------|----------------------------|----------------------------|-----------------------------| +| ALB Ingress Controller | :white_check_mark: (stable) | :white_check_mark: (stable) | :x: | :white_check_mark: (alpha) | | +| Ambassador | :white_check_mark: (stable) | :x: | :x: | :x: | | +| Apache APISIX Ingress Controller | :white_check_mark: (alpha) | :x: | :x: | :white_check_mark: (alpha) | | +| Istio | :white_check_mark: (stable) | :white_check_mark: (stable) | :white_check_mark: (alpha) | :white_check_mark: (alpha) | | +| Nginx Ingress Controller | :white_check_mark: (stable) | :x: | :x: | :x: | | +| SMI | :white_check_mark: (stable) | :white_check_mark: (stable) | :x: | :x: | | +| Traefik | :white_check_mark: (beta) | :x: | :x: | :x: | | +| Contour | :white_check_mark: (beta) | :x: | :x: | :x: | :heavy_check_mark: | :white_check_mark: = Supported :x: = Not Supported +:heavy_check_mark: = Yes + ## Documentation To learn more about Argo Rollouts go to the [complete documentation](https://argo-rollouts.readthedocs.io/en/stable/). diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index 26e1d6c1bf..a6747f14fa 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -74,7 +74,7 @@ responsibility of the Argo Rollouts administrator to define the plugin installat It is not meant to be used in production. It is based on the built-in prometheus provider. #### [Contour](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-contour) -* This is a plugin for support Contour. +* This is a plugin that allows argo-rollouts to work with contour's resource: HTTPProxy. It enables traffic shaping patterns such as canary releases and more. #### [Gateway API](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi/) -* Provide support for Gateway API, which includes Kuma, Traefix, cilium, Contour, GloodMesh, HAProxy, and [many others](https://gateway-api.sigs.k8s.io/implementations/#implementation-status). \ No newline at end of file +* Provide support for Gateway API, which includes Kuma, Traefix, cilium, Contour, GloodMesh, HAProxy, and [many others](https://gateway-api.sigs.k8s.io/implementations/#implementation-status). \ No newline at end of file From 68d7ffec68cd8a22182796bfc938383a699f1e96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 11:49:38 -0500 Subject: [PATCH 005/264] chore(deps): bump slsa-framework/slsa-github-generator from 1.8.0 to 1.9.0 (#2983) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.8.0 to 1.9.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.8.0...v1.9.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ae80d1f4e0..f8fb311bba 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.8.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} @@ -141,7 +141,7 @@ jobs: id-token: write # Needed for provenance signing and ID contents: write # Needed for release uploads # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.8.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.9.0 with: base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" provenance-name: "argo-rollouts.intoto.jsonl" From bcb7e489f42eeaf2a1b83d096179e6252afbeafa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 17:30:02 +0000 Subject: [PATCH 006/264] docs: Update Changelog (#2952) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9255af062..63bef5a828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,173 @@ + +## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) + +### Chore + +* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) +* bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) +* Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) +* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) +* add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) +* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) +* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) +* Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) +* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) +* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) +* **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) +* **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 ([#2884](https://github.com/argoproj/argo-rollouts/issues/2884)) +* **deps:** bump docker/setup-qemu-action from 2.1.0 to 2.2.0 ([#2878](https://github.com/argoproj/argo-rollouts/issues/2878)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 ([#2883](https://github.com/argoproj/argo-rollouts/issues/2883)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 ([#2880](https://github.com/argoproj/argo-rollouts/issues/2880)) +* **deps:** bump actions/setup-go from 4.0.0 to 4.0.1 ([#2881](https://github.com/argoproj/argo-rollouts/issues/2881)) +* **deps:** bump docker/setup-buildx-action from 2.5.0 to 2.9.1 ([#2879](https://github.com/argoproj/argo-rollouts/issues/2879)) +* **deps:** bump docker/login-action from 2.1.0 to 2.2.0 ([#2877](https://github.com/argoproj/argo-rollouts/issues/2877)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 ([#2886](https://github.com/argoproj/argo-rollouts/issues/2886)) +* **deps:** bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 ([#2882](https://github.com/argoproj/argo-rollouts/issues/2882)) +* **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) +* **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) +* **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) +* **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) +* **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) +* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) +* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) +* **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) +* **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) +* **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) +* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) +* **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) +* **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) +* **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) +* **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) +* **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) +* **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 ([#2708](https://github.com/argoproj/argo-rollouts/issues/2708)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 ([#2710](https://github.com/argoproj/argo-rollouts/issues/2710)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 ([#2705](https://github.com/argoproj/argo-rollouts/issues/2705)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 ([#2704](https://github.com/argoproj/argo-rollouts/issues/2704)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 ([#2703](https://github.com/argoproj/argo-rollouts/issues/2703)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 ([#2702](https://github.com/argoproj/argo-rollouts/issues/2702)) +* **deps:** bump peter-evans/create-pull-request from 4 to 5 ([#2697](https://github.com/argoproj/argo-rollouts/issues/2697)) +* **deps:** bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#2698](https://github.com/argoproj/argo-rollouts/issues/2698)) +* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 ([#2684](https://github.com/argoproj/argo-rollouts/issues/2684)) + +### Ci + +* generate attestations during a release ([#2785](https://github.com/argoproj/argo-rollouts/issues/2785)) +* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) + +### Docs + +* mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) +* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) +* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) +* Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) +* Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) +* support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) +* Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) +* Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) +* use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) +* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) +* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) +* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) +* Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) +* Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) +* Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) +* Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) +* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) +* Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) +* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) +* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) +* **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) +* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) +* **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) + +### Feat + +* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) +* enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) +* support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) +* Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) +* Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) +* Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) +* add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) +* retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) +* **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) +* **controller:** Add custom metadata support for AnalysisRun. Fixes [#2740](https://github.com/argoproj/argo-rollouts/issues/2740) ([#2743](https://github.com/argoproj/argo-rollouts/issues/2743)) +* **dashboard:** Refresh Rollouts dashboard UI ([#2723](https://github.com/argoproj/argo-rollouts/issues/2723)) +* **metricprovider:** allow user to define metrics.provider.job.metadata ([#2762](https://github.com/argoproj/argo-rollouts/issues/2762)) + +### Fix + +* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) +* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) +* rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) +* get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) +* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) +* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) +* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) +* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) +* add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) +* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) +* **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) +* **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) +* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) +* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) +* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) +* **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) + +### Refactor + +* change plugin naming pattern [#2720](https://github.com/argoproj/argo-rollouts/issues/2720) ([#2722](https://github.com/argoproj/argo-rollouts/issues/2722)) + +### BREAKING CHANGE + + +The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. + +Remove name label from k8s some client metrics + +The `name` label in the `controller_clientset_k8s_request_total` metric +produce an excessive amount of cardinality for `events` and `replicasets`. +This can lead to hundreds of thousands of unique metrics over a couple +weeks in a large deployment. Set the name to "N/A" for these client request +types. + + ## [v1.5.1](https://github.com/argoproj/argo-rollouts/compare/v1.5.0...v1.5.1) (2023-05-24) From 5e2249f6d02a0209fae229f7a09d9d8777a8345b Mon Sep 17 00:00:00 2001 From: izturn <44051386+izturn@users.noreply.github.com> Date: Fri, 25 Aug 2023 23:51:38 +0800 Subject: [PATCH 007/264] docs: add Gateway-API integration information to README.md (#2985) add plugin: gateway-api to README.md Signed-off-by: gang.liu --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 29232308b8..ce786a860b 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ For these reasons, in large scale high-volume production environments, a rolling | SMI | :white_check_mark: (stable) | :white_check_mark: (stable) | :x: | :x: | | | Traefik | :white_check_mark: (beta) | :x: | :x: | :x: | | | Contour | :white_check_mark: (beta) | :x: | :x: | :x: | :heavy_check_mark: | +| Gateway API | :white_check_mark: (alpha) | :x: | :x: | :x: | :heavy_check_mark: | :white_check_mark: = Supported From f28d70cc47536e74f8662cca520b1395023373f9 Mon Sep 17 00:00:00 2001 From: Dylan Schlager <62440614+schlags@users.noreply.github.com> Date: Fri, 25 Aug 2023 09:52:53 -0600 Subject: [PATCH 008/264] feat(trafficrouting): use values array for multiple accepted values under same header name (#2974) * feat(headername): allow traffic forward condition string to append to matching headername conditions Signed-off-by: Dylan Schlager * chore: remove unnecessary comments from tests Signed-off-by: Dylan Schlager * chore: fix linting failures Signed-off-by: Dylan Schlager --------- Signed-off-by: Dylan Schlager --- rollout/trafficrouting/alb/alb.go | 27 +++++-- rollout/trafficrouting/alb/alb_test.go | 102 +++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/rollout/trafficrouting/alb/alb.go b/rollout/trafficrouting/alb/alb.go index b1b9ff0f25..d91f211655 100644 --- a/rollout/trafficrouting/alb/alb.go +++ b/rollout/trafficrouting/alb/alb.go @@ -515,17 +515,28 @@ func getTrafficForwardActionString(r *v1alpha1.Rollout, port int32) (string, err return string(bytes), nil } +// Two exact matches with the same header name should be merged into the values array of the same condition +func upsertCondition(res []ingressutil.ALBCondition, match v1alpha1.HeaderRoutingMatch) []ingressutil.ALBCondition { + for i, condition := range res { + if condition.HttpHeaderConfig.HttpHeaderName == match.HeaderName { + res[i].HttpHeaderConfig.Values = append(res[i].HttpHeaderConfig.Values, match.HeaderValue.Exact) + return res + } + } + condition := ingressutil.ALBCondition{ + Field: "http-header", + HttpHeaderConfig: ingressutil.HttpHeaderConfig{ + HttpHeaderName: match.HeaderName, + Values: []string{match.HeaderValue.Exact}, + }, + } + return append(res, condition) +} + func getTrafficForwardConditionString(headerRoute *v1alpha1.SetHeaderRoute) (string, error) { var res []ingressutil.ALBCondition for _, match := range headerRoute.Match { - condition := ingressutil.ALBCondition{ - Field: "http-header", - HttpHeaderConfig: ingressutil.HttpHeaderConfig{ - HttpHeaderName: match.HeaderName, - Values: []string{match.HeaderValue.Exact}, - }, - } - res = append(res, condition) + res = upsertCondition(res, match) } bytes := jsonutil.MustMarshal(res) return string(bytes), nil diff --git a/rollout/trafficrouting/alb/alb_test.go b/rollout/trafficrouting/alb/alb_test.go index e81b456941..52fd5a6ec7 100644 --- a/rollout/trafficrouting/alb/alb_test.go +++ b/rollout/trafficrouting/alb/alb_test.go @@ -1866,6 +1866,108 @@ func TestSetHeaderRoute(t *testing.T) { assert.Len(t, client.Actions(), 1) } +func TestSetHeaderRouteWithDifferentHeaderNames(t *testing.T) { + ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) + ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ + {Name: "header-route"}, + } + + i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + client := fake.NewSimpleClientset(i) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + + err = r.SetHeaderRoute(&v1alpha1.SetHeaderRoute{ + Name: "header-route", + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "origin", + HeaderValue: &v1alpha1.StringMatch{ + Exact: "https://www.fake-origin1.com", + }, + }, + { + HeaderName: "Agent", + HeaderValue: &v1alpha1.StringMatch{ + Exact: "Chrome", + }, + }, + }, + }) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 1) + + // no managed routes, no changes expected + err = r.RemoveManagedRoutes() + assert.Nil(t, err) + assert.Len(t, client.Actions(), 1) +} + +func TestSetHeaderRouteWithDuplicateHeaderNameMatches(t *testing.T) { + ro := fakeRollout(STABLE_SVC, CANARY_SVC, nil, "ingress", 443) + ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ + {Name: "header-route"}, + } + + i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) + client := fake.NewSimpleClientset(i) + k8sI := kubeinformers.NewSharedInformerFactory(client, 0) + k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + if err != nil { + t.Fatal(err) + } + + r, err := NewReconciler(ReconcilerConfig{ + Rollout: ro, + Client: client, + Recorder: record.NewFakeEventRecorder(), + ControllerKind: schema.GroupVersionKind{Group: "foo", Version: "v1", Kind: "Bar"}, + IngressWrapper: ingressWrapper, + }) + assert.NoError(t, err) + + err = r.SetHeaderRoute(&v1alpha1.SetHeaderRoute{ + Name: "header-route", + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "origin", + HeaderValue: &v1alpha1.StringMatch{ + Exact: "https://www.fake-origin1.com", + }, + }, + { + HeaderName: "origin", + HeaderValue: &v1alpha1.StringMatch{ + Exact: "https://www.fake-origin2.com", + }, + }, + }, + }) + assert.Nil(t, err) + assert.Len(t, client.Actions(), 1) + + // no managed routes, no changes expected + err = r.RemoveManagedRoutes() + assert.Nil(t, err) + assert.Len(t, client.Actions(), 1) +} + func TestSetHeaderRouteMultiIngress(t *testing.T) { ro := fakeRolloutWithMultiIngress(STABLE_SVC, CANARY_SVC, nil, []string{"ingress", "multi-ingress"}, 443) ro.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes = []v1alpha1.MangedRoutes{ From 2ff5d2cb4571b4b3a3f5b918594fbf474b15c165 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:53:10 -0500 Subject: [PATCH 009/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.36 to 1.18.37 (#2984) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.36 to 1.18.37. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.36...config/v1.18.37) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 71d26b6f38..9e9be625e7 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.36 + github.com/aws/aws-sdk-go-v2/config v1.18.37 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 github.com/blang/semver v3.5.1+incompatible diff --git a/go.sum b/go.sum index 39bead170e..0afedb5693 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.36 h1:mLNA12PWU1Y+ueOO79QgQfKIPhc1MYKl44RmvASkJ7Q= -github.com/aws/aws-sdk-go-v2/config v1.18.36/go.mod h1:8AnEFxW9/XGKCbjYDCJy7iltVNyEI9Iu9qC21UzhhgQ= +github.com/aws/aws-sdk-go-v2/config v1.18.37 h1:RNAfbPqw1CstCooHaTPhScz7z1PyocQj0UL+l95CgzI= +github.com/aws/aws-sdk-go-v2/config v1.18.37/go.mod h1:8AnEFxW9/XGKCbjYDCJy7iltVNyEI9Iu9qC21UzhhgQ= github.com/aws/aws-sdk-go-v2/credentials v1.13.35 h1:QpsNitYJu0GgvMBLUIYu9H4yryA5kMksjeIVQfgXrt8= github.com/aws/aws-sdk-go-v2/credentials v1.13.35/go.mod h1:o7rCaLtvK0hUggAGclf76mNGGkaG5a9KWlp+d9IpcV8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= From 252e6eeaa01801ffde00fea90127c25108f7760c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:54:07 -0500 Subject: [PATCH 010/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.21.0 to 1.21.3 (#2977) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.21.0 to 1.21.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.21.0...service/efs/v1.21.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 9e9be625e7..693906b264 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.37 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index 0afedb5693..92563ee4c8 100644 --- a/go.sum +++ b/go.sum @@ -103,7 +103,6 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.20.1/go.mod h1:NU06lETsFm8fUC6ZjhgDpVBcGZTFQ6XM+LZWZxMI4ac= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2/config v1.18.37 h1:RNAfbPqw1CstCooHaTPhScz7z1PyocQj0UL+l95CgzI= @@ -112,18 +111,16 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.35 h1:QpsNitYJu0GgvMBLUIYu9H4yryA github.com/aws/aws-sdk-go-v2/credentials v1.13.35/go.mod h1:o7rCaLtvK0hUggAGclf76mNGGkaG5a9KWlp+d9IpcV8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.38/go.mod h1:qggunOChCMu9ZF/UkAfhTz25+U2rLVb3ya0Ua6TTfCA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.32/go.mod h1:0ZXSqrty4FtQ7p8TEuRde/SZm9X05KT18LAUlR40Ln0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 h1:GPUcE/Yq7Ur8YSUk6lVkoIMWnJNO0HT18GUzCWCgCI0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 h1:YUQGnci0QY+X+tu7XI7zy2vnUjmuUw0VT4OC1SikKIw= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0 h1:lSCNS+ZMztgQWoLz/I27HdYjKlUaKEMWApM0dVOR/y8= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.0/go.mod h1:AZv/T0/2rhNBLiY2k109TT6HJ7Z0P8Z+SYvs0jqVkXE= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 h1:CAWMcMnRYCBaeMnycTwZs+0BcuepIMfyP3F0r1VfgPc= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= github.com/aws/aws-sdk-go-v2/service/sso v1.13.5 h1:oCvTFSDi67AX0pOX3PuPdGFewvLRU2zzFSrTsgURNo0= @@ -132,7 +129,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 h1:dnInJb4S0oy8aQuri1mV6ipL github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 h1:CQBFElb0LS8RojMJlxRSo/HXipvTZW2S44Lt9Mk2aYQ= github.com/aws/aws-sdk-go-v2/service/sts v1.21.5/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= -github.com/aws/smithy-go v1.14.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 0e2b9d839ac45d8363f52590c2f4b849bcdddc8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:37:18 -0500 Subject: [PATCH 011/264] chore(deps): bump docker/setup-buildx-action from 2.9.1 to 2.10.0 (#2994) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.9.1 to 2.10.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/4c0219f9ac95b02789c1075625400b2acbff50b1...885d1462b80bc1c1c7f0b00334ad271f09369c55) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index a0c157cd3b..2385b035a6 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -79,7 +79,7 @@ jobs: cosign-release: 'v2.0.2' - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 + - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2.10.0 - name: Setup tags for container image as a CSV type run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f8fb311bba..bb4d221fc5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -99,7 +99,7 @@ jobs: uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2.9.1 + uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2.10.0 - name: Generate release artifacts run: | From 75bade5fdab47bacefe9b4ac9686623f9eace976 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:37:37 -0500 Subject: [PATCH 012/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.6 to 1.27.7 (#2990) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.6 to 1.27.7. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.6...service/s3/v1.27.7) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 693906b264..2e97e4466c 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.37 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 92563ee4c8..d296c5b9b1 100644 --- a/go.sum +++ b/go.sum @@ -117,8 +117,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45lt github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 h1:GPUcE/Yq7Ur8YSUk6lVkoIMWnJNO0HT18GUzCWCgCI0= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6 h1:YUQGnci0QY+X+tu7XI7zy2vnUjmuUw0VT4OC1SikKIw= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.6/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 h1:qULF+ElcvjjSEO1+z5x+TmKE9d4yTej7PfpJQPVvexY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 h1:CAWMcMnRYCBaeMnycTwZs+0BcuepIMfyP3F0r1VfgPc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= From d4c7728f5514f9507745cce5f72951ed0cfe1feb Mon Sep 17 00:00:00 2001 From: izturn <44051386+izturn@users.noreply.github.com> Date: Wed, 30 Aug 2023 21:31:03 +0800 Subject: [PATCH 013/264] feat: add command args for plugin (#2992) * add command args for plugin Signed-off-by: gang.liu * add doc Signed-off-by: gang.liu --------- Signed-off-by: gang.liu --- docs/plugins.md | 10 +++++++-- metricproviders/plugin/client/client.go | 4 ++-- .../trafficrouting/plugin/client/client.go | 4 ++-- test/e2e/appmesh_test.go | 1 + utils/plugin/plugin.go | 14 ++++++------ utils/plugin/plugin_test.go | 22 ++++++++++++++----- utils/plugin/types/types.go | 3 +++ 7 files changed, 39 insertions(+), 19 deletions(-) diff --git a/docs/plugins.md b/docs/plugins.md index 83048d4c2b..901bc79878 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -46,14 +46,20 @@ data: metricProviderPlugins: |- - name: "argoproj-labs/metrics" location: "file:///tmp/argo-rollouts/metric-plugin" + args: + - "--log-level" + - "debug" trafficRouterPlugins: |- - name: "argoproj-labs/nginx" location: "file:///tmp/argo-rollouts/traffic-plugin" + args: + - "--log-level" + - "debug" ``` As you can see there is a field called `name:` under both `metrics` or `trafficrouters` this is the first place where your -end users will need to configure the name of the plugin. The second location is either in the rollout object or the analysis -template which you can see the examples below. +end users will need to configure the name of the plugin. The second `location` is either in the rollout object or the analysis +template which you can see the examples below. The third `args` holds the command line arguments of the plugin. #### AnalysisTemplate Example ```yaml diff --git a/metricproviders/plugin/client/client.go b/metricproviders/plugin/client/client.go index 97e76e0b0f..9fc82ed244 100644 --- a/metricproviders/plugin/client/client.go +++ b/metricproviders/plugin/client/client.go @@ -54,7 +54,7 @@ func (m *metricPlugin) startPluginSystem(metric v1alpha1.Metric) (rpc.MetricProv // There should only ever be one plugin defined in metric.Provider.Plugin per analysis template this gets checked // during validation for pluginName := range metric.Provider.Plugin { - pluginPath, err := plugin.GetPluginLocation(pluginName) + pluginPath, args, err := plugin.GetPluginInfo(pluginName) if err != nil { return nil, fmt.Errorf("unable to find plugin (%s): %w", pluginName, err) } @@ -64,7 +64,7 @@ func (m *metricPlugin) startPluginSystem(metric v1alpha1.Metric) (rpc.MetricProv m.pluginClient[pluginName] = goPlugin.NewClient(&goPlugin.ClientConfig{ HandshakeConfig: handshakeConfig, Plugins: pluginMap, - Cmd: exec.Command(pluginPath), + Cmd: exec.Command(pluginPath, args...), Managed: true, }) diff --git a/rollout/trafficrouting/plugin/client/client.go b/rollout/trafficrouting/plugin/client/client.go index 6350c2c578..7493d1ca67 100644 --- a/rollout/trafficrouting/plugin/client/client.go +++ b/rollout/trafficrouting/plugin/client/client.go @@ -52,7 +52,7 @@ func (t *trafficPlugin) startPlugin(pluginName string) (rpc.TrafficRouterPlugin, if t.pluginClient[pluginName] == nil || t.pluginClient[pluginName].Exited() { - pluginPath, err := plugin.GetPluginLocation(pluginName) + pluginPath, args, err := plugin.GetPluginInfo(pluginName) if err != nil { return nil, fmt.Errorf("unable to find plugin (%s): %w", pluginName, err) } @@ -60,7 +60,7 @@ func (t *trafficPlugin) startPlugin(pluginName string) (rpc.TrafficRouterPlugin, t.pluginClient[pluginName] = goPlugin.NewClient(&goPlugin.ClientConfig{ HandshakeConfig: handshakeConfig, Plugins: pluginMap, - Cmd: exec.Command(pluginPath), + Cmd: exec.Command(pluginPath, args...), Managed: true, }) diff --git a/test/e2e/appmesh_test.go b/test/e2e/appmesh_test.go index c2ab47f290..f7936d24d1 100644 --- a/test/e2e/appmesh_test.go +++ b/test/e2e/appmesh_test.go @@ -1,3 +1,4 @@ +//go:build e2e // +build e2e package e2e diff --git a/utils/plugin/plugin.go b/utils/plugin/plugin.go index a57481adae..3fd7a013a0 100644 --- a/utils/plugin/plugin.go +++ b/utils/plugin/plugin.go @@ -9,26 +9,26 @@ import ( "github.com/argoproj/argo-rollouts/utils/config" ) -// GetPluginLocation returns the location of the plugin on the filesystem via plugin name. If the plugin is not +// GetPluginInfo returns the location & command arguments of the plugin on the filesystem via plugin name. If the plugin is not // configured in the configmap, an error is returned. -func GetPluginLocation(pluginName string) (string, error) { +func GetPluginInfo(pluginName string) (string, []string, error) { configMap, err := config.GetConfig() if err != nil { - return "", fmt.Errorf("failed to get config: %w", err) + return "", nil, fmt.Errorf("failed to get config: %w", err) } for _, item := range configMap.GetAllPlugins() { if pluginName == item.Name { dir, filename, err := config.GetPluginDirectoryAndFilename(item.Name) if err != nil { - return "", err + return "", nil, err } absFilePath, err := filepath.Abs(filepath.Join(defaults.DefaultRolloutPluginFolder, dir, filename)) if err != nil { - return "", fmt.Errorf("failed to get absolute path of plugin folder: %w", err) + return "", nil, fmt.Errorf("failed to get absolute path of plugin folder: %w", err) } - return absFilePath, nil + return absFilePath, item.Args, nil } } - return "", fmt.Errorf("plugin %s not configured in configmap", pluginName) + return "", nil, fmt.Errorf("plugin %s not configured in configmap", pluginName) } diff --git a/utils/plugin/plugin_test.go b/utils/plugin/plugin_test.go index 63e39285ab..7226d2d312 100644 --- a/utils/plugin/plugin_test.go +++ b/utils/plugin/plugin_test.go @@ -13,7 +13,8 @@ import ( "k8s.io/client-go/kubernetes/fake" ) -func TestGetPluginLocation(t *testing.T) { +func TestGetPluginInfo(t *testing.T) { + cmdArgs := []string{"-l 2"} t.Run("tests getting plugin location of metric provider plugins", func(t *testing.T) { cm := &v1.ConfigMap{ @@ -21,18 +22,22 @@ func TestGetPluginLocation(t *testing.T) { Name: "argo-rollouts-config", Namespace: "argo-rollouts", }, - Data: map[string]string{"metricProviderPlugins": "\n - name: argoproj-labs/http\n location: https://test/plugin\n - name: argoproj-labs/http-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, + Data: map[string]string{"metricProviderPlugins": "\n - name: argoproj-labs/http\n location: https://test/plugin\n args: [\"-l 2\"]\n - name: argoproj-labs/http-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, } client := fake.NewSimpleClientset(cm) _, err := config.InitializeConfig(client, "argo-rollouts-config") assert.NoError(t, err) - location, err := GetPluginLocation("argoproj-labs/http") + location, args, err := GetPluginInfo("argoproj-labs/http") assert.NoError(t, err) fp, err := filepath.Abs(filepath.Join(defaults.DefaultRolloutPluginFolder, "argoproj-labs/http")) assert.NoError(t, err) assert.Equal(t, fp, location) + assert.Equal(t, args, cmdArgs) + + _, args, _ = GetPluginInfo("argoproj-labs/http-sha") + assert.Equal(t, len(args), 0) }) t.Run("tests getting plugin location of traffic router plugins", func(t *testing.T) { @@ -42,18 +47,22 @@ func TestGetPluginLocation(t *testing.T) { Name: "argo-rollouts-config", Namespace: "argo-rollouts", }, - Data: map[string]string{"trafficRouterPlugins": "\n - name: argoproj-labs/router\n location: https://test/plugin\n - name: argoproj-labs/router-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, + Data: map[string]string{"trafficRouterPlugins": "\n - name: argoproj-labs/router\n location: https://test/plugin\n args: [\"-l 2\"]\n - name: argoproj-labs/router-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, } client := fake.NewSimpleClientset(cm) _, err := config.InitializeConfig(client, "argo-rollouts-config") assert.NoError(t, err) - location, err := GetPluginLocation("argoproj-labs/router") + location, args, err := GetPluginInfo("argoproj-labs/router") assert.NoError(t, err) fp, err := filepath.Abs(filepath.Join(defaults.DefaultRolloutPluginFolder, "argoproj-labs/router")) assert.NoError(t, err) assert.Equal(t, fp, location) + assert.Equal(t, args, cmdArgs) + + _, args, _ = GetPluginInfo("argoproj-labs/router-sha") + assert.Equal(t, len(args), 0) }) t.Run("test getting plugin location of a plugin that does not exists", func(t *testing.T) { @@ -69,9 +78,10 @@ func TestGetPluginLocation(t *testing.T) { _, err := config.InitializeConfig(client, "argo-rollouts-config") assert.NoError(t, err) - location, err := GetPluginLocation("does-not-exist") + location, args, err := GetPluginInfo("does-not-exist") assert.Error(t, err) assert.Equal(t, "plugin does-not-exist not configured in configmap", err.Error()) assert.Equal(t, "", location) + assert.Equal(t, len(args), 0) }) } diff --git a/utils/plugin/types/types.go b/utils/plugin/types/types.go index 102af1490a..e89ba40f2a 100644 --- a/utils/plugin/types/types.go +++ b/utils/plugin/types/types.go @@ -102,4 +102,7 @@ type PluginItem struct { Name string `json:"name" yaml:"name"` Location string `json:"location" yaml:"location"` Sha256 string `json:"sha256" yaml:"sha256"` + + // Args holds command line arguments + Args []string `json:"args" yaml:"args"` } From e4153218e95c9951e4fa2b4f4ea67659e582f0f1 Mon Sep 17 00:00:00 2001 From: ngsh Date: Wed, 30 Aug 2023 21:31:57 +0800 Subject: [PATCH 014/264] chore: add WeLab Bank to users.md (#2996) chore: add WeLab Bank to users Signed-off-by: ngsh --- USERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/USERS.md b/USERS.md index 587548a806..4094c152c3 100644 --- a/USERS.md +++ b/USERS.md @@ -44,5 +44,6 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Twilio SendGrid](https://sendgrid.com) 1. [Ubie](https://ubie.life/) 1. [VISITS Technologies](https://visits.world/en) +1. [WeLab Bank](https://www.welab.bank/) 1. [Yotpo](https://www.yotpo.com/) 1. [VGS](https://www.vgs.io) From f67acf492a7da7ce51726aad23abccdb15617cda Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 30 Aug 2023 09:24:31 -0600 Subject: [PATCH 015/264] chore: change file name for readthedocs compatibility (#2999) change file name for readthedoc compat Signed-off-by: zachaller --- .readthedocs.yml => .readthedocs.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .readthedocs.yml => .readthedocs.yaml (100%) diff --git a/.readthedocs.yml b/.readthedocs.yaml similarity index 100% rename from .readthedocs.yml rename to .readthedocs.yaml From f4335825991f43ef63878c567abe7f256ffebc9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Aug 2023 10:48:46 -0500 Subject: [PATCH 016/264] chore(deps): bump github.com/hashicorp/go-plugin from 1.4.10 to 1.5.0 (#2995) Bumps [github.com/hashicorp/go-plugin](https://github.com/hashicorp/go-plugin) from 1.4.10 to 1.5.0. - [Release notes](https://github.com/hashicorp/go-plugin/releases) - [Changelog](https://github.com/hashicorp/go-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-plugin/compare/v1.4.10...v1.5.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 2e97e4466c..e0c698e349 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-plugin v1.4.10 + github.com/hashicorp/go-plugin v1.5.0 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 diff --git a/go.sum b/go.sum index d296c5b9b1..7141284a58 100644 --- a/go.sum +++ b/go.sum @@ -144,6 +144,7 @@ github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh6 github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= @@ -401,8 +402,8 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= -github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= +github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE= +github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= @@ -428,7 +429,7 @@ github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmne github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= From 8b0215d6009ea700901978293592d397e12890e1 Mon Sep 17 00:00:00 2001 From: Andy Chen Date: Thu, 31 Aug 2023 14:16:35 -0700 Subject: [PATCH 017/264] fix(controller): rollback should skip all steps to active rs within RollbackWindow (#2953) * fix(canary): skip steps when in rollback window and rs is still active Resolve #2939 Signed-off-by: Andy Chen * test(canary): add case where rollback when in window and rs is still active Signed-off-by: Andy Chen * test(replicaset): add test case for IsActive function Signed-off-by: Andy Chen --------- Signed-off-by: Andy Chen Co-authored-by: Yohan Belval Co-authored-by: zachaller --- rollout/canary.go | 11 +++++-- rollout/canary_test.go | 49 +++++++++++++++++++++++++++++ utils/replicaset/replicaset.go | 9 ++++++ utils/replicaset/replicaset_test.go | 12 +++++++ utils/time/now.go | 5 +++ 5 files changed, 83 insertions(+), 3 deletions(-) diff --git a/rollout/canary.go b/rollout/canary.go index 7c31506a82..dff4b52d50 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -359,13 +359,18 @@ func (c *rolloutContext) syncRolloutStatusCanary() error { if replicasetutil.PodTemplateOrStepsChanged(c.rollout, c.newRS) { c.resetRolloutStatus(&newStatus) - if c.newRS != nil && c.rollout.Status.StableRS == replicasetutil.GetPodTemplateHash(c.newRS) { - if stepCount > 0 { + if c.newRS != nil && stepCount > 0 { + if c.rollout.Status.StableRS == replicasetutil.GetPodTemplateHash(c.newRS) { // If we get here, we detected that we've moved back to the stable ReplicaSet - c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to stable") + c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to stable ReplicaSets") + newStatus.CurrentStepIndex = &stepCount + } else if c.isRollbackWithinWindow() && replicasetutil.IsActive(c.newRS) { + // Else if we get here we detected that we are within the rollback window we can skip steps and move back to the active ReplicaSet + c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: "SkipSteps"}, "Rollback to active ReplicaSets within RollbackWindow") newStatus.CurrentStepIndex = &stepCount } } + newStatus = c.calculateRolloutConditions(newStatus) return c.persistRolloutStatus(&newStatus) } diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 1811f6a4c4..9f66cf1078 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -846,6 +846,55 @@ func TestRollBackToStable(t *testing.T) { assert.Equal(t, calculatePatch(r2, expectedPatch), patch) } +func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(10), + }} + + r1 := newCanaryRollout("foo", 1, nil, steps, int32Ptr(0), intstr.FromInt(1), intstr.FromInt(0)) + r2 := bumpVersion(r1) + + // For the fast rollback to work, we need to: + // 1. Have the previous revision be active (i.e. not scaled down) + // 2. Be in rollback window (within window revisions and previous creation timestamp) + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 1, 1) + r2.Spec.RollbackWindow = &v1alpha1.RollbackWindowSpec{Revisions: 1} + rs1.CreationTimestamp = timeutil.MetaTime(time.Now().Add(-1 * time.Hour)) + rs2.CreationTimestamp = timeutil.MetaNow() + + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + f.serviceLister = append(f.serviceLister) + + // Switch back to version 1 + r2.Spec.Template = r1.Spec.Template + + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + // Since old replicaset is still active, expect twice the number of replicas + r2 = updateCanaryRolloutStatus(r2, rs2PodHash, 2, 2, 2, false) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + f.expectUpdateReplicaSetAction(rs1) + f.expectUpdateReplicaSetAction(rs1) + rolloutPatchIndex := f.expectPatchRolloutAction(r2) + f.run(getKey(r2, t)) + + expectedStepIndex := len(steps) + patch := f.getPatchedRolloutWithoutConditions(rolloutPatchIndex) + + // Assert current pod hash is the old replicaset and steps were skipped + assert.Regexp(t, fmt.Sprintf(`"currentPodHash":"%s"`, rs1PodHash), patch) + assert.Regexp(t, fmt.Sprintf(`"currentStepIndex":%d`, expectedStepIndex), patch) +} + func TestGradualShiftToNewStable(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/utils/replicaset/replicaset.go b/utils/replicaset/replicaset.go index 8554cdf94b..9aec161b66 100644 --- a/utils/replicaset/replicaset.go +++ b/utils/replicaset/replicaset.go @@ -341,6 +341,15 @@ func FindActiveOrLatest(newRS *appsv1.ReplicaSet, oldRSs []*appsv1.ReplicaSet) * } } +// IsActive returns if replica set is active (has, or at least ought to have pods). +func IsActive(rs *appsv1.ReplicaSet) bool { + if rs == nil { + return false + } + + return len(controller.FilterActiveReplicaSets([]*appsv1.ReplicaSet{rs})) > 0 +} + // GetReplicaCountForReplicaSets returns the sum of Replicas of the given replica sets. func GetReplicaCountForReplicaSets(replicaSets []*appsv1.ReplicaSet) int32 { totalReplicas := int32(0) diff --git a/utils/replicaset/replicaset_test.go b/utils/replicaset/replicaset_test.go index 40c7d1ae2c..23bf320955 100644 --- a/utils/replicaset/replicaset_test.go +++ b/utils/replicaset/replicaset_test.go @@ -153,6 +153,18 @@ func TestFindOldReplicaSets(t *testing.T) { } } +func TestIsActive(t *testing.T) { + rs1 := generateRS(generateRollout("foo")) + *(rs1.Spec.Replicas) = 1 + + rs2 := generateRS(generateRollout("foo")) + *(rs2.Spec.Replicas) = 0 + + assert.False(t, IsActive(nil)) + assert.True(t, IsActive(&rs1)) + assert.False(t, IsActive(&rs2)) +} + func TestGetReplicaCountForReplicaSets(t *testing.T) { rs1 := generateRS(generateRollout("foo")) *(rs1.Spec.Replicas) = 1 diff --git a/utils/time/now.go b/utils/time/now.go index 4103857811..1b51cb3cc0 100644 --- a/utils/time/now.go +++ b/utils/time/now.go @@ -13,3 +13,8 @@ var Now = time.Now var MetaNow = func() metav1.Time { return metav1.Time{Time: Now()} } + +// MetaTime is a wrapper around metav1.Time and used to override behavior in tests. +var MetaTime = func(time time.Time) metav1.Time { + return metav1.Time{Time: time} +} From c5508fb8cf43bc7d3bb1647a4edee33799f049db Mon Sep 17 00:00:00 2001 From: Stig Brautaset Date: Thu, 31 Aug 2023 22:17:09 +0100 Subject: [PATCH 018/264] docs: Remove rogue apostrophe in features/analysis.md (#3001) Signed-off-by: Stig Brautaset --- docs/features/analysis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/analysis.md b/docs/features/analysis.md index 1a81a71274..a5fd6964d1 100644 --- a/docs/features/analysis.md +++ b/docs/features/analysis.md @@ -2,7 +2,7 @@ Argo Rollouts provides several ways to perform analysis to drive progressive delivery. This document describes how to achieve various forms of progressive delivery, varying the point in -time analysis is performed, it's frequency, and occurrence. +time analysis is performed, its frequency, and occurrence. ## Custom Resource Definitions From 9906c3788285a0c32cd43bb30c87b350512b937f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 22:21:17 -0500 Subject: [PATCH 019/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.37 to 1.18.38 (#3002) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.37 to 1.18.38. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.37...config/v1.18.38) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index e0c698e349..194ea42f40 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.37 + github.com/aws/aws-sdk-go-v2/config v1.18.38 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 github.com/blang/semver v3.5.1+incompatible @@ -82,13 +82,13 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.35 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.36 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 // indirect github.com/aws/smithy-go v1.14.2 // indirect diff --git a/go.sum b/go.sum index 7141284a58..391f548a45 100644 --- a/go.sum +++ b/go.sum @@ -105,10 +105,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.37 h1:RNAfbPqw1CstCooHaTPhScz7z1PyocQj0UL+l95CgzI= -github.com/aws/aws-sdk-go-v2/config v1.18.37/go.mod h1:8AnEFxW9/XGKCbjYDCJy7iltVNyEI9Iu9qC21UzhhgQ= -github.com/aws/aws-sdk-go-v2/credentials v1.13.35 h1:QpsNitYJu0GgvMBLUIYu9H4yryA5kMksjeIVQfgXrt8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.35/go.mod h1:o7rCaLtvK0hUggAGclf76mNGGkaG5a9KWlp+d9IpcV8= +github.com/aws/aws-sdk-go-v2/config v1.18.38 h1:CByQCELMgm2tM1lAehx3XNg0R/pfeXsYzqn0Aq2chJQ= +github.com/aws/aws-sdk-go-v2/config v1.18.38/go.mod h1:vNm9Hf5VgG2fSUWhT3zFrqN/RosGcabFMYgiSoxKFU8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.36 h1:ps0cPswZjpsOk6sLwG6fdXTzrYjCplgPEyG3OUbbdqE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.36/go.mod h1:sY2phUzxbygoyDtTXhqi7GjGjCQ1S5a5Rj8u3ksBxCg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= @@ -123,8 +123,8 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 h1:CAWMcMnRY github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.5 h1:oCvTFSDi67AX0pOX3PuPdGFewvLRU2zzFSrTsgURNo0= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.5/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 h1:2PylFCfKCEDv6PeSN09pC/VUiRd10wi1VfHG5FrW0/g= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.6/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 h1:dnInJb4S0oy8aQuri1mV6ipLlnZPfnsDNB9BGO9PDNY= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 h1:CQBFElb0LS8RojMJlxRSo/HXipvTZW2S44Lt9Mk2aYQ= From 607de817709a9ab551b2ec9c0df4b21a3c321808 Mon Sep 17 00:00:00 2001 From: Daniel Wright Date: Sun, 3 Sep 2023 11:50:18 +1000 Subject: [PATCH 020/264] docs: update all ingress objects to networking.k8s.io/v1 (#3005) This commit updates all Kubernetes ingress rules in Argo Rollouts to use the stable `networking.k8s.io/v1` API, ensuring compatibility with Kubernetes v1.19+ and leveraging new features available in the stable version. Signed-off-by: Daniel Wright --- docs/best-practices.md | 37 ++++++++++++------- docs/features/traffic-management/alb.md | 36 ++++++++++-------- docs/getting-started/alb/index.md | 33 +++++++++-------- docs/getting-started/alb/ingress.yaml | 11 ++++-- docs/getting-started/mixed/index.md | 19 ++++++---- docs/getting-started/mixed/ingress.yaml | 11 ++++-- docs/getting-started/nginx/index.md | 13 ++++--- docs/getting-started/nginx/ingress.yaml | 11 ++++-- docs/getting-started/smi/ingress.yaml | 11 ++++-- .../testdata/invalid-ingress-smi-multi.yml | 18 ++++++--- .../lint/testdata/invalid-nginx-canary.yml | 11 ++++-- .../cmd/lint/testdata/valid-alb-canary.yml | 11 ++++-- .../lint/testdata/valid-ingress-smi-multi.yml | 18 ++++++--- .../cmd/lint/testdata/valid-ingress-smi.yml | 20 ++++++---- .../testdata/valid-nginx-basic-canary.yml | 11 ++++-- .../cmd/lint/testdata/valid-nginx-canary.yml | 11 ++++-- 16 files changed, 175 insertions(+), 107 deletions(-) diff --git a/docs/best-practices.md b/docs/best-practices.md index ffbb4ff411..735478aa5b 100644 --- a/docs/best-practices.md +++ b/docs/best-practices.md @@ -19,7 +19,7 @@ to the ingress rules so that it is possible to specifically reach to the desired pods or stable pods. ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: guestbook @@ -29,25 +29,36 @@ spec: - host: guestbook-desired.argoproj.io http: paths: - - backend: - serviceName: guestbook-desired - servicePort: 443 - path: /* + - path: / + pathType: Prefix + backend: + service: + name: guestbook-desired + port: + number: 443 + # host rule to only reach the stable pods - host: guestbook-stable.argoproj.io http: paths: - - backend: - serviceName: guestbook-stable - servicePort: 443 - path: /* + - path: / + pathType: Prefix + backend: + service: + name: guestbook-stable + port: + number: 443 + # default rule which omits host, and will split traffic between desired vs. stable - http: paths: - - backend: - serviceName: guestbook-root - servicePort: 443 - path: /* + - path: / + pathType: Prefix + backend: + service: + name: guestbook-root + port: + number: 443 ``` The above technique has the a benefit in that it would not incur additional cost of allocating diff --git a/docs/features/traffic-management/alb.md b/docs/features/traffic-management/alb.md index 0ac0ff6173..5b4c424528 100644 --- a/docs/features/traffic-management/alb.md +++ b/docs/features/traffic-management/alb.md @@ -53,7 +53,7 @@ spec: ingress: ingress # If you want to controll multiple ingress resources you can use the ingresses field, if ingresses is specified # the ingress field will need to be omitted. - ingresses: + ingresses: - ingress-1 - ingress-2 # Reference to a Service that the Ingress must target in one of the rules (optional). @@ -66,7 +66,7 @@ spec: The referenced Ingress should be deployed with an ingress rule that matches the Rollout service: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress @@ -76,14 +76,17 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - # serviceName must match either: canary.trafficRouting.alb.rootService (if specified), - # or canary.stableService (if rootService is omitted) - serviceName: root-service - # servicePort must be the value: use-annotation - # This instructs AWS Load Balancer Controller to look to annotations on how to direct traffic - servicePort: use-annotation + service: + # serviceName must match either: canary.trafficRouting.alb.rootService (if specified), + # or canary.stableService (if rootService is omitted) + name: root-service + # servicePort must be the value: use-annotation + # This instructs AWS Load Balancer Controller to look to annotations on how to direct traffic + port: + name: use-annotation ``` During an update, the rollout controller injects the `alb.ingress.kubernetes.io/actions.` @@ -95,7 +98,7 @@ annotation that splits traffic between the canary-service and stable-service, wi of 10 and 90 respectively: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress @@ -123,10 +126,13 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: root-service - servicePort: use-annotation + service: + name: root-service + port: + name: use-annotation ``` !!! note @@ -411,7 +417,7 @@ spec: By default, Argo Rollout will operate on Ingresses with the annotation: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: @@ -420,7 +426,7 @@ metadata: Or with the `ingressClassName`: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress spec: ingressClassName: alb diff --git a/docs/getting-started/alb/index.md b/docs/getting-started/alb/index.md index a158b64748..73b3856c9e 100644 --- a/docs/getting-started/alb/index.md +++ b/docs/getting-started/alb/index.md @@ -1,7 +1,7 @@ # Getting Started - AWS Load Balancer Controller This guide covers how Argo Rollouts integrates with the -[AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/) +[AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/) for traffic shaping. This guide builds upon the concepts of the [basic getting started guide](../../getting-started.md). ## Requirements @@ -48,7 +48,7 @@ This should be `canary.trafficRouting.alb.rootService` (if specified), otherwise use `canary.stableService`. ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-ingress @@ -58,20 +58,23 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - # serviceName must match either: canary.trafficRouting.alb.rootService (if specified), - # or canary.stableService (if rootService is omitted) - serviceName: rollouts-demo-root - # servicePort must be the value: use-annotation - # This instructs AWS Load Balancer Controller to look to annotations on how to direct traffic - servicePort: use-annotation + service: + # serviceName must match either: canary.trafficRouting.alb.rootService (if specified), + # or canary.stableService (if rootService is omitted) + name: rollouts-demo-root + # servicePort must be the value: use-annotation + # This instructs AWS Load Balancer Controller to look to annotations on how to direct traffic + port: + name: use-annotation ``` During an update, the Ingress will be injected with a [custom action annotation](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/#actions), which directs the ALB to splits traffic between the stable and canary Services referenced by the Rollout. -In this example, those Services are named: `rollouts-demo-stable` and `rollouts-demo-canary` +In this example, those Services are named: `rollouts-demo-stable` and `rollouts-demo-canary` respectively. Run the following commands to deploy: @@ -123,15 +126,15 @@ kubectl argo rollouts get rollout rollouts-demo ![Rollout ALB Paused](paused-rollout-alb.png) At this point, both the canary and stable version of the Rollout are running, with 5% of the -traffic directed to the canary. To understand how this works, inspect the listener rules for -the ALB. When looking at the listener rules, we see that the forward action weights +traffic directed to the canary. To understand how this works, inspect the listener rules for +the ALB. When looking at the listener rules, we see that the forward action weights have been modified by the controller to reflect the current weight of the canary. ![ALB Listener_Rules](alb-listener-rules.png) -The controller has added `rollouts-pod-template-hash` selector to the Services and -attached the same label to the Pods. Therefore, you can split the traffic by simply +The controller has added `rollouts-pod-template-hash` selector to the Services and +attached the same label to the Pods. Therefore, you can split the traffic by simply forwarding the requests to the Services according to the weights. - + As the Rollout progresses through steps, the forward action weights will be adjusted to match the current setWeight of the steps. diff --git a/docs/getting-started/alb/ingress.yaml b/docs/getting-started/alb/ingress.yaml index 1f1b66ca7d..a90c59c417 100644 --- a/docs/getting-started/alb/ingress.yaml +++ b/docs/getting-started/alb/ingress.yaml @@ -1,4 +1,4 @@ -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-ingress @@ -8,7 +8,10 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: rollouts-demo-root - servicePort: use-annotation + service: + name: rollouts-demo-root + port: + name: use-annotation diff --git a/docs/getting-started/mixed/index.md b/docs/getting-started/mixed/index.md index 4a6d12f02b..5c59f37098 100644 --- a/docs/getting-started/mixed/index.md +++ b/docs/getting-started/mixed/index.md @@ -4,11 +4,11 @@ Available since v1.2 This guide covers how Argo Rollouts integrates with multiple TrafficRoutings, using -[Linkerd](https://linkerd.io) and +[Linkerd](https://linkerd.io) and [NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx) for traffic shaping, but you should be able to produce any other combination between the existing trafficRouting options. -This guide builds upon the concepts of the [basic getting started guide](../../getting-started.md), +This guide builds upon the concepts of the [basic getting started guide](../../getting-started.md), [NGINX Guide](getting-started/nginx/index.md), and [SMI Guide](getting-started/smi/index.md). ## Requirements @@ -89,7 +89,7 @@ rule which has a backend targeting the Service referenced under `canary.stableSe In our example, that stable Service is named: `rollouts-demo-stable`: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-stable @@ -101,10 +101,13 @@ spec: http: paths: - path: / + pathType: Prefix backend: - # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field - serviceName: rollouts-demo-stable - servicePort: 80 + service: + # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field + name: rollouts-demo-stable + port: + number: 80 ``` Run the following commands to deploy: @@ -183,8 +186,8 @@ kubectl argo rollouts get rollout rollouts-demo ![Rollout Paused](../nginx/paused-rollout-nginx.png) At this point, both the canary and stable version of the Rollout are running, with 5% of the -traffic directed to the canary and 95% to the stable. When inspecting the TrafficSplit generated by -the controller, we see that the weight has been updated to reflect the current `setWeight: 5` step of +traffic directed to the canary and 95% to the stable. When inspecting the TrafficSplit generated by +the controller, we see that the weight has been updated to reflect the current `setWeight: 5` step of the canary deploy. ```yaml diff --git a/docs/getting-started/mixed/ingress.yaml b/docs/getting-started/mixed/ingress.yaml index 1020c7bb64..25ee1a2ed7 100644 --- a/docs/getting-started/mixed/ingress.yaml +++ b/docs/getting-started/mixed/ingress.yaml @@ -1,4 +1,4 @@ -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-stable @@ -10,7 +10,10 @@ spec: http: paths: - path: / + pathType: Prefix backend: - # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field - serviceName: rollouts-demo-stable - servicePort: 80 + service: + # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field + name: rollouts-demo-stable + port: + number: 80 diff --git a/docs/getting-started/nginx/index.md b/docs/getting-started/nginx/index.md index aaa89302db..5875ee62bb 100644 --- a/docs/getting-started/nginx/index.md +++ b/docs/getting-started/nginx/index.md @@ -1,7 +1,7 @@ # Getting Started - NGINX Ingress This guide covers how Argo Rollouts integrates with the -[NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx) for traffic shaping. +[NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx) for traffic shaping. This guide builds upon the concepts of the [basic getting started guide](../../getting-started.md). ## Requirements @@ -41,7 +41,7 @@ rule which has a backend targeting the Service referenced under `canary.stableSe In our example, that stable Service is named: `rollouts-demo-stable`: ```yaml -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-stable @@ -53,10 +53,13 @@ spec: http: paths: - path: / + pathType: Prefix backend: - # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field - serviceName: rollouts-demo-stable - servicePort: 80 + service: + # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field + name: rollouts-demo-stable + port: + number: 80 ``` Run the following commands to deploy: diff --git a/docs/getting-started/nginx/ingress.yaml b/docs/getting-started/nginx/ingress.yaml index 1020c7bb64..25ee1a2ed7 100644 --- a/docs/getting-started/nginx/ingress.yaml +++ b/docs/getting-started/nginx/ingress.yaml @@ -1,4 +1,4 @@ -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-stable @@ -10,7 +10,10 @@ spec: http: paths: - path: / + pathType: Prefix backend: - # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field - serviceName: rollouts-demo-stable - servicePort: 80 + service: + # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field + name: rollouts-demo-stable + port: + number: 80 diff --git a/docs/getting-started/smi/ingress.yaml b/docs/getting-started/smi/ingress.yaml index 52bbea5701..9a1eddb957 100644 --- a/docs/getting-started/smi/ingress.yaml +++ b/docs/getting-started/smi/ingress.yaml @@ -1,4 +1,4 @@ -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollouts-demo-stable @@ -16,7 +16,10 @@ spec: http: paths: - path: / + pathType: Prefix backend: - # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field - serviceName: rollouts-demo-stable - servicePort: 80 + service: + # Reference to a Service name, also specified in the Rollout spec.strategy.canary.stableService field + name: rollouts-demo-stable + port: + number: 80 diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-ingress-smi-multi.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-ingress-smi-multi.yml index fc04b8deb7..edabcc33f2 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-ingress-smi-multi.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-ingress-smi-multi.yml @@ -49,7 +49,7 @@ spec: - service: rollout-smi-experiment-canary weight: 5 --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollout-smi-experiment-stable @@ -61,16 +61,22 @@ spec: http: paths: - path: / + pathType: Prefix backend: - serviceName: rollout-smi-experiment-stable - servicePort: 80 + service: + name: rollout-smi-experiment-stable + port: + number: 80 - host: rollout-smi-experiment-root.local http: paths: - path: / + pathType: Prefix backend: - serviceName: rollout-smi-experiment-root - servicePort: 80 + service: + name: rollout-smi-experiment-root + port: + number: 80 --- apiVersion: argoproj.io/v1alpha1 kind: Rollout @@ -241,4 +247,4 @@ spec: resources: requests: memory: 16Mi - cpu: 5m \ No newline at end of file + cpu: 5m diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-nginx-canary.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-nginx-canary.yml index ec90d8ad2d..21d6fd2a6d 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-nginx-canary.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/invalid-nginx-canary.yml @@ -40,7 +40,7 @@ spec: selector: app: nginx-rollout --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-rollout-ingress @@ -50,10 +50,13 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: nginx-rollout-root - servicePort: use-annotation + service: + name: nginx-rollout-root + port: + name: use-annotation --- apiVersion: argoproj.io/v1alpha1 kind: Rollout diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-alb-canary.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-alb-canary.yml index c0b2131c74..8879442ca4 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-alb-canary.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-alb-canary.yml @@ -40,7 +40,7 @@ spec: selector: app: alb-rollout --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alb-rollout-ingress @@ -48,10 +48,13 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: alb-rollout-root - servicePort: use-annotation + service: + name: alb-rollout-root + port: + name: use-annotation --- apiVersion: argoproj.io/v1alpha1 kind: Rollout diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi-multi.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi-multi.yml index 884eebf406..b28afb5579 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi-multi.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi-multi.yml @@ -49,7 +49,7 @@ spec: - service: rollout-smi-experiment-canary weight: 5 --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollout-smi-experiment-stable @@ -61,16 +61,22 @@ spec: http: paths: - path: / + pathType: Prefix backend: - serviceName: rollout-smi-experiment-stable - servicePort: 80 + service: + name: rollout-smi-experiment-stable + port: + number: 80 - host: rollout-smi-experiment-root.local http: paths: - path: / + pathType: Prefix backend: - serviceName: rollout-smi-experiment-root - servicePort: 80 + service: + name: rollout-smi-experiment-root + port: + number: 80 --- apiVersion: argoproj.io/v1alpha1 kind: Rollout @@ -241,4 +247,4 @@ spec: resources: requests: memory: 16Mi - cpu: 5m \ No newline at end of file + cpu: 5m diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi.yml index 63f9e6cddf..cd398732ea 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-ingress-smi.yml @@ -49,7 +49,7 @@ spec: - service: rollout-smi-experiment-canary weight: 5 --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rollout-smi-experiment-stable @@ -61,16 +61,22 @@ spec: http: paths: - path: / + pathType: Prefix backend: - serviceName: rollout-smi-experiment-stable - servicePort: 80 + service: + name: rollout-smi-experiment-stable + port: + number: 80 - host: rollout-smi-experiment-root.local http: paths: - - path: / - backend: - serviceName: rollout-smi-experiment-root - servicePort: 80 + - path: / + pathType: Prefix + backend: + service: + name: rollout-smi-experiment-root + port: + number: 80 --- apiVersion: argoproj.io/v1alpha1 kind: Rollout diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-basic-canary.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-basic-canary.yml index 4d295c6c86..f0e08e83e1 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-basic-canary.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-basic-canary.yml @@ -12,7 +12,7 @@ spec: selector: app: nginx-rollout --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-rollout-ingress @@ -20,10 +20,13 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: nginx-rollout-root - servicePort: use-annotation + service: + name: nginx-rollout-root + port: + name: use-annotation --- apiVersion: argoproj.io/v1alpha1 kind: Rollout diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-canary.yml b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-canary.yml index 30fe00ca12..f492d74617 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-canary.yml +++ b/pkg/kubectl-argo-rollouts/cmd/lint/testdata/valid-nginx-canary.yml @@ -40,7 +40,7 @@ spec: selector: app: nginx-rollout --- -apiVersion: networking.k8s.io/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-rollout-ingress @@ -48,10 +48,13 @@ spec: rules: - http: paths: - - path: /* + - path: / + pathType: Prefix backend: - serviceName: nginx-rollout-root - servicePort: use-annotation + service: + name: nginx-rollout-root + port: + name: use-annotation --- apiVersion: argoproj.io/v1alpha1 kind: Rollout From 32bf983cd05580fb450b51bfdbdf6730defbe66f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Sep 2023 22:37:30 -0500 Subject: [PATCH 021/264] chore(deps): bump sigstore/cosign-installer from 3.1.1 to 3.1.2 (#3011) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.1.1 to 3.1.2. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/v3.1.1...11086d25041f77fe8fe7b9ea4e48e3b9192b8f19) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 2385b035a6..41b749a33d 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 # v3.1.1 + uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 with: cosign-release: 'v2.0.2' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index bb4d221fc5..2eb8fce786 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,7 +170,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@204a51a57a74d190b284a0ce69b44bc37201f343 # v3.0.3 + uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.0.3 with: cosign-release: 'v2.0.2' From b14679b7304ecd370c3b222afdfa62e77d34022d Mon Sep 17 00:00:00 2001 From: Daniel Wright Date: Wed, 6 Sep 2023 01:23:02 +1000 Subject: [PATCH 022/264] docs: replace `patchesStrategicMerge` with `patches` in tests/docs (#3010) This update ensures documentation and test examples reflect the use of the newer `patches` method, transitioning away from the deprecated `patchesStrategicMerge`. This aligns with current best practices and recommendations from the kustomize project. Signed-off-by: Daniel Wright --- docs/features/kustomize.md | 26 +++++++++---------- examples/notifications/kustomization.yaml | 4 +-- .../namespace-install/kustomization.yaml | 4 +-- manifests/notifications/kustomization.yaml | 20 +++++++------- test/kustomize/rollout/kustomization.yaml | 24 ++++++++--------- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/docs/features/kustomize.md b/docs/features/kustomize.md index 4efa4144a0..e1a691b511 100644 --- a/docs/features/kustomize.md +++ b/docs/features/kustomize.md @@ -4,7 +4,7 @@ Kustomize can be extended to understand CRD objects through the use of [transformer configs](https://github.com/kubernetes-sigs/kustomize/tree/master/examples/transformerconfigs). Using transformer configs, kustomize can be "taught" about the structure of a Rollout object and leverage kustomize features such as ConfigMap/Secret generators, variable references, and common -labels & annotations. To use Rollouts with kustomize: +labels & annotations. To use Rollouts with kustomize: 1. Download [`rollout-transform.yaml`](kustomize/rollout-transform.yaml) into your kustomize directory. @@ -65,18 +65,18 @@ resources: openapi: path: https://raw.githubusercontent.com/argoproj/argo-schema-generator/main/schema/argo_all_k8s_kustomize_schema.json -patchesStrategicMerge: -- |- - apiVersion: argoproj.io/v1alpha1 - kind: Rollout - metadata: - name: rollout-canary - spec: - template: - spec: - containers: - - name: rollouts-demo - image: nginx +patches: +- patch: |- + apiVersion: argoproj.io/v1alpha1 + kind: Rollout + metadata: + name: rollout-canary + spec: + template: + spec: + containers: + - name: rollouts-demo + image: nginx ``` The OpenAPI data is auto-generated and defined in this [file](https://github.com/argoproj/argo-schema-generator/blob/main/schema/argo_all_k8s_kustomize_schema.json). diff --git a/examples/notifications/kustomization.yaml b/examples/notifications/kustomization.yaml index df8b1ffb2f..73154065be 100644 --- a/examples/notifications/kustomization.yaml +++ b/examples/notifications/kustomization.yaml @@ -4,5 +4,5 @@ kind: Kustomization resources: - ../../manifests/notifications -patchesStrategicMerge: -- configmap.yaml \ No newline at end of file +patches: +- path: configmap.yaml diff --git a/manifests/namespace-install/kustomization.yaml b/manifests/namespace-install/kustomization.yaml index 5d902d1c4c..153432ec04 100644 --- a/manifests/namespace-install/kustomization.yaml +++ b/manifests/namespace-install/kustomization.yaml @@ -8,8 +8,8 @@ bases: resources: - argo-rollouts-rolebinding.yaml -patchesStrategicMerge: -- add-namespaced-flag.yaml +patches: +- path: add-namespaced-flag.yaml patchesJson6902: - path: clusterrole-to-role.yaml diff --git a/manifests/notifications/kustomization.yaml b/manifests/notifications/kustomization.yaml index e8b7beeed9..751122f02c 100644 --- a/manifests/notifications/kustomization.yaml +++ b/manifests/notifications/kustomization.yaml @@ -4,13 +4,13 @@ kind: Kustomization resources: - argo-rollouts-notification-configmap.yaml -patchesStrategicMerge: - - on-rollout-completed.yaml - - on-scaling-replica-set.yaml - - on-rollout-step-completed.yaml - - on-rollout-updated.yaml - - on-rollout-aborted.yaml - - on-rollout-paused.yaml - - on-analysis-run-running.yaml - - on-analysis-run-error.yaml - - on-analysis-run-failed.yaml +patches: + - path: on-rollout-completed.yaml + - path: on-scaling-replica-set.yaml + - path: on-rollout-step-completed.yaml + - path: on-rollout-updated.yaml + - path: on-rollout-aborted.yaml + - path: on-rollout-paused.yaml + - path: on-analysis-run-running.yaml + - path: on-analysis-run-error.yaml + - path: on-analysis-run-failed.yaml diff --git a/test/kustomize/rollout/kustomization.yaml b/test/kustomize/rollout/kustomization.yaml index 71a3660e3c..6f451758d9 100644 --- a/test/kustomize/rollout/kustomization.yaml +++ b/test/kustomize/rollout/kustomization.yaml @@ -45,15 +45,15 @@ images: openapi: path: https://raw.githubusercontent.com/argoproj/argo-schema-generator/main/schema/argo_all_k8s_kustomize_schema.json -patchesStrategicMerge: -- |- - apiVersion: argoproj.io/v1alpha1 - kind: Rollout - metadata: - name: guestbook - spec: - template: - spec: - containers: - - name: guestbook - image: guestbook-patched:v1 +patches: +- patch: |- + apiVersion: argoproj.io/v1alpha1 + kind: Rollout + metadata: + name: guestbook + spec: + template: + spec: + containers: + - name: guestbook + image: guestbook-patched:v1 From 6e716fa4a91414e5b09f49e1afed8504f8345e98 Mon Sep 17 00:00:00 2001 From: pasha-codefresh Date: Tue, 5 Sep 2023 19:03:51 +0300 Subject: [PATCH 023/264] fix: analysis step should be ignored after promote (#3016) * fix: analysis step should be ignored after promote in case if result was inconclusive Signed-off-by: pashakostohrys * fix: analysis step should be ignored after promote in case if result was inconclusive Signed-off-by: pashakostohrys --------- Signed-off-by: pashakostohrys --- .../cmd/promote/promote.go | 18 ++++- .../cmd/promote/promote_test.go | 66 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl-argo-rollouts/cmd/promote/promote.go b/pkg/kubectl-argo-rollouts/cmd/promote/promote.go index d71d68573f..166f24c934 100644 --- a/pkg/kubectl-argo-rollouts/cmd/promote/promote.go +++ b/pkg/kubectl-argo-rollouts/cmd/promote/promote.go @@ -34,6 +34,7 @@ const ( setCurrentStepIndex = `{"status":{"currentStepIndex":%d}}` unpausePatch = `{"spec":{"paused":false}}` clearPauseConditionsPatch = `{"status":{"pauseConditions":null}}` + clearPauseConditionsAndControllerPausePatch = `{"status":{"pauseConditions":null, "controllerPause":false, "currentStepIndex":%d}}` unpauseAndClearPauseConditionsPatch = `{"spec":{"paused":false},"status":{"pauseConditions":null}}` promoteFullPatch = `{"status":{"promoteFull":true}}` clearPauseConditionsPatchWithStep = `{"status":{"pauseConditions":null, "currentStepIndex":%d}}` @@ -133,6 +134,10 @@ func PromoteRollout(rolloutIf clientset.RolloutInterface, name string, skipCurre return ro, nil } +func isInconclusive(rollout *v1alpha1.Rollout) bool { + return rollout.Spec.Strategy.Canary != nil && rollout.Status.Canary.CurrentStepAnalysisRunStatus != nil && rollout.Status.Canary.CurrentStepAnalysisRunStatus.Status == v1alpha1.AnalysisPhaseInconclusive +} + func getPatches(rollout *v1alpha1.Rollout, skipCurrentStep, skipAllStep, full bool) ([]byte, []byte, []byte) { var specPatch, statusPatch, unifiedPatch []byte switch { @@ -160,7 +165,18 @@ func getPatches(rollout *v1alpha1.Rollout, skipCurrentStep, skipAllStep, full bo if rollout.Spec.Paused { specPatch = []byte(unpausePatch) } - if len(rollout.Status.PauseConditions) > 0 { + // in case if canary rollout in inconclusive state, we want to unset controller pause , clean pause conditions and increment step index + // so that rollout can proceed to next step + // without such patch, rollout will be stuck in inconclusive state in case if next step is pause step + if isInconclusive(rollout) && len(rollout.Status.PauseConditions) > 0 && rollout.Status.ControllerPause { + _, index := replicasetutil.GetCurrentCanaryStep(rollout) + if index != nil { + if *index < int32(len(rollout.Spec.Strategy.Canary.Steps)) { + *index++ + } + statusPatch = []byte(fmt.Sprintf(clearPauseConditionsAndControllerPausePatch, *index)) + } + } else if len(rollout.Status.PauseConditions) > 0 { statusPatch = []byte(clearPauseConditionsPatch) } else if rollout.Spec.Strategy.Canary != nil { // we only want to clear pause conditions, or increment step index (never both) diff --git a/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go b/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go index 25c2b9929d..4a31c0a255 100644 --- a/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go +++ b/pkg/kubectl-argo-rollouts/cmd/promote/promote_test.go @@ -490,3 +490,69 @@ func TestPromoteCmdAlreadyFullyPromoted(t *testing.T) { assert.Equal(t, stdout, "rollout 'guestbook' fully promoted\n") assert.Empty(t, stderr) } + +func TestPromoteInconclusiveStep(t *testing.T) { + ro := v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "guestbook", + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.RolloutSpec{ + Paused: true, + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + Steps: []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32Ptr(1), + }, + { + SetWeight: pointer.Int32Ptr(2), + }, + }, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + PauseConditions: []v1alpha1.PauseCondition{{ + Reason: v1alpha1.PauseReasonCanaryPauseStep, + }}, + ControllerPause: true, + Canary: v1alpha1.CanaryStatus{ + CurrentStepAnalysisRunStatus: &v1alpha1.RolloutAnalysisRunStatus{ + Status: v1alpha1.AnalysisPhaseInconclusive, + }, + }, + }, + } + + tf, o := options.NewFakeArgoRolloutsOptions(&ro) + defer tf.Cleanup() + fakeClient := o.RolloutsClient.(*fakeroclient.Clientset) + fakeClient.PrependReactor("patch", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { + if patchAction, ok := action.(kubetesting.PatchAction); ok { + patchRo := v1alpha1.Rollout{} + err := json.Unmarshal(patchAction.GetPatch(), &patchRo) + if err != nil { + panic(err) + } + ro.Status.CurrentStepIndex = patchRo.Status.CurrentStepIndex + ro.Status.ControllerPause = patchRo.Status.ControllerPause + ro.Status.PauseConditions = patchRo.Status.PauseConditions + } + return true, &ro, nil + }) + + cmd := NewCmdPromote(o) + cmd.PersistentPreRunE = o.PersistentPreRunE + cmd.SetArgs([]string{"guestbook"}) + + err := cmd.Execute() + assert.Nil(t, err) + assert.Equal(t, false, ro.Status.ControllerPause) + assert.Empty(t, ro.Status.PauseConditions) + + stdout := o.Out.(*bytes.Buffer).String() + stderr := o.ErrOut.(*bytes.Buffer).String() + assert.Equal(t, stdout, "rollout 'guestbook' promoted\n") + assert.Empty(t, stderr) +} From 69bcc3723ef3a6682cd5da6961399c0325ca0ba0 Mon Sep 17 00:00:00 2001 From: izturn <44051386+izturn@users.noreply.github.com> Date: Wed, 6 Sep 2023 01:03:26 +0800 Subject: [PATCH 024/264] refactor: rename interface{} => any (#3000) * rename interface{} => any Signed-off-by: gang.liu * revert change to generated code Signed-off-by: gang.liu --------- Signed-off-by: gang.liu --- analysis/controller.go | 20 +-- analysis/controller_test.go | 4 +- controller/metrics/metrics_test.go | 2 +- experiments/controller.go | 36 +++--- experiments/controller_test.go | 10 +- experiments/experiment.go | 4 +- experiments/experiment_test.go | 8 +- hack/gen-crd-spec/main.go | 44 +++---- hack/gen-docs/main.go | 14 +-- ingress/ingress.go | 12 +- ingress/ingress_test.go | 2 +- metricproviders/graphite/api.go | 2 +- metricproviders/influxdb/influxdb.go | 2 +- metricproviders/influxdb/mock_test.go | 4 +- metricproviders/kayenta/kayenta.go | 4 +- metricproviders/kayenta/kayenta_test.go | 4 +- metricproviders/newrelic/newrelic.go | 2 +- metricproviders/newrelic/newrelic_test.go | 18 +-- metricproviders/plugin/rpc/rpc.go | 32 ++--- metricproviders/skywalking/mock_test.go | 4 +- metricproviders/skywalking/skywalking.go | 10 +- metricproviders/skywalking/skywalking_test.go | 12 +- metricproviders/webmetric/webmetric.go | 4 +- .../validation/validation_references.go | 2 +- .../cmd/create/create.go | 4 +- pkg/kubectl-argo-rollouts/cmd/lint/lint.go | 4 +- .../cmd/list/list_experiments.go | 2 +- .../cmd/list/rollloutinfo.go | 6 +- .../cmd/set/set_image.go | 4 +- pkg/kubectl-argo-rollouts/cmd/undo/undo.go | 8 +- .../viewcontroller/viewcontroller.go | 20 +-- rollout/canary_test.go | 20 +-- rollout/controller.go | 30 ++--- rollout/controller_test.go | 12 +- rollout/replicaset_test.go | 2 +- rollout/restart.go | 2 +- rollout/restart_test.go | 32 ++--- rollout/templateref.go | 18 +-- rollout/trafficrouting/apisix/apisix.go | 46 +++---- rollout/trafficrouting/apisix/apisix_test.go | 48 +++---- rollout/trafficrouting/apisix/mocks/apisix.go | 4 +- rollout/trafficrouting/appmesh/appmesh.go | 20 +-- .../trafficrouting/appmesh/appmesh_test.go | 30 ++--- .../trafficrouting/appmesh/resource_client.go | 2 +- rollout/trafficrouting/istio/controller.go | 22 ++-- .../trafficrouting/istio/controller_test.go | 8 +- rollout/trafficrouting/istio/istio.go | 118 +++++++++--------- rollout/trafficrouting/istio/istio_test.go | 54 ++++---- rollout/trafficrouting/istio/istio_types.go | 2 +- rollout/trafficrouting/plugin/rpc/rpc.go | 36 +++--- .../trafficrouting/traefik/mocks/traefik.go | 4 +- rollout/trafficrouting/traefik/traefik.go | 6 +- .../trafficrouting/traefik/traefik_test.go | 14 +-- rollout/trafficrouting_test.go | 2 +- server/server.go | 6 +- service/service.go | 12 +- service/service_test.go | 2 +- test/e2e/apisix_test.go | 11 +- test/e2e/appmesh_test.go | 4 +- test/e2e/functional_test.go | 4 +- test/fixtures/given.go | 2 +- test/fixtures/then.go | 2 +- test/fixtures/when.go | 6 +- test/util/util.go | 2 +- utils/analysis/factory.go | 10 +- utils/analysis/helpers.go | 4 +- utils/analysis/helpers_test.go | 2 +- utils/aws/aws.go | 4 +- utils/controller/controller.go | 12 +- utils/controller/controller_test.go | 34 ++--- utils/diff/diff.go | 2 +- utils/evaluate/evaluate.go | 22 ++-- utils/evaluate/evaluate_test.go | 14 +-- utils/json/json.go | 6 +- utils/json/json_test.go | 2 +- utils/log/log.go | 4 +- utils/record/record.go | 32 ++--- utils/record/record_test.go | 4 +- .../tolerantinformer/tolerantinformer_test.go | 2 +- utils/tolerantinformer/tollerantinformer.go | 4 +- utils/unstructured/unstructured.go | 12 +- 81 files changed, 529 insertions(+), 528 deletions(-) diff --git a/analysis/controller.go b/analysis/controller.go index 505e6f005c..b3519619ae 100644 --- a/analysis/controller.go +++ b/analysis/controller.go @@ -49,8 +49,8 @@ type Controller struct { newProvider func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) // used for unit testing - enqueueAnalysis func(obj interface{}) - enqueueAnalysisAfter func(obj interface{}, duration time.Duration) + enqueueAnalysis func(obj any) + enqueueAnalysisAfter func(obj any, duration time.Duration) // workqueue is a rate limited work queue. This is used to queue work to be // processed instead of performing it as soon as a change happens. This @@ -91,10 +91,10 @@ func NewController(cfg ControllerConfig) *Controller { resyncPeriod: cfg.ResyncPeriod, } - controller.enqueueAnalysis = func(obj interface{}) { + controller.enqueueAnalysis = func(obj any) { controllerutil.Enqueue(obj, cfg.AnalysisRunWorkQueue) } - controller.enqueueAnalysisAfter = func(obj interface{}, duration time.Duration) { + controller.enqueueAnalysisAfter = func(obj any, duration time.Duration) { controllerutil.EnqueueAfter(obj, duration, cfg.AnalysisRunWorkQueue) } @@ -105,13 +105,13 @@ func NewController(cfg ControllerConfig) *Controller { controller.newProvider = providerFactory.NewProvider cfg.JobInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controller.enqueueIfCompleted(obj) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { controller.enqueueIfCompleted(newObj) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controller.enqueueIfCompleted(obj) }, }) @@ -120,10 +120,10 @@ func NewController(cfg ControllerConfig) *Controller { // Set up an event handler for when analysis resources change cfg.AnalysisRunInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: controller.enqueueAnalysis, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { controller.enqueueAnalysis(new) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controller.enqueueAnalysis(obj) if ar := unstructuredutil.ObjectToAnalysisRun(obj); ar != nil { logCtx := logutil.WithAnalysisRun(ar) @@ -186,7 +186,7 @@ func (c *Controller) syncHandler(ctx context.Context, key string) error { return c.persistAnalysisRunStatus(run, newRun.Status) } -func (c *Controller) enqueueIfCompleted(obj interface{}) { +func (c *Controller) enqueueIfCompleted(obj any) { job, ok := obj.(*batchv1.Job) if !ok { return diff --git a/analysis/controller_test.go b/analysis/controller_test.go index cde8ba853e..032f5cf74d 100644 --- a/analysis/controller_test.go +++ b/analysis/controller_test.go @@ -113,7 +113,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share Recorder: record.NewFakeEventRecorder(), }) - c.enqueueAnalysis = func(obj interface{}) { + c.enqueueAnalysis = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { @@ -127,7 +127,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share f.enqueuedObjects[key] = count c.analysisRunWorkQueue.Add(obj) } - c.enqueueAnalysisAfter = func(obj interface{}, duration time.Duration) { + c.enqueueAnalysisAfter = func(obj any, duration time.Duration) { c.enqueueAnalysis(obj) } f.provider = &mocks.Provider{} diff --git a/controller/metrics/metrics_test.go b/controller/metrics/metrics_test.go index 00700321fa..ced10b2442 100644 --- a/controller/metrics/metrics_test.go +++ b/controller/metrics/metrics_test.go @@ -54,7 +54,7 @@ func newFakeServerConfig(objs ...runtime.Object) ServerConfig { } } -func testHttpResponse(t *testing.T, handler http.Handler, expectedResponse string, testFunc func(t assert.TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) bool) { +func testHttpResponse(t *testing.T, handler http.Handler, expectedResponse string, testFunc func(t assert.TestingT, s any, contains any, msgAndArgs ...any) bool) { t.Helper() req, err := http.NewRequest("GET", "/metrics", nil) assert.NoError(t, err) diff --git a/experiments/controller.go b/experiments/controller.go index a42821aab0..3aa1519e46 100644 --- a/experiments/controller.go +++ b/experiments/controller.go @@ -63,8 +63,8 @@ type Controller struct { metricsServer *metrics.MetricsServer // used for unit testing - enqueueExperiment func(obj interface{}) - enqueueExperimentAfter func(obj interface{}, duration time.Duration) + enqueueExperiment func(obj any) + enqueueExperimentAfter func(obj any, duration time.Duration) // workqueue is a rate limited work queue. This is used to queue work to be // processed instead of performing it as soon as a change happens. This @@ -127,10 +127,10 @@ func NewController(cfg ControllerConfig) *Controller { resyncPeriod: cfg.ResyncPeriod, } - controller.enqueueExperiment = func(obj interface{}) { + controller.enqueueExperiment = func(obj any) { controllerutil.Enqueue(obj, cfg.ExperimentWorkQueue) } - controller.enqueueExperimentAfter = func(obj interface{}, duration time.Duration) { + controller.enqueueExperimentAfter = func(obj any, duration time.Duration) { controllerutil.EnqueueAfter(obj, duration, cfg.ExperimentWorkQueue) } @@ -138,20 +138,20 @@ func NewController(cfg ControllerConfig) *Controller { // Set up an event handler for when experiment resources change cfg.ExperimentsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: controller.enqueueExperiment, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { controller.enqueueExperiment(new) }, DeleteFunc: controller.enqueueExperiment, }) cfg.ExperimentsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - enqueueRollout := func(obj interface{}) { + AddFunc: func(obj any) { + enqueueRollout := func(obj any) { controllerutil.Enqueue(obj, cfg.RolloutWorkQueue) } controllerutil.EnqueueParentObject(obj, register.RolloutKind, enqueueRollout) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { oldAcc, err := meta.Accessor(old) if err != nil { return @@ -165,13 +165,13 @@ func NewController(cfg ControllerConfig) *Controller { // Two different versions of the same Replica will always have different RVs. return } - enqueueRollout := func(obj interface{}) { + enqueueRollout := func(obj any) { controllerutil.Enqueue(obj, cfg.RolloutWorkQueue) } controllerutil.EnqueueParentObject(new, register.RolloutKind, enqueueRollout) }, - DeleteFunc: func(obj interface{}) { - enqueueRollout := func(obj interface{}) { + DeleteFunc: func(obj any) { + enqueueRollout := func(obj any) { controllerutil.Enqueue(obj, cfg.RolloutWorkQueue) } controllerutil.EnqueueParentObject(obj, register.RolloutKind, enqueueRollout) @@ -184,10 +184,10 @@ func NewController(cfg ControllerConfig) *Controller { }) cfg.ReplicaSetInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.ExperimentKind, controller.enqueueExperiment) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { newRS := new.(*appsv1.ReplicaSet) oldRS := old.(*appsv1.ReplicaSet) if newRS.ResourceVersion == oldRS.ResourceVersion { @@ -204,19 +204,19 @@ func NewController(cfg ControllerConfig) *Controller { } controllerutil.EnqueueParentObject(new, register.ExperimentKind, controller.enqueueExperiment) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.ExperimentKind, controller.enqueueExperiment) }, }) cfg.AnalysisRunInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controller.enqueueIfCompleted(obj) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { controller.enqueueIfCompleted(newObj) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controller.enqueueIfCompleted(obj) }, }) @@ -346,7 +346,7 @@ func (ec *Controller) persistExperimentStatus(orig *v1alpha1.Experiment, newStat } // enqueueIfCompleted conditionally enqueues the AnalysisRun's Experiment if the run is complete -func (ec *Controller) enqueueIfCompleted(obj interface{}) { +func (ec *Controller) enqueueIfCompleted(obj any) { run := unstructuredutil.ObjectToAnalysisRun(obj) if run == nil { return diff --git a/experiments/controller_test.go b/experiments/controller_test.go index 1e7eb14f13..26587b6346 100644 --- a/experiments/controller_test.go +++ b/experiments/controller_test.go @@ -302,12 +302,12 @@ func generateRSName(ex *v1alpha1.Experiment, template v1alpha1.TemplateSpec) str } func calculatePatch(ex *v1alpha1.Experiment, patch string, templates []v1alpha1.TemplateStatus, condition *v1alpha1.ExperimentCondition) string { - patchMap := make(map[string]interface{}) + patchMap := make(map[string]any) err := json.Unmarshal([]byte(patch), &patchMap) if err != nil { panic(err) } - newStatus := patchMap["status"].(map[string]interface{}) + newStatus := patchMap["status"].(map[string]any) if templates != nil { newStatus["templateStatuses"] = templates patchMap["status"] = newStatus @@ -334,7 +334,7 @@ func calculatePatch(ex *v1alpha1.Experiment, patch string, templates []v1alpha1. newEx := &v1alpha1.Experiment{} json.Unmarshal(newBytes, newEx) - newPatch := make(map[string]interface{}) + newPatch := make(map[string]any) json.Unmarshal(patchBytes, &newPatch) newPatchBytes, _ := json.Marshal(newPatch) return string(newPatchBytes) @@ -380,7 +380,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share }) var enqueuedObjectsLock sync.Mutex - c.enqueueExperiment = func(obj interface{}) { + c.enqueueExperiment = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { @@ -396,7 +396,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share f.enqueuedObjects[key] = count c.experimentWorkqueue.Add(obj) } - c.enqueueExperimentAfter = func(obj interface{}, duration time.Duration) { + c.enqueueExperimentAfter = func(obj any, duration time.Duration) { c.enqueueExperiment(obj) } diff --git a/experiments/experiment.go b/experiments/experiment.go index 7327c5a8b6..e4f0f53ede 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -46,7 +46,7 @@ type experimentContext struct { replicaSetLister appslisters.ReplicaSetLister serviceLister v1.ServiceLister recorder record.EventRecorder - enqueueExperimentAfter func(obj interface{}, duration time.Duration) + enqueueExperimentAfter func(obj any, duration time.Duration) resyncPeriod time.Duration // calculated values during reconciliation @@ -70,7 +70,7 @@ func newExperimentContext( serviceLister v1.ServiceLister, recorder record.EventRecorder, resyncPeriod time.Duration, - enqueueExperimentAfter func(obj interface{}, duration time.Duration), + enqueueExperimentAfter func(obj any, duration time.Duration), ) *experimentContext { exCtx := experimentContext{ diff --git a/experiments/experiment_test.go b/experiments/experiment_test.go index 0853a3b361..e047082cee 100644 --- a/experiments/experiment_test.go +++ b/experiments/experiment_test.go @@ -62,7 +62,7 @@ func newTestContext(ex *v1alpha1.Experiment, objects ...runtime.Object) *experim serviceLister, record.NewFakeEventRecorder(), noResyncPeriodFunc(), - func(obj interface{}, duration time.Duration) {}, + func(obj any, duration time.Duration) {}, ) } @@ -302,7 +302,7 @@ func TestDontRequeueWithoutDuration(t *testing.T) { fakeClient := exCtx.kubeclientset.(*k8sfake.Clientset) fakeClient.Tracker().Add(rs1) enqueueCalled := false - exCtx.enqueueExperimentAfter = func(obj interface{}, duration time.Duration) { + exCtx.enqueueExperimentAfter = func(obj any, duration time.Duration) { enqueueCalled = true } newStatus := exCtx.reconcile() @@ -325,7 +325,7 @@ func TestRequeueAfterDuration(t *testing.T) { "bar": rs1, } enqueueCalled := false - exCtx.enqueueExperimentAfter = func(obj interface{}, duration time.Duration) { + exCtx.enqueueExperimentAfter = func(obj any, duration time.Duration) { enqueueCalled = true // ensures we are enqueued around ~20 seconds twentySeconds := time.Second * time.Duration(20) @@ -352,7 +352,7 @@ func TestRequeueAfterProgressDeadlineSeconds(t *testing.T) { "bar": rs1, } enqueueCalled := false - exCtx.enqueueExperimentAfter = func(obj interface{}, duration time.Duration) { + exCtx.enqueueExperimentAfter = func(obj any, duration time.Duration) { enqueueCalled = true // ensures we are enqueued around 10 minutes tenMinutes := time.Second * time.Duration(600) diff --git a/hack/gen-crd-spec/main.go b/hack/gen-crd-spec/main.go index 97156308a5..c879472a53 100644 --- a/hack/gen-crd-spec/main.go +++ b/hack/gen-crd-spec/main.go @@ -31,7 +31,7 @@ const metadataValidation = `properties: type: object type: object` -var preserveUnknownFields = map[string]interface{}{ +var preserveUnknownFields = map[string]any{ "x-kubernetes-preserve-unknown-fields": true, } @@ -43,7 +43,7 @@ var crdPaths = map[string]string{ "AnalysisRun": "manifests/crds/analysis-run-crd.yaml", } -func setValidationOverride(un *unstructured.Unstructured, fieldOverride map[string]interface{}, path string) { +func setValidationOverride(un *unstructured.Unstructured, fieldOverride map[string]any, path string) { // Prepare variables preSchemaPath := []string{"spec", "versions"} objVersions, _, _ := unstructured.NestedSlice(un.Object, preSchemaPath...) @@ -59,11 +59,11 @@ func setValidationOverride(un *unstructured.Unstructured, fieldOverride map[stri } // Loop over version's slice - var finalOverride []interface{} + var finalOverride []any for _, v := range objVersions { - unstructured.SetNestedMap(v.(map[string]interface{}), fieldOverride, schemaPath...) + unstructured.SetNestedMap(v.(map[string]any), fieldOverride, schemaPath...) - _, ok, err := unstructured.NestedFieldNoCopy(v.(map[string]interface{}), schemaPath...) + _, ok, err := unstructured.NestedFieldNoCopy(v.(map[string]any), schemaPath...) checkErr(err) if !ok { panic(fmt.Sprintf("%s not found for kind %s", schemaPath, crdKind(un))) @@ -153,7 +153,7 @@ func createMetadataValidation(un *unstructured.Unstructured) { switch kind { case "Rollout": - var roValidated []interface{} + var roValidated []any roPath := []string{ "template", "properties", @@ -161,12 +161,12 @@ func createMetadataValidation(un *unstructured.Unstructured) { } roPath = append(path, roPath...) for _, v := range objVersions { - unstructured.SetNestedMap(v.(map[string]interface{}), metadataValidationObj.Object, roPath...) + unstructured.SetNestedMap(v.(map[string]any), metadataValidationObj.Object, roPath...) roValidated = append(roValidated, v) } unstructured.SetNestedSlice(un.Object, roValidated, prePath...) case "Experiment": - var exValidated []interface{} + var exValidated []any exPath := []string{ "templates", "items", @@ -177,12 +177,12 @@ func createMetadataValidation(un *unstructured.Unstructured) { } exPath = append(path, exPath...) for _, v := range objVersions { - unstructured.SetNestedMap(v.(map[string]interface{}), metadataValidationObj.Object, exPath...) + unstructured.SetNestedMap(v.(map[string]any), metadataValidationObj.Object, exPath...) exValidated = append(exValidated, v) } unstructured.SetNestedSlice(un.Object, exValidated, prePath...) case "ClusterAnalysisTemplate", "AnalysisTemplate", "AnalysisRun": - var analysisValidated []interface{} + var analysisValidated []any analysisPath := []string{ "metrics", "items", @@ -196,12 +196,12 @@ func createMetadataValidation(un *unstructured.Unstructured) { analysisPathJobMetadata := append(analysisPath, "metadata") for _, v := range objVersions { - unstructured.SetNestedMap(v.(map[string]interface{}), metadataValidationObj.Object, analysisPathJobMetadata...) + unstructured.SetNestedMap(v.(map[string]any), metadataValidationObj.Object, analysisPathJobMetadata...) analysisValidated = append(analysisValidated, v) } unstructured.SetNestedSlice(un.Object, analysisValidated, prePath...) - var analysisJobValidated []interface{} + var analysisJobValidated []any analysisPathJobTemplateMetadata := []string{ "spec", "properties", @@ -211,7 +211,7 @@ func createMetadataValidation(un *unstructured.Unstructured) { } analysisPathJobTemplateMetadata = append(analysisPath, analysisPathJobTemplateMetadata...) for _, v := range objVersions { - unstructured.SetNestedMap(v.(map[string]interface{}), metadataValidationObj.Object, analysisPathJobTemplateMetadata...) + unstructured.SetNestedMap(v.(map[string]any), metadataValidationObj.Object, analysisPathJobTemplateMetadata...) analysisJobValidated = append(analysisJobValidated, v) } unstructured.SetNestedSlice(un.Object, analysisJobValidated, prePath...) @@ -326,7 +326,7 @@ var patchAnnotationKeys = map[string]bool{ // injectPatchAnnotations injects patch annotations from given schema definitions and drop properties that don't have // patch annotations injected -func injectPatchAnnotations(prop map[string]interface{}, propSchema spec.Schema, schemaDefinitions spec.Definitions) (bool, error) { +func injectPatchAnnotations(prop map[string]any, propSchema spec.Schema, schemaDefinitions spec.Definitions) (bool, error) { injected := false for k, v := range propSchema.Extensions { if patchAnnotationKeys[k] { @@ -349,13 +349,13 @@ func injectPatchAnnotations(prop map[string]interface{}, propSchema spec.Schema, propSchemas = schema.Properties } - childProps, ok := prop["properties"].(map[string]interface{}) + childProps, ok := prop["properties"].(map[string]any) if !ok { - childProps = map[string]interface{}{} + childProps = map[string]any{} } for k, v := range childProps { - childInjected, err := injectPatchAnnotations(v.(map[string]interface{}), propSchemas[k], schemaDefinitions) + childInjected, err := injectPatchAnnotations(v.(map[string]any), propSchemas[k], schemaDefinitions) if err != nil { return false, err } @@ -390,7 +390,7 @@ func generateKustomizeSchema(crds []*extensionsobj.CustomResourceDefinition, out schemaDefinitions[normalizeRef(k)] = v.Schema } - definitions := map[string]interface{}{} + definitions := map[string]any{} for _, crd := range crds { var version string var props map[string]extensionsobj.JSONSchemaProps @@ -406,7 +406,7 @@ func generateKustomizeSchema(crds []*extensionsobj.CustomResourceDefinition, out if err != nil { return err } - propsMap := map[string]interface{}{} + propsMap := map[string]any{} err = json.Unmarshal(data, &propsMap) if err != nil { return err @@ -414,7 +414,7 @@ func generateKustomizeSchema(crds []*extensionsobj.CustomResourceDefinition, out crdSchema := schemaDefinitions[normalizeRef(fmt.Sprintf("%s/%s.%s", rolloutsDefinitionsPrefix, version, crd.Spec.Names.Kind))] for k, p := range propsMap { - injected, err := injectPatchAnnotations(p.(map[string]interface{}), crdSchema.Properties[k], schemaDefinitions) + injected, err := injectPatchAnnotations(p.(map[string]any), crdSchema.Properties[k], schemaDefinitions) if err != nil { return err } @@ -426,7 +426,7 @@ func generateKustomizeSchema(crds []*extensionsobj.CustomResourceDefinition, out } definitionName := kubeopenapiutil.ToRESTFriendlyName(fmt.Sprintf("%s/%s.%s", crd.Spec.Group, version, crd.Spec.Names.Kind)) - definitions[definitionName] = map[string]interface{}{ + definitions[definitionName] = map[string]any{ "properties": propsMap, "x-kubernetes-group-version-kind": []map[string]string{{ "group": crd.Spec.Group, @@ -435,7 +435,7 @@ func generateKustomizeSchema(crds []*extensionsobj.CustomResourceDefinition, out }}, } } - data, err := json.MarshalIndent(map[string]interface{}{ + data, err := json.MarshalIndent(map[string]any{ "definitions": definitions, }, "", " ") if err != nil { diff --git a/hack/gen-docs/main.go b/hack/gen-docs/main.go index 4e29e355be..b00f7988e2 100644 --- a/hack/gen-docs/main.go +++ b/hack/gen-docs/main.go @@ -73,15 +73,15 @@ func updateMkDocsNav(parent string, child string, files []string) error { if e := yaml.Unmarshal(data, &un.Object); e != nil { return e } - nav := un.Object["nav"].([]interface{}) + nav := un.Object["nav"].([]any) navitem, _ := findNavItem(nav, parent) if navitem == nil { return fmt.Errorf("Can't find '%s' nav item in mkdoc.yml", parent) } - navitemmap := navitem.(map[interface{}]interface{}) - subnav := navitemmap[parent].([]interface{}) + navitemmap := navitem.(map[any]any) + subnav := navitemmap[parent].([]any) subnav = removeNavItem(subnav, child) - commands := make(map[string]interface{}) + commands := make(map[string]any) commands[child] = files navitemmap[parent] = append(subnav, commands) @@ -92,9 +92,9 @@ func updateMkDocsNav(parent string, child string, files []string) error { return os.WriteFile("mkdocs.yml", newmkdocs, 0644) } -func findNavItem(nav []interface{}, key string) (interface{}, int) { +func findNavItem(nav []any, key string) (any, int) { for i, item := range nav { - o, ismap := item.(map[interface{}]interface{}) + o, ismap := item.(map[any]any) if ismap { if _, ok := o[key]; ok { return o, i @@ -104,7 +104,7 @@ func findNavItem(nav []interface{}, key string) (interface{}, int) { return nil, -1 } -func removeNavItem(nav []interface{}, key string) []interface{} { +func removeNavItem(nav []any, key string) []any { _, i := findNavItem(nav, key) if i != -1 { nav = append(nav[:i], nav[i+1:]...) diff --git a/ingress/ingress.go b/ingress/ingress.go index 6c4059e476..8af5327891 100644 --- a/ingress/ingress.go +++ b/ingress/ingress.go @@ -51,7 +51,7 @@ type Controller struct { ingressWorkqueue workqueue.RateLimitingInterface metricServer *metrics.MetricsServer - enqueueRollout func(obj interface{}) + enqueueRollout func(obj any) albClasses []string nginxClasses []string } @@ -76,7 +76,7 @@ func NewController(cfg ControllerConfig) *Controller { } util.CheckErr(cfg.RolloutsInformer.Informer().AddIndexers(cache.Indexers{ - ingressIndexName: func(obj interface{}) ([]string, error) { + ingressIndexName: func(obj any) ([]string, error) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil { return ingressutil.GetRolloutIngressKeys(ro), nil } @@ -85,17 +85,17 @@ func NewController(cfg ControllerConfig) *Controller { })) cfg.IngressWrap.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controllerutil.Enqueue(obj, cfg.IngressWorkQueue) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { controllerutil.Enqueue(newObj, cfg.IngressWorkQueue) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controllerutil.Enqueue(obj, cfg.IngressWorkQueue) }, }) - controller.enqueueRollout = func(obj interface{}) { + controller.enqueueRollout = func(obj any) { controllerutil.EnqueueRateLimited(obj, cfg.RolloutWorkQueue) } diff --git a/ingress/ingress_test.go b/ingress/ingress_test.go index 92ebcc09d4..be588dd51a 100644 --- a/ingress/ingress_test.go +++ b/ingress/ingress_test.go @@ -148,7 +148,7 @@ func underlyingControllerBuilder(t *testing.T, ing []*extensionsv1beta1.Ingress, }) enqueuedObjects := map[string]int{} var enqueuedObjectsLock sync.Mutex - c.enqueueRollout = func(obj interface{}) { + c.enqueueRollout = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { diff --git a/metricproviders/graphite/api.go b/metricproviders/graphite/api.go index 06833ac028..bd470de474 100644 --- a/metricproviders/graphite/api.go +++ b/metricproviders/graphite/api.go @@ -87,7 +87,7 @@ type dataPoint struct { } func (gdp *dataPoint) UnmarshalJSON(data []byte) error { - var v []interface{} + var v []any if err := json.Unmarshal(data, &v); err != nil { return err } diff --git a/metricproviders/influxdb/influxdb.go b/metricproviders/influxdb/influxdb.go index f67c8d5f94..4266d2e2f6 100644 --- a/metricproviders/influxdb/influxdb.go +++ b/metricproviders/influxdb/influxdb.go @@ -87,7 +87,7 @@ func (p *Provider) GarbageCollect(run *v1alpha1.AnalysisRun, metric v1alpha1.Met } func (p *Provider) processResponse(metric v1alpha1.Metric, result *influxapi.QueryTableResult) (string, v1alpha1.AnalysisPhase, error) { - var res []interface{} + var res []any if result == nil { return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("no QueryTableResult returned from flux query") } diff --git a/metricproviders/influxdb/mock_test.go b/metricproviders/influxdb/mock_test.go index 3aff084802..558efa9a45 100644 --- a/metricproviders/influxdb/mock_test.go +++ b/metricproviders/influxdb/mock_test.go @@ -23,10 +23,10 @@ func (m mockAPI) QueryRaw(context.Context, string, *domain.Dialect) (string, err panic("Not used") } -func (m mockAPI) QueryRawWithParams(ctx context.Context, query string, dialect *domain.Dialect, params interface{}) (string, error) { +func (m mockAPI) QueryRawWithParams(ctx context.Context, query string, dialect *domain.Dialect, params any) (string, error) { panic("Not used") } -func (m mockAPI) QueryWithParams(ctx context.Context, query string, params interface{}) (*influxapi.QueryTableResult, error) { +func (m mockAPI) QueryWithParams(ctx context.Context, query string, params any) (*influxapi.QueryTableResult, error) { panic("Not used") } diff --git a/metricproviders/kayenta/kayenta.go b/metricproviders/kayenta/kayenta.go index a6b93f40e6..79f47c5f28 100644 --- a/metricproviders/kayenta/kayenta.go +++ b/metricproviders/kayenta/kayenta.go @@ -146,7 +146,7 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph if err != nil { return metricutil.MarkMeasurementError(newMeasurement, err) } - var dat map[string]interface{} + var dat map[string]any if err := json.Unmarshal(data, &dat); err != nil { return metricutil.MarkMeasurementError(newMeasurement, err) } @@ -185,7 +185,7 @@ func (p *Provider) Resume(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, mea return metricutil.MarkMeasurementError(measurement, err) } - patch := make(map[string]interface{}) + patch := make(map[string]any) err = json.Unmarshal(data, &patch) if err != nil { diff --git a/metricproviders/kayenta/kayenta_test.go b/metricproviders/kayenta/kayenta_test.go index abfed0f7c1..548f868bfb 100644 --- a/metricproviders/kayenta/kayenta_test.go +++ b/metricproviders/kayenta/kayenta_test.go @@ -157,12 +157,12 @@ func TestRunSuccessfully(t *testing.T) { if err != nil { panic(err) } - bodyI := map[string]interface{}{} + bodyI := map[string]any{} err = json.Unmarshal(body, &bodyI) if err != nil { panic(err) } - expectedBodyI := map[string]interface{}{} + expectedBodyI := map[string]any{} err = json.Unmarshal([]byte(expectedBody), &expectedBodyI) if err != nil { panic(err) diff --git a/metricproviders/newrelic/newrelic.go b/metricproviders/newrelic/newrelic.go index eca410b6e7..0c971e5c60 100644 --- a/metricproviders/newrelic/newrelic.go +++ b/metricproviders/newrelic/newrelic.go @@ -78,7 +78,7 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph return newMeasurement } -func toJSONString(v interface{}) (string, error) { +func toJSONString(v any) (string, error) { b, err := json.Marshal(v) if err != nil { return "", err diff --git a/metricproviders/newrelic/newrelic_test.go b/metricproviders/newrelic/newrelic_test.go index b483d96872..8f49049815 100644 --- a/metricproviders/newrelic/newrelic_test.go +++ b/metricproviders/newrelic/newrelic_test.go @@ -31,7 +31,7 @@ func TestType(t *testing.T) { func TestRunSuccessfully(t *testing.T) { e := log.Entry{} mock := &mockAPI{ - response: []nrdb.NRDBResult{map[string]interface{}{"count": 10}}, + response: []nrdb.NRDBResult{map[string]any{"count": 10}}, } p := NewNewRelicProvider(mock, e) metric := v1alpha1.Metric{ @@ -58,9 +58,9 @@ func TestRunWithTimeseries(t *testing.T) { e := log.NewEntry(log.New()) mock := &mockAPI{ response: []nrdb.NRDBResult{ - map[string]interface{}{"count": 10}, - map[string]interface{}{"count": 20}, - map[string]interface{}{"count": 30}}, + map[string]any{"count": 10}, + map[string]any{"count": 20}, + map[string]any{"count": 30}}, } p := NewNewRelicProvider(mock, *e) metric := v1alpha1.Metric{ @@ -86,7 +86,7 @@ func TestRunWithTimeseries(t *testing.T) { func TestRunWithFacet(t *testing.T) { e := log.NewEntry(log.New()) mock := &mockAPI{ - response: []nrdb.NRDBResult{map[string]interface{}{"count": 10, "average.duration": 12.34}}, + response: []nrdb.NRDBResult{map[string]any{"count": 10, "average.duration": 12.34}}, } p := NewNewRelicProvider(mock, *e) metric := v1alpha1.Metric{ @@ -112,7 +112,7 @@ func TestRunWithFacet(t *testing.T) { func TestRunWithMultipleSelectTerms(t *testing.T) { e := log.NewEntry(log.New()) mock := &mockAPI{ - response: []nrdb.NRDBResult{map[string]interface{}{"count": 10}}, + response: []nrdb.NRDBResult{map[string]any{"count": 10}}, } p := NewNewRelicProvider(mock, *e) metric := v1alpha1.Metric{ @@ -139,7 +139,7 @@ func TestRunWithEmptyResult(t *testing.T) { e := log.NewEntry(log.New()) expectedErr := fmt.Errorf("no results returned from NRQL query") mock := &mockAPI{ - response: []nrdb.NRDBResult{make(map[string]interface{})}, + response: []nrdb.NRDBResult{make(map[string]any)}, } p := NewNewRelicProvider(mock, *e) metric := v1alpha1.Metric{ @@ -245,7 +245,7 @@ func TestRunWithInvalidJSON(t *testing.T) { } t.Run("with a single result map", func(t *testing.T) { mock := &mockAPI{ - response: []nrdb.NRDBResult{map[string]interface{}{"func": func() {}}}, + response: []nrdb.NRDBResult{map[string]any{"func": func() {}}}, } p := NewNewRelicProvider(mock, *e) measurement := p.Run(newAnalysisRun(), metric) @@ -258,7 +258,7 @@ func TestRunWithInvalidJSON(t *testing.T) { t.Run("with multiple results", func(t *testing.T) { // cover branch where results slice is longer than 1 mock := &mockAPI{ - response: []nrdb.NRDBResult{map[string]interface{}{"key": "value"}, map[string]interface{}{"func": func() {}}}, + response: []nrdb.NRDBResult{map[string]any{"key": "value"}, map[string]any{"func": func() {}}}, } p := NewNewRelicProvider(mock, *e) measurement := p.Run(newAnalysisRun(), metric) diff --git a/metricproviders/plugin/rpc/rpc.go b/metricproviders/plugin/rpc/rpc.go index 7f703b5ec9..a709693976 100644 --- a/metricproviders/plugin/rpc/rpc.go +++ b/metricproviders/plugin/rpc/rpc.go @@ -56,7 +56,7 @@ type MetricsPluginRPC struct{ client *rpc.Client } // server side function. func (g *MetricsPluginRPC) InitPlugin() types.RpcError { var resp types.RpcError - err := g.client.Call("Plugin.InitPlugin", new(interface{}), &resp) + err := g.client.Call("Plugin.InitPlugin", new(any), &resp) if err != nil { return types.RpcError{ErrorString: fmt.Sprintf("InitPlugin rpc call error: %s", err)} } @@ -66,7 +66,7 @@ func (g *MetricsPluginRPC) InitPlugin() types.RpcError { // Run is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) Run(analysisRun *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement { var resp v1alpha1.Measurement - var args interface{} = RunArgs{ + var args any = RunArgs{ AnalysisRun: analysisRun, Metric: metric, } @@ -83,7 +83,7 @@ func (g *MetricsPluginRPC) Run(analysisRun *v1alpha1.AnalysisRun, metric v1alpha // Resume is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) Resume(analysisRun *v1alpha1.AnalysisRun, metric v1alpha1.Metric, measurement v1alpha1.Measurement) v1alpha1.Measurement { var resp v1alpha1.Measurement - var args interface{} = TerminateAndResumeArgs{ + var args any = TerminateAndResumeArgs{ AnalysisRun: analysisRun, Metric: metric, Measurement: measurement, @@ -101,7 +101,7 @@ func (g *MetricsPluginRPC) Resume(analysisRun *v1alpha1.AnalysisRun, metric v1al // Terminate is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) Terminate(analysisRun *v1alpha1.AnalysisRun, metric v1alpha1.Metric, measurement v1alpha1.Measurement) v1alpha1.Measurement { var resp v1alpha1.Measurement - var args interface{} = TerminateAndResumeArgs{ + var args any = TerminateAndResumeArgs{ AnalysisRun: analysisRun, Metric: metric, Measurement: measurement, @@ -119,7 +119,7 @@ func (g *MetricsPluginRPC) Terminate(analysisRun *v1alpha1.AnalysisRun, metric v // GarbageCollect is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) GarbageCollect(analysisRun *v1alpha1.AnalysisRun, metric v1alpha1.Metric, limit int) types.RpcError { var resp types.RpcError - var args interface{} = GarbageCollectArgs{ + var args any = GarbageCollectArgs{ AnalysisRun: analysisRun, Metric: metric, Limit: limit, @@ -134,7 +134,7 @@ func (g *MetricsPluginRPC) GarbageCollect(analysisRun *v1alpha1.AnalysisRun, met // Type is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) Type() string { var resp string - err := g.client.Call("Plugin.Type", new(interface{}), &resp) + err := g.client.Call("Plugin.Type", new(any), &resp) if err != nil { return fmt.Sprintf("Type rpc call error: %s", err) } @@ -144,7 +144,7 @@ func (g *MetricsPluginRPC) Type() string { // GetMetadata is the client side function that is wrapped by a local provider this makes an rpc call to the server side function. func (g *MetricsPluginRPC) GetMetadata(metric v1alpha1.Metric) map[string]string { var resp map[string]string - var args interface{} = GetMetadataArgs{ + var args any = GetMetadataArgs{ Metric: metric, } err := g.client.Call("Plugin.GetMetadata", &args, &resp) @@ -166,14 +166,14 @@ type MetricsRPCServer struct { // InitPlugin is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) InitPlugin(args interface{}, resp *types.RpcError) error { +func (s *MetricsRPCServer) InitPlugin(args any, resp *types.RpcError) error { *resp = s.Impl.InitPlugin() return nil } // Run is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) Run(args interface{}, resp *v1alpha1.Measurement) error { +func (s *MetricsRPCServer) Run(args any, resp *v1alpha1.Measurement) error { runArgs, ok := args.(*RunArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -184,7 +184,7 @@ func (s *MetricsRPCServer) Run(args interface{}, resp *v1alpha1.Measurement) err // Resume is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) Resume(args interface{}, resp *v1alpha1.Measurement) error { +func (s *MetricsRPCServer) Resume(args any, resp *v1alpha1.Measurement) error { resumeArgs, ok := args.(*TerminateAndResumeArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -195,7 +195,7 @@ func (s *MetricsRPCServer) Resume(args interface{}, resp *v1alpha1.Measurement) // Terminate is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) Terminate(args interface{}, resp *v1alpha1.Measurement) error { +func (s *MetricsRPCServer) Terminate(args any, resp *v1alpha1.Measurement) error { resumeArgs, ok := args.(*TerminateAndResumeArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -206,7 +206,7 @@ func (s *MetricsRPCServer) Terminate(args interface{}, resp *v1alpha1.Measuremen // GarbageCollect is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) GarbageCollect(args interface{}, resp *types.RpcError) error { +func (s *MetricsRPCServer) GarbageCollect(args any, resp *types.RpcError) error { gcArgs, ok := args.(*GarbageCollectArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -217,14 +217,14 @@ func (s *MetricsRPCServer) GarbageCollect(args interface{}, resp *types.RpcError // Type is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) Type(args interface{}, resp *string) error { +func (s *MetricsRPCServer) Type(args any, resp *string) error { *resp = s.Impl.Type() return nil } // GetMetadata is the receiving end of the RPC call running in the plugin executable process (the server), and it calls the // implementation of the plugin. -func (s *MetricsRPCServer) GetMetadata(args interface{}, resp *map[string]string) error { +func (s *MetricsRPCServer) GetMetadata(args any, resp *map[string]string) error { getMetadataArgs, ok := args.(*GetMetadataArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -248,10 +248,10 @@ type RpcMetricProviderPlugin struct { Impl MetricProviderPlugin } -func (p *RpcMetricProviderPlugin) Server(*plugin.MuxBroker) (interface{}, error) { +func (p *RpcMetricProviderPlugin) Server(*plugin.MuxBroker) (any, error) { return &MetricsRPCServer{Impl: p.Impl}, nil } -func (RpcMetricProviderPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { +func (RpcMetricProviderPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (any, error) { return &MetricsPluginRPC{client: c}, nil } diff --git a/metricproviders/skywalking/mock_test.go b/metricproviders/skywalking/mock_test.go index 70a5b67867..147b172294 100644 --- a/metricproviders/skywalking/mock_test.go +++ b/metricproviders/skywalking/mock_test.go @@ -2,10 +2,10 @@ package skywalking type mockAPI struct { err error - results interface{} + results any } -func (m mockAPI) Query(query string) (interface{}, error) { +func (m mockAPI) Query(query string) (any, error) { if m.err != nil { return m.results, m.err } diff --git a/metricproviders/skywalking/skywalking.go b/metricproviders/skywalking/skywalking.go index eb343b1bdd..4b352100f9 100644 --- a/metricproviders/skywalking/skywalking.go +++ b/metricproviders/skywalking/skywalking.go @@ -29,7 +29,7 @@ const ( ) type SkyWalkingClientAPI interface { - Query(query string) (interface{}, error) + Query(query string) (any, error) } type SkyWalkingClient struct { @@ -38,7 +38,7 @@ type SkyWalkingClient struct { } // Query executes a GraphQL query against the given SkyWalking backend -func (n SkyWalkingClient) Query(query string) (interface{}, error) { +func (n SkyWalkingClient) Query(query string) (any, error) { ctx, cancel := context.WithTimeout(context.Background(), defaultQueryTimeout) defer cancel() @@ -48,7 +48,7 @@ func (n SkyWalkingClient) Query(query string) (interface{}, error) { End: time.Now().Format("2006-01-02 1504"), Step: "MINUTE", }) - var results interface{} + var results any err := n.Run(ctx, req, &results) return results, err } @@ -82,7 +82,7 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph return newMeasurement } -func toJSONString(v interface{}) (string, error) { +func toJSONString(v any) (string, error) { b, err := json.Marshal(v) if err != nil { return "", err @@ -90,7 +90,7 @@ func toJSONString(v interface{}) (string, error) { return string(b), nil } -func (p *Provider) processResponse(metric v1alpha1.Metric, result interface{}) (string, v1alpha1.AnalysisPhase, error) { +func (p *Provider) processResponse(metric v1alpha1.Metric, result any) (string, v1alpha1.AnalysisPhase, error) { if result == nil { return "", v1alpha1.AnalysisPhaseFailed, fmt.Errorf("no results returned from SkyWalking query") } diff --git a/metricproviders/skywalking/skywalking_test.go b/metricproviders/skywalking/skywalking_test.go index 47c1a60dc9..434def389c 100644 --- a/metricproviders/skywalking/skywalking_test.go +++ b/metricproviders/skywalking/skywalking_test.go @@ -25,7 +25,7 @@ func TestType(t *testing.T) { func TestRunSuccessfully(t *testing.T) { e := log.Entry{} mock := &mockAPI{ - results: map[string]interface{}{"count": 10}, + results: map[string]any{"count": 10}, } p := NewSkyWalkingProvider(mock, e) metric := v1alpha1.Metric{ @@ -51,10 +51,10 @@ func TestRunSuccessfully(t *testing.T) { func TestRunWithTimeseries(t *testing.T) { e := log.NewEntry(log.New()) mock := &mockAPI{ - results: []interface{}{ - map[string]interface{}{"count": 10}, - map[string]interface{}{"count": 20}, - map[string]interface{}{"count": 30}}, + results: []any{ + map[string]any{"count": 10}, + map[string]any{"count": 20}, + map[string]any{"count": 30}}, } p := NewSkyWalkingProvider(mock, *e) metric := v1alpha1.Metric{ @@ -107,7 +107,7 @@ func TestRunWithResolveArgsError(t *testing.T) { expectedErr := fmt.Errorf("failed to resolve {{args.var}}") mock := &mockAPI{ err: expectedErr, - results: map[string]interface{}{"A": "B"}, + results: map[string]any{"A": "B"}, } p := NewSkyWalkingProvider(mock, *e) metric := v1alpha1.Metric{ diff --git a/metricproviders/webmetric/webmetric.go b/metricproviders/webmetric/webmetric.go index e32531f92a..3ec345b90f 100644 --- a/metricproviders/webmetric/webmetric.go +++ b/metricproviders/webmetric/webmetric.go @@ -119,7 +119,7 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph } func (p *Provider) parseResponse(metric v1alpha1.Metric, response *http.Response) (string, v1alpha1.AnalysisPhase, error) { - var data interface{} + var data any bodyBytes, err := io.ReadAll(response.Body) if err != nil { @@ -145,7 +145,7 @@ func (p *Provider) parseResponse(metric v1alpha1.Metric, response *http.Response return valString, status, err } -func getValue(fullResults [][]reflect.Value) (interface{}, string, error) { +func getValue(fullResults [][]reflect.Value) (any, string, error) { for _, results := range fullResults { for _, r := range results { val := r.Interface() diff --git a/pkg/apis/rollouts/validation/validation_references.go b/pkg/apis/rollouts/validation/validation_references.go index 85040c71c5..f546766b83 100644 --- a/pkg/apis/rollouts/validation/validation_references.go +++ b/pkg/apis/rollouts/validation/validation_references.go @@ -474,7 +474,7 @@ func ValidateAppMeshVirtualRouter(vrouter *unstructured.Unstructured) *field.Err } for idx, routeI := range allRoutesI { routeFldPath := routesFldPath.Index(idx) - route, ok := routeI.(map[string]interface{}) + route, ok := routeI.(map[string]any) if !ok { msg := fmt.Sprintf("Invalid route was found for AppMesh virtual-router %s at index %d", vrouter.GetName(), idx) return field.Invalid(routeFldPath, vrouter.GetName(), msg) diff --git a/pkg/kubectl-argo-rollouts/cmd/create/create.go b/pkg/kubectl-argo-rollouts/cmd/create/create.go index f5dccb4932..a6523d24f7 100644 --- a/pkg/kubectl-argo-rollouts/cmd/create/create.go +++ b/pkg/kubectl-argo-rollouts/cmd/create/create.go @@ -127,7 +127,7 @@ func isJSON(fileBytes []byte) bool { return false } -func unmarshal(fileBytes []byte, obj interface{}) error { +func unmarshal(fileBytes []byte, obj any) error { if isJSON(fileBytes) { decoder := json.NewDecoder(bytes.NewReader(fileBytes)) decoder.DisallowUnknownFields() @@ -143,7 +143,7 @@ func (c *CreateOptions) getNamespace(un unstructured.Unstructured) string { if md == nil { return ns } - metadata := md.(map[string]interface{}) + metadata := md.(map[string]any) if internalns, ok := metadata["namespace"]; ok { ns = internalns.(string) } diff --git a/pkg/kubectl-argo-rollouts/cmd/lint/lint.go b/pkg/kubectl-argo-rollouts/cmd/lint/lint.go index cf1b3cdb36..810abf2c8e 100644 --- a/pkg/kubectl-argo-rollouts/cmd/lint/lint.go +++ b/pkg/kubectl-argo-rollouts/cmd/lint/lint.go @@ -65,7 +65,7 @@ func NewCmdLint(o *options.ArgoRolloutsOptions) *cobra.Command { return cmd } -func unmarshal(fileBytes []byte, obj interface{}) error { +func unmarshal(fileBytes []byte, obj any) error { return yaml.UnmarshalStrict(fileBytes, &obj, yaml.DisallowUnknownFields) } @@ -81,7 +81,7 @@ func (l *LintOptions) lintResource(path string) error { decoder := goyaml.NewDecoder(bytes.NewReader(fileBytes)) for { - var value interface{} + var value any if err := decoder.Decode(&value); err != nil { if err != io.EOF { return err diff --git a/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go b/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go index 493a8aaa18..cb83a157fa 100644 --- a/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go +++ b/pkg/kubectl-argo-rollouts/cmd/list/list_experiments.go @@ -99,7 +99,7 @@ func (o *ListOptions) PrintExperimentTable(expList *v1alpha1.ExperimentList) err } } } - var cols []interface{} + var cols []any if o.allNamespaces { cols = append(cols, exp.Namespace) } diff --git a/pkg/kubectl-argo-rollouts/cmd/list/rollloutinfo.go b/pkg/kubectl-argo-rollouts/cmd/list/rollloutinfo.go index d015939f69..a797e35f1d 100644 --- a/pkg/kubectl-argo-rollouts/cmd/list/rollloutinfo.go +++ b/pkg/kubectl-argo-rollouts/cmd/list/rollloutinfo.go @@ -86,15 +86,15 @@ func (ri *rolloutInfo) key() infoKey { func (ri *rolloutInfo) String(timestamp, namespace bool) string { fmtString := columnFmtString - args := []interface{}{ri.name, ri.strategy, ri.status, ri.step, ri.setWeight, ri.readyCurrent, ri.desired, ri.upToDate, ri.available} + args := []any{ri.name, ri.strategy, ri.status, ri.step, ri.setWeight, ri.readyCurrent, ri.desired, ri.upToDate, ri.available} if namespace { fmtString = "%-9s\t" + fmtString - args = append([]interface{}{ri.namespace}, args...) + args = append([]any{ri.namespace}, args...) } if timestamp { fmtString = "%-20s\t" + fmtString timestampStr := timeutil.Now().UTC().Truncate(time.Second).Format("2006-01-02T15:04:05Z") - args = append([]interface{}{timestampStr}, args...) + args = append([]any{timestampStr}, args...) } return fmt.Sprintf(fmtString, args...) } diff --git a/pkg/kubectl-argo-rollouts/cmd/set/set_image.go b/pkg/kubectl-argo-rollouts/cmd/set/set_image.go index 45ed6faac9..1a5b5dce24 100644 --- a/pkg/kubectl-argo-rollouts/cmd/set/set_image.go +++ b/pkg/kubectl-argo-rollouts/cmd/set/set_image.go @@ -124,9 +124,9 @@ func newRolloutSetImage(orig *unstructured.Unstructured, container string, image if !ok { continue } - ctrList := ctrListIf.([]interface{}) + ctrList := ctrListIf.([]any) for _, ctrIf := range ctrList { - ctr := ctrIf.(map[string]interface{}) + ctr := ctrIf.(map[string]any) if name, _, _ := unstructured.NestedString(ctr, "name"); name == container || container == "*" { ctr["image"] = image containerFound = true diff --git a/pkg/kubectl-argo-rollouts/cmd/undo/undo.go b/pkg/kubectl-argo-rollouts/cmd/undo/undo.go index a282757b16..d3a78d15f2 100644 --- a/pkg/kubectl-argo-rollouts/cmd/undo/undo.go +++ b/pkg/kubectl-argo-rollouts/cmd/undo/undo.go @@ -176,8 +176,8 @@ func rolloutRevision(ro *unstructured.Unstructured, c kubernetes.Interface, toRe } func getRolloutPatch(podTemplate *corev1.PodTemplateSpec, annotations map[string]string) (types.PatchType, []byte, error) { - patch, err := json.Marshal([]interface{}{ - map[string]interface{}{ + patch, err := json.Marshal([]any{ + map[string]any{ "op": "replace", "path": "/spec/template", "value": podTemplate, @@ -235,12 +235,12 @@ func listReplicaSets(ro *unstructured.Unstructured, getRSList rsListFunc) ([]*ap return owned, nil } -func extractLabelSelector(v map[string]interface{}) (*metav1.LabelSelector, error) { +func extractLabelSelector(v map[string]any) (*metav1.LabelSelector, error) { labels, _, _ := unstructured.NestedStringMap(v, "spec", "selector", "matchLabels") items, _, _ := unstructured.NestedSlice(v, "spec", "selector", "matchExpressions") matchExpressions := []metav1.LabelSelectorRequirement{} for _, item := range items { - m, ok := item.(map[string]interface{}) + m, ok := item.(map[string]any) if !ok { return nil, fmt.Errorf("unable to retrieve matchExpressions for object, item %v is not a map", item) } diff --git a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go index 157f148d5f..4aafb0a32a 100644 --- a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go +++ b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go @@ -45,9 +45,9 @@ type viewController struct { cacheSyncs []cache.InformerSynced workqueue workqueue.RateLimitingInterface - prevObj interface{} - getObj func() (interface{}, error) - callbacks []func(interface{}) + prevObj any + getObj func() (any, error) + callbacks []func(any) } type RolloutViewController struct { @@ -71,7 +71,7 @@ func NewRolloutViewController(namespace string, name string, kubeClient kubernet rvc := RolloutViewController{ viewController: vc, } - vc.getObj = func() (interface{}, error) { + vc.getObj = func() (any, error) { return rvc.GetRolloutInfo() } return &rvc @@ -82,7 +82,7 @@ func NewExperimentViewController(namespace string, name string, kubeClient kuber evc := ExperimentViewController{ viewController: vc, } - vc.getObj = func() (interface{}, error) { + vc.getObj = func() (any, error) { return evc.GetExperimentInfo() } return &evc @@ -114,13 +114,13 @@ func newViewController(namespace string, name string, kubeClient kubernetes.Inte ) enqueueRolloutHandlerFuncs := cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controller.workqueue.Add(controller.name) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { controller.workqueue.Add(controller.name) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controller.workqueue.Add(controller.name) }, } @@ -215,7 +215,7 @@ func (c *RolloutViewController) GetRolloutInfo() (*rollout.RolloutInfo, error) { } func (c *RolloutViewController) RegisterCallback(callback RolloutInfoCallback) { - cb := func(i interface{}) { + cb := func(i any) { callback(i.(*rollout.RolloutInfo)) } c.callbacks = append(c.callbacks, cb) @@ -243,7 +243,7 @@ func (c *ExperimentViewController) GetExperimentInfo() (*rollout.ExperimentInfo, } func (c *ExperimentViewController) RegisterCallback(callback ExperimentInfoCallback) { - cb := func(i interface{}) { + cb := func(i any) { callback(i.(*rollout.ExperimentInfo)) } c.callbacks = append(c.callbacks, cb) diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 9f66cf1078..e3bffff2dd 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -1467,7 +1467,7 @@ func TestCanaryRolloutWithInvalidCanaryServiceName(t *testing.T) { patchIndex := f.expectPatchRolloutAction(rollout) f.run(getKey(rollout, t)) - patch := make(map[string]interface{}) + patch := make(map[string]any) patchData := f.getPatchedRollout(patchIndex) err := json.Unmarshal([]byte(patchData), &patch) assert.NoError(t, err) @@ -1477,7 +1477,7 @@ func TestCanaryRolloutWithInvalidCanaryServiceName(t *testing.T) { assert.True(t, ok) assert.Len(t, c, 2) - condition, ok := c[1].(map[string]interface{}) + condition, ok := c[1].(map[string]any) assert.True(t, ok) assert.Equal(t, conditions.InvalidSpecReason, condition["reason"]) assert.Equal(t, "The Rollout \"foo\" is invalid: spec.strategy.canary.canaryService: Invalid value: \"invalid-canary\": service \"invalid-canary\" not found", condition["message"]) @@ -1519,7 +1519,7 @@ func TestCanaryRolloutWithInvalidStableServiceName(t *testing.T) { patchIndex := f.expectPatchRolloutAction(rollout) f.run(getKey(rollout, t)) - patch := make(map[string]interface{}) + patch := make(map[string]any) patchData := f.getPatchedRollout(patchIndex) err := json.Unmarshal([]byte(patchData), &patch) assert.NoError(t, err) @@ -1529,7 +1529,7 @@ func TestCanaryRolloutWithInvalidStableServiceName(t *testing.T) { assert.True(t, ok) assert.Len(t, c, 2) - condition, ok := c[1].(map[string]interface{}) + condition, ok := c[1].(map[string]any) assert.True(t, ok) assert.Equal(t, conditions.InvalidSpecReason, condition["reason"]) assert.Equal(t, "The Rollout \"foo\" is invalid: spec.strategy.canary.stableService: Invalid value: \"invalid-stable\": service \"invalid-stable\" not found", condition["message"]) @@ -1570,7 +1570,7 @@ func TestCanaryRolloutWithInvalidPingServiceName(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r) f.run(getKey(r, t)) - patch := make(map[string]interface{}) + patch := make(map[string]any) patchData := f.getPatchedRollout(patchIndex) err := json.Unmarshal([]byte(patchData), &patch) assert.NoError(t, err) @@ -1580,7 +1580,7 @@ func TestCanaryRolloutWithInvalidPingServiceName(t *testing.T) { assert.True(t, ok) assert.Len(t, c, 2) - condition, ok := c[1].(map[string]interface{}) + condition, ok := c[1].(map[string]any) assert.True(t, ok) assert.Equal(t, conditions.InvalidSpecReason, condition["reason"]) assert.Equal(t, "The Rollout \"foo\" is invalid: spec.strategy.canary.pingPong.pingService: Invalid value: \"ping-service\": service \"ping-service\" not found", condition["message"]) @@ -1602,7 +1602,7 @@ func TestCanaryRolloutWithInvalidPongServiceName(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r) f.run(getKey(r, t)) - patch := make(map[string]interface{}) + patch := make(map[string]any) patchData := f.getPatchedRollout(patchIndex) err := json.Unmarshal([]byte(patchData), &patch) assert.NoError(t, err) @@ -1612,7 +1612,7 @@ func TestCanaryRolloutWithInvalidPongServiceName(t *testing.T) { assert.True(t, ok) assert.Len(t, c, 2) - condition, ok := c[1].(map[string]interface{}) + condition, ok := c[1].(map[string]any) assert.True(t, ok) assert.Equal(t, conditions.InvalidSpecReason, condition["reason"]) assert.Equal(t, "The Rollout \"foo\" is invalid: spec.strategy.canary.pingPong.pongService: Invalid value: \"pong-service\": service \"pong-service\" not found", condition["message"]) @@ -1698,11 +1698,11 @@ func TestResumeRolloutAfterPauseDuration(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - var patchObj map[string]interface{} + var patchObj map[string]any err := json.Unmarshal([]byte(patch), &patchObj) assert.NoError(t, err) - status := patchObj["status"].(map[string]interface{}) + status := patchObj["status"].(map[string]any) assert.Equal(t, float64(2), status["currentStepIndex"]) controllerPause, ok := status["controllerPause"] assert.True(t, ok) diff --git a/rollout/controller.go b/rollout/controller.go index b5c51914ae..5824512271 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -144,8 +144,8 @@ type reconcilerBase struct { podRestarter RolloutPodRestarter // used for unit testing - enqueueRollout func(obj interface{}) //nolint:structcheck - enqueueRolloutAfter func(obj interface{}, duration time.Duration) //nolint:structcheck + enqueueRollout func(obj any) //nolint:structcheck + enqueueRolloutAfter func(obj any, duration time.Duration) //nolint:structcheck newTrafficRoutingReconciler func(roCtx *rolloutContext) ([]trafficrouting.TrafficRoutingReconciler, error) //nolint:structcheck // recorder is an event recorder for recording Event resources to the Kubernetes API. @@ -171,7 +171,7 @@ func NewController(cfg ControllerConfig) *Controller { podRestarter := RolloutPodRestarter{ client: cfg.KubeClientSet, resyncPeriod: cfg.ResyncPeriod, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { controllerutil.EnqueueAfter(obj, duration, cfg.RolloutWorkQueue) }, } @@ -208,10 +208,10 @@ func NewController(cfg ControllerConfig) *Controller { ingressWorkqueue: cfg.IngressWorkQueue, metricsServer: cfg.MetricsServer, } - controller.enqueueRollout = func(obj interface{}) { + controller.enqueueRollout = func(obj any) { controllerutil.EnqueueRateLimited(obj, cfg.RolloutWorkQueue) } - controller.enqueueRolloutAfter = func(obj interface{}, duration time.Duration) { + controller.enqueueRolloutAfter = func(obj any, duration time.Duration) { controllerutil.EnqueueAfter(obj, duration, cfg.RolloutWorkQueue) } @@ -228,7 +228,7 @@ func NewController(cfg ControllerConfig) *Controller { log.Info("Setting up event handlers") // Set up an event handler for when rollout resources change cfg.RolloutsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controller.enqueueRollout(obj) ro := unstructuredutil.ObjectToRollout(obj) if ro != nil { @@ -242,7 +242,7 @@ func NewController(cfg ControllerConfig) *Controller { } } }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { oldRollout := unstructuredutil.ObjectToRollout(old) newRollout := unstructuredutil.ObjectToRollout(new) if oldRollout != nil && newRollout != nil { @@ -258,7 +258,7 @@ func NewController(cfg ControllerConfig) *Controller { } controller.enqueueRollout(new) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil { logCtx := logutil.WithRollout(ro) logCtx.Info("rollout deleted") @@ -277,10 +277,10 @@ func NewController(cfg ControllerConfig) *Controller { }) cfg.ReplicaSetInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.RolloutKind, controller.enqueueRollout) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { newRS := new.(*appsv1.ReplicaSet) oldRS := old.(*appsv1.ReplicaSet) if newRS.ResourceVersion == oldRS.ResourceVersion { @@ -290,16 +290,16 @@ func NewController(cfg ControllerConfig) *Controller { } controllerutil.EnqueueParentObject(new, register.RolloutKind, controller.enqueueRollout) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.RolloutKind, controller.enqueueRollout) }, }) cfg.AnalysisRunInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.RolloutKind, controller.enqueueRollout) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { oldAR := unstructuredutil.ObjectToAnalysisRun(old) newAR := unstructuredutil.ObjectToAnalysisRun(new) if oldAR == nil || newAR == nil { @@ -311,7 +311,7 @@ func NewController(cfg ControllerConfig) *Controller { } controllerutil.EnqueueParentObject(new, register.RolloutKind, controller.enqueueRollout) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controllerutil.EnqueueParentObject(obj, register.RolloutKind, controller.enqueueRollout) }, }) @@ -884,7 +884,7 @@ func (c *rolloutContext) getReferencedALBIngresses(canary *v1alpha1.CanaryStrate return &ingresses, nil } -func handleCacheError(name string, childFields []string, value interface{}, err error) (*[]ingressutil.Ingress, error) { +func handleCacheError(name string, childFields []string, value any, err error) (*[]ingressutil.Ingress, error) { if k8serrors.IsNotFound(err) { fldPath := field.NewPath("spec", "strategy", "canary", "trafficRouting") return nil, field.Invalid(fldPath.Child(name, childFields...), value, err.Error()) diff --git a/rollout/controller_test.go b/rollout/controller_test.go index d2c78d70c1..d37cdc24cd 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -494,12 +494,12 @@ func calculatePatch(ro *v1alpha1.Rollout, patch string) string { json.Unmarshal(newBytes, newRO) newObservedGen := strconv.Itoa(int(newRO.Generation)) - newPatch := make(map[string]interface{}) + newPatch := make(map[string]any) err = json.Unmarshal([]byte(patch), &newPatch) if err != nil { panic(err) } - newStatus := newPatch["status"].(map[string]interface{}) + newStatus := newPatch["status"].(map[string]any) newStatus["observedGeneration"] = newObservedGen newPatch["status"] = newStatus newPatchBytes, _ := json.Marshal(newPatch) @@ -507,7 +507,7 @@ func calculatePatch(ro *v1alpha1.Rollout, patch string) string { } func cleanPatch(expectedPatch string) string { - patch := make(map[string]interface{}) + patch := make(map[string]any) err := json.Unmarshal([]byte(expectedPatch), &patch) if err != nil { panic(err) @@ -599,7 +599,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share }) var enqueuedObjectsLock sync.Mutex - c.enqueueRollout = func(obj interface{}) { + c.enqueueRollout = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { @@ -615,7 +615,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share f.enqueuedObjects[key] = count c.rolloutWorkqueue.Add(obj) } - c.enqueueRolloutAfter = func(obj interface{}, duration time.Duration) { + c.enqueueRolloutAfter = func(obj any, duration time.Duration) { c.enqueueRollout(obj) } c.newTrafficRoutingReconciler = func(roCtx *rolloutContext) ([]trafficrouting.TrafficRoutingReconciler, error) { @@ -1078,7 +1078,7 @@ func (f *fixture) getPatchedRolloutWithoutConditions(index int) string { if !ok { f.t.Fatalf("Expected Patch action, not %s", action.GetVerb()) } - ro := make(map[string]interface{}) + ro := make(map[string]any) err := json.Unmarshal(patchAction.GetPatch(), &ro) if err != nil { f.t.Fatalf("Unable to unmarshal Patch") diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index b1588ff4ce..26b05b5b54 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -210,7 +210,7 @@ func TestReconcileNewReplicaSet(t *testing.T) { rollout: rollout, }, } - roCtx.enqueueRolloutAfter = func(obj interface{}, duration time.Duration) {} + roCtx.enqueueRolloutAfter = func(obj any, duration time.Duration) {} if test.abortScaleDownDelaySeconds > 0 { rollout.Status.Abort = true rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ diff --git a/rollout/restart.go b/rollout/restart.go index a8361bf24f..95f9a97076 100644 --- a/rollout/restart.go +++ b/rollout/restart.go @@ -36,7 +36,7 @@ const ( type RolloutPodRestarter struct { client kubernetes.Interface resyncPeriod time.Duration - enqueueAfter func(obj interface{}, duration time.Duration) + enqueueAfter func(obj any, duration time.Duration) } // checkEnqueueRollout enqueues a Rollout if the Rollout's restartedAt is within the next resync diff --git a/rollout/restart_test.go b/rollout/restart_test.go index 84374a37a4..a6a20b4188 100644 --- a/rollout/restart_test.go +++ b/rollout/restart_test.go @@ -94,7 +94,7 @@ func TestRestartCheckEnqueueRollout(t *testing.T) { log: logrus.WithField("", ""), } p := RolloutPodRestarter{ - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { assert.Fail(t, "Should not enqueue rollout") }, } @@ -108,7 +108,7 @@ func TestRestartCheckEnqueueRollout(t *testing.T) { } p := RolloutPodRestarter{ resyncPeriod: 10 * time.Minute, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { assert.Fail(t, "Should not enqueue rollout") }, } @@ -123,7 +123,7 @@ func TestRestartCheckEnqueueRollout(t *testing.T) { } p := RolloutPodRestarter{ resyncPeriod: 10 * time.Minute, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -139,7 +139,7 @@ func TestRestartCheckEnqueueRollout(t *testing.T) { } p := RolloutPodRestarter{ resyncPeriod: 2 * time.Minute, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -182,7 +182,7 @@ func TestRestartReconcile(t *testing.T) { r := RolloutPodRestarter{ client: client, resyncPeriod: 2 * time.Minute, - enqueueAfter: func(obj interface{}, duration time.Duration) {}, + enqueueAfter: func(obj any, duration time.Duration) {}, } err := r.Reconcile(roCtx) assert.Nil(t, err) @@ -203,7 +203,7 @@ func TestRestartReconcile(t *testing.T) { }) r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) {}, + enqueueAfter: func(obj any, duration time.Duration) {}, } err := r.Reconcile(roCtx) assert.Errorf(t, err, expectedErrMsg) @@ -217,7 +217,7 @@ func TestRestartReconcile(t *testing.T) { } r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) {}, + enqueueAfter: func(obj any, duration time.Duration) {}, } err := r.Reconcile(roCtx) assert.Nil(t, err) @@ -235,7 +235,7 @@ func TestRestartReconcile(t *testing.T) { } r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) {}, + enqueueAfter: func(obj any, duration time.Duration) {}, } err := r.Reconcile(roCtx) assert.Nil(t, err) @@ -252,7 +252,7 @@ func TestRestartReconcile(t *testing.T) { } r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) {}, + enqueueAfter: func(obj any, duration time.Duration) {}, } err := r.Reconcile(roCtx) assert.Nil(t, err) @@ -469,7 +469,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -497,7 +497,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -525,7 +525,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -558,7 +558,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -592,7 +592,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -618,7 +618,7 @@ func TestRestartMaxUnavailable(t *testing.T) { enqueued := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueued = true }, } @@ -650,7 +650,7 @@ func TestRestartRespectPodDisruptionBudget(t *testing.T) { enqueueCalled := false r := RolloutPodRestarter{ client: client, - enqueueAfter: func(obj interface{}, duration time.Duration) { + enqueueAfter: func(obj any, duration time.Duration) { enqueueCalled = true }, } diff --git a/rollout/templateref.go b/rollout/templateref.go index a8faf92b8b..15dab6a27d 100644 --- a/rollout/templateref.go +++ b/rollout/templateref.go @@ -75,7 +75,7 @@ func NewInformerBasedWorkloadRefResolver( ) *informerBasedTemplateResolver { ctx, cancelContext := context.WithCancel(context.TODO()) err := rolloutsInformer.AddIndexers(cache.Indexers{ - templateRefIndexName: func(obj interface{}) ([]string, error) { + templateRefIndexName: func(obj any) ([]string, error) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil && ro.Spec.WorkloadRef != nil { return []string{refKey(*ro.Spec.WorkloadRef, ro.Namespace)}, nil } @@ -115,7 +115,7 @@ func (r *informerBasedTemplateResolver) Stop() { r.cancelContext = cancelContext } -func remarshalMap(objMap map[string]interface{}, res interface{}) error { +func remarshalMap(objMap map[string]any, res any) error { data, err := json.Marshal(objMap) if err != nil { return err @@ -210,13 +210,13 @@ func (r *informerBasedTemplateResolver) newInformerForGVK(gvk schema.GroupVersio cache.Indexers{}, nil) informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { r.updateRolloutsReferenceAnnotation(obj, gvk) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { r.updateRolloutsReferenceAnnotation(newObj, gvk) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { r.updateRolloutsReferenceAnnotation(obj, gvk) }, }) @@ -225,7 +225,7 @@ func (r *informerBasedTemplateResolver) newInformerForGVK(gvk schema.GroupVersio } // updateRolloutsReferenceAnnotation update the annotation of all rollouts referenced by given object -func (r *informerBasedTemplateResolver) updateRolloutsReferenceAnnotation(obj interface{}, gvk schema.GroupVersionKind) { +func (r *informerBasedTemplateResolver) updateRolloutsReferenceAnnotation(obj any, gvk schema.GroupVersionKind) { workloadMeta, err := meta.Accessor(obj) if err != nil { return @@ -247,9 +247,9 @@ func (r *informerBasedTemplateResolver) updateRolloutsReferenceAnnotation(obj in updated := annotations.SetRolloutWorkloadRefGeneration(ro, generation) if updated { - patch := map[string]interface{}{ - "metadata": map[string]interface{}{ - "annotations": map[string]interface{}{ + patch := map[string]any{ + "metadata": map[string]any{ + "annotations": map[string]any{ annotations.WorkloadGenerationAnnotation: ro.Annotations[annotations.WorkloadGenerationAnnotation], }, }, diff --git a/rollout/trafficrouting/apisix/apisix.go b/rollout/trafficrouting/apisix/apisix.go index 1147721a39..6269cc698e 100644 --- a/rollout/trafficrouting/apisix/apisix.go +++ b/rollout/trafficrouting/apisix/apisix.go @@ -91,7 +91,7 @@ func (r *Reconciler) SetWeight(desiredWeight int32, additionalDestinations ...v1 return err } -func (r *Reconciler) processSetWeightRoutes(desiredWeight int32, apisixRoute *unstructured.Unstructured, rollout *v1alpha1.Rollout, apisixRouteName string) ([]interface{}, error) { +func (r *Reconciler) processSetWeightRoutes(desiredWeight int32, apisixRoute *unstructured.Unstructured, rollout *v1alpha1.Rollout, apisixRouteName string) ([]any, error) { httpRoutes, isFound, err := unstructured.NestedSlice(apisixRoute.Object, "spec", "http") if err != nil { return nil, err @@ -129,9 +129,9 @@ func (r *Reconciler) processSetWeightRoutes(desiredWeight int32, apisixRoute *un return httpRoutes, nil } -func GetHttpRoute(routes []interface{}, ref string) (interface{}, error) { +func GetHttpRoute(routes []any, ref string) (any, error) { for _, route := range routes { - typedRoute, ok := route.(map[string]interface{}) + typedRoute, ok := route.(map[string]any) if !ok { return nil, errors.New(failedToTypeAssertion) } @@ -151,8 +151,8 @@ func GetHttpRoute(routes []interface{}, ref string) (interface{}, error) { return nil, errors.New(fmt.Sprintf("Apisix http route rule %s not found", ref)) } -func GetBackends(httpRoute interface{}) ([]interface{}, error) { - typedHttpRoute, ok := httpRoute.(map[string]interface{}) +func GetBackends(httpRoute any) ([]any, error) { + typedHttpRoute, ok := httpRoute.(map[string]any) if !ok { return nil, errors.New(failedToTypeAssertion) } @@ -160,17 +160,17 @@ func GetBackends(httpRoute interface{}) ([]interface{}, error) { if !ok { return nil, errors.New("Apisix http route backends not found") } - backends, ok := rawBackends.([]interface{}) + backends, ok := rawBackends.([]any) if !ok { return nil, errors.New(fmt.Sprintf("%s backends", failedToTypeAssertion)) } return backends, nil } -func setBackendWeight(backendName string, backends []interface{}, weight int64) error { +func setBackendWeight(backendName string, backends []any, weight int64) error { found := false for _, backend := range backends { - typedBackend, ok := backend.(map[string]interface{}) + typedBackend, ok := backend.(map[string]any) if !ok { return errors.New(fmt.Sprintf("%s backends", failedToTypeAssertion)) } @@ -323,14 +323,14 @@ func (r *Reconciler) makeSetHeaderRoute(ctx context.Context, headerRouting *v1al return setHeaderApisixRoute, isNew, nil } -func removeBackend(route interface{}, backendName string, backends []interface{}) error { - typedRoute, ok := route.(map[string]interface{}) +func removeBackend(route any, backendName string, backends []any) error { + typedRoute, ok := route.(map[string]any) if !ok { return errors.New("Failed type assertion for Apisix http route") } - result := []interface{}{} + result := []any{} for _, backend := range backends { - typedBackend, ok := backend.(map[string]interface{}) + typedBackend, ok := backend.(map[string]any) if !ok { return errors.New("Failed type assertion for Apisix http route backend") } @@ -348,8 +348,8 @@ func removeBackend(route interface{}, backendName string, backends []interface{} return unstructured.SetNestedSlice(typedRoute, result, "backends") } -func processRulePriority(route interface{}) error { - typedRoute, ok := route.(map[string]interface{}) +func processRulePriority(route any) error { + typedRoute, ok := route.(map[string]any) if !ok { return errors.New("Failed type assertion for Apisix http route") } @@ -366,40 +366,40 @@ func processRulePriority(route interface{}) error { return nil } -func setApisixRuleMatch(route interface{}, headerRouting *v1alpha1.SetHeaderRoute) error { - typedRoute, ok := route.(map[string]interface{}) +func setApisixRuleMatch(route any, headerRouting *v1alpha1.SetHeaderRoute) error { + typedRoute, ok := route.(map[string]any) if !ok { return errors.New("Failed type assertion for Apisix http route") } - exprs := []interface{}{} + exprs := []any{} for _, match := range headerRouting.Match { exprs = append(exprs, apisixExprs(match.HeaderName, match.HeaderValue.Exact, match.HeaderValue.Regex, match.HeaderValue.Prefix)...) } return unstructured.SetNestedSlice(typedRoute, exprs, "match", "exprs") } -func apisixExprs(header, exact, regex, prefix string) []interface{} { - subject := map[string]interface{}{ +func apisixExprs(header, exact, regex, prefix string) []any { + subject := map[string]any{ "scope": "Header", "name": header, } - exprs := []interface{}{} + exprs := []any{} if exact != "" { - exprs = append(exprs, map[string]interface{}{ + exprs = append(exprs, map[string]any{ "subject": subject, "op": "Equal", "value": exact, }) } if regex != "" { - exprs = append(exprs, map[string]interface{}{ + exprs = append(exprs, map[string]any{ "subject": subject, "op": "RegexMatch", "value": regex, }) } if prefix != "" { - exprs = append(exprs, map[string]interface{}{ + exprs = append(exprs, map[string]any{ "subject": subject, "op": "RegexMatch", "value": fmt.Sprintf("^%s.*", prefix), diff --git a/rollout/trafficrouting/apisix/apisix_test.go b/rollout/trafficrouting/apisix/apisix_test.go index 9fcf4ff394..823e3bfb10 100644 --- a/rollout/trafficrouting/apisix/apisix_test.go +++ b/rollout/trafficrouting/apisix/apisix_test.go @@ -172,7 +172,7 @@ func TestSetWeight(t *testing.T) { backends, err := GetBackends(apisixHttpRouteObj) assert.NoError(t, err) for _, backend := range backends { - typedBackend, ok := backend.(map[string]interface{}) + typedBackend, ok := backend.(map[string]any) assert.Equal(t, ok, true) nameOfCurrentBackend, isFound, err := unstructured.NestedString(typedBackend, "serviceName") assert.NoError(t, err) @@ -279,7 +279,7 @@ func TestSetWeight(t *testing.T) { func TestGetHttpRouteError(t *testing.T) { type testcase struct { - routes []interface{} + routes []any ref string } testcases := []testcase{ @@ -288,28 +288,28 @@ func TestGetHttpRouteError(t *testing.T) { ref: "nil", }, { - routes: []interface{}{""}, + routes: []any{""}, ref: "Failed type", }, { - routes: []interface{}{ - map[string]interface{}{ + routes: []any{ + map[string]any{ "x": nil, }, }, ref: "noname", }, { - routes: []interface{}{ - map[string]interface{}{ + routes: []any{ + map[string]any{ "name": 123, }, }, ref: "name type error", }, { - routes: []interface{}{ - map[string]interface{}{ + routes: []any{ + map[string]any{ "name": "123", }, }, @@ -324,11 +324,11 @@ func TestGetHttpRouteError(t *testing.T) { } func TestGetBackendsError(t *testing.T) { - testcases := []interface{}{ + testcases := []any{ nil, 123, - map[string]interface{}{}, - map[string]interface{}{ + map[string]any{}, + map[string]any{ "backends": "123", }, } @@ -342,26 +342,26 @@ func TestGetBackendsError(t *testing.T) { func TestSetBackendWeightError(t *testing.T) { type testcase struct { backendName string - backends []interface{} + backends []any weight int64 } testcases := []testcase{ {}, { - backends: []interface{}{ + backends: []any{ "", }, }, { - backends: []interface{}{ - map[string]interface{}{ + backends: []any{ + map[string]any{ "abc": 123, }, }, }, { - backends: []interface{}{ - map[string]interface{}{ + backends: []any{ + map[string]any{ "serviceName": 123, }, }, @@ -512,7 +512,7 @@ func TestSetHeaderRoute(t *testing.T) { assert.NoError(t, err) assert.Equal(t, true, ok) - rule, ok := rules[0].(map[string]interface{}) + rule, ok := rules[0].(map[string]any) assert.Equal(t, true, ok) priority, ok, err := unstructured.NestedInt64(rule, "priority") assert.NoError(t, err) @@ -548,7 +548,7 @@ func TestSetHeaderRoute(t *testing.T) { assert.NoError(t, err) assert.Equal(t, true, ok) - rule, ok := rules[0].(map[string]interface{}) + rule, ok := rules[0].(map[string]any) assert.Equal(t, true, ok) priority, ok, err := unstructured.NestedInt64(rule, "priority") assert.NoError(t, err) @@ -597,7 +597,7 @@ func TestSetHeaderRoute(t *testing.T) { assert.NoError(t, err) assert.Equal(t, true, ok) - rule, ok := rules[0].(map[string]interface{}) + rule, ok := rules[0].(map[string]any) assert.Equal(t, true, ok) exprs, ok, err := unstructured.NestedSlice(rule, "match", "exprs") assert.NoError(t, err) @@ -652,7 +652,7 @@ func TestSetHeaderRoute(t *testing.T) { assert.NoError(t, err) assert.Equal(t, true, ok) - rule, ok := rules[0].(map[string]interface{}) + rule, ok := rules[0].(map[string]any) assert.Equal(t, true, ok) exprs, ok, err := unstructured.NestedSlice(rule, "match", "exprs") assert.NoError(t, err) @@ -765,11 +765,11 @@ func TestSetHeaderRoute(t *testing.T) { }) } -func assertExpr(t *testing.T, expr interface{}, op, name, scope, value string) { +func assertExpr(t *testing.T, expr any, op, name, scope, value string) { if expr == nil { assert.Error(t, errors.New("expr is nil")) } - typedExpr, ok := expr.(map[string]interface{}) + typedExpr, ok := expr.(map[string]any) assert.Equal(t, true, ok) opAct, ok, err := unstructured.NestedString(typedExpr, "op") diff --git a/rollout/trafficrouting/apisix/mocks/apisix.go b/rollout/trafficrouting/apisix/mocks/apisix.go index c884167412..2bba83c499 100644 --- a/rollout/trafficrouting/apisix/mocks/apisix.go +++ b/rollout/trafficrouting/apisix/mocks/apisix.go @@ -45,10 +45,10 @@ var ( ErrorApisixRouteObj *unstructured.Unstructured ) -func (f *FakeRecorder) Eventf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...interface{}) { +func (f *FakeRecorder) Eventf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...any) { } -func (f *FakeRecorder) Warnf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...interface{}) { +func (f *FakeRecorder) Warnf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...any) { } func (f *FakeRecorder) K8sRecorder() record.EventRecorder { diff --git a/rollout/trafficrouting/appmesh/appmesh.go b/rollout/trafficrouting/appmesh/appmesh.go index f0528f779a..6272571111 100644 --- a/rollout/trafficrouting/appmesh/appmesh.go +++ b/rollout/trafficrouting/appmesh/appmesh.go @@ -141,7 +141,7 @@ func (r *Reconciler) SetHeaderRoute(headerRouting *v1alpha1.SetHeaderRoute) erro } type routeReconcileContext struct { - route map[string]interface{} + route map[string]any routeIndex int routeFldPath *field.Path rCanaryVnodeRef *v1alpha1.AppMeshVirtualNodeReference @@ -170,7 +170,7 @@ func (r *Reconciler) reconcileVirtualRouter(ctx context.Context, rRoutes []strin for idx, routeI := range routesI { routeFldPath := routesFldPath.Index(idx) - route, ok := routeI.(map[string]interface{}) + route, ok := routeI.(map[string]any) if !ok { return field.Invalid(routeFldPath, uVrCopy.GetName(), ErrNotWellFormed) } @@ -232,12 +232,12 @@ func (r *Reconciler) reconcileRoute(ctx context.Context, uVr *unstructured.Unstr requiresUpdate := false for idx, wtI := range weightedTargets { wtFldPath := weightedTargetsFldPath.Index(idx) - wt, ok := wtI.(map[string]interface{}) + wt, ok := wtI.(map[string]any) if !ok { return false, field.Invalid(wtFldPath, uVr.GetName(), ErrNotWellFormed) } wtVnRefFldPath := wtFldPath.Child("virtualNodeRef") - wtVnRef, ok := wt["virtualNodeRef"].(map[string]interface{}) + wtVnRef, ok := wt["virtualNodeRef"].(map[string]any) if !ok { return false, field.Invalid(wtVnRefFldPath, uVr.GetName(), ErrNotWellFormed) } @@ -324,22 +324,22 @@ func (r *Reconciler) Type() string { return Type } -func getPodSelectorMatchLabels(vnode *unstructured.Unstructured) (map[string]interface{}, error) { +func getPodSelectorMatchLabels(vnode *unstructured.Unstructured) (map[string]any, error) { m, found, err := unstructured.NestedMap(vnode.Object, "spec", "podSelector", "matchLabels") if err != nil { return nil, err } if !found || m == nil { - return make(map[string]interface{}), nil + return make(map[string]any), nil } return m, nil } -func setPodSelectorMatchLabels(vnode *unstructured.Unstructured, ml map[string]interface{}) error { +func setPodSelectorMatchLabels(vnode *unstructured.Unstructured, ml map[string]any) error { return unstructured.SetNestedMap(vnode.Object, ml, "spec", "podSelector", "matchLabels") } -func toInt64(obj interface{}) (int64, error) { +func toInt64(obj any) (int64, error) { switch i := obj.(type) { case float64: return int64(i), nil @@ -370,8 +370,8 @@ func toInt64(obj interface{}) (int64, error) { } } -func GetRouteRule(route map[string]interface{}) (map[string]interface{}, string, error) { - var routeRule map[string]interface{} +func GetRouteRule(route map[string]any) (map[string]any, string, error) { + var routeRule map[string]any var routeType string for _, rType := range supportedRouteTypes { r, found, err := unstructured.NestedMap(route, rType) diff --git a/rollout/trafficrouting/appmesh/appmesh_test.go b/rollout/trafficrouting/appmesh/appmesh_test.go index 5f7ed41843..e110f8227b 100644 --- a/rollout/trafficrouting/appmesh/appmesh_test.go +++ b/rollout/trafficrouting/appmesh/appmesh_test.go @@ -218,7 +218,7 @@ func TestSetWeightWithUpdateVirtualRouterError(t *testing.T) { func TestSetWeightWithInvalidRoutes(t *testing.T) { type args struct { - routes []interface{} + routes []any fieldPathWithError string } @@ -236,7 +236,7 @@ func TestSetWeightWithInvalidRoutes(t *testing.T) { { name: "route with malformed content", args: args{ - routes: []interface{}{ + routes: []any{ "malformed-content", }, fieldPathWithError: field.NewPath("spec", "routes").Index(0).String(), @@ -245,9 +245,9 @@ func TestSetWeightWithInvalidRoutes(t *testing.T) { { name: "route with no name", args: args{ - routes: []interface{}{ - map[string]interface{}{ - "httpRoute": map[string]interface{}{}, + routes: []any{ + map[string]any{ + "httpRoute": map[string]any{}, }, }, fieldPathWithError: field.NewPath("spec", "routes").Index(0).Child("name").String(), @@ -256,10 +256,10 @@ func TestSetWeightWithInvalidRoutes(t *testing.T) { { name: "route with bad route-type", args: args{ - routes: []interface{}{ - map[string]interface{}{ + routes: []any{ + map[string]any{ "name": "primary", - "badRoute": map[string]interface{}{}, + "badRoute": map[string]any{}, }, }, fieldPathWithError: field.NewPath("spec", "routes").Index(0).String(), @@ -268,10 +268,10 @@ func TestSetWeightWithInvalidRoutes(t *testing.T) { { name: "route with no targets", args: args{ - routes: []interface{}{ - map[string]interface{}{ + routes: []any{ + map[string]any{ "name": "primary", - "httpRoute": map[string]interface{}{}, + "httpRoute": map[string]any{}, }, }, fieldPathWithError: field.NewPath("spec", "routes").Index(0).Child("httpRoute").Child("action").Child("weightedTargets").String(), @@ -654,9 +654,9 @@ func TestUpdateHashWhenUpdateCanaryVirtualNodeFails(t *testing.T) { func TestUpdateHashWithVirtualNodeMissingMatchLabels(t *testing.T) { canaryVnode := unstructuredutil.StrToUnstructuredUnsafe(baselineCanaryVnode) - unstructured.SetNestedMap(canaryVnode.Object, make(map[string]interface{}), "spec", "podSelector") + unstructured.SetNestedMap(canaryVnode.Object, make(map[string]any), "spec", "podSelector") stableVnode := unstructuredutil.StrToUnstructuredUnsafe(baselineStableVnode) - unstructured.SetNestedMap(stableVnode.Object, make(map[string]interface{}), "spec", "podSelector") + unstructured.SetNestedMap(stableVnode.Object, make(map[string]any), "spec", "podSelector") client := testutil.NewFakeDynamicClient(canaryVnode, stableVnode) cfg := ReconcilerConfig{ Rollout: fakeRollout(), @@ -704,13 +704,13 @@ func assertSetWeightAction(t *testing.T, action k8stesting.Action, desiredWeight routesI, _, err := unstructured.NestedSlice(uVr, "spec", "routes") assert.Nil(t, err) for _, routeI := range routesI { - route, _ := routeI.(map[string]interface{}) + route, _ := routeI.(map[string]any) weightedTargetsI, found, err := unstructured.NestedSlice(route, routeType, "action", "weightedTargets") assert.Nil(t, err) assert.True(t, found, "Did not find weightedTargets in route") assert.Len(t, weightedTargetsI, 2) for _, wtI := range weightedTargetsI { - wt, _ := wtI.(map[string]interface{}) + wt, _ := wtI.(map[string]any) vnodeName, _, err := unstructured.NestedString(wt, "virtualNodeRef", "name") assert.Nil(t, err) weight, err := toInt64(wt["weight"]) diff --git a/rollout/trafficrouting/appmesh/resource_client.go b/rollout/trafficrouting/appmesh/resource_client.go index 4171b9a385..4dbc4bd8cc 100644 --- a/rollout/trafficrouting/appmesh/resource_client.go +++ b/rollout/trafficrouting/appmesh/resource_client.go @@ -61,7 +61,7 @@ func (rc *ResourceClient) GetVirtualRouterCRForVirtualService(ctx context.Contex return rc.GetVirtualRouterCR(ctx, namespace, name) } -func defaultIfEmpty(strI interface{}, defaultStr string) string { +func defaultIfEmpty(strI any, defaultStr string) string { if strI == nil { return defaultStr } else { diff --git a/rollout/trafficrouting/istio/controller.go b/rollout/trafficrouting/istio/controller.go index 847ae65956..c85c4bc118 100644 --- a/rollout/trafficrouting/istio/controller.go +++ b/rollout/trafficrouting/istio/controller.go @@ -43,7 +43,7 @@ const ( type IstioControllerConfig struct { ArgoprojClientSet roclientset.Interface DynamicClientSet dynamic.Interface - EnqueueRollout func(ro interface{}) + EnqueueRollout func(ro any) RolloutsInformer informers.RolloutInformer VirtualServiceInformer cache.SharedIndexInformer DestinationRuleInformer cache.SharedIndexInformer @@ -67,7 +67,7 @@ func NewIstioController(cfg IstioControllerConfig) *IstioController { // Add a Rollout index against referenced VirtualServices and DestinationRules util.CheckErr(cfg.RolloutsInformer.Informer().AddIndexers(cache.Indexers{ - virtualServiceIndexName: func(obj interface{}) (strings []string, e error) { + virtualServiceIndexName: func(obj any) (strings []string, e error) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil { return istioutil.GetRolloutVirtualServiceKeys(ro), nil } @@ -75,7 +75,7 @@ func NewIstioController(cfg IstioControllerConfig) *IstioController { }, })) util.CheckErr(cfg.RolloutsInformer.Informer().AddIndexers(cache.Indexers{ - destinationRuleIndexName: func(obj interface{}) (strings []string, e error) { + destinationRuleIndexName: func(obj any) (strings []string, e error) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil { return istioutil.GetRolloutDesinationRuleKeys(ro), nil } @@ -85,27 +85,27 @@ func NewIstioController(cfg IstioControllerConfig) *IstioController { // When a VirtualService changes, simply enqueue the referencing rollout c.VirtualServiceInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { c.EnqueueRolloutFromIstioVirtualService(obj) }, // TODO: DeepEquals on httpRoutes - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { c.EnqueueRolloutFromIstioVirtualService(new) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { c.EnqueueRolloutFromIstioVirtualService(obj) }, }) // When a DestinationRule changes, enqueue the DestinationRule for processing c.DestinationRuleInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { c.EnqueueDestinationRule(obj) }, - UpdateFunc: func(old, new interface{}) { + UpdateFunc: func(old, new any) { c.EnqueueDestinationRule(new) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { c.EnqueueDestinationRule(obj) }, }) @@ -158,13 +158,13 @@ func (c *IstioController) Run(ctx context.Context) { // EnqueueDestinationRule examines a VirtualService, finds the Rollout referencing // that VirtualService, and enqueues the corresponding Rollout for reconciliation -func (c *IstioController) EnqueueDestinationRule(obj interface{}) { +func (c *IstioController) EnqueueDestinationRule(obj any) { controllerutil.EnqueueRateLimited(obj, c.destinationRuleWorkqueue) } // EnqueueRolloutFromIstioVirtualService examines a VirtualService, finds the Rollout referencing // that VirtualService, and enqueues the corresponding Rollout for reconciliation -func (c *IstioController) EnqueueRolloutFromIstioVirtualService(vsvc interface{}) { +func (c *IstioController) EnqueueRolloutFromIstioVirtualService(vsvc any) { acc, err := meta.Accessor(vsvc) if err != nil { log.Errorf("Error processing istio VirtualService from watch: %v: %v", err, vsvc) diff --git a/rollout/trafficrouting/istio/controller_test.go b/rollout/trafficrouting/istio/controller_test.go index af37f11053..97d85cbaff 100644 --- a/rollout/trafficrouting/istio/controller_test.go +++ b/rollout/trafficrouting/istio/controller_test.go @@ -45,7 +45,7 @@ func NewFakeIstioController(objs ...runtime.Object) *IstioController { c := NewIstioController(IstioControllerConfig{ ArgoprojClientSet: rolloutClient, DynamicClientSet: dynamicClientSet, - EnqueueRollout: func(ro interface{}) {}, + EnqueueRollout: func(ro any) {}, RolloutsInformer: rolloutInformerFactory.Argoproj().V1alpha1().Rollouts(), VirtualServiceInformer: virtualServiceInformer, DestinationRuleInformer: destinationRuleInformer, @@ -178,7 +178,7 @@ spec: key, err := cache.MetaNamespaceKeyFunc(destRule) assert.NoError(t, err) enqueueCalled := false - c.EnqueueRollout = func(obj interface{}) { + c.EnqueueRollout = func(obj any) { enqueueCalled = true } @@ -199,7 +199,7 @@ spec: key, err := cache.MetaNamespaceKeyFunc(destRule) assert.NoError(t, err) enqueueCalled := false - c.EnqueueRollout = func(obj interface{}) { + c.EnqueueRollout = func(obj any) { enqueueCalled = true } @@ -219,7 +219,7 @@ spec: key, err := cache.MetaNamespaceKeyFunc(destRule) assert.NoError(t, err) enqueueCalled := false - c.EnqueueRollout = func(obj interface{}) { + c.EnqueueRollout = func(obj any) { enqueueCalled = true } diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index 70b0cc0e68..dd44da7b25 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -74,26 +74,26 @@ const ( invalidCasting = "Invalid casting: field '%s' is not of type '%s'" ) -func (patches virtualServicePatches) patchVirtualService(httpRoutes []interface{}, tlsRoutes []interface{}, tcpRoutes []interface{}) error { +func (patches virtualServicePatches) patchVirtualService(httpRoutes []any, tlsRoutes []any, tcpRoutes []any) error { for _, patch := range patches { - var route map[string]interface{} + var route map[string]any err := false if patch.routeType == Http { - route, err = httpRoutes[patch.routeIndex].(map[string]interface{}) + route, err = httpRoutes[patch.routeIndex].(map[string]any) } else if patch.routeType == Tls { - route, err = tlsRoutes[patch.routeIndex].(map[string]interface{}) + route, err = tlsRoutes[patch.routeIndex].(map[string]any) } else if patch.routeType == Tcp { - route, err = tcpRoutes[patch.routeIndex].(map[string]interface{}) + route, err = tcpRoutes[patch.routeIndex].(map[string]any) } if !err { return fmt.Errorf(invalidCasting, patch.routeType+"[]", "map[string]interface") } - destinations, ok := route["route"].([]interface{}) + destinations, ok := route["route"].([]any) if !ok { return fmt.Errorf(invalidCasting, patch.routeType+"[].route", "[]interface") } if patch.destinationIndex < len(destinations) { - destination, ok := destinations[patch.destinationIndex].(map[string]interface{}) + destination, ok := destinations[patch.destinationIndex].(map[string]any) if !ok { return fmt.Errorf(invalidCasting, patch.routeType+"[].route[].destination", "map[string]interface") } @@ -105,9 +105,9 @@ func (patches virtualServicePatches) patchVirtualService(httpRoutes []interface{ } route["route"] = destinations } else { - destination := make(map[string]interface{}, 0) + destination := make(map[string]any, 0) destination["weight"] = float64(patch.weight) - destination["destination"] = map[string]interface{}{"host": patch.host} + destination["destination"] = map[string]any{"host": patch.host} destinations = append(destinations, destination) route["route"] = destinations } @@ -388,12 +388,12 @@ func (r *Reconciler) UpdateHash(canaryHash, stableHash string, additionalDestina // destinationRuleReplaceExtraMarshal relace the key of "Extra" with the actual content // e.g., "trafficpolicy" and return the bytes of the new object func destinationRuleReplaceExtraMarshal(dRule *DestinationRule) []byte { - dRuleNew := map[string]interface{}{} + dRuleNew := map[string]any{} dRuleNew["metadata"] = dRule.ObjectMeta.DeepCopy() - subsets := []map[string]interface{}{} + subsets := []map[string]any{} for _, subset := range dRule.Spec.Subsets { - newsubset := map[string]interface{}{} + newsubset := map[string]any{} newsubset["name"] = subset.Name newsubset["labels"] = subset.Labels @@ -402,7 +402,7 @@ func destinationRuleReplaceExtraMarshal(dRule *DestinationRule) []byte { continue } - extra := map[string]interface{}{} + extra := map[string]any{} inputbyte, _ := json.Marshal(subset.Extra) json.Unmarshal(inputbyte, &extra) @@ -412,7 +412,7 @@ func destinationRuleReplaceExtraMarshal(dRule *DestinationRule) []byte { } subsets = append(subsets, newsubset) } - dRuleNew["spec"] = map[string]interface{}{ + dRuleNew["spec"] = map[string]any{ "subsets": subsets, "host": dRule.Spec.Host, } @@ -474,7 +474,7 @@ func unstructuredToDestinationRules(un *unstructured.Unstructured) ([]byte, *Des func unMarshalSubsets(dRule *DestinationRule, dRuleBytes []byte) error { var err error - unstructured := map[string]interface{}{} + unstructured := map[string]any{} var extractFieldBytes func([]byte, string) ([]byte, error) extractFieldBytes = func(input []byte, name string) ([]byte, error) { err = json.Unmarshal(input, &unstructured) @@ -498,7 +498,7 @@ func unMarshalSubsets(dRule *DestinationRule, dRuleBytes []byte) error { return err } - subsetsMap := []map[string]interface{}{} + subsetsMap := []map[string]any{} err = json.Unmarshal(subsetsBytes, &subsetsMap) if err != nil { return err @@ -523,9 +523,9 @@ func unMarshalSubsets(dRule *DestinationRule, dRuleBytes []byte) error { return nil } -func UnmarshalJson(input []byte, result interface{}) (map[string]interface{}, error) { +func UnmarshalJson(input []byte, result any) (map[string]any, error) { // unmarshal json to a map - foomap := make(map[string]interface{}) + foomap := make(map[string]any) json.Unmarshal(input, &foomap) // create a mapstructure decoder @@ -545,7 +545,7 @@ func UnmarshalJson(input []byte, result interface{}) (map[string]interface{}, er } // copy and return unused fields - unused := map[string]interface{}{} + unused := map[string]any{} for _, k := range md.Unused { unused[k] = foomap[k] } @@ -565,7 +565,7 @@ func jsonBytesToDestinationRule(dRuleBytes []byte) (*DestinationRule, error) { return &dRule, nil } -func GetHttpRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { +func GetHttpRoutesI(obj *unstructured.Unstructured) ([]any, error) { httpRoutesI, notFound, err := unstructured.NestedSlice(obj.Object, "spec", Http) if !notFound { return nil, fmt.Errorf(SpecHttpNotFound) @@ -576,7 +576,7 @@ func GetHttpRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { return httpRoutesI, nil } -func GetTlsRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { +func GetTlsRoutesI(obj *unstructured.Unstructured) ([]any, error) { tlsRoutesI, notFound, err := unstructured.NestedSlice(obj.Object, "spec", Tls) if !notFound { return nil, fmt.Errorf(SpecHttpNotFound) @@ -587,7 +587,7 @@ func GetTlsRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { return tlsRoutesI, nil } -func GetTcpRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { +func GetTcpRoutesI(obj *unstructured.Unstructured) ([]any, error) { tcpRoutesI, notFound, err := unstructured.NestedSlice(obj.Object, "spec", Tcp) if !notFound { return nil, fmt.Errorf(".spec.tcp is not defined") @@ -598,7 +598,7 @@ func GetTcpRoutesI(obj *unstructured.Unstructured) ([]interface{}, error) { return tcpRoutesI, nil } -func GetHttpRoutes(httpRoutesI []interface{}) ([]VirtualServiceHTTPRoute, error) { +func GetHttpRoutes(httpRoutesI []any) ([]VirtualServiceHTTPRoute, error) { routeBytes, err := json.Marshal(httpRoutesI) if err != nil { return nil, err @@ -613,7 +613,7 @@ func GetHttpRoutes(httpRoutesI []interface{}) ([]VirtualServiceHTTPRoute, error) return httpRoutes, nil } -func GetTlsRoutes(obj *unstructured.Unstructured, tlsRoutesI []interface{}) ([]VirtualServiceTLSRoute, error) { +func GetTlsRoutes(obj *unstructured.Unstructured, tlsRoutesI []any) ([]VirtualServiceTLSRoute, error) { routeBytes, err := json.Marshal(tlsRoutesI) if err != nil { return nil, err @@ -628,7 +628,7 @@ func GetTlsRoutes(obj *unstructured.Unstructured, tlsRoutesI []interface{}) ([]V return tlsRoutes, nil } -func GetTcpRoutes(obj *unstructured.Unstructured, tcpRoutesI []interface{}) ([]VirtualServiceTCPRoute, error) { +func GetTcpRoutes(obj *unstructured.Unstructured, tcpRoutesI []any) ([]VirtualServiceTCPRoute, error) { routeBytes, err := json.Marshal(tcpRoutesI) if err != nil { return nil, err @@ -825,8 +825,8 @@ func (r *Reconciler) getDestinationRule(dRuleSpec *v1alpha1.IstioDestinationRule return origBytes, dRule, dRuleNew, nil } -func createHeaderRoute(virtualService v1alpha1.IstioVirtualService, unVsvc *unstructured.Unstructured, headerRouting *v1alpha1.SetHeaderRoute, host string, subset string) map[string]interface{} { - var routeMatches []interface{} +func createHeaderRoute(virtualService v1alpha1.IstioVirtualService, unVsvc *unstructured.Unstructured, headerRouting *v1alpha1.SetHeaderRoute, host string, subset string) map[string]any { + var routeMatches []any for _, hrm := range headerRouting.Match { routeMatches = append(routeMatches, createHeaderRouteMatch(hrm)) } @@ -838,41 +838,41 @@ func createHeaderRoute(virtualService v1alpha1.IstioVirtualService, unVsvc *unst canaryDestination := routeDestination(host, port.Number, subset, 100) - return map[string]interface{}{ + return map[string]any{ "name": headerRouting.Name, "match": routeMatches, - "route": []interface{}{canaryDestination}, + "route": []any{canaryDestination}, } } -func createHeaderRouteMatch(hrm v1alpha1.HeaderRoutingMatch) interface{} { - res := map[string]interface{}{} +func createHeaderRouteMatch(hrm v1alpha1.HeaderRoutingMatch) any { + res := map[string]any{} value := hrm.HeaderValue setMapValueIfNotEmpty(res, "exact", value.Exact) setMapValueIfNotEmpty(res, "regex", value.Regex) setMapValueIfNotEmpty(res, "prefix", value.Prefix) - return map[string]interface{}{ - "headers": map[string]interface{}{hrm.HeaderName: res}, + return map[string]any{ + "headers": map[string]any{hrm.HeaderName: res}, } } -func setMapValueIfNotEmpty(m map[string]interface{}, key string, value string) { +func setMapValueIfNotEmpty(m map[string]any, key string, value string) { if value != "" { m[key] = value } } -func routeDestination(host string, port uint32, subset string, weight int64) map[string]interface{} { - dest := map[string]interface{}{ +func routeDestination(host string, port uint32, subset string, weight int64) map[string]any { + dest := map[string]any{ "host": host, } if port > 0 { - dest["port"] = map[string]interface{}{"number": int64(port)} + dest["port"] = map[string]any{"number": int64(port)} } if subset != "" { dest["subset"] = subset } - routeValue := map[string]interface{}{ + routeValue := map[string]any{ "weight": float64(weight), "destination": dest, } @@ -1041,10 +1041,10 @@ func ValidateHTTPRoutes(r *v1alpha1.Rollout, routeNames []string, httpRoutes []V if err != nil { return fmt.Errorf("[ValidateHTTPRoutes] failed to marshal http routes: %w", err) } - var httpRoutesI []interface{} + var httpRoutesI []any err = json.Unmarshal(httpRoutesBytes, &httpRoutesI) if err != nil { - return fmt.Errorf("[ValidateHTTPRoutes] failed to marshal http routes to []interface{}: %w", err) + return fmt.Errorf("[ValidateHTTPRoutes] failed to marshal http routes to []any: %w", err) } _, httpRoutesNotWithinManagedRoutes, err := splitManagedRoutesAndNonManagedRoutes(r.Spec.Strategy.Canary.TrafficRouting.ManagedRoutes, httpRoutesI) @@ -1234,7 +1234,7 @@ func (r *Reconciler) reconcileVirtualServiceMirrorRoutes(virtualService v1alpha1 if !found { return fmt.Errorf(SpecHttpNotFound) } - vsRoutes = append([]interface{}{mR}, vsRoutes...) + vsRoutes = append([]any{mR}, vsRoutes...) if err := unstructured.SetNestedSlice(istioVirtualService.Object, vsRoutes, "spec", Http); err != nil { return fmt.Errorf("[reconcileVirtualServiceMirrorRoutes] failed to update virtual service routes via set nested slice: %w", err) } @@ -1243,8 +1243,8 @@ func (r *Reconciler) reconcileVirtualServiceMirrorRoutes(virtualService v1alpha1 } // getVirtualServiceHttpRoutes This returns all the http routes from an istio virtual service as both a rollouts wrapped type -// []VirtualServiceHTTPRoute and a []interface{} of VirtualServiceHTTPRoute -func getVirtualServiceHttpRoutes(obj *unstructured.Unstructured) ([]VirtualServiceHTTPRoute, []interface{}, error) { +// []VirtualServiceHTTPRoute and a []any of VirtualServiceHTTPRoute +func getVirtualServiceHttpRoutes(obj *unstructured.Unstructured) ([]VirtualServiceHTTPRoute, []any, error) { httpRoutesI, err := GetHttpRoutesI(obj) if err != nil { return nil, nil, fmt.Errorf("[getVirtualServiceHttpRoutes] failed to get http route interfaces: %w", err) @@ -1256,9 +1256,9 @@ func getVirtualServiceHttpRoutes(obj *unstructured.Unstructured) ([]VirtualServi return routes, httpRoutesI, nil } -// createMirrorRoute This returns a map[string]interface{} of an istio virtual service mirror route configuration using the last +// createMirrorRoute This returns a map[string]any of an istio virtual service mirror route configuration using the last // set weight as values for the non-matching destinations and canary service for the matching destination. -func createMirrorRoute(virtualService v1alpha1.IstioVirtualService, httpRoutes []VirtualServiceHTTPRoute, mirrorRouting *v1alpha1.SetMirrorRoute, canarySvc string, subset string) (map[string]interface{}, error) { +func createMirrorRoute(virtualService v1alpha1.IstioVirtualService, httpRoutes []VirtualServiceHTTPRoute, mirrorRouting *v1alpha1.SetMirrorRoute, canarySvc string, subset string) (map[string]any, error) { var percent int32 if mirrorRouting.Percentage == nil { percent = 100 @@ -1289,12 +1289,12 @@ func createMirrorRoute(virtualService v1alpha1.IstioVirtualService, httpRoutes [ mirrorDestinations.Port = &Port{Number: route[0].Destination.Port.Number} } - mirrorRoute := map[string]interface{}{ + mirrorRoute := map[string]any{ "name": mirrorRouting.Name, "match": istioMatch, "route": route, "mirror": mirrorDestinations, - "mirrorPercentage": map[string]interface{}{"value": float64(percent)}, + "mirrorPercentage": map[string]any{"value": float64(percent)}, } mirrorRouteBytes, err := json.Marshal(mirrorRoute) @@ -1302,7 +1302,7 @@ func createMirrorRoute(virtualService v1alpha1.IstioVirtualService, httpRoutes [ return nil, fmt.Errorf("[createMirrorRoute] failed to marshal mirror route: %w", err) } - var mirrorRouteI map[string]interface{} + var mirrorRouteI map[string]any err = json.Unmarshal(mirrorRouteBytes, &mirrorRouteI) if err != nil { return nil, fmt.Errorf("[createMirrorRoute] failed to unmarshal mirror route: %w", err) @@ -1336,11 +1336,11 @@ func removeRoute(istioVirtualService *unstructured.Unstructured, routeName strin return fmt.Errorf(SpecHttpNotFound) } - var newVsRoutes []interface{} + var newVsRoutes []any for _, route := range vsRoutes { - routeMap, ok := route.(map[string]interface{}) + routeMap, ok := route.(map[string]any) if !ok { - return fmt.Errorf("Could not cast type to map[string]interface{} to find route name in Istio Virtual Service") + return fmt.Errorf("Could not cast type to map[string]any to find route name in Istio Virtual Service") } routeNameIstioSvc, ok := routeMap["name"].(string) if !ok { @@ -1392,8 +1392,8 @@ func (r *Reconciler) orderRoutes(istioVirtualService *unstructured.Unstructured) // splitManagedRoutesAndNonManagedRoutes This splits the routes from an istio virtual service into two slices // one slice contains all the routes that are also in the rollouts managedRoutes object and one that contains routes // that where only in the virtual service (aka routes that where manually added by user) -func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes, httpRouteI []interface{}) (httpRoutesWithinManagedRoutes []map[string]interface{}, httpRoutesNotWithinManagedRoutes []map[string]interface{}, err error) { - var httpRoutes []map[string]interface{} +func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes, httpRouteI []any) (httpRoutesWithinManagedRoutes []map[string]any, httpRoutesNotWithinManagedRoutes []map[string]any, err error) { + var httpRoutes []map[string]any jsonHttpRoutes, err := json.Marshal(httpRouteI) if err != nil { @@ -1424,11 +1424,11 @@ func splitManagedRoutesAndNonManagedRoutes(managedRoutes []v1alpha1.MangedRoutes return httpRoutesWithinManagedRoutes, httpRoutesNotWithinManagedRoutes, nil } -// getOrderedVirtualServiceRoutes This returns an []interface{} of istio virtual routes where the routes are ordered based +// getOrderedVirtualServiceRoutes This returns an []any of istio virtual routes where the routes are ordered based // on the rollouts managedRoutes field. We take the routes from the rollouts managedRoutes field order them and place them on top // of routes that are manually defined within the virtual service (aka. routes that users have defined manually) -func getOrderedVirtualServiceRoutes(httpRouteI []interface{}, managedRoutes []v1alpha1.MangedRoutes, httpRoutesWithinManagedRoutes []map[string]interface{}, httpRoutesNotWithinManagedRoutes []map[string]interface{}) ([]interface{}, error) { - var orderedManagedRoutes []map[string]interface{} +func getOrderedVirtualServiceRoutes(httpRouteI []any, managedRoutes []v1alpha1.MangedRoutes, httpRoutesWithinManagedRoutes []map[string]any, httpRoutesNotWithinManagedRoutes []map[string]any) ([]any, error) { + var orderedManagedRoutes []map[string]any for _, route := range managedRoutes { for _, managedRoute := range httpRoutesWithinManagedRoutes { if route.Name == managedRoute["name"] { @@ -1439,10 +1439,10 @@ func getOrderedVirtualServiceRoutes(httpRouteI []interface{}, managedRoutes []v1 orderedVirtualServiceHTTPRoutes := append(orderedManagedRoutes, httpRoutesNotWithinManagedRoutes...) - var orderedInterfaceVSVCHTTPRoutes []interface{} + var orderedInterfaceVSVCHTTPRoutes []any for _, routeMap := range orderedVirtualServiceHTTPRoutes { for _, route := range httpRouteI { - r := route.(map[string]interface{}) + r := route.(map[string]any) // Not checking the cast success here is ok because it covers the case when the route has no name name, rNameOK := r["name"].(string) @@ -1530,7 +1530,7 @@ func (r *Reconciler) RemoveManagedRoutes() error { if err != nil { return fmt.Errorf("[RemoveManagedRoutes] failed to marshal non-managed routes: %w", err) } - var nonManagedRoutesI []interface{} + var nonManagedRoutesI []any if err := json.Unmarshal(jsonNonManagedRoutes, &nonManagedRoutesI); err != nil { return fmt.Errorf("[RemoveManagedRoutes] failed to split managaed and non-managed routes: %w", err) } diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index ea6474ef5f..c18cdedae5 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -866,18 +866,18 @@ func TestHttpReconcileHeaderRouteWithExtra(t *testing.T) { assert.NoError(t, err) assert.True(t, found) - r0 := routes[0].(map[string]interface{}) - route, found := r0["route"].([]interface{}) + r0 := routes[0].(map[string]any) + route, found := r0["route"].([]any) assert.True(t, found) - port1 := route[0].(map[string]interface{})["destination"].(map[string]interface{})["port"].(map[string]interface{})["number"] + port1 := route[0].(map[string]any)["destination"].(map[string]any)["port"].(map[string]any)["number"] assert.True(t, port1 == int64(8443)) - r1 := routes[1].(map[string]interface{}) + r1 := routes[1].(map[string]any) _, found = r1["retries"] assert.True(t, found) - r2 := routes[2].(map[string]interface{}) + r2 := routes[2].(map[string]any) _, found = r2["retries"] assert.True(t, found) _, found = r2["corsPolicy"] @@ -891,14 +891,14 @@ func TestHttpReconcileHeaderRouteWithExtra(t *testing.T) { assert.NoError(t, err) assert.True(t, found) - r0 = routes[0].(map[string]interface{}) - route, found = r0["route"].([]interface{}) + r0 = routes[0].(map[string]any) + route, found = r0["route"].([]any) assert.True(t, found) - port1 = route[0].(map[string]interface{})["destination"].(map[string]interface{})["port"].(map[string]interface{})["number"] + port1 = route[0].(map[string]any)["destination"].(map[string]any)["port"].(map[string]any)["number"] assert.True(t, port1 == float64(8443)) - r2 = routes[1].(map[string]interface{}) + r2 = routes[1].(map[string]any) _, found = r2["retries"] assert.True(t, found) _, found = r2["corsPolicy"] @@ -1498,34 +1498,34 @@ func TestInvalidPatches(t *testing.T) { weight: 10, }} { - invalidHTTPRoute := make([]interface{}, 1) - invalidTlsRoute := make([]interface{}, 1) - invalidTcpRoute := make([]interface{}, 1) + invalidHTTPRoute := make([]any, 1) + invalidTlsRoute := make([]any, 1) + invalidTcpRoute := make([]any, 1) invalidHTTPRoute[0] = "not a map" err := patches.patchVirtualService(invalidHTTPRoute, invalidTlsRoute, invalidTcpRoute) assert.Error(t, err, invalidCasting, "http[]", "map[string]interface") } { - invalidHTTPRoute := []interface{}{ - map[string]interface{}{ + invalidHTTPRoute := []any{ + map[string]any{ "route": "not a []interface", }, } - invalidTlsRoute := make([]interface{}, 1) - invalidTcpRoute := make([]interface{}, 1) + invalidTlsRoute := make([]any, 1) + invalidTcpRoute := make([]any, 1) err := patches.patchVirtualService(invalidHTTPRoute, invalidTlsRoute, invalidTcpRoute) assert.Error(t, err, invalidCasting, "http[].route", "[]interface") } { - invalidHTTPRoute := []interface{}{ - map[string]interface{}{ - "route": []interface{}{ + invalidHTTPRoute := []any{ + map[string]any{ + "route": []any{ "destination", }, }, } - invalidTlsRoute := make([]interface{}, 1) - invalidTCPRoute := make([]interface{}, 1) + invalidTlsRoute := make([]any, 1) + invalidTCPRoute := make([]any, 1) err := patches.patchVirtualService(invalidHTTPRoute, invalidTlsRoute, invalidTCPRoute) assert.Error(t, err, invalidCasting, "http[].route[].destination", "map[string]interface") } @@ -2543,20 +2543,20 @@ func TestHttpReconcileMirrorRouteWithExtraFields(t *testing.T) { assert.NoError(t, err) assert.True(t, found) - r0 := routes[0].(map[string]interface{}) - mirrorRoute, found := r0["route"].([]interface{}) + r0 := routes[0].(map[string]any) + mirrorRoute, found := r0["route"].([]any) assert.True(t, found) - port1 := mirrorRoute[0].(map[string]interface{})["destination"].(map[string]interface{})["port"].(map[string]interface{})["number"] - port2 := mirrorRoute[1].(map[string]interface{})["destination"].(map[string]interface{})["port"].(map[string]interface{})["number"] + port1 := mirrorRoute[0].(map[string]any)["destination"].(map[string]any)["port"].(map[string]any)["number"] + port2 := mirrorRoute[1].(map[string]any)["destination"].(map[string]any)["port"].(map[string]any)["number"] assert.True(t, port1 == float64(8443)) assert.True(t, port2 == float64(8443)) - r1 := routes[1].(map[string]interface{}) + r1 := routes[1].(map[string]any) _, found = r1["retries"] assert.True(t, found) - r2 := routes[2].(map[string]interface{}) + r2 := routes[2].(map[string]any) _, found = r2["retries"] assert.True(t, found) _, found = r2["corsPolicy"] diff --git a/rollout/trafficrouting/istio/istio_types.go b/rollout/trafficrouting/istio/istio_types.go index 9d8f37d3f3..9544efc49e 100644 --- a/rollout/trafficrouting/istio/istio_types.go +++ b/rollout/trafficrouting/istio/istio_types.go @@ -108,5 +108,5 @@ type Subset struct { Name string `json:"name,omitempty"` Labels map[string]string `json:"labels,omitempty"` // TrafficPolicy *json.RawMessage `json:"trafficPolicy,omitempty"` - Extra map[string]interface{} `json:",omitempty"` + Extra map[string]any `json:",omitempty"` } diff --git a/rollout/trafficrouting/plugin/rpc/rpc.go b/rollout/trafficrouting/plugin/rpc/rpc.go index 78cb4103d9..297ff9d21b 100644 --- a/rollout/trafficrouting/plugin/rpc/rpc.go +++ b/rollout/trafficrouting/plugin/rpc/rpc.go @@ -65,7 +65,7 @@ type TrafficRouterPluginRPC struct{ client *rpc.Client } // this gets called once during startup of the plugin and can be used to set up informers or k8s clients etc. func (g *TrafficRouterPluginRPC) InitPlugin() types.RpcError { var resp types.RpcError - err := g.client.Call("Plugin.InitPlugin", new(interface{}), &resp) + err := g.client.Call("Plugin.InitPlugin", new(any), &resp) if err != nil { return types.RpcError{ErrorString: fmt.Sprintf("InitPlugin rpc call error: %s", err)} } @@ -75,7 +75,7 @@ func (g *TrafficRouterPluginRPC) InitPlugin() types.RpcError { // UpdateHash informs a traffic routing reconciler about new canary, stable, and additionalDestination(s) pod hashes func (g *TrafficRouterPluginRPC) UpdateHash(rollout *v1alpha1.Rollout, canaryHash string, stableHash string, additionalDestinations []v1alpha1.WeightDestination) types.RpcError { var resp types.RpcError - var args interface{} = UpdateHashArgs{ + var args any = UpdateHashArgs{ Rollout: *rollout, CanaryHash: canaryHash, StableHash: stableHash, @@ -91,7 +91,7 @@ func (g *TrafficRouterPluginRPC) UpdateHash(rollout *v1alpha1.Rollout, canaryHas // SetWeight sets the canary weight to the desired weight func (g *TrafficRouterPluginRPC) SetWeight(rollout *v1alpha1.Rollout, desiredWeight int32, additionalDestinations []v1alpha1.WeightDestination) types.RpcError { var resp types.RpcError - var args interface{} = SetWeightAndVerifyWeightArgs{ + var args any = SetWeightAndVerifyWeightArgs{ Rollout: *rollout, DesiredWeight: desiredWeight, AdditionalDestinations: additionalDestinations, @@ -106,7 +106,7 @@ func (g *TrafficRouterPluginRPC) SetWeight(rollout *v1alpha1.Rollout, desiredWei // SetHeaderRoute sets the header routing step func (g *TrafficRouterPluginRPC) SetHeaderRoute(rollout *v1alpha1.Rollout, setHeaderRoute *v1alpha1.SetHeaderRoute) types.RpcError { var resp types.RpcError - var args interface{} = SetHeaderArgs{ + var args any = SetHeaderArgs{ Rollout: *rollout, SetHeaderRoute: *setHeaderRoute, } @@ -120,7 +120,7 @@ func (g *TrafficRouterPluginRPC) SetHeaderRoute(rollout *v1alpha1.Rollout, setHe // SetMirrorRoute sets up the traffic router to mirror traffic to a service func (g *TrafficRouterPluginRPC) SetMirrorRoute(rollout *v1alpha1.Rollout, setMirrorRoute *v1alpha1.SetMirrorRoute) types.RpcError { var resp types.RpcError - var args interface{} = SetMirrorArgs{ + var args any = SetMirrorArgs{ Rollout: *rollout, SetMirrorRoute: *setMirrorRoute, } @@ -134,7 +134,7 @@ func (g *TrafficRouterPluginRPC) SetMirrorRoute(rollout *v1alpha1.Rollout, setMi // Type returns the type of the traffic routing reconciler func (g *TrafficRouterPluginRPC) Type() string { var resp string - err := g.client.Call("Plugin.Type", new(interface{}), &resp) + err := g.client.Call("Plugin.Type", new(any), &resp) if err != nil { return fmt.Sprintf("Type rpc call error: %s", err) } @@ -146,7 +146,7 @@ func (g *TrafficRouterPluginRPC) Type() string { // Returns nil if weight verification is not supported or not applicable func (g *TrafficRouterPluginRPC) VerifyWeight(rollout *v1alpha1.Rollout, desiredWeight int32, additionalDestinations []v1alpha1.WeightDestination) (types.RpcVerified, types.RpcError) { var resp VerifyWeightResponse - var args interface{} = SetWeightAndVerifyWeightArgs{ + var args any = SetWeightAndVerifyWeightArgs{ Rollout: *rollout, DesiredWeight: desiredWeight, AdditionalDestinations: additionalDestinations, @@ -161,7 +161,7 @@ func (g *TrafficRouterPluginRPC) VerifyWeight(rollout *v1alpha1.Rollout, desired // RemoveAllRoutes Removes all routes that are managed by rollouts by looking at spec.strategy.canary.trafficRouting.managedRoutes func (g *TrafficRouterPluginRPC) RemoveManagedRoutes(rollout *v1alpha1.Rollout) types.RpcError { var resp types.RpcError - var args interface{} = RemoveManagedRoutesArgs{ + var args any = RemoveManagedRoutesArgs{ Rollout: *rollout, } err := g.client.Call("Plugin.RemoveManagedRoutes", &args, &resp) @@ -180,13 +180,13 @@ type TrafficRouterRPCServer struct { // InitPlugin this is the server aka the controller side function that receives calls from the client side rpc (controller) // this gets called once during startup of the plugin and can be used to set up informers or k8s clients etc. -func (s *TrafficRouterRPCServer) InitPlugin(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) InitPlugin(args any, resp *types.RpcError) error { *resp = s.Impl.InitPlugin() return nil } // UpdateHash informs a traffic routing reconciler about new canary, stable, and additionalDestination(s) pod hashes -func (s *TrafficRouterRPCServer) UpdateHash(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) UpdateHash(args any, resp *types.RpcError) error { runArgs, ok := args.(*UpdateHashArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -196,7 +196,7 @@ func (s *TrafficRouterRPCServer) UpdateHash(args interface{}, resp *types.RpcErr } // SetWeight sets the canary weight to the desired weight -func (s *TrafficRouterRPCServer) SetWeight(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) SetWeight(args any, resp *types.RpcError) error { setWeigthArgs, ok := args.(*SetWeightAndVerifyWeightArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -206,7 +206,7 @@ func (s *TrafficRouterRPCServer) SetWeight(args interface{}, resp *types.RpcErro } // SetHeaderRoute sets the header routing step -func (s *TrafficRouterRPCServer) SetHeaderRoute(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) SetHeaderRoute(args any, resp *types.RpcError) error { setHeaderArgs, ok := args.(*SetHeaderArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -216,7 +216,7 @@ func (s *TrafficRouterRPCServer) SetHeaderRoute(args interface{}, resp *types.Rp } // SetMirrorRoute sets up the traffic router to mirror traffic to a service -func (s *TrafficRouterRPCServer) SetMirrorRoute(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) SetMirrorRoute(args any, resp *types.RpcError) error { setMirrorArgs, ok := args.(*SetMirrorArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -226,14 +226,14 @@ func (s *TrafficRouterRPCServer) SetMirrorRoute(args interface{}, resp *types.Rp } // Type returns the type of the traffic routing reconciler -func (s *TrafficRouterRPCServer) Type(args interface{}, resp *string) error { +func (s *TrafficRouterRPCServer) Type(args any, resp *string) error { *resp = s.Impl.Type() return nil } // VerifyWeight returns true if the canary is at the desired weight and additionalDestinations are at the weights specified // Returns nil if weight verification is not supported or not applicable -func (s *TrafficRouterRPCServer) VerifyWeight(args interface{}, resp *VerifyWeightResponse) error { +func (s *TrafficRouterRPCServer) VerifyWeight(args any, resp *VerifyWeightResponse) error { verifyWeightArgs, ok := args.(*SetWeightAndVerifyWeightArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -247,7 +247,7 @@ func (s *TrafficRouterRPCServer) VerifyWeight(args interface{}, resp *VerifyWeig } // RemoveAllRoutes Removes all routes that are managed by rollouts by looking at spec.strategy.canary.trafficRouting.managedRoutes -func (s *TrafficRouterRPCServer) RemoveManagedRoutes(args interface{}, resp *types.RpcError) error { +func (s *TrafficRouterRPCServer) RemoveManagedRoutes(args any, resp *types.RpcError) error { removeManagedRoutesArgs, ok := args.(*RemoveManagedRoutesArgs) if !ok { return fmt.Errorf("invalid args %s", args) @@ -271,10 +271,10 @@ type RpcTrafficRouterPlugin struct { Impl TrafficRouterPlugin } -func (p *RpcTrafficRouterPlugin) Server(*plugin.MuxBroker) (interface{}, error) { +func (p *RpcTrafficRouterPlugin) Server(*plugin.MuxBroker) (any, error) { return &TrafficRouterRPCServer{Impl: p.Impl}, nil } -func (RpcTrafficRouterPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) { +func (RpcTrafficRouterPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (any, error) { return &TrafficRouterPluginRPC{client: c}, nil } diff --git a/rollout/trafficrouting/traefik/mocks/traefik.go b/rollout/trafficrouting/traefik/mocks/traefik.go index aedfd659cd..b0cd361809 100644 --- a/rollout/trafficrouting/traefik/mocks/traefik.go +++ b/rollout/trafficrouting/traefik/mocks/traefik.go @@ -35,10 +35,10 @@ var ( ErrorTraefikServiceObj *unstructured.Unstructured ) -func (f *FakeRecorder) Eventf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...interface{}) { +func (f *FakeRecorder) Eventf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...any) { } -func (f *FakeRecorder) Warnf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...interface{}) { +func (f *FakeRecorder) Warnf(object runtime.Object, opts argoRecord.EventOptions, messageFmt string, args ...any) { } func (f *FakeRecorder) K8sRecorder() record.EventRecorder { diff --git a/rollout/trafficrouting/traefik/traefik.go b/rollout/trafficrouting/traefik/traefik.go index f5b507207f..5840bf4a42 100644 --- a/rollout/trafficrouting/traefik/traefik.go +++ b/rollout/trafficrouting/traefik/traefik.go @@ -134,10 +134,10 @@ func (r *Reconciler) SetWeight(desiredWeight int32, additionalDestinations ...v1 return err } -func getService(serviceName string, services []interface{}) (map[string]interface{}, error) { - var selectedService map[string]interface{} +func getService(serviceName string, services []any) (map[string]any, error) { + var selectedService map[string]any for _, service := range services { - typedService, ok := service.(map[string]interface{}) + typedService, ok := service.(map[string]any) if !ok { return nil, errors.New("Failed type assertion setting weight for traefik service") } diff --git a/rollout/trafficrouting/traefik/traefik_test.go b/rollout/trafficrouting/traefik/traefik_test.go index d7dbbbd297..892468df0a 100644 --- a/rollout/trafficrouting/traefik/traefik_test.go +++ b/rollout/trafficrouting/traefik/traefik_test.go @@ -305,7 +305,7 @@ func TestGetService(t *testing.T) { t.Run("ErrorGetServiceFromStruct ", func(t *testing.T) { // Given t.Parallel() - services := []interface{}{ + services := []any{ mocks.FakeService{Weight: 12}, } @@ -319,12 +319,12 @@ func TestGetService(t *testing.T) { t.Run("ErrorGetServiceFromMap", func(t *testing.T) { // Given t.Parallel() - services := map[string]interface{}{ + services := map[string]any{ "weight": 100, } // When - selectedServices, err := getService("default", []interface{}{services}) + selectedServices, err := getService("default", []any{services}) // Then assert.Nil(t, selectedServices) @@ -334,12 +334,12 @@ func TestGetService(t *testing.T) { // Given t.Parallel() const serviceName string = "default" - services := map[string]interface{}{ + services := map[string]any{ "name": serviceName, } // When - selectedServices, err := getService(serviceName, []interface{}{services}) + selectedServices, err := getService(serviceName, []any{services}) // Then assert.NotNil(t, selectedServices) @@ -348,12 +348,12 @@ func TestGetService(t *testing.T) { t.Run("ErrorGetServiceFromNil", func(t *testing.T) { // Given t.Parallel() - services := map[string]interface{}{ + services := map[string]any{ "name": nil, } // When - selectedServices, err := getService("default", []interface{}{services}) + selectedServices, err := getService("default", []any{services}) // Then assert.Nil(t, selectedServices) diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index 21aea362ae..78817492f6 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -121,7 +121,7 @@ func TestReconcileTrafficRoutingVerifyWeightFalse(t *testing.T) { f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(pointer.BoolPtr(false), nil) c, i, k8sI := f.newController(noResyncPeriodFunc) enqueued := false - c.enqueueRolloutAfter = func(obj interface{}, duration time.Duration) { + c.enqueueRolloutAfter = func(obj any, duration time.Duration) { enqueued = true } f.expectPatchRolloutAction(ro) diff --git a/server/server.go b/server/server.go index cbb742333d..3482634491 100644 --- a/server/server.go +++ b/server/server.go @@ -290,15 +290,15 @@ func (s *ArgoRolloutsServer) WatchRolloutInfos(q *rollout.RolloutInfoListQuery, rolloutUpdateChan := make(chan *v1alpha1.Rollout) rolloutInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { rolloutUpdateChan <- obj.(*v1alpha1.Rollout) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { rolloutUpdateChan <- newObj.(*v1alpha1.Rollout) }, }) podsInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { podUpdated(obj.(*corev1.Pod), rsLister, rolloutsLister, rolloutUpdateChan) }, }) diff --git a/service/service.go b/service/service.go index f81c82c771..be143de83d 100644 --- a/service/service.go +++ b/service/service.go @@ -82,7 +82,7 @@ type Controller struct { resyncPeriod time.Duration metricServer *metrics.MetricsServer - enqueueRollout func(obj interface{}) + enqueueRollout func(obj any) } // NewController returns a new service controller @@ -103,7 +103,7 @@ func NewController(cfg ControllerConfig) *Controller { } util.CheckErr(cfg.RolloutsInformer.Informer().AddIndexers(cache.Indexers{ - serviceIndexName: func(obj interface{}) (strings []string, e error) { + serviceIndexName: func(obj any) (strings []string, e error) { if ro := unstructuredutil.ObjectToRollout(obj); ro != nil { return serviceutil.GetRolloutServiceKeys(ro), nil } @@ -112,17 +112,17 @@ func NewController(cfg ControllerConfig) *Controller { })) cfg.ServicesInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { + AddFunc: func(obj any) { controllerutil.Enqueue(obj, cfg.ServiceWorkqueue) }, - UpdateFunc: func(oldObj, newObj interface{}) { + UpdateFunc: func(oldObj, newObj any) { controllerutil.Enqueue(newObj, cfg.ServiceWorkqueue) }, - DeleteFunc: func(obj interface{}) { + DeleteFunc: func(obj any) { controllerutil.Enqueue(obj, cfg.ServiceWorkqueue) }, }) - controller.enqueueRollout = func(obj interface{}) { + controller.enqueueRollout = func(obj any) { controllerutil.EnqueueRateLimited(obj, cfg.RolloutWorkqueue) } diff --git a/service/service_test.go b/service/service_test.go index 69dea462da..35722443ac 100644 --- a/service/service_test.go +++ b/service/service_test.go @@ -86,7 +86,7 @@ func newFakeServiceController(svc *corev1.Service, rollout *v1alpha1.Rollout) (* MetricsServer: metricsServer, }) enqueuedObjects := map[string]int{} - c.enqueueRollout = func(obj interface{}) { + c.enqueueRollout = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { diff --git a/test/e2e/apisix_test.go b/test/e2e/apisix_test.go index 1c8d2de3a3..dfdea9ce60 100644 --- a/test/e2e/apisix_test.go +++ b/test/e2e/apisix_test.go @@ -4,13 +4,14 @@ package e2e import ( + "testing" + "time" + a6 "github.com/argoproj/argo-rollouts/rollout/trafficrouting/apisix" "github.com/argoproj/argo-rollouts/test/fixtures" "github.com/stretchr/testify/suite" "github.com/tj/assert" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "testing" - "time" ) const ( @@ -132,7 +133,7 @@ func (s *APISIXSuite) check(t *fixtures.Then, stableWeight int64, canaryWeight i assert.NoError(s.T(), err) for _, backend := range backends { - typedBackend, ok := backend.(map[string]interface{}) + typedBackend, ok := backend.(map[string]any) assert.Equal(s.T(), ok, true) nameOfCurrentBackend, isFound, err := unstructured.NestedString(typedBackend, "serviceName") assert.NoError(s.T(), err) @@ -165,14 +166,14 @@ func (s *APISIXSuite) checkSetHeader(t *fixtures.Then, stableWeight int64, canar apisixHttpRouteObj, err := a6.GetHttpRoute(apisixHttpRoutesObj, apisixRouteName) assert.NoError(s.T(), err) - exprs, isFound, err := unstructured.NestedSlice(apisixHttpRouteObj.(map[string]interface{}), "match", "exprs") + exprs, isFound, err := unstructured.NestedSlice(apisixHttpRouteObj.(map[string]any), "match", "exprs") assert.NoError(s.T(), err) assert.Equal(s.T(), isFound, true) assert.Equal(s.T(), 1, len(exprs)) expr := exprs[0] - exprObj, ok := expr.(map[string]interface{}) + exprObj, ok := expr.(map[string]any) assert.Equal(s.T(), ok, true) op, isFound, err := unstructured.NestedString(exprObj, "op") diff --git a/test/e2e/appmesh_test.go b/test/e2e/appmesh_test.go index f7936d24d1..4d173e8c56 100644 --- a/test/e2e/appmesh_test.go +++ b/test/e2e/appmesh_test.go @@ -72,12 +72,12 @@ func (s *AppMeshSuite) getWeightedTargets(uVr *unstructured.Unstructured) map[st result := make(map[string]weightedTargets) routesI, _, _ := unstructured.NestedSlice(uVr.Object, "spec", "routes") for _, rI := range routesI { - route, _ := rI.(map[string]interface{}) + route, _ := rI.(map[string]any) routeName, _ := route["name"].(string) wtsI, _, _ := unstructured.NestedSlice(route, "httpRoute", "action", "weightedTargets") wtStruct := weightedTargets{} for _, wtI := range wtsI { - wt, _ := wtI.(map[string]interface{}) + wt, _ := wtI.(map[string]any) vnodeName, _, _ := unstructured.NestedString(wt, "virtualNodeRef", "name") weight, _, _ := unstructured.NestedInt64(wt, "weight") fmt.Printf("Found wt %+v with vnodeName (%s), weight (%d)", wt, vnodeName, weight) diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index d4b27d3e3f..e6aff1477f 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -1313,7 +1313,7 @@ spec: if err != nil { return err } - containers[0] = map[string]interface{}{ + containers[0] = map[string]any{ "name": "rollouts-demo", "image": "argoproj/rollouts-demo:error", } @@ -1333,7 +1333,7 @@ spec: if err != nil { return err } - containers[0] = map[string]interface{}{ + containers[0] = map[string]any{ "name": "rollouts-demo", "image": "argoproj/rollouts-demo:blue", } diff --git a/test/fixtures/given.go b/test/fixtures/given.go index 19e7552f60..57e17251c6 100644 --- a/test/fixtures/given.go +++ b/test/fixtures/given.go @@ -44,7 +44,7 @@ func (g *Given) SetSteps(text string) *Given { steps := make([]rov1.CanaryStep, 0) err := yaml.Unmarshal([]byte(text), &steps) g.CheckError(err) - var stepsUn []interface{} + var stepsUn []any for _, step := range steps { stepUn, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&step) g.CheckError(err) diff --git a/test/fixtures/then.go b/test/fixtures/then.go index eac4c9419b..c41c14d92a 100644 --- a/test/fixtures/then.go +++ b/test/fixtures/then.go @@ -54,7 +54,7 @@ func (t *Then) ExpectRolloutStatus(expectedStatus string) *Then { return t } -func (t *Then) ExpectReplicaCounts(desired, current, updated, ready, available interface{}) *Then { +func (t *Then) ExpectReplicaCounts(desired, current, updated, ready, available any) *Then { ro, err := t.rolloutClient.ArgoprojV1alpha1().Rollouts(t.namespace).Get(t.Context, t.rollout.GetName(), metav1.GetOptions{}) t.CheckError(err) if desired != nil && desired.(int) != int(defaults.GetReplicasOrDefault(ro.Spec.Replicas)) { diff --git a/test/fixtures/when.go b/test/fixtures/when.go index 82e84d3a42..395e614bcf 100644 --- a/test/fixtures/when.go +++ b/test/fixtures/when.go @@ -88,7 +88,7 @@ func (w *When) injectDelays(un *unstructured.Unstructured) { w.CheckError(err) containersIf, _, err := unstructured.NestedSlice(un.Object, "spec", "template", "spec", "containers") w.CheckError(err) - container := containersIf[0].(map[string]interface{}) + container := containersIf[0].(map[string]any) container["lifecycle"] = lifecycleObj containersIf[0] = container err = unstructured.SetNestedSlice(un.Object, containersIf, "spec", "template", "spec", "containers") @@ -103,7 +103,7 @@ func (w *When) injectImagePrefix(un *unstructured.Unstructured) { } containersIf, _, err := unstructured.NestedSlice(un.Object, "spec", "template", "spec", "containers") w.CheckError(err) - container := containersIf[0].(map[string]interface{}) + container := containersIf[0].(map[string]any) container["image"] = imagePrefix + container["image"].(string) containersIf[0] = container err = unstructured.SetNestedSlice(un.Object, containersIf, "spec", "template", "spec", "containers") @@ -233,7 +233,7 @@ func (w *When) PatchSpec(patch string) *When { w.t.Fatal("Rollout not set") } // convert YAML patch to JSON patch - var patchObj map[string]interface{} + var patchObj map[string]any err := yaml.Unmarshal([]byte(patch), &patchObj) w.CheckError(err) jsonPatch, err := json.Marshal(patchObj) diff --git a/test/util/util.go b/test/util/util.go index 071aca3f7b..5f5c20d5c7 100644 --- a/test/util/util.go +++ b/test/util/util.go @@ -16,7 +16,7 @@ import ( // ObjectFromYAML returns a runtime.Object from a yaml string func ObjectFromYAML(yamlStr string) *unstructured.Unstructured { - obj := make(map[string]interface{}) + obj := make(map[string]any) err := yaml.Unmarshal([]byte(yamlStr), &obj) if err != nil { panic(err) diff --git a/utils/analysis/factory.go b/utils/analysis/factory.go index 278f24a19a..0e17e587a7 100644 --- a/utils/analysis/factory.go +++ b/utils/analysis/factory.go @@ -243,7 +243,7 @@ func ValidateMetric(metric v1alpha1.Metric) error { func extractValueFromRollout(r *v1alpha1.Rollout, path string) (string, error) { j, _ := json.Marshal(r) - m := interface{}(nil) + m := any(nil) json.Unmarshal(j, &m) sections := regexp.MustCompile("[\\.\\[\\]]+").Split(path, -1) for _, section := range sections { @@ -251,7 +251,7 @@ func extractValueFromRollout(r *v1alpha1.Rollout, path string) (string, error) { continue // if path ends with a separator char, Split returns an empty last section } - if asArray, ok := m.([]interface{}); ok { + if asArray, ok := m.([]any); ok { if i, err := strconv.Atoi(section); err != nil { return "", fmt.Errorf("invalid index '%s'", section) } else if i >= len(asArray) { @@ -259,7 +259,7 @@ func extractValueFromRollout(r *v1alpha1.Rollout, path string) (string, error) { } else { m = asArray[i] } - } else if asMap, ok := m.(map[string]interface{}); ok { + } else if asMap, ok := m.(map[string]any); ok { m = asMap[section] } else { return "", fmt.Errorf("invalid path %s in rollout", path) @@ -271,8 +271,8 @@ func extractValueFromRollout(r *v1alpha1.Rollout, path string) (string, error) { } var isArray, isMap bool - _, isArray = m.([]interface{}) - _, isMap = m.(map[string]interface{}) + _, isArray = m.([]any) + _, isMap = m.(map[string]any) if isArray || isMap { return "", fmt.Errorf("path %s in rollout must terminate in a primitive value", path) } diff --git a/utils/analysis/helpers.go b/utils/analysis/helpers.go index caedeb472c..6e95bd47fa 100644 --- a/utils/analysis/helpers.go +++ b/utils/analysis/helpers.go @@ -541,9 +541,9 @@ func NewAnalysisRunFromUnstructured(obj *unstructured.Unstructured, templateArgs } // Set args - newArgVals := []interface{}{} + newArgVals := []any{} for i := 0; i < len(newArgs); i++ { - var newArgInterface map[string]interface{} + var newArgInterface map[string]any newArgBytes, err := json.Marshal(newArgs[i]) if err != nil { return nil, err diff --git a/utils/analysis/helpers_test.go b/utils/analysis/helpers_test.go index 3fbefadce4..207f5fa023 100644 --- a/utils/analysis/helpers_test.go +++ b/utils/analysis/helpers_test.go @@ -822,7 +822,7 @@ func TestNewAnalysisRunFromUnstructured(t *testing.T) { assert.Equal(t, len(args), len(arArgs)) for i, arg := range arArgs { - argnv := arg.(map[string]interface{}) + argnv := arg.(map[string]any) assert.Equal(t, *args[i].Value, argnv["value"]) } } diff --git a/utils/aws/aws.go b/utils/aws/aws.go index b8884a0589..42b4907836 100644 --- a/utils/aws/aws.go +++ b/utils/aws/aws.go @@ -300,7 +300,7 @@ func GetTargetGroupBindingsByService(ctx context.Context, dynamicClient dynamic. return tgbs, nil } -func toTargetGroupBinding(obj map[string]interface{}) (*TargetGroupBinding, error) { +func toTargetGroupBinding(obj map[string]any) (*TargetGroupBinding, error) { data, err := json.Marshal(obj) if err != nil { return nil, err @@ -368,7 +368,7 @@ func VerifyTargetGroupBinding(ctx context.Context, logCtx *log.Entry, awsClnt Cl logCtx.Warn("Unable to match TargetGroupBinding spec.serviceRef.port to Service spec.ports") return nil, nil } - logCtx = logCtx.WithFields(map[string]interface{}{ + logCtx = logCtx.WithFields(map[string]any{ "service": svc.Name, "targetgroupbinding": tgb.Name, "tg": tgb.Spec.TargetGroupARN, diff --git a/utils/controller/controller.go b/utils/controller/controller.go index 63aa6f11cd..36ebfa9088 100644 --- a/utils/controller/controller.go +++ b/utils/controller/controller.go @@ -115,7 +115,7 @@ func processNextWorkItem(ctx context.Context, workqueue workqueue.RateLimitingIn } // We wrap this block in a func so we can defer c.workqueue.Done. - err := func(obj interface{}) error { + err := func(obj any) error { // We call Done here so the workqueue knows we have finished // processing this item. We also must remember to call Forget if we // do not want this work item being re-queued. For example, we do @@ -179,14 +179,14 @@ func processNextWorkItem(ctx context.Context, workqueue workqueue.RateLimitingIn } // metaNamespaceKeyFunc is a wrapper around cache.MetaNamespaceKeyFunc but also accepts strings -func metaNamespaceKeyFunc(obj interface{}) (string, error) { +func metaNamespaceKeyFunc(obj any) (string, error) { if objStr, ok := obj.(string); ok { obj = cache.ExplicitKey(objStr) } return cache.MetaNamespaceKeyFunc(obj) } -func Enqueue(obj interface{}, q workqueue.RateLimitingInterface) { +func Enqueue(obj any, q workqueue.RateLimitingInterface) { var key string var err error if key, err = metaNamespaceKeyFunc(obj); err != nil { @@ -196,7 +196,7 @@ func Enqueue(obj interface{}, q workqueue.RateLimitingInterface) { q.Add(key) } -func EnqueueAfter(obj interface{}, duration time.Duration, q workqueue.RateLimitingInterface) { +func EnqueueAfter(obj any, duration time.Duration, q workqueue.RateLimitingInterface) { var key string var err error if key, err = metaNamespaceKeyFunc(obj); err != nil { @@ -206,7 +206,7 @@ func EnqueueAfter(obj interface{}, duration time.Duration, q workqueue.RateLimit q.AddAfter(key, duration) } -func EnqueueRateLimited(obj interface{}, q workqueue.RateLimitingInterface) { +func EnqueueRateLimited(obj any, q workqueue.RateLimitingInterface) { var key string var err error if key, err = metaNamespaceKeyFunc(obj); err != nil { @@ -222,7 +222,7 @@ func EnqueueRateLimited(obj interface{}, q workqueue.RateLimitingInterface) { // It then enqueues that ownerType resource to be processed. If the object does not // have an appropriate OwnerReference, it will simply be skipped. // This function assumes parent object is in the same namespace as the child -func EnqueueParentObject(obj interface{}, ownerType string, enqueue func(obj interface{})) { +func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any)) { var object metav1.Object var ok bool if object, ok = obj.(metav1.Object); !ok { diff --git a/utils/controller/controller_test.go b/utils/controller/controller_test.go index 9fa54b5517..3761d05ba5 100644 --- a/utils/controller/controller_test.go +++ b/utils/controller/controller_test.go @@ -169,7 +169,7 @@ func TestEnqueueParentObjectInvalidObject(t *testing.T) { errorMessages = append(errorMessages, err) }) invalidObject := "invalid-object" - enqueueFunc := func(obj interface{}) {} + enqueueFunc := func(obj any) {} EnqueueParentObject(invalidObject, register.RolloutKind, enqueueFunc) assert.Len(t, errorMessages, 1) assert.Error(t, errorMessages[0], "error decoding object, invalid type") @@ -182,7 +182,7 @@ func TestEnqueueParentObjectInvalidTombstoneObject(t *testing.T) { }) invalidObject := cache.DeletedFinalStateUnknown{} - enqueueFunc := func(obj interface{}) {} + enqueueFunc := func(obj any) {} EnqueueParentObject(invalidObject, register.RolloutKind, enqueueFunc) assert.Len(t, errorMessages, 1) assert.Equal(t, "error decoding object tombstone, invalid type", errorMessages[0]) @@ -199,8 +199,8 @@ func TestEnqueueParentObjectNoOwner(t *testing.T) { Namespace: "default", }, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } EnqueueParentObject(rs, register.RolloutKind, enqueueFunc) @@ -228,8 +228,8 @@ func TestEnqueueParentObjectDifferentOwnerKind(t *testing.T) { OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(experiment, experimentKind)}, }, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } EnqueueParentObject(rs, register.RolloutKind, enqueueFunc) @@ -257,8 +257,8 @@ func TestEnqueueParentObjectOtherOwnerTypes(t *testing.T) { OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(deployment, deploymentKind)}, }, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } EnqueueParentObject(rs, "Deployment", enqueueFunc) @@ -286,8 +286,8 @@ func TestEnqueueParentObjectEnqueueExperiment(t *testing.T) { OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(experiment, experimentKind)}, }, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } client := fake.NewSimpleClientset(experiment) @@ -319,8 +319,8 @@ func TestEnqueueParentObjectEnqueueRollout(t *testing.T) { OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(rollout, rolloutKind)}, }, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } client := fake.NewSimpleClientset(rollout) @@ -356,8 +356,8 @@ func TestEnqueueParentObjectRecoverTombstoneObject(t *testing.T) { Obj: rs, } - enqueuedObjs := make([]interface{}, 0) - enqueueFunc := func(obj interface{}) { + enqueuedObjs := make([]any, 0) + enqueueFunc := func(obj any) { enqueuedObjs = append(enqueuedObjs, obj) } client := fake.NewSimpleClientset(experiment) @@ -388,10 +388,10 @@ func TestInstanceIDRequirement(t *testing.T) { } func newObj(name, kind, apiVersion string) *unstructured.Unstructured { - obj := make(map[string]interface{}) + obj := make(map[string]any) obj["apiVersion"] = apiVersion obj["kind"] = kind - obj["metadata"] = map[string]interface{}{ + obj["metadata"] = map[string]any{ "name": name, "namespace": metav1.NamespaceDefault, } @@ -437,7 +437,7 @@ func TestProcessNextWatchObj(t *testing.T) { dInformer := dynamicinformers.NewDynamicSharedInformerFactory(client, func() time.Duration { return 0 }()) indexer := dInformer.ForResource(gvk).Informer().GetIndexer() indexer.AddIndexers(cache.Indexers{ - "testIndexer": func(obj interface{}) (strings []string, e error) { + "testIndexer": func(obj any) (strings []string, e error) { return []string{"default/foo"}, nil }, }) diff --git a/utils/diff/diff.go b/utils/diff/diff.go index 458afe4654..12ac705070 100644 --- a/utils/diff/diff.go +++ b/utils/diff/diff.go @@ -7,7 +7,7 @@ import ( ) // CreateTwoWayMergePatch is a helper to construct a two-way merge patch from objects (instead of bytes) -func CreateTwoWayMergePatch(orig, new, dataStruct interface{}) ([]byte, bool, error) { +func CreateTwoWayMergePatch(orig, new, dataStruct any) ([]byte, bool, error) { origBytes, err := json.Marshal(orig) if err != nil { return nil, false, err diff --git a/utils/evaluate/evaluate.go b/utils/evaluate/evaluate.go index b725d99c0f..a2c9a607cd 100644 --- a/utils/evaluate/evaluate.go +++ b/utils/evaluate/evaluate.go @@ -14,7 +14,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) -func EvaluateResult(result interface{}, metric v1alpha1.Metric, logCtx logrus.Entry) (v1alpha1.AnalysisPhase, error) { +func EvaluateResult(result any, metric v1alpha1.Metric, logCtx logrus.Entry) (v1alpha1.AnalysisPhase, error) { successCondition := false failCondition := false var err error @@ -57,10 +57,10 @@ func EvaluateResult(result interface{}, metric v1alpha1.Metric, logCtx logrus.En } // EvalCondition evaluates the condition with the resultValue as an input -func EvalCondition(resultValue interface{}, condition string) (bool, error) { +func EvalCondition(resultValue any, condition string) (bool, error) { var err error - env := map[string]interface{}{ + env := map[string]any{ "result": valueFromPointer(resultValue), "asInt": asInt, "asFloat": asFloat, @@ -99,7 +99,7 @@ func isInf(f float64) bool { return math.IsInf(f, 0) } -func asInt(in interface{}) int64 { +func asInt(in any) int64 { switch i := in.(type) { case float64: return int64(i) @@ -135,7 +135,7 @@ func asInt(in interface{}) int64 { panic(fmt.Sprintf("asInt() not supported on %v %v", reflect.TypeOf(in), in)) } -func asFloat(in interface{}) float64 { +func asFloat(in any) float64 { switch i := in.(type) { case float64: return i @@ -188,8 +188,8 @@ func Equal(a, b []string) bool { return true } -func defaultFunc(resultValue interface{}) func(interface{}, interface{}) interface{} { - return func(_ interface{}, defaultValue interface{}) interface{} { +func defaultFunc(resultValue any) func(any, any) any { + return func(_ any, defaultValue any) any { if isNil(resultValue) { return defaultValue } @@ -197,14 +197,14 @@ func defaultFunc(resultValue interface{}) func(interface{}, interface{}) interfa } } -func isNilFunc(resultValue interface{}) func(interface{}) bool { - return func(_ interface{}) bool { +func isNilFunc(resultValue any) func(any) bool { + return func(_ any) bool { return isNil(resultValue) } } // isNil is courtesy of: https://gist.github.com/mangatmodi/06946f937cbff24788fa1d9f94b6b138 -func isNil(in interface{}) (out bool) { +func isNil(in any) (out bool) { if in == nil { out = true return @@ -220,7 +220,7 @@ func isNil(in interface{}) (out bool) { // valueFromPointer allows pointers to be passed in from the provider, but then extracts the value from // the pointer if the pointer is not nil, else returns nil -func valueFromPointer(in interface{}) (out interface{}) { +func valueFromPointer(in any) (out any) { if isNil(in) { return } diff --git a/utils/evaluate/evaluate_test.go b/utils/evaluate/evaluate_test.go index e058d2aa4b..7839e47256 100644 --- a/utils/evaluate/evaluate_test.go +++ b/utils/evaluate/evaluate_test.go @@ -126,11 +126,11 @@ func TestErrorWithInvalidReference(t *testing.T) { } func TestEvaluateArray(t *testing.T) { - floats := map[string]interface{}{ - "service_apdex": map[string]interface{}{ + floats := map[string]any{ + "service_apdex": map[string]any{ "label": nil, - "values": map[string]interface{}{ - "values": []interface{}{float64(2), float64(2)}, + "values": map[string]any{ + "values": []any{float64(2), float64(2)}, }, }, } @@ -169,7 +169,7 @@ func TestEvaluateAsIntPanic(t *testing.T) { func TestEvaluateAsInt(t *testing.T) { tests := []struct { - input interface{} + input any expression string expectation bool }{ @@ -186,7 +186,7 @@ func TestEvaluateAsInt(t *testing.T) { func TestEvaluateAsFloatError(t *testing.T) { tests := []struct { - input interface{} + input any expression string errRegexp string }{ @@ -203,7 +203,7 @@ func TestEvaluateAsFloatError(t *testing.T) { func TestEvaluateAsFloat(t *testing.T) { tests := []struct { - input interface{} + input any expression string expectation bool }{ diff --git a/utils/json/json.go b/utils/json/json.go index d946ff4621..96b2a3f7c7 100644 --- a/utils/json/json.go +++ b/utils/json/json.go @@ -10,7 +10,7 @@ import ( // MustMarshal marshals an object and panics if it failures. This function should only be used // when the object being passed in does not have any chance of failing (i.e. you constructed // the object yourself) -func MustMarshal(i interface{}) []byte { +func MustMarshal(i any) []byte { bytes, err := json.Marshal(i) if err != nil { panic(err) @@ -27,7 +27,7 @@ func (j *JSONMarshaler) ContentType() string { } // Marshal implements gwruntime.Marshaler. -func (j *JSONMarshaler) Marshal(v interface{}) ([]byte, error) { +func (j *JSONMarshaler) Marshal(v any) ([]byte, error) { return json.Marshal(v) } @@ -42,6 +42,6 @@ func (j *JSONMarshaler) NewEncoder(w io.Writer) gwruntime.Encoder { } // Unmarshal implements gwruntime.Marshaler. -func (j *JSONMarshaler) Unmarshal(data []byte, v interface{}) error { +func (j *JSONMarshaler) Unmarshal(data []byte, v any) error { return json.Unmarshal(data, v) } diff --git a/utils/json/json_test.go b/utils/json/json_test.go index 2b3b734963..1f3a18e19f 100644 --- a/utils/json/json_test.go +++ b/utils/json/json_test.go @@ -23,7 +23,7 @@ type I interface { } func TestMustMarshalPanics(t *testing.T) { - test := map[string]interface{}{ + test := map[string]any{ "foo": make(chan int), } assert.Panics(t, func() { MustMarshal(test) }) diff --git a/utils/log/log.go b/utils/log/log.go index 049f26f935..86a391fd2e 100644 --- a/utils/log/log.go +++ b/utils/log/log.go @@ -74,7 +74,7 @@ func WithObject(obj runtime.Object) *log.Entry { // This is an optimization that callers can use to avoid inferring this again from a runtime.Object func KindNamespaceName(logCtx *log.Entry) (string, string, string) { var kind string - var nameIf interface{} + var nameIf any var ok bool if nameIf, ok = logCtx.Data["rollout"]; ok { kind = "Rollout" @@ -118,7 +118,7 @@ func WithRedactor(entry log.Entry, secrets []string) *log.Entry { } func WithVersionFields(entry *log.Entry, r *v1alpha1.Rollout) *log.Entry { - return entry.WithFields(map[string]interface{}{ + return entry.WithFields(map[string]any{ "resourceVersion": r.ResourceVersion, "generation": r.Generation, }) diff --git a/utils/record/record.go b/utils/record/record.go index 87d83092f7..d2bd322acf 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -58,8 +58,8 @@ type EventOptions struct { } type EventRecorder interface { - Eventf(object runtime.Object, opts EventOptions, messageFmt string, args ...interface{}) - Warnf(object runtime.Object, opts EventOptions, messageFmt string, args ...interface{}) + Eventf(object runtime.Object, opts EventOptions, messageFmt string, args ...any) + Warnf(object runtime.Object, opts EventOptions, messageFmt string, args ...any) K8sRecorder() record.EventRecorder } @@ -75,7 +75,7 @@ type EventRecorderAdapter struct { NotificationSuccessCounter *prometheus.CounterVec NotificationSendPerformance *prometheus.HistogramVec - eventf func(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...interface{}) + eventf func(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...any) // apiFactory is a notifications engine API factory apiFactory api.Factory } @@ -110,8 +110,8 @@ type FakeEventRecorder struct { func NewFakeApiFactory() api.Factory { var ( settings = api.Settings{ConfigMapName: "my-config-map", SecretName: "my-secret", InitGetVars: func(cfg *api.Config, configMap *corev1.ConfigMap, secret *corev1.Secret) (api.GetVars, error) { - return func(obj map[string]interface{}, dest services.Destination) map[string]interface{} { - return map[string]interface{}{"obj": obj} + return func(obj map[string]any, dest services.Destination) map[string]any { + return map[string]any{"obj": obj} }, nil }} ) @@ -173,7 +173,7 @@ func NewFakeEventRecorder() *FakeEventRecorder { ).(*EventRecorderAdapter) recorder.Recorder = record.NewFakeRecorder(1000) fakeRecorder := &FakeEventRecorder{} - recorder.eventf = func(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...interface{}) { + recorder.eventf = func(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...any) { recorder.defaultEventf(object, warn, opts, messageFmt, args...) fakeRecorder.Events = append(fakeRecorder.Events, opts.EventReason) } @@ -181,21 +181,21 @@ func NewFakeEventRecorder() *FakeEventRecorder { return fakeRecorder } -func (e *EventRecorderAdapter) Eventf(object runtime.Object, opts EventOptions, messageFmt string, args ...interface{}) { +func (e *EventRecorderAdapter) Eventf(object runtime.Object, opts EventOptions, messageFmt string, args ...any) { if opts.EventType == "" { opts.EventType = corev1.EventTypeNormal } e.eventf(object, opts.EventType == corev1.EventTypeWarning, opts, messageFmt, args...) } -func (e *EventRecorderAdapter) Warnf(object runtime.Object, opts EventOptions, messageFmt string, args ...interface{}) { +func (e *EventRecorderAdapter) Warnf(object runtime.Object, opts EventOptions, messageFmt string, args ...any) { opts.EventType = corev1.EventTypeWarning e.eventf(object, true, opts, messageFmt, args...) } // defaultEventf is the default implementation of eventf, which is able to be overwritten for // test purposes -func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...interface{}) { +func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...any) { logCtx := logutil.WithObject(object) if opts.EventReason != "" { @@ -240,8 +240,8 @@ func NewAPIFactorySettings() api.Settings { SecretName: NotificationSecret, ConfigMapName: NotificationConfigMap, InitGetVars: func(cfg *api.Config, configMap *corev1.ConfigMap, secret *corev1.Secret) (api.GetVars, error) { - return func(obj map[string]interface{}, dest services.Destination) map[string]interface{} { - return map[string]interface{}{"rollout": obj, "time": timeExprs} + return func(obj map[string]any, dest services.Destination) map[string]any { + return map[string]any{"rollout": obj, "time": timeExprs} }, nil }, } @@ -319,12 +319,12 @@ func hash(input string) string { } // toObjectMap converts an object to a map for the purposes of sending to the notification engine -func toObjectMap(object interface{}) (map[string]interface{}, error) { +func toObjectMap(object any) (map[string]any, error) { objBytes, err := json.Marshal(object) if err != nil { return nil, err } - var objMap map[string]interface{} + var objMap map[string]any err = json.Unmarshal(objBytes, &objMap) if err != nil { return nil, err @@ -338,7 +338,7 @@ func toObjectMap(object interface{}) (map[string]interface{}, error) { if err != nil { return nil, err } - var templateMap map[string]interface{} + var templateMap map[string]any err = json.Unmarshal(templateBytes, &templateMap) if err != nil { return nil, err @@ -352,7 +352,7 @@ func toObjectMap(object interface{}) (map[string]interface{}, error) { if err != nil { return nil, err } - var selectorMap map[string]interface{} + var selectorMap map[string]any err = json.Unmarshal(selectorBytes, &selectorMap) if err != nil { return nil, err @@ -373,7 +373,7 @@ func translateReasonToTrigger(reason string) string { return "on-" + strings.ToLower(trigger) } -var timeExprs = map[string]interface{}{ +var timeExprs = map[string]any{ "Parse": parse, "Now": now, } diff --git a/utils/record/record_test.go b/utils/record/record_test.go index d7e64af1fa..6c494a3ac7 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -429,10 +429,10 @@ func TestNewAPIFactorySettings(t *testing.T) { getVars, err := settings.InitGetVars(nil, nil, nil) assert.NoError(t, err) - rollout := map[string]interface{}{"name": "hello"} + rollout := map[string]any{"name": "hello"} vars := getVars(rollout, services.Destination{}) - assert.Equal(t, map[string]interface{}{"rollout": rollout, "time": timeExprs}, vars) + assert.Equal(t, map[string]any{"rollout": rollout, "time": timeExprs}, vars) } func TestWorkloadRefObjectMap(t *testing.T) { diff --git a/utils/tolerantinformer/tolerantinformer_test.go b/utils/tolerantinformer/tolerantinformer_test.go index 351601e3a9..84c25c1215 100644 --- a/utils/tolerantinformer/tolerantinformer_test.go +++ b/utils/tolerantinformer/tolerantinformer_test.go @@ -122,7 +122,7 @@ func TestMalformedRolloutEphemeralCtr(t *testing.T) { verify(list[0]) } -func verifyAnalysisSpec(t *testing.T, s interface{}) { +func verifyAnalysisSpec(t *testing.T, s any) { // metrics: // - name: test // provider: diff --git a/utils/tolerantinformer/tollerantinformer.go b/utils/tolerantinformer/tollerantinformer.go index aba0bd7f29..e3996f9cce 100644 --- a/utils/tolerantinformer/tollerantinformer.go +++ b/utils/tolerantinformer/tollerantinformer.go @@ -14,7 +14,7 @@ import ( // convertObject converts a runtime.Object into the supplied concrete typed object // typedObj should be a pointer to a typed object which is desired to be filled in. // This is a best effort conversion which ignores unmarshalling errors. -func convertObject(object runtime.Object, typedObj interface{}) error { +func convertObject(object runtime.Object, typedObj any) error { un, ok := object.(*unstructured.Unstructured) if !ok { return fmt.Errorf("malformed object: expected \"*unstructured.Unstructured\", got \"%s\"", reflect.TypeOf(object).Name()) @@ -35,7 +35,7 @@ func convertObject(object runtime.Object, typedObj interface{}) error { return nil } -func fromUnstructuredViaJSON(u map[string]interface{}, obj interface{}) error { +func fromUnstructuredViaJSON(u map[string]any, obj any) error { data, err := json.Marshal(u) if err != nil { return err diff --git a/utils/unstructured/unstructured.go b/utils/unstructured/unstructured.go index 7c73812da3..a0dd341a48 100644 --- a/utils/unstructured/unstructured.go +++ b/utils/unstructured/unstructured.go @@ -13,7 +13,7 @@ import ( ) func StrToUnstructuredUnsafe(jsonStr string) *unstructured.Unstructured { - obj := make(map[string]interface{}) + obj := make(map[string]any) err := yaml.Unmarshal([]byte(jsonStr), &obj) if err != nil { panic(err) @@ -22,7 +22,7 @@ func StrToUnstructuredUnsafe(jsonStr string) *unstructured.Unstructured { } func StrToUnstructured(jsonStr string) (*unstructured.Unstructured, error) { - obj := make(map[string]interface{}) + obj := make(map[string]any) err := yaml.Unmarshal([]byte(jsonStr), &obj) if err != nil { return nil, err @@ -30,7 +30,7 @@ func StrToUnstructured(jsonStr string) (*unstructured.Unstructured, error) { return &unstructured.Unstructured{Object: obj}, nil } -func ObjectToRollout(obj interface{}) *v1alpha1.Rollout { +func ObjectToRollout(obj any) *v1alpha1.Rollout { un, ok := obj.(*unstructured.Unstructured) if ok { var ro v1alpha1.Rollout @@ -49,7 +49,7 @@ func ObjectToRollout(obj interface{}) *v1alpha1.Rollout { return ro } -func ObjectToAnalysisRun(obj interface{}) *v1alpha1.AnalysisRun { +func ObjectToAnalysisRun(obj any) *v1alpha1.AnalysisRun { un, ok := obj.(*unstructured.Unstructured) if ok { var ar v1alpha1.AnalysisRun @@ -67,7 +67,7 @@ func ObjectToAnalysisRun(obj interface{}) *v1alpha1.AnalysisRun { return ar } -func ObjectToExperiment(obj interface{}) *v1alpha1.Experiment { +func ObjectToExperiment(obj any) *v1alpha1.Experiment { un, ok := obj.(*unstructured.Unstructured) if ok { var ex v1alpha1.Experiment @@ -93,7 +93,7 @@ func SplitYAML(out string) ([]*unstructured.Unstructured, error) { parts := diffSeparator.Split(out, -1) var objs []*unstructured.Unstructured for _, part := range parts { - var objMap map[string]interface{} + var objMap map[string]any err := yaml.Unmarshal([]byte(part), &objMap) if err != nil { return objs, err From 2cf1aa1305c95b7d8c7d6ff29eb226ac34826bb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 12:04:01 -0500 Subject: [PATCH 025/264] chore(deps): bump actions/checkout from 3 to 4 (#3012) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/changelog.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 6 +++--- .github/workflows/image-reuse.yaml | 4 ++-- .github/workflows/release.yaml | 6 +++--- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 6120a179b9..6bfae53fe4 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -12,7 +12,7 @@ jobs: pull-requests: write # for peter-evans/create-pull-request to create a PR runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Update Changelog diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d8309ea267..f9915287da 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 749a4b4f55..a3e7aed29f 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -49,7 +49,7 @@ jobs: uses: actions/setup-go@v4.1.0 with: go-version: '1.20' - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4 - name: Setup k3s env: INSTALL_K3S_CHANNEL: v${{ matrix.kubernetes-minor-version }} diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index 59fece9c6e..6746b7406d 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -18,7 +18,7 @@ jobs: contents: write # for peaceiris/actions-gh-pages to push pages branch runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3.1.0 + - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 1b5d170f12..961203bcef 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -40,7 +40,7 @@ jobs: with: go-version: ${{ env.GOLANG_VERSION }} - name: Checkout code - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v4 - name: Run golangci-lint uses: golangci/golangci-lint-action@v3 with: @@ -57,7 +57,7 @@ jobs: id: go - name: Check out code into the Go module directory - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v4 - name: Restore go build cache uses: actions/cache@v3 @@ -101,7 +101,7 @@ jobs: GOPATH: /home/runner/go steps: - name: Checkout code - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v4 - name: Setup Golang uses: actions/setup-go@v4.1.0 with: diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 41b749a33d..341d328a2e 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -58,14 +58,14 @@ jobs: image-digest: ${{ steps.image.outputs.digest }} steps: - name: Checkout code - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + uses: actions/checkout@v4 # v3.3.0 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} if: ${{ github.ref_type == 'tag'}} - name: Checkout code - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + uses: actions/checkout@v4 # v3.3.0 if: ${{ github.ref_type != 'tag'}} - name: Setup Golang diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2eb8fce786..6ac65d4be1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -85,7 +85,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@v4 # v3.5.2 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} @@ -159,7 +159,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + uses: actions/checkout@v4 # v3.3.0 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} @@ -232,7 +232,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.3.0 + uses: actions/checkout@v4 # v3.3.0 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} From b30ad032173ba4bd96f7654e10051a004df2f25c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 08:33:19 -0500 Subject: [PATCH 026/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.38 to 1.18.39 (#3018) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.38 to 1.18.39. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.38...config/v1.18.39) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 194ea42f40..b28cebc838 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.38 + github.com/aws/aws-sdk-go-v2/config v1.18.39 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 github.com/blang/semver v3.5.1+incompatible @@ -82,14 +82,14 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.36 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.37 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 // indirect github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index 391f548a45..daf8ad437a 100644 --- a/go.sum +++ b/go.sum @@ -105,10 +105,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.38 h1:CByQCELMgm2tM1lAehx3XNg0R/pfeXsYzqn0Aq2chJQ= -github.com/aws/aws-sdk-go-v2/config v1.18.38/go.mod h1:vNm9Hf5VgG2fSUWhT3zFrqN/RosGcabFMYgiSoxKFU8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.36 h1:ps0cPswZjpsOk6sLwG6fdXTzrYjCplgPEyG3OUbbdqE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.36/go.mod h1:sY2phUzxbygoyDtTXhqi7GjGjCQ1S5a5Rj8u3ksBxCg= +github.com/aws/aws-sdk-go-v2/config v1.18.39 h1:oPVyh6fuu/u4OiW4qcuQyEtk7U7uuNBmHmJSLg1AJsQ= +github.com/aws/aws-sdk-go-v2/config v1.18.39/go.mod h1:+NH/ZigdPckFpgB1TRcRuWCB/Kbbvkxc/iNAKTq5RhE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.37 h1:BvEdm09+ZEh2XtN+PVHPcYwKY3wIeB6pw7vPRM4M9/U= +github.com/aws/aws-sdk-go-v2/credentials v1.13.37/go.mod h1:ACLrdkd4CLZyXOghZ8IYumQbcooAcp2jo/s2xsFH8IM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKi github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 h1:2PylFCfKCEDv6PeSN09pC/VUiRd10wi1VfHG5FrW0/g= github.com/aws/aws-sdk-go-v2/service/sso v1.13.6/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5 h1:dnInJb4S0oy8aQuri1mV6ipLlnZPfnsDNB9BGO9PDNY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.5/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6 h1:pSB560BbVj9ZlJZF4WYj5zsytWHWKxg+NgyGV4B2L58= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 h1:CQBFElb0LS8RojMJlxRSo/HXipvTZW2S44Lt9Mk2aYQ= github.com/aws/aws-sdk-go-v2/service/sts v1.21.5/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= From c5457e335e770f85fedf161ce0c91358b7d39220 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 20:33:41 +0000 Subject: [PATCH 027/264] docs: Update Changelog (#3021) * update changelog Signed-off-by: zachaller * re-trigger Signed-off-by: zachaller * re-trigger Signed-off-by: zachaller --------- Signed-off-by: zachaller Co-authored-by: zachaller --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63bef5a828..403f5c2f5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,23 @@ + +## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) + +### Chore + +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 ([#2950](https://github.com/argoproj/argo-rollouts/issues/2950)) +* **deps:** bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 ([#2951](https://github.com/argoproj/argo-rollouts/issues/2951)) + +### Docs + +* update supported k8s version ([#2949](https://github.com/argoproj/argo-rollouts/issues/2949)) + +### Fix + +* analysis step should be ignored after promote ([#3016](https://github.com/argoproj/argo-rollouts/issues/3016)) +* **controller:** rollback should skip all steps to active rs within RollbackWindow ([#2953](https://github.com/argoproj/argo-rollouts/issues/2953)) +* **controller:** typo fix ("Secrete" -> "Secret") in secret informer ([#2965](https://github.com/argoproj/argo-rollouts/issues/2965)) + + ## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) From abb84746c8fc43b863a803a6ef830d055bb2e545 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Wed, 6 Sep 2023 23:47:38 +0100 Subject: [PATCH 028/264] fix: Add the GOPATH to the go-to-protobuf command (#3022) Add the GOPATH to the go-to-protobuf command Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 638498ff85..a5f77cc568 100644 --- a/Makefile +++ b/Makefile @@ -111,7 +111,7 @@ gen-proto: k8s-proto api-proto ui-proto # generates the .proto files affected by changes to types.go .PHONY: k8s-proto k8s-proto: go-mod-vendor $(TYPES) ## generate kubernetes protobuf files - PATH=${DIST_DIR}:$$PATH go-to-protobuf \ + PATH=${DIST_DIR}:$$PATH GOPATH=${GOPATH} go-to-protobuf \ --go-header-file=./hack/custom-boilerplate.go.txt \ --packages=github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ --apimachinery-packages=${APIMACHINERY_PKGS} \ From df187c10b5c80744f184d1e9f21ebfedf9bf8b84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:05:27 -0500 Subject: [PATCH 029/264] chore(deps): bump github.com/antonmedv/expr from 1.13.0 to 1.15.1 (#3024) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.13.0 to 1.15.1. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.13.0...v1.15.1) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b28cebc838..f6a6d23766 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.13.0 + github.com/antonmedv/expr v1.15.1 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 diff --git a/go.sum b/go.sum index daf8ad437a..8d488e8e03 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.13.0 h1:8YrTtlCzlOtXw+hpeCLDLL2uo0C0k6jmYpYTGws5c5w= -github.com/antonmedv/expr v1.13.0/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.15.1 h1:mxeRIkH8GQJo4MRRFgp0ArlV4AA+0DmcJNXEsG70rGU= +github.com/antonmedv/expr v1.15.1/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= From 4f146848098f824a367818918b1430ec126b8b04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:06:00 -0500 Subject: [PATCH 030/264] chore(deps): bump github.com/hashicorp/go-plugin from 1.5.0 to 1.5.1 (#3017) Bumps [github.com/hashicorp/go-plugin](https://github.com/hashicorp/go-plugin) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/hashicorp/go-plugin/releases) - [Changelog](https://github.com/hashicorp/go-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-plugin/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f6a6d23766..ebd7c64cc9 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-plugin v1.5.0 + github.com/hashicorp/go-plugin v1.5.1 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 diff --git a/go.sum b/go.sum index 8d488e8e03..3ae3862224 100644 --- a/go.sum +++ b/go.sum @@ -402,8 +402,8 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.5.0 h1:g6Lj3USwF5LaB8HlvCxPjN2X4nFE08ko2BJNVpl7TIE= -github.com/hashicorp/go-plugin v1.5.0/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= +github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= From 71545aeacff4a1e7074d98e44856e8b537dfd2ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 12:03:56 -0500 Subject: [PATCH 031/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.21.3 to 1.21.4 (#3025) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.21.3 to 1.21.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.21.3...service/efs/v1.21.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ebd7c64cc9..19cd37cbd8 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.21.0 github.com/aws/aws-sdk-go-v2/config v1.18.39 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.6.0 diff --git a/go.sum b/go.sum index 3ae3862224..23719b238a 100644 --- a/go.sum +++ b/go.sum @@ -119,8 +119,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 h1:GPUcE/Yq7Ur8YSUk6lVkoIMWnJN github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 h1:qULF+ElcvjjSEO1+z5x+TmKE9d4yTej7PfpJQPVvexY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3 h1:CAWMcMnRYCBaeMnycTwZs+0BcuepIMfyP3F0r1VfgPc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.3/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 h1:2PylFCfKCEDv6PeSN09pC/VUiRd10wi1VfHG5FrW0/g= From c244c048d02ba180b6bbbee33e1a85d3610c66fc Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Fri, 8 Sep 2023 22:55:24 +0100 Subject: [PATCH 032/264] chore: Update users doc with CircleCI (#3028) Update users doc with CircleCI Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- USERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/USERS.md b/USERS.md index 4094c152c3..4ad9fb29bf 100644 --- a/USERS.md +++ b/USERS.md @@ -9,6 +9,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Bucketplace](https://www.bucketplace.co.kr/) 1. [BukuKas](https://bukukas.co.id/) 1. [Calm](https://www.calm.com/) +1. [CircleCI](https://circleci.com/) 1. [Codefresh](https://codefresh.io/) 1. [Credit Karma](https://creditkarma.com/) 1. [DaoCloud](https://daocloud.io) From 2c9e6c58039bc4511b3aa46e55113ab655ef0f4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:10:00 -0500 Subject: [PATCH 033/264] chore(deps): bump github.com/antonmedv/expr from 1.15.1 to 1.15.2 (#3036) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.15.1 to 1.15.2. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.15.1...v1.15.2) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 19cd37cbd8..e747a4983c 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.15.1 + github.com/antonmedv/expr v1.15.2 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 diff --git a/go.sum b/go.sum index 23719b238a..da8d8cf479 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.15.1 h1:mxeRIkH8GQJo4MRRFgp0ArlV4AA+0DmcJNXEsG70rGU= -github.com/antonmedv/expr v1.15.1/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/antonmedv/expr v1.15.2 h1:afFXpDWIC2n3bF+kTZE1JvFo+c34uaM3sTqh8z0xfdU= +github.com/antonmedv/expr v1.15.2/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= From ee4643e6666aba660bb54388185fb92bb7344a44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:10:32 -0500 Subject: [PATCH 034/264] chore(deps): bump docker/login-action from 2.2.0 to 3.0.0 (#3035) Bumps [docker/login-action](https://github.com/docker/login-action) from 2.2.0 to 3.0.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/465a07811f14bebb1938fbed4728c6a1ff8901fc...343f7c4344506bcbf9b4de18042ae17996df046d) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 341d328a2e..c90b286b10 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -106,7 +106,7 @@ jobs: echo 'EOF' >> $GITHUB_ENV - name: Login to Quay.io - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 with: registry: quay.io username: ${{ secrets.quay_username }} @@ -114,7 +114,7 @@ jobs: if: ${{ inputs.quay_image_name && inputs.push }} - name: Login to GitHub Container Registry - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 with: registry: ghcr.io username: ${{ secrets.ghcr_username }} @@ -122,7 +122,7 @@ jobs: if: ${{ inputs.ghcr_image_name && inputs.push }} - name: Login to dockerhub Container Registry - uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc # v2.2.0 + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 with: username: ${{ secrets.docker_username }} password: ${{ secrets.docker_password }} From cb22411892b2cbf4802355aee571b1cf87c19e21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:10:56 -0500 Subject: [PATCH 035/264] chore(deps): bump docker/setup-buildx-action from 2.10.0 to 3.0.0 (#3034) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.10.0 to 3.0.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/885d1462b80bc1c1c7f0b00334ad271f09369c55...f95db51fddba0c2d1ec667646a06c2ce06100226) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index c90b286b10..adcbe86473 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -79,7 +79,7 @@ jobs: cosign-release: 'v2.0.2' - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2.10.0 + - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Setup tags for container image as a CSV type run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6ac65d4be1..918958b729 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -99,7 +99,7 @@ jobs: uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2.10.0 + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Generate release artifacts run: | From 4852524e873d942c97c503fc81d5792d87475d52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:11:35 -0500 Subject: [PATCH 036/264] chore(deps): bump docker/build-push-action from 4.1.1 to 5.0.0 (#3033) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4.1.1 to 5.0.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/2eb1c1961a95fc15694676618e422e8ba1d63825...0565240e2d4ab88bba5387d719585280857ece09) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index adcbe86473..6c98cb9bfc 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 #v4.1.1 + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 #v5.0.0 with: context: . platforms: ${{ inputs.platforms }} From b80afec0ff620d2ca12bb120793f1dc8d92addbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:12:01 -0500 Subject: [PATCH 037/264] chore(deps): bump docker/metadata-action from 4 to 5 (#3032) Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4 to 5. - [Release notes](https://github.com/docker/metadata-action/releases) - [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md) - [Commits](https://github.com/docker/metadata-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 1a51e2a485..c762c89c29 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Docker meta (controller) id: controller-meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | quay.io/argoproj/argo-rollouts @@ -38,7 +38,7 @@ jobs: - name: Docker meta (plugin) id: plugin-meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | quay.io/argoproj/kubectl-argo-rollouts From ad3c4f63ed11f9b5e4c7bf4f576fa28c29e43836 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:12:43 -0500 Subject: [PATCH 038/264] chore(deps): bump github.com/evanphx/json-patch/v5 from 5.6.0 to 5.7.0 (#3030) Bumps [github.com/evanphx/json-patch/v5](https://github.com/evanphx/json-patch) from 5.6.0 to 5.7.0. - [Release notes](https://github.com/evanphx/json-patch/releases) - [Commits](https://github.com/evanphx/json-patch/compare/v5.6.0...v5.7.0) --- updated-dependencies: - dependency-name: github.com/evanphx/json-patch/v5 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e747a4983c..1e6633fa29 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 - github.com/evanphx/json-patch/v5 v5.6.0 + github.com/evanphx/json-patch/v5 v5.7.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index da8d8cf479..837eaee024 100644 --- a/go.sum +++ b/go.sum @@ -206,8 +206,8 @@ github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= +github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= From 57be60a0bb19ca381c2b690e608fabd001aae2d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 16:13:13 -0500 Subject: [PATCH 039/264] chore(deps): bump google.golang.org/grpc from 1.57.0 to 1.58.0 (#3023) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.57.0 to 1.58.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.57.0...v1.58.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 40 +++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 1e6633fa29..d809ee3e2d 100644 --- a/go.mod +++ b/go.mod @@ -36,8 +36,8 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 - google.golang.org/grpc v1.57.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 @@ -57,7 +57,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.19.1 // indirect + cloud.google.com/go/compute v1.21.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect @@ -171,20 +171,20 @@ require ( github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.7.0 // indirect + golang.org/x/crypto v0.11.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect + google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 837eaee024..582dc24d37 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= @@ -739,8 +739,9 @@ golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -826,16 +827,18 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -849,7 +852,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -920,16 +923,18 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -942,8 +947,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1070,12 +1076,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1091,8 +1097,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From d5fdf6d6a480deef5c19eb3ae4327ba4ebf9c422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Sep 2023 12:12:13 -0500 Subject: [PATCH 040/264] chore(deps): bump google.golang.org/grpc from 1.58.0 to 1.58.2 (#3050) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.58.0 to 1.58.2. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.58.0...v1.58.2) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d809ee3e2d..0790b439cd 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 - google.golang.org/grpc v1.58.0 + google.golang.org/grpc v1.58.2 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 diff --git a/go.sum b/go.sum index 582dc24d37..eac3a04904 100644 --- a/go.sum +++ b/go.sum @@ -1097,8 +1097,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= +google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 91beda4018502442abf9cd1d6b22c7f456cab1fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Sep 2023 21:01:10 -0500 Subject: [PATCH 041/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.39 to 1.18.41 (#3047) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.39 to 1.18.41. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.39...config/v1.18.41) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 0790b439cd..4e25eb3a57 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.39 + github.com/aws/aws-sdk-go-v2/config v1.18.41 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.39 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 // indirect github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index eac3a04904..c3060a94b6 100644 --- a/go.sum +++ b/go.sum @@ -105,10 +105,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.39 h1:oPVyh6fuu/u4OiW4qcuQyEtk7U7uuNBmHmJSLg1AJsQ= -github.com/aws/aws-sdk-go-v2/config v1.18.39/go.mod h1:+NH/ZigdPckFpgB1TRcRuWCB/Kbbvkxc/iNAKTq5RhE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.37 h1:BvEdm09+ZEh2XtN+PVHPcYwKY3wIeB6pw7vPRM4M9/U= -github.com/aws/aws-sdk-go-v2/credentials v1.13.37/go.mod h1:ACLrdkd4CLZyXOghZ8IYumQbcooAcp2jo/s2xsFH8IM= +github.com/aws/aws-sdk-go-v2/config v1.18.41 h1:Go7z97YDsBJVNAaL7pDPKB6LeHEsAkHmFe+CeK30fUQ= +github.com/aws/aws-sdk-go-v2/config v1.18.41/go.mod h1:+yR45+A0LIMKT8bWOKo90Hy9rSrovEmEKoPKLmmVec8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.39 h1:UnwBXDIHKDaejSXaRzKR57IdGCizk+z1DEhnsFpus7Q= +github.com/aws/aws-sdk-go-v2/credentials v1.13.39/go.mod h1:OJ9P239A90TnglJEF3qofKiNeEM6PCV/m+aNGV5WC24= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= @@ -123,12 +123,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeo github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.6 h1:2PylFCfKCEDv6PeSN09pC/VUiRd10wi1VfHG5FrW0/g= -github.com/aws/aws-sdk-go-v2/service/sso v1.13.6/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6 h1:pSB560BbVj9ZlJZF4WYj5zsytWHWKxg+NgyGV4B2L58= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.6/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.5 h1:CQBFElb0LS8RojMJlxRSo/HXipvTZW2S44Lt9Mk2aYQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.21.5/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/aws-sdk-go-v2/service/sso v1.14.0 h1:AR/hlTsCyk1CwlyKnPFvIMvnONydRjDDRT9OGb0i+/g= +github.com/aws/aws-sdk-go-v2/service/sso v1.14.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0 h1:UniOmlPJelksyP5dGjfRoFTmLDy4/o0HH1lK2Op7zC8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= +github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 h1:s4bioTgjSFRwOoyEFzAVCmFmoowBgjTR8gkrF/sQ4wk= +github.com/aws/aws-sdk-go-v2/service/sts v1.22.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 1ee490b983710a1521ad6e479d175a6c589919ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Sep 2023 21:05:26 -0500 Subject: [PATCH 042/264] chore(deps): bump docker/setup-qemu-action from 2.2.0 to 3.0.0 (#3031) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.2.0 to 3.0.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/2b82ce82d56a2a04d2637cd93a637ae1b359c0a7...68827325e0b33c7199eb31dd4e31fbe9023e06e3) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 6c98cb9bfc..eefb23923d 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -78,7 +78,7 @@ jobs: with: cosign-release: 'v2.0.2' - - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Setup tags for container image as a CSV type diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 918958b729..df9479da3f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -96,7 +96,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Set up QEMU - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 From 2aeabf42ec4f834010bdbc9574c8134f8317c7b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Sep 2023 21:05:51 -0500 Subject: [PATCH 043/264] chore(deps): bump github.com/antonmedv/expr from 1.15.2 to 1.15.3 (#3046) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.15.2 to 1.15.3. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.15.2...v1.15.3) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4e25eb3a57..7a6438616a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.15.2 + github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 diff --git a/go.sum b/go.sum index c3060a94b6..e5db982007 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.15.2 h1:afFXpDWIC2n3bF+kTZE1JvFo+c34uaM3sTqh8z0xfdU= -github.com/antonmedv/expr v1.15.2/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= +github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= From 6a231bfcbf1f5f804d442823e65fd5576449fcc8 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Mon, 25 Sep 2023 15:47:24 +0300 Subject: [PATCH 044/264] docs: clarify external clusters (#3058) Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> --- docs/FAQ.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/FAQ.md b/docs/FAQ.md index 8a0c921cc7..861e4b3a80 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -41,6 +41,10 @@ solution that does not follow the GitOps approach. Yes. A k8s cluster can run multiple replicas of Argo-rollouts controllers to achieve HA. To enable this feature, run the controller with `--leader-elect` flag and increase the number of replicas in the controller's deployment manifest. The implementation is based on the [k8s client-go's leaderelection package](https://pkg.go.dev/k8s.io/client-go/tools/leaderelection#section-documentation). This implementation is tolerant to *arbitrary clock skew* among replicas. The level of tolerance to skew rate can be configured by setting `--leader-election-lease-duration` and `--leader-election-renew-deadline` appropriately. Please refer to the [package documentation](https://pkg.go.dev/k8s.io/client-go/tools/leaderelection#pkg-overview) for details. +### Can we install Argo Rollouts centrally in a cluster and manage Rollout resources in external clusters? + +No you cannot do that (even though Argo CD can work that way). This is by design because the Rollout is a custom resource unknown to vanilla Kubernetes. You need the Rollout CRD as well as the controller in the deployment cluster (every cluster that will use workloads with Rollouts). + ## Rollouts ### Which deployment strategies does Argo Rollouts support? From f650a1fd0ba7beb2125e1598410515edd572776f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Sep 2023 07:42:45 -0500 Subject: [PATCH 045/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.41 to 1.18.42 (#3055) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.41 to 1.18.42. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.41...config/v1.18.42) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 7a6438616a..6fcf264f9c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.41 + github.com/aws/aws-sdk-go-v2/config v1.18.42 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible @@ -82,14 +82,14 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.39 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.40 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.14.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 // indirect github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index e5db982007..f0a32df12b 100644 --- a/go.sum +++ b/go.sum @@ -105,28 +105,28 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.41 h1:Go7z97YDsBJVNAaL7pDPKB6LeHEsAkHmFe+CeK30fUQ= -github.com/aws/aws-sdk-go-v2/config v1.18.41/go.mod h1:+yR45+A0LIMKT8bWOKo90Hy9rSrovEmEKoPKLmmVec8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.39 h1:UnwBXDIHKDaejSXaRzKR57IdGCizk+z1DEhnsFpus7Q= -github.com/aws/aws-sdk-go-v2/credentials v1.13.39/go.mod h1:OJ9P239A90TnglJEF3qofKiNeEM6PCV/m+aNGV5WC24= +github.com/aws/aws-sdk-go-v2/config v1.18.42 h1:28jHROB27xZwU0CB88giDSjz7M1Sba3olb5JBGwina8= +github.com/aws/aws-sdk-go-v2/config v1.18.42/go.mod h1:4AZM3nMMxwlG+eZlxvBKqwVbkDLlnN2a4UGTL6HjaZI= +github.com/aws/aws-sdk-go-v2/credentials v1.13.40 h1:s8yOkDh+5b1jUDhMBtngF6zKWLDs84chUk2Vk0c38Og= +github.com/aws/aws-sdk-go-v2/credentials v1.13.40/go.mod h1:VtEHVAAqDWASwdOqj/1huyT6uHbs5s8FUHfDQdky/Rs= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42 h1:GPUcE/Yq7Ur8YSUk6lVkoIMWnJNO0HT18GUzCWCgCI0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.42/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 h1:qULF+ElcvjjSEO1+z5x+TmKE9d4yTej7PfpJQPVvexY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= -github.com/aws/aws-sdk-go-v2/service/sso v1.14.0 h1:AR/hlTsCyk1CwlyKnPFvIMvnONydRjDDRT9OGb0i+/g= -github.com/aws/aws-sdk-go-v2/service/sso v1.14.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0 h1:UniOmlPJelksyP5dGjfRoFTmLDy4/o0HH1lK2Op7zC8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.0/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= +github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 h1:YkNzx1RLS0F5qdf9v1Q8Cuv9NXCL2TkosOxhzlUPV64= +github.com/aws/aws-sdk-go-v2/service/sso v1.14.1/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 h1:s4bioTgjSFRwOoyEFzAVCmFmoowBgjTR8gkrF/sQ4wk= github.com/aws/aws-sdk-go-v2/service/sts v1.22.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= From 5ac4a48d3ed1639e023366a118fc86b100393e85 Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Fri, 29 Sep 2023 15:01:46 -0700 Subject: [PATCH 046/264] fix: prevent hot loop when fully promoted rollout is aborted (#3064) * fix: prevent hot loop when fully promoted rollout is aborted Signed-off-by: Jesse Suen * test: change expectations of abort tests Signed-off-by: Jesse Suen --------- Signed-off-by: Jesse Suen --- experiments/controller_test.go | 6 ++-- experiments/experiment_test.go | 2 +- experiments/replicaset_test.go | 4 +-- rollout/analysis_test.go | 64 +++++++++++++++++----------------- rollout/bluegreen_test.go | 16 ++++----- rollout/canary_test.go | 51 +++++++++++++-------------- rollout/controller.go | 5 +++ rollout/controller_test.go | 4 +-- rollout/experiment_test.go | 14 ++++---- rollout/service_test.go | 4 +-- test/e2e/istio_test.go | 4 +-- 11 files changed, 89 insertions(+), 85 deletions(-) diff --git a/experiments/controller_test.go b/experiments/controller_test.go index 26587b6346..0103e03ce1 100644 --- a/experiments/controller_test.go +++ b/experiments/controller_test.go @@ -805,7 +805,7 @@ func TestAddInvalidSpec(t *testing.T) { "status":{ } }`, nil, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestKeepInvalidSpec(t *testing.T) { @@ -852,7 +852,7 @@ func TestUpdateInvalidSpec(t *testing.T) { "status":{ } }`, nil, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } @@ -892,7 +892,7 @@ func TestRemoveInvalidSpec(t *testing.T) { "status":{ } }`, templateStatus, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestRun(t *testing.T) { diff --git a/experiments/experiment_test.go b/experiments/experiment_test.go index e047082cee..21fbeb530a 100644 --- a/experiments/experiment_test.go +++ b/experiments/experiment_test.go @@ -282,7 +282,7 @@ func TestSuccessAfterDurationPasses(t *testing.T) { "phase": "Successful" } }`, templateStatuses, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } // TestDontRequeueWithoutDuration verifies we don't requeue if an experiment does not have diff --git a/experiments/replicaset_test.go b/experiments/replicaset_test.go index e4d1cdf231..030414f2df 100644 --- a/experiments/replicaset_test.go +++ b/experiments/replicaset_test.go @@ -42,7 +42,7 @@ func TestCreateMultipleRS(t *testing.T) { "status":{ } }`, templateStatus, cond) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCreateMissingRS(t *testing.T) { @@ -72,7 +72,7 @@ func TestCreateMissingRS(t *testing.T) { generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, now()), generateTemplatesStatus("baz", 0, 0, v1alpha1.TemplateStatusProgressing, now()), } - assert.Equal(t, calculatePatch(e, expectedPatch, templateStatuses, cond), patch) + assert.JSONEq(t, calculatePatch(e, expectedPatch, templateStatuses, cond), patch) } func TestTemplateHasMultipleRS(t *testing.T) { diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index f0313d7ea0..de9a5e1db3 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -180,7 +180,7 @@ func TestCreateBackgroundAnalysisRun(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestCreateBackgroundAnalysisRunWithTemplates(t *testing.T) { @@ -241,7 +241,7 @@ func TestCreateBackgroundAnalysisRunWithTemplates(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestCreateBackgroundAnalysisRunWithClusterTemplates(t *testing.T) { @@ -303,7 +303,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplates(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestInvalidSpecMissingClusterTemplatesBackgroundAnalysis(t *testing.T) { @@ -339,7 +339,7 @@ func TestInvalidSpecMissingClusterTemplatesBackgroundAnalysis(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T) { @@ -416,7 +416,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } // TestCreateAnalysisRunWithCollision ensures we will create an new analysis run with a new name @@ -487,7 +487,7 @@ func TestCreateAnalysisRunWithCollision(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedAR.Name)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedAR.Name)), patch) } // TestCreateAnalysisRunWithCollisionAndSemanticEquality will ensure we do not create an extra @@ -550,7 +550,7 @@ func TestCreateAnalysisRunWithCollisionAndSemanticEquality(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ar.Name)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ar.Name)), patch) } func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { @@ -611,7 +611,7 @@ func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { @@ -653,7 +653,7 @@ func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestFailCreateBackgroundAnalysisRunIfInvalidTemplateRef(t *testing.T) { @@ -698,7 +698,7 @@ func TestFailCreateBackgroundAnalysisRunIfInvalidTemplateRef(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { @@ -745,7 +745,7 @@ func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestDoNothingWithAnalysisRunsWhileBackgroundAnalysisRunRunning(t *testing.T) { @@ -798,7 +798,7 @@ func TestDoNothingWithAnalysisRunsWhileBackgroundAnalysisRunRunning(t *testing.T patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDoNothingWhileStepBasedAnalysisRunRunning(t *testing.T) { @@ -847,7 +847,7 @@ func TestDoNothingWhileStepBasedAnalysisRunRunning(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestCancelOlderAnalysisRuns(t *testing.T) { @@ -915,7 +915,7 @@ func TestCancelOlderAnalysisRuns(t *testing.T) { } } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestDeleteAnalysisRunsWithNoMatchingRS(t *testing.T) { @@ -971,7 +971,7 @@ func TestDeleteAnalysisRunsWithNoMatchingRS(t *testing.T) { deletedAr := f.getDeletedAnalysisRun(deletedIndex) assert.Equal(t, deletedAr, arWithDiffPodHash.Name) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDeleteAnalysisRunsAfterRSDelete(t *testing.T) { @@ -1083,7 +1083,7 @@ func TestIncrementStepAfterSuccessfulAnalysisRun(t *testing.T) { }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition)), patch) } func TestPausedOnInconclusiveBackgroundAnalysisRun(t *testing.T) { @@ -1152,7 +1152,7 @@ func TestPausedOnInconclusiveBackgroundAnalysisRun(t *testing.T) { }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) } func TestPausedStepAfterInconclusiveAnalysisRun(t *testing.T) { @@ -1215,7 +1215,7 @@ func TestPausedStepAfterInconclusiveAnalysisRun(t *testing.T) { } }` condition := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, v1alpha1.PauseReasonInconclusiveAnalysis, now, v1alpha1.PauseReasonInconclusiveAnalysis)), patch) } func TestErrorConditionAfterErrorAnalysisRunStep(t *testing.T) { @@ -1282,7 +1282,7 @@ func TestErrorConditionAfterErrorAnalysisRunStep(t *testing.T) { errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) + ": " + ar.Status.Message condition := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, errmsg, false) expectedPatch = fmt.Sprintf(expectedPatch, condition, now, errmsg) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestErrorConditionAfterErrorAnalysisRunBackground(t *testing.T) { @@ -1358,7 +1358,7 @@ func TestErrorConditionAfterErrorAnalysisRunBackground(t *testing.T) { condition := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, now, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, condition, now, errmsg)), patch) } func TestCancelAnalysisRunsWhenAborted(t *testing.T) { @@ -1419,7 +1419,7 @@ func TestCancelAnalysisRunsWhenAborted(t *testing.T) { }` errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, now, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, now, errmsg)), patch) } func TestCancelBackgroundAnalysisRunWhenRolloutIsCompleted(t *testing.T) { @@ -1521,7 +1521,7 @@ func TestDoNotCreateBackgroundAnalysisRunAfterInconclusiveRun(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestDoNotCreateBackgroundAnalysisRunOnNewCanaryRollout(t *testing.T) { @@ -1647,7 +1647,7 @@ func TestCreatePrePromotionAnalysisRun(t *testing.T) { } } }`, ar.Name) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } // TestDoNotCreatePrePromotionAnalysisProgressedRollout ensures a pre-promotion analysis is not created after a Rollout @@ -1771,7 +1771,7 @@ func TestDoNotCreatePrePromotionAnalysisRunOnNotReadyReplicaSet(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchRolloutIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestRolloutPrePromotionAnalysisBecomesInconclusive(t *testing.T) { @@ -1841,7 +1841,7 @@ func TestRolloutPrePromotionAnalysisBecomesInconclusive(t *testing.T) { } } }`, now, now) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisSwitchServiceAfterSuccess(t *testing.T) { @@ -1905,7 +1905,7 @@ func TestRolloutPrePromotionAnalysisSwitchServiceAfterSuccess(t *testing.T) { "message": null } }`, rs2PodHash, rs2PodHash, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisHonorAutoPromotionSeconds(t *testing.T) { @@ -1971,7 +1971,7 @@ func TestRolloutPrePromotionAnalysisHonorAutoPromotionSeconds(t *testing.T) { "message": null } }`, rs2PodHash, rs2PodHash, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPrePromotionAnalysisDoNothingOnInconclusiveAnalysis(t *testing.T) { @@ -2096,7 +2096,7 @@ func TestAbortRolloutOnErrorPrePromotionAnalysis(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) progressingFalseAborted, _ := newProgressingCondition(conditions.RolloutAbortedReason, r2, "") newConditions := updateConditionsPatch(*r2, progressingFalseAborted) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } func TestCreatePostPromotionAnalysisRun(t *testing.T) { @@ -2143,7 +2143,7 @@ func TestCreatePostPromotionAnalysisRun(t *testing.T) { } } }`, ar.Name) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRolloutPostPromotionAnalysisSuccess(t *testing.T) { @@ -2199,7 +2199,7 @@ func TestRolloutPostPromotionAnalysisSuccess(t *testing.T) { "message": null } }`, rs2PodHash) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } // TestPostPromotionAnalysisRunHandleInconclusive ensures that the Rollout does not scale down a old ReplicaSet if @@ -2264,7 +2264,7 @@ func TestPostPromotionAnalysisRunHandleInconclusive(t *testing.T) { "message": "InconclusiveAnalysisRun" } }`) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { @@ -2334,7 +2334,7 @@ func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) progressingFalseAborted, _ := newProgressingCondition(conditions.RolloutAbortedReason, r2, "") newConditions := updateConditionsPatch(*r2, progressingFalseAborted) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, newConditions, conditions.RolloutAbortedReason, progressingFalseAborted.Message)), patch) } func TestCreateAnalysisRunWithCustomAnalysisRunMetadataAndROCopyLabels(t *testing.T) { diff --git a/rollout/bluegreen_test.go b/rollout/bluegreen_test.go index 42b521a565..cff894e8ca 100644 --- a/rollout/bluegreen_test.go +++ b/rollout/bluegreen_test.go @@ -290,7 +290,7 @@ func TestBlueGreenHandlePause(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchRolloutIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("AddPause", func(t *testing.T) { f := newFixture(t) @@ -334,7 +334,7 @@ func TestBlueGreenHandlePause(t *testing.T) { } }` now := timeutil.Now().UTC().Format(time.RFC3339) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, v1alpha1.PauseReasonBlueGreenPause, now)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, v1alpha1.PauseReasonBlueGreenPause, now)), patch) }) @@ -376,7 +376,7 @@ func TestBlueGreenHandlePause(t *testing.T) { } }` addedConditions := generateConditionsPatchWithPause(true, conditions.RolloutPausedReason, rs2, true, "", true, false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, addedConditions)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, addedConditions)), patch) }) t.Run("NoActionsAfterPausing", func(t *testing.T) { @@ -417,7 +417,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("NoActionsAfterPausedOnInconclusiveRun", func(t *testing.T) { @@ -468,7 +468,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("NoAutoPromoteBeforeDelayTimePasses", func(t *testing.T) { @@ -509,7 +509,7 @@ func TestBlueGreenHandlePause(t *testing.T) { patchIndex := f.expectPatchRolloutActionWithPatch(r2, OnlyObservedGenerationPatch) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) }) t.Run("AutoPromoteAfterDelayTimePasses", func(t *testing.T) { @@ -813,7 +813,7 @@ func TestBlueGreenHandlePause(t *testing.T) { "conditions": %s } }` - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedUnpausePatch, unpauseConditions)), unpausePatch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedUnpausePatch, unpauseConditions)), unpausePatch) generatedConditions := generateConditionsPatchWithCompleted(true, conditions.ReplicaSetUpdatedReason, rs2, true, "", true) expected2ndPatchWithoutSubs := `{ @@ -1453,7 +1453,7 @@ func TestBlueGreenAbort(t *testing.T) { } }`, rs1PodHash, expectedConditions, rs1PodHash, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestBlueGreenHandlePauseAutoPromoteWithConditions(t *testing.T) { diff --git a/rollout/canary_test.go b/rollout/canary_test.go index e3bffff2dd..4adca3fcb9 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -182,7 +182,7 @@ func TestCanaryRolloutEnterPauseState(t *testing.T) { now := timeutil.MetaNow().UTC().Format(time.RFC3339) expectedPatchWithoutObservedGen := fmt.Sprintf(expectedPatchTemplate, v1alpha1.PauseReasonCanaryPauseStep, now, conditions, v1alpha1.PauseReasonCanaryPauseStep) expectedPatch := calculatePatch(r2, expectedPatchWithoutObservedGen) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCanaryRolloutNoProgressWhilePaused(t *testing.T) { @@ -257,7 +257,7 @@ func TestCanaryRolloutUpdatePauseConditionWhilePaused(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(addPausedConditionPatch) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestCanaryRolloutResetProgressDeadlineOnRetry(t *testing.T) { @@ -300,7 +300,7 @@ func TestCanaryRolloutResetProgressDeadlineOnRetry(t *testing.T) { "message": "more replicas need to be updated" } }`, retryCondition) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutIncrementStepAfterUnPaused(t *testing.T) { @@ -342,7 +342,7 @@ func TestCanaryRolloutIncrementStepAfterUnPaused(t *testing.T) { }` generatedConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) expectedPatch := calculatePatch(r2, fmt.Sprintf(expectedPatchTemplate, generatedConditions)) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestCanaryRolloutUpdateStatusWhenAtEndOfSteps(t *testing.T) { @@ -383,7 +383,7 @@ func TestCanaryRolloutUpdateStatusWhenAtEndOfSteps(t *testing.T) { }` expectedPatch := fmt.Sprintf(expectedPatchWithoutStableRS, expectedStableRS, generateConditionsPatchWithCompleted(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", true)) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestResetCurrentStepIndexOnStepChange(t *testing.T) { @@ -426,7 +426,7 @@ func TestResetCurrentStepIndexOnStepChange(t *testing.T) { }` newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, expectedCurrentStepHash, newConditions) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { @@ -467,7 +467,7 @@ func TestResetCurrentStepIndexOnPodSpecChange(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutPodHash, expectedCurrentPodHash, newConditions) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutCreateFirstReplicasetNoSteps(t *testing.T) { @@ -505,7 +505,7 @@ func TestCanaryRolloutCreateFirstReplicasetNoSteps(t *testing.T) { newConditions := generateConditionsPatchWithCompleted(false, conditions.ReplicaSetUpdatedReason, rs, false, "", true) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, newConditions)), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, newConditions)), patch) } func TestCanaryRolloutCreateFirstReplicasetWithSteps(t *testing.T) { @@ -545,7 +545,7 @@ func TestCanaryRolloutCreateFirstReplicasetWithSteps(t *testing.T) { }` expectedPatch := fmt.Sprintf(expectedPatchWithSub, generateConditionsPatchWithCompleted(false, conditions.ReplicaSetUpdatedReason, rs, false, "", true)) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func TestCanaryRolloutCreateNewReplicaWithCorrectWeight(t *testing.T) { @@ -843,7 +843,7 @@ func TestRollBackToStable(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs1, false, "", true) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, hash.ComputePodTemplateHash(&r2.Spec.Template, r2.Status.CollisionCount), newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { @@ -935,7 +935,7 @@ func TestGradualShiftToNewStable(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestRollBackToStableAndStepChange(t *testing.T) { @@ -983,7 +983,7 @@ func TestRollBackToStableAndStepChange(t *testing.T) { newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs1, false, "", true) expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, newPodHash, newStepHash, newConditions) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutIncrementStepIfSetWeightsAreCorrect(t *testing.T) { @@ -1019,7 +1019,7 @@ func TestCanaryRolloutIncrementStepIfSetWeightsAreCorrect(t *testing.T) { } }` newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs3, false, "", false) - assert.Equal(t, calculatePatch(r3, fmt.Sprintf(expectedPatch, newConditions)), patch) + assert.JSONEq(t, calculatePatch(r3, fmt.Sprintf(expectedPatch, newConditions)), patch) } func TestSyncRolloutWaitAddToQueue(t *testing.T) { @@ -1171,7 +1171,7 @@ func TestSyncRolloutWaitIncrementStepIndex(t *testing.T) { "currentStepIndex":2 } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestCanaryRolloutStatusHPAStatusFields(t *testing.T) { @@ -1215,7 +1215,7 @@ func TestCanaryRolloutStatusHPAStatusFields(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRolloutWithoutConditions(index) - assert.Equal(t, calculatePatch(r2, expectedPatchWithSub), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatchWithSub), patch) } func TestCanaryRolloutWithCanaryService(t *testing.T) { @@ -1656,7 +1656,7 @@ func TestCanaryRolloutScaleWhilePaused(t *testing.T) { patch := f.getPatchedRolloutWithoutConditions(patchIndex) expectedPatch := calculatePatch(r2, OnlyObservedGenerationPatch) - assert.Equal(t, expectedPatch, patch) + assert.JSONEq(t, expectedPatch, patch) } func TestResumeRolloutAfterPauseDuration(t *testing.T) { @@ -1756,7 +1756,7 @@ func TestNoResumeAfterPauseDurationIfUserPaused(t *testing.T) { "message": "manually paused" } }` - assert.Equal(t, calculatePatch(r2, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) } func TestHandleNilNewRSOnScaleAndImageChange(t *testing.T) { @@ -1803,7 +1803,7 @@ func TestHandleNilNewRSOnScaleAndImageChange(t *testing.T) { patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } func TestHandleCanaryAbort(t *testing.T) { @@ -1850,10 +1850,10 @@ func TestHandleCanaryAbort(t *testing.T) { }` errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 2) newConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) }) - t.Run("Do not reset currentStepCount if newRS is stableRS", func(t *testing.T) { + t.Run("Do not reset currentStepCount and reset abort if newRS is stableRS", func(t *testing.T) { f := newFixture(t) defer f.Close() @@ -1881,13 +1881,12 @@ func TestHandleCanaryAbort(t *testing.T) { patch := f.getPatchedRollout(patchIndex) expectedPatch := `{ "status":{ - "conditions": %s, - "phase": "Degraded", - "message": "%s: %s" + "abort": null, + "abortedAt": null, + "conditions": %s } }` - errmsg := fmt.Sprintf(conditions.RolloutAbortedMessage, 1) - newConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r1, false, "", true) - assert.Equal(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions, conditions.RolloutAbortedReason, errmsg)), patch) + newConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r1, false, "", true) + assert.JSONEq(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions)), patch) }) } diff --git a/rollout/controller.go b/rollout/controller.go index 5824512271..ebc17c1303 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -56,6 +56,7 @@ import ( logutil "github.com/argoproj/argo-rollouts/utils/log" "github.com/argoproj/argo-rollouts/utils/record" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" + rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" serviceutil "github.com/argoproj/argo-rollouts/utils/service" timeutil "github.com/argoproj/argo-rollouts/utils/time" unstructuredutil "github.com/argoproj/argo-rollouts/utils/unstructured" @@ -520,6 +521,10 @@ func (c *Controller) newRolloutContext(rollout *v1alpha1.Rollout) (*rolloutConte }, reconcilerBase: c.reconcilerBase, } + if rolloututil.IsFullyPromoted(rollout) && roCtx.pauseContext.IsAborted() { + logCtx.Warnf("Removing abort condition from fully promoted rollout") + roCtx.pauseContext.RemoveAbort() + } // carry over existing recorded weights roCtx.newStatus.Canary.Weights = rollout.Status.Canary.Weights return &roCtx, nil diff --git a/rollout/controller_test.go b/rollout/controller_test.go index d37cdc24cd..a637d68f29 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -1346,7 +1346,7 @@ func TestSwitchInvalidSpecMessage(t *testing.T) { expectedPatch := fmt.Sprintf(expectedPatchWithoutSub, progressingCond, string(invalidSpecBytes), conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\"")) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } // TestPodTemplateHashEquivalence verifies the hash is computed consistently when there are slight @@ -1549,7 +1549,7 @@ func TestSwitchBlueGreenToCanary(t *testing.T) { "selector": "foo=bar" } }`, addedConditions, conditions.ComputeStepHash(r)) - assert.Equal(t, calculatePatch(r, expectedPatch), patch) + assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } func newInvalidSpecCondition(reason string, resourceObj runtime.Object, optionalMessage string) (v1alpha1.RolloutCondition, string) { diff --git a/rollout/experiment_test.go b/rollout/experiment_test.go index bcd10cad92..233dd16ca5 100644 --- a/rollout/experiment_test.go +++ b/rollout/experiment_test.go @@ -69,7 +69,7 @@ func TestRolloutCreateExperiment(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestRolloutCreateClusterTemplateExperiment(t *testing.T) { @@ -126,7 +126,7 @@ func TestRolloutCreateClusterTemplateExperiment(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestCreateExperimentWithCollision(t *testing.T) { @@ -178,7 +178,7 @@ func TestCreateExperimentWithCollision(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, createdEx.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, createdEx.Name, conds)), patch) } func TestCreateExperimentWithCollisionAndSemanticEquality(t *testing.T) { @@ -229,7 +229,7 @@ func TestCreateExperimentWithCollisionAndSemanticEquality(t *testing.T) { } }` conds := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, ex.Name, conds)), patch) } func TestRolloutExperimentProcessingDoNothing(t *testing.T) { @@ -267,7 +267,7 @@ func TestRolloutExperimentProcessingDoNothing(t *testing.T) { f.run(getKey(r2, t)) patch := f.getPatchedRollout(patchIndex) - assert.Equal(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) + assert.JSONEq(t, calculatePatch(r2, OnlyObservedGenerationPatch), patch) } @@ -314,7 +314,7 @@ func TestAbortRolloutAfterFailedExperiment(t *testing.T) { }` now := timeutil.Now().UTC().Format(time.RFC3339) generatedConditions := generateConditionsPatch(true, conditions.RolloutAbortedReason, r2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, generatedConditions, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2))), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, now, generatedConditions, conditions.RolloutAbortedReason, fmt.Sprintf(conditions.RolloutAbortedMessage, 2))), patch) } func TestPauseRolloutAfterInconclusiveExperiment(t *testing.T) { @@ -481,7 +481,7 @@ func TestRolloutExperimentFinishedIncrementStep(t *testing.T) { }` generatedConditions := generateConditionsPatch(true, conditions.ReplicaSetUpdatedReason, rs2, false, "", false) - assert.Equal(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, generatedConditions)), patch) + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, generatedConditions)), patch) } func TestRolloutDoNotCreateExperimentWithoutStableRS(t *testing.T) { diff --git a/rollout/service_test.go b/rollout/service_test.go index 393faf87a0..e29ee53b4a 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -144,7 +144,7 @@ func TestActiveServiceNotFound(t *testing.T) { } }` _, pausedCondition := newInvalidSpecCondition(conditions.InvalidSpecReason, notUsedActiveSvc, errmsg) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) } func TestPreviewServiceNotFound(t *testing.T) { @@ -173,7 +173,7 @@ func TestPreviewServiceNotFound(t *testing.T) { } }` _, pausedCondition := newInvalidSpecCondition(conditions.InvalidSpecReason, notUsedPreviewSvc, errmsg) - assert.Equal(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) + assert.JSONEq(t, calculatePatch(r, fmt.Sprintf(expectedPatch, pausedCondition, conditions.InvalidSpecReason, strings.ReplaceAll(errmsg, "\"", "\\\""))), patch) } diff --git a/test/e2e/istio_test.go b/test/e2e/istio_test.go index 2f993f09bc..7ecbd66fdf 100644 --- a/test/e2e/istio_test.go +++ b/test/e2e/istio_test.go @@ -303,7 +303,7 @@ func (s *IstioSuite) TestIstioAbortUpdate() { Then(). When(). AbortRollout(). - WaitForRolloutStatus("Degraded"). + WaitForRolloutStatus("Healthy"). Then(). ExpectRevisionPodCount("1", 1). When(). @@ -316,7 +316,7 @@ func (s *IstioSuite) TestIstioAbortUpdate() { Then(). When(). AbortRollout(). - WaitForRolloutStatus("Degraded"). + WaitForRolloutStatus("Healthy"). Then(). ExpectRevisionPodCount("2", 1) } From b81e4048508e5c244736c79ccccc978e64d7f25d Mon Sep 17 00:00:00 2001 From: Zubair Haque Date: Mon, 2 Oct 2023 16:37:30 -0500 Subject: [PATCH 047/264] chore: updating getCanaryConfigId to be more efficient with better error handling (#3070) updating getCanaryConfigId to be more efficient with better error handling Signed-off-by: zhaque44 --- metricproviders/kayenta/kayenta.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/metricproviders/kayenta/kayenta.go b/metricproviders/kayenta/kayenta.go index 79f47c5f28..b623aa7730 100644 --- a/metricproviders/kayenta/kayenta.go +++ b/metricproviders/kayenta/kayenta.go @@ -67,26 +67,20 @@ func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string { } func getCanaryConfigId(metric v1alpha1.Metric, p *Provider) (string, error) { - configIdLookupURL := fmt.Sprintf(configIdLookupURLFormat, metric.Provider.Kayenta.Address, metric.Provider.Kayenta.Application, metric.Provider.Kayenta.StorageAccountName) response, err := p.client.Get(configIdLookupURL) - if err != nil || response.Body == nil || response.StatusCode != 200 { - if err == nil { - err = errors.New("Invalid Response") - } + if err != nil { return "", err } + defer response.Body.Close() - data, err := io.ReadAll(response.Body) - if err != nil { - return "", err + if response.StatusCode != 200 { + return "", fmt.Errorf("Invalid Response: HTTP %d", response.StatusCode) } var cc []canaryConfig - - err = json.Unmarshal(data, &cc) - if err != nil { + if err := json.NewDecoder(response.Body).Decode(&cc); err != nil { return "", err } @@ -96,7 +90,7 @@ func getCanaryConfigId(metric v1alpha1.Metric, p *Provider) (string, error) { } } - return "", err + return "", errors.New("Canary config not found") } // Run queries kayentd for the metric From 6f5206ff7ef86ec6d05330523b49f73529ca8b28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:37:52 -0500 Subject: [PATCH 048/264] chore(deps): bump github.com/hashicorp/go-plugin from 1.5.1 to 1.5.2 (#3056) Bumps [github.com/hashicorp/go-plugin](https://github.com/hashicorp/go-plugin) from 1.5.1 to 1.5.2. - [Release notes](https://github.com/hashicorp/go-plugin/releases) - [Changelog](https://github.com/hashicorp/go-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-plugin/compare/v1.5.1...v1.5.2) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6fcf264f9c..25a4d14444 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-plugin v1.5.1 + github.com/hashicorp/go-plugin v1.5.2 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 diff --git a/go.sum b/go.sum index f0a32df12b..8b00f1d6f5 100644 --- a/go.sum +++ b/go.sum @@ -402,8 +402,8 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= From 0d93b9705a046f6025324eaf2b73ddd0b06a91c6 Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Wed, 4 Oct 2023 06:14:01 -0700 Subject: [PATCH 049/264] fix: inopportune scaling events would lose some status fields (#3060) fix: inopportune scaling events would result in loss of data Signed-off-by: Jesse Suen --- rollout/sync.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rollout/sync.go b/rollout/sync.go index 98990b4596..f13a3489c7 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -274,10 +274,11 @@ func (c *rolloutContext) syncReplicasOnly() error { if err != nil { return err } + newStatus := c.rollout.Status.DeepCopy() // NOTE: it is possible for newRS to be nil (e.g. when template and replicas changed at same time) if c.rollout.Spec.Strategy.BlueGreen != nil { - previewSvc, activeSvc, err := c.getPreviewAndActiveServices() + _, activeSvc, err := c.getPreviewAndActiveServices() if err != nil { return nil } @@ -286,7 +287,15 @@ func (c *rolloutContext) syncReplicasOnly() error { // so we can abort this resync return err } - return c.syncRolloutStatusBlueGreen(previewSvc, activeSvc) + activeRS, _ := replicasetutil.GetReplicaSetByTemplateHash(c.allRSs, newStatus.BlueGreen.ActiveSelector) + if activeRS != nil { + newStatus.HPAReplicas = activeRS.Status.Replicas + newStatus.AvailableReplicas = activeRS.Status.AvailableReplicas + } else { + // when we do not have an active replicaset, accounting is done on the default rollout selector + newStatus.HPAReplicas = replicasetutil.GetActualReplicaCountForReplicaSets(c.allRSs) + newStatus.AvailableReplicas = replicasetutil.GetAvailableReplicaCountForReplicaSets(c.allRSs) + } } // The controller wants to use the rolloutCanary method to reconcile the rollout if the rollout is not paused. // If there are no scaling events, the rollout should only sync its status @@ -296,9 +305,10 @@ func (c *rolloutContext) syncReplicasOnly() error { // so we can abort this resync return err } - return c.syncRolloutStatusCanary() + newStatus.AvailableReplicas = replicasetutil.GetAvailableReplicaCountForReplicaSets(c.allRSs) + newStatus.HPAReplicas = replicasetutil.GetActualReplicaCountForReplicaSets(c.allRSs) } - return fmt.Errorf("no rollout strategy provided") + return c.persistRolloutStatus(newStatus) } // isScalingEvent checks whether the provided rollout has been updated with a scaling event From 20214b409cce2b2dc4a79b2fef29e9272b51fb90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 08:14:24 -0500 Subject: [PATCH 050/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.42 to 1.18.43 (#3072) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.42 to 1.18.43. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.42...config/v1.18.43) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 25a4d14444..8e9b03f62b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.0 - github.com/aws/aws-sdk-go-v2/config v1.18.42 + github.com/aws/aws-sdk-go-v2/config v1.18.43 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible @@ -82,15 +82,15 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.40 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.41 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect github.com/aws/smithy-go v1.14.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 8b00f1d6f5..764feeed8d 100644 --- a/go.sum +++ b/go.sum @@ -105,10 +105,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/config v1.18.42 h1:28jHROB27xZwU0CB88giDSjz7M1Sba3olb5JBGwina8= -github.com/aws/aws-sdk-go-v2/config v1.18.42/go.mod h1:4AZM3nMMxwlG+eZlxvBKqwVbkDLlnN2a4UGTL6HjaZI= -github.com/aws/aws-sdk-go-v2/credentials v1.13.40 h1:s8yOkDh+5b1jUDhMBtngF6zKWLDs84chUk2Vk0c38Og= -github.com/aws/aws-sdk-go-v2/credentials v1.13.40/go.mod h1:VtEHVAAqDWASwdOqj/1huyT6uHbs5s8FUHfDQdky/Rs= +github.com/aws/aws-sdk-go-v2/config v1.18.43 h1:IgdUtTRvUDC6eiJBqU6vh7bHFNAEBjQ8S+qJ7zVhDOs= +github.com/aws/aws-sdk-go-v2/config v1.18.43/go.mod h1:NiFev8qlgg8MPzw3fO/EwzMZeZwlJEKGwfpjRPA9Nvw= +github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9rmEzEhbZFh9JQW/Bg= +github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= @@ -123,12 +123,12 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeo github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= -github.com/aws/aws-sdk-go-v2/service/sso v1.14.1 h1:YkNzx1RLS0F5qdf9v1Q8Cuv9NXCL2TkosOxhzlUPV64= -github.com/aws/aws-sdk-go-v2/service/sso v1.14.1/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 h1:vuGK1vHNP9zx0PfOrtPumbwR2af0ATQ1Z2H6p75AgRQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= -github.com/aws/aws-sdk-go-v2/service/sts v1.22.0 h1:s4bioTgjSFRwOoyEFzAVCmFmoowBgjTR8gkrF/sQ4wk= -github.com/aws/aws-sdk-go-v2/service/sts v1.22.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 83fe97978020b1eff1defe4d2ad822eceb8395da Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 5 Oct 2023 08:14:05 -0600 Subject: [PATCH 051/264] fix: sync notification controller configmaps/secrets first (#3075) sync notification controller configmaps/secrets first before starting other informers Signed-off-by: zachaller --- controller/controller.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 5429cfe743..afe4bc769b 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -463,6 +463,12 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT // Start the informer factories to begin populating the informer caches log.Info("Starting Controllers") + c.notificationConfigMapInformerFactory.Start(ctx.Done()) + c.notificationSecretInformerFactory.Start(ctx.Done()) + if ok := cache.WaitForCacheSync(ctx.Done(), c.configMapSynced, c.secretSynced); !ok { + log.Fatalf("failed to wait for configmap/secret caches to sync, exiting") + } + // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // Start method is non-blocking and runs all registered informers in a dedicated goroutine. c.dynamicInformerFactory.Start(ctx.Done()) @@ -471,9 +477,6 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT } c.kubeInformerFactory.Start(ctx.Done()) - c.notificationConfigMapInformerFactory.Start(ctx.Done()) - c.notificationSecretInformerFactory.Start(ctx.Done()) - c.jobInformerFactory.Start(ctx.Done()) // Check if Istio installed on cluster before starting dynamicInformerFactory From ba7c9a5a1b18e83a2a5675f97d67347cd493e597 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 5 Oct 2023 10:30:50 -0600 Subject: [PATCH 052/264] fix: missing notification on error (#3076) * fix: missing notification on error Signed-off-by: zachaller * fix tests Signed-off-by: zachaller * aggregate errors Signed-off-by: zachaller * fix bad stat counts Signed-off-by: zachaller * return errors Signed-off-by: zachaller * fix tests on return of errors Signed-off-by: zachaller * change case on logs Signed-off-by: zachaller * missed a case Signed-off-by: zachaller --------- Signed-off-by: zachaller --- utils/record/record.go | 40 ++++++++++++++++++++++++------------- utils/record/record_test.go | 14 ++++++------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/utils/record/record.go b/utils/record/record.go index d2bd322acf..859b954390 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -218,9 +218,7 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o err := e.sendNotifications(api, object, opts) if err != nil { logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) - e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } } @@ -248,7 +246,7 @@ func NewAPIFactorySettings() api.Settings { } // Send notifications for triggered event if user is subscribed -func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) error { +func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, object runtime.Object, opts EventOptions) []error { logCtx := logutil.WithObject(object) _, namespace, name := logutil.KindNamespaceName(logCtx) startTime := timeutil.Now() @@ -259,7 +257,7 @@ func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, objec }() if notificationsAPI == nil { - return fmt.Errorf("notificationsAPI is nil") + return []error{fmt.Errorf("NotificationsAPI is nil")} } cfg := notificationsAPI.GetConfig() @@ -274,39 +272,53 @@ func (e *EventRecorderAdapter) sendNotifications(notificationsAPI api.API, objec objMap, err := toObjectMap(object) if err != nil { - return err + return []error{err} } emptyCondition := hash("") + // We should not return in these loops because we want other configured notifications to still send if they can. + errors := []error{} for _, destination := range destinations { res, err := notificationsAPI.RunTrigger(trigger, objMap) if err != nil { - log.Errorf("Failed to execute condition of trigger %s: %v", trigger, err) - return err + log.Errorf("Failed to run trigger, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + errors = append(errors, err) + continue } log.Infof("Trigger %s result: %v", trigger, res) for _, c := range res { - log.Infof("Res When Condition hash: %s, Templates: %s", c.Key, c.Templates) + log.Infof("Result when condition hash: %s, templates: %s", c.Key, c.Templates) s := strings.Split(c.Key, ".")[1] if s != emptyCondition && c.Triggered == true { err = notificationsAPI.Send(objMap, c.Templates, destination) if err != nil { - log.Errorf("notification error: %s", err.Error()) - return err + log.Errorf("Failed to execute the sending of notification on not empty condition, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + errors = append(errors, err) + continue } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } else if s == emptyCondition { err = notificationsAPI.Send(objMap, c.Templates, destination) if err != nil { - log.Errorf("notification error: %s", err.Error()) - return err + log.Errorf("Failed to execute the sending of notification on empty condition, trigger: %s, destination: %s, namespace config: %s : %v", + trigger, destination, notificationsAPI.GetConfig().Namespace, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + errors = append(errors, err) + continue } + e.NotificationSuccessCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } } } - - return nil + if len(errors) == 0 { + return nil + } + return errors } // This function is copied over from notification engine to make sure we honour emptyCondition diff --git a/utils/record/record_test.go b/utils/record/record_test.go index 6c494a3ac7..97f4452441 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -113,7 +113,7 @@ func TestSendNotifications(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.NoError(t, err) + assert.Nil(t, err) } func TestSendNotificationsWhenCondition(t *testing.T) { @@ -140,7 +140,7 @@ func TestSendNotificationsWhenCondition(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory //ch := make(chan prometheus.HistogramVec, 1) err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.NoError(t, err) + assert.Nil(t, err) } func TestSendNotificationsWhenConditionTime(t *testing.T) { @@ -340,7 +340,7 @@ func TestSendNotificationsFails(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) }) t.Run("GetAPIError", func(t *testing.T) { @@ -349,7 +349,7 @@ func TestSendNotificationsFails(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.NotNil(t, err) }) } @@ -380,7 +380,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) }) t.Run("GetAPIError", func(t *testing.T) { @@ -389,7 +389,7 @@ func TestSendNotificationsFailsWithRunTriggerError(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(nil, &r, EventOptions{EventReason: "FooReason"}) - assert.Error(t, err) + assert.NotNil(t, err) }) } @@ -419,7 +419,7 @@ func TestSendNotificationsNoTrigger(t *testing.T) { rec.EventRecorderAdapter.apiFactory = apiFactory err := rec.sendNotifications(mockAPI, &r, EventOptions{EventReason: "MissingReason"}) - assert.Error(t, err) + assert.Len(t, err, 1) } func TestNewAPIFactorySettings(t *testing.T) { From 8985fd8923423b8e61fe065c4e19cd240067db68 Mon Sep 17 00:00:00 2001 From: "Yuan (Terry) Tang" Date: Mon, 9 Oct 2023 18:56:48 -0400 Subject: [PATCH 053/264] fix: Replace antonmedv/expr with expr-lang/expr (#3090) Signed-off-by: Yuan Tang --- go.mod | 1 + go.sum | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 8e9b03f62b..dcf303cccb 100644 --- a/go.mod +++ b/go.mod @@ -199,6 +199,7 @@ require ( ) replace ( + github.com/antonmedv/expr => github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7 github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 k8s.io/api v0.0.0 => k8s.io/api v0.25.8 k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.25.8 diff --git a/go.sum b/go.sum index 764feeed8d..6aa0f675cf 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= -github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= @@ -210,6 +208,8 @@ github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0n github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7 h1:Sg2XxaymeyqqaLG34aB2mvlX+nii916/Gv1ovWc4jMc= +github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= From d8a62566995059338ebbfe7b87162ed3b6ed14d2 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 11 Oct 2023 07:04:30 -0600 Subject: [PATCH 054/264] fix: revert repo change to expr (#3094) revert repo change to expr Signed-off-by: zachaller --- go.mod | 1 - go.sum | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dcf303cccb..8e9b03f62b 100644 --- a/go.mod +++ b/go.mod @@ -199,7 +199,6 @@ require ( ) replace ( - github.com/antonmedv/expr => github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7 github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 k8s.io/api v0.0.0 => k8s.io/api v0.25.8 k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.25.8 diff --git a/go.sum b/go.sum index 6aa0f675cf..764feeed8d 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= +github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= @@ -208,8 +210,6 @@ github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0n github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= -github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7 h1:Sg2XxaymeyqqaLG34aB2mvlX+nii916/Gv1ovWc4jMc= -github.com/expr-lang/expr v0.0.0-20230912141041-709c5dd55aa7/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= From 8d6d4260b482ba23b130d7c466bdc3eb67c773f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 08:28:40 -0500 Subject: [PATCH 055/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.7 to 1.27.8 (#3086) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.7 to 1.27.8. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.7...service/s3/v1.27.8) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 16 ++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 8e9b03f62b..546e3c00b1 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.21.0 + github.com/aws/aws-sdk-go-v2 v1.21.1 github.com/aws/aws-sdk-go-v2/config v1.18.43 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 @@ -84,14 +84,14 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.41 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect - github.com/aws/smithy-go v1.14.2 // indirect + github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 764feeed8d..5f95f72576 100644 --- a/go.sum +++ b/go.sum @@ -103,22 +103,25 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.21.0 h1:gMT0IW+03wtYJhRqTVYn0wLzwdnK9sRMcxmtfGzRdJc= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= +github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= +github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.18.43 h1:IgdUtTRvUDC6eiJBqU6vh7bHFNAEBjQ8S+qJ7zVhDOs= github.com/aws/aws-sdk-go-v2/config v1.18.43/go.mod h1:NiFev8qlgg8MPzw3fO/EwzMZeZwlJEKGwfpjRPA9Nvw= github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9rmEzEhbZFh9JQW/Bg= github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41 h1:22dGT7PneFMx4+b3pz7lMTRyN8ZKH7M2cW4GP9yUS2g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35 h1:SijA0mgjV8E+8G45ltVHs0fvKpTj8xmZJ3VwhGKtUSI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7 h1:qULF+ElcvjjSEO1+z5x+TmKE9d4yTej7PfpJQPVvexY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.7/go.mod h1:1HKxVrj5wsKy/wb2v07vzTSd+YPV1sDsWxferwPK7PA= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 h1:pdUFDCmsKlwEwVJyq/k3xLBtS/sym3dhBMTCIEDaN40= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8/go.mod h1:EwMPL+Fu95r6yS2UQY99lRR1rDjgCbcPQpy1aQ3fuxE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= @@ -129,8 +132,9 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaK github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= -github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From c2285545de62cfd5c5aeb8e1e79fd9b2c72661a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Oct 2023 08:28:59 -0500 Subject: [PATCH 056/264] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.21.0 to 1.21.1 (#3085) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.21.0 to 1.21.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.21.0...v1.21.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From e788a01369873737fe556f8472b6a011133f2d1e Mon Sep 17 00:00:00 2001 From: PranitRout07 Date: Wed, 11 Oct 2023 18:59:53 +0530 Subject: [PATCH 057/264] docs: Ensure image not present between incomplete sentence. (#3079) * Update anti-affinity.md * Update mkdocs.yml --- docs/features/anti-affinity/anti-affinity.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/features/anti-affinity/anti-affinity.md b/docs/features/anti-affinity/anti-affinity.md index 3c46171d70..2a547c9c07 100644 --- a/docs/features/anti-affinity/anti-affinity.md +++ b/docs/features/anti-affinity/anti-affinity.md @@ -31,6 +31,7 @@ You can learn more about anti-affinity [here](https://kubernetes.io/docs/concept Repeating the above example with anti-affinity enabled, here is what happens when the `.spec.template` of the Rollout changes. Due to anti-affinity, the new pods cannot be scheduled on nodes which run the old ReplicaSet's pods. As a result, the cluster auto-scaler must create 2 nodes to host the new ReplicaSet's pods. In this case, pods won't be started since the scaled-down nodes are guaranteed to not have the new pods. + ![ Original Rollout is running, spread across two nodes](images/solution.png) ## Enabling Anti-Affinity in Rollouts From 017d362781ef0a2642902c2dbec1870360561221 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 11 Oct 2023 14:38:45 -0600 Subject: [PATCH 058/264] fix: bump notification-engine to fix double send on self server notifications (#3095) * bump notification-engine to fix double send on self server notifications Signed-off-by: zachaller * codegen Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .../generated/notification-services/awssqs.md | 106 ++++++++++++++++++ .../generated/notification-services/github.md | 11 +- .../notification-services/googlechat.md | 19 ++-- .../notification-services/grafana.md | 6 + .../notification-services/overview.md | 1 + docs/generated/notification-services/slack.md | 82 +++++++------- go.mod | 12 +- go.sum | 43 +++++-- mkdocs.yml | 1 + 9 files changed, 220 insertions(+), 61 deletions(-) create mode 100755 docs/generated/notification-services/awssqs.md diff --git a/docs/generated/notification-services/awssqs.md b/docs/generated/notification-services/awssqs.md new file mode 100755 index 0000000000..6bbc47cbbc --- /dev/null +++ b/docs/generated/notification-services/awssqs.md @@ -0,0 +1,106 @@ +# AWS SQS + +## Parameters + +This notification service is capable of sending simple messages to AWS SQS queue. + +* `queue` - name of the queue you are intending to send messages to. Can be overwriten with target destination annotation. +* `region` - region of the sqs queue can be provided via env variable AWS_DEFAULT_REGION +* `key` - optional, aws access key must be either referenced from a secret via variable or via env variable AWS_ACCESS_KEY_ID +* `secret` - optional, aws access secret must be either referenced from a secret via variableor via env variable AWS_SECRET_ACCESS_KEY +* `account` optional, external accountId of the queue +* `endpointUrl` optional, useful for development with localstack + +## Example + +### Using Secret for credential retrieval: + +Resource Annotation: +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + annotations: + notifications.argoproj.io/subscribe.on-deployment-ready.awssqs: "overwrite-myqueue" +``` + +* ConfigMap +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.awssqs: | + region: "us-east-2" + queue: "myqueue" + account: "1234567" + key: "$awsaccess_key" + secret: "$awsaccess_secret" + + template.deployment-ready: | + message: | + Deployment {{.obj.metadata.name}} is ready! + + trigger.on-deployment-ready: | + - when: any(obj.status.conditions, {.type == 'Available' && .status == 'True'}) + send: [deployment-ready] + - oncePer: obj.metadata.annotations["generation"] + +``` + Secret +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: +stringData: + awsaccess_key: test + awsaccess_secret: test +``` + + +### Minimal configuration using AWS Env variables + +Ensure following list of enviromental variable is injected via OIDC, or other method. And assuming SQS is local to the account. +You may skip usage of secret for sensitive data and omit other parameters. (Setting parameters via ConfigMap takes precedent.) + +Variables: + +```bash +export AWS_ACCESS_KEY_ID="test" +export AWS_SECRET_ACCESS_KEY="test" +export AWS_DEFAULT_REGION="us-east-1" +``` + +Resource Annotation: +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + annotations: + notifications.argoproj.io/subscribe.on-deployment-ready.awssqs: "" +``` + +* ConfigMap +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: +data: + service.awssqs: | + queue: "myqueue" + + template.deployment-ready: | + message: | + Deployment {{.obj.metadata.name}} is ready! + + trigger.on-deployment-ready: | + - when: any(obj.status.conditions, {.type == 'Available' && .status == 'True'}) + send: [deployment-ready] + - oncePer: obj.metadata.annotations["generation"] + +``` diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index c24ea00f43..913efef6ec 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -12,7 +12,7 @@ The GitHub notification service changes commit status using [GitHub Apps](https: ## Configuration 1. Create a GitHub Apps using https://github.com/settings/apps/new -2. Change repository permissions to enable write commit statuses and/or deployments +2. Change repository permissions to enable write commit statuses and/or deployments and/or pull requests comments ![2](https://user-images.githubusercontent.com/18019529/108397381-3ca57980-725b-11eb-8d17-5b8992dc009e.png) 3. Generate a private key, and download it automatically ![3](https://user-images.githubusercontent.com/18019529/108397926-d4a36300-725b-11eb-83fe-74795c8c3e03.png) @@ -75,8 +75,17 @@ template.app-deployed: | environmentURL: "https://{{.app.metadata.name}}.example.com" logURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" requiredContexts: [] + autoMerge: true + pullRequestComment: + content: | + Application {{.app.metadata.name}} is now running new version of deployments manifests. + See more here: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true ``` **Notes**: - If the message is set to 140 characters or more, it will be truncated. - If `github.repoURLPath` and `github.revisionPath` are same as above, they can be omitted. +- Automerge is optional and `true` by default for github deployments to ensure the requested ref is up to date with the default branch. + Setting this option to `false` is required if you would like to deploy older refs in your default branch. + For more information see the [Github Deployment API Docs](https://docs.github.com/en/rest/deployments/deployments?apiVersion=2022-11-28#create-a-deployment). +- If `github.pullRequestComment.content` is set to 65536 characters or more, it will be truncated. diff --git a/docs/generated/notification-services/googlechat.md b/docs/generated/notification-services/googlechat.md index 041ea6e022..fa3bdce8da 100755 --- a/docs/generated/notification-services/googlechat.md +++ b/docs/generated/notification-services/googlechat.md @@ -59,24 +59,27 @@ A card message can be defined as follows: ```yaml template.app-sync-succeeded: | googlechat: - cards: | + cardsV2: | - header: title: ArgoCD Bot Notification sections: - widgets: - - textParagraph: + - decoratedText: text: The app {{ .app.metadata.name }} has successfully synced! - widgets: - - keyValue: + - decoratedText: topLabel: Repository - content: {{ call .repo.RepoURLToHTTPS .app.spec.source.repoURL }} - - keyValue: + text: {{ call .repo.RepoURLToHTTPS .app.spec.source.repoURL }} + - decoratedText: topLabel: Revision - content: {{ .app.spec.source.targetRevision }} - - keyValue: + text: {{ .app.spec.source.targetRevision }} + - decoratedText: topLabel: Author - content: {{ (call .repo.GetCommitMetadata .app.status.sync.revision).Author }} + text: {{ (call .repo.GetCommitMetadata .app.status.sync.revision).Author }} ``` +All [Card fields](https://developers.google.com/chat/api/reference/rest/v1/cards#Card_1) are supported and can be used +in notifications. It is also possible to use the previous (now deprecated) `cards` key to use the legacy card fields, +but this is not recommended as Google has deprecated this field and recommends using the newer `cardsV2`. The card message can be written in JSON too. diff --git a/docs/generated/notification-services/grafana.md b/docs/generated/notification-services/grafana.md index ff567b71c1..a36672d0fa 100755 --- a/docs/generated/notification-services/grafana.md +++ b/docs/generated/notification-services/grafana.md @@ -4,6 +4,12 @@ To be able to create Grafana annotation with argocd-notifications you have to cr ![sample](https://user-images.githubusercontent.com/18019529/112024976-0f106080-8b78-11eb-9658-7663305899be.png) +Available parameters : + +* `apiURL` - the server url, e.g. https://grafana.example.com +* `apiKey` - the API key for the serviceaccount +* `insecureSkipVerify` - optional bool, true or false + 1. Login to your Grafana instance as `admin` 2. On the left menu, go to Configuration / API Keys 3. Click "Add API Key" diff --git a/docs/generated/notification-services/overview.md b/docs/generated/notification-services/overview.md index 15e674f654..265e575755 100755 --- a/docs/generated/notification-services/overview.md +++ b/docs/generated/notification-services/overview.md @@ -38,6 +38,7 @@ metadata: ## Service Types +* [AwsSqs](./awssqs.md) * [Email](./email.md) * [GitHub](./github.md) * [Slack](./slack.md) diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 876445bfec..15937597c1 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -29,56 +29,56 @@ The Slack notification service configuration includes following settings: 1. Invite your slack bot to this channel **otherwise slack bot won't be able to deliver notifications to this channel** 1. Store Oauth access token in `argocd-notifications-secret` secret -```yaml - apiVersion: v1 - kind: Secret - metadata: - name: - stringData: - slack-token: -``` + ```yaml + apiVersion: v1 + kind: Secret + metadata: + name: + stringData: + slack-token: + ``` 1. Define service type slack in data section of `argocd-notifications-cm` configmap: -```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: - data: - service.slack: | - token: $slack-token -``` + ```yaml + apiVersion: v1 + kind: ConfigMap + metadata: + name: + data: + service.slack: | + token: $slack-token + ``` 1. Add annotation in application yaml file to enable notifications for specific argocd app. The following example uses the [on-sync-succeeded trigger](../catalog.md#triggers): -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel -``` + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel + ``` 1. Annotation with more than one [trigger](../catalog.md#triggers), with multiple destinations and recipients -```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Application - metadata: - annotations: - notifications.argoproj.io/subscriptions: | - - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] - destinations: - - service: slack - recipients: [my-channel-1, my-channel-2] - - service: email - recipients: [recipient-1, recipient-2, recipient-3 ] - - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] - destinations: - - service: slack - recipients: [my-channel-21, my-channel-22] -``` + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscriptions: | + - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed] + destinations: + - service: slack + recipients: [my-channel-1, my-channel-2] + - service: email + recipients: [recipient-1, recipient-2, recipient-3 ] + - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error] + destinations: + - service: slack + recipients: [my-channel-21, my-channel-22] + ``` ## Templates diff --git a/go.mod b/go.mod index 546e3c00b1..960313468e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/antonmedv/expr v1.15.3 - github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 + github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.1 github.com/aws/aws-sdk-go-v2/config v1.18.43 @@ -88,6 +88,7 @@ require ( github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect @@ -120,10 +121,13 @@ require ( github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/gregdel/pushover v1.1.0 // indirect + github.com/gregdel/pushover v1.2.1 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v0.14.1 // indirect @@ -162,7 +166,7 @@ require ( github.com/prometheus/procfs v0.10.1 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/slack-go/slack v0.12.2 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect @@ -170,6 +174,7 @@ require ( github.com/valyala/fastjson v1.6.3 // indirect github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect github.com/xlab/treeprint v1.1.0 // indirect + go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/crypto v0.11.0 // indirect golang.org/x/mod v0.8.0 // indirect @@ -182,6 +187,7 @@ require ( golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect + google.golang.org/api v0.132.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect diff --git a/go.sum b/go.sum index 5f95f72576..921fda31fc 100644 --- a/go.sum +++ b/go.sum @@ -94,8 +94,8 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902 h1:JnW6RNwSxFwf4qQf3d6n+LhTODzmrLpDx2mQMPYzKf8= -github.com/argoproj/notifications-engine v0.4.1-0.20230712163936-39dfcb66f902/go.mod h1:W//xreL6/AGmJdh6SyvmJhOZ1VweW6DBm8qSBx7NO1M= +github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee h1:ZYILioq4v6OIsr7uh0Pcx7JY4KpJ9qs8qbjRqM6HWMY= +github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee/go.mod h1:VG9FXG0ddIVGc7NcSTRapaUjCPCYqOji//z6mmBYwCE= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -103,6 +103,7 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= @@ -112,9 +113,11 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9r github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= @@ -126,12 +129,15 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeo github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 h1:vuGK1vHNP9zx0PfOrtPumbwR2af0ATQ1Z2H6p75AgRQ= github.com/aws/aws-sdk-go-v2/service/sso v1.15.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= @@ -170,7 +176,11 @@ github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEM github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -205,6 +215,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -222,7 +233,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= @@ -344,6 +355,7 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -372,14 +384,20 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -392,8 +410,8 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregdel/pushover v1.1.0 h1:dwHyvrcpZCOS9V1fAnKPaGRRI5OC55cVaKhMybqNsKQ= -github.com/gregdel/pushover v1.1.0/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to= +github.com/gregdel/pushover v1.2.1 h1:IPPJCdzXz60gMqnlzS0ZAW5z5aS1gI4nU+YM0Pe+ssA= +github.com/gregdel/pushover v1.2.1/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER1PthX7to= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -627,8 +645,8 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= @@ -658,8 +676,8 @@ github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDv github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= @@ -685,6 +703,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= @@ -721,6 +740,8 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= @@ -739,6 +760,7 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= @@ -948,6 +970,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= @@ -1041,6 +1064,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= +google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1099,8 +1124,10 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/mkdocs.yml b/mkdocs.yml index 471359c778..8506973d4f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,7 @@ nav: - Overview: features/notifications.md - Services: - generated/notification-services/alertmanager.md + - generated/notification-services/awssqs.md - generated/notification-services/email.md - generated/notification-services/github.md - generated/notification-services/googlechat.md From 28d9502321c8ca2c790b40b25b2239e8737ac235 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 12 Oct 2023 13:00:01 -0600 Subject: [PATCH 059/264] fix: keep rs informer updated (#3091) * keep rs informer updated Signed-off-by: zachaller * correct bad log Signed-off-by: zachaller * add error context Signed-off-by: zachaller --------- Signed-off-by: zachaller --- rollout/controller.go | 3 ++- rollout/replicaset.go | 4 +++- rollout/replicaset_test.go | 21 +++++++++++++++++---- rollout/sync.go | 10 +++++++++- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/rollout/controller.go b/rollout/controller.go index ebc17c1303..1d7d8cde92 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -132,6 +132,7 @@ type reconcilerBase struct { replicaSetSynced cache.InformerSynced rolloutsInformer cache.SharedIndexInformer rolloutsLister listers.RolloutLister + replicaSetInformer cache.SharedIndexInformer rolloutsSynced cache.InformerSynced rolloutsIndexer cache.Indexer servicesLister v1.ServiceLister @@ -176,7 +177,6 @@ func NewController(cfg ControllerConfig) *Controller { controllerutil.EnqueueAfter(obj, duration, cfg.RolloutWorkQueue) }, } - base := reconcilerBase{ kubeclientset: cfg.KubeClientSet, argoprojclientset: cfg.ArgoProjClientset, @@ -185,6 +185,7 @@ func NewController(cfg ControllerConfig) *Controller { replicaSetLister: cfg.ReplicaSetInformer.Lister(), replicaSetSynced: cfg.ReplicaSetInformer.Informer().HasSynced, rolloutsInformer: cfg.RolloutsInformer.Informer(), + replicaSetInformer: cfg.ReplicaSetInformer.Informer(), rolloutsIndexer: cfg.RolloutsInformer.Informer().GetIndexer(), rolloutsLister: cfg.RolloutsInformer.Lister(), rolloutsSynced: cfg.RolloutsInformer.Informer().HasSynced, diff --git a/rollout/replicaset.go b/rollout/replicaset.go index dceff65aa0..fad23e756e 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -35,6 +35,7 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) if err == nil { c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) + c.replicaSetInformer.GetIndexer().Update(rs) } return err } @@ -56,9 +57,10 @@ func (c *rolloutContext) addScaleDownDelay(rs *appsv1.ReplicaSet, scaleDownDelay } deadline := timeutil.MetaNow().Add(scaleDownDelaySeconds).UTC().Format(time.RFC3339) patch := fmt.Sprintf(addScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, deadline) - _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) + rs, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) if err == nil { c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) + c.replicaSetInformer.GetIndexer().Update(rs) } return err } diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index 26b05b5b54..10c1dc0893 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -195,16 +195,29 @@ func TestReconcileNewReplicaSet(t *testing.T) { rollout := newBlueGreenRollout("foo", test.rolloutReplicas, nil, "", "") fake := fake.Clientset{} k8sfake := k8sfake.Clientset{} + + f := newFixture(t) + defer f.Close() + f.objects = append(f.objects, rollout) + f.replicaSetLister = append(f.replicaSetLister, oldRS, newRS) + f.kubeobjects = append(f.kubeobjects, oldRS, newRS) + _, informers, k8sInformer := f.newController(noResyncPeriodFunc) + stopCh := make(chan struct{}) + informers.Start(stopCh) + informers.WaitForCacheSync(stopCh) + close(stopCh) + roCtx := rolloutContext{ log: logutil.WithRollout(rollout), rollout: rollout, newRS: newRS, stableRS: oldRS, reconcilerBase: reconcilerBase{ - argoprojclientset: &fake, - kubeclientset: &k8sfake, - recorder: record.NewFakeEventRecorder(), - resyncPeriod: 30 * time.Second, + argoprojclientset: &fake, + kubeclientset: &k8sfake, + recorder: record.NewFakeEventRecorder(), + resyncPeriod: 30 * time.Second, + replicaSetInformer: k8sInformer.Apps().V1().ReplicaSets().Informer(), }, pauseContext: &pauseContext{ rollout: rollout, diff --git a/rollout/sync.go b/rollout/sync.go index f13a3489c7..25c0c14813 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -85,7 +85,14 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { if annotationsUpdated || minReadySecondsNeedsUpdate || affinityNeedsUpdate { rsCopy.Spec.MinReadySeconds = c.rollout.Spec.MinReadySeconds rsCopy.Spec.Template.Spec.Affinity = replicasetutil.GenerateReplicaSetAffinity(*c.rollout) - return c.kubeclientset.AppsV1().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) + rs, err := c.kubeclientset.AppsV1().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) + if err != nil { + c.log.WithError(err).Error("Error: updating replicaset revision") + return nil, fmt.Errorf("error updating replicaset revision: %v", err) + } + c.log.Infof("Synced revision on ReplicaSet '%s' to '%s'", rs.Name, newRevision) + c.replicaSetInformer.GetIndexer().Update(rs) + return rs, nil } // Should use the revision in existingNewRS's annotation, since it set by before @@ -370,6 +377,7 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, scaled = true revision, _ := replicasetutil.Revision(rs) c.recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.ScalingReplicaSetReason}, conditions.ScalingReplicaSetMessage, scalingOperation, rs.Name, revision, oldScale, newScale) + c.replicaSetInformer.GetIndexer().Update(rs) } } return scaled, rs, err From a3dfd56548e47b3689cdfedc9425399b9856af42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 14:00:20 -0500 Subject: [PATCH 060/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.43 to 1.18.44 (#3099) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.43 to 1.18.44. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.43...config/v1.18.44) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 960313468e..5f235803b0 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.1 - github.com/aws/aws-sdk-go-v2/config v1.18.43 + github.com/aws/aws-sdk-go-v2/config v1.18.44 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible @@ -82,16 +82,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.41 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.42 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 // indirect github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 921fda31fc..28a9b2f2cd 100644 --- a/go.sum +++ b/go.sum @@ -107,12 +107,12 @@ github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3eP github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.18.43 h1:IgdUtTRvUDC6eiJBqU6vh7bHFNAEBjQ8S+qJ7zVhDOs= -github.com/aws/aws-sdk-go-v2/config v1.18.43/go.mod h1:NiFev8qlgg8MPzw3fO/EwzMZeZwlJEKGwfpjRPA9Nvw= -github.com/aws/aws-sdk-go-v2/credentials v1.13.41 h1:dgbKq1tamtboYAKSXWbqL0lKO9rmEzEhbZFh9JQW/Bg= -github.com/aws/aws-sdk-go-v2/credentials v1.13.41/go.mod h1:cc3Fn7DkKbJalPtQnudHGZZ8ml9+hwtbc1CJONsYYqk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11 h1:uDZJF1hu0EVT/4bogChk8DyjSF6fof6uL/0Y26Ma7Fg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.11/go.mod h1:TEPP4tENqBGO99KwVpV9MlOX4NSrSLP8u3KRy2CDwA8= +github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= +github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= +github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= +github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= @@ -121,22 +121,22 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43 h1:g+qlObJH4Kn4n21g69DjspU0hKTjWtq7naZ9OLCv0ew= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.43/go.mod h1:rzfdUlfA+jdgLDmPKjd3Chq9V7LVLYo1Nz++Wb91aRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 h1:pdUFDCmsKlwEwVJyq/k3xLBtS/sym3dhBMTCIEDaN40= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8/go.mod h1:EwMPL+Fu95r6yS2UQY99lRR1rDjgCbcPQpy1aQ3fuxE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35 h1:CdzPW9kKitgIiLV1+MHobfR5Xg25iYnyzWZhyQuSlDI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.35/go.mod h1:QGF2Rs33W5MaN9gYdEQOBBFPLwTZkEhRwI33f7KIG0o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.0 h1:vuGK1vHNP9zx0PfOrtPumbwR2af0ATQ1Z2H6p75AgRQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.0/go.mod h1:fIAwKQKBFu90pBxx07BFOMJLpRUGu8VOzLJakeY+0K4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1 h1:8lKOidPkmSmfUtiTgtdXWgaKItCZ/g75/jEk6Ql6GsA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.1/go.mod h1:yygr8ACQRY2PrEcy3xsUI357stq2AxnFM6DIsR9lij4= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.0 h1:pyvfUqkNLMipdKNAtu7OVbRxUrR2BMaKccIPpk/Hkak= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.0/go.mod h1:VC7JDqsqiwXukYEDjoHh9U0fOJtNWh04FPQz4ct4GGU= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 h1:ASNYk1ypWAxRhJjKS0jBnTUeDl7HROOpeSMu1xDA/I8= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= From db567aaf6f89a718dfd381383cb05aea63735dae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Oct 2023 14:00:41 -0500 Subject: [PATCH 061/264] chore(deps): bump google.golang.org/grpc from 1.58.2 to 1.58.3 (#3098) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.58.2 to 1.58.3. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.58.2...v1.58.3) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f235803b0..6d5a1d7515 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 - google.golang.org/grpc v1.58.2 + google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 diff --git a/go.sum b/go.sum index 28a9b2f2cd..e0641f0d22 100644 --- a/go.sum +++ b/go.sum @@ -1128,8 +1128,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= -google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 6d58a42409c2f2ff908755d23693ba419463b794 Mon Sep 17 00:00:00 2001 From: AS <11219262+ashutosh16@users.noreply.github.com> Date: Fri, 13 Oct 2023 06:55:48 -0700 Subject: [PATCH 062/264] chore: add missing rollout fields (#3062) * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * chores: add missing rollout fields Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> --------- Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> --- pkg/apiclient/rollout/rollout.pb.go | 573 +++++-- pkg/apiclient/rollout/rollout.proto | 10 + pkg/apiclient/rollout/rollout.swagger.json | 905 +++++++++- .../info/analysisrun_info.go | 6 + ui/src/models/rollout/generated/api.ts | 1487 +++++++++++++++-- 5 files changed, 2695 insertions(+), 286 deletions(-) diff --git a/pkg/apiclient/rollout/rollout.pb.go b/pkg/apiclient/rollout/rollout.pb.go index 4f36576290..54e4c099a2 100644 --- a/pkg/apiclient/rollout/rollout.pb.go +++ b/pkg/apiclient/rollout/rollout.pb.go @@ -1380,28 +1380,87 @@ func (m *JobInfo) GetStartedAt() *v1.Time { return nil } +type AnalysisRunSpecAndStatus struct { + Spec *v1alpha1.AnalysisRunSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` + Status *v1alpha1.AnalysisRunStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AnalysisRunSpecAndStatus) Reset() { *m = AnalysisRunSpecAndStatus{} } +func (m *AnalysisRunSpecAndStatus) String() string { return proto.CompactTextString(m) } +func (*AnalysisRunSpecAndStatus) ProtoMessage() {} +func (*AnalysisRunSpecAndStatus) Descriptor() ([]byte, []int) { + return fileDescriptor_99101d942e8912a7, []int{18} +} +func (m *AnalysisRunSpecAndStatus) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AnalysisRunSpecAndStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AnalysisRunSpecAndStatus.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AnalysisRunSpecAndStatus) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnalysisRunSpecAndStatus.Merge(m, src) +} +func (m *AnalysisRunSpecAndStatus) XXX_Size() int { + return m.Size() +} +func (m *AnalysisRunSpecAndStatus) XXX_DiscardUnknown() { + xxx_messageInfo_AnalysisRunSpecAndStatus.DiscardUnknown(m) +} + +var xxx_messageInfo_AnalysisRunSpecAndStatus proto.InternalMessageInfo + +func (m *AnalysisRunSpecAndStatus) GetSpec() *v1alpha1.AnalysisRunSpec { + if m != nil { + return m.Spec + } + return nil +} + +func (m *AnalysisRunSpecAndStatus) GetStatus() *v1alpha1.AnalysisRunStatus { + if m != nil { + return m.Status + } + return nil +} + type AnalysisRunInfo struct { - ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` - Icon string `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"` - Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Successful int32 `protobuf:"varint,5,opt,name=successful,proto3" json:"successful,omitempty"` - Failed int32 `protobuf:"varint,6,opt,name=failed,proto3" json:"failed,omitempty"` - Inconclusive int32 `protobuf:"varint,7,opt,name=inconclusive,proto3" json:"inconclusive,omitempty"` - Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` - Jobs []*JobInfo `protobuf:"bytes,9,rep,name=jobs,proto3" json:"jobs,omitempty"` - NonJobInfo []*NonJobInfo `protobuf:"bytes,10,rep,name=nonJobInfo,proto3" json:"nonJobInfo,omitempty"` - Metrics []*Metrics `protobuf:"bytes,11,rep,name=metrics,proto3" json:"metrics,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` + // + //field type from 161 -170 will be deprecated in future. + Icon string `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"` + Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Successful int32 `protobuf:"varint,5,opt,name=successful,proto3" json:"successful,omitempty"` + Failed int32 `protobuf:"varint,6,opt,name=failed,proto3" json:"failed,omitempty"` + Inconclusive int32 `protobuf:"varint,7,opt,name=inconclusive,proto3" json:"inconclusive,omitempty"` + Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` + Jobs []*JobInfo `protobuf:"bytes,9,rep,name=jobs,proto3" json:"jobs,omitempty"` + NonJobInfo []*NonJobInfo `protobuf:"bytes,10,rep,name=nonJobInfo,proto3" json:"nonJobInfo,omitempty"` + Metrics []*Metrics `protobuf:"bytes,11,rep,name=metrics,proto3" json:"metrics,omitempty"` + // The new API changes should use SpecAndStatus field type. + SpecAndStatus *AnalysisRunSpecAndStatus `protobuf:"bytes,12,opt,name=specAndStatus,proto3" json:"specAndStatus,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AnalysisRunInfo) Reset() { *m = AnalysisRunInfo{} } func (m *AnalysisRunInfo) String() string { return proto.CompactTextString(m) } func (*AnalysisRunInfo) ProtoMessage() {} func (*AnalysisRunInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{18} + return fileDescriptor_99101d942e8912a7, []int{19} } func (m *AnalysisRunInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1507,6 +1566,13 @@ func (m *AnalysisRunInfo) GetMetrics() []*Metrics { return nil } +func (m *AnalysisRunInfo) GetSpecAndStatus() *AnalysisRunSpecAndStatus { + if m != nil { + return m.SpecAndStatus + } + return nil +} + type NonJobInfo struct { Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` @@ -1521,7 +1587,7 @@ func (m *NonJobInfo) Reset() { *m = NonJobInfo{} } func (m *NonJobInfo) String() string { return proto.CompactTextString(m) } func (*NonJobInfo) ProtoMessage() {} func (*NonJobInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{19} + return fileDescriptor_99101d942e8912a7, []int{20} } func (m *NonJobInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1659,7 @@ func (m *Metrics) Reset() { *m = Metrics{} } func (m *Metrics) String() string { return proto.CompactTextString(m) } func (*Metrics) ProtoMessage() {} func (*Metrics) Descriptor() ([]byte, []int) { - return fileDescriptor_99101d942e8912a7, []int{20} + return fileDescriptor_99101d942e8912a7, []int{21} } func (m *Metrics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,6 +1742,7 @@ func init() { proto.RegisterType((*PodInfo)(nil), "rollout.PodInfo") proto.RegisterType((*ContainerInfo)(nil), "rollout.ContainerInfo") proto.RegisterType((*JobInfo)(nil), "rollout.JobInfo") + proto.RegisterType((*AnalysisRunSpecAndStatus)(nil), "rollout.AnalysisRunSpecAndStatus") proto.RegisterType((*AnalysisRunInfo)(nil), "rollout.AnalysisRunInfo") proto.RegisterType((*NonJobInfo)(nil), "rollout.NonJobInfo") proto.RegisterType((*Metrics)(nil), "rollout.Metrics") @@ -1686,117 +1753,121 @@ func init() { } var fileDescriptor_99101d942e8912a7 = []byte{ - // 1751 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6f, 0x1c, 0x49, - 0x15, 0x57, 0x7b, 0x3c, 0xf6, 0xf8, 0x8d, 0x3f, 0xc6, 0xe5, 0x6c, 0xb6, 0x77, 0x36, 0x58, 0xa6, - 0x17, 0x09, 0xc7, 0x40, 0xb7, 0x93, 0x8d, 0xb2, 0x2c, 0x1f, 0x87, 0x90, 0x58, 0xde, 0xa0, 0xec, - 0x12, 0x3a, 0xc0, 0x0a, 0x24, 0x88, 0x6a, 0x7a, 0xca, 0xe3, 0x4e, 0x7a, 0xba, 0x9a, 0xae, 0xea, - 0x09, 0x23, 0x6b, 0x0e, 0xf0, 0x0f, 0x70, 0xe0, 0x5f, 0x58, 0x09, 0x71, 0x42, 0x48, 0x5c, 0x38, - 0x70, 0x45, 0x1c, 0x91, 0xf8, 0x07, 0x50, 0xc4, 0x85, 0x23, 0x17, 0xce, 0xa8, 0x5e, 0x57, 0x57, - 0x7f, 0x78, 0xec, 0x38, 0xb2, 0x21, 0x7b, 0x9a, 0x7a, 0xef, 0xd5, 0x7b, 0xef, 0x57, 0xf3, 0x3e, - 0xaa, 0xfa, 0xc1, 0x7b, 0xc9, 0xf3, 0x91, 0x47, 0x93, 0x30, 0x88, 0x42, 0x16, 0x4b, 0x2f, 0xe5, - 0x51, 0xc4, 0x33, 0xf3, 0xeb, 0x26, 0x29, 0x97, 0x9c, 0x2c, 0x6b, 0xb2, 0x7f, 0x63, 0xc4, 0xf9, - 0x28, 0x62, 0x4a, 0xc1, 0xa3, 0x71, 0xcc, 0x25, 0x95, 0x21, 0x8f, 0x45, 0xbe, 0xad, 0xff, 0x68, - 0x14, 0xca, 0xe3, 0x6c, 0xe0, 0x06, 0x7c, 0xec, 0xd1, 0x74, 0xc4, 0x93, 0x94, 0x3f, 0xc3, 0xc5, - 0xd7, 0xb4, 0xbe, 0xf0, 0xb4, 0x37, 0xe1, 0x19, 0xce, 0xe4, 0x16, 0x8d, 0x92, 0x63, 0x7a, 0xcb, - 0x1b, 0xb1, 0x98, 0xa5, 0x54, 0xb2, 0xa1, 0xb6, 0x76, 0xe7, 0xf9, 0xd7, 0x85, 0x1b, 0x72, 0xb5, - 0x7d, 0x4c, 0x83, 0xe3, 0x30, 0x66, 0xe9, 0xb4, 0xd4, 0x1f, 0x33, 0x49, 0xbd, 0xc9, 0x69, 0xad, - 0x77, 0x35, 0x42, 0xa4, 0x06, 0xd9, 0x91, 0xc7, 0xc6, 0x89, 0x9c, 0xe6, 0x42, 0xe7, 0x01, 0xf4, - 0xfc, 0xdc, 0xef, 0xc3, 0xf8, 0x88, 0x7f, 0x3f, 0x63, 0xe9, 0x94, 0x10, 0x58, 0x8c, 0xe9, 0x98, - 0xd9, 0xd6, 0x8e, 0xb5, 0xbb, 0xe2, 0xe3, 0x9a, 0xdc, 0x80, 0x15, 0xf5, 0x2b, 0x12, 0x1a, 0x30, - 0x7b, 0x01, 0x05, 0x25, 0xc3, 0xb9, 0x03, 0xd7, 0x2a, 0x56, 0x1e, 0x85, 0x42, 0xe6, 0x96, 0x6a, - 0x5a, 0x56, 0x53, 0xeb, 0xd7, 0x16, 0x6c, 0x3c, 0x61, 0xf2, 0xe1, 0x98, 0x8e, 0x98, 0xcf, 0x7e, - 0x9e, 0x31, 0x21, 0x89, 0x0d, 0xc5, 0x3f, 0xab, 0xf7, 0x17, 0xa4, 0xb2, 0x15, 0xf0, 0x58, 0x52, - 0x75, 0xea, 0x02, 0x81, 0x61, 0x90, 0x6b, 0xd0, 0x0e, 0x95, 0x1d, 0xbb, 0x85, 0x92, 0x9c, 0x20, - 0x3d, 0x68, 0x49, 0x3a, 0xb2, 0x17, 0x91, 0xa7, 0x96, 0x75, 0x44, 0xed, 0x26, 0xa2, 0x63, 0x20, - 0x3f, 0x8c, 0x87, 0x5c, 0x9f, 0xe5, 0xd5, 0x98, 0xfa, 0xd0, 0x49, 0xd9, 0x24, 0x14, 0x21, 0x8f, - 0x11, 0x52, 0xcb, 0x37, 0x74, 0xdd, 0x53, 0xab, 0xe9, 0xe9, 0x21, 0xbc, 0xe5, 0x33, 0x21, 0x69, - 0x2a, 0x1b, 0xce, 0x5e, 0xff, 0xcf, 0xff, 0x29, 0xbc, 0xf5, 0x38, 0xe5, 0x63, 0x2e, 0xd9, 0x65, - 0x4d, 0x29, 0x8d, 0xa3, 0x2c, 0x8a, 0x10, 0x6e, 0xc7, 0xc7, 0xb5, 0x73, 0x08, 0x5b, 0xf7, 0x06, - 0xfc, 0x0a, 0x70, 0x1e, 0xc2, 0x96, 0xcf, 0x64, 0x3a, 0xbd, 0xb4, 0xa1, 0xa7, 0xb0, 0xa9, 0x6d, - 0x7c, 0x4a, 0x65, 0x70, 0x7c, 0x30, 0x61, 0x31, 0x9a, 0x91, 0xd3, 0xc4, 0x98, 0x51, 0x6b, 0x72, - 0x17, 0xba, 0x69, 0x99, 0x96, 0x68, 0xa8, 0x7b, 0xfb, 0x9a, 0x5b, 0x54, 0x72, 0x25, 0x65, 0xfd, - 0xea, 0x46, 0xe7, 0x29, 0xac, 0x7d, 0x52, 0x78, 0x53, 0x8c, 0xf3, 0xf3, 0x98, 0xec, 0xc3, 0x16, - 0x9d, 0xd0, 0x30, 0xa2, 0x83, 0x88, 0x19, 0x3d, 0x61, 0x2f, 0xec, 0xb4, 0x76, 0x57, 0xfc, 0x79, - 0x22, 0xe7, 0x3e, 0x6c, 0x34, 0xea, 0x85, 0xec, 0x43, 0xa7, 0x68, 0x00, 0xb6, 0xb5, 0xd3, 0x3a, - 0x13, 0xa8, 0xd9, 0xe5, 0x7c, 0x00, 0xdd, 0x1f, 0xb1, 0x54, 0xe5, 0x1a, 0x62, 0xdc, 0x85, 0x8d, - 0x42, 0xa4, 0xd9, 0x1a, 0x69, 0x93, 0xed, 0xfc, 0x76, 0x09, 0xba, 0x15, 0x93, 0xe4, 0x31, 0x00, - 0x1f, 0x3c, 0x63, 0x81, 0xfc, 0x98, 0x49, 0x8a, 0x4a, 0xdd, 0xdb, 0xfb, 0x6e, 0xde, 0x6b, 0xdc, - 0x6a, 0xaf, 0x71, 0x93, 0xe7, 0x23, 0xc5, 0x10, 0xae, 0xea, 0x35, 0xee, 0xe4, 0x96, 0xfb, 0x3d, - 0xa3, 0xe7, 0x57, 0x6c, 0x90, 0xeb, 0xb0, 0x24, 0x24, 0x95, 0x99, 0xd0, 0xc1, 0xd3, 0x94, 0xaa, - 0xa4, 0x31, 0x13, 0xa2, 0xac, 0xd3, 0x82, 0x54, 0xe1, 0x0b, 0x03, 0x1e, 0xeb, 0x52, 0xc5, 0xb5, - 0xaa, 0x2e, 0x21, 0x55, 0x27, 0x1b, 0x4d, 0x75, 0xa9, 0x1a, 0x5a, 0xed, 0x17, 0x92, 0x25, 0xf6, - 0x52, 0xbe, 0x5f, 0xad, 0x55, 0x94, 0x04, 0x93, 0x9f, 0xb2, 0x70, 0x74, 0x2c, 0xed, 0xe5, 0x3c, - 0x4a, 0x86, 0x41, 0x1c, 0x58, 0xa5, 0x81, 0xcc, 0x68, 0xa4, 0x37, 0x74, 0x70, 0x43, 0x8d, 0xa7, - 0xba, 0x48, 0xca, 0xe8, 0x70, 0x6a, 0xaf, 0xec, 0x58, 0xbb, 0x6d, 0x3f, 0x27, 0x14, 0xea, 0x20, - 0x4b, 0x53, 0x16, 0x4b, 0x1b, 0x90, 0x5f, 0x90, 0x4a, 0x32, 0x64, 0x22, 0x4c, 0xd9, 0xd0, 0xee, - 0xe6, 0x12, 0x4d, 0x2a, 0x49, 0x96, 0x0c, 0x55, 0x17, 0xb6, 0x57, 0x73, 0x89, 0x26, 0x15, 0x4a, - 0x93, 0x12, 0xf6, 0x1a, 0xca, 0x4a, 0x06, 0xd9, 0x81, 0x6e, 0x9a, 0xf7, 0x05, 0x36, 0xbc, 0x27, - 0xed, 0x75, 0x04, 0x59, 0x65, 0x91, 0x6d, 0x00, 0xdd, 0xe1, 0x55, 0x88, 0x37, 0x70, 0x43, 0x85, - 0x43, 0x3e, 0x54, 0x16, 0x92, 0x28, 0x0c, 0xe8, 0x13, 0x26, 0x85, 0xdd, 0xc3, 0x5c, 0x7a, 0xbb, - 0xcc, 0x25, 0x23, 0xd3, 0x79, 0x5f, 0xee, 0x55, 0xaa, 0xec, 0x17, 0x09, 0x4b, 0xc3, 0x31, 0x8b, - 0xa5, 0xb0, 0x37, 0x1b, 0xaa, 0x07, 0x46, 0x96, 0xab, 0x56, 0xf6, 0x92, 0x6f, 0xc1, 0x2a, 0x8d, - 0x69, 0x34, 0x15, 0xa1, 0xf0, 0xb3, 0x58, 0xd8, 0x04, 0x75, 0x6d, 0xa3, 0x7b, 0xaf, 0x14, 0xa2, - 0x72, 0x6d, 0x37, 0xb9, 0x0b, 0x60, 0x5a, 0xb9, 0xb0, 0xb7, 0x50, 0xf7, 0xba, 0xd1, 0xbd, 0x5f, - 0x88, 0x50, 0xb3, 0xb2, 0x93, 0xfc, 0x0c, 0xda, 0x2a, 0xf2, 0xc2, 0xbe, 0x86, 0x2a, 0x1f, 0xb9, - 0xe5, 0x75, 0xeb, 0x16, 0xd7, 0x2d, 0x2e, 0x9e, 0x16, 0x35, 0x50, 0xa6, 0xb0, 0xe1, 0x14, 0xd7, - 0xad, 0x7b, 0x9f, 0xc6, 0x34, 0x9d, 0x3e, 0x91, 0x2c, 0xf1, 0x73, 0xb3, 0xce, 0x9f, 0x17, 0x60, - 0xbd, 0x7e, 0xea, 0xff, 0x41, 0xb1, 0x14, 0xa9, 0xbf, 0x50, 0x4f, 0x7d, 0x73, 0xb1, 0xb4, 0x1a, - 0x17, 0x4b, 0x59, 0x5c, 0x8b, 0x67, 0x15, 0x57, 0xbb, 0x5e, 0x5c, 0x8d, 0x94, 0x58, 0x7a, 0x8d, - 0x94, 0x68, 0xc6, 0x75, 0xf9, 0x75, 0xe2, 0xea, 0xfc, 0xa7, 0x05, 0xeb, 0x75, 0xeb, 0xff, 0xc7, - 0x66, 0x53, 0xfc, 0xaf, 0xad, 0x33, 0xfe, 0xd7, 0xc5, 0xb9, 0xff, 0xab, 0xaa, 0xca, 0x36, 0x5e, - 0x7f, 0x9a, 0x52, 0xfc, 0x00, 0x33, 0x03, 0x9b, 0x4d, 0xc7, 0xd7, 0x94, 0xe2, 0xd3, 0x40, 0x86, - 0x13, 0x86, 0xbd, 0xa6, 0xe3, 0x6b, 0x4a, 0xc5, 0x21, 0x51, 0x46, 0xd9, 0x0b, 0xec, 0x31, 0x1d, - 0xbf, 0x20, 0x73, 0xef, 0xf8, 0x6f, 0x08, 0xdd, 0x61, 0x0c, 0x5d, 0x6f, 0x0b, 0xd0, 0x6c, 0x0b, - 0x7d, 0xe8, 0x48, 0x36, 0x4e, 0x22, 0x2a, 0x19, 0x76, 0x9a, 0x15, 0xdf, 0xd0, 0xe4, 0xab, 0xb0, - 0x29, 0x02, 0x1a, 0xb1, 0x07, 0xfc, 0x45, 0xfc, 0x80, 0xd1, 0x61, 0x14, 0xc6, 0x0c, 0x9b, 0xce, - 0x8a, 0x7f, 0x5a, 0xa0, 0x50, 0xe3, 0xdb, 0x48, 0xd8, 0x6b, 0x78, 0x3f, 0x69, 0x8a, 0x7c, 0x09, - 0x16, 0x13, 0x3e, 0x14, 0xf6, 0x3a, 0x06, 0xb8, 0x67, 0x02, 0xfc, 0x98, 0x0f, 0x31, 0xb0, 0x28, - 0x55, 0xff, 0x69, 0x12, 0xc6, 0x23, 0x6c, 0x3b, 0x1d, 0x1f, 0xd7, 0xc8, 0xe3, 0xf1, 0xc8, 0xee, - 0x69, 0x1e, 0x8f, 0x47, 0xce, 0x9f, 0x2c, 0x58, 0xd6, 0x9a, 0x6f, 0x38, 0xe2, 0xa6, 0xa5, 0xe7, - 0xc5, 0xa2, 0x5b, 0x3a, 0x46, 0x02, 0x7b, 0xaa, 0xc0, 0x68, 0x63, 0x24, 0x72, 0xda, 0xf9, 0x10, - 0xd6, 0x6a, 0x1d, 0x67, 0xee, 0x0b, 0xc5, 0xbc, 0x37, 0x17, 0x2a, 0xef, 0x4d, 0xe7, 0xdf, 0x16, - 0x2c, 0x7f, 0x97, 0x0f, 0x3e, 0x07, 0xc7, 0xde, 0x06, 0x18, 0x33, 0x99, 0x86, 0x81, 0x7a, 0x75, - 0xe8, 0xb3, 0x57, 0x38, 0xe4, 0x23, 0x58, 0x29, 0x6f, 0x99, 0x36, 0x82, 0xdb, 0xbb, 0x18, 0xb8, - 0x1f, 0x84, 0x63, 0xe6, 0x97, 0xca, 0xce, 0x67, 0x2d, 0xd8, 0x68, 0x74, 0x81, 0xcf, 0x71, 0x93, - 0xdc, 0x06, 0x10, 0x59, 0x10, 0x30, 0x21, 0x8e, 0xb2, 0x48, 0x87, 0xbe, 0xc2, 0x51, 0x7a, 0x47, - 0x34, 0x8c, 0xd8, 0x10, 0x8b, 0xbd, 0xed, 0x6b, 0x4a, 0xbd, 0x1e, 0xc2, 0x38, 0xe0, 0x71, 0x10, - 0x65, 0xa2, 0x28, 0xf9, 0xb6, 0x5f, 0xe3, 0xa9, 0x9c, 0x60, 0x69, 0xca, 0x53, 0x2c, 0xfb, 0xb6, - 0x9f, 0x13, 0xaa, 0xb0, 0x9e, 0xf1, 0x81, 0x2a, 0xf8, 0x7a, 0x61, 0xe9, 0x3c, 0xf1, 0x51, 0x4a, - 0xde, 0x07, 0x88, 0x79, 0xac, 0x79, 0x36, 0xe0, 0xde, 0x2d, 0xb3, 0xf7, 0x13, 0x23, 0xf2, 0x2b, - 0xdb, 0xc8, 0x9e, 0xea, 0xf8, 0x2a, 0xa4, 0xc2, 0xee, 0x36, 0xac, 0x7f, 0x9c, 0xf3, 0xfd, 0x62, - 0x83, 0xf3, 0x99, 0x05, 0x50, 0x9a, 0x51, 0x58, 0x27, 0x34, 0xca, 0x8a, 0xa4, 0xce, 0x89, 0x33, - 0x33, 0xac, 0x9e, 0x4d, 0xad, 0xf3, 0xb3, 0x69, 0xf1, 0x32, 0xd9, 0xf4, 0x07, 0x0b, 0x96, 0x35, - 0xf6, 0xb9, 0x75, 0xb7, 0x07, 0x3d, 0x1d, 0xad, 0xfb, 0x3c, 0x1e, 0x86, 0x32, 0x34, 0x39, 0x71, - 0x8a, 0xaf, 0xce, 0x18, 0xf0, 0x2c, 0x96, 0x08, 0xb8, 0xed, 0xe7, 0x84, 0x6a, 0x97, 0xd5, 0xa8, - 0x3d, 0x0a, 0xc7, 0x61, 0x8e, 0xb9, 0xed, 0x9f, 0x16, 0xa8, 0xb8, 0xab, 0x0c, 0xc8, 0x52, 0xbd, - 0x31, 0xcf, 0x98, 0x1a, 0xef, 0xf6, 0xbf, 0xd6, 0x60, 0x5d, 0xbf, 0xa7, 0x9f, 0xb0, 0x74, 0x12, - 0x06, 0x8c, 0x08, 0x58, 0x3f, 0x64, 0xb2, 0xfa, 0xc8, 0x7e, 0x67, 0xde, 0x6b, 0x1e, 0xbf, 0x92, - 0xfb, 0x73, 0x1f, 0xfa, 0xce, 0xfe, 0xaf, 0xfe, 0xfe, 0xcf, 0xdf, 0x2c, 0xec, 0x91, 0x5d, 0x1c, - 0x2d, 0x4c, 0x6e, 0x95, 0xf3, 0x81, 0x13, 0xf3, 0xe9, 0x31, 0xcb, 0xd7, 0x33, 0x2f, 0x54, 0x2e, - 0x66, 0xd0, 0xc3, 0x0f, 0xa2, 0x4b, 0xb9, 0xbd, 0x8b, 0x6e, 0xf7, 0x89, 0x7b, 0x51, 0xb7, 0xde, - 0x0b, 0xe5, 0x73, 0xdf, 0x22, 0x13, 0xe8, 0xa9, 0x2f, 0x99, 0x8a, 0x31, 0x41, 0xbe, 0x30, 0xcf, - 0x87, 0x99, 0x0f, 0xf4, 0xed, 0xb3, 0xc4, 0xce, 0x4d, 0x84, 0xf1, 0x1e, 0xf9, 0xe2, 0xb9, 0x30, - 0xf0, 0xd8, 0xbf, 0xb4, 0x60, 0xb3, 0x79, 0xee, 0x57, 0x7a, 0xee, 0x37, 0xc5, 0xe5, 0xa7, 0xa4, - 0xe3, 0xa1, 0xef, 0x9b, 0xe4, 0xcb, 0xaf, 0xf4, 0x6d, 0xce, 0xfe, 0x63, 0x58, 0x3d, 0x64, 0xd2, - 0x7c, 0xe1, 0x91, 0xeb, 0x6e, 0x3e, 0x74, 0x71, 0x8b, 0xa1, 0x8b, 0x7b, 0x30, 0x4e, 0xe4, 0xb4, - 0x5f, 0x3e, 0x6a, 0x6b, 0x1f, 0x98, 0xce, 0x3b, 0xe8, 0x72, 0x8b, 0x6c, 0x16, 0x2e, 0xcb, 0xaf, - 0xcb, 0xdf, 0x5b, 0xea, 0x0d, 0x55, 0x1d, 0x15, 0x90, 0xed, 0xca, 0xd3, 0x6d, 0xce, 0x0c, 0xa1, - 0x7f, 0x70, 0xb9, 0x77, 0xb0, 0xb6, 0x56, 0xa4, 0x42, 0xff, 0x2b, 0x17, 0x49, 0x05, 0x7d, 0x7d, - 0x7e, 0xc3, 0xda, 0x43, 0xc4, 0xf5, 0x89, 0x44, 0x05, 0xf1, 0xdc, 0x51, 0xc5, 0x1b, 0x41, 0x9c, - 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x59, 0xb0, 0x5a, 0x1d, 0x72, 0x90, 0x1b, 0xe5, 0x03, 0xf7, 0xf4, - 0xec, 0xe3, 0xaa, 0xd0, 0xde, 0x41, 0xb4, 0x6e, 0xff, 0xe6, 0x45, 0xd0, 0x52, 0x85, 0x43, 0x61, - 0xfd, 0x4b, 0x3e, 0x35, 0x2b, 0xb2, 0x1a, 0xe7, 0x5c, 0x65, 0x1d, 0x35, 0xe6, 0x69, 0x57, 0x05, - 0xd5, 0x47, 0xa8, 0x8f, 0xfa, 0x87, 0xe7, 0x43, 0xd5, 0xdc, 0x99, 0x27, 0x98, 0xf4, 0x4e, 0xcc, - 0x87, 0xda, 0xcc, 0x3b, 0xc1, 0xf7, 0xd1, 0xb7, 0xf7, 0xf6, 0x66, 0xde, 0x89, 0xa4, 0xa3, 0x99, - 0x3a, 0xc8, 0x1f, 0x2d, 0xe8, 0x56, 0xa6, 0x6d, 0xe4, 0x5d, 0x73, 0x88, 0xd3, 0x33, 0xb8, 0xab, - 0x3a, 0xc7, 0x3d, 0x3c, 0xc7, 0x37, 0xfb, 0x77, 0x2f, 0x78, 0x8e, 0x2c, 0x1e, 0x72, 0xef, 0xa4, - 0x78, 0x55, 0xcc, 0x8a, 0x5c, 0xa9, 0xce, 0xb1, 0x2a, 0xb9, 0x32, 0x67, 0xbc, 0xf5, 0x46, 0x72, - 0x25, 0x55, 0x38, 0x14, 0xd6, 0xc7, 0xb0, 0xac, 0x87, 0x3e, 0x67, 0x76, 0xa4, 0xf2, 0x16, 0xa8, - 0x0c, 0x93, 0x9c, 0xb7, 0xd1, 0xdd, 0x26, 0xd9, 0x28, 0xdc, 0x4d, 0x72, 0xe1, 0x77, 0x0e, 0xfe, - 0xfa, 0x72, 0xdb, 0xfa, 0xdb, 0xcb, 0x6d, 0xeb, 0x1f, 0x2f, 0xb7, 0xad, 0x9f, 0x7c, 0x70, 0xe1, - 0xf1, 0x76, 0x7d, 0x98, 0x3e, 0x58, 0x42, 0x14, 0xef, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xa1, - 0x08, 0xa7, 0x61, 0x6c, 0x17, 0x00, 0x00, + // 1821 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4f, 0x6f, 0x1c, 0x49, + 0x15, 0x57, 0x7b, 0x3c, 0xf6, 0xf8, 0x8d, 0xff, 0x96, 0xb3, 0xd9, 0xde, 0xd9, 0x60, 0x79, 0x7b, + 0x91, 0x70, 0x0c, 0x74, 0x3b, 0xde, 0x28, 0xcb, 0xf2, 0xe7, 0x60, 0x12, 0xcb, 0x1b, 0x94, 0xec, + 0x86, 0x36, 0xb0, 0x02, 0x09, 0xa2, 0x72, 0x4f, 0x79, 0xdc, 0x49, 0x4f, 0x57, 0xd3, 0x55, 0x3d, + 0x61, 0x64, 0xcd, 0x01, 0xbe, 0x00, 0x07, 0xbe, 0x02, 0x12, 0xe2, 0x84, 0x90, 0xb8, 0x70, 0xe0, + 0x8a, 0x38, 0x22, 0xf1, 0x05, 0x50, 0x84, 0x90, 0x38, 0x70, 0xe0, 0xc2, 0x19, 0xd5, 0xeb, 0xea, + 0xea, 0x3f, 0x1e, 0x27, 0x8e, 0x6c, 0x36, 0x39, 0x4d, 0xbf, 0xf7, 0xea, 0xbd, 0xf7, 0xab, 0xaa, + 0xf7, 0x5e, 0x55, 0xbd, 0x81, 0xf7, 0x93, 0xa7, 0x03, 0x8f, 0x26, 0x61, 0x10, 0x85, 0x2c, 0x96, + 0x5e, 0xca, 0xa3, 0x88, 0x67, 0xe6, 0xd7, 0x4d, 0x52, 0x2e, 0x39, 0x99, 0xd7, 0x64, 0xef, 0xc6, + 0x80, 0xf3, 0x41, 0xc4, 0x94, 0x82, 0x47, 0xe3, 0x98, 0x4b, 0x2a, 0x43, 0x1e, 0x8b, 0x7c, 0x58, + 0xef, 0xc1, 0x20, 0x94, 0x27, 0xd9, 0x91, 0x1b, 0xf0, 0xa1, 0x47, 0xd3, 0x01, 0x4f, 0x52, 0xfe, + 0x04, 0x3f, 0xbe, 0xaa, 0xf5, 0x85, 0xa7, 0xbd, 0x09, 0xcf, 0x70, 0x46, 0xb7, 0x68, 0x94, 0x9c, + 0xd0, 0x5b, 0xde, 0x80, 0xc5, 0x2c, 0xa5, 0x92, 0xf5, 0xb5, 0xb5, 0xdb, 0x4f, 0xbf, 0x26, 0xdc, + 0x90, 0xab, 0xe1, 0x43, 0x1a, 0x9c, 0x84, 0x31, 0x4b, 0xc7, 0xa5, 0xfe, 0x90, 0x49, 0xea, 0x8d, + 0xce, 0x6a, 0xbd, 0xab, 0x11, 0x22, 0x75, 0x94, 0x1d, 0x7b, 0x6c, 0x98, 0xc8, 0x71, 0x2e, 0x74, + 0xee, 0xc1, 0xaa, 0x9f, 0xfb, 0xbd, 0x1f, 0x1f, 0xf3, 0xef, 0x66, 0x2c, 0x1d, 0x13, 0x02, 0xb3, + 0x31, 0x1d, 0x32, 0xdb, 0xda, 0xb4, 0xb6, 0x16, 0x7c, 0xfc, 0x26, 0x37, 0x60, 0x41, 0xfd, 0x8a, + 0x84, 0x06, 0xcc, 0x9e, 0x41, 0x41, 0xc9, 0x70, 0x6e, 0xc3, 0xb5, 0x8a, 0x95, 0x07, 0xa1, 0x90, + 0xb9, 0xa5, 0x9a, 0x96, 0xd5, 0xd4, 0xfa, 0xa5, 0x05, 0x2b, 0x87, 0x4c, 0xde, 0x1f, 0xd2, 0x01, + 0xf3, 0xd9, 0x4f, 0x33, 0x26, 0x24, 0xb1, 0xa1, 0x58, 0x59, 0x3d, 0xbe, 0x20, 0x95, 0xad, 0x80, + 0xc7, 0x92, 0xaa, 0x59, 0x17, 0x08, 0x0c, 0x83, 0x5c, 0x83, 0x76, 0xa8, 0xec, 0xd8, 0x2d, 0x94, + 0xe4, 0x04, 0x59, 0x85, 0x96, 0xa4, 0x03, 0x7b, 0x16, 0x79, 0xea, 0xb3, 0x8e, 0xa8, 0xdd, 0x44, + 0x74, 0x02, 0xe4, 0xfb, 0x71, 0x9f, 0xeb, 0xb9, 0xbc, 0x1c, 0x53, 0x0f, 0x3a, 0x29, 0x1b, 0x85, + 0x22, 0xe4, 0x31, 0x42, 0x6a, 0xf9, 0x86, 0xae, 0x7b, 0x6a, 0x35, 0x3d, 0xdd, 0x87, 0xb7, 0x7c, + 0x26, 0x24, 0x4d, 0x65, 0xc3, 0xd9, 0xab, 0x2f, 0xfe, 0x8f, 0xe1, 0xad, 0x47, 0x29, 0x1f, 0x72, + 0xc9, 0x2e, 0x6b, 0x4a, 0x69, 0x1c, 0x67, 0x51, 0x84, 0x70, 0x3b, 0x3e, 0x7e, 0x3b, 0x07, 0xb0, + 0xbe, 0x77, 0xc4, 0xaf, 0x00, 0xe7, 0x01, 0xac, 0xfb, 0x4c, 0xa6, 0xe3, 0x4b, 0x1b, 0x7a, 0x0c, + 0x6b, 0xda, 0xc6, 0x67, 0x54, 0x06, 0x27, 0xfb, 0x23, 0x16, 0xa3, 0x19, 0x39, 0x4e, 0x8c, 0x19, + 0xf5, 0x4d, 0xee, 0x40, 0x37, 0x2d, 0xc3, 0x12, 0x0d, 0x75, 0x77, 0xaf, 0xb9, 0x45, 0x26, 0x57, + 0x42, 0xd6, 0xaf, 0x0e, 0x74, 0x1e, 0xc3, 0xd2, 0x27, 0x85, 0x37, 0xc5, 0x78, 0x71, 0x1c, 0x93, + 0x1d, 0x58, 0xa7, 0x23, 0x1a, 0x46, 0xf4, 0x28, 0x62, 0x46, 0x4f, 0xd8, 0x33, 0x9b, 0xad, 0xad, + 0x05, 0x7f, 0x9a, 0xc8, 0xb9, 0x0b, 0x2b, 0x8d, 0x7c, 0x21, 0x3b, 0xd0, 0x29, 0x0a, 0x80, 0x6d, + 0x6d, 0xb6, 0xce, 0x05, 0x6a, 0x46, 0x39, 0x1f, 0x42, 0xf7, 0x07, 0x2c, 0x55, 0xb1, 0x86, 0x18, + 0xb7, 0x60, 0xa5, 0x10, 0x69, 0xb6, 0x46, 0xda, 0x64, 0x3b, 0xbf, 0x99, 0x83, 0x6e, 0xc5, 0x24, + 0x79, 0x04, 0xc0, 0x8f, 0x9e, 0xb0, 0x40, 0x3e, 0x64, 0x92, 0xa2, 0x52, 0x77, 0x77, 0xc7, 0xcd, + 0x6b, 0x8d, 0x5b, 0xad, 0x35, 0x6e, 0xf2, 0x74, 0xa0, 0x18, 0xc2, 0x55, 0xb5, 0xc6, 0x1d, 0xdd, + 0x72, 0x3f, 0x35, 0x7a, 0x7e, 0xc5, 0x06, 0xb9, 0x0e, 0x73, 0x42, 0x52, 0x99, 0x09, 0xbd, 0x79, + 0x9a, 0x52, 0x99, 0x34, 0x64, 0x42, 0x94, 0x79, 0x5a, 0x90, 0x6a, 0xfb, 0xc2, 0x80, 0xc7, 0x3a, + 0x55, 0xf1, 0x5b, 0x65, 0x97, 0x90, 0xaa, 0x92, 0x0d, 0xc6, 0x3a, 0x55, 0x0d, 0xad, 0xc6, 0x0b, + 0xc9, 0x12, 0x7b, 0x2e, 0x1f, 0xaf, 0xbe, 0xd5, 0x2e, 0x09, 0x26, 0x3f, 0x63, 0xe1, 0xe0, 0x44, + 0xda, 0xf3, 0xf9, 0x2e, 0x19, 0x06, 0x71, 0x60, 0x91, 0x06, 0x32, 0xa3, 0x91, 0x1e, 0xd0, 0xc1, + 0x01, 0x35, 0x9e, 0xaa, 0x22, 0x29, 0xa3, 0xfd, 0xb1, 0xbd, 0xb0, 0x69, 0x6d, 0xb5, 0xfd, 0x9c, + 0x50, 0xa8, 0x83, 0x2c, 0x4d, 0x59, 0x2c, 0x6d, 0x40, 0x7e, 0x41, 0x2a, 0x49, 0x9f, 0x89, 0x30, + 0x65, 0x7d, 0xbb, 0x9b, 0x4b, 0x34, 0xa9, 0x24, 0x59, 0xd2, 0x57, 0x55, 0xd8, 0x5e, 0xcc, 0x25, + 0x9a, 0x54, 0x28, 0x4d, 0x48, 0xd8, 0x4b, 0x28, 0x2b, 0x19, 0x64, 0x13, 0xba, 0x69, 0x5e, 0x17, + 0x58, 0x7f, 0x4f, 0xda, 0xcb, 0x08, 0xb2, 0xca, 0x22, 0x1b, 0x00, 0xba, 0xc2, 0xab, 0x2d, 0x5e, + 0xc1, 0x01, 0x15, 0x0e, 0xf9, 0x48, 0x59, 0x48, 0xa2, 0x30, 0xa0, 0x87, 0x4c, 0x0a, 0x7b, 0x15, + 0x63, 0xe9, 0xed, 0x32, 0x96, 0x8c, 0x4c, 0xc7, 0x7d, 0x39, 0x56, 0xa9, 0xb2, 0x9f, 0x25, 0x2c, + 0x0d, 0x87, 0x2c, 0x96, 0xc2, 0x5e, 0x6b, 0xa8, 0xee, 0x1b, 0x59, 0xae, 0x5a, 0x19, 0x4b, 0xbe, + 0x09, 0x8b, 0x34, 0xa6, 0xd1, 0x58, 0x84, 0xc2, 0xcf, 0x62, 0x61, 0x13, 0xd4, 0xb5, 0x8d, 0xee, + 0x5e, 0x29, 0x44, 0xe5, 0xda, 0x68, 0x72, 0x07, 0xc0, 0x94, 0x72, 0x61, 0xaf, 0xa3, 0xee, 0x75, + 0xa3, 0x7b, 0xb7, 0x10, 0xa1, 0x66, 0x65, 0x24, 0xf9, 0x09, 0xb4, 0xd5, 0xce, 0x0b, 0xfb, 0x1a, + 0xaa, 0x7c, 0xec, 0x96, 0xc7, 0xad, 0x5b, 0x1c, 0xb7, 0xf8, 0xf1, 0xb8, 0xc8, 0x81, 0x32, 0x84, + 0x0d, 0xa7, 0x38, 0x6e, 0xdd, 0xbb, 0x34, 0xa6, 0xe9, 0xf8, 0x50, 0xb2, 0xc4, 0xcf, 0xcd, 0x3a, + 0x7f, 0x9a, 0x81, 0xe5, 0xfa, 0xac, 0xff, 0x0f, 0xc9, 0x52, 0x84, 0xfe, 0x4c, 0x3d, 0xf4, 0xcd, + 0xc1, 0xd2, 0x6a, 0x1c, 0x2c, 0x65, 0x72, 0xcd, 0x9e, 0x97, 0x5c, 0xed, 0x7a, 0x72, 0x35, 0x42, + 0x62, 0xee, 0x15, 0x42, 0xa2, 0xb9, 0xaf, 0xf3, 0xaf, 0xb2, 0xaf, 0xce, 0x7f, 0x5b, 0xb0, 0x5c, + 0xb7, 0xfe, 0x39, 0x16, 0x9b, 0x62, 0x5d, 0x5b, 0xe7, 0xac, 0xeb, 0xec, 0xd4, 0x75, 0x55, 0x59, + 0xd9, 0xc6, 0xe3, 0x4f, 0x53, 0x8a, 0x1f, 0x60, 0x64, 0x60, 0xb1, 0xe9, 0xf8, 0x9a, 0x52, 0x7c, + 0x1a, 0xc8, 0x70, 0xc4, 0xb0, 0xd6, 0x74, 0x7c, 0x4d, 0xa9, 0x7d, 0x48, 0x94, 0x51, 0xf6, 0x0c, + 0x6b, 0x4c, 0xc7, 0x2f, 0xc8, 0xdc, 0x3b, 0xae, 0x86, 0xd0, 0x15, 0xc6, 0xd0, 0xf5, 0xb2, 0x00, + 0xcd, 0xb2, 0xd0, 0x83, 0x8e, 0x64, 0xc3, 0x24, 0xa2, 0x92, 0x61, 0xa5, 0x59, 0xf0, 0x0d, 0x4d, + 0xbe, 0x02, 0x6b, 0x22, 0xa0, 0x11, 0xbb, 0xc7, 0x9f, 0xc5, 0xf7, 0x18, 0xed, 0x47, 0x61, 0xcc, + 0xb0, 0xe8, 0x2c, 0xf8, 0x67, 0x05, 0x0a, 0x35, 0xde, 0x8d, 0x84, 0xbd, 0x84, 0xe7, 0x93, 0xa6, + 0xc8, 0x17, 0x61, 0x36, 0xe1, 0x7d, 0x61, 0x2f, 0xe3, 0x06, 0xaf, 0x9a, 0x0d, 0x7e, 0xc4, 0xfb, + 0xb8, 0xb1, 0x28, 0x55, 0x6b, 0x9a, 0x84, 0xf1, 0x00, 0xcb, 0x4e, 0xc7, 0xc7, 0x6f, 0xe4, 0xf1, + 0x78, 0x60, 0xaf, 0x6a, 0x1e, 0x8f, 0x07, 0xce, 0x1f, 0x2d, 0x98, 0xd7, 0x9a, 0xaf, 0x79, 0xc7, + 0x4d, 0x49, 0xcf, 0x93, 0x45, 0x97, 0x74, 0xdc, 0x09, 0xac, 0xa9, 0x02, 0x77, 0x1b, 0x77, 0x22, + 0xa7, 0x9d, 0x8f, 0x60, 0xa9, 0x56, 0x71, 0xa6, 0xde, 0x50, 0xcc, 0x7d, 0x73, 0xa6, 0x72, 0xdf, + 0x74, 0xfe, 0x63, 0xc1, 0xfc, 0x77, 0xf8, 0xd1, 0x1b, 0x30, 0xed, 0x0d, 0x80, 0x21, 0x93, 0x69, + 0x18, 0xa8, 0x5b, 0x87, 0x9e, 0x7b, 0x85, 0x43, 0x3e, 0x86, 0x85, 0xf2, 0x94, 0x69, 0x23, 0xb8, + 0xed, 0x8b, 0x81, 0xfb, 0x5e, 0x38, 0x64, 0x7e, 0xa9, 0xec, 0xfc, 0xd3, 0x02, 0xbb, 0x52, 0x05, + 0x0e, 0x13, 0x16, 0xec, 0xc5, 0xfd, 0xc3, 0x1c, 0x1a, 0x85, 0x59, 0x91, 0xb0, 0x40, 0x4f, 0xff, + 0xe1, 0xe5, 0xea, 0x73, 0xc3, 0x8b, 0x8f, 0xa6, 0xc9, 0xa0, 0xb6, 0x2a, 0xdd, 0xdd, 0x4f, 0xaf, + 0xce, 0x09, 0x9a, 0x2d, 0x96, 0xd9, 0xf9, 0x77, 0x0b, 0x56, 0x1a, 0xe5, 0xee, 0x0d, 0x3e, 0x0d, + 0x36, 0x00, 0x44, 0x16, 0x04, 0x4c, 0x88, 0xe3, 0x2c, 0xd2, 0x31, 0x5e, 0xe1, 0x28, 0xbd, 0x63, + 0x1a, 0x46, 0xac, 0x8f, 0x55, 0xad, 0xed, 0x6b, 0x4a, 0x5d, 0x93, 0xc2, 0x38, 0xe0, 0x71, 0x10, + 0x65, 0xa2, 0xa8, 0x6d, 0x6d, 0xbf, 0xc6, 0x53, 0xc1, 0xcf, 0xd2, 0x94, 0xa7, 0x58, 0xdf, 0xda, + 0x7e, 0x4e, 0xa8, 0x0a, 0xf2, 0x84, 0x1f, 0xa9, 0xca, 0x56, 0xaf, 0x20, 0x3a, 0x21, 0x7c, 0x94, + 0x92, 0x0f, 0x00, 0x62, 0x1e, 0x6b, 0x9e, 0x0d, 0x38, 0x76, 0xdd, 0x8c, 0xfd, 0xc4, 0x88, 0xfc, + 0xca, 0x30, 0xb2, 0xad, 0x8e, 0x36, 0x15, 0xbb, 0xc2, 0xee, 0x36, 0xac, 0x3f, 0xcc, 0xf9, 0x7e, + 0x31, 0x80, 0x1c, 0xc0, 0x92, 0xa8, 0xc6, 0x20, 0x96, 0xc2, 0xee, 0xee, 0x7b, 0xd3, 0x8e, 0xac, + 0x5a, 0xb0, 0xfa, 0x75, 0x3d, 0xe7, 0xd7, 0x16, 0x40, 0x89, 0x47, 0x4d, 0x7a, 0x44, 0xa3, 0xac, + 0x28, 0x03, 0x39, 0x71, 0x6e, 0x4e, 0xd6, 0xf3, 0xaf, 0xf5, 0xe2, 0xfc, 0x9b, 0xbd, 0x4c, 0xfe, + 0xfd, 0xde, 0x82, 0x79, 0xbd, 0x08, 0x53, 0x2b, 0xd5, 0x36, 0xac, 0xea, 0x6d, 0xbf, 0xcb, 0xe3, + 0x7e, 0x28, 0x43, 0x13, 0x5c, 0x67, 0xf8, 0x6a, 0x8e, 0x01, 0xcf, 0x62, 0x89, 0x80, 0xdb, 0x7e, + 0x4e, 0xa8, 0x03, 0xa6, 0xba, 0xfd, 0x0f, 0xc2, 0x61, 0x98, 0x63, 0x6e, 0xfb, 0x67, 0x05, 0x2a, + 0x80, 0x54, 0x28, 0x65, 0xa9, 0x1e, 0x98, 0x87, 0x5e, 0x8d, 0xb7, 0xfb, 0xaf, 0x25, 0x58, 0xd6, + 0x2f, 0x90, 0x43, 0x96, 0x8e, 0xc2, 0x80, 0x11, 0x01, 0xcb, 0x07, 0x4c, 0x56, 0x9f, 0x25, 0xef, + 0x4c, 0x7b, 0xff, 0x60, 0x5f, 0xa1, 0x37, 0xf5, 0x69, 0xe4, 0xec, 0xfc, 0xe2, 0x6f, 0xff, 0xf8, + 0xd5, 0xcc, 0x36, 0xd9, 0xc2, 0x66, 0xcc, 0xe8, 0x56, 0xd9, 0x51, 0x39, 0x35, 0x8f, 0xb5, 0x49, + 0xfe, 0x3d, 0xf1, 0x42, 0xe5, 0x62, 0x02, 0xab, 0xf8, 0x84, 0xbc, 0x94, 0xdb, 0x3b, 0xe8, 0x76, + 0x87, 0xb8, 0x17, 0x75, 0xeb, 0x3d, 0x53, 0x3e, 0x77, 0x2c, 0x32, 0x82, 0x55, 0xf5, 0xf6, 0xab, + 0x18, 0x13, 0xe4, 0x0b, 0xd3, 0x7c, 0x98, 0x8e, 0x4a, 0xcf, 0x3e, 0x4f, 0xec, 0xdc, 0x44, 0x18, + 0xef, 0x93, 0xf7, 0x5e, 0x08, 0x03, 0xa7, 0xfd, 0x73, 0x0b, 0xd6, 0x9a, 0xf3, 0x7e, 0xa9, 0xe7, + 0x5e, 0x53, 0x5c, 0x3e, 0xbe, 0x1d, 0x0f, 0x7d, 0xdf, 0x24, 0x5f, 0x7a, 0xa9, 0x6f, 0x33, 0xf7, + 0x1f, 0xc2, 0xe2, 0x01, 0x93, 0xe6, 0x4d, 0x4c, 0xae, 0xbb, 0x79, 0x9b, 0xca, 0x2d, 0xda, 0x54, + 0xee, 0xfe, 0x30, 0x91, 0xe3, 0x5e, 0xf9, 0x0c, 0xa8, 0x3d, 0xc9, 0x9d, 0x77, 0xd0, 0xe5, 0x3a, + 0x59, 0x2b, 0x5c, 0x96, 0xef, 0xf1, 0xdf, 0x59, 0xea, 0xd6, 0x59, 0x6d, 0xae, 0x90, 0x8d, 0xca, + 0x65, 0x77, 0x4a, 0xd7, 0xa5, 0xb7, 0x7f, 0xb9, 0x43, 0x43, 0x5b, 0x2b, 0x42, 0xa1, 0xf7, 0xe5, + 0x8b, 0x84, 0x82, 0xbe, 0x70, 0x7c, 0xdd, 0xda, 0x46, 0xc4, 0xf5, 0x1e, 0x4e, 0x05, 0xf1, 0xd4, + 0xe6, 0xce, 0x6b, 0x41, 0x9c, 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x5a, 0xb0, 0x58, 0x6d, 0x0b, 0x91, + 0x1b, 0x65, 0x7d, 0x3d, 0xdb, 0x2d, 0xba, 0x2a, 0xb4, 0xb7, 0x11, 0xad, 0xdb, 0xbb, 0x79, 0x11, + 0xb4, 0x54, 0xe1, 0x50, 0x58, 0xff, 0x9c, 0xf7, 0x19, 0x8b, 0xa8, 0xc6, 0xce, 0x60, 0x99, 0x47, + 0x8d, 0x0e, 0xe4, 0x55, 0x41, 0xf5, 0x11, 0xea, 0x83, 0xde, 0xc1, 0x8b, 0xa1, 0x6a, 0xee, 0xc4, + 0x13, 0x4c, 0x7a, 0xa7, 0xe6, 0x69, 0x3b, 0xf1, 0x4e, 0xf1, 0x46, 0xf9, 0xad, 0xed, 0xed, 0x89, + 0x77, 0x2a, 0xe9, 0x60, 0xa2, 0x26, 0xf2, 0x07, 0x0b, 0xba, 0x95, 0xfe, 0x24, 0x79, 0xd7, 0x4c, + 0xe2, 0x6c, 0xd7, 0xf2, 0xaa, 0xe6, 0xb1, 0x87, 0xf3, 0xf8, 0x46, 0xef, 0xce, 0x05, 0xe7, 0x91, + 0xc5, 0x7d, 0xee, 0x9d, 0x16, 0xd7, 0x93, 0x49, 0x11, 0x2b, 0xd5, 0xce, 0x5f, 0x25, 0x56, 0xa6, + 0x34, 0x04, 0x5f, 0x4b, 0xac, 0xa4, 0x0a, 0x87, 0xc2, 0xfa, 0x08, 0xe6, 0x75, 0x9b, 0xec, 0xdc, + 0x8a, 0x54, 0x9e, 0x02, 0x95, 0xf6, 0x9b, 0xf3, 0x36, 0xba, 0x5b, 0x23, 0x2b, 0x85, 0xbb, 0x51, + 0x2e, 0xfc, 0xf6, 0xfe, 0x5f, 0x9e, 0x6f, 0x58, 0x7f, 0x7d, 0xbe, 0x61, 0xfd, 0xfd, 0xf9, 0x86, + 0xf5, 0xa3, 0x0f, 0x2f, 0xfc, 0x87, 0x40, 0xfd, 0xef, 0x87, 0xa3, 0x39, 0x44, 0xf1, 0xc1, 0xff, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x35, 0xff, 0xe4, 0x9e, 0x18, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3496,6 +3567,57 @@ func (m *JobInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AnalysisRunSpecAndStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AnalysisRunSpecAndStatus) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AnalysisRunSpecAndStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Status != nil { + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Spec != nil { + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *AnalysisRunInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3520,6 +3642,18 @@ func (m *AnalysisRunInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SpecAndStatus != nil { + { + size, err := m.SpecAndStatus.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } if len(m.Metrics) > 0 { for iNdEx := len(m.Metrics) - 1; iNdEx >= 0; iNdEx-- { { @@ -4287,6 +4421,26 @@ func (m *JobInfo) Size() (n int) { return n } +func (m *AnalysisRunSpecAndStatus) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Spec != nil { + l = m.Spec.Size() + n += 1 + l + sovRollout(uint64(l)) + } + if m.Status != nil { + l = m.Status.Size() + n += 1 + l + sovRollout(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AnalysisRunInfo) Size() (n int) { if m == nil { return 0 @@ -4338,6 +4492,10 @@ func (m *AnalysisRunInfo) Size() (n int) { n += 1 + l + sovRollout(uint64(l)) } } + if m.SpecAndStatus != nil { + l = m.SpecAndStatus.Size() + n += 1 + l + sovRollout(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7736,6 +7894,129 @@ func (m *JobInfo) Unmarshal(dAtA []byte) error { } return nil } +func (m *AnalysisRunSpecAndStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AnalysisRunSpecAndStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AnalysisRunSpecAndStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &v1alpha1.AnalysisRunSpec{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Status == nil { + m.Status = &v1alpha1.AnalysisRunStatus{} + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRollout(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRollout + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AnalysisRunInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8062,6 +8343,42 @@ func (m *AnalysisRunInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpecAndStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpecAndStatus == nil { + m.SpecAndStatus = &AnalysisRunSpecAndStatus{} + } + if err := m.SpecAndStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRollout(dAtA[iNdEx:]) diff --git a/pkg/apiclient/rollout/rollout.proto b/pkg/apiclient/rollout/rollout.proto index 0d21c5d9d6..7949baddd4 100644 --- a/pkg/apiclient/rollout/rollout.proto +++ b/pkg/apiclient/rollout/rollout.proto @@ -148,8 +148,16 @@ message JobInfo { k8s.io.apimachinery.pkg.apis.meta.v1.Time startedAt = 5; } +message AnalysisRunSpecAndStatus { + github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec spec = 1; + github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus status = 2; +} + message AnalysisRunInfo { k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta objectMeta = 1; + /* + field type from 161 -170 will be deprecated in future. + */ string icon = 2; int64 revision = 3; string status = 4; @@ -160,6 +168,8 @@ message AnalysisRunInfo { repeated JobInfo jobs = 9; repeated NonJobInfo nonJobInfo = 10; repeated Metrics metrics = 11; + /* The new API changes should use SpecAndStatus field type. */ + AnalysisRunSpecAndStatus specAndStatus = 12; } message NonJobInfo { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index fb30b4b62e..490c5bcab8 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -598,6 +598,77 @@ }, "title": "AnalysisRunMetadata extra labels to add to the AnalysisRun" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec": { + "type": "object", + "properties": { + "metrics": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Metric" + }, + "title": "Metrics contains the list of metrics to query as part of an analysis run\n+patchMergeKey=name\n+patchStrategy=merge" + }, + "args": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Argument" + }, + "title": "Args are the list of arguments used in this run\n+optional\n+patchMergeKey=name\n+patchStrategy=merge" + }, + "terminate": { + "type": "boolean", + "title": "Terminate is used to prematurely stop the run (e.g. rollout completed and analysis is no longer desired)" + }, + "dryRun": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun" + }, + "title": "DryRun object contains the settings for running the analysis in Dry-Run mode\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + }, + "measurementRetention": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention" + }, + "title": "MeasurementRetention object contains the settings for retaining the number of measurements during the analysis\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + } + }, + "title": "AnalysisRunSpec is the spec for a AnalysisRun resource" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus": { + "type": "object", + "properties": { + "phase": { + "type": "string", + "title": "Phase is the status of the analysis run" + }, + "message": { + "type": "string", + "title": "Message is a message explaining current status" + }, + "metricResults": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricResult" + }, + "title": "MetricResults contains the metrics collected during the run" + }, + "startedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "StartedAt indicates when the analysisRun first started" + }, + "runSummary": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary", + "title": "RunSummary contains the final results from the metric executions" + }, + "dryRunSummary": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary", + "title": "DryRunSummary contains the final results from the metric executions in the dry-run mode" + } + }, + "title": "AnalysisRunStatus is the status for a AnalysisRun resource" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStrategy": { "type": "object", "properties": { @@ -710,6 +781,24 @@ }, "title": "AppMeshVirtualService holds information on the virtual service the rollout needs to modify" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Argument": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the argument" + }, + "value": { + "type": "string", + "title": "Value is the value of the argument\n+optional" + }, + "valueFrom": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ValueFrom", + "title": "ValueFrom is a reference to where a secret is stored. This field is one of the fields with valueFrom\n+optional" + } + }, + "title": "Argument is an argument to an AnalysisRun" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ArgumentValueFrom": { "type": "object", "properties": { @@ -970,6 +1059,105 @@ }, "title": "CanaryStrategy defines parameters for a Replica Based Canary" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetric": { + "type": "object", + "properties": { + "interval": { + "type": "string" + }, + "metricDataQueries": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricDataQuery" + } + } + }, + "title": "CloudWatchMetric defines the cloudwatch query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricDataQuery": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "expression": { + "type": "string" + }, + "label": { + "type": "string" + }, + "metricStat": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStat" + }, + "period": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString" + }, + "returnData": { + "type": "boolean" + } + }, + "title": "CloudWatchMetricDataQuery defines the cloudwatch query" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStat": { + "type": "object", + "properties": { + "metric": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetric" + }, + "period": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString" + }, + "stat": { + "type": "string" + }, + "unit": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetric": { + "type": "object", + "properties": { + "dimensions": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetricDimension" + } + }, + "metricName": { + "type": "string" + }, + "namespace": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetricStatMetricDimension": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric": { + "type": "object", + "properties": { + "interval": { + "type": "string" + }, + "query": { + "type": "string" + }, + "apiVersion": { + "type": "string", + "description": "ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated." + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun": { "type": "object", "properties": { @@ -989,6 +1177,20 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.GraphiteMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the Graphite server" + }, + "query": { + "type": "string", + "title": "Query is a raw Graphite query to perform" + } + }, + "title": "GraphiteMetric defines the Graphite query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.HeaderRoutingMatch": { "type": "object", "properties": { @@ -1002,6 +1204,20 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.InfluxdbMetric": { + "type": "object", + "properties": { + "profile": { + "type": "string", + "title": "Profile is the name of the secret holding InfluxDB account configuration" + }, + "query": { + "type": "string", + "title": "Query is a raw InfluxDB flux query to perform" + } + }, + "title": "InfluxdbMetric defines the InfluxDB Flux query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.IstioDestinationRule": { "type": "object", "properties": { @@ -1070,30 +1286,322 @@ "description": "A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type." } }, - "title": "IstioVirtualService holds information on the virtual service the rollout needs to modify" - }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MangedRoutes": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } + "title": "IstioVirtualService holds information on the virtual service the rollout needs to modify" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.JobMetric": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta" + }, + "spec": { + "$ref": "#/definitions/k8s.io.api.batch.v1.JobSpec" + } + }, + "title": "JobMetric defines a job to run which acts as a metric" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaMetric": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "application": { + "type": "string" + }, + "canaryConfigName": { + "type": "string" + }, + "metricsAccountName": { + "type": "string" + }, + "configurationAccountName": { + "type": "string" + }, + "storageAccountName": { + "type": "string" + }, + "threshold": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaThreshold" + }, + "scopes": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaScope" + } + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaScope": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "controlScope": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail" + }, + "experimentScope": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaThreshold": { + "type": "object", + "properties": { + "pass": { + "type": "string", + "format": "int64" + }, + "marginal": { + "type": "string", + "format": "int64" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MangedRoutes": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Measurement": { + "type": "object", + "properties": { + "phase": { + "type": "string", + "title": "Phase is the status of this single measurement" + }, + "message": { + "type": "string", + "title": "Message contains a message describing current condition (e.g. error messages)" + }, + "startedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "StartedAt is the timestamp in which this measurement started to be measured" + }, + "finishedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "FinishedAt is the timestamp in which this measurement completed and value was collected" + }, + "value": { + "type": "string", + "title": "Value is the measured value of the metric" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Metadata stores additional metadata about this metric result, used by the different providers\n(e.g. kayenta run ID, job name)" + }, + "resumeAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "ResumeAt is the timestamp when the analysisRun should try to resume the measurement" + } + }, + "title": "Measurement is a point in time result value of a single metric, and the time it was measured" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention": { + "type": "object", + "properties": { + "metricName": { + "type": "string", + "description": "MetricName is the name of the metric on which this retention policy should be applied." + }, + "limit": { + "type": "integer", + "format": "int32", + "description": "Limit is the maximum number of measurements to be retained for this given metric." + } + }, + "description": "MeasurementRetention defines the settings for retaining the number of measurements during the analysis." + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Metric": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the metric" + }, + "interval": { + "type": "string", + "title": "Interval defines an interval string (e.g. 30s, 5m, 1h) between each measurement.\nIf omitted, will perform a single measurement" + }, + "initialDelay": { + "type": "string", + "title": "InitialDelay how long the AnalysisRun should wait before starting this metric" + }, + "count": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "description": "Count is the number of times to run the measurement. If both interval and count are omitted,\nthe effective count is 1. If only interval is specified, metric runs indefinitely.\nIf count \u003e 1, interval must be specified." + }, + "successCondition": { + "type": "string", + "title": "SuccessCondition is an expression which determines if a measurement is considered successful\nExpression is a goevaluate expression. The keyword `result` is a variable reference to the\nvalue of measurement. Results can be both structured data or primitive.\nExamples:\n result \u003e 10\n (result.requests_made * result.requests_succeeded / 100) \u003e= 90" + }, + "failureCondition": { + "type": "string", + "title": "FailureCondition is an expression which determines if a measurement is considered failed\nIf both success and failure conditions are specified, and the measurement does not fall into\neither condition, the measurement is considered Inconclusive" + }, + "failureLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "FailureLimit is the maximum number of times the measurement is allowed to fail, before the\nentire metric is considered Failed (default: 0)" + }, + "inconclusiveLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "InconclusiveLimit is the maximum number of times the measurement is allowed to measure\nInconclusive, before the entire metric is considered Inconclusive (default: 0)" + }, + "consecutiveErrorLimit": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.util.intstr.IntOrString", + "title": "ConsecutiveErrorLimit is the maximum number of times the measurement is allowed to error in\nsuccession, before the metric is considered error (default: 4)" + }, + "provider": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricProvider", + "title": "Provider configuration to the external system to use to verify the analysis" + } + }, + "title": "Metric defines a metric in which to perform analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricProvider": { + "type": "object", + "properties": { + "prometheus": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric", + "title": "Prometheus specifies the prometheus metric to query" + }, + "kayenta": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.KayentaMetric", + "title": "Kayenta specifies a Kayenta metric" + }, + "web": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetric", + "title": "Web specifies a generic HTTP web metric" + }, + "datadog": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric", + "title": "Datadog specifies a datadog metric to query" + }, + "wavefront": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WavefrontMetric", + "title": "Wavefront specifies the wavefront metric to query" + }, + "newRelic": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NewRelicMetric", + "title": "NewRelic specifies the newrelic metric to query" + }, + "job": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.JobMetric", + "title": "Job specifies the job metric run" + }, + "cloudWatch": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CloudWatchMetric", + "title": "CloudWatch specifies the cloudWatch metric to query" + }, + "graphite": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.GraphiteMetric", + "title": "Graphite specifies the Graphite metric to query" + }, + "influxdb": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.InfluxdbMetric", + "title": "Influxdb specifies the influxdb metric to query" + }, + "skywalking": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SkyWalkingMetric", + "title": "SkyWalking specifies the skywalking metric to query" + }, + "plugin": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "byte" + }, + "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nPlugin specifies the hashicorp go-plugin metric to query" + } + }, + "title": "MetricProvider which external system to use to verify the analysis\nOnly one of the fields in this struct should be non-nil" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MetricResult": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the metric" + }, + "phase": { + "type": "string", + "title": "Phase is the overall aggregate status of the metric" + }, + "measurements": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Measurement" + }, + "title": "Measurements holds the most recent measurements collected for the metric" + }, + "message": { + "type": "string", + "title": "Message contains a message describing current condition (e.g. error messages)" + }, + "count": { + "type": "integer", + "format": "int32", + "title": "Count is the number of times the metric was measured without Error\nThis is equal to the sum of Successful, Failed, Inconclusive" + }, + "successful": { + "type": "integer", + "format": "int32", + "title": "Successful is the number of times the metric was measured Successful" + }, + "failed": { + "type": "integer", + "format": "int32", + "title": "Failed is the number of times the metric was measured Failed" + }, + "inconclusive": { + "type": "integer", + "format": "int32", + "title": "Inconclusive is the number of times the metric was measured Inconclusive" + }, + "error": { + "type": "integer", + "format": "int32", + "title": "Error is the number of times an error was encountered during measurement" + }, + "consecutiveError": { + "type": "integer", + "format": "int32", + "title": "ConsecutiveError is the number of times an error was encountered during measurement in succession\nResets to zero when non-errors are encountered" + }, + "dryRun": { + "type": "boolean", + "title": "DryRun indicates whether this metric is running in a dry-run mode or not" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Metadata stores additional metadata about this metric. It is used by different providers to store\nthe final state which gets used while taking measurements. For example, Prometheus uses this field\nto store the final resolved query after substituting the template arguments." + } + }, + "title": "MetricResult contain a list of the most recent measurements for a single metric along with\ncounters on how often the measurement" }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention": { + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NewRelicMetric": { "type": "object", "properties": { - "metricName": { + "profile": { "type": "string", - "description": "MetricName is the name of the metric on which this retention policy should be applied." + "title": "Profile is the name of the secret holding NR account configuration" }, - "limit": { - "type": "integer", - "format": "int32", - "description": "Limit is the maximum number of measurements to be retained for this given metric." + "query": { + "type": "string", + "title": "Query is a raw newrelic NRQL query to perform" } }, - "description": "MeasurementRetention defines the settings for retaining the number of measurements during the analysis." + "title": "NewRelicMetric defines the newrelic query to perform canary analysis" }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NginxTrafficRouting": { "type": "object", @@ -1198,6 +1706,50 @@ }, "title": "PreferredDuringSchedulingIgnoredDuringExecution defines the weight of the anti-affinity injection" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth": { + "type": "object", + "properties": { + "sigv4": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config", + "title": "+optional" + } + }, + "title": "PrometheusMetric defines the prometheus query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the prometheus server" + }, + "query": { + "type": "string", + "title": "Query is a raw prometheus query to perform" + }, + "authentication": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth", + "title": "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus\n+optional" + }, + "timeout": { + "type": "string", + "format": "int64", + "title": "Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds.\n+optional" + }, + "insecure": { + "type": "boolean", + "title": "Insecure skips host TLS verification" + }, + "headers": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader" + }, + "title": "Headers are optional HTTP headers to use in the request\n+optional\n+patchMergeKey=key\n+patchStrategy=merge" + } + }, + "title": "PrometheusMetric defines the prometheus query to perform canary analysis" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": { "type": "object", "title": "RequiredDuringSchedulingIgnoredDuringExecution defines inter-pod scheduling rule to be RequiredDuringSchedulingIgnoredDuringExecution" @@ -1708,6 +2260,37 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "format": "int32", + "title": "This is equal to the sum of Successful, Failed, Inconclusive" + }, + "successful": { + "type": "integer", + "format": "int32", + "title": "Successful is the number of times the metric was measured Successful" + }, + "failed": { + "type": "integer", + "format": "int32", + "title": "Failed is the number of times the metric was measured Failed" + }, + "inconclusive": { + "type": "integer", + "format": "int32", + "title": "Inconclusive is the number of times the metric was measured Inconclusive" + }, + "error": { + "type": "integer", + "format": "int32", + "title": "Error is the number of times an error was encountered during measurement" + } + }, + "title": "RunSummary contains the final results from the metric executions" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SMITrafficRouting": { "type": "object", "properties": { @@ -1722,6 +2305,40 @@ }, "title": "SMITrafficRouting configuration for TrafficSplit Custom Resource to control traffic routing" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail": { + "type": "object", + "properties": { + "scope": { + "type": "string" + }, + "region": { + "type": "string" + }, + "step": { + "type": "string", + "format": "int64" + }, + "start": { + "type": "string" + }, + "end": { + "type": "string" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretKeyRef": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Name is the name of the secret" + }, + "key": { + "type": "string", + "description": "Key is the key of the secret to select from." + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetCanaryScale": { "type": "object", "properties": { @@ -1779,6 +2396,37 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Region is the AWS Region to sign the SigV4 Request" + }, + "profile": { + "type": "string", + "title": "Profile is the Credential Profile used to sign the SigV4 Request" + }, + "roleArn": { + "type": "string", + "title": "RoleARN is the IAM role used to sign the SIgV4 Request" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SkyWalkingMetric": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "query": { + "type": "string" + }, + "interval": { + "type": "string" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StickinessConfig": { "type": "object", "properties": { @@ -1882,6 +2530,86 @@ }, "title": "TrafficWeights describes the current status of how traffic has been split" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ValueFrom": { + "type": "object", + "properties": { + "secretKeyRef": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretKeyRef", + "title": "Secret is a reference to where a secret is stored. This field is one of the fields with valueFrom\n+optional" + }, + "fieldRef": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.FieldRef", + "title": "FieldRef is a reference to the fields in metadata which we are referencing. This field is one of the fields with\nvalueFrom\n+optional" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WavefrontMetric": { + "type": "object", + "properties": { + "address": { + "type": "string", + "title": "Address is the HTTP address and port of the wavefront server" + }, + "query": { + "type": "string", + "title": "Query is a raw wavefront query to perform" + } + }, + "title": "WavefrontMetric defines the wavefront query to perform canary analysis" + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetric": { + "type": "object", + "properties": { + "method": { + "type": "string", + "title": "Method is the method of the web metric (empty defaults to GET)" + }, + "url": { + "type": "string", + "title": "URL is the address of the web metric" + }, + "headers": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader" + }, + "title": "+patchMergeKey=key\n+patchStrategy=merge\nHeaders are optional HTTP headers to use in the request" + }, + "body": { + "type": "string", + "title": "Body is the body of the web metric (must be POST/PUT)" + }, + "timeoutSeconds": { + "type": "string", + "format": "int64", + "title": "TimeoutSeconds is the timeout for the request in seconds (default: 10)" + }, + "jsonPath": { + "type": "string", + "title": "JSONPath is a JSON Path to use as the result variable (default: \"{$}\")" + }, + "insecure": { + "type": "boolean", + "title": "Insecure skips host TLS verification" + }, + "jsonBody": { + "type": "string", + "format": "byte", + "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nJSONBody is the body of the web metric in a json format (method must be POST/PUT)" + } + } + }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WebMetricHeader": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.WeightDestination": { "type": "object", "properties": { @@ -1958,6 +2686,131 @@ } } }, + "k8s.io.api.batch.v1.JobSpec": { + "type": "object", + "properties": { + "parallelism": { + "type": "integer", + "format": "int32", + "title": "Specifies the maximum desired number of pods the job should\nrun at any given time. The actual number of pods running in steady state will\nbe less than this number when ((.spec.completions - .status.successful) \u003c .spec.parallelism),\ni.e. when the work left to do is less than max parallelism.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" + }, + "completions": { + "type": "integer", + "format": "int32", + "title": "Specifies the desired number of successfully finished pods the\njob should be run with. Setting to nil means that the success of any\npod signals the success of all pods, and allows parallelism to have any positive\nvalue. Setting to 1 means that parallelism is limited to 1 and the success of that\npod signals the success of the job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" + }, + "activeDeadlineSeconds": { + "type": "string", + "format": "int64", + "title": "Specifies the duration in seconds relative to the startTime that the job\nmay be continuously active before the system tries to terminate it; value\nmust be positive integer. If a Job is suspended (at creation or through an\nupdate), this timer will effectively be stopped and reset when the Job is\nresumed again.\n+optional" + }, + "podFailurePolicy": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicy", + "description": "Specifies the policy of handling failed pods. In particular, it allows to\nspecify the set of actions and conditions which need to be\nsatisfied to take the associated action.\nIf empty, the default behaviour applies - the counter of failed pods,\nrepresented by the jobs's .status.failed field, is incremented and it is\nchecked against the backoffLimit. This field cannot be used in combination\nwith restartPolicy=OnFailure.\n\nThis field is alpha-level. To use this field, you must enable the\n`JobPodFailurePolicy` feature gate (disabled by default).\n+optional" + }, + "backoffLimit": { + "type": "integer", + "format": "int32", + "title": "Specifies the number of retries before marking this job failed.\nDefaults to 6\n+optional" + }, + "selector": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", + "title": "A label query over pods that should match the pod count.\nNormally, the system sets this field for you.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n+optional" + }, + "manualSelector": { + "type": "boolean", + "title": "manualSelector controls generation of pod labels and pod selectors.\nLeave `manualSelector` unset unless you are certain what you are doing.\nWhen false or unset, the system pick labels unique to this job\nand appends those labels to the pod template. When true,\nthe user is responsible for picking unique labels and specifying\nthe selector. Failure to pick a unique label may cause this\nand other jobs to not function correctly. However, You may see\n`manualSelector=true` in jobs that were created with the old `extensions/v1beta1`\nAPI.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector\n+optional" + }, + "template": { + "$ref": "#/definitions/k8s.io.api.core.v1.PodTemplateSpec", + "title": "Describes the pod that will be created when executing a job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/" + }, + "ttlSecondsAfterFinished": { + "type": "integer", + "format": "int32", + "title": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished\nexecution (either Complete or Failed). If this field is set,\nttlSecondsAfterFinished after the Job finishes, it is eligible to be\nautomatically deleted. When the Job is being deleted, its lifecycle\nguarantees (e.g. finalizers) will be honored. If this field is unset,\nthe Job won't be automatically deleted. If this field is set to zero,\nthe Job becomes eligible to be deleted immediately after it finishes.\n+optional" + }, + "completionMode": { + "type": "string", + "description": "CompletionMode specifies how Pod completions are tracked. It can be\n`NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have\nbeen .spec.completions successfully completed Pods. Each Pod completion is\nhomologous to each other.\n\n`Indexed` means that the Pods of a\nJob get an associated completion index from 0 to (.spec.completions - 1),\navailable in the annotation batch.kubernetes.io/job-completion-index.\nThe Job is considered complete when there is one successfully completed Pod\nfor each index.\nWhen value is `Indexed`, .spec.completions must be specified and\n`.spec.parallelism` must be less than or equal to 10^5.\nIn addition, The Pod name takes the form\n`$(job-name)-$(index)-$(random-string)`,\nthe Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future.\nIf the Job controller observes a mode that it doesn't recognize, which\nis possible during upgrades due to version skew, the controller\nskips updates for the Job.\n+optional" + }, + "suspend": { + "type": "boolean", + "description": "Suspend specifies whether the Job controller should create Pods or not. If\na Job is created with suspend set to true, no Pods are created by the Job\ncontroller. If a Job is suspended after creation (i.e. the flag goes from\nfalse to true), the Job controller will delete all active Pods associated\nwith this Job. Users must design their workload to gracefully handle this.\nSuspending a Job will reset the StartTime field of the Job, effectively\nresetting the ActiveDeadlineSeconds timer too. Defaults to false.\n\n+optional" + } + }, + "description": "JobSpec describes how the job execution will look like." + }, + "k8s.io.api.batch.v1.PodFailurePolicy": { + "type": "object", + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyRule" + }, + "title": "A list of pod failure policy rules. The rules are evaluated in order.\nOnce a rule matches a Pod failure, the remaining of the rules are ignored.\nWhen no rule matches the Pod failure, the default handling applies - the\ncounter of pod failures is incremented and it is checked against\nthe backoffLimit. At most 20 elements are allowed.\n+listType=atomic" + } + }, + "description": "PodFailurePolicy describes how failed pods influence the backoffLimit." + }, + "k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement": { + "type": "object", + "properties": { + "containerName": { + "type": "string", + "title": "Restricts the check for exit codes to the container with the\nspecified name. When null, the rule applies to all containers.\nWhen specified, it should match one the container or initContainer\nnames in the pod template.\n+optional" + }, + "operator": { + "type": "string", + "description": "Represents the relationship between the container exit code(s) and the\nspecified values. Containers completed with success (exit code 0) are\nexcluded from the requirement check. Possible values are:\n- In: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is in the set of specified values.\n- NotIn: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is not in the set of specified values.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown operator by assuming the requirement is not satisfied." + }, + "values": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + }, + "title": "Specifies the set of values. Each returned container exit code (might be\nmultiple in case of multiple containers) is checked against this set of\nvalues with respect to the operator. The list of values must be ordered\nand must not contain duplicates. Value '0' cannot be used for the In operator.\nAt least one element is required. At most 255 elements are allowed.\n+listType=set" + } + }, + "description": "PodFailurePolicyOnExitCodesRequirement describes the requirement for handling\na failed pod based on its container exit codes. In particular, it lookups the\n.state.terminated.exitCode for each app container and init container status,\nrepresented by the .status.containerStatuses and .status.initContainerStatuses\nfields in the Pod status, respectively. Containers completed with success\n(exit code 0) are excluded from the requirement check." + }, + "k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Specifies the required Pod condition type. To match a pod condition\nit is required that specified type equals the pod condition type." + }, + "status": { + "type": "string", + "description": "Specifies the required Pod condition status. To match a pod condition\nit is required that the specified status equals the pod condition status.\nDefaults to True." + } + }, + "description": "PodFailurePolicyOnPodConditionsPattern describes a pattern for matching\nan actual pod condition type." + }, + "k8s.io.api.batch.v1.PodFailurePolicyRule": { + "type": "object", + "properties": { + "action": { + "type": "string", + "description": "Specifies the action taken on a pod failure when the requirements are satisfied.\nPossible values are:\n- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown action by skipping the rule." + }, + "onExitCodes": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement", + "title": "Represents the requirement on the container exit codes.\n+optional" + }, + "onPodConditions": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern" + }, + "title": "Represents the requirement on the pod conditions. The requirement is represented\nas a list of pod condition patterns. The requirement is satisfied if at\nleast one pattern matches an actual pod condition. At most 20 elements are allowed.\n+listType=atomic" + } + }, + "description": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met.\nOne of OnExitCodes and onPodConditions, but not both, can be used in each rule." + }, "k8s.io.api.core.v1.AWSElasticBlockStoreVolumeSource": { "type": "object", "properties": { @@ -4677,7 +5530,8 @@ "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta" }, "icon": { - "type": "string" + "type": "string", + "description": "field type from 161 -170 will be deprecated in future." }, "revision": { "type": "string", @@ -4719,6 +5573,21 @@ "items": { "$ref": "#/definitions/rollout.Metrics" } + }, + "specAndStatus": { + "$ref": "#/definitions/rollout.AnalysisRunSpecAndStatus", + "description": "The new API changes should use SpecAndStatus field type." + } + } + }, + "rollout.AnalysisRunSpecAndStatus": { + "type": "object", + "properties": { + "spec": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunSpec" + }, + "status": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStatus" } } }, diff --git a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go index 9c60ccad87..abf19b1273 100644 --- a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go +++ b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go @@ -26,6 +26,12 @@ func getAnalysisRunInfo(ownerUID types.UID, allAnalysisRuns []*v1alpha1.Analysis UID: run.UID, }, } + + arInfo.SpecAndStatus = &rollout.AnalysisRunSpecAndStatus{ + Spec: &run.Spec, + Status: &run.Status, + } + if run.Spec.Metrics != nil { for _, metric := range run.Spec.Metrics { diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 151eb4b672..fe2a8eca01 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -208,6 +208,86 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun */ annotations?: { [key: string]: string; }; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec { + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + metrics?: Array; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + args?: Array; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + terminate?: boolean; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + dryRun?: Array; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + measurementRetention?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + phase?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + message?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + metricResults?: Array; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + startedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + runSummary?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + dryRunSummary?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary; +} /** * * @export @@ -348,6 +428,31 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AppMeshVirt */ routes?: Array; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + value?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument + */ + valueFrom?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom; +} /** * * @export @@ -668,204 +773,815 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrat canaryMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + stableMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + scaleDownDelaySeconds?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + scaleDownDelayRevisionLimit?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + abortScaleDownDelaySeconds?: number; + /** + * DynamicStableScale is a traffic routing feature which dynamically scales the stable ReplicaSet to minimize total pods which are running during an update. This is calculated by scaling down the stable as traffic is increased to canary. When disabled (the default behavior) the stable ReplicaSet remains fully scaled to support instantaneous aborts. + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + dynamicStableScale?: boolean; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + pingPong?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + */ + minPodsPerReplicaSet?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ + interval?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric + */ + metricDataQueries?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + id?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + expression?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + label?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + metricStat?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + period?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricDataQuery + */ + returnData?: boolean; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + metric?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + period?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + stat?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStat + */ + unit?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric { + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + dimensions?: Array; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + metricName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetric + */ + namespace?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetricStatMetricDimension + */ + value?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + interval?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + query?: string; + /** + * ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + apiVersion?: string; +} +/** + * DryRun defines the settings for running the analysis in Dry-Run mode. + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun { + /** + * Name of the metric which needs to be evaluated in the Dry-Run mode. Wildcard '*' is supported and denotes all the available metrics. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + */ + metricName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + */ + fieldPath?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ + headerName?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + */ + headerValue?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ + profile?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + canarySubsetName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + */ + stableSubsetName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + virtualService?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + destinationRule?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + */ + virtualServices?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + name?: string; + /** + * A list of HTTP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + routes?: Array; + /** + * A list of TLS/HTTPS routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + tlsRoutes?: Array; + /** + * A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + */ + tcpRoutes?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric { + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1ObjectMeta} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ + metadata?: K8sIoApimachineryPkgApisMetaV1ObjectMeta; + /** + * + * @type {K8sIoApiBatchV1JobSpec} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric + */ + spec?: K8sIoApiBatchV1JobSpec; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + application?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + canaryConfigName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + metricsAccountName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + configurationAccountName?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + storageAccountName?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + threshold?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric + */ + scopes?: Array; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + name?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + controlScope?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaScope + */ + experimentScope?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ + pass?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaThreshold + */ + marginal?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + */ + name?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + phase?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + message?: string; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + startedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + finishedAt?: K8sIoApimachineryPkgApisMetaV1Time; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + value?: string; + /** + * + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + metadata?: { [key: string]: string; }; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + */ + resumeAt?: K8sIoApimachineryPkgApisMetaV1Time; +} +/** + * MeasurementRetention defines the settings for retaining the number of measurements during the analysis. + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention { + /** + * MetricName is the name of the metric on which this retention policy should be applied. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ + metricName?: string; + /** + * Limit is the maximum number of measurements to be retained for this given metric. + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + */ + limit?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + interval?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + initialDelay?: string; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + count?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + successCondition?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + failureCondition?: string; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + failureLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + inconclusiveLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {K8sIoApimachineryPkgUtilIntstrIntOrString} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + consecutiveErrorLimit?: K8sIoApimachineryPkgUtilIntstrIntOrString; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric + */ + provider?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider + */ + prometheus?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - stableMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PodTemplateMetadata; + kayenta?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1KayentaMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - scaleDownDelaySeconds?: number; + web?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - scaleDownDelayRevisionLimit?: number; + datadog?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - abortScaleDownDelaySeconds?: number; + wavefront?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric; /** - * DynamicStableScale is a traffic routing feature which dynamically scales the stable ReplicaSet to minimize total pods which are running during an update. This is calculated by scaling down the stable as traffic is increased to canary. When disabled (the default behavior) the stable ReplicaSet remains fully scaled to support instantaneous aborts. - * @type {boolean} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - dynamicStableScale?: boolean; + newRelic?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - pingPong?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PingPongSpec; + job?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1JobMetric; /** * - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CanaryStrategy + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - minPodsPerReplicaSet?: number; -} -/** - * DryRun defines the settings for running the analysis in Dry-Run mode. - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun { + cloudWatch?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric; /** - * Name of the metric which needs to be evaluated in the Dry-Run mode. Wildcard '*' is supported and denotes all the available metrics. - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DryRun + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - metricName?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef { + graphite?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1GraphiteMetric; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - fieldPath?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch { + influxdb?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1InfluxdbMetric; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - headerName?: string; + skywalking?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1HeaderRoutingMatch + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider */ - headerValue?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + plugin?: { [key: string]: string; }; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ name?: string; /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - canarySubsetName?: string; + phase?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult + */ + measurements?: Array; /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - stableSubsetName?: string; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting { + message?: string; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - virtualService?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService; + count?: number; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - destinationRule?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioDestinationRule; + successful?: number; /** * - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioTrafficRouting + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - virtualServices?: Array; -} -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService { + failed?: number; /** * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - name?: string; + inconclusive?: number; /** - * A list of HTTP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - routes?: Array; + error?: number; /** - * A list of TLS/HTTPS routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - tlsRoutes?: Array; + consecutiveError?: number; /** - * A list of TCP routes within VirtualService to edit. If omitted, VirtualService must have a single route of this type. - * @type {Array} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1IstioVirtualService + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult */ - tcpRoutes?: Array; + dryRun?: boolean; + /** + * Metadata stores additional metadata about this metric. It is used by different providers to store the final state which gets used while taking measurements. For example, Prometheus uses this field to store the final resolved query after substituting the template arguments. + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult + */ + metadata?: { [key: string]: string; }; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MangedRoutes + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ - name?: string; -} -/** - * MeasurementRetention defines the settings for retaining the number of measurements during the analysis. - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention { + profile?: string; /** - * MetricName is the name of the metric on which this retention policy should be applied. + * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention - */ - metricName?: string; - /** - * Limit is the maximum number of measurements to be retained for this given metric. - * @type {number} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MeasurementRetention + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NewRelicMetric */ - limit?: number; + query?: string; } /** * @@ -993,6 +1709,62 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PreferredDu */ weight?: number; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth + */ + sigv4?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + query?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + authentication?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + timeout?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + insecure?: boolean; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric + */ + headers?: Array; +} /** * * @export @@ -1642,46 +2414,139 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutTraf /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + method?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + path?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + /** + * + * @type {{ [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + */ + headers?: { [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary { + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + count?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + successful?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + failed?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + inconclusive?: number; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary + */ + error?: number; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ + rootService?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + */ + trafficSplitName?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail { /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - method?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + scope?: string; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - path?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; + region?: string; /** * - * @type {{ [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RouteMatch + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail */ - headers?: { [key: string]: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1StringMatch; }; + step?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail + */ + start?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ScopeDetail + */ + end?: string; } /** * * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting { +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef { /** * * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ - rootService?: string; + name?: string; /** - * + * Key is the key of the secret to select from. * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SMITrafficRouting + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef */ - trafficSplitName?: string; + key?: string; } /** * @@ -1752,6 +2617,56 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SetMirrorRo */ percentage?: number; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + profile?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config + */ + roleArn?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + query?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SkyWalkingMetric + */ + interval?: string; +} /** * * @export @@ -1885,6 +2800,118 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TrafficWeig */ verified?: boolean; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ + secretKeyRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRef; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ValueFrom + */ + fieldRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ + address?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WavefrontMetric + */ + query?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + method?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + url?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + headers?: Array; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + body?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + timeoutSeconds?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + jsonPath?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + insecure?: boolean; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + jsonBody?: string; +} +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ + key?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetricHeader + */ + value?: string; +} /** * * @export @@ -1997,6 +3024,161 @@ export interface GrpcGatewayRuntimeStreamError { */ details?: Array; } +/** + * JobSpec describes how the job execution will look like. + * @export + * @interface K8sIoApiBatchV1JobSpec + */ +export interface K8sIoApiBatchV1JobSpec { + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + parallelism?: number; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + completions?: number; + /** + * + * @type {string} + * @memberof K8sIoApiBatchV1JobSpec + */ + activeDeadlineSeconds?: string; + /** + * + * @type {K8sIoApiBatchV1PodFailurePolicy} + * @memberof K8sIoApiBatchV1JobSpec + */ + podFailurePolicy?: K8sIoApiBatchV1PodFailurePolicy; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + backoffLimit?: number; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1LabelSelector} + * @memberof K8sIoApiBatchV1JobSpec + */ + selector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; + /** + * + * @type {boolean} + * @memberof K8sIoApiBatchV1JobSpec + */ + manualSelector?: boolean; + /** + * + * @type {K8sIoApiCoreV1PodTemplateSpec} + * @memberof K8sIoApiBatchV1JobSpec + */ + template?: K8sIoApiCoreV1PodTemplateSpec; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + ttlSecondsAfterFinished?: number; + /** + * CompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. `NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. `Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job. +optional + * @type {string} + * @memberof K8sIoApiBatchV1JobSpec + */ + completionMode?: string; + /** + * Suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false. +optional + * @type {boolean} + * @memberof K8sIoApiBatchV1JobSpec + */ + suspend?: boolean; +} +/** + * PodFailurePolicy describes how failed pods influence the backoffLimit. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicy + */ +export interface K8sIoApiBatchV1PodFailurePolicy { + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicy + */ + rules?: Array; +} +/** + * PodFailurePolicyOnExitCodesRequirement describes the requirement for handling a failed pod based on its container exit codes. In particular, it lookups the .state.terminated.exitCode for each app container and init container status, represented by the .status.containerStatuses and .status.initContainerStatuses fields in the Pod status, respectively. Containers completed with success (exit code 0) are excluded from the requirement check. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ +export interface K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement { + /** + * + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + containerName?: string; + /** + * Represents the relationship between the container exit code(s) and the specified values. Containers completed with success (exit code 0) are excluded from the requirement check. Possible values are: - In: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is in the set of specified values. - NotIn: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is not in the set of specified values. Additional values are considered to be added in the future. Clients should react to an unknown operator by assuming the requirement is not satisfied. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + operator?: string; + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement + */ + values?: Array; +} +/** + * PodFailurePolicyOnPodConditionsPattern describes a pattern for matching an actual pod condition type. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ +export interface K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern { + /** + * Specifies the required Pod condition type. To match a pod condition it is required that specified type equals the pod condition type. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ + type?: string; + /** + * Specifies the required Pod condition status. To match a pod condition it is required that the specified status equals the pod condition status. Defaults to True. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern + */ + status?: string; +} +/** + * PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of OnExitCodes and onPodConditions, but not both, can be used in each rule. + * @export + * @interface K8sIoApiBatchV1PodFailurePolicyRule + */ +export interface K8sIoApiBatchV1PodFailurePolicyRule { + /** + * Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are: - FailJob: indicates that the pod's job is marked as Failed and all running pods are terminated. - Ignore: indicates that the counter towards the .backoffLimit is not incremented and a replacement pod is created. - Count: indicates that the pod is handled in the default way - the counter towards the .backoffLimit is incremented. Additional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule. + * @type {string} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + action?: string; + /** + * + * @type {K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + onExitCodes?: K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement; + /** + * + * @type {Array} + * @memberof K8sIoApiBatchV1PodFailurePolicyRule + */ + onPodConditions?: Array; +} /** * Represents a Persistent Disk resource in AWS. An AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling. * @export @@ -5503,7 +6685,7 @@ export interface RolloutAnalysisRunInfo { */ objectMeta?: K8sIoApimachineryPkgApisMetaV1ObjectMeta; /** - * + * field type from 161 -170 will be deprecated in future. * @type {string} * @memberof RolloutAnalysisRunInfo */ @@ -5562,6 +6744,31 @@ export interface RolloutAnalysisRunInfo { * @memberof RolloutAnalysisRunInfo */ metrics?: Array; + /** + * + * @type {RolloutAnalysisRunSpecAndStatus} + * @memberof RolloutAnalysisRunInfo + */ + specAndStatus?: RolloutAnalysisRunSpecAndStatus; +} +/** + * + * @export + * @interface RolloutAnalysisRunSpecAndStatus + */ +export interface RolloutAnalysisRunSpecAndStatus { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec} + * @memberof RolloutAnalysisRunSpecAndStatus + */ + spec?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus} + * @memberof RolloutAnalysisRunSpecAndStatus + */ + status?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus; } /** * From 69c697c82ec234f21ed406c12d860acb3c880725 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 08:56:13 -0500 Subject: [PATCH 063/264] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.21.1 to 1.21.2 (#3103) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.21.1 to 1.21.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.21.1...v1.21.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6d5a1d7515..4edaa2530a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.21.1 + github.com/aws/aws-sdk-go-v2 v1.21.2 github.com/aws/aws-sdk-go-v2/config v1.18.44 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 diff --git a/go.sum b/go.sum index e0641f0d22..e67556564c 100644 --- a/go.sum +++ b/go.sum @@ -105,8 +105,9 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= From a9a51f2851a105d52325e9258b83806b8de7ffba Mon Sep 17 00:00:00 2001 From: OpenGuidou <73480729+OpenGuidou@users.noreply.github.com> Date: Fri, 13 Oct 2023 17:12:22 +0200 Subject: [PATCH 064/264] feat: Support OAuth2 for prometheus and web providers (#3038) Signed-off-by: Guillaume Doussin Signed-off-by: zachaller Co-authored-by: zachaller --- docs/analysis/prometheus.md | 53 +- docs/analysis/web.md | 49 +- .../features/kustomize/rollout_cr_schema.json | 177 ++ go.mod | 2 +- manifests/crds/analysis-run-crd.yaml | 38 + manifests/crds/analysis-template-crd.yaml | 38 + .../crds/cluster-analysis-template-crd.yaml | 38 + manifests/install.yaml | 114 + metricproviders/metricproviders.go | 5 +- metricproviders/prometheus/prometheus.go | 39 +- metricproviders/prometheus/prometheus_test.go | 219 ++ metricproviders/webmetric/webmetric.go | 20 +- metricproviders/webmetric/webmetric_test.go | 207 +- pkg/apis/api-rules/violation_exceptions.list | 4 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 29 +- pkg/apis/rollouts/v1alpha1/generated.pb.go | 1927 ++++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 40 +- .../rollouts/v1alpha1/openapi_generated.go | 116 +- .../v1alpha1/zz_generated.deepcopy.go | 59 +- 19 files changed, 2320 insertions(+), 854 deletions(-) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index 786b3d2c6f..b64ed5d06b 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -39,7 +39,9 @@ you validate your [PromQL expression](https://prometheus.io/docs/prometheus/late See the [Analysis Overview page](../../features/analysis) for more details on the available options. -## Utilizing Amazon Managed Prometheus +## Authorization + +### Utilizing Amazon Managed Prometheus Amazon Managed Prometheus can be used as the prometheus data source for analysis. In order to do this the namespace where your analysis is running will have to have the appropriate [IRSA attached](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-ingest-metrics-new-Prometheus.html#AMP-onboard-new-Prometheus-IRSA) to allow for prometheus queries. Once you ensure the proper permissions are in place to access AMP, you can use an AMP workspace url in your ```provider``` block and add a SigV4 config for Sigv4 signing: @@ -61,6 +63,55 @@ provider: roleArn: $ROLEARN ``` +### With OAuth2 + +You can setup an [OAuth2 client credential](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4) flow using the following values: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: success-rate +spec: + args: + - name: service-name + # from secret + - name: oauthSecret # This is the OAuth2 shared secret + valueFrom: + secretKeyRef: + name: oauth-secret + key: secret + metrics: + - name: success-rate + interval: 5m + # NOTE: prometheus queries return results in the form of a vector. + # So it is common to access the index 0 of the returned array to obtain the value + successCondition: result[0] >= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + # timeout is expressed in seconds + timeout: 40 + authentication: + oauth2: + tokenUrl: https://my-oauth2-provider/token + clientId: my-cliend-id + clientSecret: "{{ args.oauthSecret }}" + scopes: [ + "my-oauth2-scope" + ] + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) +``` + +The AnalysisRun will first get an access token using that information, and provide it as an `Authorization: Bearer` header for the metric provider call. + ## Additional Metadata Any additional metadata from the Prometheus controller, like the resolved queries after substituting the template's diff --git a/docs/analysis/web.md b/docs/analysis/web.md index db501d0ead..d6ba5abf35 100644 --- a/docs/analysis/web.md +++ b/docs/analysis/web.md @@ -49,7 +49,7 @@ NOTE: if the result is a string, two convenience functions `asInt` and `asFloat` to convert a result value to a numeric type so that mathematical comparison operators can be used (e.g. >, <, >=, <=). -### Optional web methods +## Optional web methods It is possible to use a POST or PUT requests, by specifying the `method` and either `body` or `jsonBody` fields ```yaml @@ -96,7 +96,7 @@ It is possible to use a POST or PUT requests, by specifying the `method` and eit jsonPath: "{$.data.ok}" ``` -### Skip TLS verification +## Skip TLS verification You can skip the TLS verification of the web host provided by setting the options `insecure: true`. @@ -112,4 +112,47 @@ You can skip the TLS verification of the web host provided by setting the option - key: Authorization value: "Bearer {{ args.api-token }}" jsonPath: "{$.data}" -``` \ No newline at end of file +``` +## Authorization + +### With OAuth2 + +You can setup an [OAuth2 client credential](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4) flow using the following values: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: success-rate +spec: + args: + - name: service-name + # from secret + - name: oauthSecret # This is the OAuth2 shared secret + valueFrom: + secretKeyRef: + name: oauth-secret + key: secret + metrics: + - name: webmetric + successCondition: result == true + provider: + web: + url: "http://my-server.com/api/v1/measurement?service={{ args.service-name }}" + timeoutSeconds: 20 # defaults to 10 seconds + authentication: + oauth2: + tokenUrl: https://my-oauth2-provider/token + clientId: my-cliend-id + clientSecret: "{{ args.oauthSecret }}" + scopes: [ + "my-oauth2-scope" + ] + headers: + - key: Content-Type # if body is a json, it is recommended to set the Content-Type + value: "application/json" + jsonPath: "{$.data.ok}" +``` + +In that case, no need to provide specifically the `Authentication` header. +The AnalysisRun will first get an access token using that information, and provide it as an `Authorization: Bearer` header for the metric provider call. diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 6d8420e916..8ba598cc82 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -4293,6 +4293,26 @@ }, "authentication": { "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, "sigv4": { "properties": { "profile": { @@ -4368,6 +4388,45 @@ }, "web": { "properties": { + "authentication": { + "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "body": { "type": "string" }, @@ -8740,6 +8799,26 @@ }, "authentication": { "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, "sigv4": { "properties": { "profile": { @@ -8815,6 +8894,45 @@ }, "web": { "properties": { + "authentication": { + "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "body": { "type": "string" }, @@ -13187,6 +13305,26 @@ }, "authentication": { "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, "sigv4": { "properties": { "profile": { @@ -13262,6 +13400,45 @@ }, "web": { "properties": { + "authentication": { + "properties": { + "oauth2": { + "properties": { + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "tokenUrl": { + "type": "string" + } + }, + "type": "object" + }, + "sigv4": { + "properties": { + "profile": { + "type": "string" + }, + "region": { + "type": "string" + }, + "roleArn": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "body": { "type": "string" }, diff --git a/go.mod b/go.mod index 4edaa2530a..5340295b69 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 + golang.org/x/oauth2 v0.10.0 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 @@ -179,7 +180,6 @@ require ( golang.org/x/crypto v0.11.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.12.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect golang.org/x/sys v0.10.0 // indirect golang.org/x/term v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 112b5e7287..9bf67d49b8 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2799,6 +2799,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -2847,6 +2860,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 8f76efa195..591847282f 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2795,6 +2795,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -2843,6 +2856,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 4e5187d8df..e02cf80946 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2795,6 +2795,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -2843,6 +2856,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: diff --git a/manifests/install.yaml b/manifests/install.yaml index ddcd3e3d66..54c65cc56c 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2800,6 +2800,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -2848,6 +2861,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: @@ -5808,6 +5846,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -5856,6 +5907,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: @@ -8702,6 +8778,19 @@ spec: type: string authentication: properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object sigv4: properties: profile: @@ -8750,6 +8839,31 @@ spec: type: object web: properties: + authentication: + properties: + oauth2: + properties: + clientId: + type: string + clientSecret: + type: string + scopes: + items: + type: string + type: array + tokenUrl: + type: string + type: object + sigv4: + properties: + profile: + type: string + region: + type: string + roleArn: + type: string + type: object + type: object body: type: string headers: diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index f73ff15e88..1be0042c23 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -48,7 +48,10 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) c := kayenta.NewHttpClient() return kayenta.NewKayentaProvider(logCtx, c), nil case webmetric.ProviderType: - c := webmetric.NewWebMetricHttpClient(metric) + c, err := webmetric.NewWebMetricHttpClient(metric) + if err != nil { + return nil, err + } p, err := webmetric.NewWebMetricJsonParser(metric) if err != nil { return nil, err diff --git a/metricproviders/prometheus/prometheus.go b/metricproviders/prometheus/prometheus.go index 6d1d521fb0..7473693525 100644 --- a/metricproviders/prometheus/prometheus.go +++ b/metricproviders/prometheus/prometheus.go @@ -17,6 +17,8 @@ import ( "github.com/prometheus/common/model" "github.com/prometheus/common/sigv4" log "github.com/sirupsen/logrus" + "golang.org/x/oauth2" + "golang.org/x/oauth2/clientcredentials" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/evaluate" @@ -164,6 +166,7 @@ func NewPrometheusProvider(api v1.API, logCtx log.Entry, metric v1alpha1.Metric) // NewPrometheusAPI generates a prometheus API from the metric configuration func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { envValuesByKey := make(map[string]string) + if value, ok := os.LookupEnv(fmt.Sprintf("%s", EnvVarArgoRolloutsPrometheusAddress)); ok { envValuesByKey[EnvVarArgoRolloutsPrometheusAddress] = value log.Debugf("ARGO_ROLLOUTS_PROMETHEUS_ADDRESS: %v", envValuesByKey[EnvVarArgoRolloutsPrometheusAddress]) @@ -203,25 +206,42 @@ func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { } } - prometheusApiConfig := api.Config{ - Address: metric.Provider.Prometheus.Address, - RoundTripper: roundTripper, - } - //Check if using Amazon Managed Prometheus if true build sigv4 client - if strings.Contains(metric.Provider.Prometheus.Address, "aps-workspaces") { + if strings.Contains(metric.Provider.Prometheus.Address, "aps-workspaces") && (v1alpha1.Sigv4Config{}) != metric.Provider.Prometheus.Authentication.Sigv4 { cfg := sigv4.SigV4Config{ Region: metric.Provider.Prometheus.Authentication.Sigv4.Region, Profile: metric.Provider.Prometheus.Authentication.Sigv4.Profile, RoleARN: metric.Provider.Prometheus.Authentication.Sigv4.RoleARN, } - var next http.RoundTripper - sigv4RoundTripper, err := sigv4.NewSigV4RoundTripper(&cfg, next) + sigv4RoundTripper, err := sigv4.NewSigV4RoundTripper(&cfg, roundTripper) if err != nil { log.Errorf("Error creating SigV4 RoundTripper: %v", err) return nil, err } - prometheusApiConfig.RoundTripper = sigv4RoundTripper + roundTripper = sigv4RoundTripper + } + + httpClient := &http.Client{ + Transport: roundTripper, + } + + if metric.Provider.Prometheus.Authentication.OAuth2.TokenURL != "" { + if metric.Provider.Prometheus.Authentication.OAuth2.ClientID == "" || metric.Provider.Prometheus.Authentication.OAuth2.ClientSecret == "" { + return nil, errors.New("missing mandatory parameter in metric for OAuth2 setup") + } + oauthCfg := &clientcredentials.Config{ + ClientID: metric.Provider.Prometheus.Authentication.OAuth2.ClientID, + ClientSecret: metric.Provider.Prometheus.Authentication.OAuth2.ClientSecret, + TokenURL: metric.Provider.Prometheus.Authentication.OAuth2.TokenURL, + Scopes: metric.Provider.Prometheus.Authentication.OAuth2.Scopes, + } + ctx := context.WithValue(context.Background(), oauth2.HTTPClient, httpClient) + httpClient = oauthCfg.Client(ctx) + } + + prometheusApiConfig := api.Config{ + Address: metric.Provider.Prometheus.Address, + Client: httpClient, } client, err := api.NewClient(prometheusApiConfig) @@ -229,6 +249,7 @@ func NewPrometheusAPI(metric v1alpha1.Metric) (v1.API, error) { log.Errorf("Error in getting prometheus client: %v", err) return nil, err } + return v1.NewAPI(client), nil } diff --git a/metricproviders/prometheus/prometheus_test.go b/metricproviders/prometheus/prometheus_test.go index 8b077930a5..f54d6d6c61 100644 --- a/metricproviders/prometheus/prometheus_test.go +++ b/metricproviders/prometheus/prometheus_test.go @@ -3,7 +3,10 @@ package prometheus import ( "fmt" "math" + "net/http" + "net/http/httptest" "os" + "strings" "testing" "time" @@ -15,6 +18,16 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + AccessToken = "MyAccessToken" +) + +type OAuthResponse struct { + TokenType string `json:"token_type,omitempty"` + AccessToken string `json:"access_token,omitempty"` + Expiry string `json:"expires_in,omitempty"` +} + func newScalar(f float64) model.Value { return &model.Scalar{ Value: model.SampleValue(f), @@ -514,3 +527,209 @@ func TestNewPrometheusNegativeTimeout(t *testing.T) { assert.NotNil(t, err) assert.Nil(t, p) } + +func TestRunSuccessfulWithOAuth(t *testing.T) { + e := log.Entry{} + promServer := mockPromServer(AccessToken) + oAuthServer := mockOAuthServer(AccessToken) + defer promServer.Close() + defer oAuthServer.Close() + + metric := v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result[0] == 10", + FailureCondition: "result[0] != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: promServer.URL, + Query: "test", + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: oAuthServer.URL + "/ok", + ClientID: "someId", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + api, err := NewPrometheusAPI(metric) + assert.NoError(t, err) + p, err := NewPrometheusProvider(api, e, metric) + + measurement := p.Run(newAnalysisRun(), metric) + assert.NotNil(t, measurement.StartedAt) + assert.NoError(t, err) + assert.Equal(t, "[10]", measurement.Value) + assert.NotNil(t, measurement.FinishedAt) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, measurement.Phase) +} + +func TestNewPromApiErrorWithIncompleteOAuthParams(t *testing.T) { + + metric := v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result[0] == 10", + FailureCondition: "result[0] != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: "http://promurl", + Query: "test", + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + _, err := NewPrometheusAPI(metric) + assert.Error(t, err) + + metric = v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result[0] == 10", + FailureCondition: "result[0] != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: "http://promurl", + Query: "test", + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientID: "someId", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + _, err = NewPrometheusAPI(metric) + assert.Error(t, err) + + metric = v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result[0] == 10", + FailureCondition: "result[0] != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: "http://promurl", + Query: "test", + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientID: "someId", + ClientSecret: "mySecret", + }, + }, + }, + }, + } + _, err = NewPrometheusAPI(metric) + // scopes are optional + assert.NoError(t, err) +} + +func TestRunErrorOAuthFailure(t *testing.T) { + e := log.Entry{} + promServer := mockPromServer(AccessToken) + oAuthServer := mockOAuthServer(AccessToken) + defer promServer.Close() + defer oAuthServer.Close() + + metric := v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result[0] == 10", + FailureCondition: "result[0] != 10", + Provider: v1alpha1.MetricProvider{ + Prometheus: &v1alpha1.PrometheusMetric{ + Address: promServer.URL, + Query: "test", + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: oAuthServer.URL + "/ko", + ClientID: "someId", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + api, err := NewPrometheusAPI(metric) + assert.NoError(t, err) + p, err := NewPrometheusProvider(api, e, metric) + + measurement := p.Run(newAnalysisRun(), metric) + assert.NoError(t, err) + assert.Equal(t, v1alpha1.AnalysisPhaseError, measurement.Phase) +} + +func mockOAuthServer(accessToken string) *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.StandardLogger().Infof("Received oauth query") + switch strings.TrimSpace(r.URL.Path) { + case "/ok": + mockOAuthOKResponse(w, r, accessToken) + case "/ko": + mockOAuthKOResponse(w, r) + default: + http.NotFoundHandler().ServeHTTP(w, r) + } + })) +} + +func mockOAuthOKResponse(w http.ResponseWriter, r *http.Request, accessToken string) { + + oAuthResponse := fmt.Sprintf(`{"token_type":"Bearer","expires_in":3599,"access_token":"%s"}`, accessToken) + + sc := http.StatusOK + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(sc) + w.Write([]byte(oAuthResponse)) +} + +func mockOAuthKOResponse(w http.ResponseWriter, r *http.Request) { + sc := http.StatusUnauthorized + w.WriteHeader(sc) +} + +func mockPromServer(expectedAuthorizationHeader string) *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + log.StandardLogger().Infof("Received prom query") + + authorizationHeader := r.Header.Get("Authorization") + // Reject call if we don't find the expected oauth token + if expectedAuthorizationHeader != "" && ("Bearer "+expectedAuthorizationHeader) != authorizationHeader { + + log.StandardLogger().Infof("Authorization header not as expected, rejecting") + sc := http.StatusUnauthorized + w.WriteHeader(sc) + + } else { + log.StandardLogger().Infof("Authorization header as expected, continuing") + promResponse := `{"data":{"result":[{"metric":{"__name__":"myMetric"},"value":[0, "10"]}],"resultType":"vector"},"status":"success"}` + + sc := http.StatusOK + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(sc) + w.Write([]byte(promResponse)) + } + })) +} diff --git a/metricproviders/webmetric/webmetric.go b/metricproviders/webmetric/webmetric.go index 3ec345b90f..6561e72290 100644 --- a/metricproviders/webmetric/webmetric.go +++ b/metricproviders/webmetric/webmetric.go @@ -2,6 +2,7 @@ package webmetric import ( "bytes" + "context" "crypto/tls" "encoding/json" "errors" @@ -13,6 +14,8 @@ import ( "time" log "github.com/sirupsen/logrus" + "golang.org/x/oauth2" + "golang.org/x/oauth2/clientcredentials" "k8s.io/client-go/util/jsonpath" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -173,8 +176,9 @@ func (p *Provider) GarbageCollect(run *v1alpha1.AnalysisRun, metric v1alpha1.Met return nil } -func NewWebMetricHttpClient(metric v1alpha1.Metric) *http.Client { +func NewWebMetricHttpClient(metric v1alpha1.Metric) (*http.Client, error) { var timeout time.Duration + var oauthCfg clientcredentials.Config // Using a default timeout of 10 seconds if metric.Provider.Web.TimeoutSeconds <= 0 { @@ -192,7 +196,19 @@ func NewWebMetricHttpClient(metric v1alpha1.Metric) *http.Client { } c.Transport = tr } - return c + if metric.Provider.Web.Authentication.OAuth2.TokenURL != "" { + if metric.Provider.Web.Authentication.OAuth2.ClientID == "" || metric.Provider.Web.Authentication.OAuth2.ClientSecret == "" { + return nil, errors.New("missing mandatory parameter in metric for OAuth2 setup") + } + oauthCfg = clientcredentials.Config{ + ClientID: metric.Provider.Web.Authentication.OAuth2.ClientID, + ClientSecret: metric.Provider.Web.Authentication.OAuth2.ClientSecret, + TokenURL: metric.Provider.Web.Authentication.OAuth2.TokenURL, + Scopes: metric.Provider.Web.Authentication.OAuth2.Scopes, + } + return oauthCfg.Client(context.WithValue(context.Background(), oauth2.HTTPClient, c)), nil + } + return c, nil } func NewWebMetricJsonParser(metric v1alpha1.Metric) (*jsonpath.JSONPath, error) { diff --git a/metricproviders/webmetric/webmetric_test.go b/metricproviders/webmetric/webmetric_test.go index 5ec0422ce1..1f8556a0eb 100644 --- a/metricproviders/webmetric/webmetric_test.go +++ b/metricproviders/webmetric/webmetric_test.go @@ -3,9 +3,11 @@ package webmetric import ( "bytes" "encoding/json" + "fmt" "io" "net/http" "net/http/httptest" + "strings" "testing" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -13,19 +15,30 @@ import ( "github.com/stretchr/testify/assert" ) +const ( + AccessToken = "MyAccessToken" +) + func TestRunSuite(t *testing.T) { + + // Start OAuth server + oAuthServer := mockOAuthServer(AccessToken) + defer oAuthServer.Close() + // Test Cases var tests = []struct { - webServerStatus int - webServerResponse string - metric v1alpha1.Metric - expectedMethod string - expectedBody string - expectedValue string - expectedPhase v1alpha1.AnalysisPhase - expectedErrorMessage string - expectedJsonBody string + webServerStatus int + webServerResponse string + metric v1alpha1.Metric + expectedMethod string + expectedBody string + expectedValue string + expectedPhase v1alpha1.AnalysisPhase + expectedErrorMessage string + expectedJsonBody string + expectedAuthorizationHeader string }{ + // When_noJSONPathSpecified_And_MatchesConditions_Then_Succeed { webServerStatus: 200, @@ -651,6 +664,63 @@ func TestRunSuite(t *testing.T) { expectedValue: "use either Body or JSONBody; both cannot exists for WebMetric payload", expectedPhase: v1alpha1.AnalysisPhaseError, }, + // When_usingOAuth2_Then_Succeed + { + webServerStatus: 200, + webServerResponse: `{"a": 1, "b": true, "c": [1, 2, 3, 4], "d": null}`, + metric: v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result.a > 0 && result.b && all(result.c, {# < 5}) && result.d == nil", + Provider: v1alpha1.MetricProvider{ + Web: &v1alpha1.WebMetric{ + // URL: server.URL, + Headers: []v1alpha1.WebMetricHeader{{Key: "key", Value: "value"}}, + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: oAuthServer.URL + "/ok", + ClientID: "myClientID", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + }, + expectedAuthorizationHeader: AccessToken, + expectedValue: `{"a":1,"b":true,"c":[1,2,3,4],"d":null}`, + expectedPhase: v1alpha1.AnalysisPhaseSuccessful, + }, + // When_RejectedByOAuthServer_Then_Failure + { + webServerResponse: `Missing OAuth2 token`, + metric: v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result.a > 0 && result.b && all(result.c, {# < 5}) && result.d == nil", + Provider: v1alpha1.MetricProvider{ + Web: &v1alpha1.WebMetric{ + // URL: server.URL, + Headers: []v1alpha1.WebMetricHeader{{Key: "key", Value: "value"}}, + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: oAuthServer.URL + "/ko", + ClientID: "myClientID", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + }, + expectedAuthorizationHeader: AccessToken, + expectedErrorMessage: `oauth2: cannot fetch token: 401 Unauthorized`, + expectedPhase: v1alpha1.AnalysisPhaseError, + }, } // Run @@ -658,6 +728,18 @@ func TestRunSuite(t *testing.T) { for _, test := range tests { // Server setup with response server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + + authorizationHeader := req.Header.Get("Authorization") + // Reject call if we don't find the expected oauth token + if test.expectedAuthorizationHeader != "" && ("Bearer "+test.expectedAuthorizationHeader) != authorizationHeader { + + log.StandardLogger().Infof("Authorization header not as expected, rejecting") + sc := http.StatusUnauthorized + rw.WriteHeader(sc) + io.WriteString(rw, test.webServerResponse) + return + } + if test.expectedMethod != "" { assert.Equal(t, test.expectedMethod, req.Method) } @@ -694,7 +776,9 @@ func TestRunSuite(t *testing.T) { jsonparser, err := NewWebMetricJsonParser(test.metric) assert.NoError(t, err) - provider := NewWebMetricProvider(*logCtx, server.Client(), jsonparser) + client, err := NewWebMetricHttpClient(test.metric) + assert.NoError(t, err) + provider := NewWebMetricProvider(*logCtx, client, jsonparser) metricsMetadata := provider.GetMetadata(test.metric) assert.Nil(t, metricsMetadata) @@ -725,6 +809,109 @@ func TestRunSuite(t *testing.T) { } } +func TestNewPromApiErrorWithIncompleteOAuthParams(t *testing.T) { + + // Missing Client Id should fail + metric := v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result.a > 0 && result.b && all(result.c, {# < 5}) && result.d == nil", + Provider: v1alpha1.MetricProvider{ + Web: &v1alpha1.WebMetric{ + // URL: server.URL, + Headers: []v1alpha1.WebMetricHeader{{Key: "key", Value: "value"}}, + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientSecret: "mySecret", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + + _, err := NewWebMetricHttpClient(metric) + assert.Error(t, err) + + // Missing Client Secret should fail + metric = v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result.a > 0 && result.b && all(result.c, {# < 5}) && result.d == nil", + Provider: v1alpha1.MetricProvider{ + Web: &v1alpha1.WebMetric{ + // URL: server.URL, + Headers: []v1alpha1.WebMetricHeader{{Key: "key", Value: "value"}}, + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientID: "myClientID", + Scopes: []string{ + "myFirstScope", + "mySecondScope", + }, + }, + }, + }, + }, + } + _, err = NewWebMetricHttpClient(metric) + assert.Error(t, err) + + // Missing Scope should succeed + metric = v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result.a > 0 && result.b && all(result.c, {# < 5}) && result.d == nil", + Provider: v1alpha1.MetricProvider{ + Web: &v1alpha1.WebMetric{ + // URL: server.URL, + Headers: []v1alpha1.WebMetricHeader{{Key: "key", Value: "value"}}, + Authentication: v1alpha1.Authentication{ + OAuth2: v1alpha1.OAuth2Config{ + TokenURL: "http://tokenurl", + ClientID: "myClientID", + ClientSecret: "mySecret", + }, + }, + }, + }, + } + _, err = NewWebMetricHttpClient(metric) + assert.NoError(t, err) + +} + func newAnalysisRun() *v1alpha1.AnalysisRun { return &v1alpha1.AnalysisRun{} } + +func mockOAuthServer(accessToken string) *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + log.StandardLogger().Infof("Received oauth query") + switch strings.TrimSpace(r.URL.Path) { + case "/ok": + mockOAuthOKResponse(w, r, accessToken) + case "/ko": + mockOAuthKOResponse(w, r) + default: + http.NotFoundHandler().ServeHTTP(w, r) + } + })) +} + +func mockOAuthOKResponse(w http.ResponseWriter, r *http.Request, accessToken string) { + + oAuthResponse := fmt.Sprintf(`{"token_type":"Bearer","expires_in":3599,"access_token":"%s"}`, accessToken) + + sc := http.StatusOK + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(sc) + w.Write([]byte(oAuthResponse)) +} + +func mockOAuthKOResponse(w http.ResponseWriter, r *http.Request) { + sc := http.StatusUnauthorized + w.WriteHeader(sc) +} diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 1d968d19e0..e947b953c9 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -29,6 +29,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,KayentaMetric,Scopes API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,MetricResult,Measurements API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,NginxTrafficRouting,StableIngresses +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,OAuth2Config,Scopes API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,PrometheusMetric,Headers API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,Args API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,DryRun @@ -46,7 +47,10 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,TLSRoute,SNIHosts API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,TrafficWeights,Additional API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,WebMetric,Headers +API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,Authentication,OAuth2 API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,MetricProvider,SkyWalking +API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,OAuth2Config,ClientID +API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,OAuth2Config,TokenURL API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,ALBs API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,HPAReplicas API rule violation: names_match,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,Sigv4Config,RoleARN diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index d7d1685d04..1988f44169 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -210,9 +210,9 @@ type PrometheusMetric struct { Address string `json:"address,omitempty" protobuf:"bytes,1,opt,name=address"` // Query is a raw prometheus query to perform Query string `json:"query,omitempty" protobuf:"bytes,2,opt,name=query"` - // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // Authentication details // +optional - Authentication PrometheusAuth `json:"authentication,omitempty" protobuf:"bytes,3,opt,name=authentication"` + Authentication Authentication `json:"authentication,omitempty" protobuf:"bytes,3,opt,name=authentication"` // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. // +optional Timeout *int64 `json:"timeout,omitempty" protobuf:"bytes,4,opt,name=timeout"` @@ -225,10 +225,26 @@ type PrometheusMetric struct { Headers []WebMetricHeader `json:"headers,omitempty" patchStrategy:"merge" patchMergeKey:"key" protobuf:"bytes,6,opt,name=headers"` } -// PrometheusMetric defines the prometheus query to perform canary analysis -type PrometheusAuth struct { +// Authentication method +type Authentication struct { + // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // +optional + Sigv4 Sigv4Config `json:"sigv4,omitempty" protobuf:"bytes,1,opt,name=sigv4"` + // OAuth2 config // +optional - Sigv4 Sigv4Config `json:"sigv4,omitempty" protobuf:"bytes,3,opt,name=sigv4"` + OAuth2 OAuth2Config `json:"oauth2,omitempty" protobuf:"bytes,2,opt,name=oauth2"` +} + +type OAuth2Config struct { + // OAuth2 provider token URL + TokenURL string `json:"tokenUrl,omitempty" protobuf:"bytes,1,name=tokenUrl"` + // OAuth2 client ID + ClientID string `json:"clientId,omitempty" protobuf:"bytes,2,name=clientId"` + // OAuth2 client secret + ClientSecret string `json:"clientSecret,omitempty" protobuf:"bytes,3,name=clientSecret"` + // OAuth2 scopes + // +optional + Scopes []string `json:"scopes,omitempty" protobuf:"bytes,4,opt,name=scopes"` } type Sigv4Config struct { @@ -532,6 +548,9 @@ type WebMetric struct { // +kubebuilder:validation:Type=object // JSONBody is the body of the web metric in a json format (method must be POST/PUT) JSONBody json.RawMessage `json:"jsonBody,omitempty" protobuf:"bytes,8,opt,name=jsonBody,casttype=encoding/json.RawMessage"` + // Authentication details + // +optional + Authentication Authentication `json:"authentication,omitempty" protobuf:"bytes,9,opt,name=authentication"` } // WebMetricMethod is the available HTTP methods diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 7a0c3ccf23..bfefbed404 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -665,10 +665,38 @@ func (m *ArgumentValueFrom) XXX_DiscardUnknown() { var xxx_messageInfo_ArgumentValueFrom proto.InternalMessageInfo +func (m *Authentication) Reset() { *m = Authentication{} } +func (*Authentication) ProtoMessage() {} +func (*Authentication) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{22} +} +func (m *Authentication) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Authentication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Authentication) XXX_Merge(src proto.Message) { + xxx_messageInfo_Authentication.Merge(m, src) +} +func (m *Authentication) XXX_Size() int { + return m.Size() +} +func (m *Authentication) XXX_DiscardUnknown() { + xxx_messageInfo_Authentication.DiscardUnknown(m) +} + +var xxx_messageInfo_Authentication proto.InternalMessageInfo + func (m *AwsResourceRef) Reset() { *m = AwsResourceRef{} } func (*AwsResourceRef) ProtoMessage() {} func (*AwsResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{22} + return fileDescriptor_e0e705f843545fab, []int{23} } func (m *AwsResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -696,7 +724,7 @@ var xxx_messageInfo_AwsResourceRef proto.InternalMessageInfo func (m *BlueGreenStatus) Reset() { *m = BlueGreenStatus{} } func (*BlueGreenStatus) ProtoMessage() {} func (*BlueGreenStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{23} + return fileDescriptor_e0e705f843545fab, []int{24} } func (m *BlueGreenStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -724,7 +752,7 @@ var xxx_messageInfo_BlueGreenStatus proto.InternalMessageInfo func (m *BlueGreenStrategy) Reset() { *m = BlueGreenStrategy{} } func (*BlueGreenStrategy) ProtoMessage() {} func (*BlueGreenStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{24} + return fileDescriptor_e0e705f843545fab, []int{25} } func (m *BlueGreenStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -752,7 +780,7 @@ var xxx_messageInfo_BlueGreenStrategy proto.InternalMessageInfo func (m *CanaryStatus) Reset() { *m = CanaryStatus{} } func (*CanaryStatus) ProtoMessage() {} func (*CanaryStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{25} + return fileDescriptor_e0e705f843545fab, []int{26} } func (m *CanaryStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -780,7 +808,7 @@ var xxx_messageInfo_CanaryStatus proto.InternalMessageInfo func (m *CanaryStep) Reset() { *m = CanaryStep{} } func (*CanaryStep) ProtoMessage() {} func (*CanaryStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{26} + return fileDescriptor_e0e705f843545fab, []int{27} } func (m *CanaryStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -808,7 +836,7 @@ var xxx_messageInfo_CanaryStep proto.InternalMessageInfo func (m *CanaryStrategy) Reset() { *m = CanaryStrategy{} } func (*CanaryStrategy) ProtoMessage() {} func (*CanaryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{27} + return fileDescriptor_e0e705f843545fab, []int{28} } func (m *CanaryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -836,7 +864,7 @@ var xxx_messageInfo_CanaryStrategy proto.InternalMessageInfo func (m *CloudWatchMetric) Reset() { *m = CloudWatchMetric{} } func (*CloudWatchMetric) ProtoMessage() {} func (*CloudWatchMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{28} + return fileDescriptor_e0e705f843545fab, []int{29} } func (m *CloudWatchMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -864,7 +892,7 @@ var xxx_messageInfo_CloudWatchMetric proto.InternalMessageInfo func (m *CloudWatchMetricDataQuery) Reset() { *m = CloudWatchMetricDataQuery{} } func (*CloudWatchMetricDataQuery) ProtoMessage() {} func (*CloudWatchMetricDataQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{29} + return fileDescriptor_e0e705f843545fab, []int{30} } func (m *CloudWatchMetricDataQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -892,7 +920,7 @@ var xxx_messageInfo_CloudWatchMetricDataQuery proto.InternalMessageInfo func (m *CloudWatchMetricStat) Reset() { *m = CloudWatchMetricStat{} } func (*CloudWatchMetricStat) ProtoMessage() {} func (*CloudWatchMetricStat) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{30} + return fileDescriptor_e0e705f843545fab, []int{31} } func (m *CloudWatchMetricStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -920,7 +948,7 @@ var xxx_messageInfo_CloudWatchMetricStat proto.InternalMessageInfo func (m *CloudWatchMetricStatMetric) Reset() { *m = CloudWatchMetricStatMetric{} } func (*CloudWatchMetricStatMetric) ProtoMessage() {} func (*CloudWatchMetricStatMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{31} + return fileDescriptor_e0e705f843545fab, []int{32} } func (m *CloudWatchMetricStatMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -948,7 +976,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetric proto.InternalMessageInfo func (m *CloudWatchMetricStatMetricDimension) Reset() { *m = CloudWatchMetricStatMetricDimension{} } func (*CloudWatchMetricStatMetricDimension) ProtoMessage() {} func (*CloudWatchMetricStatMetricDimension) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{32} + return fileDescriptor_e0e705f843545fab, []int{33} } func (m *CloudWatchMetricStatMetricDimension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -976,7 +1004,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetricDimension proto.InternalMessageInf func (m *ClusterAnalysisTemplate) Reset() { *m = ClusterAnalysisTemplate{} } func (*ClusterAnalysisTemplate) ProtoMessage() {} func (*ClusterAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{33} + return fileDescriptor_e0e705f843545fab, []int{34} } func (m *ClusterAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1032,7 @@ var xxx_messageInfo_ClusterAnalysisTemplate proto.InternalMessageInfo func (m *ClusterAnalysisTemplateList) Reset() { *m = ClusterAnalysisTemplateList{} } func (*ClusterAnalysisTemplateList) ProtoMessage() {} func (*ClusterAnalysisTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{34} + return fileDescriptor_e0e705f843545fab, []int{35} } func (m *ClusterAnalysisTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1032,7 +1060,7 @@ var xxx_messageInfo_ClusterAnalysisTemplateList proto.InternalMessageInfo func (m *DatadogMetric) Reset() { *m = DatadogMetric{} } func (*DatadogMetric) ProtoMessage() {} func (*DatadogMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{35} + return fileDescriptor_e0e705f843545fab, []int{36} } func (m *DatadogMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1060,7 +1088,7 @@ var xxx_messageInfo_DatadogMetric proto.InternalMessageInfo func (m *DryRun) Reset() { *m = DryRun{} } func (*DryRun) ProtoMessage() {} func (*DryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{36} + return fileDescriptor_e0e705f843545fab, []int{37} } func (m *DryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1088,7 +1116,7 @@ var xxx_messageInfo_DryRun proto.InternalMessageInfo func (m *Experiment) Reset() { *m = Experiment{} } func (*Experiment) ProtoMessage() {} func (*Experiment) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{37} + return fileDescriptor_e0e705f843545fab, []int{38} } func (m *Experiment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1116,7 +1144,7 @@ var xxx_messageInfo_Experiment proto.InternalMessageInfo func (m *ExperimentAnalysisRunStatus) Reset() { *m = ExperimentAnalysisRunStatus{} } func (*ExperimentAnalysisRunStatus) ProtoMessage() {} func (*ExperimentAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{38} + return fileDescriptor_e0e705f843545fab, []int{39} } func (m *ExperimentAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1144,7 +1172,7 @@ var xxx_messageInfo_ExperimentAnalysisRunStatus proto.InternalMessageInfo func (m *ExperimentAnalysisTemplateRef) Reset() { *m = ExperimentAnalysisTemplateRef{} } func (*ExperimentAnalysisTemplateRef) ProtoMessage() {} func (*ExperimentAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{39} + return fileDescriptor_e0e705f843545fab, []int{40} } func (m *ExperimentAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1172,7 +1200,7 @@ var xxx_messageInfo_ExperimentAnalysisTemplateRef proto.InternalMessageInfo func (m *ExperimentCondition) Reset() { *m = ExperimentCondition{} } func (*ExperimentCondition) ProtoMessage() {} func (*ExperimentCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{40} + return fileDescriptor_e0e705f843545fab, []int{41} } func (m *ExperimentCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1200,7 +1228,7 @@ var xxx_messageInfo_ExperimentCondition proto.InternalMessageInfo func (m *ExperimentList) Reset() { *m = ExperimentList{} } func (*ExperimentList) ProtoMessage() {} func (*ExperimentList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{41} + return fileDescriptor_e0e705f843545fab, []int{42} } func (m *ExperimentList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1228,7 +1256,7 @@ var xxx_messageInfo_ExperimentList proto.InternalMessageInfo func (m *ExperimentSpec) Reset() { *m = ExperimentSpec{} } func (*ExperimentSpec) ProtoMessage() {} func (*ExperimentSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{42} + return fileDescriptor_e0e705f843545fab, []int{43} } func (m *ExperimentSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1256,7 +1284,7 @@ var xxx_messageInfo_ExperimentSpec proto.InternalMessageInfo func (m *ExperimentStatus) Reset() { *m = ExperimentStatus{} } func (*ExperimentStatus) ProtoMessage() {} func (*ExperimentStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{43} + return fileDescriptor_e0e705f843545fab, []int{44} } func (m *ExperimentStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1284,7 +1312,7 @@ var xxx_messageInfo_ExperimentStatus proto.InternalMessageInfo func (m *FieldRef) Reset() { *m = FieldRef{} } func (*FieldRef) ProtoMessage() {} func (*FieldRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{44} + return fileDescriptor_e0e705f843545fab, []int{45} } func (m *FieldRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1312,7 +1340,7 @@ var xxx_messageInfo_FieldRef proto.InternalMessageInfo func (m *GraphiteMetric) Reset() { *m = GraphiteMetric{} } func (*GraphiteMetric) ProtoMessage() {} func (*GraphiteMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{45} + return fileDescriptor_e0e705f843545fab, []int{46} } func (m *GraphiteMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1340,7 +1368,7 @@ var xxx_messageInfo_GraphiteMetric proto.InternalMessageInfo func (m *HeaderRoutingMatch) Reset() { *m = HeaderRoutingMatch{} } func (*HeaderRoutingMatch) ProtoMessage() {} func (*HeaderRoutingMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{46} + return fileDescriptor_e0e705f843545fab, []int{47} } func (m *HeaderRoutingMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1368,7 +1396,7 @@ var xxx_messageInfo_HeaderRoutingMatch proto.InternalMessageInfo func (m *InfluxdbMetric) Reset() { *m = InfluxdbMetric{} } func (*InfluxdbMetric) ProtoMessage() {} func (*InfluxdbMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{47} + return fileDescriptor_e0e705f843545fab, []int{48} } func (m *InfluxdbMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1424,7 @@ var xxx_messageInfo_InfluxdbMetric proto.InternalMessageInfo func (m *IstioDestinationRule) Reset() { *m = IstioDestinationRule{} } func (*IstioDestinationRule) ProtoMessage() {} func (*IstioDestinationRule) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{48} + return fileDescriptor_e0e705f843545fab, []int{49} } func (m *IstioDestinationRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1424,7 +1452,7 @@ var xxx_messageInfo_IstioDestinationRule proto.InternalMessageInfo func (m *IstioTrafficRouting) Reset() { *m = IstioTrafficRouting{} } func (*IstioTrafficRouting) ProtoMessage() {} func (*IstioTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{49} + return fileDescriptor_e0e705f843545fab, []int{50} } func (m *IstioTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1452,7 +1480,7 @@ var xxx_messageInfo_IstioTrafficRouting proto.InternalMessageInfo func (m *IstioVirtualService) Reset() { *m = IstioVirtualService{} } func (*IstioVirtualService) ProtoMessage() {} func (*IstioVirtualService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{50} + return fileDescriptor_e0e705f843545fab, []int{51} } func (m *IstioVirtualService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1480,7 +1508,7 @@ var xxx_messageInfo_IstioVirtualService proto.InternalMessageInfo func (m *JobMetric) Reset() { *m = JobMetric{} } func (*JobMetric) ProtoMessage() {} func (*JobMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{51} + return fileDescriptor_e0e705f843545fab, []int{52} } func (m *JobMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1536,7 @@ var xxx_messageInfo_JobMetric proto.InternalMessageInfo func (m *KayentaMetric) Reset() { *m = KayentaMetric{} } func (*KayentaMetric) ProtoMessage() {} func (*KayentaMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{52} + return fileDescriptor_e0e705f843545fab, []int{53} } func (m *KayentaMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1536,7 +1564,7 @@ var xxx_messageInfo_KayentaMetric proto.InternalMessageInfo func (m *KayentaScope) Reset() { *m = KayentaScope{} } func (*KayentaScope) ProtoMessage() {} func (*KayentaScope) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{53} + return fileDescriptor_e0e705f843545fab, []int{54} } func (m *KayentaScope) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1592,7 @@ var xxx_messageInfo_KayentaScope proto.InternalMessageInfo func (m *KayentaThreshold) Reset() { *m = KayentaThreshold{} } func (*KayentaThreshold) ProtoMessage() {} func (*KayentaThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{54} + return fileDescriptor_e0e705f843545fab, []int{55} } func (m *KayentaThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1592,7 +1620,7 @@ var xxx_messageInfo_KayentaThreshold proto.InternalMessageInfo func (m *MangedRoutes) Reset() { *m = MangedRoutes{} } func (*MangedRoutes) ProtoMessage() {} func (*MangedRoutes) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{55} + return fileDescriptor_e0e705f843545fab, []int{56} } func (m *MangedRoutes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1620,7 +1648,7 @@ var xxx_messageInfo_MangedRoutes proto.InternalMessageInfo func (m *Measurement) Reset() { *m = Measurement{} } func (*Measurement) ProtoMessage() {} func (*Measurement) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{56} + return fileDescriptor_e0e705f843545fab, []int{57} } func (m *Measurement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1648,7 +1676,7 @@ var xxx_messageInfo_Measurement proto.InternalMessageInfo func (m *MeasurementRetention) Reset() { *m = MeasurementRetention{} } func (*MeasurementRetention) ProtoMessage() {} func (*MeasurementRetention) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{57} + return fileDescriptor_e0e705f843545fab, []int{58} } func (m *MeasurementRetention) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,7 +1704,7 @@ var xxx_messageInfo_MeasurementRetention proto.InternalMessageInfo func (m *Metric) Reset() { *m = Metric{} } func (*Metric) ProtoMessage() {} func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{58} + return fileDescriptor_e0e705f843545fab, []int{59} } func (m *Metric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1704,7 +1732,7 @@ var xxx_messageInfo_Metric proto.InternalMessageInfo func (m *MetricProvider) Reset() { *m = MetricProvider{} } func (*MetricProvider) ProtoMessage() {} func (*MetricProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{59} + return fileDescriptor_e0e705f843545fab, []int{60} } func (m *MetricProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1732,7 +1760,7 @@ var xxx_messageInfo_MetricProvider proto.InternalMessageInfo func (m *MetricResult) Reset() { *m = MetricResult{} } func (*MetricResult) ProtoMessage() {} func (*MetricResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{60} + return fileDescriptor_e0e705f843545fab, []int{61} } func (m *MetricResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1760,7 +1788,7 @@ var xxx_messageInfo_MetricResult proto.InternalMessageInfo func (m *NewRelicMetric) Reset() { *m = NewRelicMetric{} } func (*NewRelicMetric) ProtoMessage() {} func (*NewRelicMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{61} + return fileDescriptor_e0e705f843545fab, []int{62} } func (m *NewRelicMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1788,7 +1816,7 @@ var xxx_messageInfo_NewRelicMetric proto.InternalMessageInfo func (m *NginxTrafficRouting) Reset() { *m = NginxTrafficRouting{} } func (*NginxTrafficRouting) ProtoMessage() {} func (*NginxTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{62} + return fileDescriptor_e0e705f843545fab, []int{63} } func (m *NginxTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1813,10 +1841,38 @@ func (m *NginxTrafficRouting) XXX_DiscardUnknown() { var xxx_messageInfo_NginxTrafficRouting proto.InternalMessageInfo +func (m *OAuth2Config) Reset() { *m = OAuth2Config{} } +func (*OAuth2Config) ProtoMessage() {} +func (*OAuth2Config) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{64} +} +func (m *OAuth2Config) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OAuth2Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *OAuth2Config) XXX_Merge(src proto.Message) { + xxx_messageInfo_OAuth2Config.Merge(m, src) +} +func (m *OAuth2Config) XXX_Size() int { + return m.Size() +} +func (m *OAuth2Config) XXX_DiscardUnknown() { + xxx_messageInfo_OAuth2Config.DiscardUnknown(m) +} + +var xxx_messageInfo_OAuth2Config proto.InternalMessageInfo + func (m *ObjectRef) Reset() { *m = ObjectRef{} } func (*ObjectRef) ProtoMessage() {} func (*ObjectRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{63} + return fileDescriptor_e0e705f843545fab, []int{65} } func (m *ObjectRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1844,7 +1900,7 @@ var xxx_messageInfo_ObjectRef proto.InternalMessageInfo func (m *PauseCondition) Reset() { *m = PauseCondition{} } func (*PauseCondition) ProtoMessage() {} func (*PauseCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{64} + return fileDescriptor_e0e705f843545fab, []int{66} } func (m *PauseCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1872,7 +1928,7 @@ var xxx_messageInfo_PauseCondition proto.InternalMessageInfo func (m *PingPongSpec) Reset() { *m = PingPongSpec{} } func (*PingPongSpec) ProtoMessage() {} func (*PingPongSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{65} + return fileDescriptor_e0e705f843545fab, []int{67} } func (m *PingPongSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1900,7 +1956,7 @@ var xxx_messageInfo_PingPongSpec proto.InternalMessageInfo func (m *PodTemplateMetadata) Reset() { *m = PodTemplateMetadata{} } func (*PodTemplateMetadata) ProtoMessage() {} func (*PodTemplateMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{66} + return fileDescriptor_e0e705f843545fab, []int{68} } func (m *PodTemplateMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1930,7 +1986,7 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*PreferredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*PreferredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{67} + return fileDescriptor_e0e705f843545fab, []int{69} } func (m *PreferredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1955,38 +2011,10 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) XXX_DiscardUnknown() { var xxx_messageInfo_PreferredDuringSchedulingIgnoredDuringExecution proto.InternalMessageInfo -func (m *PrometheusAuth) Reset() { *m = PrometheusAuth{} } -func (*PrometheusAuth) ProtoMessage() {} -func (*PrometheusAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{68} -} -func (m *PrometheusAuth) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PrometheusAuth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *PrometheusAuth) XXX_Merge(src proto.Message) { - xxx_messageInfo_PrometheusAuth.Merge(m, src) -} -func (m *PrometheusAuth) XXX_Size() int { - return m.Size() -} -func (m *PrometheusAuth) XXX_DiscardUnknown() { - xxx_messageInfo_PrometheusAuth.DiscardUnknown(m) -} - -var xxx_messageInfo_PrometheusAuth proto.InternalMessageInfo - func (m *PrometheusMetric) Reset() { *m = PrometheusMetric{} } func (*PrometheusMetric) ProtoMessage() {} func (*PrometheusMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{69} + return fileDescriptor_e0e705f843545fab, []int{70} } func (m *PrometheusMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2016,7 +2044,7 @@ func (m *RequiredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*RequiredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*RequiredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{70} + return fileDescriptor_e0e705f843545fab, []int{71} } func (m *RequiredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2044,7 +2072,7 @@ var xxx_messageInfo_RequiredDuringSchedulingIgnoredDuringExecution proto.Interna func (m *RollbackWindowSpec) Reset() { *m = RollbackWindowSpec{} } func (*RollbackWindowSpec) ProtoMessage() {} func (*RollbackWindowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{71} + return fileDescriptor_e0e705f843545fab, []int{72} } func (m *RollbackWindowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2072,7 +2100,7 @@ var xxx_messageInfo_RollbackWindowSpec proto.InternalMessageInfo func (m *Rollout) Reset() { *m = Rollout{} } func (*Rollout) ProtoMessage() {} func (*Rollout) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{72} + return fileDescriptor_e0e705f843545fab, []int{73} } func (m *Rollout) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2100,7 +2128,7 @@ var xxx_messageInfo_Rollout proto.InternalMessageInfo func (m *RolloutAnalysis) Reset() { *m = RolloutAnalysis{} } func (*RolloutAnalysis) ProtoMessage() {} func (*RolloutAnalysis) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{73} + return fileDescriptor_e0e705f843545fab, []int{74} } func (m *RolloutAnalysis) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2128,7 +2156,7 @@ var xxx_messageInfo_RolloutAnalysis proto.InternalMessageInfo func (m *RolloutAnalysisBackground) Reset() { *m = RolloutAnalysisBackground{} } func (*RolloutAnalysisBackground) ProtoMessage() {} func (*RolloutAnalysisBackground) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{74} + return fileDescriptor_e0e705f843545fab, []int{75} } func (m *RolloutAnalysisBackground) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2156,7 +2184,7 @@ var xxx_messageInfo_RolloutAnalysisBackground proto.InternalMessageInfo func (m *RolloutAnalysisRunStatus) Reset() { *m = RolloutAnalysisRunStatus{} } func (*RolloutAnalysisRunStatus) ProtoMessage() {} func (*RolloutAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{75} + return fileDescriptor_e0e705f843545fab, []int{76} } func (m *RolloutAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2184,7 +2212,7 @@ var xxx_messageInfo_RolloutAnalysisRunStatus proto.InternalMessageInfo func (m *RolloutAnalysisTemplate) Reset() { *m = RolloutAnalysisTemplate{} } func (*RolloutAnalysisTemplate) ProtoMessage() {} func (*RolloutAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{76} + return fileDescriptor_e0e705f843545fab, []int{77} } func (m *RolloutAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2212,7 +2240,7 @@ var xxx_messageInfo_RolloutAnalysisTemplate proto.InternalMessageInfo func (m *RolloutCondition) Reset() { *m = RolloutCondition{} } func (*RolloutCondition) ProtoMessage() {} func (*RolloutCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{77} + return fileDescriptor_e0e705f843545fab, []int{78} } func (m *RolloutCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2240,7 +2268,7 @@ var xxx_messageInfo_RolloutCondition proto.InternalMessageInfo func (m *RolloutExperimentStep) Reset() { *m = RolloutExperimentStep{} } func (*RolloutExperimentStep) ProtoMessage() {} func (*RolloutExperimentStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{78} + return fileDescriptor_e0e705f843545fab, []int{79} } func (m *RolloutExperimentStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2270,7 +2298,7 @@ func (m *RolloutExperimentStepAnalysisTemplateRef) Reset() { } func (*RolloutExperimentStepAnalysisTemplateRef) ProtoMessage() {} func (*RolloutExperimentStepAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{79} + return fileDescriptor_e0e705f843545fab, []int{80} } func (m *RolloutExperimentStepAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2298,7 +2326,7 @@ var xxx_messageInfo_RolloutExperimentStepAnalysisTemplateRef proto.InternalMessa func (m *RolloutExperimentTemplate) Reset() { *m = RolloutExperimentTemplate{} } func (*RolloutExperimentTemplate) ProtoMessage() {} func (*RolloutExperimentTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{80} + return fileDescriptor_e0e705f843545fab, []int{81} } func (m *RolloutExperimentTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2326,7 +2354,7 @@ var xxx_messageInfo_RolloutExperimentTemplate proto.InternalMessageInfo func (m *RolloutList) Reset() { *m = RolloutList{} } func (*RolloutList) ProtoMessage() {} func (*RolloutList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{81} + return fileDescriptor_e0e705f843545fab, []int{82} } func (m *RolloutList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2354,7 +2382,7 @@ var xxx_messageInfo_RolloutList proto.InternalMessageInfo func (m *RolloutPause) Reset() { *m = RolloutPause{} } func (*RolloutPause) ProtoMessage() {} func (*RolloutPause) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{82} + return fileDescriptor_e0e705f843545fab, []int{83} } func (m *RolloutPause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2382,7 +2410,7 @@ var xxx_messageInfo_RolloutPause proto.InternalMessageInfo func (m *RolloutSpec) Reset() { *m = RolloutSpec{} } func (*RolloutSpec) ProtoMessage() {} func (*RolloutSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{83} + return fileDescriptor_e0e705f843545fab, []int{84} } func (m *RolloutSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2410,7 +2438,7 @@ var xxx_messageInfo_RolloutSpec proto.InternalMessageInfo func (m *RolloutStatus) Reset() { *m = RolloutStatus{} } func (*RolloutStatus) ProtoMessage() {} func (*RolloutStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{84} + return fileDescriptor_e0e705f843545fab, []int{85} } func (m *RolloutStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2438,7 +2466,7 @@ var xxx_messageInfo_RolloutStatus proto.InternalMessageInfo func (m *RolloutStrategy) Reset() { *m = RolloutStrategy{} } func (*RolloutStrategy) ProtoMessage() {} func (*RolloutStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{85} + return fileDescriptor_e0e705f843545fab, []int{86} } func (m *RolloutStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2466,7 +2494,7 @@ var xxx_messageInfo_RolloutStrategy proto.InternalMessageInfo func (m *RolloutTrafficRouting) Reset() { *m = RolloutTrafficRouting{} } func (*RolloutTrafficRouting) ProtoMessage() {} func (*RolloutTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{86} + return fileDescriptor_e0e705f843545fab, []int{87} } func (m *RolloutTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2494,7 +2522,7 @@ var xxx_messageInfo_RolloutTrafficRouting proto.InternalMessageInfo func (m *RouteMatch) Reset() { *m = RouteMatch{} } func (*RouteMatch) ProtoMessage() {} func (*RouteMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{87} + return fileDescriptor_e0e705f843545fab, []int{88} } func (m *RouteMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2522,7 +2550,7 @@ var xxx_messageInfo_RouteMatch proto.InternalMessageInfo func (m *RunSummary) Reset() { *m = RunSummary{} } func (*RunSummary) ProtoMessage() {} func (*RunSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{88} + return fileDescriptor_e0e705f843545fab, []int{89} } func (m *RunSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2550,7 +2578,7 @@ var xxx_messageInfo_RunSummary proto.InternalMessageInfo func (m *SMITrafficRouting) Reset() { *m = SMITrafficRouting{} } func (*SMITrafficRouting) ProtoMessage() {} func (*SMITrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{89} + return fileDescriptor_e0e705f843545fab, []int{90} } func (m *SMITrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2578,7 +2606,7 @@ var xxx_messageInfo_SMITrafficRouting proto.InternalMessageInfo func (m *ScopeDetail) Reset() { *m = ScopeDetail{} } func (*ScopeDetail) ProtoMessage() {} func (*ScopeDetail) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{90} + return fileDescriptor_e0e705f843545fab, []int{91} } func (m *ScopeDetail) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2606,7 +2634,7 @@ var xxx_messageInfo_ScopeDetail proto.InternalMessageInfo func (m *SecretKeyRef) Reset() { *m = SecretKeyRef{} } func (*SecretKeyRef) ProtoMessage() {} func (*SecretKeyRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{91} + return fileDescriptor_e0e705f843545fab, []int{92} } func (m *SecretKeyRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2634,7 +2662,7 @@ var xxx_messageInfo_SecretKeyRef proto.InternalMessageInfo func (m *SetCanaryScale) Reset() { *m = SetCanaryScale{} } func (*SetCanaryScale) ProtoMessage() {} func (*SetCanaryScale) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{92} + return fileDescriptor_e0e705f843545fab, []int{93} } func (m *SetCanaryScale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2662,7 +2690,7 @@ var xxx_messageInfo_SetCanaryScale proto.InternalMessageInfo func (m *SetHeaderRoute) Reset() { *m = SetHeaderRoute{} } func (*SetHeaderRoute) ProtoMessage() {} func (*SetHeaderRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{93} + return fileDescriptor_e0e705f843545fab, []int{94} } func (m *SetHeaderRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2690,7 +2718,7 @@ var xxx_messageInfo_SetHeaderRoute proto.InternalMessageInfo func (m *SetMirrorRoute) Reset() { *m = SetMirrorRoute{} } func (*SetMirrorRoute) ProtoMessage() {} func (*SetMirrorRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{94} + return fileDescriptor_e0e705f843545fab, []int{95} } func (m *SetMirrorRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2718,7 +2746,7 @@ var xxx_messageInfo_SetMirrorRoute proto.InternalMessageInfo func (m *Sigv4Config) Reset() { *m = Sigv4Config{} } func (*Sigv4Config) ProtoMessage() {} func (*Sigv4Config) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{95} + return fileDescriptor_e0e705f843545fab, []int{96} } func (m *Sigv4Config) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2746,7 +2774,7 @@ var xxx_messageInfo_Sigv4Config proto.InternalMessageInfo func (m *SkyWalkingMetric) Reset() { *m = SkyWalkingMetric{} } func (*SkyWalkingMetric) ProtoMessage() {} func (*SkyWalkingMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{96} + return fileDescriptor_e0e705f843545fab, []int{97} } func (m *SkyWalkingMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2774,7 +2802,7 @@ var xxx_messageInfo_SkyWalkingMetric proto.InternalMessageInfo func (m *StickinessConfig) Reset() { *m = StickinessConfig{} } func (*StickinessConfig) ProtoMessage() {} func (*StickinessConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{97} + return fileDescriptor_e0e705f843545fab, []int{98} } func (m *StickinessConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2802,7 +2830,7 @@ var xxx_messageInfo_StickinessConfig proto.InternalMessageInfo func (m *StringMatch) Reset() { *m = StringMatch{} } func (*StringMatch) ProtoMessage() {} func (*StringMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{98} + return fileDescriptor_e0e705f843545fab, []int{99} } func (m *StringMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2830,7 +2858,7 @@ var xxx_messageInfo_StringMatch proto.InternalMessageInfo func (m *TCPRoute) Reset() { *m = TCPRoute{} } func (*TCPRoute) ProtoMessage() {} func (*TCPRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{99} + return fileDescriptor_e0e705f843545fab, []int{100} } func (m *TCPRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2858,7 +2886,7 @@ var xxx_messageInfo_TCPRoute proto.InternalMessageInfo func (m *TLSRoute) Reset() { *m = TLSRoute{} } func (*TLSRoute) ProtoMessage() {} func (*TLSRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{100} + return fileDescriptor_e0e705f843545fab, []int{101} } func (m *TLSRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2914,7 @@ var xxx_messageInfo_TLSRoute proto.InternalMessageInfo func (m *TemplateService) Reset() { *m = TemplateService{} } func (*TemplateService) ProtoMessage() {} func (*TemplateService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{101} + return fileDescriptor_e0e705f843545fab, []int{102} } func (m *TemplateService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2914,7 +2942,7 @@ var xxx_messageInfo_TemplateService proto.InternalMessageInfo func (m *TemplateSpec) Reset() { *m = TemplateSpec{} } func (*TemplateSpec) ProtoMessage() {} func (*TemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{102} + return fileDescriptor_e0e705f843545fab, []int{103} } func (m *TemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,7 +2970,7 @@ var xxx_messageInfo_TemplateSpec proto.InternalMessageInfo func (m *TemplateStatus) Reset() { *m = TemplateStatus{} } func (*TemplateStatus) ProtoMessage() {} func (*TemplateStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{103} + return fileDescriptor_e0e705f843545fab, []int{104} } func (m *TemplateStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2970,7 +2998,7 @@ var xxx_messageInfo_TemplateStatus proto.InternalMessageInfo func (m *TraefikTrafficRouting) Reset() { *m = TraefikTrafficRouting{} } func (*TraefikTrafficRouting) ProtoMessage() {} func (*TraefikTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{104} + return fileDescriptor_e0e705f843545fab, []int{105} } func (m *TraefikTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2998,7 +3026,7 @@ var xxx_messageInfo_TraefikTrafficRouting proto.InternalMessageInfo func (m *TrafficWeights) Reset() { *m = TrafficWeights{} } func (*TrafficWeights) ProtoMessage() {} func (*TrafficWeights) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{105} + return fileDescriptor_e0e705f843545fab, []int{106} } func (m *TrafficWeights) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3026,7 +3054,7 @@ var xxx_messageInfo_TrafficWeights proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{106} + return fileDescriptor_e0e705f843545fab, []int{107} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3054,7 +3082,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *WavefrontMetric) Reset() { *m = WavefrontMetric{} } func (*WavefrontMetric) ProtoMessage() {} func (*WavefrontMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{107} + return fileDescriptor_e0e705f843545fab, []int{108} } func (m *WavefrontMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3082,7 +3110,7 @@ var xxx_messageInfo_WavefrontMetric proto.InternalMessageInfo func (m *WebMetric) Reset() { *m = WebMetric{} } func (*WebMetric) ProtoMessage() {} func (*WebMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{108} + return fileDescriptor_e0e705f843545fab, []int{109} } func (m *WebMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3110,7 +3138,7 @@ var xxx_messageInfo_WebMetric proto.InternalMessageInfo func (m *WebMetricHeader) Reset() { *m = WebMetricHeader{} } func (*WebMetricHeader) ProtoMessage() {} func (*WebMetricHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{109} + return fileDescriptor_e0e705f843545fab, []int{110} } func (m *WebMetricHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3138,7 +3166,7 @@ var xxx_messageInfo_WebMetricHeader proto.InternalMessageInfo func (m *WeightDestination) Reset() { *m = WeightDestination{} } func (*WeightDestination) ProtoMessage() {} func (*WeightDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{110} + return fileDescriptor_e0e705f843545fab, []int{111} } func (m *WeightDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,6 +3216,7 @@ func init() { proto.RegisterType((*AppMeshVirtualService)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AppMeshVirtualService") proto.RegisterType((*Argument)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Argument") proto.RegisterType((*ArgumentValueFrom)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ArgumentValueFrom") + proto.RegisterType((*Authentication)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Authentication") proto.RegisterType((*AwsResourceRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AwsResourceRef") proto.RegisterType((*BlueGreenStatus)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.BlueGreenStatus") proto.RegisterType((*BlueGreenStrategy)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.BlueGreenStrategy") @@ -3233,6 +3262,7 @@ func init() { proto.RegisterType((*NewRelicMetric)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NewRelicMetric") proto.RegisterType((*NginxTrafficRouting)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NginxTrafficRouting") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.NginxTrafficRouting.AdditionalIngressAnnotationsEntry") + proto.RegisterType((*OAuth2Config)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.OAuth2Config") proto.RegisterType((*ObjectRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ObjectRef") proto.RegisterType((*PauseCondition)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PauseCondition") proto.RegisterType((*PingPongSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PingPongSpec") @@ -3240,7 +3270,6 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PodTemplateMetadata.AnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PodTemplateMetadata.LabelsEntry") proto.RegisterType((*PreferredDuringSchedulingIgnoredDuringExecution)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution") - proto.RegisterType((*PrometheusAuth)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth") proto.RegisterType((*PrometheusMetric)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric") proto.RegisterType((*RequiredDuringSchedulingIgnoredDuringExecution)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution") proto.RegisterType((*RollbackWindowSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RollbackWindowSpec") @@ -3292,521 +3321,528 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8214 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x1e, 0xb9, 0x24, 0xb7, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, - 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0x7d, 0x24, 0x27, 0x9d, 0x72, 0xc9, 0x0c, 0xb9, - 0x7b, 0xcb, 0x3d, 0x72, 0x6f, 0xf6, 0x0d, 0xf7, 0x56, 0x96, 0x74, 0xb6, 0x9a, 0x33, 0xc5, 0x61, - 0x2f, 0x67, 0xba, 0xc7, 0xdd, 0x3d, 0xdc, 0xe5, 0xe9, 0x60, 0x9d, 0x2c, 0x9c, 0xa2, 0x18, 0x12, - 0xac, 0xc4, 0x16, 0x82, 0x20, 0x41, 0xa0, 0x18, 0x06, 0xec, 0xc4, 0xfe, 0x25, 0x24, 0xc8, 0x1f, - 0x03, 0x11, 0xe2, 0xd8, 0xd6, 0x8f, 0x38, 0x90, 0x7f, 0x24, 0xb2, 0x03, 0x98, 0x8e, 0xa8, 0xfc, - 0x49, 0x90, 0x40, 0x08, 0xe0, 0x20, 0xf0, 0xfe, 0x08, 0x82, 0xfa, 0xec, 0xea, 0x9e, 0x1e, 0xee, - 0xcc, 0x4e, 0x73, 0x75, 0x49, 0xfc, 0x6f, 0xa6, 0x5e, 0xd5, 0x7b, 0xaf, 0xeb, 0xe3, 0xd5, 0xab, - 0x57, 0xef, 0xbd, 0x82, 0xcd, 0x96, 0x1b, 0xed, 0xf5, 0x76, 0x56, 0x1a, 0x7e, 0x67, 0xd5, 0x09, - 0x5a, 0x7e, 0x37, 0xf0, 0xef, 0xf2, 0x1f, 0x1f, 0x0b, 0xfc, 0x76, 0xdb, 0xef, 0x45, 0xe1, 0x6a, - 0x77, 0xbf, 0xb5, 0xea, 0x74, 0xdd, 0x70, 0x55, 0x97, 0x1c, 0x7c, 0xc2, 0x69, 0x77, 0xf7, 0x9c, - 0x4f, 0xac, 0xb6, 0xa8, 0x47, 0x03, 0x27, 0xa2, 0xcd, 0x95, 0x6e, 0xe0, 0x47, 0x3e, 0xf9, 0x74, - 0x8c, 0x6d, 0x45, 0x61, 0xe3, 0x3f, 0x7e, 0x4e, 0xb5, 0x5d, 0xe9, 0xee, 0xb7, 0x56, 0x18, 0xb6, - 0x15, 0x5d, 0xa2, 0xb0, 0x2d, 0x7f, 0xcc, 0xe0, 0xa5, 0xe5, 0xb7, 0xfc, 0x55, 0x8e, 0x74, 0xa7, - 0xb7, 0xcb, 0xff, 0xf1, 0x3f, 0xfc, 0x97, 0x20, 0xb6, 0xfc, 0xec, 0xfe, 0x2b, 0xe1, 0x8a, 0xeb, - 0x33, 0xde, 0x56, 0x77, 0x9c, 0xa8, 0xb1, 0xb7, 0x7a, 0xd0, 0xc7, 0xd1, 0xb2, 0x6d, 0x54, 0x6a, - 0xf8, 0x01, 0xcd, 0xaa, 0xf3, 0x52, 0x5c, 0xa7, 0xe3, 0x34, 0xf6, 0x5c, 0x8f, 0x06, 0x87, 0xf1, - 0x57, 0x77, 0x68, 0xe4, 0x64, 0xb5, 0x5a, 0x1d, 0xd4, 0x2a, 0xe8, 0x79, 0x91, 0xdb, 0xa1, 0x7d, - 0x0d, 0xfe, 0xda, 0xc3, 0x1a, 0x84, 0x8d, 0x3d, 0xda, 0x71, 0xfa, 0xda, 0xbd, 0x38, 0xa8, 0x5d, - 0x2f, 0x72, 0xdb, 0xab, 0xae, 0x17, 0x85, 0x51, 0x90, 0x6e, 0x64, 0xff, 0xb8, 0x00, 0xa5, 0xca, - 0x66, 0xb5, 0x1e, 0x39, 0x51, 0x2f, 0x24, 0x5f, 0xb5, 0x60, 0xae, 0xed, 0x3b, 0xcd, 0xaa, 0xd3, - 0x76, 0xbc, 0x06, 0x0d, 0x96, 0xac, 0x67, 0xac, 0x2b, 0xb3, 0x2f, 0x6c, 0xae, 0x8c, 0x33, 0x5e, - 0x2b, 0x95, 0x7b, 0x21, 0xd2, 0xd0, 0xef, 0x05, 0x0d, 0x8a, 0x74, 0xb7, 0x7a, 0xfe, 0x7b, 0x47, - 0xe5, 0x27, 0x8e, 0x8f, 0xca, 0x73, 0x9b, 0x06, 0x25, 0x4c, 0xd0, 0x25, 0xdf, 0xb2, 0xe0, 0x6c, - 0xc3, 0xf1, 0x9c, 0xe0, 0x70, 0xdb, 0x09, 0x5a, 0x34, 0x7a, 0x3d, 0xf0, 0x7b, 0xdd, 0xa5, 0x89, - 0x53, 0xe0, 0xe6, 0x49, 0xc9, 0xcd, 0xd9, 0xb5, 0x34, 0x39, 0xec, 0xe7, 0x80, 0xf3, 0x15, 0x46, - 0xce, 0x4e, 0x9b, 0x9a, 0x7c, 0x15, 0x4e, 0x93, 0xaf, 0x7a, 0x9a, 0x1c, 0xf6, 0x73, 0x40, 0x3e, - 0x02, 0xd3, 0xae, 0xd7, 0x0a, 0x68, 0x18, 0x2e, 0x4d, 0x3e, 0x63, 0x5d, 0x29, 0x55, 0x17, 0x64, - 0xf3, 0xe9, 0x0d, 0x51, 0x8c, 0x0a, 0x6e, 0x7f, 0xa7, 0x00, 0x67, 0x2b, 0x9b, 0xd5, 0xed, 0xc0, - 0xd9, 0xdd, 0x75, 0x1b, 0xe8, 0xf7, 0x22, 0xd7, 0x6b, 0x99, 0x08, 0xac, 0x93, 0x11, 0x90, 0x97, - 0x61, 0x36, 0xa4, 0xc1, 0x81, 0xdb, 0xa0, 0x35, 0x3f, 0x88, 0xf8, 0xa0, 0x14, 0xab, 0xe7, 0x64, - 0xf5, 0xd9, 0x7a, 0x0c, 0x42, 0xb3, 0x1e, 0x6b, 0x16, 0xf8, 0x7e, 0x24, 0xe1, 0xbc, 0xcf, 0x4a, - 0x71, 0x33, 0x8c, 0x41, 0x68, 0xd6, 0x23, 0xeb, 0xb0, 0xe8, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, - 0x7b, 0xb5, 0x80, 0xee, 0xba, 0xf7, 0xe5, 0x27, 0x2e, 0xc9, 0xb6, 0x8b, 0x95, 0x14, 0x1c, 0xfb, - 0x5a, 0x90, 0x6f, 0x5a, 0xb0, 0x18, 0x46, 0x6e, 0x63, 0xdf, 0xf5, 0x68, 0x18, 0xae, 0xf9, 0xde, - 0xae, 0xdb, 0x5a, 0x2a, 0xf2, 0x61, 0xbb, 0x39, 0xde, 0xb0, 0xd5, 0x53, 0x58, 0xab, 0xe7, 0x19, - 0x4b, 0xe9, 0x52, 0xec, 0xa3, 0x4e, 0x3e, 0x0a, 0x25, 0xd9, 0xa3, 0x34, 0x5c, 0x9a, 0x7a, 0xa6, - 0x70, 0xa5, 0x54, 0x3d, 0x73, 0x7c, 0x54, 0x2e, 0x6d, 0xa8, 0x42, 0x8c, 0xe1, 0xf6, 0x3a, 0x2c, - 0x55, 0x3a, 0x3b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x0d, 0xdd, 0x15, 0x98, 0xe9, 0x38, 0xdd, - 0xae, 0xeb, 0xb5, 0xd8, 0xd8, 0x31, 0x3c, 0x73, 0xc7, 0x47, 0xe5, 0x99, 0x2d, 0x59, 0x86, 0x1a, - 0x6a, 0xff, 0xc9, 0x04, 0xcc, 0x56, 0x3c, 0xa7, 0x7d, 0x18, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x05, - 0x98, 0x61, 0x52, 0xab, 0xe9, 0x44, 0x8e, 0x5c, 0xe9, 0x1f, 0x5f, 0x11, 0x42, 0x64, 0xc5, 0x14, - 0x22, 0xf1, 0xe7, 0xb3, 0xda, 0x2b, 0x07, 0x9f, 0x58, 0x79, 0x73, 0xe7, 0x2e, 0x6d, 0x44, 0x5b, - 0x34, 0x72, 0xaa, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, 0x2e, 0x6d, - 0xc8, 0x95, 0xbb, 0x35, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x3a, 0x27, 0x49, 0x4f, - 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0x9b, 0xf9, 0x91, - 0xe4, 0x68, 0xab, 0xf3, 0x92, 0xe8, 0x94, 0xf8, 0x8f, 0x92, 0x9c, 0xfd, 0x1f, 0x2d, 0x38, 0x67, - 0xd4, 0xae, 0x04, 0xad, 0x5e, 0x87, 0x7a, 0x11, 0x79, 0x06, 0x26, 0x3d, 0xa7, 0x43, 0xe5, 0xaa, - 0xd2, 0x2c, 0xdf, 0x74, 0x3a, 0x14, 0x39, 0x84, 0x3c, 0x0b, 0xc5, 0x03, 0xa7, 0xdd, 0xa3, 0xbc, - 0x93, 0x4a, 0xd5, 0x33, 0xb2, 0x4a, 0xf1, 0x2d, 0x56, 0x88, 0x02, 0x46, 0xde, 0x85, 0x12, 0xff, - 0x71, 0x2d, 0xf0, 0x3b, 0x39, 0x7d, 0x9a, 0xe4, 0xf0, 0x2d, 0x85, 0x56, 0x4c, 0x3f, 0xfd, 0x17, - 0x63, 0x82, 0xf6, 0x9f, 0x59, 0xb0, 0x60, 0x7c, 0xdc, 0xa6, 0x1b, 0x46, 0xe4, 0xf3, 0x7d, 0x93, - 0x67, 0x65, 0xb8, 0xc9, 0xc3, 0x5a, 0xf3, 0xa9, 0xb3, 0x28, 0xbf, 0x74, 0x46, 0x95, 0x18, 0x13, - 0xc7, 0x83, 0xa2, 0x1b, 0xd1, 0x4e, 0xb8, 0x34, 0xf1, 0x4c, 0xe1, 0xca, 0xec, 0x0b, 0x1b, 0xb9, - 0x0d, 0x63, 0xdc, 0xbf, 0x1b, 0x0c, 0x3f, 0x0a, 0x32, 0xf6, 0x3f, 0x2f, 0x24, 0x86, 0x6f, 0x4b, - 0xf1, 0xf1, 0xbe, 0x05, 0x53, 0x6d, 0x67, 0x87, 0xb6, 0xc5, 0xda, 0x9a, 0x7d, 0xe1, 0xed, 0xdc, - 0x38, 0x51, 0x34, 0x56, 0x36, 0x39, 0xfe, 0xab, 0x5e, 0x14, 0x1c, 0xc6, 0xd3, 0x4b, 0x14, 0xa2, - 0x24, 0x4e, 0xfe, 0x81, 0x05, 0xb3, 0xb1, 0x54, 0x53, 0xdd, 0xb2, 0x93, 0x3f, 0x33, 0xb1, 0x30, - 0x95, 0x1c, 0x69, 0x11, 0x6d, 0x40, 0xd0, 0xe4, 0x65, 0xf9, 0x93, 0x30, 0x6b, 0x7c, 0x02, 0x59, - 0x84, 0xc2, 0x3e, 0x3d, 0x14, 0x13, 0x1e, 0xd9, 0x4f, 0x72, 0x3e, 0x31, 0xc3, 0xe5, 0x94, 0xfe, - 0xd4, 0xc4, 0x2b, 0xd6, 0xf2, 0x6b, 0xb0, 0x98, 0x26, 0x38, 0x4a, 0x7b, 0xfb, 0x3b, 0x93, 0x89, - 0x89, 0xc9, 0x04, 0x01, 0xf1, 0x61, 0xba, 0x43, 0xa3, 0xc0, 0x6d, 0xa8, 0x21, 0x5b, 0x1f, 0xaf, - 0x97, 0xb6, 0x38, 0xb2, 0x78, 0x43, 0x14, 0xff, 0x43, 0x54, 0x54, 0xc8, 0x1e, 0x4c, 0x3a, 0x41, - 0x4b, 0x8d, 0xc9, 0xb5, 0x7c, 0x96, 0x65, 0x2c, 0x2a, 0x2a, 0x41, 0x2b, 0x44, 0x4e, 0x81, 0xac, - 0x42, 0x29, 0xa2, 0x41, 0xc7, 0xf5, 0x9c, 0x48, 0xec, 0xa0, 0x33, 0xd5, 0xb3, 0xb2, 0x5a, 0x69, - 0x5b, 0x01, 0x30, 0xae, 0x43, 0xda, 0x30, 0xd5, 0x0c, 0x0e, 0xb1, 0xe7, 0x2d, 0x4d, 0xe6, 0xd1, - 0x15, 0xeb, 0x1c, 0x57, 0x3c, 0x49, 0xc5, 0x7f, 0x94, 0x34, 0xc8, 0xaf, 0x5b, 0x70, 0xbe, 0x43, - 0x9d, 0xb0, 0x17, 0x50, 0xf6, 0x09, 0x48, 0x23, 0xea, 0xb1, 0x81, 0x5d, 0x2a, 0x72, 0xe2, 0x38, - 0xee, 0x38, 0xf4, 0x63, 0xae, 0x3e, 0x2d, 0x59, 0x39, 0x9f, 0x05, 0xc5, 0x4c, 0x6e, 0xec, 0x3f, - 0x99, 0x84, 0xb3, 0x7d, 0x82, 0x9d, 0xbc, 0x04, 0xc5, 0xee, 0x9e, 0x13, 0x2a, 0x49, 0x7d, 0x59, - 0x89, 0x89, 0x1a, 0x2b, 0x7c, 0x70, 0x54, 0x3e, 0xa3, 0x9a, 0xf0, 0x02, 0x14, 0x95, 0x99, 0xde, - 0xd4, 0xa1, 0x61, 0xe8, 0xb4, 0x94, 0xf8, 0x36, 0xa6, 0x09, 0x2f, 0x46, 0x05, 0x27, 0x7f, 0xdb, - 0x82, 0x33, 0x62, 0xca, 0x20, 0x0d, 0x7b, 0xed, 0x88, 0x6d, 0x51, 0xac, 0x5b, 0x6e, 0xe4, 0x31, - 0x3d, 0x05, 0xca, 0xea, 0x05, 0x49, 0xfd, 0x8c, 0x59, 0x1a, 0x62, 0x92, 0x2e, 0xb9, 0x03, 0xa5, - 0x30, 0x72, 0x82, 0x88, 0x36, 0x2b, 0x11, 0x57, 0xa6, 0x66, 0x5f, 0xf8, 0xe9, 0xe1, 0x64, 0xf7, - 0xb6, 0xdb, 0xa1, 0x62, 0x9f, 0xa8, 0x2b, 0x04, 0x18, 0xe3, 0x22, 0xef, 0x02, 0x04, 0x3d, 0xaf, - 0xde, 0xeb, 0x74, 0x9c, 0xe0, 0x50, 0xea, 0x57, 0xd7, 0xc7, 0xfb, 0x3c, 0xd4, 0xf8, 0x62, 0x55, - 0x23, 0x2e, 0x43, 0x83, 0x1e, 0xf9, 0xb2, 0x05, 0x67, 0xc4, 0x4c, 0x54, 0x1c, 0x4c, 0xe5, 0xcc, - 0xc1, 0x59, 0xd6, 0xb5, 0xeb, 0x26, 0x09, 0x4c, 0x52, 0xb4, 0xff, 0x7d, 0x52, 0x0d, 0xa8, 0x47, - 0xec, 0xb0, 0xd5, 0x3a, 0x24, 0x9f, 0x83, 0x27, 0xc3, 0x5e, 0xa3, 0x41, 0xc3, 0x70, 0xb7, 0xd7, - 0xc6, 0x9e, 0x77, 0xdd, 0x0d, 0x23, 0x3f, 0x38, 0xdc, 0x74, 0x3b, 0x6e, 0xc4, 0x67, 0x5c, 0xb1, - 0x7a, 0xe9, 0xf8, 0xa8, 0xfc, 0x64, 0x7d, 0x50, 0x25, 0x1c, 0xdc, 0x9e, 0x38, 0xf0, 0x54, 0xcf, - 0x1b, 0x8c, 0x5e, 0x68, 0xe8, 0xe5, 0xe3, 0xa3, 0xf2, 0x53, 0xb7, 0x07, 0x57, 0xc3, 0x93, 0x70, - 0xd8, 0xff, 0xd5, 0x62, 0x92, 0x5a, 0x7c, 0xd7, 0x36, 0xed, 0x74, 0xdb, 0x4c, 0xba, 0x9c, 0xbe, - 0xfe, 0x18, 0x25, 0xf4, 0x47, 0xcc, 0x67, 0xbb, 0x53, 0xfc, 0x0f, 0x52, 0x22, 0xed, 0xff, 0x62, - 0xc1, 0xf9, 0x74, 0xe5, 0xc7, 0xa0, 0xf3, 0x84, 0x49, 0x9d, 0xe7, 0x66, 0xbe, 0x5f, 0x3b, 0x40, - 0xf1, 0xf9, 0xea, 0x64, 0xff, 0xb7, 0xfe, 0xbf, 0xbe, 0x8d, 0xc6, 0xbb, 0x62, 0xe1, 0x27, 0xb9, - 0x2b, 0x4e, 0x7e, 0xa0, 0x76, 0xc5, 0xdf, 0x9c, 0x84, 0xb9, 0x8a, 0x17, 0xb9, 0x95, 0xdd, 0x5d, - 0xd7, 0x73, 0xa3, 0x43, 0xf2, 0xf5, 0x09, 0x58, 0xed, 0x06, 0x74, 0x97, 0x06, 0x01, 0x6d, 0xae, - 0xf7, 0x02, 0xd7, 0x6b, 0xd5, 0x1b, 0x7b, 0xb4, 0xd9, 0x6b, 0xbb, 0x5e, 0x6b, 0xa3, 0xe5, 0xf9, - 0xba, 0xf8, 0xea, 0x7d, 0xda, 0xe8, 0xf1, 0x4f, 0x12, 0x8b, 0xa2, 0x33, 0xde, 0x27, 0xd5, 0x46, - 0x23, 0x5a, 0x7d, 0xf1, 0xf8, 0xa8, 0xbc, 0x3a, 0x62, 0x23, 0x1c, 0xf5, 0xd3, 0xc8, 0xd7, 0x26, - 0x60, 0x25, 0xa0, 0x3f, 0xdf, 0x73, 0x87, 0xef, 0x0d, 0x21, 0xb5, 0xda, 0x63, 0x6e, 0x3f, 0x23, - 0xd1, 0xac, 0xbe, 0x70, 0x7c, 0x54, 0x1e, 0xb1, 0x0d, 0x8e, 0xf8, 0x5d, 0x76, 0x0d, 0x66, 0x2b, - 0x5d, 0x37, 0x74, 0xef, 0xa3, 0xdf, 0x8b, 0xe8, 0x10, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x5e, 0x9b, - 0x8a, 0xb5, 0x5d, 0xaa, 0x96, 0x98, 0x14, 0x42, 0x56, 0x80, 0xa2, 0xdc, 0xfe, 0x45, 0x26, 0x71, - 0x39, 0xca, 0x94, 0x71, 0xe3, 0x2e, 0x14, 0x03, 0x46, 0x44, 0xce, 0xac, 0x71, 0xcf, 0x81, 0x31, - 0xd7, 0x92, 0x09, 0xf6, 0x13, 0x05, 0x09, 0xfb, 0x77, 0x27, 0xe0, 0x42, 0xa5, 0xdb, 0xdd, 0xa2, - 0xe1, 0x5e, 0x8a, 0x8b, 0x5f, 0xb6, 0x60, 0xfe, 0xc0, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, 0xf6, 0x2b, - 0xc1, 0x4f, 0x7d, 0x5c, 0x7e, 0x38, 0xb5, 0xb7, 0x12, 0xa8, 0xab, 0xe4, 0xf8, 0xa8, 0x3c, 0x9f, - 0x2c, 0xc3, 0x14, 0x79, 0xf2, 0xf7, 0x2d, 0x58, 0x94, 0x45, 0x37, 0xfd, 0x26, 0x35, 0xed, 0xa3, - 0xb7, 0xf3, 0xe4, 0x49, 0x23, 0x17, 0x76, 0xad, 0x74, 0x29, 0xf6, 0x31, 0x61, 0xff, 0xf7, 0x09, - 0xb8, 0x38, 0x00, 0x07, 0xf9, 0x0d, 0x0b, 0xce, 0x0b, 0xa3, 0xaa, 0x01, 0x42, 0xba, 0x2b, 0x7b, - 0xf3, 0x67, 0xf2, 0xe6, 0x1c, 0xd9, 0x12, 0xa7, 0x5e, 0x83, 0x56, 0x97, 0x98, 0x34, 0x5c, 0xcb, - 0x20, 0x8d, 0x99, 0x0c, 0x71, 0x4e, 0x85, 0x99, 0x35, 0xc5, 0xe9, 0xc4, 0x63, 0xe1, 0xb4, 0x9e, - 0x41, 0x1a, 0x33, 0x19, 0xb2, 0xff, 0x26, 0x3c, 0x75, 0x02, 0xba, 0x87, 0x2f, 0x4e, 0xfb, 0x6d, - 0x3d, 0xeb, 0x93, 0x73, 0x6e, 0x88, 0x75, 0x6d, 0xc3, 0x14, 0x5f, 0x3a, 0x6a, 0x61, 0x03, 0xdb, - 0xfe, 0xf8, 0x9a, 0x0a, 0x51, 0x42, 0xec, 0xdf, 0xb5, 0x60, 0x66, 0x04, 0x6b, 0x58, 0x39, 0x69, - 0x0d, 0x2b, 0xf5, 0x59, 0xc2, 0xa2, 0x7e, 0x4b, 0xd8, 0xeb, 0xe3, 0x8d, 0xc6, 0x30, 0x16, 0xb0, - 0x1f, 0x5b, 0x70, 0xb6, 0xcf, 0x62, 0x46, 0xf6, 0xe0, 0x7c, 0xd7, 0x6f, 0x2a, 0xb5, 0xe9, 0xba, - 0x13, 0xee, 0x71, 0x98, 0xfc, 0xbc, 0x97, 0xd8, 0x48, 0xd6, 0x32, 0xe0, 0x0f, 0x8e, 0xca, 0x4b, - 0x1a, 0x49, 0xaa, 0x02, 0x66, 0x62, 0x24, 0x5d, 0x98, 0xd9, 0x75, 0x69, 0xbb, 0x19, 0x4f, 0xc1, - 0x31, 0x15, 0xa4, 0x6b, 0x12, 0x9b, 0x30, 0x16, 0xab, 0x7f, 0xa8, 0xa9, 0xd8, 0x5f, 0x82, 0xf9, - 0xe4, 0x95, 0xc4, 0x10, 0x83, 0x77, 0x09, 0x0a, 0x4e, 0xe0, 0xc9, 0xa1, 0x9b, 0x95, 0x15, 0x0a, - 0x15, 0xbc, 0x89, 0xac, 0x9c, 0x3c, 0x0f, 0x33, 0xbb, 0xbd, 0x76, 0x9b, 0x35, 0x90, 0xf6, 0x7f, - 0xad, 0x0e, 0x5f, 0x93, 0xe5, 0xa8, 0x6b, 0xd8, 0x7f, 0x31, 0x09, 0x0b, 0xd5, 0x76, 0x8f, 0xbe, - 0x1e, 0x50, 0xaa, 0x0e, 0xe9, 0x15, 0x58, 0xe8, 0x06, 0xf4, 0xc0, 0xa5, 0xf7, 0xea, 0xb4, 0x4d, - 0x1b, 0x91, 0x1f, 0x48, 0x6e, 0x2e, 0x4a, 0x44, 0x0b, 0xb5, 0x24, 0x18, 0xd3, 0xf5, 0xc9, 0x6b, - 0x30, 0xef, 0x34, 0x22, 0xf7, 0x80, 0x6a, 0x0c, 0x82, 0xdd, 0x0f, 0x49, 0x0c, 0xf3, 0x95, 0x04, - 0x14, 0x53, 0xb5, 0xc9, 0xe7, 0x61, 0x29, 0x6c, 0x38, 0x6d, 0x7a, 0xbb, 0x2b, 0x49, 0xad, 0xed, - 0xd1, 0xc6, 0x7e, 0xcd, 0x77, 0xbd, 0x48, 0x9a, 0x64, 0x9e, 0x91, 0x98, 0x96, 0xea, 0x03, 0xea, - 0xe1, 0x40, 0x0c, 0xe4, 0x5f, 0x59, 0x70, 0xa9, 0x1b, 0xd0, 0x5a, 0xe0, 0x77, 0x7c, 0xb6, 0xd7, - 0xf6, 0xd9, 0x29, 0xe4, 0x79, 0xfd, 0xad, 0x31, 0x95, 0x0a, 0x51, 0xd2, 0x6f, 0xde, 0xfe, 0xf0, - 0xf1, 0x51, 0xf9, 0x52, 0xed, 0x24, 0x06, 0xf0, 0x64, 0xfe, 0xc8, 0xbf, 0xb6, 0xe0, 0x72, 0xd7, - 0x0f, 0xa3, 0x13, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1f, 0x95, 0x2f, 0xd7, 0x4e, 0xe4, - 0x00, 0x1f, 0xc2, 0xa1, 0x7d, 0x3c, 0x0b, 0x67, 0x8d, 0xb9, 0x27, 0x0f, 0xf1, 0xaf, 0xc2, 0x19, - 0x35, 0x19, 0x62, 0x25, 0xa0, 0x14, 0x1b, 0x5d, 0x2a, 0x26, 0x10, 0x93, 0x75, 0xd9, 0xbc, 0xd3, - 0x53, 0x51, 0xb4, 0x4e, 0xcd, 0xbb, 0x5a, 0x02, 0x8a, 0xa9, 0xda, 0x64, 0x03, 0xce, 0xc9, 0x12, - 0xa4, 0xdd, 0xb6, 0xdb, 0x70, 0xd6, 0xfc, 0x9e, 0x9c, 0x72, 0xc5, 0xea, 0xc5, 0xe3, 0xa3, 0xf2, - 0xb9, 0x5a, 0x3f, 0x18, 0xb3, 0xda, 0x90, 0x4d, 0x38, 0xef, 0xf4, 0x22, 0x5f, 0x7f, 0xff, 0x55, - 0x8f, 0xed, 0x2b, 0x4d, 0x3e, 0xb5, 0x66, 0xc4, 0x06, 0x54, 0xc9, 0x80, 0x63, 0x66, 0x2b, 0x52, - 0x4b, 0x61, 0xab, 0xd3, 0x86, 0xef, 0x35, 0xc5, 0x28, 0x17, 0xe3, 0xa3, 0x48, 0x25, 0xa3, 0x0e, - 0x66, 0xb6, 0x24, 0x6d, 0x98, 0xef, 0x38, 0xf7, 0x6f, 0x7b, 0xce, 0x81, 0xe3, 0xb6, 0x19, 0x11, - 0x69, 0xc8, 0x19, 0x6c, 0x5d, 0xe8, 0x45, 0x6e, 0x7b, 0x45, 0x5c, 0x71, 0xaf, 0x6c, 0x78, 0xd1, - 0x9b, 0x41, 0x3d, 0x62, 0x2a, 0xab, 0x50, 0xa5, 0xb6, 0x12, 0xb8, 0x30, 0x85, 0x9b, 0xbc, 0x09, - 0x17, 0xf8, 0x72, 0x5c, 0xf7, 0xef, 0x79, 0xeb, 0xb4, 0xed, 0x1c, 0xaa, 0x0f, 0x98, 0xe6, 0x1f, - 0xf0, 0xe4, 0xf1, 0x51, 0xf9, 0x42, 0x3d, 0xab, 0x02, 0x66, 0xb7, 0x23, 0x0e, 0x3c, 0x95, 0x04, - 0x20, 0x3d, 0x70, 0x43, 0xd7, 0xf7, 0x84, 0x39, 0x66, 0x26, 0x36, 0xc7, 0xd4, 0x07, 0x57, 0xc3, - 0x93, 0x70, 0x90, 0x7f, 0x68, 0xc1, 0xf9, 0xac, 0x65, 0xb8, 0x54, 0xca, 0xe3, 0xa2, 0x2d, 0xb5, - 0xb4, 0xc4, 0x8c, 0xc8, 0x14, 0x0a, 0x99, 0x4c, 0x90, 0xf7, 0x2c, 0x98, 0x73, 0x8c, 0xa3, 0xe4, - 0x12, 0x70, 0xae, 0x6e, 0x8c, 0x6b, 0xd0, 0x88, 0x31, 0x56, 0x17, 0x8f, 0x8f, 0xca, 0x89, 0xe3, - 0x2a, 0x26, 0x28, 0x92, 0x7f, 0x6c, 0xc1, 0x85, 0xcc, 0x35, 0xbe, 0x34, 0x7b, 0x1a, 0x3d, 0xc4, - 0x27, 0x49, 0xb6, 0xcc, 0xc9, 0x66, 0x83, 0x7c, 0xd3, 0xd2, 0x5b, 0x99, 0xba, 0x7b, 0x59, 0x9a, - 0xe3, 0xac, 0xdd, 0x1a, 0xf3, 0xf4, 0x1c, 0xab, 0x0f, 0x0a, 0x71, 0xf5, 0x9c, 0xb1, 0x33, 0xaa, - 0x42, 0x4c, 0x93, 0x27, 0xdf, 0xb0, 0xd4, 0xd6, 0xa8, 0x39, 0x3a, 0x73, 0x5a, 0x1c, 0x91, 0x78, - 0xa7, 0xd5, 0x0c, 0xa5, 0x88, 0x93, 0x9f, 0x85, 0x65, 0x67, 0xc7, 0x0f, 0xa2, 0xcc, 0xc5, 0xb7, - 0x34, 0xcf, 0x97, 0xd1, 0xe5, 0xe3, 0xa3, 0xf2, 0x72, 0x65, 0x60, 0x2d, 0x3c, 0x01, 0x83, 0xfd, - 0xdb, 0x45, 0x98, 0x13, 0x47, 0x02, 0xb9, 0x75, 0xfd, 0x8e, 0x05, 0x4f, 0x37, 0x7a, 0x41, 0x40, - 0xbd, 0xa8, 0x1e, 0xd1, 0x6e, 0xff, 0xc6, 0x65, 0x9d, 0xea, 0xc6, 0xf5, 0xcc, 0xf1, 0x51, 0xf9, - 0xe9, 0xb5, 0x13, 0xe8, 0xe3, 0x89, 0xdc, 0x91, 0x7f, 0x67, 0x81, 0x2d, 0x2b, 0x54, 0x9d, 0xc6, - 0x7e, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x26, 0x4e, 0xf5, 0x23, 0x9e, 0x3b, 0x3e, 0x2a, - 0xdb, 0x6b, 0x0f, 0xe5, 0x02, 0x87, 0xe0, 0x94, 0xbc, 0x0e, 0x67, 0x65, 0xad, 0xab, 0xf7, 0xbb, - 0x34, 0x70, 0x99, 0xf2, 0x2d, 0x15, 0xc7, 0xd8, 0x6d, 0x27, 0x5d, 0x01, 0xfb, 0xdb, 0x90, 0x10, - 0xa6, 0xef, 0x51, 0xb7, 0xb5, 0x17, 0x29, 0xf5, 0x69, 0x4c, 0x5f, 0x1d, 0x69, 0x1e, 0xb8, 0x23, - 0x70, 0x56, 0x67, 0x8f, 0x8f, 0xca, 0xd3, 0xf2, 0x0f, 0x2a, 0x4a, 0xe4, 0x26, 0xcc, 0x8b, 0x03, - 0x5b, 0xcd, 0xf5, 0x5a, 0x35, 0xdf, 0x13, 0x0e, 0x27, 0xa5, 0xea, 0x73, 0x6a, 0xc3, 0xaf, 0x27, - 0xa0, 0x0f, 0x8e, 0xca, 0x73, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xfb, 0x53, - 0x00, 0x6a, 0xba, 0xd2, 0x2e, 0xf9, 0x28, 0x94, 0x42, 0x1a, 0x09, 0xaa, 0xf2, 0x06, 0x41, 0x5c, - 0xcc, 0xa8, 0x42, 0x8c, 0xe1, 0x64, 0x1f, 0x8a, 0x5d, 0xa7, 0x17, 0x52, 0x39, 0xf8, 0x37, 0x72, - 0x19, 0xfc, 0x1a, 0xc3, 0x28, 0x4e, 0x68, 0xfc, 0x27, 0x0a, 0x1a, 0xe4, 0x2b, 0x16, 0x00, 0x4d, - 0x0e, 0xd8, 0xd8, 0x96, 0x12, 0x49, 0x32, 0x1e, 0x53, 0xd6, 0x07, 0xd5, 0xf9, 0xe3, 0xa3, 0x32, - 0x18, 0x43, 0x6f, 0x90, 0x25, 0xf7, 0x60, 0xc6, 0x51, 0x32, 0x7f, 0xf2, 0x34, 0x64, 0x3e, 0x3f, - 0x38, 0xe9, 0x49, 0xab, 0x89, 0x91, 0xaf, 0x59, 0x30, 0x1f, 0xd2, 0x48, 0x0e, 0x15, 0x93, 0x3c, - 0x52, 0xe1, 0x1d, 0x73, 0xd2, 0xd5, 0x13, 0x38, 0x85, 0x04, 0x4d, 0x96, 0x61, 0x8a, 0xae, 0x62, - 0xe5, 0x3a, 0x75, 0x9a, 0x34, 0xe0, 0xe7, 0x72, 0xa9, 0x49, 0x8d, 0xcf, 0x8a, 0x81, 0x53, 0xb3, - 0x62, 0x94, 0x61, 0x8a, 0xae, 0x62, 0x65, 0xcb, 0x0d, 0x02, 0x5f, 0xb2, 0x32, 0x93, 0x13, 0x2b, - 0x06, 0x4e, 0xcd, 0x8a, 0x51, 0x86, 0x29, 0xba, 0xf6, 0xb7, 0xcf, 0xc0, 0xbc, 0x5a, 0x48, 0xb1, - 0x66, 0x2f, 0xcc, 0x40, 0x03, 0x34, 0xfb, 0x35, 0x13, 0x88, 0xc9, 0xba, 0xac, 0xb1, 0x58, 0xaa, - 0x49, 0xc5, 0x5e, 0x37, 0xae, 0x9b, 0x40, 0x4c, 0xd6, 0x25, 0x1d, 0x28, 0x86, 0x11, 0xed, 0xaa, - 0xcb, 0xe0, 0x31, 0xef, 0x2a, 0x63, 0xf9, 0x10, 0x5f, 0xf7, 0xb0, 0x7f, 0x21, 0x0a, 0x2a, 0xdc, - 0x92, 0x19, 0x25, 0x8c, 0x9b, 0x72, 0x71, 0xe4, 0xb3, 0x3e, 0x93, 0x76, 0x53, 0x31, 0x1a, 0xc9, - 0x32, 0x4c, 0x91, 0xcf, 0x50, 0xf6, 0x8b, 0xa7, 0xa8, 0xec, 0x7f, 0x16, 0x66, 0x3a, 0xce, 0xfd, - 0x7a, 0x2f, 0x68, 0x3d, 0xfa, 0xa1, 0x42, 0xba, 0xd7, 0x09, 0x2c, 0xa8, 0xf1, 0x91, 0x2f, 0x5b, - 0x86, 0xc8, 0x99, 0xe6, 0xc8, 0xef, 0xe4, 0x2b, 0x72, 0xf4, 0x5e, 0x39, 0x50, 0xf8, 0xf4, 0xa9, - 0xde, 0x33, 0x8f, 0x5d, 0xf5, 0x66, 0x6a, 0xa4, 0x58, 0x20, 0x5a, 0x8d, 0x2c, 0x9d, 0xaa, 0x1a, - 0xb9, 0x96, 0x20, 0x86, 0x29, 0xe2, 0x9c, 0x1f, 0xb1, 0xe6, 0x34, 0x3f, 0x70, 0xaa, 0xfc, 0xd4, - 0x13, 0xc4, 0x30, 0x45, 0x7c, 0xf0, 0x79, 0x73, 0xf6, 0x74, 0xce, 0x9b, 0x73, 0x39, 0x9c, 0x37, - 0x4f, 0x56, 0xc5, 0xcf, 0x8c, 0xab, 0x8a, 0x93, 0x1b, 0x40, 0x9a, 0x87, 0x9e, 0xd3, 0x71, 0x1b, - 0x52, 0x58, 0xf2, 0x6d, 0x73, 0x9e, 0xdb, 0x23, 0x96, 0xa5, 0x20, 0x23, 0xeb, 0x7d, 0x35, 0x30, - 0xa3, 0x15, 0x89, 0x60, 0xa6, 0xab, 0x34, 0xae, 0x85, 0x3c, 0x66, 0xbf, 0xd2, 0xc0, 0x84, 0xbf, - 0x00, 0x5b, 0x78, 0xaa, 0x04, 0x35, 0x25, 0xb2, 0x09, 0xe7, 0x3b, 0xae, 0x57, 0xf3, 0x9b, 0x61, - 0x8d, 0x06, 0xd2, 0xda, 0x52, 0xa7, 0xd1, 0xd2, 0x22, 0xef, 0x1b, 0x7e, 0x82, 0xde, 0xca, 0x80, - 0x63, 0x66, 0x2b, 0xfb, 0x7f, 0x5a, 0xb0, 0xb8, 0xd6, 0xf6, 0x7b, 0xcd, 0x3b, 0x4e, 0xd4, 0xd8, - 0x13, 0x57, 0xe5, 0xe4, 0x35, 0x98, 0x71, 0xbd, 0x88, 0x06, 0x07, 0x4e, 0x5b, 0xee, 0x4f, 0xb6, - 0x32, 0x9f, 0x6e, 0xc8, 0xf2, 0x07, 0x47, 0xe5, 0xf9, 0xf5, 0x5e, 0xc0, 0xdd, 0xe9, 0x84, 0xb4, - 0x42, 0xdd, 0x86, 0x7c, 0xdb, 0x82, 0xb3, 0xe2, 0xb2, 0x7d, 0xdd, 0x89, 0x9c, 0x5b, 0x3d, 0x1a, - 0xb8, 0x54, 0x5d, 0xb7, 0x8f, 0x29, 0xa8, 0xd2, 0xbc, 0x2a, 0x02, 0x87, 0xb1, 0xa2, 0xbe, 0x95, - 0xa6, 0x8c, 0xfd, 0xcc, 0xd8, 0xbf, 0x52, 0x80, 0x27, 0x07, 0xe2, 0x22, 0xcb, 0x30, 0xe1, 0x36, - 0xe5, 0xa7, 0x83, 0xc4, 0x3b, 0xb1, 0xd1, 0xc4, 0x09, 0xb7, 0x49, 0x56, 0xb8, 0xce, 0x19, 0xd0, - 0x30, 0x54, 0x37, 0xaf, 0x25, 0xad, 0x1e, 0xca, 0x52, 0x34, 0x6a, 0x90, 0x32, 0x14, 0xb9, 0x6b, - 0xa5, 0x3c, 0x4f, 0x70, 0x2d, 0x96, 0x7b, 0x31, 0xa2, 0x28, 0x27, 0xbf, 0x68, 0x01, 0x08, 0x06, - 0xd9, 0x69, 0x44, 0xee, 0x92, 0x98, 0x6f, 0x37, 0x31, 0xcc, 0x82, 0xcb, 0xf8, 0x3f, 0x1a, 0x54, - 0xc9, 0x36, 0x4c, 0x31, 0x85, 0xd6, 0x6f, 0x3e, 0xf2, 0xa6, 0xc8, 0xaf, 0x64, 0x6a, 0x1c, 0x07, - 0x4a, 0x5c, 0xac, 0xaf, 0x02, 0x1a, 0xf5, 0x02, 0x8f, 0x75, 0x2d, 0xdf, 0x06, 0x67, 0x04, 0x17, - 0xa8, 0x4b, 0xd1, 0xa8, 0x61, 0xff, 0xcb, 0x09, 0x38, 0x9f, 0xc5, 0x3a, 0xdb, 0x6d, 0xa6, 0x04, - 0xb7, 0xf2, 0x68, 0xfc, 0x99, 0xfc, 0xfb, 0x47, 0xfa, 0x8d, 0x68, 0xef, 0x0a, 0xe9, 0xd9, 0x26, - 0xe9, 0x92, 0xcf, 0xe8, 0x1e, 0x9a, 0x78, 0xc4, 0x1e, 0xd2, 0x98, 0x53, 0xbd, 0xf4, 0x0c, 0x4c, - 0x86, 0x6c, 0xe4, 0x0b, 0xc9, 0xeb, 0x0e, 0x3e, 0x46, 0x1c, 0xc2, 0x6a, 0xf4, 0x3c, 0x37, 0x92, - 0xf1, 0x08, 0xba, 0xc6, 0x6d, 0xcf, 0x8d, 0x90, 0x43, 0xec, 0x6f, 0x4d, 0xc0, 0xf2, 0xe0, 0x8f, - 0x22, 0xdf, 0xb2, 0x00, 0x9a, 0xec, 0xb8, 0x12, 0x72, 0xa7, 0x5e, 0xe1, 0x67, 0xe3, 0x9c, 0x56, - 0x1f, 0xae, 0x2b, 0x4a, 0xb1, 0xd3, 0x95, 0x2e, 0x0a, 0xd1, 0x60, 0x84, 0xbc, 0xa0, 0xa6, 0x3e, - 0xbf, 0xaa, 0x11, 0x8b, 0x49, 0xb7, 0xd9, 0xd2, 0x10, 0x34, 0x6a, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, - 0x68, 0xd8, 0x75, 0x74, 0x74, 0x07, 0x3f, 0x8f, 0xde, 0x54, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, - 0x3b, 0x04, 0x9f, 0x39, 0x39, 0xcf, 0xdb, 0xff, 0xc3, 0x82, 0x8b, 0x6b, 0xed, 0x5e, 0x18, 0xd1, - 0xe0, 0xff, 0x1b, 0x1f, 0xb6, 0xff, 0x65, 0xc1, 0x53, 0x03, 0xbe, 0xf9, 0x31, 0xb8, 0xb2, 0xbd, - 0x93, 0x74, 0x65, 0xbb, 0x3d, 0xee, 0x94, 0xce, 0xfc, 0x8e, 0x01, 0x1e, 0x6d, 0xbf, 0x69, 0xc1, - 0x19, 0x26, 0xb6, 0x9a, 0x7e, 0x2b, 0xa7, 0x8d, 0xf3, 0x59, 0x28, 0xfe, 0x3c, 0xdb, 0x80, 0xd2, - 0x93, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0x6c, 0xcd, 0x38, 0x5d, 0xf7, 0x2d, 0x1a, 0xf0, 0x0d, 0xa8, - 0x90, 0x5c, 0x33, 0x15, 0x0d, 0x41, 0xa3, 0x96, 0xfd, 0x69, 0x90, 0xce, 0x62, 0xa9, 0x15, 0x67, - 0x0d, 0xb3, 0xe2, 0xec, 0xff, 0x30, 0x01, 0x86, 0xf1, 0xe3, 0x31, 0xcc, 0x64, 0x2f, 0x31, 0x93, - 0xc7, 0x3c, 0xb8, 0x1b, 0xa6, 0x9c, 0x41, 0xc1, 0x3c, 0x07, 0xa9, 0x60, 0x9e, 0x9b, 0xb9, 0x51, - 0x3c, 0x39, 0x96, 0xe7, 0x07, 0x16, 0x3c, 0x15, 0x57, 0xee, 0xb7, 0x4b, 0x3e, 0x5c, 0x2c, 0xbd, - 0x0c, 0xb3, 0x4e, 0xdc, 0x4c, 0xce, 0x1b, 0x23, 0x92, 0x42, 0x83, 0xd0, 0xac, 0x17, 0xfb, 0xa0, - 0x17, 0x1e, 0xd1, 0x07, 0x7d, 0xf2, 0x64, 0x1f, 0x74, 0xfb, 0xcf, 0x27, 0xe0, 0x52, 0xff, 0x97, - 0xa9, 0x05, 0x35, 0xdc, 0x25, 0xff, 0x2b, 0x30, 0x17, 0xc9, 0x06, 0xc6, 0xf6, 0xa0, 0xa3, 0x3a, - 0xb7, 0x0d, 0x18, 0x26, 0x6a, 0xb2, 0x96, 0x0d, 0xb1, 0x94, 0xeb, 0x0d, 0xbf, 0xab, 0x22, 0x18, - 0x74, 0xcb, 0x35, 0x03, 0x86, 0x89, 0x9a, 0xda, 0x37, 0x74, 0xf2, 0xd4, 0x7d, 0x43, 0xeb, 0x70, - 0x41, 0x79, 0xc3, 0x5d, 0xf3, 0x83, 0x35, 0xbf, 0xd3, 0x6d, 0x53, 0x19, 0xc3, 0xc0, 0x98, 0xbd, - 0x24, 0x9b, 0x5c, 0xc0, 0xac, 0x4a, 0x98, 0xdd, 0xd6, 0xfe, 0x41, 0x01, 0xce, 0xc5, 0xdd, 0xbe, - 0xe6, 0x7b, 0x4d, 0x97, 0xfb, 0x14, 0xbe, 0x0a, 0x93, 0xd1, 0x61, 0x57, 0x75, 0xf6, 0x5f, 0x55, - 0xec, 0x6c, 0x1f, 0x76, 0xd9, 0x68, 0x5f, 0xcc, 0x68, 0xc2, 0x2d, 0xc3, 0xbc, 0x11, 0xd9, 0xd4, - 0xab, 0x43, 0x8c, 0xc0, 0x4b, 0xc9, 0xd9, 0xfc, 0xe0, 0xa8, 0x9c, 0x11, 0xd4, 0xbc, 0xa2, 0x31, - 0x25, 0xe7, 0x3c, 0xb9, 0x0b, 0xf3, 0x6d, 0x27, 0x8c, 0x6e, 0x77, 0x9b, 0x4e, 0x44, 0xb7, 0x5d, - 0xe9, 0xa1, 0x31, 0x5a, 0x60, 0x80, 0xbe, 0xca, 0xde, 0x4c, 0x60, 0xc2, 0x14, 0x66, 0x72, 0x00, - 0x84, 0x95, 0x6c, 0x07, 0x8e, 0x17, 0x8a, 0xaf, 0x62, 0xf4, 0x46, 0x0f, 0x44, 0xd0, 0x27, 0xc3, - 0xcd, 0x3e, 0x6c, 0x98, 0x41, 0x81, 0x3c, 0x07, 0x53, 0x01, 0x75, 0x42, 0x39, 0x98, 0xa5, 0x78, - 0xfd, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x17, 0xd4, 0xd4, 0x43, 0x16, 0xd4, 0x9f, 0x5a, 0x30, 0x1f, - 0x0f, 0xd3, 0x63, 0xd8, 0x59, 0x3b, 0xc9, 0x9d, 0xf5, 0x7a, 0x5e, 0x22, 0x71, 0xc0, 0x66, 0xfa, - 0x07, 0x53, 0xe6, 0xf7, 0x71, 0xc7, 0xf0, 0x2f, 0x42, 0x49, 0xad, 0x6a, 0xa5, 0xb2, 0x8e, 0x79, - 0xc0, 0x4e, 0x28, 0x33, 0x46, 0x40, 0x93, 0x24, 0x82, 0x31, 0x3d, 0xb6, 0x95, 0x37, 0xe5, 0x36, - 0x2d, 0xa7, 0xbd, 0xde, 0xca, 0xd5, 0xf6, 0x9d, 0xb5, 0x95, 0xab, 0x36, 0xe4, 0x36, 0x5c, 0xec, - 0x06, 0x3e, 0x0f, 0xab, 0x5d, 0xa7, 0x4e, 0xb3, 0xed, 0x7a, 0x54, 0x59, 0x31, 0x84, 0x27, 0xc5, - 0x53, 0xc7, 0x47, 0xe5, 0x8b, 0xb5, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0x30, 0x6b, 0x72, 0x88, - 0xc0, 0xac, 0xbf, 0xa3, 0x6d, 0x85, 0x34, 0x94, 0xe1, 0x51, 0x9f, 0xcb, 0x6b, 0x28, 0x33, 0xc4, - 0x7a, 0x3c, 0xa5, 0x2a, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0x0d, 0x52, 0x53, 0x8f, 0x68, 0x90, 0x8a, - 0xfd, 0xeb, 0xa7, 0x7f, 0x92, 0xfe, 0xf5, 0x33, 0x1f, 0x28, 0xff, 0xfa, 0xf7, 0x8b, 0xb0, 0x98, - 0xd6, 0x40, 0x4e, 0x3f, 0xe8, 0xec, 0xef, 0x59, 0xb0, 0xa8, 0x56, 0x8f, 0xa0, 0x49, 0xd5, 0x55, - 0xc3, 0x66, 0x4e, 0x8b, 0x56, 0xe8, 0x52, 0x3a, 0x1a, 0x7f, 0x3b, 0x45, 0x0d, 0xfb, 0xe8, 0x93, - 0xb7, 0x61, 0x56, 0x5b, 0xe4, 0x1f, 0x29, 0x02, 0x6d, 0x81, 0x6b, 0x51, 0x31, 0x0a, 0x34, 0xf1, - 0x91, 0xf7, 0x2d, 0x80, 0x86, 0xda, 0xe6, 0xd4, 0xea, 0xba, 0x95, 0xd7, 0xea, 0xd2, 0x1b, 0x68, - 0xac, 0x2c, 0xeb, 0xa2, 0x10, 0x0d, 0xc2, 0xe4, 0x57, 0xb8, 0x2d, 0x5e, 0x6b, 0x77, 0x22, 0xca, - 0x7f, 0x6c, 0xdf, 0xe1, 0x13, 0x14, 0xd3, 0x58, 0x95, 0x32, 0x40, 0x21, 0x26, 0x98, 0xb0, 0x5f, - 0x05, 0xed, 0xed, 0xc9, 0xc4, 0x16, 0xf7, 0xf7, 0xac, 0x39, 0xd1, 0x9e, 0x9c, 0x82, 0x5a, 0x6c, - 0x5d, 0x53, 0x00, 0x8c, 0xeb, 0xd8, 0x5f, 0x80, 0xf9, 0xd7, 0x03, 0xa7, 0xbb, 0xe7, 0x72, 0x9b, - 0x37, 0x3b, 0x5b, 0x7d, 0x04, 0xa6, 0x9d, 0x66, 0x33, 0x2b, 0x71, 0x44, 0x45, 0x14, 0xa3, 0x82, - 0x0f, 0x75, 0x8c, 0xb2, 0x7f, 0xdf, 0x02, 0x12, 0xdf, 0x1b, 0xba, 0x5e, 0x6b, 0xcb, 0x89, 0x1a, - 0x7b, 0xec, 0x7c, 0xb4, 0xc7, 0x4b, 0xb3, 0xce, 0x47, 0xd7, 0x35, 0x04, 0x8d, 0x5a, 0xe4, 0x5d, - 0x98, 0x15, 0xff, 0xde, 0xd2, 0x16, 0x82, 0xb1, 0x23, 0x08, 0xc4, 0x86, 0xc2, 0x79, 0x12, 0xb3, - 0xf0, 0x7a, 0x4c, 0x01, 0x4d, 0x72, 0xac, 0xab, 0x36, 0xbc, 0xdd, 0x76, 0xef, 0x7e, 0x73, 0x27, - 0xee, 0xaa, 0x6e, 0xe0, 0xef, 0xba, 0x6d, 0x9a, 0xee, 0xaa, 0x9a, 0x28, 0x46, 0x05, 0x1f, 0xae, - 0xab, 0xfe, 0x8d, 0x05, 0xe7, 0x37, 0xc2, 0xc8, 0xf5, 0xd7, 0x69, 0x18, 0xb1, 0x6d, 0x85, 0x09, - 0x9f, 0x5e, 0x7b, 0x18, 0xc7, 0xed, 0x75, 0x58, 0x94, 0x77, 0x98, 0xbd, 0x9d, 0x90, 0x46, 0x86, - 0x1e, 0xaf, 0xd7, 0xf1, 0x5a, 0x0a, 0x8e, 0x7d, 0x2d, 0x18, 0x16, 0x79, 0x99, 0x19, 0x63, 0x29, - 0x24, 0xb1, 0xd4, 0x53, 0x70, 0xec, 0x6b, 0x61, 0x7f, 0xbf, 0x00, 0xe7, 0xf8, 0x67, 0xa4, 0x82, - 0x2e, 0xbe, 0x31, 0x28, 0xe8, 0x62, 0xcc, 0xa5, 0xcc, 0x69, 0x3d, 0x42, 0xc8, 0xc5, 0xdf, 0xb5, - 0x60, 0xa1, 0x99, 0xec, 0xe9, 0x7c, 0x6c, 0x3a, 0x59, 0x63, 0x28, 0x5c, 0xb6, 0x52, 0x85, 0x98, - 0xa6, 0x4f, 0x7e, 0xd5, 0x82, 0x85, 0x24, 0x9b, 0x4a, 0xba, 0x9f, 0x42, 0x27, 0x69, 0x1f, 0xeb, - 0x64, 0x79, 0x88, 0x69, 0x16, 0xec, 0x3f, 0x9c, 0x90, 0x43, 0x7a, 0x1a, 0x11, 0x05, 0xe4, 0x1e, - 0x94, 0xa2, 0x76, 0x28, 0x0a, 0xe5, 0xd7, 0x8e, 0x79, 0x22, 0xdc, 0xde, 0xac, 0x0b, 0xf7, 0x81, - 0x58, 0x69, 0x93, 0x25, 0x4c, 0xf9, 0x54, 0xb4, 0x38, 0xe1, 0x46, 0x57, 0x12, 0xce, 0xe5, 0x28, - 0xba, 0xbd, 0x56, 0x4b, 0x13, 0x96, 0x25, 0x8c, 0xb0, 0xa2, 0x65, 0xff, 0x96, 0x05, 0xa5, 0x1b, - 0xbe, 0x92, 0x23, 0x3f, 0x9b, 0x83, 0xa1, 0x47, 0xeb, 0x83, 0xfa, 0x9a, 0x32, 0x3e, 0x62, 0xbc, - 0x96, 0x30, 0xf3, 0x3c, 0x6d, 0xe0, 0x5e, 0xe1, 0xf9, 0xb3, 0x18, 0xaa, 0x1b, 0xfe, 0xce, 0x40, - 0xd3, 0xe3, 0xaf, 0x15, 0xe1, 0xcc, 0x1b, 0xce, 0x21, 0xf5, 0x22, 0x67, 0xf4, 0x4d, 0xe2, 0x65, - 0x98, 0x75, 0xba, 0xfc, 0x1e, 0xcc, 0xd0, 0xf1, 0x63, 0xcb, 0x49, 0x0c, 0x42, 0xb3, 0x5e, 0x2c, - 0xd0, 0x44, 0x76, 0x9d, 0x2c, 0x51, 0xb4, 0x96, 0x82, 0x63, 0x5f, 0x0b, 0x72, 0x03, 0x88, 0x8c, - 0x46, 0xad, 0x34, 0x1a, 0x7e, 0xcf, 0x13, 0x22, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xab, 0xaf, - 0x06, 0x66, 0xb4, 0x22, 0x9f, 0x87, 0xa5, 0x06, 0xc7, 0x2c, 0x8f, 0x1e, 0x26, 0x46, 0x71, 0xfc, - 0xd4, 0x71, 0x02, 0x6b, 0x03, 0xea, 0xe1, 0x40, 0x0c, 0x8c, 0xd3, 0x30, 0xf2, 0x03, 0xa7, 0x45, - 0x4d, 0xbc, 0x53, 0x49, 0x4e, 0xeb, 0x7d, 0x35, 0x30, 0xa3, 0x15, 0xf9, 0x12, 0x94, 0xa2, 0xbd, - 0x80, 0x86, 0x7b, 0x7e, 0xbb, 0x29, 0xfd, 0x16, 0xc6, 0xb4, 0xb4, 0xc9, 0xd1, 0xdf, 0x56, 0x58, - 0x8d, 0xe9, 0xad, 0x8a, 0x30, 0xa6, 0x49, 0x02, 0x98, 0x0a, 0x1b, 0x7e, 0x97, 0x86, 0x52, 0x65, - 0xbf, 0x91, 0x0b, 0x75, 0x6e, 0x39, 0x32, 0x6c, 0x7c, 0x9c, 0x02, 0x4a, 0x4a, 0xf6, 0xef, 0x4d, - 0xc0, 0x9c, 0x59, 0x71, 0x08, 0xd9, 0xf4, 0x15, 0x0b, 0xe6, 0x1a, 0xbe, 0x17, 0x05, 0x7e, 0x5b, - 0xd8, 0xaf, 0xf2, 0xd1, 0x28, 0x18, 0xaa, 0x75, 0x1a, 0x39, 0x6e, 0xdb, 0x30, 0x85, 0x19, 0x64, - 0x30, 0x41, 0x94, 0x7c, 0xdd, 0x82, 0x85, 0xd8, 0xcd, 0x2d, 0x36, 0xa4, 0xe5, 0xca, 0x88, 0x16, - 0xf5, 0x57, 0x93, 0x94, 0x30, 0x4d, 0xda, 0xde, 0x81, 0xc5, 0xf4, 0x68, 0xb3, 0xae, 0xec, 0x3a, - 0x72, 0xad, 0x17, 0xe2, 0xae, 0xac, 0x39, 0x61, 0x88, 0x1c, 0x42, 0x9e, 0x87, 0x99, 0x8e, 0x13, - 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x5e, 0x2c, 0x18, 0x02, 0x49, 0x96, 0xa3, 0xae, 0x61, 0x7f, 0x1c, - 0xe6, 0xb6, 0x1c, 0xaf, 0x45, 0x9b, 0x52, 0x0e, 0x3f, 0x3c, 0xa6, 0xed, 0x47, 0x93, 0x30, 0x6b, - 0x9c, 0xcd, 0x4e, 0xff, 0x9c, 0x95, 0x48, 0xa9, 0x51, 0xc8, 0x31, 0xa5, 0xc6, 0x67, 0x01, 0x76, - 0x5d, 0xcf, 0x0d, 0xf7, 0x1e, 0x31, 0x59, 0x07, 0xbf, 0xd7, 0xbd, 0xa6, 0x31, 0xa0, 0x81, 0x2d, - 0xbe, 0x3c, 0x2b, 0x9e, 0x90, 0x79, 0xea, 0x7d, 0xcb, 0xd8, 0x6e, 0xa6, 0xf2, 0x70, 0x16, 0x30, - 0x06, 0x66, 0x45, 0x6d, 0x3f, 0x22, 0xd7, 0xd0, 0x49, 0xbb, 0xd2, 0x36, 0xcc, 0x04, 0x34, 0xec, - 0x75, 0xd8, 0x89, 0x71, 0x7a, 0xe4, 0x6e, 0xe0, 0x6e, 0x1b, 0x28, 0xdb, 0xa3, 0xc6, 0xb4, 0xfc, - 0x2a, 0x9c, 0x49, 0xb0, 0x30, 0x52, 0xf6, 0x21, 0x1f, 0x32, 0x0d, 0x00, 0x8f, 0x72, 0x99, 0xc3, - 0xc6, 0xa2, 0x6d, 0x64, 0xeb, 0xd0, 0x63, 0x21, 0x9c, 0x73, 0x04, 0xcc, 0xfe, 0xf3, 0x29, 0x90, - 0xf7, 0xdf, 0x43, 0x88, 0x2b, 0xf3, 0xd6, 0x6b, 0xe2, 0x11, 0x6e, 0xbd, 0x6e, 0xc0, 0x9c, 0xeb, - 0xb9, 0x91, 0xeb, 0xb4, 0xb9, 0x71, 0x47, 0x6e, 0xa7, 0xca, 0x7b, 0x79, 0x6e, 0xc3, 0x80, 0x65, - 0xe0, 0x49, 0xb4, 0x25, 0xb7, 0xa0, 0xc8, 0xf7, 0x1b, 0x39, 0x81, 0x47, 0xbf, 0xa4, 0xe7, 0xfe, - 0x19, 0x22, 0xa4, 0x49, 0x60, 0xe2, 0x87, 0x0f, 0x91, 0xae, 0x44, 0x1f, 0xbf, 0xe5, 0x3c, 0x8e, - 0x0f, 0x1f, 0x29, 0x38, 0xf6, 0xb5, 0x60, 0x58, 0x76, 0x1d, 0xb7, 0xdd, 0x0b, 0x68, 0x8c, 0x65, - 0x2a, 0x89, 0xe5, 0x5a, 0x0a, 0x8e, 0x7d, 0x2d, 0xc8, 0x2e, 0xcc, 0xc9, 0x32, 0xe1, 0x72, 0x35, - 0xfd, 0x88, 0x5f, 0xc9, 0x5d, 0xeb, 0xae, 0x19, 0x98, 0x30, 0x81, 0x97, 0xf4, 0xe0, 0xac, 0xeb, - 0x35, 0x7c, 0xaf, 0xd1, 0xee, 0x85, 0xee, 0x01, 0x8d, 0xe3, 0x89, 0x1e, 0x85, 0xd8, 0x85, 0xe3, - 0xa3, 0xf2, 0xd9, 0x8d, 0x34, 0x3a, 0xec, 0xa7, 0x40, 0xbe, 0x6c, 0xc1, 0x85, 0x86, 0xef, 0x85, - 0x3c, 0xfe, 0xff, 0x80, 0x5e, 0x0d, 0x02, 0x3f, 0x10, 0xb4, 0x4b, 0x8f, 0x48, 0x9b, 0xdb, 0x14, - 0xd7, 0xb2, 0x50, 0x62, 0x36, 0x25, 0xf2, 0x0e, 0xcc, 0x74, 0x03, 0xff, 0xc0, 0x6d, 0xd2, 0x40, - 0xba, 0xef, 0x6d, 0xe6, 0x91, 0x8f, 0xa4, 0x26, 0x71, 0xc6, 0xa2, 0x47, 0x95, 0xa0, 0xa6, 0x67, - 0xff, 0xef, 0x59, 0x98, 0x4f, 0x56, 0x27, 0xbf, 0x00, 0xd0, 0x0d, 0xfc, 0x0e, 0x8d, 0xf6, 0xa8, - 0x8e, 0x0b, 0xb9, 0x39, 0x6e, 0xda, 0x0b, 0x85, 0x4f, 0xb9, 0xbc, 0x30, 0x71, 0x11, 0x97, 0xa2, - 0x41, 0x91, 0x04, 0x30, 0xbd, 0x2f, 0xb6, 0x5d, 0xa9, 0x85, 0xbc, 0x91, 0x8b, 0xce, 0x24, 0x29, - 0xf3, 0x80, 0x06, 0x59, 0x84, 0x8a, 0x10, 0xd9, 0x81, 0xc2, 0x3d, 0xba, 0x93, 0x4f, 0xcc, 0xf5, - 0x1d, 0x2a, 0x4f, 0x33, 0xd5, 0xe9, 0xe3, 0xa3, 0x72, 0xe1, 0x0e, 0xdd, 0x41, 0x86, 0x9c, 0x7d, - 0x57, 0x53, 0xdc, 0xdd, 0x4b, 0x51, 0x31, 0xe6, 0x77, 0x25, 0x1c, 0x01, 0xc4, 0x77, 0xc9, 0x22, - 0x54, 0x84, 0xc8, 0x3b, 0x50, 0xba, 0xe7, 0x1c, 0xd0, 0xdd, 0xc0, 0xf7, 0x22, 0xe9, 0x67, 0x35, - 0x66, 0xa8, 0xc0, 0x1d, 0x85, 0x4e, 0xd2, 0xe5, 0xdb, 0xbb, 0x2e, 0xc4, 0x98, 0x1c, 0x39, 0x80, - 0x19, 0x8f, 0xde, 0x43, 0xda, 0x76, 0x1b, 0xf9, 0xb8, 0xe6, 0xdf, 0x94, 0xd8, 0x24, 0x65, 0xbe, - 0xef, 0xa9, 0x32, 0xd4, 0xb4, 0xd8, 0x58, 0xde, 0xf5, 0x77, 0xa4, 0xa0, 0x1a, 0x73, 0x2c, 0xf5, - 0xc9, 0x54, 0x8c, 0xe5, 0x0d, 0x7f, 0x07, 0x19, 0x72, 0xb6, 0x46, 0x1a, 0xda, 0xc9, 0x47, 0x8a, - 0xa9, 0x9b, 0xf9, 0x3a, 0x37, 0x89, 0x35, 0x12, 0x97, 0xa2, 0x41, 0x91, 0xf5, 0x6d, 0x4b, 0x1a, - 0x2b, 0xa5, 0xa0, 0x1a, 0xb3, 0x6f, 0x93, 0xa6, 0x4f, 0xd1, 0xb7, 0xaa, 0x0c, 0x35, 0x2d, 0x46, - 0xd7, 0x95, 0x96, 0xbf, 0x7c, 0x44, 0x55, 0xd2, 0x8e, 0x28, 0xe8, 0xaa, 0x32, 0xd4, 0xb4, 0x58, - 0x7f, 0x87, 0xfb, 0x87, 0xf7, 0x9c, 0xf6, 0xbe, 0xeb, 0xb5, 0x64, 0x9c, 0xe3, 0xb8, 0xd9, 0x6d, - 0xf7, 0x0f, 0xef, 0x08, 0x7c, 0x66, 0x7f, 0xc7, 0xa5, 0x68, 0x50, 0x24, 0xff, 0xc8, 0x82, 0xa9, - 0x6e, 0xbb, 0xd7, 0x72, 0xbd, 0xa5, 0x39, 0xae, 0x27, 0x7e, 0x26, 0x4f, 0x09, 0xbd, 0x52, 0xe3, - 0xa8, 0x85, 0xa2, 0xf8, 0xd3, 0xda, 0x67, 0x8f, 0x17, 0xfe, 0xd2, 0x9f, 0x95, 0x97, 0xa8, 0xd7, - 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xbd, 0x1b, 0xfa, 0xde, 0x0a, 0x3a, 0xf7, 0x94, 0x8e, 0x2e, 0x79, - 0x5a, 0xfe, 0x24, 0xcc, 0x1a, 0x28, 0x1e, 0xa6, 0xe8, 0xcd, 0x99, 0x8a, 0xde, 0x6f, 0x4d, 0xc1, - 0x9c, 0x99, 0x51, 0x6f, 0x08, 0xed, 0x4b, 0x9f, 0x38, 0x26, 0x46, 0x39, 0x71, 0xb0, 0x23, 0xa6, - 0x71, 0x7b, 0xa4, 0xcc, 0x5b, 0x1b, 0xb9, 0x29, 0xdc, 0xf1, 0x11, 0xd3, 0x28, 0x0c, 0x31, 0x41, - 0x74, 0x04, 0x87, 0x12, 0xa6, 0xb6, 0x0a, 0xc5, 0xae, 0x98, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x0b, - 0x00, 0x71, 0x66, 0x39, 0x79, 0xab, 0xa8, 0xf5, 0x61, 0x23, 0xe3, 0x9d, 0x51, 0x8b, 0x3c, 0x07, - 0x53, 0x4c, 0xf5, 0xa1, 0x4d, 0x19, 0x86, 0xad, 0xcf, 0xf1, 0xd7, 0x78, 0x29, 0x4a, 0x28, 0x79, - 0x85, 0x69, 0xa9, 0xb1, 0xc2, 0x22, 0xa3, 0xab, 0xcf, 0xc7, 0x5a, 0x6a, 0x0c, 0xc3, 0x44, 0x4d, - 0xc6, 0x3a, 0x65, 0xfa, 0x05, 0x97, 0x0d, 0x06, 0xeb, 0x5c, 0xe9, 0x40, 0x01, 0xe3, 0x76, 0xa5, - 0x94, 0x3e, 0xc2, 0xd7, 0x74, 0xd1, 0xb0, 0x2b, 0xa5, 0xe0, 0xd8, 0xd7, 0x82, 0x7d, 0x8c, 0xbc, - 0x10, 0x9d, 0x15, 0xce, 0xb6, 0x03, 0xae, 0x32, 0xbf, 0x6a, 0x9e, 0xb5, 0x72, 0x5c, 0x43, 0x62, - 0xd6, 0x0e, 0x7f, 0xd8, 0x1a, 0xef, 0x58, 0xf4, 0x05, 0x98, 0x4f, 0xee, 0x42, 0xb9, 0xdf, 0x7c, - 0x7c, 0x6d, 0x12, 0xce, 0xdd, 0x6c, 0xb9, 0x5e, 0x3a, 0x5b, 0x54, 0x56, 0xb2, 0x70, 0x6b, 0xe4, - 0x64, 0xe1, 0x3a, 0x9e, 0x4b, 0xa6, 0xe2, 0xce, 0x8e, 0xe7, 0x52, 0x79, 0xd1, 0x93, 0x75, 0xc9, - 0x9f, 0x5a, 0xf0, 0xb4, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0x1c, 0xb7, 0x72, 0x45, - 0x87, 0x63, 0xee, 0xf2, 0xfd, 0x1f, 0xbf, 0x52, 0x39, 0x81, 0xaa, 0x18, 0xf1, 0x9f, 0x92, 0x5f, - 0xf0, 0xf4, 0x49, 0x55, 0xf1, 0x44, 0xf6, 0xc9, 0xdf, 0x80, 0x85, 0xc4, 0x07, 0x4b, 0x4b, 0x78, - 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xd7, 0x5d, 0x7e, 0x13, 0x3e, 0xfc, 0x50, 0x3e, 0x47, - 0x9a, 0x6c, 0x5f, 0xb1, 0xa0, 0x24, 0xec, 0xda, 0x48, 0x77, 0x53, 0x4e, 0x98, 0xa9, 0x93, 0x77, - 0xa5, 0xb6, 0x91, 0xe1, 0x84, 0xc9, 0x64, 0xf9, 0xbe, 0xeb, 0x35, 0xe5, 0x28, 0x6b, 0x59, 0xfe, - 0x86, 0xeb, 0x35, 0x91, 0x43, 0xb4, 0xb4, 0x2f, 0x0c, 0xb4, 0x37, 0xfd, 0xba, 0x05, 0xf3, 0x3c, - 0x06, 0x36, 0x3e, 0x13, 0xbe, 0xac, 0x9d, 0x8d, 0x04, 0x1b, 0x97, 0x92, 0xce, 0x46, 0x0f, 0x8e, - 0xca, 0xb3, 0x22, 0x6a, 0x36, 0xe9, 0x7b, 0xf4, 0x39, 0x69, 0x48, 0xe2, 0x2e, 0x51, 0x13, 0x23, - 0xdb, 0x39, 0xb4, 0xa1, 0xb5, 0xae, 0x90, 0x60, 0x8c, 0xcf, 0x7e, 0x17, 0xe6, 0xcc, 0x60, 0x16, - 0xf2, 0x32, 0xcc, 0x76, 0x5d, 0xaf, 0x95, 0x0c, 0x7a, 0xd4, 0xc6, 0xf6, 0x5a, 0x0c, 0x42, 0xb3, - 0x1e, 0x6f, 0xe6, 0xc7, 0xcd, 0x52, 0x36, 0xfa, 0x9a, 0x6f, 0x36, 0x8b, 0xff, 0xf0, 0x1c, 0xdb, - 0x19, 0x41, 0x53, 0xb9, 0xe7, 0xd8, 0xce, 0xa0, 0xf1, 0x93, 0xcb, 0xb1, 0x9d, 0xc5, 0xcc, 0xff, - 0x5d, 0x39, 0xb6, 0x7f, 0x06, 0x46, 0x4d, 0xae, 0xc8, 0xf6, 0xbb, 0x7b, 0x66, 0x60, 0xba, 0xee, - 0x71, 0x19, 0x99, 0x2e, 0xa1, 0xf6, 0x7b, 0x6c, 0xd9, 0xe8, 0x43, 0x6d, 0xa5, 0x17, 0xed, 0x11, - 0x0f, 0x8a, 0xa1, 0xdb, 0x3a, 0x78, 0x29, 0x27, 0x9b, 0x36, 0x43, 0x25, 0x1f, 0x66, 0x88, 0x03, - 0x62, 0x59, 0x21, 0x0a, 0x32, 0xf6, 0x77, 0x0b, 0xb0, 0x98, 0x3e, 0x79, 0xe7, 0xed, 0xd4, 0x40, - 0xbe, 0x6e, 0xc1, 0xbc, 0xd3, 0x8b, 0xf6, 0xa8, 0x17, 0xa9, 0x8b, 0xad, 0x5c, 0xde, 0x0c, 0x49, - 0xf6, 0x9d, 0x91, 0xc2, 0x2a, 0x41, 0x0b, 0x53, 0xb4, 0xc9, 0x5f, 0x81, 0xe9, 0xc8, 0xed, 0x50, - 0xbf, 0x27, 0xec, 0x71, 0x05, 0x71, 0x2e, 0xde, 0x16, 0x45, 0xa8, 0x60, 0xe4, 0x79, 0x76, 0x8e, - 0x61, 0x8a, 0x4c, 0x40, 0xa5, 0xf7, 0xeb, 0x62, 0x6c, 0x40, 0x14, 0xe5, 0xa8, 0x6b, 0x90, 0xfb, - 0x30, 0x2d, 0xdc, 0x1f, 0x94, 0x9f, 0xcb, 0x56, 0x4e, 0x16, 0x02, 0xe1, 0x61, 0x11, 0x0f, 0x81, - 0xf8, 0x1f, 0xa2, 0x22, 0x67, 0x7f, 0x1c, 0x46, 0x4c, 0x78, 0x69, 0x5f, 0x05, 0x82, 0x7e, 0xbb, - 0xbd, 0xe3, 0x34, 0xf6, 0xef, 0xb8, 0x5e, 0xd3, 0xbf, 0xc7, 0xa5, 0xe1, 0x2a, 0x94, 0x02, 0x19, - 0xf5, 0x18, 0xca, 0x89, 0xab, 0xc5, 0xa9, 0x0a, 0x87, 0x0c, 0x31, 0xae, 0x63, 0xff, 0xe1, 0x04, - 0x4c, 0xcb, 0x10, 0xdd, 0xc7, 0xe0, 0x7d, 0xbf, 0x9f, 0xb8, 0x96, 0xdd, 0xc8, 0x25, 0xb2, 0x78, - 0xa0, 0xeb, 0x7d, 0x98, 0x72, 0xbd, 0x7f, 0x23, 0x1f, 0x72, 0x27, 0xfb, 0xdd, 0xff, 0x41, 0x11, - 0x16, 0x52, 0x21, 0xcf, 0x4c, 0x25, 0xee, 0x73, 0x37, 0xbd, 0x9d, 0x6b, 0x54, 0xb5, 0x0e, 0x27, - 0x39, 0xd9, 0xf3, 0x34, 0x4c, 0xa4, 0x27, 0xbe, 0x95, 0xdb, 0xcb, 0x0b, 0x7f, 0x99, 0xa9, 0x78, - 0x44, 0x4f, 0x4a, 0xf2, 0x6d, 0x0b, 0xce, 0x39, 0xfd, 0x4f, 0x57, 0x48, 0xd3, 0xdd, 0xad, 0xdc, - 0xdf, 0xc4, 0xa8, 0x3e, 0x25, 0x99, 0xcc, 0x7a, 0x21, 0x04, 0xb3, 0x58, 0xb1, 0xff, 0xb3, 0x05, - 0x4f, 0x0e, 0x0c, 0xde, 0xe7, 0xb9, 0x9f, 0x82, 0x24, 0x54, 0xca, 0x8c, 0x9c, 0x53, 0x94, 0xe8, - 0x6b, 0xdc, 0x74, 0xba, 0x9e, 0x34, 0x79, 0xf2, 0x12, 0xcc, 0x71, 0x35, 0x91, 0x49, 0xcf, 0x88, - 0x76, 0xe5, 0x2d, 0x14, 0xbf, 0x8f, 0xa8, 0x1b, 0xe5, 0x98, 0xa8, 0x65, 0x7f, 0xdb, 0x82, 0xa5, - 0x41, 0x99, 0x80, 0x86, 0xb0, 0x91, 0xfc, 0xf5, 0x54, 0x04, 0x43, 0xb9, 0x2f, 0x82, 0x21, 0x65, - 0x25, 0x51, 0xc1, 0x0a, 0x86, 0x81, 0xa2, 0xf0, 0x10, 0x07, 0xfd, 0x6f, 0x58, 0x70, 0x71, 0xc0, - 0x82, 0xef, 0x8b, 0x64, 0xb1, 0x1e, 0x39, 0x92, 0x65, 0x62, 0xd8, 0x48, 0x16, 0xfb, 0x8f, 0x0a, - 0xb0, 0x28, 0xf9, 0x89, 0xcf, 0x0a, 0xaf, 0x24, 0xe2, 0x40, 0x7e, 0x2a, 0x15, 0x07, 0x72, 0x3e, - 0x5d, 0xff, 0x2f, 0x83, 0x40, 0x3e, 0x58, 0x41, 0x20, 0x7f, 0x31, 0x01, 0x17, 0x32, 0x13, 0x14, - 0x91, 0xaf, 0x65, 0xec, 0x5e, 0x77, 0x72, 0xce, 0x84, 0x34, 0xe4, 0xfe, 0x35, 0x6e, 0xe4, 0xc4, - 0xaf, 0x9a, 0x11, 0x0b, 0x62, 0x37, 0xda, 0x3d, 0x85, 0x9c, 0x4e, 0x23, 0x06, 0x2f, 0xd8, 0xbf, - 0x54, 0x80, 0x2b, 0xc3, 0x22, 0xfa, 0x80, 0x06, 0xb7, 0x85, 0x89, 0xe0, 0xb6, 0xc7, 0xa4, 0x59, - 0x9c, 0x4a, 0x9c, 0xdb, 0x3f, 0x99, 0xd4, 0xdb, 0x5e, 0xff, 0xfc, 0x1c, 0xca, 0x65, 0x61, 0x9a, - 0x69, 0x9f, 0x2a, 0xc9, 0x71, 0x2c, 0x0a, 0xa7, 0xeb, 0xa2, 0xf8, 0xc1, 0x51, 0xf9, 0x6c, 0x9c, - 0x26, 0x43, 0x16, 0xa2, 0x6a, 0x44, 0xae, 0xc0, 0x4c, 0x20, 0xa0, 0x2a, 0x9c, 0x47, 0xfa, 0x7d, - 0x88, 0x32, 0xd4, 0x50, 0xf2, 0x25, 0x43, 0x5d, 0x9f, 0x3c, 0xad, 0x6c, 0x30, 0x27, 0xb9, 0xb3, - 0xbc, 0x0d, 0x33, 0xa1, 0x4a, 0x40, 0x2c, 0x14, 0x97, 0x17, 0x87, 0x8c, 0x12, 0x73, 0x76, 0x68, - 0x5b, 0x65, 0x23, 0x16, 0xdf, 0xa7, 0x73, 0x15, 0x6b, 0x94, 0xc4, 0xd6, 0x27, 0x70, 0x61, 0x6e, - 0x87, 0xfe, 0xd3, 0x37, 0x89, 0x60, 0x5a, 0x3e, 0xd0, 0x28, 0xef, 0x01, 0xb7, 0x72, 0x8a, 0x08, - 0x91, 0xfe, 0xc2, 0xfc, 0x54, 0xa9, 0x2c, 0x41, 0x8a, 0x94, 0xfd, 0x03, 0x0b, 0x66, 0xe5, 0x1c, - 0x79, 0x0c, 0xe1, 0x72, 0x77, 0x93, 0xe1, 0x72, 0x57, 0x73, 0x91, 0x58, 0x03, 0x62, 0xe5, 0xee, - 0xc2, 0x9c, 0x99, 0x19, 0x8f, 0x7c, 0xd6, 0x90, 0xb8, 0xd6, 0x38, 0xb9, 0xa6, 0x94, 0x4c, 0x8e, - 0xa5, 0xb1, 0xfd, 0xdb, 0x25, 0xdd, 0x8b, 0xfc, 0xec, 0x6a, 0xce, 0x7c, 0xeb, 0xc4, 0x99, 0x6f, - 0x4e, 0xbc, 0x89, 0xfc, 0x27, 0xde, 0x2d, 0x98, 0x51, 0x62, 0x51, 0x2a, 0x0f, 0xcf, 0x9a, 0x0e, - 0xc4, 0x4c, 0x03, 0x61, 0xc8, 0x8c, 0xe5, 0xc2, 0xcf, 0xa0, 0x7a, 0x0c, 0xb5, 0xb8, 0xd6, 0x68, - 0xc8, 0x3b, 0x30, 0x7b, 0xcf, 0x0f, 0xf6, 0xdb, 0xbe, 0xc3, 0xd3, 0x9f, 0x43, 0x1e, 0x77, 0xd6, - 0xda, 0x64, 0x2c, 0xa2, 0x38, 0xee, 0xc4, 0xf8, 0xd1, 0x24, 0x46, 0x2a, 0xb0, 0xd0, 0x71, 0x3d, - 0xa4, 0x4e, 0x53, 0x47, 0xc5, 0x4d, 0x8a, 0x8c, 0xcb, 0x4a, 0xb5, 0xde, 0x4a, 0x82, 0x31, 0x5d, - 0x9f, 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0xa6, 0x55, 0xad, 0x8d, 0x3f, 0x19, 0x93, 0x16, 0x0c, - 0x11, 0xc6, 0x90, 0x2c, 0xc7, 0x14, 0x6d, 0xf2, 0x45, 0x98, 0x09, 0x65, 0xda, 0xbb, 0x7c, 0x9c, - 0x1d, 0xf4, 0xd9, 0x5e, 0x20, 0x8d, 0x87, 0x52, 0x95, 0xa0, 0x26, 0x48, 0x36, 0xe1, 0xbc, 0x32, - 0x9f, 0x24, 0x9e, 0xa8, 0x9a, 0x8a, 0xb3, 0x24, 0x61, 0x06, 0x1c, 0x33, 0x5b, 0x31, 0x55, 0x8e, - 0x67, 0x9c, 0x14, 0x77, 0x84, 0xc6, 0xb5, 0x1a, 0x5f, 0x7f, 0x4d, 0x94, 0xd0, 0x93, 0x82, 0x3e, - 0x67, 0xc6, 0x08, 0xfa, 0xac, 0xc3, 0x85, 0x34, 0x88, 0xa7, 0xbf, 0xe2, 0x19, 0xb7, 0x8c, 0x2d, - 0xb4, 0x96, 0x55, 0x09, 0xb3, 0xdb, 0x92, 0x3b, 0x50, 0x0a, 0x28, 0x3f, 0x64, 0x55, 0x94, 0x7b, - 0xd5, 0xc8, 0x8e, 0xa4, 0xa8, 0x10, 0x60, 0x8c, 0x8b, 0x8d, 0xbb, 0x93, 0xcc, 0x81, 0x7c, 0x2b, - 0xc7, 0xb7, 0x51, 0xe5, 0xd8, 0x0f, 0x48, 0x4b, 0x67, 0xff, 0xdb, 0x05, 0x38, 0x93, 0xb0, 0x01, - 0x91, 0x67, 0xa1, 0xc8, 0xf3, 0x81, 0x71, 0x69, 0x35, 0x13, 0x4b, 0x54, 0xd1, 0x39, 0x02, 0x46, - 0x7e, 0xd9, 0x82, 0x85, 0x6e, 0xe2, 0x5a, 0x45, 0x09, 0xf2, 0x71, 0x0d, 0xa7, 0x09, 0xa4, 0xc6, - 0xeb, 0x01, 0x49, 0x62, 0x98, 0xa6, 0xce, 0xe4, 0x81, 0xf4, 0xc6, 0x6e, 0xd3, 0x80, 0xd7, 0x96, - 0x8a, 0x9e, 0x46, 0xb1, 0x96, 0x04, 0x63, 0xba, 0x3e, 0x1b, 0x61, 0xfe, 0x75, 0xe3, 0xbc, 0xbe, - 0x57, 0x51, 0x08, 0x30, 0xc6, 0x45, 0x5e, 0x83, 0x79, 0x99, 0xfa, 0xb6, 0xe6, 0x37, 0xaf, 0x3b, - 0xe1, 0x9e, 0x3c, 0xe1, 0xe8, 0x13, 0xd9, 0x5a, 0x02, 0x8a, 0xa9, 0xda, 0xfc, 0xdb, 0xe2, 0xfc, - 0xc2, 0x1c, 0xc1, 0x54, 0xf2, 0x71, 0x85, 0xb5, 0x24, 0x18, 0xd3, 0xf5, 0xc9, 0xf3, 0xc6, 0x36, - 0x24, 0xee, 0xed, 0xb5, 0x34, 0xc8, 0xd8, 0x8a, 0x2a, 0xb0, 0xd0, 0xe3, 0x07, 0xc2, 0xa6, 0x02, - 0xca, 0xf5, 0xa8, 0x09, 0xde, 0x4e, 0x82, 0x31, 0x5d, 0x9f, 0xbc, 0x0a, 0x67, 0x02, 0x26, 0x6c, - 0x35, 0x02, 0x71, 0x99, 0xaf, 0xef, 0x6a, 0xd1, 0x04, 0x62, 0xb2, 0x2e, 0x79, 0x1d, 0xce, 0xc6, - 0x99, 0x22, 0x15, 0x02, 0x71, 0xbb, 0xaf, 0xd3, 0x96, 0x55, 0xd2, 0x15, 0xb0, 0xbf, 0x0d, 0xf9, - 0x5b, 0xb0, 0x68, 0xf4, 0xc4, 0x86, 0xd7, 0xa4, 0xf7, 0x65, 0x36, 0x3f, 0xfe, 0x6a, 0xce, 0x5a, - 0x0a, 0x86, 0x7d, 0xb5, 0xc9, 0xa7, 0x60, 0xbe, 0xe1, 0xb7, 0xdb, 0x5c, 0xc6, 0x89, 0xc4, 0xfe, - 0x22, 0x6d, 0x9f, 0x48, 0x70, 0x98, 0x80, 0x60, 0xaa, 0x26, 0xb9, 0x01, 0xc4, 0xdf, 0x61, 0xea, - 0x15, 0x6d, 0xbe, 0x2e, 0x9e, 0x77, 0x67, 0x1a, 0xc7, 0x99, 0x64, 0x2c, 0xc8, 0x9b, 0x7d, 0x35, - 0x30, 0xa3, 0x15, 0xcf, 0x7a, 0x66, 0xc4, 0xce, 0xce, 0xe7, 0xf1, 0x12, 0x5d, 0xda, 0x7c, 0xf1, - 0xd0, 0xc0, 0xd9, 0x00, 0xa6, 0x44, 0x68, 0x4e, 0x3e, 0xf9, 0xfb, 0xcc, 0x1c, 0xdf, 0xf1, 0x1e, - 0x21, 0x4a, 0x51, 0x52, 0x22, 0xbf, 0x00, 0xa5, 0x1d, 0xf5, 0xe0, 0x03, 0x4f, 0xda, 0x37, 0xf6, - 0xbe, 0x98, 0x7a, 0xbb, 0x24, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x24, 0xc9, 0x73, 0x30, 0x7b, 0xbd, - 0x56, 0xd1, 0xb3, 0xf0, 0x2c, 0x1f, 0xfd, 0x49, 0xd6, 0x04, 0x4d, 0x00, 0x5b, 0x61, 0x5a, 0x7d, - 0x23, 0xc9, 0x37, 0x54, 0x32, 0xb4, 0x31, 0x56, 0x9b, 0xdf, 0xc0, 0x63, 0x7d, 0xe9, 0x5c, 0xaa, - 0xb6, 0x2c, 0x47, 0x5d, 0x83, 0xbc, 0x0d, 0xb3, 0x72, 0xbf, 0xe0, 0xb2, 0xe9, 0xfc, 0xa3, 0xc5, - 0x65, 0x63, 0x8c, 0x02, 0x4d, 0x7c, 0xfc, 0xda, 0x98, 0xe7, 0xc1, 0xa7, 0xd7, 0x7a, 0xed, 0xf6, - 0xd2, 0x05, 0x2e, 0x37, 0xe3, 0x6b, 0xe3, 0x18, 0x84, 0x66, 0x3d, 0xf2, 0xa2, 0xf2, 0xa4, 0xfa, - 0x50, 0xe2, 0x1e, 0x5d, 0x7b, 0x52, 0x69, 0xa5, 0x7b, 0x40, 0xe8, 0xc6, 0xc5, 0x87, 0xb8, 0x30, - 0xed, 0xc0, 0xb2, 0xd2, 0xf8, 0xfa, 0x17, 0xc9, 0xd2, 0x52, 0xc2, 0x54, 0xb2, 0x7c, 0x67, 0x60, - 0x4d, 0x3c, 0x01, 0x0b, 0xd9, 0x81, 0x82, 0xd3, 0xde, 0x59, 0x7a, 0x32, 0x0f, 0xd5, 0xb5, 0xb2, - 0x59, 0x95, 0x33, 0x8a, 0xbb, 0x5b, 0x56, 0x36, 0xab, 0xc8, 0x90, 0x13, 0x17, 0x26, 0x9d, 0xf6, - 0x4e, 0xb8, 0xb4, 0xcc, 0xd7, 0x6c, 0x6e, 0x44, 0x62, 0xe3, 0xc1, 0x66, 0x35, 0x44, 0x4e, 0xc2, - 0xfe, 0xf2, 0x84, 0xbe, 0xa8, 0xd1, 0x29, 0x94, 0xdf, 0x35, 0x17, 0x90, 0x95, 0xc7, 0x0b, 0xe5, - 0x7d, 0x0f, 0xb0, 0x88, 0xbd, 0x2f, 0x73, 0xf9, 0x74, 0xb5, 0xc8, 0xc8, 0x25, 0x39, 0x55, 0x32, - 0x3d, 0xb4, 0x38, 0x3d, 0x27, 0x05, 0x86, 0xfd, 0x5d, 0xd0, 0x46, 0xbf, 0x94, 0x17, 0x52, 0x00, - 0x45, 0x37, 0x8c, 0x5c, 0x3f, 0xc7, 0x70, 0xe5, 0x54, 0x5e, 0x65, 0x1e, 0x0d, 0xc1, 0x01, 0x28, - 0x48, 0x31, 0x9a, 0x5e, 0xcb, 0xf5, 0xee, 0xcb, 0xcf, 0xbf, 0x95, 0xbb, 0x7b, 0x91, 0xa0, 0xc9, - 0x01, 0x28, 0x48, 0x91, 0xbb, 0x62, 0x52, 0xe7, 0xf3, 0x1a, 0xfd, 0x66, 0x35, 0x45, 0x2f, 0x39, - 0xb9, 0xef, 0x42, 0x21, 0xec, 0xb8, 0x52, 0x5d, 0x1a, 0x93, 0x56, 0x7d, 0x6b, 0x23, 0x8b, 0x56, - 0x7d, 0x6b, 0x03, 0x19, 0x11, 0xf2, 0x55, 0x0b, 0xc0, 0xe9, 0xec, 0x38, 0x61, 0xe8, 0x34, 0xb5, - 0x75, 0x66, 0xcc, 0xf7, 0x12, 0x2a, 0x1a, 0x5f, 0x8a, 0x34, 0x77, 0xa8, 0x8d, 0xa1, 0x68, 0x50, - 0x26, 0xef, 0xc0, 0xb4, 0x23, 0x5e, 0x66, 0x93, 0xbe, 0xe1, 0xf9, 0x3c, 0x37, 0x98, 0xe2, 0x80, - 0x9b, 0x69, 0x24, 0x08, 0x15, 0x41, 0x46, 0x3b, 0x0a, 0x1c, 0xba, 0xeb, 0xee, 0x4b, 0xe3, 0x50, - 0x7d, 0xec, 0x27, 0x13, 0x18, 0xb2, 0x2c, 0xda, 0x12, 0x84, 0x8a, 0xa0, 0x78, 0x29, 0xdb, 0xf1, - 0x1c, 0x1d, 0xf1, 0x97, 0x4f, 0x5c, 0xa8, 0x19, 0x43, 0x68, 0xbc, 0x94, 0x6d, 0x12, 0xc2, 0x24, - 0x5d, 0x72, 0x00, 0x53, 0x0e, 0x7f, 0x33, 0x52, 0x1e, 0xc5, 0x30, 0x8f, 0xf7, 0x27, 0x53, 0x7d, - 0xc0, 0x85, 0x8b, 0x7c, 0x99, 0x52, 0x52, 0x23, 0xbf, 0x61, 0xc1, 0xb4, 0x70, 0x5b, 0x66, 0x0a, - 0x29, 0xfb, 0xf6, 0x2f, 0x9c, 0x42, 0x7e, 0x76, 0xe9, 0x52, 0x2d, 0x9d, 0x90, 0x3e, 0xaa, 0x7d, - 0x32, 0x45, 0xe9, 0x89, 0x4e, 0xd5, 0x8a, 0xbb, 0xe5, 0x4f, 0xc1, 0x9c, 0x89, 0x65, 0x24, 0xb7, - 0xea, 0x1f, 0x17, 0x00, 0x78, 0x47, 0x8b, 0x1c, 0x1f, 0x1d, 0x9e, 0x4c, 0x76, 0xcf, 0x6f, 0xe6, - 0xf3, 0xd8, 0xa7, 0x99, 0xaa, 0x03, 0x64, 0xe6, 0xd8, 0x3d, 0xbf, 0x89, 0x92, 0x08, 0x69, 0xc1, - 0x64, 0xd7, 0x89, 0xf6, 0xf2, 0xcf, 0x0b, 0x32, 0x23, 0x82, 0x5d, 0xa3, 0x3d, 0xe4, 0x04, 0xc8, - 0x7b, 0x56, 0xec, 0x1a, 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xf5, 0xd9, 0x8a, 0x74, 0x86, 0x11, 0x23, - 0x38, 0xd0, 0x45, 0x66, 0xf9, 0x7d, 0x0b, 0xe6, 0xcc, 0xaa, 0x19, 0xc3, 0xf4, 0x73, 0xe6, 0x30, - 0xe5, 0xd9, 0x1f, 0xe6, 0x88, 0xff, 0x37, 0x0b, 0x8c, 0xd7, 0xdb, 0x63, 0xef, 0x71, 0x6b, 0x68, - 0xef, 0xf1, 0x89, 0x11, 0xbd, 0xc7, 0x0b, 0x23, 0x79, 0x8f, 0x4f, 0x8e, 0xee, 0x3d, 0x5e, 0x1c, - 0xec, 0x3d, 0x6e, 0x7f, 0xd3, 0x82, 0xb3, 0x7d, 0xbb, 0x0d, 0xd3, 0x83, 0x03, 0xdf, 0x8f, 0x06, - 0x78, 0x5d, 0x62, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x87, 0x45, 0xf9, 0x74, 0x42, 0xbd, 0xdb, 0x76, - 0x33, 0x73, 0xb6, 0x6c, 0xa7, 0xe0, 0xd8, 0xd7, 0xc2, 0xfe, 0xae, 0x05, 0xb3, 0x46, 0xa4, 0x37, - 0xfb, 0x0e, 0x1e, 0x11, 0x2f, 0xd9, 0x88, 0x9d, 0xe4, 0xf8, 0x45, 0x95, 0x80, 0x89, 0x3b, 0xd3, - 0x96, 0x91, 0x58, 0x3b, 0xbe, 0x33, 0x65, 0xa5, 0x28, 0xa1, 0x22, 0x65, 0x32, 0xed, 0xf2, 0x4e, - 0x2f, 0x98, 0x29, 0x93, 0x69, 0x17, 0x39, 0x84, 0x93, 0x63, 0x07, 0x02, 0x19, 0x58, 0x60, 0x3c, - 0x52, 0xe1, 0x04, 0x11, 0x0a, 0x18, 0xb9, 0x04, 0x05, 0xea, 0x35, 0xa5, 0xf5, 0x42, 0x3f, 0x23, - 0x79, 0xd5, 0x6b, 0x22, 0x2b, 0xb7, 0xdf, 0x84, 0xb9, 0x3a, 0x6d, 0x04, 0x34, 0x7a, 0x83, 0x1e, - 0x0e, 0xfd, 0x2e, 0x25, 0x9b, 0xed, 0xa9, 0x77, 0x29, 0x59, 0x73, 0x56, 0x6e, 0xff, 0x33, 0x0b, - 0x52, 0x2f, 0xa9, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x71, 0xa2, 0xcd, - 0xfd, 0x06, 0x90, 0x0e, 0x5b, 0x0a, 0x89, 0x77, 0x83, 0xa4, 0xe1, 0x28, 0xce, 0x2b, 0xd1, 0x57, - 0x03, 0x33, 0x5a, 0xd9, 0xff, 0x54, 0x30, 0x6b, 0xbe, 0xad, 0xf2, 0xf0, 0x0e, 0xe8, 0x41, 0x91, - 0xa3, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, 0xfd, 0xf9, 0x99, 0xe2, 0x81, 0x94, 0x4b, 0x9e, 0x53, - 0xb3, 0xff, 0x48, 0xf0, 0x6a, 0x3c, 0xbe, 0x32, 0x04, 0xaf, 0x9d, 0x24, 0xaf, 0xd7, 0xf3, 0x92, - 0x95, 0xd9, 0x3c, 0x92, 0x15, 0x80, 0x2e, 0x0d, 0x1a, 0xd4, 0x8b, 0x54, 0xbc, 0x4b, 0x51, 0x46, - 0x5e, 0xea, 0x52, 0x34, 0x6a, 0xd8, 0xdf, 0x60, 0x0b, 0x28, 0x76, 0x2b, 0x25, 0x57, 0xd2, 0xbe, - 0xa2, 0xe9, 0xc5, 0xa1, 0x5d, 0x45, 0x8d, 0x28, 0x88, 0x89, 0x87, 0x44, 0x41, 0x7c, 0x04, 0xa6, - 0x03, 0xbf, 0x4d, 0x2b, 0x81, 0x97, 0x76, 0x70, 0x41, 0x56, 0x8c, 0x37, 0x51, 0xc1, 0xed, 0x5f, - 0xb3, 0x60, 0x31, 0x1d, 0xa6, 0x95, 0xbb, 0x03, 0xab, 0x19, 0x4b, 0x5e, 0x18, 0x3d, 0x96, 0xdc, - 0x7e, 0x8f, 0x31, 0x19, 0xb9, 0x8d, 0x7d, 0xd7, 0x13, 0xe1, 0xd7, 0xac, 0xe7, 0x3e, 0x02, 0xd3, - 0x54, 0xbe, 0x3c, 0x29, 0x8c, 0xc0, 0x9a, 0x49, 0xf5, 0xe0, 0xa4, 0x82, 0x93, 0x0a, 0x2c, 0xa8, - 0xab, 0x2f, 0x65, 0xb9, 0x17, 0x69, 0x23, 0xb4, 0xa5, 0x70, 0x3d, 0x09, 0xc6, 0x74, 0x7d, 0xfb, - 0x4b, 0x30, 0x6b, 0x6c, 0x4a, 0x5c, 0x7e, 0xdf, 0x77, 0x1a, 0x51, 0x5a, 0xee, 0x5d, 0x65, 0x85, - 0x28, 0x60, 0xfc, 0x82, 0x41, 0x44, 0x91, 0xa4, 0xe4, 0x9e, 0x8c, 0x1d, 0x91, 0x50, 0x86, 0x2c, - 0xa0, 0x2d, 0x7a, 0x5f, 0xe5, 0x3d, 0x57, 0xc8, 0x90, 0x15, 0xa2, 0x80, 0xd9, 0xcf, 0xc3, 0x8c, - 0x4a, 0xee, 0xc3, 0x33, 0x64, 0x28, 0xe3, 0xb7, 0x99, 0x21, 0xc3, 0x0f, 0x22, 0xe4, 0x10, 0xfb, - 0x2d, 0x98, 0x51, 0x39, 0x88, 0x1e, 0x5e, 0x9b, 0x89, 0xa2, 0xd0, 0x73, 0xaf, 0xfb, 0x61, 0xa4, - 0x12, 0x27, 0x89, 0xfb, 0xb9, 0x9b, 0x1b, 0xbc, 0x0c, 0x35, 0xd4, 0x7e, 0x11, 0x16, 0x52, 0xf7, - 0xb4, 0x43, 0xa4, 0xd3, 0xf8, 0xbd, 0x02, 0xcc, 0x99, 0xd7, 0x75, 0x43, 0xac, 0xe2, 0xe1, 0x85, - 0x63, 0xc6, 0x15, 0x5b, 0x61, 0xc4, 0x2b, 0x36, 0xf3, 0x4e, 0x73, 0xf2, 0x74, 0xef, 0x34, 0x8b, - 0xf9, 0xdc, 0x69, 0x1a, 0x77, 0xef, 0x53, 0x8f, 0xef, 0xee, 0xfd, 0x77, 0x8a, 0x30, 0x9f, 0xcc, - 0xcf, 0x38, 0xc4, 0x48, 0x3e, 0xdf, 0x37, 0x92, 0x23, 0xda, 0xf4, 0x0b, 0xe3, 0xda, 0xf4, 0x27, - 0xc7, 0xb5, 0xe9, 0x17, 0x1f, 0xc1, 0xa6, 0xdf, 0x6f, 0x91, 0x9f, 0x1a, 0xda, 0x22, 0xff, 0x69, - 0xed, 0x95, 0x37, 0x9d, 0x70, 0x63, 0x89, 0xbd, 0xf2, 0x48, 0x72, 0x18, 0xd6, 0xfc, 0x66, 0xa6, - 0x77, 0xe3, 0xcc, 0x43, 0x6c, 0x97, 0x41, 0xa6, 0x13, 0xdd, 0xe8, 0xd7, 0x86, 0x1f, 0x1a, 0xc1, - 0x81, 0xee, 0x65, 0x98, 0x95, 0xf3, 0x89, 0xab, 0xa0, 0x90, 0x54, 0x5f, 0xeb, 0x31, 0x08, 0xcd, - 0x7a, 0xfc, 0xe9, 0xee, 0xe4, 0xcb, 0xe6, 0xfc, 0x8a, 0xc4, 0x7c, 0xba, 0x3b, 0xf5, 0x12, 0x7a, - 0xba, 0xbe, 0xfd, 0x45, 0xb8, 0x90, 0x69, 0x46, 0xe0, 0x26, 0x5c, 0xae, 0x1d, 0xd1, 0xa6, 0xac, - 0x60, 0xb0, 0x91, 0x4a, 0xf9, 0xbf, 0x7c, 0x67, 0x60, 0x4d, 0x3c, 0x01, 0x8b, 0xfd, 0x9d, 0x02, - 0xcc, 0x27, 0xdf, 0x7d, 0x24, 0xf7, 0xb4, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x40, 0x6b, 0xe4, 0xfc, - 0x1b, 0x78, 0x59, 0x71, 0x8f, 0xcf, 0xaf, 0x1d, 0x9d, 0x80, 0xf0, 0xf4, 0x08, 0xcb, 0x5b, 0x02, - 0x49, 0x8e, 0x3f, 0xed, 0x18, 0x87, 0x07, 0xca, 0xd3, 0x6c, 0xee, 0xd4, 0xe3, 0x88, 0x3d, 0x4d, - 0x0a, 0x0d, 0xb2, 0x6c, 0x6f, 0x39, 0xa0, 0x81, 0xbb, 0xeb, 0xea, 0x37, 0xab, 0xb9, 0xe4, 0x7e, - 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x4d, 0x40, 0xfc, 0x9e, 0x3f, 0x7f, 0x1c, 0x2d, 0x34, 0x4e, - 0x0e, 0x72, 0xd8, 0x6e, 0x8c, 0xfb, 0x02, 0x61, 0x8c, 0x51, 0x7a, 0x4c, 0x1b, 0x25, 0x98, 0xa0, - 0xf8, 0x13, 0x78, 0xc7, 0xdf, 0x81, 0x85, 0x54, 0x3a, 0x8a, 0xdc, 0x73, 0xb6, 0xfe, 0xa8, 0x00, - 0x25, 0x1d, 0xae, 0x43, 0x3e, 0x99, 0x30, 0xe3, 0x94, 0xaa, 0x1f, 0x36, 0x5e, 0xee, 0xd9, 0xf3, - 0x9b, 0x0f, 0x8e, 0xca, 0x0b, 0xba, 0x72, 0xca, 0x24, 0x73, 0x09, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, - 0xa7, 0xdd, 0xc6, 0x4d, 0x64, 0xe5, 0x66, 0x88, 0x51, 0xe1, 0xb1, 0x86, 0x18, 0xb1, 0x5d, 0x72, - 0xc7, 0x6f, 0x1e, 0xa6, 0x5f, 0xfa, 0xa9, 0xfa, 0xcd, 0x43, 0xe4, 0x10, 0xf2, 0x1a, 0xcc, 0xcb, - 0xb8, 0x29, 0xf3, 0xfd, 0xf3, 0x42, 0x7c, 0xf9, 0xbe, 0x9d, 0x80, 0x62, 0xaa, 0x36, 0xdb, 0x65, - 0xef, 0x86, 0xbe, 0xc7, 0x33, 0xf1, 0x4e, 0x25, 0x6f, 0xea, 0x6e, 0xd4, 0xdf, 0xbc, 0xc9, 0xcd, - 0x49, 0xba, 0x46, 0x22, 0x34, 0x6b, 0xfa, 0xa1, 0xa1, 0x59, 0xeb, 0x02, 0x37, 0xe3, 0x96, 0xef, - 0x28, 0x73, 0xd5, 0x2b, 0x0a, 0x2f, 0x2b, 0x7b, 0x70, 0x74, 0x82, 0xa1, 0x4f, 0xb7, 0xb4, 0x6f, - 0xc3, 0x42, 0xaa, 0xc3, 0xd4, 0xb9, 0xda, 0xca, 0x3e, 0x57, 0x0f, 0xf7, 0x38, 0xcf, 0xbf, 0xb0, - 0xe0, 0x6c, 0x9f, 0x08, 0x18, 0x36, 0x82, 0x30, 0xbd, 0x19, 0x4d, 0x3c, 0xfa, 0x66, 0x54, 0x18, - 0x6d, 0x33, 0xaa, 0xee, 0x7c, 0xef, 0x87, 0x97, 0x9f, 0xf8, 0xfe, 0x0f, 0x2f, 0x3f, 0xf1, 0xc7, - 0x3f, 0xbc, 0xfc, 0xc4, 0x7b, 0xc7, 0x97, 0xad, 0xef, 0x1d, 0x5f, 0xb6, 0xbe, 0x7f, 0x7c, 0xd9, - 0xfa, 0xe3, 0xe3, 0xcb, 0xd6, 0x7f, 0x3a, 0xbe, 0x6c, 0x7d, 0xf3, 0x47, 0x97, 0x9f, 0xf8, 0xec, - 0xa7, 0xe3, 0x09, 0xba, 0xaa, 0x26, 0x28, 0xff, 0xf1, 0x31, 0x35, 0x1d, 0x57, 0xbb, 0xfb, 0xad, - 0x55, 0x36, 0x41, 0x57, 0x75, 0x89, 0x9a, 0xa0, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0xdc, 0xf0, - 0x4e, 0x06, 0x76, 0x9f, 0x00, 0x00, + // 8334 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, + 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, + 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0xde, 0x5d, 0x72, 0xd2, 0x29, 0x97, 0xcc, 0x90, + 0xbb, 0xb7, 0xdc, 0x23, 0x77, 0xb9, 0x35, 0xdc, 0x5b, 0x59, 0xd2, 0xd9, 0x6a, 0xce, 0x3c, 0x0e, + 0x7b, 0x39, 0xd3, 0x3d, 0xee, 0xee, 0xe1, 0x2e, 0x4f, 0x07, 0xeb, 0x64, 0xe1, 0x14, 0xc5, 0x90, + 0x60, 0x25, 0xb6, 0x10, 0x04, 0x09, 0x02, 0xc5, 0x30, 0x60, 0x27, 0xf6, 0x2f, 0x21, 0x41, 0xfe, + 0x18, 0x88, 0x10, 0xc7, 0xb6, 0x7e, 0xc4, 0x81, 0xfc, 0x23, 0x91, 0x1d, 0xc0, 0x74, 0x44, 0xe7, + 0x4f, 0x82, 0x04, 0x42, 0x02, 0x05, 0x81, 0xf7, 0x47, 0x10, 0xbc, 0xcf, 0x7e, 0xdd, 0xd3, 0xc3, + 0x9d, 0xe1, 0x34, 0x57, 0x4a, 0xac, 0x7f, 0x33, 0xaf, 0xea, 0x55, 0x55, 0xbf, 0xcf, 0x7a, 0xf5, + 0xaa, 0xea, 0xc1, 0x7a, 0xd3, 0x8d, 0x76, 0xbb, 0xdb, 0x4b, 0x75, 0xbf, 0xbd, 0xec, 0x04, 0x4d, + 0xbf, 0x13, 0xf8, 0xf7, 0xf9, 0x8f, 0x8f, 0x04, 0x7e, 0xab, 0xe5, 0x77, 0xa3, 0x70, 0xb9, 0xb3, + 0xd7, 0x5c, 0x76, 0x3a, 0x6e, 0xb8, 0xac, 0x4b, 0xf6, 0x3f, 0xe6, 0xb4, 0x3a, 0xbb, 0xce, 0xc7, + 0x96, 0x9b, 0xd4, 0xa3, 0x81, 0x13, 0xd1, 0xc6, 0x52, 0x27, 0xf0, 0x23, 0x9f, 0x7c, 0x32, 0xa6, + 0xb6, 0xa4, 0xa8, 0xf1, 0x1f, 0x3f, 0xa7, 0xea, 0x2e, 0x75, 0xf6, 0x9a, 0x4b, 0x8c, 0xda, 0x92, + 0x2e, 0x51, 0xd4, 0x16, 0x3f, 0x62, 0xc8, 0xd2, 0xf4, 0x9b, 0xfe, 0x32, 0x27, 0xba, 0xdd, 0xdd, + 0xe1, 0xff, 0xf8, 0x1f, 0xfe, 0x4b, 0x30, 0x5b, 0x7c, 0x7e, 0xef, 0xd5, 0x70, 0xc9, 0xf5, 0x99, + 0x6c, 0xcb, 0xdb, 0x4e, 0x54, 0xdf, 0x5d, 0xde, 0xef, 0x91, 0x68, 0xd1, 0x36, 0x90, 0xea, 0x7e, + 0x40, 0xb3, 0x70, 0x5e, 0x8e, 0x71, 0xda, 0x4e, 0x7d, 0xd7, 0xf5, 0x68, 0x70, 0x10, 0x7f, 0x75, + 0x9b, 0x46, 0x4e, 0x56, 0xad, 0xe5, 0x7e, 0xb5, 0x82, 0xae, 0x17, 0xb9, 0x6d, 0xda, 0x53, 0xe1, + 0xaf, 0x3d, 0xae, 0x42, 0x58, 0xdf, 0xa5, 0x6d, 0xa7, 0xa7, 0xde, 0x4b, 0xfd, 0xea, 0x75, 0x23, + 0xb7, 0xb5, 0xec, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x4a, 0xf6, 0x0f, 0x0a, 0x50, 0xaa, 0xac, 0x57, + 0x6b, 0x91, 0x13, 0x75, 0x43, 0xf2, 0x65, 0x0b, 0x66, 0x5a, 0xbe, 0xd3, 0xa8, 0x3a, 0x2d, 0xc7, + 0xab, 0xd3, 0x60, 0xc1, 0x7a, 0xce, 0xba, 0x32, 0x7d, 0x75, 0x7d, 0x69, 0x94, 0xfe, 0x5a, 0xaa, + 0x3c, 0x08, 0x91, 0x86, 0x7e, 0x37, 0xa8, 0x53, 0xa4, 0x3b, 0xd5, 0xf3, 0xdf, 0x39, 0x2c, 0x3f, + 0x75, 0x74, 0x58, 0x9e, 0x59, 0x37, 0x38, 0x61, 0x82, 0x2f, 0xf9, 0x86, 0x05, 0x67, 0xeb, 0x8e, + 0xe7, 0x04, 0x07, 0x5b, 0x4e, 0xd0, 0xa4, 0xd1, 0x1b, 0x81, 0xdf, 0xed, 0x2c, 0x8c, 0x9d, 0x82, + 0x34, 0x4f, 0x4b, 0x69, 0xce, 0xae, 0xa4, 0xd9, 0x61, 0xaf, 0x04, 0x5c, 0xae, 0x30, 0x72, 0xb6, + 0x5b, 0xd4, 0x94, 0xab, 0x70, 0x9a, 0x72, 0xd5, 0xd2, 0xec, 0xb0, 0x57, 0x02, 0xf2, 0x21, 0x98, + 0x74, 0xbd, 0x66, 0x40, 0xc3, 0x70, 0x61, 0xfc, 0x39, 0xeb, 0x4a, 0xa9, 0x3a, 0x27, 0xab, 0x4f, + 0xae, 0x89, 0x62, 0x54, 0x70, 0xfb, 0x5b, 0x05, 0x38, 0x5b, 0x59, 0xaf, 0x6e, 0x05, 0xce, 0xce, + 0x8e, 0x5b, 0x47, 0xbf, 0x1b, 0xb9, 0x5e, 0xd3, 0x24, 0x60, 0x1d, 0x4f, 0x80, 0xbc, 0x02, 0xd3, + 0x21, 0x0d, 0xf6, 0xdd, 0x3a, 0xdd, 0xf4, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x7a, 0x4e, 0xa2, 0x4f, + 0xd7, 0x62, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, 0x91, 0x84, 0xf3, 0x36, 0x2b, 0xc5, 0xd5, + 0x30, 0x06, 0xa1, 0x89, 0x47, 0x56, 0x61, 0xde, 0xf1, 0x3c, 0x3f, 0x72, 0x22, 0xd7, 0xf7, 0x36, + 0x03, 0xba, 0xe3, 0x3e, 0x94, 0x9f, 0xb8, 0x20, 0xeb, 0xce, 0x57, 0x52, 0x70, 0xec, 0xa9, 0x41, + 0xbe, 0x6e, 0xc1, 0x7c, 0x18, 0xb9, 0xf5, 0x3d, 0xd7, 0xa3, 0x61, 0xb8, 0xe2, 0x7b, 0x3b, 0x6e, + 0x73, 0xa1, 0xc8, 0xbb, 0xed, 0xd6, 0x68, 0xdd, 0x56, 0x4b, 0x51, 0xad, 0x9e, 0x67, 0x22, 0xa5, + 0x4b, 0xb1, 0x87, 0x3b, 0xf9, 0x30, 0x94, 0x64, 0x8b, 0xd2, 0x70, 0x61, 0xe2, 0xb9, 0xc2, 0x95, + 0x52, 0xf5, 0xcc, 0xd1, 0x61, 0xb9, 0xb4, 0xa6, 0x0a, 0x31, 0x86, 0xdb, 0xab, 0xb0, 0x50, 0x69, + 0x6f, 0x3b, 0x61, 0xe8, 0x34, 0xfc, 0x20, 0xd5, 0x75, 0x57, 0x60, 0xaa, 0xed, 0x74, 0x3a, 0xae, + 0xd7, 0x64, 0x7d, 0xc7, 0xe8, 0xcc, 0x1c, 0x1d, 0x96, 0xa7, 0x36, 0x64, 0x19, 0x6a, 0xa8, 0xfd, + 0x27, 0x63, 0x30, 0x5d, 0xf1, 0x9c, 0xd6, 0x41, 0xe8, 0x86, 0xd8, 0xf5, 0xc8, 0xe7, 0x60, 0x8a, + 0xad, 0x5a, 0x0d, 0x27, 0x72, 0xe4, 0x4c, 0xff, 0xe8, 0x92, 0x58, 0x44, 0x96, 0xcc, 0x45, 0x24, + 0xfe, 0x7c, 0x86, 0xbd, 0xb4, 0xff, 0xb1, 0xa5, 0xdb, 0xdb, 0xf7, 0x69, 0x3d, 0xda, 0xa0, 0x91, + 0x53, 0x25, 0xb2, 0x17, 0x20, 0x2e, 0x43, 0x4d, 0x95, 0xf8, 0x30, 0x1e, 0x76, 0x68, 0x5d, 0xce, + 0xdc, 0x8d, 0x11, 0x67, 0x48, 0x2c, 0x7a, 0xad, 0x43, 0xeb, 0xd5, 0x19, 0xc9, 0x7a, 0x9c, 0xfd, + 0x43, 0xce, 0x88, 0x3c, 0x80, 0x89, 0x90, 0xaf, 0x65, 0x72, 0x52, 0xde, 0xce, 0x8f, 0x25, 0x27, + 0x5b, 0x9d, 0x95, 0x4c, 0x27, 0xc4, 0x7f, 0x94, 0xec, 0xec, 0xff, 0x68, 0xc1, 0x39, 0x03, 0xbb, + 0x12, 0x34, 0xbb, 0x6d, 0xea, 0x45, 0xe4, 0x39, 0x18, 0xf7, 0x9c, 0x36, 0x95, 0xb3, 0x4a, 0x8b, + 0x7c, 0xcb, 0x69, 0x53, 0xe4, 0x10, 0xf2, 0x3c, 0x14, 0xf7, 0x9d, 0x56, 0x97, 0xf2, 0x46, 0x2a, + 0x55, 0xcf, 0x48, 0x94, 0xe2, 0x5b, 0xac, 0x10, 0x05, 0x8c, 0xbc, 0x0b, 0x25, 0xfe, 0xe3, 0x7a, + 0xe0, 0xb7, 0x73, 0xfa, 0x34, 0x29, 0xe1, 0x5b, 0x8a, 0xac, 0x18, 0x7e, 0xfa, 0x2f, 0xc6, 0x0c, + 0xed, 0x3f, 0xb3, 0x60, 0xce, 0xf8, 0xb8, 0x75, 0x37, 0x8c, 0xc8, 0x67, 0x7b, 0x06, 0xcf, 0xd2, + 0x60, 0x83, 0x87, 0xd5, 0xe6, 0x43, 0x67, 0x5e, 0x7e, 0xe9, 0x94, 0x2a, 0x31, 0x06, 0x8e, 0x07, + 0x45, 0x37, 0xa2, 0xed, 0x70, 0x61, 0xec, 0xb9, 0xc2, 0x95, 0xe9, 0xab, 0x6b, 0xb9, 0x75, 0x63, + 0xdc, 0xbe, 0x6b, 0x8c, 0x3e, 0x0a, 0x36, 0xf6, 0x3f, 0x2f, 0x24, 0xba, 0x6f, 0x43, 0xc9, 0xf1, + 0xbe, 0x05, 0x13, 0x2d, 0x67, 0x9b, 0xb6, 0xc4, 0xdc, 0x9a, 0xbe, 0xfa, 0x76, 0x6e, 0x92, 0x28, + 0x1e, 0x4b, 0xeb, 0x9c, 0xfe, 0x35, 0x2f, 0x0a, 0x0e, 0xe2, 0xe1, 0x25, 0x0a, 0x51, 0x32, 0x27, + 0xff, 0xc0, 0x82, 0xe9, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x9d, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, + 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0xc5, 0x8f, 0xc3, 0xb4, 0xf1, 0x09, 0x64, 0x1e, 0x0a, + 0x7b, 0xf4, 0x40, 0x0c, 0x78, 0x64, 0x3f, 0xc9, 0xf9, 0xc4, 0x08, 0x97, 0x43, 0xfa, 0x13, 0x63, + 0xaf, 0x5a, 0x8b, 0xaf, 0xc3, 0x7c, 0x9a, 0xe1, 0x30, 0xf5, 0xed, 0x6f, 0x8d, 0x27, 0x06, 0x26, + 0x5b, 0x08, 0x88, 0x0f, 0x93, 0x6d, 0x1a, 0x05, 0x6e, 0x5d, 0x75, 0xd9, 0xea, 0x68, 0xad, 0xb4, + 0xc1, 0x89, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xe2, 0x42, 0x76, 0x61, 0xdc, 0x09, 0x9a, 0xaa, + 0x4f, 0xae, 0xe7, 0x33, 0x2d, 0xe3, 0xa5, 0xa2, 0x12, 0x34, 0x43, 0xe4, 0x1c, 0xc8, 0x32, 0x94, + 0x22, 0x1a, 0xb4, 0x5d, 0xcf, 0x89, 0xc4, 0x0e, 0x3a, 0x55, 0x3d, 0x2b, 0xd1, 0x4a, 0x5b, 0x0a, + 0x80, 0x31, 0x0e, 0x69, 0xc1, 0x44, 0x23, 0x38, 0xc0, 0xae, 0xb7, 0x30, 0x9e, 0x47, 0x53, 0xac, + 0x72, 0x5a, 0xf1, 0x20, 0x15, 0xff, 0x51, 0xf2, 0x20, 0xbf, 0x6e, 0xc1, 0xf9, 0x36, 0x75, 0xc2, + 0x6e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x3a, 0x76, 0xa1, 0xc8, 0x99, 0xe3, 0xa8, 0xfd, + 0xd0, 0x4b, 0xb9, 0xfa, 0xac, 0x14, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xa5, 0xb1, 0xff, 0x64, 0x1c, + 0xce, 0xf6, 0x2c, 0xec, 0xe4, 0x65, 0x28, 0x76, 0x76, 0x9d, 0x50, 0xad, 0xd4, 0x97, 0xd5, 0x32, + 0xb1, 0xc9, 0x0a, 0x1f, 0x1d, 0x96, 0xcf, 0xa8, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0xd3, 0x9b, 0xda, + 0x34, 0x0c, 0x9d, 0xa6, 0x5a, 0xbe, 0x8d, 0x61, 0xc2, 0x8b, 0x51, 0xc1, 0xc9, 0xdf, 0xb6, 0xe0, + 0x8c, 0x18, 0x32, 0x48, 0xc3, 0x6e, 0x2b, 0x62, 0x5b, 0x14, 0x6b, 0x96, 0x9b, 0x79, 0x0c, 0x4f, + 0x41, 0xb2, 0x7a, 0x41, 0x72, 0x3f, 0x63, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x41, 0x29, 0x8c, + 0x9c, 0x20, 0xa2, 0x8d, 0x4a, 0xc4, 0x95, 0xa9, 0xe9, 0xab, 0x3f, 0x3d, 0xd8, 0xda, 0xbd, 0xe5, + 0xb6, 0xa9, 0xd8, 0x27, 0x6a, 0x8a, 0x00, 0xc6, 0xb4, 0xc8, 0xbb, 0x00, 0x41, 0xd7, 0xab, 0x75, + 0xdb, 0x6d, 0x27, 0x38, 0x90, 0xfa, 0xd5, 0x8d, 0xd1, 0x3e, 0x0f, 0x35, 0xbd, 0x58, 0xd5, 0x88, + 0xcb, 0xd0, 0xe0, 0x47, 0xbe, 0x68, 0xc1, 0x19, 0x31, 0x12, 0x95, 0x04, 0x13, 0x39, 0x4b, 0x70, + 0x96, 0x35, 0xed, 0xaa, 0xc9, 0x02, 0x93, 0x1c, 0xed, 0x7f, 0x9f, 0x54, 0x03, 0x6a, 0x11, 0x3b, + 0x6c, 0x35, 0x0f, 0xc8, 0x67, 0xe0, 0xe9, 0xb0, 0x5b, 0xaf, 0xd3, 0x30, 0xdc, 0xe9, 0xb6, 0xb0, + 0xeb, 0xdd, 0x70, 0xc3, 0xc8, 0x0f, 0x0e, 0xd6, 0xdd, 0xb6, 0x1b, 0xf1, 0x11, 0x57, 0xac, 0x5e, + 0x3a, 0x3a, 0x2c, 0x3f, 0x5d, 0xeb, 0x87, 0x84, 0xfd, 0xeb, 0x13, 0x07, 0x9e, 0xe9, 0x7a, 0xfd, + 0xc9, 0x0b, 0x0d, 0xbd, 0x7c, 0x74, 0x58, 0x7e, 0xe6, 0x6e, 0x7f, 0x34, 0x3c, 0x8e, 0x86, 0xfd, + 0x5f, 0x2d, 0xb6, 0x52, 0x8b, 0xef, 0xda, 0xa2, 0xed, 0x4e, 0x8b, 0xad, 0x2e, 0xa7, 0xaf, 0x3f, + 0x46, 0x09, 0xfd, 0x11, 0xf3, 0xd9, 0xee, 0x94, 0xfc, 0xfd, 0x94, 0x48, 0xfb, 0xbf, 0x58, 0x70, + 0x3e, 0x8d, 0xfc, 0x04, 0x74, 0x9e, 0x30, 0xa9, 0xf3, 0xdc, 0xca, 0xf7, 0x6b, 0xfb, 0x28, 0x3e, + 0x5f, 0x1e, 0xef, 0xfd, 0xd6, 0xff, 0xdf, 0xb7, 0xd1, 0x78, 0x57, 0x2c, 0xfc, 0x28, 0x77, 0xc5, + 0xf1, 0x1f, 0xab, 0x5d, 0xf1, 0x37, 0xc7, 0x61, 0xa6, 0xe2, 0x45, 0x6e, 0x65, 0x67, 0xc7, 0xf5, + 0xdc, 0xe8, 0x80, 0x7c, 0x75, 0x0c, 0x96, 0x3b, 0x01, 0xdd, 0xa1, 0x41, 0x40, 0x1b, 0xab, 0xdd, + 0xc0, 0xf5, 0x9a, 0xb5, 0xfa, 0x2e, 0x6d, 0x74, 0x5b, 0xae, 0xd7, 0x5c, 0x6b, 0x7a, 0xbe, 0x2e, + 0xbe, 0xf6, 0x90, 0xd6, 0xbb, 0xfc, 0x93, 0xc4, 0xa4, 0x68, 0x8f, 0xf6, 0x49, 0x9b, 0xc3, 0x31, + 0xad, 0xbe, 0x74, 0x74, 0x58, 0x5e, 0x1e, 0xb2, 0x12, 0x0e, 0xfb, 0x69, 0xe4, 0x2b, 0x63, 0xb0, + 0x14, 0xd0, 0x9f, 0xef, 0xba, 0x83, 0xb7, 0x86, 0x58, 0xb5, 0x5a, 0x23, 0x6e, 0x3f, 0x43, 0xf1, + 0xac, 0x5e, 0x3d, 0x3a, 0x2c, 0x0f, 0x59, 0x07, 0x87, 0xfc, 0x2e, 0x7b, 0x13, 0xa6, 0x2b, 0x1d, + 0x37, 0x74, 0x1f, 0xa2, 0xdf, 0x8d, 0xe8, 0x00, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x6e, 0x8b, 0x8a, + 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x8b, 0x6c, 0xc5, 0xe5, + 0x24, 0x53, 0xc6, 0x8d, 0xfb, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0x46, 0x3d, 0x07, 0xc6, 0x52, + 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x1d, 0x83, 0x0b, 0x95, 0x4e, 0x67, 0x83, 0x86, + 0xbb, 0x29, 0x29, 0x7e, 0xd9, 0x82, 0xd9, 0x7d, 0x37, 0x88, 0xba, 0x4e, 0x4b, 0xd9, 0xaf, 0x84, + 0x3c, 0xb5, 0x51, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x92, 0xa3, 0xc3, 0xf2, 0x6c, 0xb2, + 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb7, 0x60, 0x5e, 0x16, 0xdd, 0xf2, 0x1b, 0xd4, 0xb4, 0x8f, 0xde, + 0xcd, 0x53, 0x26, 0x4d, 0x5c, 0xd8, 0xb5, 0xd2, 0xa5, 0xd8, 0x23, 0x84, 0xfd, 0xdf, 0xc7, 0xe0, + 0x62, 0x1f, 0x1a, 0xe4, 0x37, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0x8e, 0x6c, 0xcd, + 0x9f, 0xc9, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x75, 0x5a, 0x5d, 0x60, 0xab, 0xe1, 0x4a, 0x06, + 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0xcc, 0xac, 0x29, 0x49, 0xc7, 0x9e, 0x88, 0xa4, 0xb5, 0x0c, + 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x37, 0xe1, 0x99, 0x63, 0xc8, 0x3d, 0x7e, 0x72, 0xda, 0x6f, 0xeb, + 0x51, 0x9f, 0x1c, 0x73, 0x03, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, 0x1b, 0xd8, 0xf6, + 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0xae, 0x05, 0x53, 0x43, 0x58, 0xc3, 0xca, 0x49, 0x6b, + 0x58, 0xa9, 0xc7, 0x12, 0x16, 0xf5, 0x5a, 0xc2, 0xde, 0x18, 0xad, 0x37, 0x06, 0xb1, 0x80, 0xfd, + 0xc0, 0x82, 0xb3, 0x3d, 0x16, 0x33, 0xb2, 0x0b, 0xe7, 0x3b, 0x7e, 0x43, 0xa9, 0x4d, 0x37, 0x9c, + 0x70, 0x97, 0xc3, 0xe4, 0xe7, 0xbd, 0xcc, 0x7a, 0x72, 0x33, 0x03, 0xfe, 0xe8, 0xb0, 0xbc, 0xa0, + 0x89, 0xa4, 0x10, 0x30, 0x93, 0x22, 0xe9, 0xc0, 0xd4, 0x8e, 0x4b, 0x5b, 0x8d, 0x78, 0x08, 0x8e, + 0xa8, 0x20, 0x5d, 0x97, 0xd4, 0x84, 0xb1, 0x58, 0xfd, 0x43, 0xcd, 0xc5, 0xfe, 0xa1, 0x05, 0xb3, + 0x95, 0x6e, 0xb4, 0xcb, 0xd4, 0x83, 0x3a, 0xb7, 0xcf, 0x10, 0x0f, 0x8a, 0xa1, 0xdb, 0xdc, 0x7f, + 0x39, 0x9f, 0xc5, 0xb8, 0xc6, 0x48, 0x49, 0xa3, 0xb9, 0xd6, 0x4d, 0x79, 0x21, 0x0a, 0x36, 0x24, + 0x80, 0x09, 0xdf, 0xe9, 0x46, 0xbb, 0x57, 0xe5, 0x27, 0x8f, 0x78, 0x52, 0xbe, 0xcd, 0x3e, 0xe7, + 0xaa, 0xe4, 0xa8, 0xb5, 0x35, 0x51, 0x8a, 0x92, 0x93, 0xfd, 0x05, 0x98, 0x4d, 0xde, 0xc4, 0x0c, + 0x30, 0x66, 0x2f, 0x41, 0xc1, 0x09, 0x3c, 0x39, 0x62, 0xa7, 0x25, 0x42, 0xa1, 0x82, 0xb7, 0x90, + 0x95, 0x93, 0x17, 0x61, 0x6a, 0xa7, 0xdb, 0x6a, 0xb1, 0x0a, 0xf2, 0xda, 0x43, 0x9f, 0x02, 0xae, + 0xcb, 0x72, 0xd4, 0x18, 0xf6, 0x5f, 0x8c, 0xc3, 0x5c, 0xb5, 0xd5, 0xa5, 0x6f, 0x04, 0x94, 0x2a, + 0xdb, 0x44, 0x05, 0xe6, 0x3a, 0x01, 0xdd, 0x77, 0xe9, 0x83, 0x1a, 0x6d, 0xd1, 0x7a, 0xe4, 0x07, + 0x52, 0x9a, 0x8b, 0x92, 0xd0, 0xdc, 0x66, 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0x3a, 0xcc, 0x3a, 0xf5, + 0xc8, 0xdd, 0xa7, 0x9a, 0x82, 0x10, 0xf7, 0x03, 0x92, 0xc2, 0x6c, 0x25, 0x01, 0xc5, 0x14, 0x36, + 0xf9, 0x2c, 0x2c, 0x84, 0x75, 0xa7, 0x45, 0xef, 0x76, 0x24, 0xab, 0x95, 0x5d, 0x5a, 0xdf, 0xdb, + 0xf4, 0x5d, 0x2f, 0x92, 0x96, 0xa8, 0xe7, 0x24, 0xa5, 0x85, 0x5a, 0x1f, 0x3c, 0xec, 0x4b, 0x81, + 0xfc, 0x2b, 0x0b, 0x2e, 0x75, 0x02, 0xba, 0x19, 0xf8, 0x6d, 0x9f, 0x0d, 0xb5, 0x1e, 0xf3, 0x8c, + 0x34, 0x53, 0xbc, 0x35, 0xa2, 0x2e, 0x25, 0x4a, 0x7a, 0xad, 0xfa, 0x1f, 0x3c, 0x3a, 0x2c, 0x5f, + 0xda, 0x3c, 0x4e, 0x00, 0x3c, 0x5e, 0x3e, 0xf2, 0xaf, 0x2d, 0xb8, 0xdc, 0xf1, 0xc3, 0xe8, 0x98, + 0x4f, 0x28, 0x9e, 0xea, 0x27, 0xd8, 0x47, 0x87, 0xe5, 0xcb, 0x9b, 0xc7, 0x4a, 0x80, 0x8f, 0x91, + 0xd0, 0x3e, 0x9a, 0x86, 0xb3, 0xc6, 0xd8, 0x93, 0xb6, 0x8b, 0xd7, 0xe0, 0x8c, 0x1a, 0x0c, 0xb1, + 0xee, 0x53, 0x8a, 0x6d, 0x4d, 0x15, 0x13, 0x88, 0x49, 0x5c, 0x36, 0xee, 0xf4, 0x50, 0x14, 0xb5, + 0x53, 0xe3, 0x6e, 0x33, 0x01, 0xc5, 0x14, 0x36, 0x59, 0x83, 0x73, 0xb2, 0x04, 0x69, 0xa7, 0xe5, + 0xd6, 0x9d, 0x15, 0xbf, 0x2b, 0x87, 0x5c, 0xb1, 0x7a, 0xf1, 0xe8, 0xb0, 0x7c, 0x6e, 0xb3, 0x17, + 0x8c, 0x59, 0x75, 0xc8, 0x3a, 0x9c, 0x77, 0xba, 0x91, 0xaf, 0xbf, 0xff, 0x9a, 0xc7, 0xb6, 0xd3, + 0x06, 0x1f, 0x5a, 0x53, 0x62, 0xdf, 0xad, 0x64, 0xc0, 0x31, 0xb3, 0x16, 0xd9, 0x4c, 0x51, 0xab, + 0xd1, 0xba, 0xef, 0x35, 0x44, 0x2f, 0x17, 0xe3, 0x13, 0x58, 0x25, 0x03, 0x07, 0x33, 0x6b, 0x92, + 0x16, 0xcc, 0xb6, 0x9d, 0x87, 0x77, 0x3d, 0x67, 0xdf, 0x71, 0x5b, 0x8c, 0x89, 0xb4, 0x5f, 0xf5, + 0x37, 0xaa, 0x74, 0x23, 0xb7, 0xb5, 0x24, 0x6e, 0xf6, 0x97, 0xd6, 0xbc, 0xe8, 0x76, 0x50, 0x8b, + 0x98, 0xa6, 0x2e, 0x34, 0xc8, 0x8d, 0x04, 0x2d, 0x4c, 0xd1, 0x26, 0xb7, 0xe1, 0x02, 0x9f, 0x8e, + 0xab, 0xfe, 0x03, 0x6f, 0x95, 0xb6, 0x9c, 0x03, 0xf5, 0x01, 0x93, 0xfc, 0x03, 0x9e, 0x3e, 0x3a, + 0x2c, 0x5f, 0xa8, 0x65, 0x21, 0x60, 0x76, 0x3d, 0xe2, 0xc0, 0x33, 0x49, 0x00, 0xd2, 0x7d, 0x37, + 0x74, 0x7d, 0x4f, 0x58, 0xa1, 0xa6, 0x62, 0x2b, 0x54, 0xad, 0x3f, 0x1a, 0x1e, 0x47, 0x83, 0xfc, + 0x43, 0x0b, 0xce, 0x67, 0x4d, 0xc3, 0x85, 0x52, 0x1e, 0xf7, 0x8b, 0xa9, 0xa9, 0x25, 0x46, 0x44, + 0xe6, 0xa2, 0x90, 0x29, 0x04, 0x79, 0xcf, 0x82, 0x19, 0xc7, 0x38, 0x41, 0x2f, 0x40, 0x1e, 0xbb, + 0x96, 0x79, 0x26, 0xaf, 0xce, 0x1f, 0x1d, 0x96, 0x13, 0xa7, 0x74, 0x4c, 0x70, 0x24, 0xff, 0xd8, + 0x82, 0x0b, 0x99, 0x73, 0x7c, 0x61, 0xfa, 0x34, 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, + 0x0c, 0xf2, 0x75, 0x4b, 0x6f, 0x65, 0xea, 0xca, 0x69, 0x61, 0x86, 0x8b, 0x76, 0x67, 0x44, 0xa3, + 0x41, 0xac, 0x35, 0x29, 0xc2, 0xd5, 0x73, 0xc6, 0xce, 0xa8, 0x0a, 0x31, 0xcd, 0x9e, 0x7c, 0xcd, + 0x52, 0x5b, 0xa3, 0x96, 0xe8, 0xcc, 0x69, 0x49, 0x44, 0xe2, 0x9d, 0x56, 0x0b, 0x94, 0x62, 0x4e, + 0x7e, 0x16, 0x16, 0x9d, 0x6d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xc2, 0x2c, 0x9f, 0x46, 0x97, 0x8f, + 0x0e, 0xcb, 0x8b, 0x95, 0xbe, 0x58, 0x78, 0x0c, 0x05, 0xfb, 0xb7, 0x8b, 0x30, 0x23, 0x4e, 0x42, + 0x72, 0xeb, 0xfa, 0x1d, 0x0b, 0x9e, 0xad, 0x77, 0x83, 0x80, 0x7a, 0x51, 0x2d, 0xa2, 0x9d, 0xde, + 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0xb9, 0xa3, 0xc3, 0xf2, 0xb3, 0x2b, 0xc7, 0xf0, 0xc7, 0x63, + 0xa5, 0x23, 0xff, 0xce, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xfa, 0x5e, 0x33, 0xf0, 0xbb, 0x5e, 0xa3, + 0xf7, 0x23, 0xc6, 0x4e, 0xf5, 0x23, 0x5e, 0x38, 0x3a, 0x2c, 0xdb, 0x2b, 0x8f, 0x95, 0x02, 0x07, + 0x90, 0x94, 0xbc, 0x01, 0x67, 0x25, 0xd6, 0xb5, 0x87, 0x1d, 0x1a, 0xb8, 0xec, 0xcc, 0x21, 0x15, + 0xc7, 0xd8, 0x5b, 0x29, 0x8d, 0x80, 0xbd, 0x75, 0x48, 0x08, 0x93, 0x0f, 0xa8, 0xdb, 0xdc, 0x8d, + 0x94, 0xfa, 0x34, 0xa2, 0x8b, 0x92, 0xb4, 0x8a, 0xdc, 0x13, 0x34, 0xab, 0xd3, 0x47, 0x87, 0xe5, + 0x49, 0xf9, 0x07, 0x15, 0x27, 0x72, 0x0b, 0x66, 0xc5, 0x39, 0x75, 0xd3, 0xf5, 0x9a, 0x9b, 0xbe, + 0x27, 0xfc, 0x6c, 0x4a, 0xd5, 0x17, 0xd4, 0x86, 0x5f, 0x4b, 0x40, 0x1f, 0x1d, 0x96, 0x67, 0xd4, + 0xef, 0xad, 0x83, 0x0e, 0xc5, 0x54, 0x6d, 0xfb, 0xf7, 0x27, 0x00, 0xd4, 0x70, 0xa5, 0x1d, 0xf2, + 0x61, 0x28, 0x85, 0x34, 0x12, 0x5c, 0xe5, 0xc5, 0x89, 0xb8, 0x8f, 0x52, 0x85, 0x18, 0xc3, 0xc9, + 0x1e, 0x14, 0x3b, 0x4e, 0x37, 0xa4, 0xf9, 0x9c, 0x1f, 0x64, 0xe7, 0x6f, 0x32, 0x8a, 0xe2, 0x60, + 0xca, 0x7f, 0xa2, 0xe0, 0x41, 0xbe, 0x64, 0x01, 0xd0, 0x64, 0x87, 0x8d, 0x6c, 0x20, 0x92, 0x2c, + 0xe3, 0x3e, 0x65, 0x6d, 0x50, 0x9d, 0x3d, 0x3a, 0x2c, 0x83, 0xd1, 0xf5, 0x06, 0x5b, 0xf2, 0x00, + 0xa6, 0x1c, 0xb5, 0xe6, 0x8f, 0x9f, 0xc6, 0x9a, 0xcf, 0xcf, 0x8b, 0x7a, 0xd0, 0x6a, 0x66, 0xe4, + 0x2b, 0x16, 0xcc, 0x86, 0x34, 0x92, 0x5d, 0xc5, 0x56, 0x1e, 0xa9, 0xf0, 0x8e, 0x38, 0xe8, 0x6a, + 0x09, 0x9a, 0x62, 0x05, 0x4d, 0x96, 0x61, 0x8a, 0xaf, 0x12, 0xe5, 0x06, 0x75, 0x1a, 0x34, 0xe0, + 0xe6, 0x08, 0xa9, 0x49, 0x8d, 0x2e, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, 0x8a, 0xaf, 0x12, + 0x65, 0xc3, 0x0d, 0x02, 0x5f, 0x8a, 0x32, 0x95, 0x93, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, 0x86, + 0x29, 0xbe, 0xf6, 0x37, 0xcf, 0xc0, 0xac, 0x9a, 0x48, 0xb1, 0x66, 0x2f, 0xac, 0x5f, 0x7d, 0x34, + 0xfb, 0x15, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0x4c, 0xd5, 0xa4, 0x62, 0xaf, 0x2b, 0xd7, 0x4c, + 0x20, 0x26, 0x71, 0x49, 0x1b, 0x8a, 0x61, 0x44, 0x3b, 0xea, 0x0e, 0x7c, 0xc4, 0x2b, 0xda, 0x78, + 0x7d, 0x30, 0x2c, 0x09, 0x8c, 0x3c, 0x0a, 0x2e, 0xdc, 0x80, 0x1b, 0x25, 0x6c, 0xba, 0x72, 0x72, + 0xe4, 0x33, 0x3f, 0x93, 0xe6, 0x62, 0xd1, 0x1b, 0xc9, 0x32, 0x4c, 0xb1, 0xcf, 0x50, 0xf6, 0x8b, + 0xa7, 0xa8, 0xec, 0x7f, 0x1a, 0xa6, 0xda, 0xce, 0xc3, 0x5a, 0x37, 0x68, 0x9e, 0xfc, 0x50, 0x21, + 0xbd, 0x0a, 0x05, 0x15, 0xd4, 0xf4, 0xc8, 0x17, 0x2d, 0x63, 0xc9, 0x99, 0xe4, 0xc4, 0xef, 0xe5, + 0xbb, 0xe4, 0xe8, 0xbd, 0xb2, 0xef, 0xe2, 0xd3, 0xa3, 0x7a, 0x4f, 0x3d, 0x71, 0xd5, 0x9b, 0xa9, + 0x91, 0x62, 0x82, 0x68, 0x35, 0xb2, 0x74, 0xaa, 0x6a, 0xe4, 0x4a, 0x82, 0x19, 0xa6, 0x98, 0x73, + 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xa9, 0xca, 0x53, 0x4b, 0x30, 0xc3, 0x14, 0xf3, 0xfe, 0xe7, + 0xcd, 0xe9, 0xd3, 0x39, 0x6f, 0xce, 0xe4, 0x70, 0xde, 0x3c, 0x5e, 0x15, 0x3f, 0x33, 0xaa, 0x2a, + 0x4e, 0x6e, 0x02, 0x69, 0x1c, 0x78, 0x4e, 0xdb, 0xad, 0xcb, 0xc5, 0x92, 0x6f, 0x9b, 0xb3, 0xdc, + 0x1e, 0xb1, 0x28, 0x17, 0x32, 0xb2, 0xda, 0x83, 0x81, 0x19, 0xb5, 0x48, 0x04, 0x53, 0x1d, 0xa5, + 0x71, 0xcd, 0xe5, 0x31, 0xfa, 0x95, 0x06, 0x26, 0xdc, 0x24, 0xd8, 0xc4, 0x53, 0x25, 0xa8, 0x39, + 0x91, 0x75, 0x38, 0xdf, 0x76, 0xbd, 0x4d, 0xbf, 0x11, 0x6e, 0xd2, 0x40, 0x5a, 0x5b, 0x6a, 0x34, + 0x5a, 0x98, 0xe7, 0x6d, 0xc3, 0x4f, 0xd0, 0x1b, 0x19, 0x70, 0xcc, 0xac, 0x65, 0xff, 0x2f, 0x0b, + 0xe6, 0x57, 0x5a, 0x7e, 0xb7, 0x71, 0xcf, 0x89, 0xea, 0xbb, 0xc2, 0x43, 0x80, 0xbc, 0x0e, 0x53, + 0xae, 0x17, 0xd1, 0x60, 0xdf, 0x69, 0xc9, 0xfd, 0xc9, 0x56, 0xe6, 0xd3, 0x35, 0x59, 0xfe, 0xe8, + 0xb0, 0x3c, 0xbb, 0xda, 0x0d, 0xb8, 0x95, 0x5a, 0xac, 0x56, 0xa8, 0xeb, 0x90, 0x6f, 0x5a, 0x70, + 0x56, 0xf8, 0x18, 0xac, 0x3a, 0x91, 0x73, 0xa7, 0x4b, 0x03, 0x97, 0x2a, 0x2f, 0x83, 0x11, 0x17, + 0xaa, 0xb4, 0xac, 0x8a, 0xc1, 0x41, 0xac, 0xa8, 0x6f, 0xa4, 0x39, 0x63, 0xaf, 0x30, 0xf6, 0xaf, + 0x14, 0xe0, 0xe9, 0xbe, 0xb4, 0xc8, 0x22, 0x8c, 0xb9, 0x0d, 0xf9, 0xe9, 0x20, 0xe9, 0x8e, 0xad, + 0x35, 0x70, 0xcc, 0x6d, 0x90, 0x25, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0x85, 0x73, 0x49, 0xab, + 0x87, 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x86, 0x22, 0xf7, 0x28, 0x95, 0xe7, 0x09, 0xae, 0xc5, 0x72, + 0xe7, 0x4d, 0x14, 0xe5, 0xe4, 0x17, 0x2d, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, 0x5d, 0x12, 0xf3, + 0x6d, 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x82, 0x09, 0xa6, 0xd0, 0xfa, + 0x8d, 0x13, 0x6f, 0x8a, 0xfc, 0x26, 0x6a, 0x93, 0xd3, 0x40, 0x49, 0x8b, 0xb5, 0x55, 0x40, 0xa3, + 0x6e, 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x94, 0x90, 0x02, 0x75, 0x29, 0x1a, 0x18, 0xf6, 0xbf, + 0x1c, 0x83, 0xf3, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x42, 0x48, 0x2b, 0x8f, 0xc6, 0x9f, 0xca, 0xbf, + 0x7d, 0xa4, 0xbb, 0x8c, 0xbe, 0xa6, 0x90, 0x0e, 0x7d, 0x92, 0x2f, 0xf9, 0x94, 0x6e, 0xa1, 0xb1, + 0x13, 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0xe7, 0x60, 0x3c, 0x64, 0x3d, 0x5f, 0x48, 0x5e, 0x77, + 0xf0, 0x3e, 0xe2, 0x10, 0x86, 0xd1, 0xf5, 0xdc, 0x48, 0x86, 0x61, 0x68, 0x8c, 0xbb, 0x9e, 0x1b, + 0x21, 0x87, 0xd8, 0xdf, 0x18, 0x83, 0xc5, 0xfe, 0x1f, 0x45, 0xbe, 0x61, 0x01, 0x34, 0xd8, 0x71, + 0x25, 0xe4, 0xbe, 0xcc, 0xc2, 0xbd, 0xc8, 0x39, 0xad, 0x36, 0x5c, 0x55, 0x9c, 0x62, 0x5f, 0x33, + 0x5d, 0x14, 0xa2, 0x21, 0x08, 0xb9, 0xaa, 0x86, 0x3e, 0xbf, 0xaa, 0x11, 0x93, 0x49, 0xd7, 0xd9, + 0xd0, 0x10, 0x34, 0xb0, 0xd8, 0x79, 0xd4, 0x73, 0xda, 0x34, 0xec, 0x38, 0x3a, 0xa8, 0x85, 0x9f, + 0x47, 0x6f, 0xa9, 0x42, 0x8c, 0xe1, 0x76, 0x0b, 0x9e, 0x1f, 0x40, 0xce, 0x9c, 0x62, 0x06, 0xec, + 0xff, 0x61, 0xc1, 0xc5, 0x95, 0x56, 0x37, 0x8c, 0x68, 0xf0, 0x97, 0xc6, 0x75, 0xef, 0x7f, 0x5b, + 0xf0, 0x4c, 0x9f, 0x6f, 0x7e, 0x02, 0x1e, 0x7c, 0xef, 0x24, 0x3d, 0xf8, 0xee, 0x8e, 0x3a, 0xa4, + 0x33, 0xbf, 0xa3, 0x8f, 0x23, 0xdf, 0x6f, 0x5a, 0x70, 0x86, 0x2d, 0x5b, 0x0d, 0xbf, 0x99, 0xd3, + 0xc6, 0xf9, 0x3c, 0x14, 0x7f, 0x9e, 0x6d, 0x40, 0xe9, 0x41, 0xc6, 0x77, 0x25, 0x14, 0x30, 0x36, + 0x67, 0x9c, 0x8e, 0xfb, 0x16, 0x0d, 0xf8, 0x06, 0x54, 0x48, 0xce, 0x99, 0x8a, 0x86, 0xa0, 0x81, + 0x65, 0x7f, 0x12, 0xa4, 0x8f, 0x5c, 0x6a, 0xc6, 0x59, 0x83, 0xcc, 0x38, 0xfb, 0x3f, 0x8c, 0x81, + 0x61, 0xfc, 0x78, 0x02, 0x23, 0xd9, 0x4b, 0x8c, 0xe4, 0x11, 0x0f, 0xee, 0x86, 0x29, 0xa7, 0x5f, + 0x0c, 0xd3, 0x7e, 0x2a, 0x86, 0xe9, 0x56, 0x6e, 0x1c, 0x8f, 0x0f, 0x61, 0xfa, 0x9e, 0x05, 0xcf, + 0xc4, 0xc8, 0xbd, 0x76, 0xc9, 0xc7, 0x2f, 0x4b, 0xaf, 0xc0, 0xb4, 0x13, 0x57, 0x93, 0xe3, 0xc6, + 0x08, 0x20, 0xd1, 0x20, 0x34, 0xf1, 0x62, 0xd7, 0xfb, 0xc2, 0x09, 0x5d, 0xef, 0xc7, 0x8f, 0x77, + 0xbd, 0xb7, 0x7f, 0x38, 0x06, 0x97, 0x7a, 0xbf, 0x4c, 0x4d, 0xa8, 0xc1, 0x2e, 0xf9, 0x5f, 0x85, + 0x99, 0x48, 0x56, 0x30, 0xb6, 0x07, 0x1d, 0xcc, 0xba, 0x65, 0xc0, 0x30, 0x81, 0xc9, 0x6a, 0xd6, + 0xc5, 0x54, 0xae, 0xd5, 0xfd, 0x8e, 0x0a, 0xdc, 0xd0, 0x35, 0x57, 0x0c, 0x18, 0x26, 0x30, 0xb5, + 0x4b, 0xec, 0xf8, 0xa9, 0xbb, 0xc4, 0xd6, 0xe0, 0x82, 0x72, 0x02, 0xbc, 0xee, 0x07, 0x2b, 0x7e, + 0xbb, 0xd3, 0xa2, 0x32, 0x74, 0x83, 0x09, 0x7b, 0x49, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, 0x5d, + 0xd7, 0xfe, 0x5e, 0x01, 0xce, 0xc5, 0xcd, 0xbe, 0xe2, 0x7b, 0x0d, 0x97, 0xfb, 0x91, 0xbc, 0x06, + 0xe3, 0xd1, 0x41, 0x47, 0x35, 0xf6, 0x5f, 0x55, 0xe2, 0x6c, 0x1d, 0x74, 0x58, 0x6f, 0x5f, 0xcc, + 0xa8, 0xc2, 0x2d, 0xc3, 0xbc, 0x12, 0x59, 0xd7, 0xb3, 0x43, 0xf4, 0xc0, 0xcb, 0xc9, 0xd1, 0xfc, + 0xe8, 0xb0, 0x9c, 0x11, 0xcb, 0xbd, 0xa4, 0x29, 0x25, 0xc7, 0x3c, 0xb9, 0x0f, 0xb3, 0x2d, 0x27, + 0x8c, 0xee, 0x76, 0x1a, 0x4e, 0x44, 0xb7, 0x5c, 0xe9, 0xa1, 0x31, 0x5c, 0x3c, 0x84, 0xbe, 0xca, + 0x5e, 0x4f, 0x50, 0xc2, 0x14, 0x65, 0xb2, 0x0f, 0x84, 0x95, 0x6c, 0x05, 0x8e, 0x17, 0x8a, 0xaf, + 0x62, 0xfc, 0x86, 0x8f, 0xbf, 0xd0, 0x27, 0xc3, 0xf5, 0x1e, 0x6a, 0x98, 0xc1, 0x81, 0xbc, 0x00, + 0x13, 0x01, 0x75, 0x42, 0xd9, 0x99, 0xa5, 0x78, 0xfe, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x27, 0xd4, + 0xc4, 0x63, 0x26, 0xd4, 0x9f, 0x5a, 0x30, 0x1b, 0x77, 0xd3, 0x13, 0xd8, 0x59, 0xdb, 0xc9, 0x9d, + 0xf5, 0x46, 0x5e, 0x4b, 0x62, 0x9f, 0xcd, 0xf4, 0x0f, 0x26, 0xcc, 0xef, 0xe3, 0xfe, 0xf0, 0x9f, + 0x87, 0x92, 0x9a, 0xd5, 0x4a, 0x65, 0x1d, 0xf1, 0x80, 0x9d, 0x50, 0x66, 0x8c, 0x38, 0x2e, 0xc9, + 0x04, 0x63, 0x7e, 0x6c, 0x2b, 0x6f, 0xc8, 0x6d, 0x5a, 0x0e, 0x7b, 0xbd, 0x95, 0xab, 0xed, 0x3b, + 0x6b, 0x2b, 0x57, 0x75, 0xc8, 0x5d, 0xb8, 0xd8, 0x09, 0x7c, 0x1e, 0x4d, 0xbc, 0x4a, 0x9d, 0x46, + 0xcb, 0xf5, 0xa8, 0xb2, 0x62, 0x08, 0x4f, 0x8a, 0x67, 0x8e, 0x0e, 0xcb, 0x17, 0x37, 0xb3, 0x51, + 0xb0, 0x5f, 0xdd, 0x64, 0x3c, 0xda, 0xf8, 0x00, 0xf1, 0x68, 0x7f, 0x47, 0xdb, 0x0a, 0x69, 0x28, + 0xa3, 0xc2, 0x3e, 0x93, 0x57, 0x57, 0x66, 0x2c, 0xeb, 0xf1, 0x90, 0xaa, 0x48, 0xa6, 0xa8, 0xd9, + 0xf7, 0x37, 0x48, 0x4d, 0x9c, 0xd0, 0x20, 0x15, 0x87, 0x15, 0x4c, 0xfe, 0x28, 0xc3, 0x0a, 0xa6, + 0x7e, 0xac, 0xc2, 0x0a, 0xde, 0x2f, 0xc2, 0x7c, 0x5a, 0x03, 0x39, 0xfd, 0x58, 0xbb, 0xbf, 0x67, + 0xc1, 0xbc, 0x9a, 0x3d, 0x82, 0x27, 0x55, 0x57, 0x0d, 0xeb, 0x39, 0x4d, 0x5a, 0xa1, 0x4b, 0xe9, + 0x24, 0x04, 0x5b, 0x29, 0x6e, 0xd8, 0xc3, 0x9f, 0xbc, 0x0d, 0xd3, 0xda, 0x22, 0x7f, 0xa2, 0xc0, + 0xbb, 0x39, 0xae, 0x45, 0xc5, 0x24, 0xd0, 0xa4, 0x47, 0xde, 0xb7, 0x00, 0xea, 0x6a, 0x9b, 0x53, + 0xb3, 0xeb, 0x4e, 0x5e, 0xb3, 0x4b, 0x6f, 0xa0, 0xb1, 0xb2, 0xac, 0x8b, 0x42, 0x34, 0x18, 0x93, + 0x5f, 0xe1, 0xb6, 0x78, 0xad, 0xdd, 0x89, 0xe4, 0x06, 0x23, 0xbb, 0x4c, 0x1f, 0xa3, 0x98, 0xc6, + 0xaa, 0x94, 0x01, 0x0a, 0x31, 0x21, 0x84, 0xfd, 0x1a, 0x68, 0x27, 0x57, 0xb6, 0x6c, 0x71, 0x37, + 0xd7, 0x4d, 0x27, 0xda, 0x95, 0x43, 0x50, 0x2f, 0x5b, 0xd7, 0x15, 0x00, 0x63, 0x1c, 0xfb, 0x73, + 0x30, 0xfb, 0x46, 0xe0, 0x74, 0x76, 0x5d, 0x6e, 0xf3, 0x66, 0x67, 0xab, 0x0f, 0xc1, 0xa4, 0xd3, + 0x68, 0x64, 0xe5, 0xcb, 0xa8, 0x88, 0x62, 0x54, 0xf0, 0x81, 0x8e, 0x51, 0xf6, 0xef, 0x5b, 0x40, + 0xe2, 0x7b, 0x43, 0xd7, 0x6b, 0x6e, 0x38, 0x51, 0x7d, 0x97, 0x9d, 0x8f, 0x76, 0x79, 0x69, 0xd6, + 0xf9, 0xe8, 0x86, 0x86, 0xa0, 0x81, 0x45, 0xde, 0x85, 0x69, 0xf1, 0xef, 0x2d, 0x6d, 0x21, 0x18, + 0xdd, 0x57, 0x97, 0x6f, 0x28, 0x5c, 0x26, 0x31, 0x0a, 0x6f, 0xc4, 0x1c, 0xd0, 0x64, 0xc7, 0x9a, + 0x6a, 0xcd, 0xdb, 0x69, 0x75, 0x1f, 0x36, 0xb6, 0xe3, 0xa6, 0xea, 0x04, 0xfe, 0x8e, 0xdb, 0xa2, + 0xe9, 0xa6, 0xda, 0x14, 0xc5, 0xa8, 0xe0, 0x83, 0x35, 0xd5, 0xbf, 0xb1, 0xe0, 0xfc, 0x5a, 0x18, + 0xb9, 0xfe, 0x2a, 0x0d, 0x23, 0xb6, 0xad, 0xb0, 0xc5, 0xa7, 0xdb, 0x1a, 0xc4, 0x5f, 0x7d, 0x15, + 0xe6, 0xe5, 0x1d, 0x66, 0x77, 0x3b, 0xa4, 0x91, 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x92, 0x82, 0x63, + 0x4f, 0x0d, 0x46, 0x45, 0x5e, 0x66, 0xc6, 0x54, 0x0a, 0x49, 0x2a, 0xb5, 0x14, 0x1c, 0x7b, 0x6a, + 0xd8, 0xdf, 0x2d, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0x58, 0x93, 0xaf, 0xf5, 0x8b, 0x35, 0x19, 0x71, + 0x2a, 0x73, 0x5e, 0x27, 0x88, 0x34, 0xf9, 0xbb, 0x16, 0xcc, 0x35, 0x92, 0x2d, 0x9d, 0x8f, 0x4d, + 0x27, 0xab, 0x0f, 0x85, 0xcb, 0x56, 0xaa, 0x10, 0xd3, 0xfc, 0xc9, 0xaf, 0x5a, 0x30, 0x97, 0x14, + 0x53, 0xad, 0xee, 0xa7, 0xd0, 0x48, 0xda, 0xc7, 0x3a, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x0f, + 0xc7, 0x64, 0x97, 0x9e, 0x46, 0x20, 0x05, 0x79, 0x00, 0xa5, 0xa8, 0x15, 0x8a, 0x42, 0xf9, 0xb5, + 0x23, 0x9e, 0x08, 0xb7, 0xd6, 0x6b, 0xc2, 0x7d, 0x20, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, + 0x2f, 0xce, 0xb8, 0xde, 0x91, 0x8c, 0x73, 0x39, 0x8a, 0x6e, 0xad, 0x6c, 0xa6, 0x19, 0xcb, 0x12, + 0xc6, 0x58, 0xf1, 0xb2, 0x7f, 0xcb, 0x82, 0xd2, 0x4d, 0x5f, 0xad, 0x23, 0x3f, 0x9b, 0x83, 0xa1, + 0x47, 0xeb, 0x83, 0xfa, 0x9a, 0x32, 0x3e, 0x62, 0xbc, 0x9e, 0x30, 0xf3, 0x3c, 0x6b, 0xd0, 0x5e, + 0xe2, 0x69, 0xc3, 0x18, 0xa9, 0x9b, 0xfe, 0x76, 0x5f, 0xd3, 0xe3, 0xaf, 0x15, 0xe1, 0xcc, 0x9b, + 0xce, 0x01, 0xf5, 0x22, 0x67, 0xf8, 0x4d, 0xe2, 0x15, 0x98, 0x76, 0x3a, 0xfc, 0x1e, 0xcc, 0xd0, + 0xf1, 0x63, 0xcb, 0x49, 0x0c, 0x42, 0x13, 0x2f, 0x5e, 0xd0, 0x44, 0x54, 0x43, 0xd6, 0x52, 0xb4, + 0x92, 0x82, 0x63, 0x4f, 0x0d, 0x72, 0x13, 0x88, 0x0c, 0xc2, 0xad, 0xd4, 0xeb, 0x7e, 0xd7, 0x13, + 0x4b, 0x9a, 0x30, 0xaa, 0xe8, 0xc3, 0xe6, 0x46, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x9f, 0x85, 0x85, + 0x3a, 0xa7, 0x2c, 0x8f, 0x1e, 0x26, 0x45, 0x71, 0xfc, 0xd4, 0x71, 0x02, 0x2b, 0x7d, 0xf0, 0xb0, + 0x2f, 0x05, 0x26, 0x69, 0x18, 0xf9, 0x81, 0xd3, 0xa4, 0x26, 0xdd, 0x89, 0xa4, 0xa4, 0xb5, 0x1e, + 0x0c, 0xcc, 0xa8, 0x45, 0xbe, 0x00, 0xa5, 0x68, 0x37, 0xa0, 0xe1, 0xae, 0xdf, 0x6a, 0x48, 0xbf, + 0x85, 0x11, 0x2d, 0x6d, 0xb2, 0xf7, 0xb7, 0x14, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, 0x79, 0x92, + 0x00, 0x26, 0xc2, 0xba, 0xdf, 0xa1, 0xa1, 0x54, 0xd9, 0x6f, 0xe6, 0xc2, 0x9d, 0x5b, 0x8e, 0x0c, + 0x1b, 0x1f, 0xe7, 0x80, 0x92, 0x93, 0xfd, 0x7b, 0x63, 0x30, 0x63, 0x22, 0x0e, 0xb0, 0x36, 0x7d, + 0xc9, 0x82, 0x99, 0xba, 0xef, 0x45, 0x81, 0xdf, 0x12, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, + 0x95, 0x46, 0x8e, 0xdb, 0x32, 0x4c, 0x61, 0x06, 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb5, 0x60, 0x2e, + 0x76, 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, 0x97, 0xfa, 0x6b, 0x49, 0x4e, 0x98, 0x66, 0x6d, + 0x6f, 0xc3, 0x7c, 0xba, 0xb7, 0x59, 0x53, 0x76, 0x1c, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0x6e, 0x3a, + 0x61, 0x88, 0x1c, 0x42, 0x5e, 0x84, 0xa9, 0xb6, 0x13, 0x34, 0x5d, 0xcf, 0x69, 0xf1, 0x56, 0x2c, + 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, 0x14, 0x66, 0x36, 0x1c, 0xaf, 0x49, 0x1b, 0x72, + 0x1d, 0x7e, 0x7c, 0x28, 0xdf, 0x9f, 0x8f, 0xc3, 0xb4, 0x71, 0x36, 0x3b, 0xfd, 0x73, 0x56, 0x22, + 0x93, 0x48, 0x21, 0xc7, 0x4c, 0x22, 0x9f, 0x06, 0xd8, 0x71, 0x3d, 0x37, 0xdc, 0x3d, 0x61, 0x8e, + 0x12, 0x7e, 0xaf, 0x7b, 0x5d, 0x53, 0x40, 0x83, 0x5a, 0x7c, 0x79, 0x56, 0x3c, 0x26, 0xe1, 0xd6, + 0xfb, 0x96, 0xb1, 0xdd, 0x4c, 0xe4, 0xe1, 0x2c, 0x60, 0x74, 0xcc, 0x92, 0xda, 0x7e, 0x44, 0x8a, + 0xa5, 0xe3, 0x76, 0xa5, 0x2d, 0x98, 0x0a, 0x68, 0xd8, 0x6d, 0xb3, 0x13, 0xe3, 0xe4, 0xd0, 0xcd, + 0xc0, 0xdd, 0x36, 0x50, 0xd6, 0x47, 0x4d, 0x69, 0xf1, 0x35, 0x38, 0x93, 0x10, 0x61, 0xa8, 0xa4, + 0x4b, 0x3e, 0x64, 0x1a, 0x00, 0x4e, 0x72, 0x99, 0xc3, 0xfa, 0xa2, 0x65, 0x24, 0x29, 0xd1, 0x7d, + 0x21, 0x9c, 0x73, 0x04, 0xcc, 0xfe, 0xe1, 0x04, 0xc8, 0xfb, 0xef, 0x01, 0x96, 0x2b, 0xf3, 0xd6, + 0x6b, 0xec, 0x04, 0xb7, 0x5e, 0x37, 0x61, 0xc6, 0xf5, 0xdc, 0xc8, 0x75, 0x5a, 0xdc, 0xb8, 0x23, + 0xb7, 0x53, 0xe5, 0xbd, 0x3c, 0xb3, 0x66, 0xc0, 0x32, 0xe8, 0x24, 0xea, 0x92, 0x3b, 0x50, 0xe4, + 0xfb, 0x8d, 0x1c, 0xc0, 0xc3, 0x5f, 0xd2, 0x73, 0xff, 0x0c, 0x11, 0xd2, 0x24, 0x28, 0xf1, 0xc3, + 0x87, 0xc8, 0xd2, 0xa2, 0x8f, 0xdf, 0x72, 0x1c, 0xc7, 0x87, 0x8f, 0x14, 0x1c, 0x7b, 0x6a, 0x30, + 0x2a, 0x3b, 0x8e, 0xdb, 0xea, 0x06, 0x34, 0xa6, 0x32, 0x91, 0xa4, 0x72, 0x3d, 0x05, 0xc7, 0x9e, + 0x1a, 0x64, 0x07, 0x66, 0x64, 0x99, 0x70, 0xb9, 0x9a, 0x3c, 0xe1, 0x57, 0x72, 0xd7, 0xba, 0xeb, + 0x06, 0x25, 0x4c, 0xd0, 0x25, 0x5d, 0x38, 0xeb, 0x7a, 0x75, 0xdf, 0xab, 0xb7, 0xba, 0xa1, 0xbb, + 0x4f, 0xe3, 0x78, 0xa2, 0x93, 0x30, 0xbb, 0x70, 0x74, 0x58, 0x3e, 0xbb, 0x96, 0x26, 0x87, 0xbd, + 0x1c, 0xc8, 0x17, 0x2d, 0xb8, 0x50, 0xf7, 0xbd, 0x90, 0xa7, 0x3d, 0xd8, 0xa7, 0xd7, 0x82, 0xc0, + 0x0f, 0x04, 0xef, 0xd2, 0x09, 0x79, 0x73, 0x9b, 0xe2, 0x4a, 0x16, 0x49, 0xcc, 0xe6, 0x44, 0xde, + 0x81, 0xa9, 0x4e, 0xe0, 0xef, 0xbb, 0x0d, 0x1a, 0x48, 0xf7, 0xbd, 0xf5, 0x3c, 0xd2, 0xb0, 0x6c, + 0x4a, 0x9a, 0xf1, 0xd2, 0xa3, 0x4a, 0x50, 0xf3, 0xb3, 0xff, 0xcf, 0x34, 0xcc, 0x26, 0xd1, 0xc9, + 0x2f, 0x00, 0x74, 0x02, 0xbf, 0x4d, 0xa3, 0x5d, 0xaa, 0xe3, 0x42, 0x6e, 0x8d, 0x9a, 0xed, 0x43, + 0xd1, 0x53, 0x2e, 0x2f, 0x6c, 0xb9, 0x88, 0x4b, 0xd1, 0xe0, 0x48, 0x02, 0x98, 0xdc, 0x13, 0xdb, + 0xae, 0xd4, 0x42, 0xde, 0xcc, 0x45, 0x67, 0x92, 0x9c, 0x79, 0x40, 0x83, 0x2c, 0x42, 0xc5, 0x88, + 0x6c, 0x43, 0xe1, 0x01, 0xdd, 0xce, 0x27, 0xd4, 0xfc, 0x1e, 0x95, 0xa7, 0x99, 0xea, 0xe4, 0xd1, + 0x61, 0xb9, 0x70, 0x8f, 0x6e, 0x23, 0x23, 0xce, 0xbe, 0xab, 0x21, 0xee, 0xee, 0xe5, 0x52, 0x31, + 0xe2, 0x77, 0x25, 0x1c, 0x01, 0xc4, 0x77, 0xc9, 0x22, 0x54, 0x8c, 0xc8, 0x3b, 0x50, 0x7a, 0xe0, + 0xec, 0xd3, 0x9d, 0xc0, 0xf7, 0x22, 0xe9, 0x67, 0x35, 0x62, 0xa8, 0xc0, 0x3d, 0x45, 0x4e, 0xf2, + 0xe5, 0xdb, 0xbb, 0x2e, 0xc4, 0x98, 0x1d, 0xd9, 0x87, 0x29, 0x8f, 0x3e, 0x40, 0xda, 0x72, 0xeb, + 0xf9, 0xb8, 0xe6, 0xdf, 0x92, 0xd4, 0x24, 0x67, 0xbe, 0xef, 0xa9, 0x32, 0xd4, 0xbc, 0x58, 0x5f, + 0xde, 0xf7, 0xb7, 0xe5, 0x42, 0x35, 0x62, 0x5f, 0xea, 0x93, 0xa9, 0xe8, 0xcb, 0x9b, 0xfe, 0x36, + 0x32, 0xe2, 0x6c, 0x8e, 0xd4, 0xb5, 0x93, 0x8f, 0x5c, 0xa6, 0x6e, 0xe5, 0xeb, 0xdc, 0x24, 0xe6, + 0x48, 0x5c, 0x8a, 0x06, 0x47, 0xd6, 0xb6, 0x4d, 0x69, 0xac, 0x94, 0x0b, 0xd5, 0x88, 0x6d, 0x9b, + 0x34, 0x7d, 0x8a, 0xb6, 0x55, 0x65, 0xa8, 0x79, 0x31, 0xbe, 0xae, 0xb4, 0xfc, 0xe5, 0xb3, 0x54, + 0x25, 0xed, 0x88, 0x82, 0xaf, 0x2a, 0x43, 0xcd, 0x8b, 0xb5, 0x77, 0xb8, 0x77, 0xf0, 0xc0, 0x69, + 0xed, 0xb9, 0x5e, 0x53, 0xc6, 0x39, 0x8e, 0x9a, 0xd4, 0x77, 0xef, 0xe0, 0x9e, 0xa0, 0x67, 0xb6, + 0x77, 0x5c, 0x8a, 0x06, 0x47, 0xf2, 0x8f, 0x2c, 0x98, 0xe8, 0xb4, 0xba, 0x4d, 0xd7, 0x5b, 0x98, + 0xe1, 0x7a, 0xe2, 0xa7, 0xf2, 0x5c, 0xa1, 0x97, 0x36, 0x39, 0x69, 0xa1, 0x28, 0xfe, 0xb4, 0xf6, + 0xd9, 0xe3, 0x85, 0xbf, 0xf4, 0x67, 0xe5, 0x05, 0xea, 0xd5, 0xfd, 0x86, 0xeb, 0x35, 0x97, 0xef, + 0x87, 0xbe, 0xb7, 0x84, 0xce, 0x03, 0xa5, 0xa3, 0x4b, 0x99, 0x16, 0x3f, 0x0e, 0xd3, 0x06, 0x89, + 0xc7, 0x29, 0x7a, 0x33, 0xa6, 0xa2, 0xf7, 0x5b, 0x13, 0x30, 0x63, 0x26, 0x12, 0x1c, 0x40, 0xfb, + 0xd2, 0x27, 0x8e, 0xb1, 0x61, 0x4e, 0x1c, 0xec, 0x88, 0x69, 0xdc, 0x1e, 0x29, 0xf3, 0xd6, 0x5a, + 0x6e, 0x0a, 0x77, 0x7c, 0xc4, 0x34, 0x0a, 0x43, 0x4c, 0x30, 0x1d, 0xc2, 0xa1, 0x84, 0xa9, 0xad, + 0x42, 0xb1, 0x2b, 0x26, 0xd5, 0xd6, 0x84, 0xaa, 0x76, 0x15, 0x20, 0x4e, 0xa8, 0x27, 0x6f, 0x15, + 0xb5, 0x3e, 0x6c, 0x24, 0xfa, 0x33, 0xb0, 0xc8, 0x0b, 0x30, 0xc1, 0x54, 0x1f, 0xda, 0x90, 0x61, + 0xd8, 0xfa, 0x1c, 0x7f, 0x9d, 0x97, 0xa2, 0x84, 0x92, 0x57, 0x99, 0x96, 0x1a, 0x2b, 0x2c, 0x32, + 0xba, 0xfa, 0x7c, 0xac, 0xa5, 0xc6, 0x30, 0x4c, 0x60, 0x32, 0xd1, 0x29, 0xd3, 0x2f, 0xf8, 0xda, + 0x60, 0x88, 0xce, 0x95, 0x0e, 0x14, 0x30, 0x6e, 0x57, 0x4a, 0xe9, 0x23, 0x7c, 0x4e, 0x17, 0x0d, + 0xbb, 0x52, 0x0a, 0x8e, 0x3d, 0x35, 0xd8, 0xc7, 0xc8, 0x0b, 0xd1, 0x69, 0xe1, 0x6c, 0xdb, 0xe7, + 0x2a, 0xf3, 0xcb, 0xe6, 0x59, 0x2b, 0xc7, 0x39, 0x24, 0x46, 0xed, 0xe0, 0x87, 0xad, 0xd1, 0x8e, + 0x45, 0x9f, 0x83, 0xd9, 0xe4, 0x2e, 0x94, 0xfb, 0xcd, 0xc7, 0x57, 0xc6, 0xe1, 0xdc, 0xad, 0xa6, + 0xeb, 0xa5, 0x93, 0x64, 0x65, 0xe5, 0x48, 0xb7, 0x86, 0xce, 0x91, 0xae, 0xe3, 0xb9, 0x64, 0x06, + 0xf2, 0xec, 0x78, 0x2e, 0x95, 0x0e, 0x3e, 0x89, 0x4b, 0xfe, 0xd4, 0x82, 0x67, 0x9d, 0x86, 0x38, + 0x17, 0x38, 0x2d, 0x59, 0x6a, 0xa4, 0xf6, 0x95, 0x33, 0x3a, 0x1c, 0x71, 0x97, 0xef, 0xfd, 0xf8, + 0xa5, 0xca, 0x31, 0x5c, 0x45, 0x8f, 0xff, 0x94, 0xfc, 0x82, 0x67, 0x8f, 0x43, 0xc5, 0x63, 0xc5, + 0x27, 0x7f, 0x03, 0xe6, 0x12, 0x1f, 0x2c, 0x2d, 0xe1, 0x25, 0x71, 0x61, 0x51, 0x4b, 0x82, 0x30, + 0x8d, 0xbb, 0x78, 0x1b, 0x3e, 0xf8, 0x58, 0x39, 0x87, 0x1a, 0x6c, 0xdf, 0xb1, 0x60, 0xc6, 0xcc, + 0x67, 0x43, 0x5e, 0x84, 0xa9, 0xc8, 0xdf, 0xa3, 0xde, 0xdd, 0x40, 0x39, 0x7b, 0xea, 0x81, 0xbe, + 0xc5, 0xcb, 0x71, 0x1d, 0x35, 0x06, 0xc3, 0xae, 0xb7, 0x5c, 0xea, 0x45, 0x6b, 0x0d, 0xd9, 0xcd, + 0x1a, 0x7b, 0x45, 0x94, 0xaf, 0xa2, 0xc6, 0x10, 0x0e, 0x6c, 0xec, 0x77, 0x8d, 0xd6, 0x03, 0xaa, + 0x5c, 0xc3, 0x0d, 0x07, 0xb6, 0x18, 0x86, 0x09, 0x4c, 0x62, 0x6b, 0x13, 0xe7, 0x78, 0x7c, 0xaf, + 0x91, 0x32, 0x49, 0x7e, 0xc9, 0x82, 0x92, 0x30, 0xd1, 0x23, 0xdd, 0x49, 0xf9, 0x93, 0xa6, 0x8c, + 0x08, 0x95, 0xcd, 0xb5, 0x0c, 0x7f, 0x52, 0xb6, 0x2d, 0xed, 0xb9, 0x9e, 0xfa, 0x12, 0xbd, 0x2d, + 0xbd, 0xe9, 0x7a, 0x0d, 0xe4, 0x10, 0xbd, 0x71, 0x15, 0xfa, 0x9a, 0xce, 0x7e, 0xdd, 0x82, 0x59, + 0x1e, 0xce, 0x1b, 0x1f, 0x6f, 0x5f, 0xd1, 0x7e, 0x53, 0x42, 0x8c, 0x4b, 0x49, 0xbf, 0xa9, 0x47, + 0x87, 0xe5, 0x69, 0x11, 0x00, 0x9c, 0x74, 0xa3, 0xfa, 0x8c, 0xb4, 0x89, 0x71, 0xef, 0xae, 0xb1, + 0xa1, 0x4d, 0x36, 0xda, 0x66, 0x5c, 0x53, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x0b, 0x33, 0x66, 0x5c, + 0x0e, 0x79, 0x05, 0xa6, 0x3b, 0xae, 0xd7, 0x4c, 0xc6, 0x6f, 0xea, 0x7b, 0x83, 0xcd, 0x18, 0x84, + 0x26, 0x1e, 0xaf, 0xe6, 0xc7, 0xd5, 0x52, 0xd7, 0x0d, 0x9b, 0xbe, 0x59, 0x2d, 0xfe, 0xc3, 0xb3, + 0xa4, 0x67, 0xc4, 0x7f, 0xe5, 0x9e, 0x25, 0x3d, 0x83, 0xc7, 0x8f, 0x2e, 0x4b, 0x7a, 0x96, 0x30, + 0xff, 0x6f, 0x65, 0x49, 0xff, 0x19, 0x18, 0x36, 0x3d, 0x26, 0xdb, 0xba, 0x1f, 0x98, 0x31, 0xf6, + 0xba, 0xc5, 0x65, 0x90, 0xbd, 0x84, 0xda, 0xdf, 0x2e, 0xc0, 0x7c, 0xfa, 0x04, 0x9f, 0xb7, 0x73, + 0x04, 0xf9, 0xaa, 0x05, 0xb3, 0x4e, 0x22, 0x15, 0x59, 0x4e, 0x4f, 0xae, 0x24, 0x68, 0x1a, 0xa9, + 0xb0, 0x12, 0xe5, 0x98, 0xe2, 0x4d, 0xfe, 0x0a, 0x4c, 0x46, 0x6e, 0x9b, 0xfa, 0x5d, 0x61, 0xd7, + 0x2b, 0x88, 0xf3, 0xf5, 0x96, 0x28, 0x42, 0x05, 0x63, 0x6b, 0xac, 0xcb, 0x15, 0xa2, 0x80, 0x4a, + 0x2f, 0xda, 0xf9, 0xd8, 0x10, 0x29, 0xca, 0x51, 0x63, 0x90, 0x87, 0x30, 0x29, 0xdc, 0x28, 0x94, + 0xbf, 0xcc, 0x46, 0x4e, 0x96, 0x06, 0xe1, 0xa9, 0x11, 0x77, 0x81, 0xf8, 0x1f, 0xa2, 0x62, 0x67, + 0x7f, 0x14, 0x86, 0xcc, 0x17, 0x6a, 0x5f, 0x03, 0x82, 0x7e, 0xab, 0xb5, 0xed, 0xd4, 0xf7, 0xee, + 0xb9, 0x5e, 0xc3, 0x7f, 0xc0, 0x97, 0xa2, 0x65, 0x28, 0x05, 0x32, 0x7a, 0x32, 0x94, 0xa3, 0x46, + 0xaf, 0x65, 0x2a, 0xac, 0x32, 0xc4, 0x18, 0xc7, 0xfe, 0xc3, 0x31, 0x98, 0x94, 0xa1, 0xbe, 0x4f, + 0xc0, 0x8b, 0x7f, 0x2f, 0x71, 0xbd, 0xbb, 0x96, 0x4b, 0x84, 0x72, 0x5f, 0x17, 0xfe, 0x30, 0xe5, + 0xc2, 0xff, 0x66, 0x3e, 0xec, 0x8e, 0xf7, 0xdf, 0xff, 0x83, 0x22, 0xcc, 0xa5, 0x42, 0xa7, 0x99, + 0x6a, 0xdd, 0xe3, 0xb6, 0x7a, 0x37, 0xd7, 0xe8, 0x6c, 0x1d, 0x96, 0x72, 0xbc, 0x07, 0x6b, 0x98, + 0xc8, 0xee, 0x7c, 0x27, 0xb7, 0x87, 0x2b, 0x7e, 0x92, 0xe8, 0x79, 0x48, 0x8f, 0x4c, 0xf2, 0x4d, + 0x0b, 0xce, 0x39, 0xbd, 0x2f, 0x7f, 0x48, 0x13, 0xe0, 0x9d, 0xdc, 0x9f, 0x14, 0xa9, 0x3e, 0x23, + 0x85, 0xcc, 0x7a, 0x60, 0x05, 0xb3, 0x44, 0xb1, 0xff, 0xb3, 0x05, 0x4f, 0xf7, 0x4d, 0x02, 0xc0, + 0x73, 0x48, 0x05, 0x49, 0xa8, 0x5c, 0x33, 0x72, 0x4e, 0x75, 0xa2, 0xaf, 0x83, 0xd3, 0x69, 0x7f, + 0xd2, 0xec, 0xc9, 0xcb, 0x30, 0xc3, 0x75, 0x34, 0xb6, 0x7a, 0x46, 0xb4, 0x23, 0x6f, 0xb3, 0xf8, + 0xbd, 0x46, 0xcd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x4d, 0x0b, 0x16, 0xfa, 0x65, 0x14, 0x1a, 0xc0, + 0xd6, 0xf2, 0xd7, 0x53, 0x91, 0x10, 0xe5, 0x9e, 0x48, 0x88, 0x94, 0xb5, 0x45, 0x05, 0x3d, 0x18, + 0x86, 0x8e, 0xc2, 0x63, 0x1c, 0xfd, 0xbf, 0x66, 0xc1, 0xc5, 0x3e, 0x13, 0xbe, 0x27, 0x22, 0xc6, + 0x3a, 0x71, 0x44, 0xcc, 0xd8, 0xa0, 0x11, 0x31, 0xf6, 0x1f, 0x15, 0x60, 0x5e, 0xca, 0x13, 0x2b, + 0xea, 0xaf, 0x26, 0xe2, 0x49, 0x7e, 0x2a, 0x15, 0x4f, 0x72, 0x3e, 0x8d, 0xff, 0x93, 0x60, 0x92, + 0x1f, 0xaf, 0x60, 0x92, 0xbf, 0x18, 0x83, 0x0b, 0x99, 0x89, 0x8e, 0xc8, 0x57, 0x32, 0x76, 0xaf, + 0x7b, 0x39, 0x67, 0x54, 0x1a, 0x70, 0xff, 0x1a, 0x35, 0x02, 0xe3, 0x57, 0xcd, 0xc8, 0x07, 0xb1, + 0x1b, 0xed, 0x9c, 0x42, 0x6e, 0xa8, 0x21, 0x83, 0x20, 0xec, 0x5f, 0x2a, 0xc0, 0x95, 0x41, 0x09, + 0xfd, 0x98, 0x06, 0xc9, 0x85, 0x89, 0x20, 0xb9, 0x27, 0xa4, 0x59, 0x9c, 0x4a, 0xbc, 0xdc, 0x3f, + 0x19, 0xd7, 0xdb, 0x5e, 0xef, 0xf8, 0x1c, 0xc8, 0xf5, 0x61, 0x92, 0x69, 0x9f, 0x2a, 0x47, 0x74, + 0xbc, 0x14, 0x4e, 0xd6, 0x44, 0xf1, 0xa3, 0xc3, 0xf2, 0xd9, 0x38, 0xdd, 0x86, 0x2c, 0x44, 0x55, + 0x89, 0x5c, 0x81, 0xa9, 0x40, 0x40, 0x55, 0x58, 0x90, 0xf4, 0x1f, 0x11, 0x65, 0xa8, 0xa1, 0xe4, + 0x0b, 0x86, 0xba, 0x3e, 0x7e, 0x5a, 0x59, 0x65, 0x8e, 0x73, 0x8b, 0x79, 0x1b, 0xa6, 0x42, 0x95, + 0xc8, 0x58, 0x28, 0x2e, 0x2f, 0x0d, 0x18, 0x6d, 0xc6, 0xce, 0xe0, 0x2a, 0xab, 0xb1, 0xf8, 0x3e, + 0x9d, 0xf3, 0x58, 0x93, 0x24, 0xb6, 0x3e, 0xfe, 0x0a, 0xb3, 0x3d, 0xf4, 0x1e, 0x7d, 0x49, 0x04, + 0x93, 0xf2, 0x7d, 0x4b, 0x79, 0x9f, 0xb8, 0x91, 0x53, 0x64, 0x89, 0xf4, 0x3b, 0xe6, 0xa7, 0x4a, + 0x65, 0x86, 0x51, 0xac, 0xec, 0xef, 0x59, 0x30, 0x2d, 0xc7, 0xc8, 0x13, 0x08, 0xbb, 0xbb, 0x9f, + 0x0c, 0xbb, 0xbb, 0x96, 0xcb, 0x8a, 0xd5, 0x27, 0xe6, 0xee, 0x3e, 0xcc, 0x98, 0x19, 0xf6, 0xc8, + 0xa7, 0x8d, 0x15, 0xd7, 0x1a, 0x25, 0x67, 0x95, 0x5a, 0x93, 0xe3, 0xd5, 0xd8, 0xfe, 0xed, 0x92, + 0x6e, 0x45, 0x7e, 0x76, 0x35, 0x47, 0xbe, 0x75, 0xec, 0xc8, 0x37, 0x07, 0xde, 0x58, 0xfe, 0x03, + 0xef, 0x0e, 0x4c, 0xa9, 0x65, 0x51, 0x2a, 0x0f, 0xcf, 0x9b, 0x8e, 0xc8, 0x4c, 0x03, 0x61, 0xc4, + 0x8c, 0xe9, 0xc2, 0xcf, 0xa0, 0xb1, 0xad, 0x57, 0x2d, 0xd7, 0x9a, 0x0c, 0x79, 0x07, 0xa6, 0x1f, + 0xf8, 0xc1, 0x5e, 0xcb, 0x77, 0x78, 0xf6, 0x78, 0xc8, 0xe3, 0xee, 0x5b, 0xdb, 0x6b, 0x45, 0x34, + 0xc8, 0xbd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0xe6, 0xda, 0xae, 0x87, 0xd4, 0x69, 0xe8, 0xe8, + 0xba, 0x71, 0x91, 0xb9, 0x59, 0xa9, 0xd6, 0x1b, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0xf1, 0x27, 0x48, + 0x58, 0x1b, 0x64, 0x7a, 0xd6, 0xcd, 0xd1, 0x07, 0x63, 0xd2, 0x82, 0x21, 0xc2, 0x21, 0x92, 0xe5, + 0x98, 0xe2, 0x4d, 0x3e, 0x0f, 0x53, 0xa1, 0x4c, 0x9f, 0x97, 0x8f, 0xd3, 0x84, 0x3e, 0xdb, 0x0b, + 0xa2, 0x71, 0x57, 0xaa, 0x12, 0xd4, 0x0c, 0xc9, 0x3a, 0x9c, 0x57, 0xe6, 0x93, 0xc4, 0x0b, 0x5f, + 0x13, 0x71, 0xb6, 0x25, 0xcc, 0x80, 0x63, 0x66, 0x2d, 0xa6, 0xca, 0xf1, 0xcc, 0x95, 0xe2, 0xae, + 0xd1, 0xb8, 0x9e, 0xe3, 0xf3, 0xaf, 0x81, 0x12, 0x7a, 0x5c, 0xf0, 0xe8, 0xd4, 0x08, 0xc1, 0xa3, + 0x35, 0xb8, 0x90, 0x06, 0xf1, 0x34, 0x5a, 0x3c, 0x73, 0x97, 0xb1, 0x85, 0x6e, 0x66, 0x21, 0x61, + 0x76, 0x5d, 0x72, 0x0f, 0x4a, 0x01, 0xe5, 0x87, 0xac, 0x8a, 0x72, 0xd3, 0x1a, 0xda, 0x21, 0x15, + 0x15, 0x01, 0x8c, 0x69, 0xb1, 0x7e, 0x77, 0x92, 0xb9, 0x94, 0xef, 0xe4, 0xf8, 0xb4, 0xac, 0xec, + 0xfb, 0x3e, 0xe9, 0xed, 0xec, 0x7f, 0x3b, 0x07, 0x67, 0x12, 0x36, 0x20, 0xf2, 0x3c, 0x14, 0x79, + 0x5e, 0x31, 0xbe, 0x5a, 0x4d, 0xc5, 0x2b, 0xaa, 0x68, 0x1c, 0x01, 0x23, 0xbf, 0x6c, 0xc1, 0x5c, + 0x27, 0x71, 0xa7, 0xa1, 0x16, 0xf2, 0x11, 0x0d, 0xa7, 0xc9, 0x8b, 0x12, 0xe3, 0x15, 0x82, 0x24, + 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, 0xf4, 0xea, 0x6e, 0xd1, 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, + 0x58, 0x49, 0x82, 0x31, 0x8d, 0xcf, 0x7a, 0x98, 0x7f, 0xdd, 0x28, 0x8f, 0x17, 0x56, 0x14, 0x01, + 0x8c, 0x69, 0x91, 0xd7, 0x61, 0x56, 0xa6, 0xd0, 0xdd, 0xf4, 0x1b, 0x37, 0x9c, 0x70, 0x57, 0x9e, + 0x70, 0xf4, 0x89, 0x6c, 0x25, 0x01, 0xc5, 0x14, 0x36, 0xff, 0xb6, 0x38, 0x4f, 0x31, 0x27, 0x30, + 0x91, 0x7c, 0xa4, 0x61, 0x25, 0x09, 0xc6, 0x34, 0x3e, 0x79, 0xd1, 0xd8, 0x86, 0xc4, 0xfd, 0xbf, + 0x5e, 0x0d, 0x32, 0xb6, 0xa2, 0x0a, 0xcc, 0x75, 0xf9, 0x81, 0xb0, 0xa1, 0x80, 0x72, 0x3e, 0x6a, + 0x86, 0x77, 0x93, 0x60, 0x4c, 0xe3, 0x93, 0xd7, 0xe0, 0x4c, 0xc0, 0x16, 0x5b, 0x4d, 0x40, 0x38, + 0x05, 0xe8, 0x3b, 0x5f, 0x34, 0x81, 0x98, 0xc4, 0x25, 0x6f, 0xc0, 0xd9, 0x38, 0xe3, 0xa4, 0x22, + 0x20, 0xbc, 0x04, 0x74, 0xfa, 0xb3, 0x4a, 0x1a, 0x01, 0x7b, 0xeb, 0x90, 0xbf, 0x05, 0xf3, 0x46, + 0x4b, 0xac, 0x79, 0x0d, 0xfa, 0x50, 0x66, 0x05, 0xe4, 0x8f, 0x0e, 0xad, 0xa4, 0x60, 0xd8, 0x83, + 0x4d, 0x3e, 0x01, 0xb3, 0x75, 0xbf, 0xd5, 0xe2, 0x6b, 0x9c, 0x78, 0x20, 0x40, 0xa4, 0xff, 0x13, + 0x89, 0x12, 0x13, 0x10, 0x4c, 0x61, 0x92, 0x9b, 0x40, 0xfc, 0x6d, 0xa6, 0x5e, 0xd1, 0xc6, 0x1b, + 0xe2, 0x75, 0x7c, 0xa6, 0x71, 0x9c, 0x49, 0xc6, 0x94, 0xdc, 0xee, 0xc1, 0xc0, 0x8c, 0x5a, 0x3c, + 0x7b, 0x9a, 0x11, 0x83, 0x3b, 0x9b, 0xc7, 0x43, 0x7e, 0x69, 0xf3, 0xc5, 0x63, 0x03, 0x70, 0x03, + 0x98, 0x10, 0x21, 0x3e, 0xf9, 0xe4, 0x01, 0x34, 0x73, 0x85, 0xc7, 0x7b, 0x84, 0x28, 0x45, 0xc9, + 0x89, 0xfc, 0x02, 0x94, 0xb6, 0xd5, 0xc3, 0x11, 0x3c, 0xf9, 0xdf, 0xc8, 0xfb, 0x62, 0xea, 0x0d, + 0x94, 0xf8, 0x78, 0xae, 0x01, 0x18, 0xb3, 0x24, 0x2f, 0xc0, 0xf4, 0x8d, 0xcd, 0x8a, 0x1e, 0x85, + 0x67, 0x79, 0xef, 0x8f, 0xb3, 0x2a, 0x68, 0x02, 0xd8, 0x0c, 0xd3, 0xea, 0x1b, 0x49, 0x5e, 0x7c, + 0x67, 0x68, 0x63, 0x0c, 0x9b, 0xdf, 0xe4, 0x63, 0x6d, 0xe1, 0x5c, 0x0a, 0x5b, 0x96, 0xa3, 0xc6, + 0x20, 0x6f, 0xc3, 0xb4, 0xdc, 0x2f, 0xf8, 0xda, 0x74, 0xfe, 0x64, 0xf1, 0xdd, 0x18, 0x93, 0x40, + 0x93, 0x1e, 0xbf, 0xb3, 0xe5, 0xf9, 0xf4, 0xe9, 0xf5, 0x6e, 0xab, 0xb5, 0x70, 0x81, 0xaf, 0x9b, + 0xf1, 0x9d, 0x6d, 0x0c, 0x42, 0x13, 0x8f, 0xbc, 0xa4, 0x3c, 0xb2, 0x3e, 0x90, 0xb8, 0xc4, 0xd6, + 0x1e, 0x59, 0x5a, 0xe9, 0xee, 0x13, 0x02, 0x72, 0xf1, 0x31, 0xae, 0x50, 0xdb, 0xb0, 0xa8, 0x34, + 0xbe, 0xde, 0x49, 0xb2, 0xb0, 0x90, 0x30, 0x95, 0x2c, 0xde, 0xeb, 0x8b, 0x89, 0xc7, 0x50, 0x21, + 0xdb, 0x50, 0x70, 0x5a, 0xdb, 0x0b, 0x4f, 0xe7, 0xa1, 0xba, 0x56, 0xd6, 0xab, 0x72, 0x44, 0x71, + 0xb7, 0xcd, 0xca, 0x7a, 0x15, 0x19, 0x71, 0xe2, 0xc2, 0xb8, 0xd3, 0xda, 0x0e, 0x17, 0x16, 0xf9, + 0x9c, 0xcd, 0x8d, 0x49, 0x6c, 0x3c, 0x58, 0xaf, 0x86, 0xc8, 0x59, 0xd8, 0x5f, 0x1c, 0xd3, 0x17, + 0x35, 0x3a, 0x15, 0xf3, 0xbb, 0xe6, 0x04, 0xb2, 0xf2, 0x78, 0xe0, 0xbd, 0xe7, 0x21, 0x17, 0xb1, + 0xf7, 0x65, 0x4e, 0x9f, 0x8e, 0x5e, 0x32, 0x72, 0x49, 0x72, 0x95, 0x4c, 0x33, 0x2d, 0x4e, 0xcf, + 0xc9, 0x05, 0xc3, 0xfe, 0x36, 0x68, 0xa3, 0x5f, 0xca, 0x9b, 0x29, 0x80, 0xa2, 0x1b, 0x46, 0xae, + 0x9f, 0x63, 0xd8, 0x73, 0x2a, 0x3f, 0x33, 0x8f, 0xaa, 0xe0, 0x00, 0x14, 0xac, 0x18, 0x4f, 0xaf, + 0xe9, 0x7a, 0x0f, 0xe5, 0xe7, 0xdf, 0xc9, 0xdd, 0x4d, 0x49, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, + 0x7d, 0x31, 0xa8, 0xf3, 0x79, 0xcc, 0x7f, 0xbd, 0x9a, 0xe2, 0x97, 0x1c, 0xdc, 0xf7, 0xa1, 0x10, + 0xb6, 0x5d, 0xa9, 0x2e, 0x8d, 0xc8, 0xab, 0xb6, 0xb1, 0x96, 0xc5, 0xab, 0xb6, 0xb1, 0x86, 0x8c, + 0x09, 0xf9, 0xb2, 0x05, 0xe0, 0xb4, 0xb7, 0x9d, 0x30, 0x74, 0x1a, 0xda, 0x3a, 0x33, 0xe2, 0xbb, + 0x0b, 0x15, 0x4d, 0x2f, 0xc5, 0x9a, 0x3b, 0xe6, 0xc6, 0x50, 0x34, 0x38, 0x93, 0x77, 0x60, 0xd2, + 0x11, 0x0f, 0xdb, 0x49, 0x1f, 0xf3, 0x7c, 0x5e, 0x6b, 0x4c, 0x49, 0xc0, 0xcd, 0x34, 0x12, 0x84, + 0x8a, 0x21, 0xe3, 0x1d, 0x05, 0x0e, 0xdd, 0x71, 0xf7, 0xa4, 0x71, 0xa8, 0x36, 0xf2, 0xd3, 0x0b, + 0x8c, 0x58, 0x16, 0x6f, 0x09, 0x42, 0xc5, 0x50, 0x3c, 0x34, 0xee, 0x78, 0x8e, 0x8e, 0x1c, 0xcc, + 0x27, 0xbe, 0xd4, 0x8c, 0x45, 0x34, 0x1e, 0x1a, 0x37, 0x19, 0x61, 0x92, 0x2f, 0xd9, 0x87, 0x09, + 0x87, 0x3f, 0xb9, 0x29, 0x8f, 0x62, 0x98, 0xc7, 0xf3, 0x9d, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, + 0xd8, 0x53, 0x72, 0x23, 0xbf, 0x61, 0xc1, 0xa4, 0x70, 0x7f, 0x66, 0x0a, 0x29, 0xfb, 0xf6, 0xcf, + 0x9d, 0x42, 0x9e, 0x77, 0xe9, 0x9a, 0x2d, 0x3d, 0x80, 0x3e, 0xac, 0x7d, 0x3b, 0x45, 0xe9, 0xb1, + 0xce, 0xd9, 0x4a, 0xba, 0xc5, 0x4f, 0xc0, 0x8c, 0x49, 0x65, 0x28, 0xf7, 0xec, 0x1f, 0x14, 0x00, + 0x78, 0x43, 0x8b, 0x5c, 0x21, 0x6d, 0x9e, 0x94, 0x76, 0xd7, 0x6f, 0xe4, 0xf4, 0x3c, 0x9f, 0x91, + 0xf2, 0x03, 0x64, 0x06, 0xda, 0x5d, 0xbf, 0x81, 0x92, 0x09, 0x69, 0xc2, 0x78, 0xc7, 0x89, 0x76, + 0xf3, 0xcf, 0x2f, 0x32, 0x25, 0x82, 0x66, 0xa3, 0x5d, 0xe4, 0x0c, 0xc8, 0x7b, 0x56, 0xec, 0x1a, + 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xb5, 0xd9, 0x92, 0x74, 0x86, 0x11, 0x3d, 0xd8, 0xd7, 0x45, 0x66, + 0xf1, 0x7d, 0x0b, 0x66, 0x4c, 0xd4, 0x8c, 0x6e, 0xfa, 0x39, 0xb3, 0x9b, 0xf2, 0x6c, 0x0f, 0xb3, + 0xc7, 0xff, 0x9b, 0x05, 0xc6, 0xe3, 0xf7, 0xb1, 0x17, 0xba, 0x35, 0xb0, 0x17, 0xfa, 0xd8, 0x90, + 0x5e, 0xe8, 0x85, 0xa1, 0xbc, 0xd0, 0xc7, 0x87, 0xf7, 0x42, 0x2f, 0xf6, 0xf7, 0x42, 0xb7, 0xbf, + 0x6e, 0xc1, 0xd9, 0x9e, 0xdd, 0x86, 0xe9, 0xc1, 0x81, 0xef, 0x47, 0x7d, 0x5c, 0x1e, 0x31, 0x06, + 0xa1, 0x89, 0x47, 0x56, 0x61, 0x5e, 0x3e, 0xc1, 0x50, 0xeb, 0xb4, 0xdc, 0xcc, 0xdc, 0x2f, 0x5b, + 0x29, 0x38, 0xf6, 0xd4, 0xb0, 0xbf, 0x6d, 0xc1, 0xb4, 0x11, 0x31, 0xce, 0xbe, 0x83, 0xbb, 0xb1, + 0x4a, 0x31, 0xe2, 0xd7, 0x27, 0xf8, 0x45, 0x95, 0x80, 0x89, 0x3b, 0xd3, 0xa6, 0x91, 0xa0, 0x3b, + 0xbe, 0x33, 0x65, 0xa5, 0x28, 0xa1, 0x22, 0xf5, 0x32, 0xed, 0xf0, 0x46, 0x2f, 0x98, 0xa9, 0x97, + 0x69, 0x07, 0x39, 0x84, 0xb3, 0x63, 0x07, 0x02, 0x19, 0xa0, 0x60, 0x3c, 0x76, 0xe1, 0x04, 0x11, + 0x0a, 0x18, 0xb9, 0x04, 0x05, 0xea, 0x35, 0xa4, 0xf5, 0x42, 0x3f, 0x47, 0x79, 0xcd, 0x6b, 0x20, + 0x2b, 0xb7, 0x6f, 0xc3, 0x8c, 0xf0, 0xce, 0x7d, 0x93, 0x1e, 0x0c, 0xfc, 0xbe, 0x25, 0x1b, 0xed, + 0xa9, 0xf7, 0x2d, 0x59, 0x75, 0x56, 0x6e, 0xff, 0x33, 0x0b, 0x52, 0x2f, 0xb2, 0x18, 0xf7, 0x27, + 0x56, 0xdf, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x76, 0xac, 0xcd, 0xfd, 0x26, 0x90, 0x36, 0x9b, 0x0a, + 0x89, 0xf7, 0x87, 0xa4, 0xe1, 0x28, 0xce, 0x4f, 0xd1, 0x83, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x2a, + 0x84, 0x35, 0xdf, 0x68, 0x79, 0x7c, 0x03, 0x74, 0xa1, 0xc8, 0x49, 0x49, 0xeb, 0xd9, 0x88, 0x96, + 0xe7, 0xde, 0x3c, 0x4f, 0x71, 0x47, 0xca, 0x29, 0xcf, 0xb9, 0xd9, 0x7f, 0x24, 0x64, 0x35, 0x1e, + 0x71, 0x19, 0x40, 0xd6, 0x76, 0x52, 0xd6, 0x1b, 0x79, 0xad, 0x95, 0xd9, 0x32, 0x92, 0x25, 0x80, + 0x0e, 0x0d, 0xea, 0xd4, 0x8b, 0x54, 0xdc, 0x4c, 0x51, 0x46, 0x70, 0xea, 0x52, 0x34, 0x30, 0xec, + 0xaf, 0xb1, 0x09, 0x14, 0xbf, 0xfc, 0x4a, 0xae, 0xa4, 0x7d, 0x45, 0xd3, 0x93, 0x43, 0xbb, 0x8a, + 0x1a, 0xd1, 0x14, 0x63, 0x8f, 0x89, 0xa6, 0xf8, 0x10, 0x4c, 0x06, 0x7e, 0x8b, 0x56, 0x02, 0x2f, + 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa1, 0x82, 0xdb, 0xbf, 0x66, 0xc1, 0x7c, 0x3a, 0xdc, 0x2b, + 0x77, 0x07, 0x56, 0x33, 0x26, 0xbd, 0x30, 0x7c, 0x4c, 0xba, 0xfd, 0x1e, 0x13, 0x32, 0x72, 0xeb, + 0x7b, 0xae, 0x27, 0xc2, 0xb8, 0x59, 0xcb, 0x7d, 0x08, 0x26, 0xa9, 0x7c, 0xc1, 0x52, 0x18, 0x81, + 0xb5, 0x90, 0xea, 0xe1, 0x4a, 0x05, 0x27, 0x15, 0x98, 0x53, 0x57, 0x5f, 0xca, 0x72, 0x2f, 0xd2, + 0x4f, 0x68, 0x4b, 0xe1, 0x6a, 0x12, 0x8c, 0x69, 0x7c, 0xfb, 0x0b, 0x30, 0x6d, 0x6c, 0x4a, 0x7c, + 0xfd, 0x7e, 0xe8, 0xd4, 0xa3, 0xf4, 0xba, 0x77, 0x8d, 0x15, 0xa2, 0x80, 0xf1, 0x0b, 0x06, 0x11, + 0x8d, 0x92, 0x5a, 0xf7, 0x64, 0x0c, 0x8a, 0x84, 0x32, 0x62, 0x01, 0x6d, 0xd2, 0x87, 0x2a, 0x7f, + 0xba, 0x22, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x11, 0xa6, 0x54, 0x92, 0x20, 0x9e, 0x69, 0x43, + 0x19, 0xbf, 0xcd, 0x4c, 0x1b, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, 0xc1, 0x94, 0xca, 0x65, 0xf4, + 0x78, 0x6c, 0xb6, 0x14, 0x85, 0x9e, 0x7b, 0xc3, 0x0f, 0x23, 0x95, 0x80, 0x49, 0xdc, 0xcf, 0xdd, + 0x5a, 0xe3, 0x65, 0xa8, 0xa1, 0xf6, 0x4b, 0x30, 0x97, 0xba, 0xa7, 0x1d, 0x20, 0x2d, 0xc7, 0xef, + 0x15, 0x60, 0xc6, 0xbc, 0xae, 0x1b, 0x60, 0x16, 0x0f, 0xbe, 0x38, 0x66, 0x5c, 0xb1, 0x15, 0x86, + 0xbc, 0x62, 0x33, 0xef, 0x34, 0xc7, 0x4f, 0xf7, 0x4e, 0xb3, 0x98, 0xcf, 0x9d, 0xa6, 0x71, 0xf7, + 0x3e, 0xf1, 0xe4, 0xee, 0xde, 0x7f, 0xa7, 0x08, 0xb3, 0xc9, 0x3c, 0x8f, 0x03, 0xf4, 0xe4, 0x8b, + 0x3d, 0x3d, 0x39, 0xa4, 0x4d, 0xbf, 0x30, 0xaa, 0x4d, 0x7f, 0x7c, 0x54, 0x9b, 0x7e, 0xf1, 0x04, + 0x36, 0xfd, 0x5e, 0x8b, 0xfc, 0xc4, 0xc0, 0x16, 0xf9, 0x4f, 0x6a, 0xaf, 0xbc, 0xc9, 0x84, 0x1b, + 0x4b, 0xec, 0x95, 0x47, 0x92, 0xdd, 0xb0, 0xe2, 0x37, 0x32, 0xbd, 0x1b, 0xa7, 0x1e, 0x63, 0xbb, + 0x0c, 0x32, 0x9d, 0xe8, 0x86, 0xbf, 0x36, 0xfc, 0xc0, 0x10, 0x0e, 0x74, 0xaf, 0xc0, 0xb4, 0x1c, + 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8b, 0x41, 0x68, 0xe2, 0xf1, 0x27, 0xc0, 0x93, 0x0f, + 0xc3, 0xf3, 0x2b, 0x12, 0xf3, 0x09, 0xf0, 0xd4, 0x43, 0xf2, 0x69, 0x7c, 0xfb, 0xf3, 0x70, 0x21, + 0xd3, 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x0d, 0x89, 0x60, 0x88, 0x91, 0x7a, 0x3a, 0x60, + 0xf1, 0x5e, 0x5f, 0x4c, 0x3c, 0x86, 0x8a, 0xfd, 0xad, 0x02, 0xcc, 0x26, 0xdf, 0x8f, 0x24, 0x0f, + 0xb4, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x20, 0x6b, 0xe4, 0x0e, 0xec, 0x7b, 0x59, 0xf1, 0x80, 0x8f, + 0xaf, 0x6d, 0x9d, 0xc8, 0xf0, 0xf4, 0x18, 0xcb, 0x5b, 0x02, 0xc9, 0x8e, 0x3f, 0x11, 0x19, 0x87, + 0x19, 0xca, 0xd3, 0x6c, 0xee, 0xdc, 0xe3, 0x70, 0x39, 0xcd, 0x0a, 0x0d, 0xb6, 0x6c, 0x6f, 0xd9, + 0xa7, 0x81, 0xbb, 0xe3, 0xea, 0xb7, 0xaf, 0xf9, 0xca, 0xfd, 0x96, 0x2c, 0x43, 0x0d, 0xb5, 0xdf, + 0x1b, 0x83, 0x12, 0xcf, 0x8a, 0x74, 0x3d, 0xf0, 0xdb, 0xfc, 0x91, 0xb5, 0xd0, 0x38, 0x39, 0xc8, + 0x6e, 0xbb, 0x39, 0xea, 0x4b, 0x86, 0x31, 0x45, 0xe9, 0x31, 0x6d, 0x94, 0x60, 0x82, 0x23, 0xe9, + 0xc0, 0xd4, 0x8e, 0xcc, 0xe2, 0x2a, 0xfb, 0x6e, 0xc4, 0x4c, 0x84, 0x2a, 0x27, 0xac, 0x68, 0x02, + 0xf5, 0x0f, 0x35, 0x17, 0xdb, 0x81, 0xb9, 0x54, 0x5a, 0x8b, 0xdc, 0x73, 0xbf, 0xfe, 0xcf, 0x71, + 0x28, 0xe9, 0x70, 0x1d, 0xf2, 0xf1, 0x84, 0x19, 0xa7, 0x54, 0xfd, 0xa0, 0xf1, 0x02, 0xd0, 0xae, + 0xdf, 0x78, 0x74, 0x58, 0x9e, 0xd3, 0xc8, 0x29, 0x93, 0xcc, 0x25, 0x28, 0x74, 0x83, 0x56, 0xfa, + 0x9c, 0x76, 0x17, 0xd7, 0x91, 0x95, 0x9b, 0x21, 0x46, 0x85, 0x27, 0x1a, 0x62, 0xc4, 0x76, 0xc9, + 0x6d, 0xbf, 0x71, 0x90, 0x7e, 0x31, 0xa8, 0xea, 0x37, 0x0e, 0x90, 0x43, 0xc8, 0xeb, 0x30, 0x2b, + 0xe3, 0xa6, 0xcc, 0x77, 0xd4, 0x0b, 0xf1, 0xe5, 0xfb, 0x56, 0x02, 0x8a, 0x29, 0x6c, 0xb6, 0xcb, + 0xde, 0x0f, 0x7d, 0x8f, 0x67, 0xf4, 0x9d, 0x48, 0xde, 0xd4, 0xdd, 0xac, 0xdd, 0xbe, 0xc5, 0xcd, + 0x49, 0x1a, 0x23, 0x11, 0x9a, 0x35, 0xf9, 0xd8, 0xd0, 0xac, 0x55, 0x41, 0x9b, 0x49, 0xcb, 0x77, + 0x94, 0x99, 0xea, 0x15, 0x45, 0x97, 0x95, 0x3d, 0x3a, 0x3c, 0xc6, 0xd0, 0xa7, 0x6b, 0x66, 0x05, + 0xb1, 0x95, 0x7e, 0x74, 0x41, 0x6c, 0xf6, 0x5d, 0x98, 0x4b, 0xf5, 0x9f, 0x3a, 0xe6, 0x5b, 0xd9, + 0xc7, 0xfc, 0xc1, 0xde, 0x1c, 0xfa, 0x17, 0x16, 0x9c, 0xed, 0x59, 0x91, 0x06, 0x8d, 0x26, 0x4c, + 0xef, 0x8d, 0x63, 0x27, 0xdf, 0x1b, 0x0b, 0xc3, 0xed, 0x8d, 0xd5, 0xed, 0xef, 0x7c, 0xff, 0xf2, + 0x53, 0xdf, 0xfd, 0xfe, 0xe5, 0xa7, 0xfe, 0xf8, 0xfb, 0x97, 0x9f, 0x7a, 0xef, 0xe8, 0xb2, 0xf5, + 0x9d, 0xa3, 0xcb, 0xd6, 0x77, 0x8f, 0x2e, 0x5b, 0x7f, 0x7c, 0x74, 0xd9, 0xfa, 0x4f, 0x47, 0x97, + 0xad, 0xaf, 0xff, 0xf9, 0xe5, 0xa7, 0x3e, 0xfd, 0xc9, 0xb8, 0xa7, 0x96, 0x55, 0x4f, 0xf1, 0x1f, + 0x1f, 0x51, 0xfd, 0xb2, 0xdc, 0xd9, 0x6b, 0x2e, 0xb3, 0x9e, 0x5a, 0xd6, 0x25, 0xaa, 0xa7, 0xfe, + 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xb2, 0x75, 0xab, 0x44, 0xa1, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -4914,6 +4950,49 @@ func (m *ArgumentValueFrom) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Authentication) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Authentication) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Authentication) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.OAuth2.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Sigv4.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *AwsResourceRef) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7504,6 +7583,53 @@ func (m *NginxTrafficRouting) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *OAuth2Config) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OAuth2Config) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OAuth2Config) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Scopes) > 0 { + for iNdEx := len(m.Scopes) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Scopes[iNdEx]) + copy(dAtA[i:], m.Scopes[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Scopes[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + i -= len(m.ClientSecret) + copy(dAtA[i:], m.ClientSecret) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClientSecret))) + i-- + dAtA[i] = 0x1a + i -= len(m.ClientID) + copy(dAtA[i:], m.ClientID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClientID))) + i-- + dAtA[i] = 0x12 + i -= len(m.TokenURL) + copy(dAtA[i:], m.TokenURL) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.TokenURL))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ObjectRef) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7710,39 +7836,6 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) MarshalToSizedBuffer(d return len(dAtA) - i, nil } -func (m *PrometheusAuth) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PrometheusAuth) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PrometheusAuth) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Sigv4.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - return len(dAtA) - i, nil -} - func (m *PrometheusMetric) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9967,6 +10060,16 @@ func (m *WebMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.Authentication.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a if m.JSONBody != nil { i -= len(m.JSONBody) copy(dAtA[i:], m.JSONBody) @@ -10520,6 +10623,19 @@ func (m *ArgumentValueFrom) Size() (n int) { return n } +func (m *Authentication) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Sigv4.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.OAuth2.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *AwsResourceRef) Size() (n int) { if m == nil { return 0 @@ -11480,6 +11596,27 @@ func (m *NginxTrafficRouting) Size() (n int) { return n } +func (m *OAuth2Config) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TokenURL) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ClientID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ClientSecret) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Scopes) > 0 { + for _, s := range m.Scopes { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *ObjectRef) Size() (n int) { if m == nil { return 0 @@ -11556,17 +11693,6 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Size() (n int) { return n } -func (m *PrometheusAuth) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Sigv4.Size() - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *PrometheusMetric) Size() (n int) { if m == nil { return 0 @@ -12394,6 +12520,8 @@ func (m *WebMetric) Size() (n int) { l = len(m.JSONBody) n += 1 + l + sovGenerated(uint64(l)) } + l = m.Authentication.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -12762,6 +12890,17 @@ func (this *ArgumentValueFrom) String() string { }, "") return s } +func (this *Authentication) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Authentication{`, + `Sigv4:` + strings.Replace(strings.Replace(this.Sigv4.String(), "Sigv4Config", "Sigv4Config", 1), `&`, ``, 1) + `,`, + `OAuth2:` + strings.Replace(strings.Replace(this.OAuth2.String(), "OAuth2Config", "OAuth2Config", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *AwsResourceRef) String() string { if this == nil { return "nil" @@ -13452,6 +13591,19 @@ func (this *NginxTrafficRouting) String() string { }, "") return s } +func (this *OAuth2Config) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OAuth2Config{`, + `TokenURL:` + fmt.Sprintf("%v", this.TokenURL) + `,`, + `ClientID:` + fmt.Sprintf("%v", this.ClientID) + `,`, + `ClientSecret:` + fmt.Sprintf("%v", this.ClientSecret) + `,`, + `Scopes:` + fmt.Sprintf("%v", this.Scopes) + `,`, + `}`, + }, "") + return s +} func (this *ObjectRef) String() string { if this == nil { return "nil" @@ -13527,16 +13679,6 @@ func (this *PreferredDuringSchedulingIgnoredDuringExecution) String() string { }, "") return s } -func (this *PrometheusAuth) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PrometheusAuth{`, - `Sigv4:` + strings.Replace(strings.Replace(this.Sigv4.String(), "Sigv4Config", "Sigv4Config", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} func (this *PrometheusMetric) String() string { if this == nil { return "nil" @@ -13549,7 +13691,7 @@ func (this *PrometheusMetric) String() string { s := strings.Join([]string{`&PrometheusMetric{`, `Address:` + fmt.Sprintf("%v", this.Address) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, - `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "PrometheusAuth", "PrometheusAuth", 1), `&`, ``, 1) + `,`, + `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "Authentication", "Authentication", 1), `&`, ``, 1) + `,`, `Timeout:` + valueToStringGenerated(this.Timeout) + `,`, `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, `Headers:` + repeatedStringForHeaders + `,`, @@ -14169,6 +14311,7 @@ func (this *WebMetric) String() string { `JSONPath:` + fmt.Sprintf("%v", this.JSONPath) + `,`, `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, `JSONBody:` + valueToStringGenerated(this.JSONBody) + `,`, + `Authentication:` + strings.Replace(strings.Replace(this.Authentication.String(), "Authentication", "Authentication", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -17420,6 +17563,122 @@ func (m *ArgumentValueFrom) Unmarshal(dAtA []byte) error { } return nil } +func (m *Authentication) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Authentication: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Authentication: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sigv4", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Sigv4.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OAuth2", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.OAuth2.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AwsResourceRef) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -25859,6 +26118,184 @@ func (m *NginxTrafficRouting) Unmarshal(dAtA []byte) error { } return nil } +func (m *OAuth2Config) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OAuth2Config: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OAuth2Config: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientSecret = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scopes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Scopes = append(m.Scopes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ObjectRef) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -26607,89 +27044,6 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Unmarshal(dAtA []byte) } return nil } -func (m *PrometheusAuth) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PrometheusAuth: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PrometheusAuth: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sigv4", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Sigv4.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *PrometheusMetric) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -33890,6 +34244,39 @@ func (m *WebMetric) Unmarshal(dAtA []byte) error { m.JSONBody = []byte{} } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authentication", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Authentication.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index ea7c60a531..e9ca26687b 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -303,6 +303,17 @@ message ArgumentValueFrom { optional FieldRef fieldRef = 2; } +// Authentication method +message Authentication { + // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // +optional + optional Sigv4Config sigv4 = 1; + + // OAuth2 config + // +optional + optional OAuth2Config oauth2 = 2; +} + message AwsResourceRef { optional string name = 1; @@ -1081,6 +1092,21 @@ message NginxTrafficRouting { repeated string stableIngresses = 4; } +message OAuth2Config { + // OAuth2 provider token URL + optional string tokenUrl = 1; + + // OAuth2 client ID + optional string clientId = 2; + + // OAuth2 client secret + optional string clientSecret = 3; + + // OAuth2 scopes + // +optional + repeated string scopes = 4; +} + // ObjectRef holds a references to the Kubernetes object message ObjectRef { // API Version of the referent @@ -1126,12 +1152,6 @@ message PreferredDuringSchedulingIgnoredDuringExecution { optional int32 weight = 1; } -// PrometheusMetric defines the prometheus query to perform canary analysis -message PrometheusAuth { - // +optional - optional Sigv4Config sigv4 = 3; -} - // PrometheusMetric defines the prometheus query to perform canary analysis message PrometheusMetric { // Address is the HTTP address and port of the prometheus server @@ -1140,9 +1160,9 @@ message PrometheusMetric { // Query is a raw prometheus query to perform optional string query = 2; - // Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus + // Authentication details // +optional - optional PrometheusAuth authentication = 3; + optional Authentication authentication = 3; // Timeout represents the duration within which a prometheus query should complete. It is expressed in seconds. // +optional @@ -1847,6 +1867,10 @@ message WebMetric { // +kubebuilder:validation:Type=object // JSONBody is the body of the web metric in a json format (method must be POST/PUT) optional bytes jsonBody = 8; + + // Authentication details + // +optional + optional Authentication authentication = 9; } message WebMetricHeader { diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index f91a313c76..28a35188c5 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -52,6 +52,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AppMeshVirtualService": schema_pkg_apis_rollouts_v1alpha1_AppMeshVirtualService(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument": schema_pkg_apis_rollouts_v1alpha1_Argument(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ArgumentValueFrom": schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication": schema_pkg_apis_rollouts_v1alpha1_Authentication(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AwsResourceRef": schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStatus": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStatus(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.BlueGreenStrategy": schema_pkg_apis_rollouts_v1alpha1_BlueGreenStrategy(ref), @@ -93,12 +94,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MetricResult": schema_pkg_apis_rollouts_v1alpha1_MetricResult(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NewRelicMetric": schema_pkg_apis_rollouts_v1alpha1_NewRelicMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.NginxTrafficRouting": schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config": schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ObjectRef": schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PauseCondition": schema_pkg_apis_rollouts_v1alpha1_PauseCondition(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PingPongSpec": schema_pkg_apis_rollouts_v1alpha1_PingPongSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PodTemplateMetadata": schema_pkg_apis_rollouts_v1alpha1_PodTemplateMetadata(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PreferredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExecution(ref), - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth": schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusMetric": schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RequiredDuringSchedulingIgnoredDuringExecution": schema_pkg_apis_rollouts_v1alpha1_RequiredDuringSchedulingIgnoredDuringExecution(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RollbackWindowSpec": schema_pkg_apis_rollouts_v1alpha1_RollbackWindowSpec(ref), @@ -1099,6 +1100,35 @@ func schema_pkg_apis_rollouts_v1alpha1_ArgumentValueFrom(ref common.ReferenceCal } } +func schema_pkg_apis_rollouts_v1alpha1_Authentication(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Authentication method", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "sigv4": { + SchemaProps: spec.SchemaProps{ + Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), + }, + }, + "oauth2": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 config", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config"), + }, + }, + }, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.OAuth2Config", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, + } +} + func schema_pkg_apis_rollouts_v1alpha1_AwsResourceRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3242,6 +3272,54 @@ func schema_pkg_apis_rollouts_v1alpha1_NginxTrafficRouting(ref common.ReferenceC } } +func schema_pkg_apis_rollouts_v1alpha1_OAuth2Config(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "tokenUrl": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 provider token URL", + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 client ID", + Type: []string{"string"}, + Format: "", + }, + }, + "clientSecret": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 client secret", + Type: []string{"string"}, + Format: "", + }, + }, + "scopes": { + SchemaProps: spec.SchemaProps{ + Description: "OAuth2 scopes", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3402,27 +3480,6 @@ func schema_pkg_apis_rollouts_v1alpha1_PreferredDuringSchedulingIgnoredDuringExe } } -func schema_pkg_apis_rollouts_v1alpha1_PrometheusAuth(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "PrometheusMetric defines the prometheus query to perform canary analysis", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "sigv4": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Sigv4Config"}, - } -} - func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -3446,9 +3503,9 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, "authentication": { SchemaProps: spec.SchemaProps{ - Description: "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus", + Description: "Authentication details", Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth"), + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), }, }, "timeout": { @@ -3489,7 +3546,7 @@ func schema_pkg_apis_rollouts_v1alpha1_PrometheusMetric(ref common.ReferenceCall }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.PrometheusAuth", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } @@ -5458,12 +5515,19 @@ func schema_pkg_apis_rollouts_v1alpha1_WebMetric(ref common.ReferenceCallback) c Format: "byte", }, }, + "authentication": { + SchemaProps: spec.SchemaProps{ + Description: "Authentication details", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication"), + }, + }, }, Required: []string{"url"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Authentication", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.WebMetricHeader"}, } } diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 2ec2d88b97..aec01a262c 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -615,6 +615,24 @@ func (in *ArgumentValueFrom) DeepCopy() *ArgumentValueFrom { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Authentication) DeepCopyInto(out *Authentication) { + *out = *in + out.Sigv4 = in.Sigv4 + in.OAuth2.DeepCopyInto(&out.OAuth2) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Authentication. +func (in *Authentication) DeepCopy() *Authentication { + if in == nil { + return nil + } + out := new(Authentication) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AwsResourceRef) DeepCopyInto(out *AwsResourceRef) { *out = *in @@ -1805,6 +1823,27 @@ func (in *NginxTrafficRouting) DeepCopy() *NginxTrafficRouting { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuth2Config) DeepCopyInto(out *OAuth2Config) { + *out = *in + if in.Scopes != nil { + in, out := &in.Scopes, &out.Scopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth2Config. +func (in *OAuth2Config) DeepCopy() *OAuth2Config { + if in == nil { + return nil + } + out := new(OAuth2Config) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ObjectRef) DeepCopyInto(out *ObjectRef) { *out = *in @@ -1900,27 +1939,10 @@ func (in *PreferredDuringSchedulingIgnoredDuringExecution) DeepCopy() *Preferred return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PrometheusAuth) DeepCopyInto(out *PrometheusAuth) { - *out = *in - out.Sigv4 = in.Sigv4 - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrometheusAuth. -func (in *PrometheusAuth) DeepCopy() *PrometheusAuth { - if in == nil { - return nil - } - out := new(PrometheusAuth) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PrometheusMetric) DeepCopyInto(out *PrometheusMetric) { *out = *in - out.Authentication = in.Authentication + in.Authentication.DeepCopyInto(&out.Authentication) if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(int64) @@ -2925,6 +2947,7 @@ func (in *WebMetric) DeepCopyInto(out *WebMetric) { *out = make(json.RawMessage, len(*in)) copy(*out, *in) } + in.Authentication.DeepCopyInto(&out.Authentication) return } From e04d3254f8334176f35fcd324a7ad98cc2d51e85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Oct 2023 10:12:44 -0500 Subject: [PATCH 065/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.8 to 1.27.9 (#3102) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.8 to 1.27.9. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.8...service/s3/v1.27.9) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 5340295b69..063a2e2cca 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.2 github.com/aws/aws-sdk-go-v2/config v1.18.44 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 @@ -85,8 +85,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.13.42 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect diff --git a/go.sum b/go.sum index e67556564c..872c0cf226 100644 --- a/go.sum +++ b/go.sum @@ -116,16 +116,18 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8 h1:pdUFDCmsKlwEwVJyq/k3xLBtS/sym3dhBMTCIEDaN40= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.8/go.mod h1:EwMPL+Fu95r6yS2UQY99lRR1rDjgCbcPQpy1aQ3fuxE= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 h1:qDmaPhgjG6Mc5m/2sP+GFBUcp+bZnJMbFbxTAokRv+Q= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= From 1d89c33b50915bcbd99a6d301d4f93883a98c26e Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 13 Oct 2023 12:49:54 -0600 Subject: [PATCH 066/264] fix: codegen was missed (#3104) fix: codegen Signed-off-by: zachaller --- pkg/apiclient/rollout/rollout.swagger.json | 56 +++++++++++++---- ui/src/models/rollout/generated/api.ts | 73 +++++++++++++++++----- 2 files changed, 102 insertions(+), 27 deletions(-) diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 490c5bcab8..c2da4990c7 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -813,6 +813,20 @@ }, "title": "ArgumentValueFrom defines references to fields within resources to grab for the value (i.e. Pod Template Hash)" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Authentication": { + "type": "object", + "properties": { + "sigv4": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config", + "title": "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus\n+optional" + }, + "oauth2": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.OAuth2Config", + "title": "OAuth2 config\n+optional" + } + }, + "title": "Authentication method" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AwsResourceRef": { "type": "object", "properties": { @@ -1631,6 +1645,30 @@ }, "title": "NginxTrafficRouting configuration for Nginx ingress controller to control traffic routing" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.OAuth2Config": { + "type": "object", + "properties": { + "tokenUrl": { + "type": "string", + "title": "OAuth2 provider token URL" + }, + "clientId": { + "type": "string", + "title": "OAuth2 client ID" + }, + "clientSecret": { + "type": "string", + "title": "OAuth2 client secret" + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + }, + "title": "OAuth2 scopes\n+optional" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ObjectRef": { "type": "object", "properties": { @@ -1706,16 +1744,6 @@ }, "title": "PreferredDuringSchedulingIgnoredDuringExecution defines the weight of the anti-affinity injection" }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth": { - "type": "object", - "properties": { - "sigv4": { - "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Sigv4Config", - "title": "+optional" - } - }, - "title": "PrometheusMetric defines the prometheus query to perform canary analysis" - }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusMetric": { "type": "object", "properties": { @@ -1728,8 +1756,8 @@ "title": "Query is a raw prometheus query to perform" }, "authentication": { - "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.PrometheusAuth", - "title": "Sigv4 Config is the aws SigV4 configuration to use for SigV4 signing if using Amazon Managed Prometheus\n+optional" + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Authentication", + "title": "Authentication details\n+optional" }, "timeout": { "type": "string", @@ -2596,6 +2624,10 @@ "type": "string", "format": "byte", "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nJSONBody is the body of the web metric in a json format (method must be POST/PUT)" + }, + "authentication": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Authentication", + "title": "Authentication details\n+optional" } } }, diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index fe2a8eca01..28465a76a8 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -472,6 +472,25 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ArgumentVal */ fieldRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1FieldRef; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication { + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication + */ + sigv4?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication + */ + oauth2?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config; +} /** * * @export @@ -1614,6 +1633,37 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1NginxTraffi */ stableIngresses?: Array; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config + */ + tokenUrl?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config + */ + clientId?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config + */ + clientSecret?: string; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1OAuth2Config + */ + scopes?: Array; +} /** * * @export @@ -1709,19 +1759,6 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PreferredDu */ weight?: number; } -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth { - /** - * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth - */ - sigv4?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Sigv4Config; -} /** * * @export @@ -1742,10 +1779,10 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusM query?: string; /** * - * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth} + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication} * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusMetric */ - authentication?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1PrometheusAuth; + authentication?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication; /** * * @type {string} @@ -2892,6 +2929,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric { * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric */ jsonBody?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1WebMetric + */ + authentication?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Authentication; } /** * From ebf1a3ed24ed08d04f034a13fd780b9771c69be4 Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Sat, 14 Oct 2023 02:39:31 +0100 Subject: [PATCH 067/264] fix(metricprovider): support Datadog v2 API Fixes #2813 (#2997) * Add note in CONTRIBUTING.md that I would have found useful. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Fix gen-openapi to be more portable - make sure it includes the GOPATH in the call. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Update docs. * Expand working with v2 information * Contacted Datadog to get latest info re: v1 deprecation, api limits. * Add tips about rate limits, using helm for templates * Add more example templates Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Update Datadog Analysis Type * Make Query omitempty since now possible it won't exist * Add some descriptions * Add new properties we need for v2 Queries: We can pass in key:query for queries Formula: Makes formulas using the keys from queries * Defaults! Use annotations to declare defaults for some fields. This lets us remove some guard rails from the code itself Interval: 5m - Move this from code to here ApiVersion: v1 - Move this from code to here * Enums! Much like defaults, having enums lets us make assumptions about the incoming metric so we dont need as many guardrails. ApiVersion: Enum to restrict to v1 or v2 Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Output of make codegen Everything looks ok. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Pass in metric to provider factory. Validate metric. Validating the metric on initialization, rather than spread out throughout. You get earlier feedback if you have a bad metric defined. (Not perfect, but there's limitations with our annotation generator for the rules in the crd. eg: If we could use oneOf, we wouldn't need a lot of this validation) We check all the mutually exclusive props. The props where one requires another. We don't have to check for defaults and set them anymore, since they are guaranteed by the crd. rules: - ensure we have only query OR queries - restrict v1 to query only - make sure you only provide a formula with queries - make sure multiple queries are accompanied by a formula Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Remove DefaultApiVersion, remove impossible AnalysisPhaseError ApiVersion is guaranteed to have value, and the enum ensures its v1/v2 when user provided. Updated v1 tests to reflect some of these new realities Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * extract urlBuilding from run run was getting a bit long according to the checks Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Remove some unnecessary stuff for interval. It is a straightline to initialize since default is set to 5m for incoming metrics where it is not set. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Update createRequest Split into createRequest v1/v2 v1 : pretty much unchanged. just extracted v2: support for v2/query/scalar We don't need all the timeseries. I did some testing fetching both scalar and timeseries, and they pretty much lined up. Also confirmed with DD: From support ticket with DD: "...I have also tested the scalar api endpoint with the last aggregator as well as the timeseries api endpoint. They do indeed return the same values when retrieving the values via the api endpoints. Observing the time it takes to retrieve the values, they remain relatively the same..." re: query + v2: Keep backwards compat. if we get in a query, we turn it into a queries object to pass on to requestv2 queries into the QueriesPayload. Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * Handle v2 scalar responses * update the datadogResponseV2 for scalar values * handle no results so it has parity with v1 - empty will now usually result in `[]` unless something goes very wrong on dd side Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * update v1 no data tests to better reflect reality Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * update v2 tests * add some new test cases * update mock server to handle queries / formulas validation * update no data tests to reflect reality * stop all values being the same. it makes it difficult to know find which test case failed. move meaning from comments into the metric name. * stop using deprecated ioutil Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> * re-codegen Signed-off-by: zachaller * fix lint Signed-off-by: zachaller --------- Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> Signed-off-by: zachaller Co-authored-by: zachaller --- Makefile | 4 +- docs/CONTRIBUTING.md | 6 + docs/analysis/datadog.md | 137 +- .../features/kustomize/rollout_cr_schema.json | 54 +- manifests/crds/analysis-run-crd.yaml | 13 +- manifests/crds/analysis-template-crd.yaml | 13 +- .../crds/cluster-analysis-template-crd.yaml | 13 +- manifests/install.yaml | 39 +- metricproviders/datadog/datadog.go | 250 ++-- metricproviders/datadog/datadogV1_test.go | 38 +- metricproviders/datadog/datadogV2_test.go | 176 ++- metricproviders/datadog/datadog_test.go | 147 ++ metricproviders/metricproviders.go | 2 +- pkg/apiclient/rollout/rollout.swagger.json | 16 +- pkg/apis/rollouts/v1alpha1/analysis_types.go | 17 +- pkg/apis/rollouts/v1alpha1/generated.pb.go | 1261 ++++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 13 +- .../rollouts/v1alpha1/openapi_generated.go | 32 +- .../v1alpha1/zz_generated.deepcopy.go | 9 +- ui/src/models/rollout/generated/api.ts | 16 +- 20 files changed, 1520 insertions(+), 736 deletions(-) create mode 100644 metricproviders/datadog/datadog_test.go diff --git a/Makefile b/Makefile index a5f77cc568..a17bf33676 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ DEV_IMAGE ?= false # E2E variables E2E_INSTANCE_ID ?= argo-rollouts-e2e -E2E_TEST_OPTIONS ?= +E2E_TEST_OPTIONS ?= E2E_PARALLEL ?= 1 E2E_WAIT_TIMEOUT ?= 120 GOPATH ?= $(shell go env GOPATH) @@ -149,7 +149,7 @@ gen-mocks: install-go-tools-local ## generate mock files # generates openapi_generated.go .PHONY: gen-openapi gen-openapi: $(DIST_DIR)/openapi-gen ## generate openapi files - PATH=${DIST_DIR}:$$PATH openapi-gen \ + PATH=${DIST_DIR}:$$PATH GOPATH=${GOPATH} openapi-gen \ --go-header-file ${CURRENT_DIR}/hack/custom-boilerplate.go.txt \ --input-dirs github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ --output-package github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1 \ diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index a37ad29fc0..a13b18ed0e 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -178,6 +178,12 @@ make start-e2e E2E_INSTANCE_ID='' ``` +6. Working on CRDs? While editing them directly works when you are finding the shape of things you want, the final CRDs are autogenerated. Make sure to regenerate them before submitting PRs. They are controlled by the relevant annotations in the types file: + +eg: Analysis Templates are controlled by annotations in `pkg/apis/rollouts/v1alpha1/analysis_types.go`. + +Refer to https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html and https://book.kubebuilder.io/reference/markers/crd-validation.html for more info on annotations you can use. + ## Running Local Containers You may need to run containers locally, so here's how: diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index 3010c9a4df..6e89058572 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -26,10 +26,7 @@ spec: sum:requests.error.rate{service:{{args.service-name}}} ``` -The field `apiVersion` refers to the API version of Datadog (v1 or v2). Default value is `v1` if this is omitted. - -!!! note - Datadog is moving away from the legacy v1 API. Rate limits imposed by Datadog are therefore stricter when using v1. It is recommended to switch to v2 soon. If you switch to v2, you will not be able to use formulas (operations between individual queries). +The field `apiVersion` refers to the API version of Datadog (v1 or v2). Default value is `v1` if this is omitted. See "Working with Datadog API v2" below for more information. Datadog api and app tokens can be configured in a kubernetes secret in argo-rollouts namespace. @@ -46,3 +43,135 @@ stringData: ``` `apiVersion` here is different from the `apiVersion` from the Datadog configuration above. + +### Working with Datadog API v2 + +#### Moving to v2 + +If your old v1 was just a simple metric query - no formula as part of the query - then you can just move to v2 by updating the `apiVersion` in your existing Analysis Template, and everything should work. + +If you have a formula, you will need to update how you configure your metric. Here is a before/after example of what your Analysis Template should look like: + +Before: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: log-error-rate +spec: + args: + - name: service-name + metrics: + - name: error-rate + interval: 30s + successCondition: default(result, 0) < 10 + failureLimit: 3 + provider: + datadog: + apiVersion: v1 + interval: 5m + query: "moving_rollup(sum:requests.errors{service:{{args.service-name}}}.as_count(), 60, 'sum') / sum:requests{service:{{args.service-name}}}.as_count()" +``` + +After: + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: loq-error-rate +spec: + args: + - name: service-name + metrics: + - name: error-rate + # Polling rate against the Datadog API + interval: 30s + successCondition: default(result, 0) < 10 + failureLimit: 3 + provider: + datadog: + apiVersion: v2 + # The window of time we are looking at in DD. Basically we will fetch data from (now-5m) to now. + interval: 5m + queries: + a: sum:requests.errors{service:{{args.service-name}}}.as_count() + b: sum:requests{service:{{args.service-name}}}.as_count() + formula: "moving_rollup(a, 60, 'sum') / b" +``` + +#### Examples + +Simple v2 query with no formula + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisTemplate +metadata: + name: canary-container-restarts +spec: + args: + # This is set in rollout using the valueFrom: podTemplateHashValue functionality + - name: canary-hash + - name: service-name + - name: restarts.initial-delay + value: "60s" + - name: restarts.max-restarts + value: "4" + metrics: + - name: kubernetes.containers.restarts + initialDelay: "{{ args.restarts.initial-delay }}" + interval: 15s + failureCondition: default(result, 0) > {{ args.restarts.max-restarts }} + failureLimit: 0 + provider: + datadog: + apiVersion: v2 + interval: 5m + queries: + # The key is arbitrary - you will use this key to refer to the query if you use a formula. + q: "max:kubernetes.containers.restarts{service-name:{{args.service-name}},rollouts_pod_template_hash:{{args.canary-hash}}}" +``` + +### Tips + +#### Datadog Results + +Datadog queries can return empty results if the query takes place during a time interval with no metrics. The Datadog provider will return a `nil` value yielding an error during the evaluation phase like: + +``` +invalid operation: < (mismatched types and float64) +``` + +However, empty query results yielding a `nil` value can be handled using the `default()` function. Here is a succeeding example using the `default()` function: + +```yaml +successCondition: default(result, 0) < 0.05 +``` + +#### Templates and Helm + +Helm and Argo Rollouts both try to parse things between `{{ ... }}` when rendering templates. If you use Helm to deliver your manifests, you will need to escape `{{ args.whatever }}`. Using the example above, here it is set up for Helm: + +```yaml +... +metrics: + - name: kubernetes.containers.restarts + initialDelay: "{{ `{{ args.restarts.initial-delay }}` }}" + interval: 15s + failureCondition: default(result, 0) > {{ `{{ args.restarts.max-restarts }}` }} + failureLimit: 0 + provider: + datadog: + apiVersion: v2 + interval: 5m + queries: + q: "{{ `max:kubernetes.containers.restarts{kube_app_name:{{args.kube_app_name}},rollouts_pod_template_hash:{{args.canary-hash}}}` }}" +``` + +#### Rate Limits + +For the `v1` API, you ask for an increase on the `api/v1/query` route. + +For the `v2` API, the Ratelimit-Name you ask for an increase in is the `query_scalar_public`. diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 8ba598cc82..21ed8d1d66 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -244,18 +244,30 @@ "datadog": { "properties": { "apiVersion": { + "default": "v1", + "enum": [ + "v1", + "v2" + ], + "type": "string" + }, + "formula": { "type": "string" }, "interval": { + "default": "5m", "type": "string" }, + "queries": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, "query": { "type": "string" } }, - "required": [ - "query" - ], "type": "object" }, "graphite": { @@ -4750,18 +4762,30 @@ "datadog": { "properties": { "apiVersion": { + "default": "v1", + "enum": [ + "v1", + "v2" + ], + "type": "string" + }, + "formula": { "type": "string" }, "interval": { + "default": "5m", "type": "string" }, + "queries": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, "query": { "type": "string" } }, - "required": [ - "query" - ], "type": "object" }, "graphite": { @@ -9256,18 +9280,30 @@ "datadog": { "properties": { "apiVersion": { + "default": "v1", + "enum": [ + "v1", + "v2" + ], + "type": "string" + }, + "formula": { "type": "string" }, "interval": { + "default": "5m", "type": "string" }, + "queries": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, "query": { "type": "string" } }, - "required": [ - "query" - ], "type": "object" }, "graphite": { diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 9bf67d49b8..44326292a3 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -179,13 +179,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 591847282f..b160a966f2 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -175,13 +175,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index e02cf80946..c38373a3f9 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -175,13 +175,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: diff --git a/manifests/install.yaml b/manifests/install.yaml index 54c65cc56c..4466ae8106 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -180,13 +180,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: @@ -3226,13 +3235,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: @@ -6158,13 +6176,22 @@ spec: datadog: properties: apiVersion: + default: v1 + enum: + - v1 + - v2 + type: string + formula: type: string interval: + default: 5m type: string + queries: + additionalProperties: + type: string + type: object query: type: string - required: - - query type: object graphite: properties: diff --git a/metricproviders/datadog/datadog.go b/metricproviders/datadog/datadog.go index 00f9c8a8ac..0924f4cdd3 100644 --- a/metricproviders/datadog/datadog.go +++ b/metricproviders/datadog/datadog.go @@ -26,6 +26,7 @@ import ( "k8s.io/client-go/kubernetes" ) +// This is done so we can explicitly override it in the unit test var unixNow = func() int64 { return timeutil.Now().Unix() } const ( @@ -35,7 +36,6 @@ const ( DatadogApiKey = "api-key" DatadogAppKey = "app-key" DatadogAddress = "address" - DefaultApiVersion = "v1" ) // Provider contains all the required components to run a Datadog query @@ -46,9 +46,10 @@ type Provider struct { } type datadogQueryAttributes struct { - From int64 `json:"from"` - To int64 `json:"to"` - Queries []map[string]string `json:"queries"` + From int64 `json:"from"` + To int64 `json:"to"` + Queries []map[string]string `json:"queries"` + Formulas []map[string]string `json:"formulas"` } type datadogQuery struct { @@ -69,8 +70,9 @@ type datadogResponseV1 struct { type datadogResponseV2 struct { Data struct { Attributes struct { - Values [][]float64 - Times []int64 + Columns []struct { + Values []float64 + } } Errors string } @@ -82,7 +84,7 @@ type datadogConfig struct { AppKey string `yaml:"app-key,omitempty"` } -// Type incidates provider is a Datadog provider +// Type indicates provider is a Datadog provider func (p *Provider) Type() string { return ProviderType } @@ -92,57 +94,58 @@ func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string { return nil } -func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement { - startTime := timeutil.MetaNow() - - // Measurement to pass back - measurement := v1alpha1.Measurement{ - StartedAt: &startTime, - } - +func (p *Provider) buildEndpointUrl(apiVersion string) (*url.URL, error) { endpoint := "https://api.datadoghq.com" if p.config.Address != "" { endpoint = p.config.Address } - // Check if the URL is valid first before adding the endpoint + // Check if the user provided URL is valid first before adding the endpoint url, err := url.Parse(endpoint) if err != nil { - return metricutil.MarkMeasurementError(measurement, err) + return nil, err + } + + route := "/api/v1/query" + if apiVersion == "v2" { + route = "/api/v2/query/scalar" } - apiVersion := DefaultApiVersion - if metric.Provider.Datadog.ApiVersion != "" { - apiVersion = metric.Provider.Datadog.ApiVersion + // Add endpoint after getting the API version + url, err = url.Parse(endpoint + route) + if err != nil { + return nil, err } + return url, err +} - if apiVersion == "v1" { +func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement { + startTime := timeutil.MetaNow() + dd := metric.Provider.Datadog + + if dd.ApiVersion == "v1" { p.logCtx.Warn("Datadog will soon deprecate their API v1. Please consider switching to v2 soon.") } - route := "/api/v1/query" - if apiVersion == "v2" { - route = "/api/v2/query/timeseries" + // Measurement to pass back + measurement := v1alpha1.Measurement{ + StartedAt: &startTime, } - // Add endpoint after getting the API version - url, err = url.Parse(endpoint + route) + url, err := p.buildEndpointUrl(dd.ApiVersion) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } - now := unixNow() - var interval int64 = 300 - if metric.Provider.Datadog.Interval != "" { - expDuration, err := metric.Provider.Datadog.Interval.Duration() - if err != nil { - return metricutil.MarkMeasurementError(measurement, err) - } - // Convert to seconds as DataDog expects unix timestamp - interval = int64(expDuration.Seconds()) + // Interval default is in the spec. bigger things would need to fail to get here without an dd.Interval + expDuration, err := dd.Interval.Duration() + if err != nil { + return metricutil.MarkMeasurementError(measurement, err) } + // Convert to seconds as DataDog expects unix timestamp + interval := int64(expDuration.Seconds()) - request, err := p.createRequest(metric.Provider.Datadog.Query, apiVersion, now, interval, url) + request, err := p.createRequest(dd, unixNow(), interval, url) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } @@ -158,12 +161,11 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph Timeout: time.Duration(10) * time.Second, } response, err := httpClient.Do(request) - if err != nil { return metricutil.MarkMeasurementError(measurement, err) } - value, status, err := p.parseResponse(metric, response, apiVersion) + value, status, err := p.parseResponse(metric, response, dd.ApiVersion) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } @@ -176,52 +178,84 @@ func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alph return measurement } -func (p *Provider) createRequest(query string, apiVersion string, now int64, interval int64, url *url.URL) (*http.Request, error) { - if apiVersion == "v1" { - q := url.Query() - q.Set("query", query) - q.Set("from", strconv.FormatInt(now-interval, 10)) - q.Set("to", strconv.FormatInt(now, 10)) - url.RawQuery = q.Encode() - - return &http.Request{Method: "GET"}, nil - } else if apiVersion == "v2" { - queryBody, err := json.Marshal(datadogRequest{ - Data: datadogQuery{ - QueryType: "timeseries_request", - Attributes: datadogQueryAttributes{ - From: (now - interval) * 1000, - To: now * 1000, - Queries: []map[string]string{{ - "data_source": "metrics", - "query": query, - }}, - }, - }}) - if err != nil { - return nil, fmt.Errorf("Could not parse your JSON request: %v", err) +func (p *Provider) createRequest(dd *v1alpha1.DatadogMetric, now int64, interval int64, url *url.URL) (*http.Request, error) { + if dd.ApiVersion == "v1" { + return p.createRequestV1(dd.Query, now, interval, url) + } + + // we know dd.Query and dd.Queries are mutually exclusive. + if dd.Query != "" { + dd.Queries = map[string]string{"query": dd.Query} + } + + return p.createRequestV2(dd.Queries, dd.Formula, now, interval, url) +} + +func (p *Provider) createRequestV1(query string, now int64, interval int64, url *url.URL) (*http.Request, error) { + q := url.Query() + q.Set("query", query) + q.Set("from", strconv.FormatInt(now-interval, 10)) + q.Set("to", strconv.FormatInt(now, 10)) + url.RawQuery = q.Encode() + + return &http.Request{Method: "GET"}, nil +} + +func buildQueriesPayload(queries map[string]string) []map[string]string { + qp := make([]map[string]string, 0, len(queries)) + for k, v := range queries { + p := map[string]string{ + "aggregator": "last", + "data_source": "metrics", + "name": k, + "query": v, } - request := &http.Request{Method: "POST"} - request.Body = io.NopCloser(bytes.NewReader(queryBody)) - return request, nil + qp = append(qp, p) + } + return qp +} + +func (p *Provider) createRequestV2(queries map[string]string, formula string, now int64, interval int64, url *url.URL) (*http.Request, error) { + formulas := []map[string]string{} + // ddAPI supports multiple formulas but doesn't make sense in our context + // can't have a 'blank' formula, so have to guard + if formula != "" { + formulas = []map[string]string{{ + "formula": formula, + }} } - return nil, fmt.Errorf("Invalid API version: %s", apiVersion) + attribs := datadogQueryAttributes{ + // Datadog requires milliseconds for v2 api + From: (now - interval) * 1000, + To: now * 1000, + Queries: buildQueriesPayload(queries), + Formulas: formulas, + } + + queryBody, err := json.Marshal(datadogRequest{ + Data: datadogQuery{ + QueryType: "scalar_request", + Attributes: attribs, + }, + }) + if err != nil { + return nil, fmt.Errorf("Could not parse your JSON request: %v", err) + } + request := &http.Request{Method: "POST"} + request.Body = io.NopCloser(bytes.NewReader(queryBody)) + return request, nil } func (p *Provider) parseResponse(metric v1alpha1.Metric, response *http.Response, apiVersion string) (string, v1alpha1.AnalysisPhase, error) { if apiVersion == "v1" { return p.parseResponseV1(metric, response) - } else if apiVersion == "v2" { - return p.parseResponseV2(metric, response) } - return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Invalid API version: %s", apiVersion) + return p.parseResponseV2(metric, response) } func (p *Provider) parseResponseV1(metric v1alpha1.Metric, response *http.Response) (string, v1alpha1.AnalysisPhase, error) { - bodyBytes, err := io.ReadAll(response.Body) - if err != nil { return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Received no bytes in response: %v", err) } @@ -263,9 +297,7 @@ func (p *Provider) parseResponseV1(metric v1alpha1.Metric, response *http.Respon } func (p *Provider) parseResponseV2(metric v1alpha1.Metric, response *http.Response) (string, v1alpha1.AnalysisPhase, error) { - bodyBytes, err := io.ReadAll(response.Body) - if err != nil { return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Received no bytes in response: %v", err) } @@ -288,26 +320,30 @@ func (p *Provider) parseResponseV2(metric v1alpha1.Metric, response *http.Respon } // Handle an empty query result - if reflect.ValueOf(res.Data.Attributes).IsZero() || len(res.Data.Attributes.Values) == 0 || len(res.Data.Attributes.Times) == 0 { + if reflect.ValueOf(res.Data.Attributes).IsZero() || len(res.Data.Attributes.Columns) == 0 || len(res.Data.Attributes.Columns[0].Values) == 0 { var nilFloat64 *float64 status, err := evaluate.EvaluateResult(nilFloat64, metric, p.logCtx) - attributesBytes, jsonErr := json.Marshal(res.Data.Attributes) + + var attributesBytes []byte + var jsonErr error + // Should be impossible for this to not be true, based on dd openapi spec. + // But in this case, better safe than sorry + if len(res.Data.Attributes.Columns) == 1 { + attributesBytes, jsonErr = json.Marshal(res.Data.Attributes.Columns[0].Values) + } else { + attributesBytes, jsonErr = json.Marshal(res.Data.Attributes) + } + if jsonErr != nil { - return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Failed to marshall JSON empty series: %v", jsonErr) + return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Failed to marshall JSON empty Values: %v", jsonErr) } return string(attributesBytes), status, err } // Handle a populated query result - attributes := res.Data.Attributes - datapoint := attributes.Values[0] - timepoint := attributes.Times[len(attributes.Times)-1] - if timepoint == 0 { - return "", v1alpha1.AnalysisPhaseError, fmt.Errorf("Datapoint does not have a corresponding time value") - } - - value := datapoint[len(datapoint)-1] + column := res.Data.Attributes.Columns[0] + value := column.Values[0] status, err := evaluate.EvaluateResult(value, metric, p.logCtx) return strconv.FormatFloat(value, 'f', -1, 64), status, err } @@ -341,7 +377,44 @@ func lookupKeysInEnv(keys []string) map[string]string { return valuesByKey } -func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface) (*Provider, error) { +// The current gen tooling we are using can't generate CRD with all the validations we need. +// This is unfortunate, user has more ways to deliver an invalid Analysis Template vs +// being rejected on delivery by k8s (and allowing for a validation step if desired in CI/CD). +// So we run through all the checks here. If the situation changes (eg: being able to use oneOf with required) +// in the CRD spec, please update. +func validateIncomingProps(dd *v1alpha1.DatadogMetric) error { + // check that we have the required field + if dd.Query == "" && len(dd.Queries) == 0 { + return errors.New("Must have either a query or queries. Please review the Analysis Template.") + } + + // check that we have ONE OF query/queries + if dd.Query != "" && len(dd.Queries) > 0 { + return errors.New("Cannot have both a query and queries. Please review the Analysis Template.") + } + + // check that query is set for apiversion v1 + if dd.ApiVersion == "v1" && dd.Query == "" { + return errors.New("Query is empty. API Version v1 only supports using the query parameter in your Analysis Template.") + } + + // formula <3 queries. won't go anywhere without them + if dd.Formula != "" && len(dd.Queries) == 0 { + return errors.New("Formula are only valid when queries are set. Please review the Analysis Template.") + } + + // Reject queries with more than 1 when NO formula provided. While this would technically work + // DD will return 2 columns of data, and there is no guarantee what order they would be in, so + // there is no way to guess at intention of user. Since this is about metrics and monitoring, we should + // avoid ambiguity. + if dd.Formula == "" && len(dd.Queries) > 1 { + return errors.New("When multiple queries are provided you must include a formula.") + } + + return nil +} + +func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, metric v1alpha1.Metric) (*Provider, error) { ns := defaults.Namespace() apiKey := "" @@ -366,6 +439,12 @@ func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface) (* } if apiKey != "" && appKey != "" { + + err := validateIncomingProps(metric.Provider.Datadog) + if err != nil { + return nil, err + } + return &Provider{ logCtx: logCtx, config: datadogConfig{ @@ -377,5 +456,4 @@ func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface) (* } else { return nil, errors.New("API or App token not found") } - } diff --git a/metricproviders/datadog/datadogV1_test.go b/metricproviders/datadog/datadogV1_test.go index 5f56ae3c0d..af58d47617 100644 --- a/metricproviders/datadog/datadogV1_test.go +++ b/metricproviders/datadog/datadogV1_test.go @@ -19,7 +19,6 @@ import ( ) func TestRunSuite(t *testing.T) { - const expectedApiKey = "0123456789abcdef0123456789abcdef" const expectedAppKey = "0123456789abcdef0123456789abcdef01234567" @@ -39,7 +38,7 @@ func TestRunSuite(t *testing.T) { } // Test Cases - var tests = []struct { + tests := []struct { serverURL string webServerStatus int webServerResponse string @@ -144,7 +143,7 @@ func TestRunSuite(t *testing.T) { // Expect error with no default() and no data { webServerStatus: 200, - webServerResponse: `{"status":"ok","series":[{"pointlist":[]}]}`, + webServerResponse: `{"status":"ok","series":[]}`, metric: v1alpha1.Metric{ Name: "foo", SuccessCondition: "result < 0.05", @@ -159,14 +158,14 @@ func TestRunSuite(t *testing.T) { // Expect success with default() and no data { webServerStatus: 200, - webServerResponse: `{"status":"ok","series":[{"pointlist":[]}]}`, + webServerResponse: `{"status":"ok","series":[]}`, metric: v1alpha1.Metric{ Name: "foo", SuccessCondition: "default(result, 0) < 0.05", Provider: ddProviderIntervalDefault, }, expectedIntervalSeconds: 300, - expectedValue: `[{"pointlist":[]}]`, + expectedValue: `[]`, expectedPhase: v1alpha1.AnalysisPhaseSuccessful, useEnvVarForKeys: false, }, @@ -174,14 +173,14 @@ func TestRunSuite(t *testing.T) { // Expect failure with bad default() and no data { webServerStatus: 200, - webServerResponse: `{"status":"ok","series":[{"pointlist":[]}]}`, + webServerResponse: `{"status":"ok","series":[]}`, metric: v1alpha1.Metric{ Name: "foo", SuccessCondition: "default(result, 1) < 0.05", Provider: ddProviderIntervalDefault, }, expectedIntervalSeconds: 300, - expectedValue: `[{"pointlist":[]}]`, + expectedValue: `[]`, expectedPhase: v1alpha1.AnalysisPhaseFailed, useEnvVarForKeys: false, }, @@ -219,8 +218,10 @@ func TestRunSuite(t *testing.T) { // Error if server address is faulty { - serverURL: "://wrong.schema", - metric: v1alpha1.Metric{}, + serverURL: "://wrong.schema", + metric: v1alpha1.Metric{ + Provider: ddProviderInterval10m, + }, expectedPhase: v1alpha1.AnalysisPhaseError, expectedErrorMessage: "parse \"://wrong.schema\": missing protocol scheme", useEnvVarForKeys: false, @@ -235,11 +236,7 @@ func TestRunSuite(t *testing.T) { if serverURL == "" { // Server setup with response server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - if test.metric.Provider.Datadog.ApiVersion == "" && DefaultApiVersion != "v1" { - t.Errorf("\nApiVersion was left blank in the tests, but the default API version is not v1 anymore.") - } - - //Check query variables + // Check query variables actualQuery := req.URL.Query().Get("query") actualFrom := req.URL.Query().Get("from") actualTo := req.URL.Query().Get("to") @@ -260,7 +257,7 @@ func TestRunSuite(t *testing.T) { t.Errorf("\nfailed to parse to: %v", err) } - //Check headers + // Check headers if req.Header.Get("Content-Type") != "application/json" { t.Errorf("\nContent-Type header expected to be application/json but got %s", req.Header.Get("Content-Type")) } @@ -315,7 +312,16 @@ func TestRunSuite(t *testing.T) { return true, tokenSecret, nil }) - provider, _ := NewDatadogProvider(*logCtx, fakeClient) + // Enforce these having defaults + if test.metric.Provider.Datadog.ApiVersion == "" { + test.metric.Provider.Datadog.ApiVersion = "v1" + } + + if test.metric.Provider.Datadog.Interval == "" { + test.metric.Provider.Datadog.Interval = "5m" + } + + provider, _ := NewDatadogProvider(*logCtx, fakeClient, test.metric) metricsMetadata := provider.GetMetadata(test.metric) assert.Nil(t, metricsMetadata) diff --git a/metricproviders/datadog/datadogV2_test.go b/metricproviders/datadog/datadogV2_test.go index 11a82411c7..f3e481160e 100644 --- a/metricproviders/datadog/datadogV2_test.go +++ b/metricproviders/datadog/datadogV2_test.go @@ -3,7 +3,6 @@ package datadog import ( "encoding/json" "io" - "io/ioutil" "net/http" "net/http/httptest" "os" @@ -19,30 +18,48 @@ import ( kubetesting "k8s.io/client-go/testing" ) -func TestRunSuiteV2(t *testing.T) { - - const expectedApiKey = "0123456789abcdef0123456789abcdef" - const expectedAppKey = "0123456789abcdef0123456789abcdef01234567" - - unixNow = func() int64 { return 1599076435 } - - ddProviderIntervalDefault := v1alpha1.MetricProvider{ +func newQueryDefaultProvider() v1alpha1.MetricProvider { + return v1alpha1.MetricProvider{ Datadog: &v1alpha1.DatadogMetric{ + Interval: "5m", Query: "avg:kubernetes.cpu.user.total{*}", ApiVersion: "v2", }, } +} - ddProviderInterval10m := v1alpha1.MetricProvider{ +func newQueriesDefaultProvider() v1alpha1.MetricProvider { + return v1alpha1.MetricProvider{ + Datadog: &v1alpha1.DatadogMetric{ + Interval: "5m", + Queries: map[string]string{ + "a": "avg:error_requests{*}", + "b": "avg:total_requests{*}", + }, + Formula: "a/b", + ApiVersion: "v2", + }, + } +} + +func newQueryProviderInterval10m() v1alpha1.MetricProvider { + return v1alpha1.MetricProvider{ Datadog: &v1alpha1.DatadogMetric{ Query: "avg:kubernetes.cpu.user.total{*}", Interval: "10m", ApiVersion: "v2", }, } +} + +func TestRunSuiteV2(t *testing.T) { + const expectedApiKey = "0123456789abcdef0123456789abcdef" + const expectedAppKey = "0123456789abcdef0123456789abcdef01234567" + + unixNow = func() int64 { return 1599076435 } // Test Cases - var tests = []struct { + tests := []struct { serverURL string webServerStatus int webServerResponse string @@ -53,75 +70,70 @@ func TestRunSuiteV2(t *testing.T) { expectedErrorMessage string useEnvVarForKeys bool }{ - // When last value of time series matches condition then succeed. { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [[0.0020008318672513122, 0.0003332881882246533]], "times": [1598867910000, 1598867925000]}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.0006332881882246533]}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "simple scalar query", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderInterval10m, + Provider: newQueryProviderInterval10m(), }, expectedIntervalSeconds: 600, - expectedValue: "0.0003332881882246533", + expectedValue: "0.0006332881882246533", expectedPhase: v1alpha1.AnalysisPhaseSuccessful, useEnvVarForKeys: false, }, - // Same test as above, but derive DD keys from env var instead of k8s secret { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [[0.0020008318672513122, 0.0003332881882246533]], "times": [1598867910000, 1598867925000]}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.0003332881882246533]}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "keys from env vars", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderInterval10m, + Provider: newQueryProviderInterval10m(), }, expectedIntervalSeconds: 600, expectedValue: "0.0003332881882246533", expectedPhase: v1alpha1.AnalysisPhaseSuccessful, useEnvVarForKeys: true, }, - // When last value of time series does not match condition then fail. { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [[0.0020008318672513122, 0.006121378742186943]], "times": [1598867910000, 1598867925000]}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.006121374442186943]}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "value does not match condition then fail", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, - expectedValue: "0.006121378742186943", + expectedValue: "0.006121374442186943", expectedPhase: v1alpha1.AnalysisPhaseFailed, useEnvVarForKeys: false, }, - // Error if the request is invalid { webServerStatus: 400, webServerResponse: `{"status":"error","error":"error messsage"}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "error for invalid request", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, expectedPhase: v1alpha1.AnalysisPhaseError, expectedErrorMessage: "received non 2xx response code: 400 {\"status\":\"error\",\"error\":\"error messsage\"}", useEnvVarForKeys: false, }, - // Error if there is an authentication issue { webServerStatus: 401, webServerResponse: `{"errors": ["No authenticated user."]}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "no authenticated user", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, expectedPhase: v1alpha1.AnalysisPhaseError, @@ -129,14 +141,13 @@ func TestRunSuiteV2(t *testing.T) { useEnvVarForKeys: false, }, - // Expect success with default() and data { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [[0.0020008318672513122, 0.006121378742186943]], "times": [1598867910000, 1598867925000]}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.006121378742186943]}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "success with default and data", SuccessCondition: "default(result, 0) < 0.05", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, expectedValue: "0.006121378742186943", @@ -144,14 +155,13 @@ func TestRunSuiteV2(t *testing.T) { useEnvVarForKeys: false, }, - // Expect error with no default() and no data { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [], "times": []}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": []}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "error with no default and no data", SuccessCondition: "result < 0.05", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, expectedPhase: v1alpha1.AnalysisPhaseError, @@ -159,75 +169,89 @@ func TestRunSuiteV2(t *testing.T) { useEnvVarForKeys: false, }, - // Expect success with default() and no data { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [], "times": []}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": []}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "success with default and no data", SuccessCondition: "default(result, 0) < 0.05", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, - expectedValue: `{"Values":[],"Times":[]}`, + expectedValue: `[]`, expectedPhase: v1alpha1.AnalysisPhaseSuccessful, useEnvVarForKeys: false, }, - // Expect failure with bad default() and no data { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [], "times": []}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": []}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "fail when bad default and no data", SuccessCondition: "default(result, 1) < 0.05", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, - expectedValue: `{"Values":[],"Times":[]}`, + expectedValue: `[]`, expectedPhase: v1alpha1.AnalysisPhaseFailed, useEnvVarForKeys: false, }, - // Expect success with bad default() and good data { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": [[0.0020008318672513122, 0.006121378742186943]], "times": [1598867910000, 1598867925000]}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.006721378742186999]}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "success bad default and good data", SuccessCondition: "default(result, 1) < 0.05", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, - expectedValue: `0.006121378742186943`, + expectedValue: `0.006721378742186999`, expectedPhase: v1alpha1.AnalysisPhaseSuccessful, useEnvVarForKeys: false, }, - // Error if datadog returns non-array values { webServerStatus: 200, - webServerResponse: `{"data": {"attributes": {"values": "invalid", "times": "invalid"}}}`, + webServerResponse: `{"data": {"attributes": {"columns": [{"values": "invalid"}]}}}`, metric: v1alpha1.Metric{ - Name: "foo", + Name: "error when bad values from dd", SuccessCondition: "result < 0.001", FailureCondition: "result >= 0.001", - Provider: ddProviderIntervalDefault, + Provider: newQueryDefaultProvider(), }, expectedIntervalSeconds: 300, expectedPhase: v1alpha1.AnalysisPhaseError, - expectedErrorMessage: "Could not parse JSON body: json: cannot unmarshal string into Go struct field .Data.Attributes.Values of type [][]float64", + expectedErrorMessage: "Could not parse JSON body: json: cannot unmarshal string into Go struct field .Data.Attributes.Columns.Values of type []float64", useEnvVarForKeys: false, }, // Error if server address is faulty { - serverURL: "://wrong.schema", - metric: v1alpha1.Metric{}, + serverURL: "://wrong.schema", + metric: v1alpha1.Metric{ + Provider: newQueryProviderInterval10m(), + }, expectedPhase: v1alpha1.AnalysisPhaseError, expectedErrorMessage: "parse \"://wrong.schema\": missing protocol scheme", useEnvVarForKeys: false, }, + + // Queries + Formula + // Expect success with default() and data + { + webServerStatus: 200, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.0006444881882246533]}]}}}`, + metric: v1alpha1.Metric{ + Name: "expect success queries and formula", + SuccessCondition: "default(result, 0) < 0.05", + Provider: newQueriesDefaultProvider(), + }, + expectedIntervalSeconds: 300, + expectedValue: "0.0006444881882246533", + expectedPhase: v1alpha1.AnalysisPhaseSuccessful, + useEnvVarForKeys: false, + }, } // Run @@ -238,9 +262,8 @@ func TestRunSuiteV2(t *testing.T) { if serverURL == "" { // Server setup with response server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - - //Check query variables - bodyBytes, err := ioutil.ReadAll(req.Body) + // Check query variables + bodyBytes, err := io.ReadAll(req.Body) if err != nil { t.Errorf("\nreceived no bytes in request: %v", err) } @@ -251,12 +274,29 @@ func TestRunSuiteV2(t *testing.T) { t.Errorf("\nCould not parse JSON request body: %v", err) } + // Keep the simple check behaviour if there is no Queries passed in from the analysis run + usesQuery := len(test.metric.Provider.Datadog.Queries) == 0 + usesFormula := test.metric.Provider.Datadog.Formula != "" + + actualFormulas := reqBody.Data.Attributes.Formulas actualQuery := reqBody.Data.Attributes.Queries[0]["query"] + actualQueries := reqBody.Data.Attributes.Queries actualFrom := reqBody.Data.Attributes.From actualTo := reqBody.Data.Attributes.To - if actualQuery != "avg:kubernetes.cpu.user.total{*}" { - t.Errorf("\nquery expected avg:kubernetes.cpu.user.total{*} but got %s", actualQuery) + if usesQuery { + if actualQuery != "avg:kubernetes.cpu.user.total{*}" { + t.Errorf("\nquery expected avg:kubernetes.cpu.user.total{*} but got %s", actualQuery) + } + } else { + // Check queries has expected number of queries + if len(actualQueries) != len(test.metric.Provider.Datadog.Queries) { + t.Errorf("\nExpected %d queries but received %d", len(test.metric.Provider.Datadog.Queries), len(reqBody.Data.Attributes.Queries)) + } + + if usesFormula && len(actualFormulas) == 0 { + t.Errorf("\nExpected formula but no Formulas in request: %+v", actualFormulas) + } } if actualFrom != (unixNow()-test.expectedIntervalSeconds)*1000 { @@ -271,7 +311,7 @@ func TestRunSuiteV2(t *testing.T) { t.Errorf("\nfailed to parse to: %v", err) } - //Check headers + // Check headers if req.Header.Get("Content-Type") != "application/json" { t.Errorf("\nContent-Type header expected to be application/json but got %s", req.Header.Get("Content-Type")) } @@ -326,7 +366,7 @@ func TestRunSuiteV2(t *testing.T) { return true, tokenSecret, nil }) - provider, _ := NewDatadogProvider(*logCtx, fakeClient) + provider, _ := NewDatadogProvider(*logCtx, fakeClient, test.metric) metricsMetadata := provider.GetMetadata(test.metric) assert.Nil(t, metricsMetadata) diff --git a/metricproviders/datadog/datadog_test.go b/metricproviders/datadog/datadog_test.go new file mode 100644 index 0000000000..50513d8e13 --- /dev/null +++ b/metricproviders/datadog/datadog_test.go @@ -0,0 +1,147 @@ +// These are tests that don't belong to v1 or v2 API + +package datadog + +import ( + "log" + "os" + "testing" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + "github.com/stretchr/testify/assert" + apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/client-go/kubernetes/scheme" +) + +func TestDatadogSpecDefaults(t *testing.T) { + _ = apiextv1.AddToScheme(scheme.Scheme) + decode := scheme.Codecs.UniversalDeserializer().Decode + + // Load CRD yaml. Is this icky? It seems like the best way to guarantee + // what we expect, since setting the default is via annotations + // Only bothering with the analysis-template-crd. We know cluster-analysis-template-crd + // & analysis-run-crd are all generated from the same source object. + data, err := os.ReadFile("../../manifests/crds/analysis-template-crd.yaml") + if err != nil { + log.Fatalf("could not read CRD file: %v", err) + } + obj, gVK, err := decode(data, nil, nil) + if err != nil { + log.Fatalf("error parsing file: %v", err) + } + if gVK.Kind != "CustomResourceDefinition" { + log.Fatalf("object was not a CRD") + } + + o := obj.(*apiextv1.CustomResourceDefinition) + ddSpec := o.Spec.Versions[0].Schema.OpenAPIV3Schema.Properties["spec"].Properties["metrics"].Items.Schema.Properties["provider"].Properties["datadog"] + + t.Run("apiVersion: Validate default is v1", func(t *testing.T) { + defaultVersion := string(ddSpec.Properties["apiVersion"].Default.Raw) + assert.Equal(t, "\"v1\"", defaultVersion, "Default version should be v1") + }) + + t.Run("apiVersion: Validate enum exists to restrict apiVersion to 2 options", func(t *testing.T) { + versionEnums := ddSpec.Properties["apiVersion"].Enum + assert.Equal(t, 2, len(versionEnums), "Expecting 2 enum options") + assert.Equal(t, "\"v1\"", string(versionEnums[0].Raw), "\"v1\" expected, got %s", string(versionEnums[0].Raw)) + assert.Equal(t, "\"v2\"", string(versionEnums[1].Raw), "\"v2\" is missing, got %s", string(versionEnums[1].Raw)) + }) + + t.Run("interval: Validate default is 5m", func(t *testing.T) { + defaultInterval := string(ddSpec.Properties["interval"].Default.Raw) + assert.Equal(t, "\"5m\"", defaultInterval, "Default interval should be \"5m\" ") + }) +} + +func TestValidateIncomingProps(t *testing.T) { + tests := []struct { + name string + metric *v1alpha1.DatadogMetric + expectedErrorMessage string + }{ + { + name: "query and queries missing", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Query: "", + Queries: nil, + }, + expectedErrorMessage: "Must have either a query or queries", + }, + { + name: "both query and queries", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Query: "foo", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()"}, + }, + expectedErrorMessage: "Cannot have both a query and queries", + }, + { + name: "queries with v1 api", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()"}, + }, + expectedErrorMessage: "Query is empty. API Version v1 only supports using the query parameter in your Analysis Template.", + }, + { + name: "formula/queries with wrong apiVersion", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()"}, + Formula: "a", + }, + expectedErrorMessage: "Query is empty. API Version v1 only supports using the query parameter in your Analysis Template.", + }, + { + name: "formula without queries", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Formula: "foo / bar", + Query: "foo", + }, + expectedErrorMessage: "Formula are only valid when queries are set", + }, + { + name: "More than 1 queries with no formula", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v2", + Query: "", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()", "b": "fish bike"}, + }, + expectedErrorMessage: "When multiple queries are provided you must include a formula.", + }, + { + name: "valid simple query with v2", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v2", + Query: "foo", + }, + expectedErrorMessage: "", + }, + { + name: "valid queries with v2", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v2", + Query: "", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()", "b": "fish bike"}, + Formula: "a + b", + }, + expectedErrorMessage: "", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + err := validateIncomingProps(test.metric) + if test.expectedErrorMessage != "" { + assert.Error(t, err) + assert.Contains(t, err.Error(), test.expectedErrorMessage) + } else { + assert.NoError(t, err) + } + }) + } +} diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index 1be0042c23..d8e6c09881 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -58,7 +58,7 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) } return webmetric.NewWebMetricProvider(logCtx, c, p), nil case datadog.ProviderType: - return datadog.NewDatadogProvider(logCtx, f.KubeClient) + return datadog.NewDatadogProvider(logCtx, f.KubeClient, metric) case wavefront.ProviderType: client, err := wavefront.NewWavefrontAPI(metric, f.KubeClient) if err != nil { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index c2da4990c7..4a4903a545 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1161,14 +1161,26 @@ "type": "object", "properties": { "interval": { - "type": "string" + "type": "string", + "description": "+kubebuilder:default=\"5m\"\nInterval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric." }, "query": { "type": "string" }, + "queries": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2\n+kubebuilder:validation:Type=object" + }, + "formula": { + "type": "string", + "title": "Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2" + }, "apiVersion": { "type": "string", - "description": "ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated." + "title": "ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated.\n+kubebuilder:validation:Enum=v1;v2\n+kubebuilder:default=v1" } } }, diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 1988f44169..af47a99222 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -396,8 +396,8 @@ type ValueFrom struct { // Secret is a reference to where a secret is stored. This field is one of the fields with valueFrom // +optional SecretKeyRef *SecretKeyRef `json:"secretKeyRef,omitempty" protobuf:"bytes,1,opt,name=secretKeyRef"` - //FieldRef is a reference to the fields in metadata which we are referencing. This field is one of the fields with - //valueFrom + // FieldRef is a reference to the fields in metadata which we are referencing. This field is one of the fields with + // valueFrom // +optional FieldRef *FieldRef `json:"fieldRef,omitempty" protobuf:"bytes,2,opt,name=fieldRef"` } @@ -569,8 +569,17 @@ type WebMetricHeader struct { } type DatadogMetric struct { + // +kubebuilder:default="5m" + // Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric. Interval DurationString `json:"interval,omitempty" protobuf:"bytes,1,opt,name=interval,casttype=DurationString"` - Query string `json:"query" protobuf:"bytes,2,opt,name=query"` + Query string `json:"query,omitempty" protobuf:"bytes,2,opt,name=query"` + // Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2 + // +kubebuilder:validation:Type=object + Queries map[string]string `json:"queries,omitempty" protobuf:"bytes,3,opt,name=queries"` + // Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2 + Formula string `json:"formula,omitempty" protobuf:"bytes,4,opt,name=formula"` // ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated. - ApiVersion string `json:"apiVersion,omitempty" protobuf:"bytes,3,opt,name=apiVersion"` + // +kubebuilder:validation:Enum=v1;v2 + // +kubebuilder:default=v1 + ApiVersion string `json:"apiVersion,omitempty" protobuf:"bytes,5,opt,name=apiVersion"` } diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index bfefbed404..5f9239efe8 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3231,6 +3231,7 @@ func init() { proto.RegisterType((*ClusterAnalysisTemplate)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ClusterAnalysisTemplate") proto.RegisterType((*ClusterAnalysisTemplateList)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ClusterAnalysisTemplateList") proto.RegisterType((*DatadogMetric)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DatadogMetric.QueriesEntry") proto.RegisterType((*DryRun)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun") proto.RegisterType((*Experiment)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.Experiment") proto.RegisterType((*ExperimentAnalysisRunStatus)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ExperimentAnalysisRunStatus") @@ -3321,528 +3322,532 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8334 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, - 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x8a, 0x5c, 0x92, 0xfb, 0x76, 0x57, 0xcb, 0xe3, 0xdd, 0xee, - 0x9c, 0xfa, 0x9c, 0xcb, 0xca, 0x3a, 0x91, 0xd2, 0xde, 0x5d, 0x72, 0xd2, 0x29, 0x97, 0xcc, 0x90, - 0xbb, 0xb7, 0xdc, 0x23, 0x77, 0xb9, 0x35, 0xdc, 0x5b, 0x59, 0xd2, 0xd9, 0x6a, 0xce, 0x3c, 0x0e, - 0x7b, 0x39, 0xd3, 0x3d, 0xee, 0xee, 0xe1, 0x2e, 0x4f, 0x07, 0xeb, 0x64, 0xe1, 0x14, 0xc5, 0x90, - 0x60, 0x25, 0xb6, 0x10, 0x04, 0x09, 0x02, 0xc5, 0x30, 0x60, 0x27, 0xf6, 0x2f, 0x21, 0x41, 0xfe, - 0x18, 0x88, 0x10, 0xc7, 0xb6, 0x7e, 0xc4, 0x81, 0xfc, 0x23, 0x91, 0x1d, 0xc0, 0x74, 0x44, 0xe7, - 0x4f, 0x82, 0x04, 0x42, 0x02, 0x05, 0x81, 0xf7, 0x47, 0x10, 0xbc, 0xcf, 0x7e, 0xdd, 0xd3, 0xc3, - 0x9d, 0xe1, 0x34, 0x57, 0x4a, 0xac, 0x7f, 0x33, 0xaf, 0xea, 0x55, 0x55, 0xbf, 0xcf, 0x7a, 0xf5, - 0xaa, 0xea, 0xc1, 0x7a, 0xd3, 0x8d, 0x76, 0xbb, 0xdb, 0x4b, 0x75, 0xbf, 0xbd, 0xec, 0x04, 0x4d, - 0xbf, 0x13, 0xf8, 0xf7, 0xf9, 0x8f, 0x8f, 0x04, 0x7e, 0xab, 0xe5, 0x77, 0xa3, 0x70, 0xb9, 0xb3, - 0xd7, 0x5c, 0x76, 0x3a, 0x6e, 0xb8, 0xac, 0x4b, 0xf6, 0x3f, 0xe6, 0xb4, 0x3a, 0xbb, 0xce, 0xc7, - 0x96, 0x9b, 0xd4, 0xa3, 0x81, 0x13, 0xd1, 0xc6, 0x52, 0x27, 0xf0, 0x23, 0x9f, 0x7c, 0x32, 0xa6, - 0xb6, 0xa4, 0xa8, 0xf1, 0x1f, 0x3f, 0xa7, 0xea, 0x2e, 0x75, 0xf6, 0x9a, 0x4b, 0x8c, 0xda, 0x92, - 0x2e, 0x51, 0xd4, 0x16, 0x3f, 0x62, 0xc8, 0xd2, 0xf4, 0x9b, 0xfe, 0x32, 0x27, 0xba, 0xdd, 0xdd, - 0xe1, 0xff, 0xf8, 0x1f, 0xfe, 0x4b, 0x30, 0x5b, 0x7c, 0x7e, 0xef, 0xd5, 0x70, 0xc9, 0xf5, 0x99, - 0x6c, 0xcb, 0xdb, 0x4e, 0x54, 0xdf, 0x5d, 0xde, 0xef, 0x91, 0x68, 0xd1, 0x36, 0x90, 0xea, 0x7e, - 0x40, 0xb3, 0x70, 0x5e, 0x8e, 0x71, 0xda, 0x4e, 0x7d, 0xd7, 0xf5, 0x68, 0x70, 0x10, 0x7f, 0x75, - 0x9b, 0x46, 0x4e, 0x56, 0xad, 0xe5, 0x7e, 0xb5, 0x82, 0xae, 0x17, 0xb9, 0x6d, 0xda, 0x53, 0xe1, - 0xaf, 0x3d, 0xae, 0x42, 0x58, 0xdf, 0xa5, 0x6d, 0xa7, 0xa7, 0xde, 0x4b, 0xfd, 0xea, 0x75, 0x23, - 0xb7, 0xb5, 0xec, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x4a, 0xf6, 0x0f, 0x0a, 0x50, 0xaa, 0xac, 0x57, - 0x6b, 0x91, 0x13, 0x75, 0x43, 0xf2, 0x65, 0x0b, 0x66, 0x5a, 0xbe, 0xd3, 0xa8, 0x3a, 0x2d, 0xc7, - 0xab, 0xd3, 0x60, 0xc1, 0x7a, 0xce, 0xba, 0x32, 0x7d, 0x75, 0x7d, 0x69, 0x94, 0xfe, 0x5a, 0xaa, - 0x3c, 0x08, 0x91, 0x86, 0x7e, 0x37, 0xa8, 0x53, 0xa4, 0x3b, 0xd5, 0xf3, 0xdf, 0x39, 0x2c, 0x3f, - 0x75, 0x74, 0x58, 0x9e, 0x59, 0x37, 0x38, 0x61, 0x82, 0x2f, 0xf9, 0x86, 0x05, 0x67, 0xeb, 0x8e, - 0xe7, 0x04, 0x07, 0x5b, 0x4e, 0xd0, 0xa4, 0xd1, 0x1b, 0x81, 0xdf, 0xed, 0x2c, 0x8c, 0x9d, 0x82, - 0x34, 0x4f, 0x4b, 0x69, 0xce, 0xae, 0xa4, 0xd9, 0x61, 0xaf, 0x04, 0x5c, 0xae, 0x30, 0x72, 0xb6, - 0x5b, 0xd4, 0x94, 0xab, 0x70, 0x9a, 0x72, 0xd5, 0xd2, 0xec, 0xb0, 0x57, 0x02, 0xf2, 0x21, 0x98, - 0x74, 0xbd, 0x66, 0x40, 0xc3, 0x70, 0x61, 0xfc, 0x39, 0xeb, 0x4a, 0xa9, 0x3a, 0x27, 0xab, 0x4f, - 0xae, 0x89, 0x62, 0x54, 0x70, 0xfb, 0x5b, 0x05, 0x38, 0x5b, 0x59, 0xaf, 0x6e, 0x05, 0xce, 0xce, - 0x8e, 0x5b, 0x47, 0xbf, 0x1b, 0xb9, 0x5e, 0xd3, 0x24, 0x60, 0x1d, 0x4f, 0x80, 0xbc, 0x02, 0xd3, - 0x21, 0x0d, 0xf6, 0xdd, 0x3a, 0xdd, 0xf4, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x7a, 0x4e, 0xa2, 0x4f, - 0xd7, 0x62, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, 0x91, 0x84, 0xf3, 0x36, 0x2b, 0xc5, 0xd5, - 0x30, 0x06, 0xa1, 0x89, 0x47, 0x56, 0x61, 0xde, 0xf1, 0x3c, 0x3f, 0x72, 0x22, 0xd7, 0xf7, 0x36, - 0x03, 0xba, 0xe3, 0x3e, 0x94, 0x9f, 0xb8, 0x20, 0xeb, 0xce, 0x57, 0x52, 0x70, 0xec, 0xa9, 0x41, - 0xbe, 0x6e, 0xc1, 0x7c, 0x18, 0xb9, 0xf5, 0x3d, 0xd7, 0xa3, 0x61, 0xb8, 0xe2, 0x7b, 0x3b, 0x6e, - 0x73, 0xa1, 0xc8, 0xbb, 0xed, 0xd6, 0x68, 0xdd, 0x56, 0x4b, 0x51, 0xad, 0x9e, 0x67, 0x22, 0xa5, - 0x4b, 0xb1, 0x87, 0x3b, 0xf9, 0x30, 0x94, 0x64, 0x8b, 0xd2, 0x70, 0x61, 0xe2, 0xb9, 0xc2, 0x95, - 0x52, 0xf5, 0xcc, 0xd1, 0x61, 0xb9, 0xb4, 0xa6, 0x0a, 0x31, 0x86, 0xdb, 0xab, 0xb0, 0x50, 0x69, - 0x6f, 0x3b, 0x61, 0xe8, 0x34, 0xfc, 0x20, 0xd5, 0x75, 0x57, 0x60, 0xaa, 0xed, 0x74, 0x3a, 0xae, - 0xd7, 0x64, 0x7d, 0xc7, 0xe8, 0xcc, 0x1c, 0x1d, 0x96, 0xa7, 0x36, 0x64, 0x19, 0x6a, 0xa8, 0xfd, - 0x27, 0x63, 0x30, 0x5d, 0xf1, 0x9c, 0xd6, 0x41, 0xe8, 0x86, 0xd8, 0xf5, 0xc8, 0xe7, 0x60, 0x8a, - 0xad, 0x5a, 0x0d, 0x27, 0x72, 0xe4, 0x4c, 0xff, 0xe8, 0x92, 0x58, 0x44, 0x96, 0xcc, 0x45, 0x24, - 0xfe, 0x7c, 0x86, 0xbd, 0xb4, 0xff, 0xb1, 0xa5, 0xdb, 0xdb, 0xf7, 0x69, 0x3d, 0xda, 0xa0, 0x91, - 0x53, 0x25, 0xb2, 0x17, 0x20, 0x2e, 0x43, 0x4d, 0x95, 0xf8, 0x30, 0x1e, 0x76, 0x68, 0x5d, 0xce, - 0xdc, 0x8d, 0x11, 0x67, 0x48, 0x2c, 0x7a, 0xad, 0x43, 0xeb, 0xd5, 0x19, 0xc9, 0x7a, 0x9c, 0xfd, - 0x43, 0xce, 0x88, 0x3c, 0x80, 0x89, 0x90, 0xaf, 0x65, 0x72, 0x52, 0xde, 0xce, 0x8f, 0x25, 0x27, - 0x5b, 0x9d, 0x95, 0x4c, 0x27, 0xc4, 0x7f, 0x94, 0xec, 0xec, 0xff, 0x68, 0xc1, 0x39, 0x03, 0xbb, - 0x12, 0x34, 0xbb, 0x6d, 0xea, 0x45, 0xe4, 0x39, 0x18, 0xf7, 0x9c, 0x36, 0x95, 0xb3, 0x4a, 0x8b, - 0x7c, 0xcb, 0x69, 0x53, 0xe4, 0x10, 0xf2, 0x3c, 0x14, 0xf7, 0x9d, 0x56, 0x97, 0xf2, 0x46, 0x2a, - 0x55, 0xcf, 0x48, 0x94, 0xe2, 0x5b, 0xac, 0x10, 0x05, 0x8c, 0xbc, 0x0b, 0x25, 0xfe, 0xe3, 0x7a, - 0xe0, 0xb7, 0x73, 0xfa, 0x34, 0x29, 0xe1, 0x5b, 0x8a, 0xac, 0x18, 0x7e, 0xfa, 0x2f, 0xc6, 0x0c, - 0xed, 0x3f, 0xb3, 0x60, 0xce, 0xf8, 0xb8, 0x75, 0x37, 0x8c, 0xc8, 0x67, 0x7b, 0x06, 0xcf, 0xd2, - 0x60, 0x83, 0x87, 0xd5, 0xe6, 0x43, 0x67, 0x5e, 0x7e, 0xe9, 0x94, 0x2a, 0x31, 0x06, 0x8e, 0x07, - 0x45, 0x37, 0xa2, 0xed, 0x70, 0x61, 0xec, 0xb9, 0xc2, 0x95, 0xe9, 0xab, 0x6b, 0xb9, 0x75, 0x63, - 0xdc, 0xbe, 0x6b, 0x8c, 0x3e, 0x0a, 0x36, 0xf6, 0x3f, 0x2f, 0x24, 0xba, 0x6f, 0x43, 0xc9, 0xf1, - 0xbe, 0x05, 0x13, 0x2d, 0x67, 0x9b, 0xb6, 0xc4, 0xdc, 0x9a, 0xbe, 0xfa, 0x76, 0x6e, 0x92, 0x28, - 0x1e, 0x4b, 0xeb, 0x9c, 0xfe, 0x35, 0x2f, 0x0a, 0x0e, 0xe2, 0xe1, 0x25, 0x0a, 0x51, 0x32, 0x27, - 0xff, 0xc0, 0x82, 0xe9, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x9d, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, - 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0xc5, 0x8f, 0xc3, 0xb4, 0xf1, 0x09, 0x64, 0x1e, 0x0a, - 0x7b, 0xf4, 0x40, 0x0c, 0x78, 0x64, 0x3f, 0xc9, 0xf9, 0xc4, 0x08, 0x97, 0x43, 0xfa, 0x13, 0x63, - 0xaf, 0x5a, 0x8b, 0xaf, 0xc3, 0x7c, 0x9a, 0xe1, 0x30, 0xf5, 0xed, 0x6f, 0x8d, 0x27, 0x06, 0x26, - 0x5b, 0x08, 0x88, 0x0f, 0x93, 0x6d, 0x1a, 0x05, 0x6e, 0x5d, 0x75, 0xd9, 0xea, 0x68, 0xad, 0xb4, - 0xc1, 0x89, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xe2, 0x42, 0x76, 0x61, 0xdc, 0x09, 0x9a, 0xaa, - 0x4f, 0xae, 0xe7, 0x33, 0x2d, 0xe3, 0xa5, 0xa2, 0x12, 0x34, 0x43, 0xe4, 0x1c, 0xc8, 0x32, 0x94, - 0x22, 0x1a, 0xb4, 0x5d, 0xcf, 0x89, 0xc4, 0x0e, 0x3a, 0x55, 0x3d, 0x2b, 0xd1, 0x4a, 0x5b, 0x0a, - 0x80, 0x31, 0x0e, 0x69, 0xc1, 0x44, 0x23, 0x38, 0xc0, 0xae, 0xb7, 0x30, 0x9e, 0x47, 0x53, 0xac, - 0x72, 0x5a, 0xf1, 0x20, 0x15, 0xff, 0x51, 0xf2, 0x20, 0xbf, 0x6e, 0xc1, 0xf9, 0x36, 0x75, 0xc2, - 0x6e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x3a, 0x76, 0xa1, 0xc8, 0x99, 0xe3, 0xa8, 0xfd, - 0xd0, 0x4b, 0xb9, 0xfa, 0xac, 0x14, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xa5, 0xb1, 0xff, 0x64, 0x1c, - 0xce, 0xf6, 0x2c, 0xec, 0xe4, 0x65, 0x28, 0x76, 0x76, 0x9d, 0x50, 0xad, 0xd4, 0x97, 0xd5, 0x32, - 0xb1, 0xc9, 0x0a, 0x1f, 0x1d, 0x96, 0xcf, 0xa8, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0xd3, 0x9b, 0xda, - 0x34, 0x0c, 0x9d, 0xa6, 0x5a, 0xbe, 0x8d, 0x61, 0xc2, 0x8b, 0x51, 0xc1, 0xc9, 0xdf, 0xb6, 0xe0, - 0x8c, 0x18, 0x32, 0x48, 0xc3, 0x6e, 0x2b, 0x62, 0x5b, 0x14, 0x6b, 0x96, 0x9b, 0x79, 0x0c, 0x4f, - 0x41, 0xb2, 0x7a, 0x41, 0x72, 0x3f, 0x63, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x41, 0x29, 0x8c, - 0x9c, 0x20, 0xa2, 0x8d, 0x4a, 0xc4, 0x95, 0xa9, 0xe9, 0xab, 0x3f, 0x3d, 0xd8, 0xda, 0xbd, 0xe5, - 0xb6, 0xa9, 0xd8, 0x27, 0x6a, 0x8a, 0x00, 0xc6, 0xb4, 0xc8, 0xbb, 0x00, 0x41, 0xd7, 0xab, 0x75, - 0xdb, 0x6d, 0x27, 0x38, 0x90, 0xfa, 0xd5, 0x8d, 0xd1, 0x3e, 0x0f, 0x35, 0xbd, 0x58, 0xd5, 0x88, - 0xcb, 0xd0, 0xe0, 0x47, 0xbe, 0x68, 0xc1, 0x19, 0x31, 0x12, 0x95, 0x04, 0x13, 0x39, 0x4b, 0x70, - 0x96, 0x35, 0xed, 0xaa, 0xc9, 0x02, 0x93, 0x1c, 0xed, 0x7f, 0x9f, 0x54, 0x03, 0x6a, 0x11, 0x3b, - 0x6c, 0x35, 0x0f, 0xc8, 0x67, 0xe0, 0xe9, 0xb0, 0x5b, 0xaf, 0xd3, 0x30, 0xdc, 0xe9, 0xb6, 0xb0, - 0xeb, 0xdd, 0x70, 0xc3, 0xc8, 0x0f, 0x0e, 0xd6, 0xdd, 0xb6, 0x1b, 0xf1, 0x11, 0x57, 0xac, 0x5e, - 0x3a, 0x3a, 0x2c, 0x3f, 0x5d, 0xeb, 0x87, 0x84, 0xfd, 0xeb, 0x13, 0x07, 0x9e, 0xe9, 0x7a, 0xfd, - 0xc9, 0x0b, 0x0d, 0xbd, 0x7c, 0x74, 0x58, 0x7e, 0xe6, 0x6e, 0x7f, 0x34, 0x3c, 0x8e, 0x86, 0xfd, - 0x5f, 0x2d, 0xb6, 0x52, 0x8b, 0xef, 0xda, 0xa2, 0xed, 0x4e, 0x8b, 0xad, 0x2e, 0xa7, 0xaf, 0x3f, - 0x46, 0x09, 0xfd, 0x11, 0xf3, 0xd9, 0xee, 0x94, 0xfc, 0xfd, 0x94, 0x48, 0xfb, 0xbf, 0x58, 0x70, - 0x3e, 0x8d, 0xfc, 0x04, 0x74, 0x9e, 0x30, 0xa9, 0xf3, 0xdc, 0xca, 0xf7, 0x6b, 0xfb, 0x28, 0x3e, - 0x5f, 0x1e, 0xef, 0xfd, 0xd6, 0xff, 0xdf, 0xb7, 0xd1, 0x78, 0x57, 0x2c, 0xfc, 0x28, 0x77, 0xc5, - 0xf1, 0x1f, 0xab, 0x5d, 0xf1, 0x37, 0xc7, 0x61, 0xa6, 0xe2, 0x45, 0x6e, 0x65, 0x67, 0xc7, 0xf5, - 0xdc, 0xe8, 0x80, 0x7c, 0x75, 0x0c, 0x96, 0x3b, 0x01, 0xdd, 0xa1, 0x41, 0x40, 0x1b, 0xab, 0xdd, - 0xc0, 0xf5, 0x9a, 0xb5, 0xfa, 0x2e, 0x6d, 0x74, 0x5b, 0xae, 0xd7, 0x5c, 0x6b, 0x7a, 0xbe, 0x2e, - 0xbe, 0xf6, 0x90, 0xd6, 0xbb, 0xfc, 0x93, 0xc4, 0xa4, 0x68, 0x8f, 0xf6, 0x49, 0x9b, 0xc3, 0x31, - 0xad, 0xbe, 0x74, 0x74, 0x58, 0x5e, 0x1e, 0xb2, 0x12, 0x0e, 0xfb, 0x69, 0xe4, 0x2b, 0x63, 0xb0, - 0x14, 0xd0, 0x9f, 0xef, 0xba, 0x83, 0xb7, 0x86, 0x58, 0xb5, 0x5a, 0x23, 0x6e, 0x3f, 0x43, 0xf1, - 0xac, 0x5e, 0x3d, 0x3a, 0x2c, 0x0f, 0x59, 0x07, 0x87, 0xfc, 0x2e, 0x7b, 0x13, 0xa6, 0x2b, 0x1d, - 0x37, 0x74, 0x1f, 0xa2, 0xdf, 0x8d, 0xe8, 0x00, 0x47, 0xdc, 0x32, 0x14, 0x83, 0x6e, 0x8b, 0x8a, - 0xb9, 0x5d, 0xaa, 0x96, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x8b, 0x6c, 0xc5, 0xe5, - 0x24, 0x53, 0xc6, 0x8d, 0xfb, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0x46, 0x3d, 0x07, 0xc6, 0x52, - 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x1d, 0x83, 0x0b, 0x95, 0x4e, 0x67, 0x83, 0x86, - 0xbb, 0x29, 0x29, 0x7e, 0xd9, 0x82, 0xd9, 0x7d, 0x37, 0x88, 0xba, 0x4e, 0x4b, 0xd9, 0xaf, 0x84, - 0x3c, 0xb5, 0x51, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x92, 0xa3, 0xc3, 0xf2, 0x6c, 0xb2, - 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb7, 0x60, 0x5e, 0x16, 0xdd, 0xf2, 0x1b, 0xd4, 0xb4, 0x8f, 0xde, - 0xcd, 0x53, 0x26, 0x4d, 0x5c, 0xd8, 0xb5, 0xd2, 0xa5, 0xd8, 0x23, 0x84, 0xfd, 0xdf, 0xc7, 0xe0, - 0x62, 0x1f, 0x1a, 0xe4, 0x37, 0x2c, 0x38, 0x2f, 0x8c, 0xaa, 0x06, 0x08, 0xe9, 0x8e, 0x6c, 0xcd, - 0x9f, 0xc9, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x75, 0x5a, 0x5d, 0x60, 0xab, 0xe1, 0x4a, 0x06, - 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0xcc, 0xac, 0x29, 0x49, 0xc7, 0x9e, 0x88, 0xa4, 0xb5, 0x0c, - 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x37, 0xe1, 0x99, 0x63, 0xc8, 0x3d, 0x7e, 0x72, 0xda, 0x6f, 0xeb, - 0x51, 0x9f, 0x1c, 0x73, 0x03, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, 0x1b, 0xd8, 0xf6, - 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0xae, 0x05, 0x53, 0x43, 0x58, 0xc3, 0xca, 0x49, 0x6b, - 0x58, 0xa9, 0xc7, 0x12, 0x16, 0xf5, 0x5a, 0xc2, 0xde, 0x18, 0xad, 0x37, 0x06, 0xb1, 0x80, 0xfd, - 0xc0, 0x82, 0xb3, 0x3d, 0x16, 0x33, 0xb2, 0x0b, 0xe7, 0x3b, 0x7e, 0x43, 0xa9, 0x4d, 0x37, 0x9c, - 0x70, 0x97, 0xc3, 0xe4, 0xe7, 0xbd, 0xcc, 0x7a, 0x72, 0x33, 0x03, 0xfe, 0xe8, 0xb0, 0xbc, 0xa0, - 0x89, 0xa4, 0x10, 0x30, 0x93, 0x22, 0xe9, 0xc0, 0xd4, 0x8e, 0x4b, 0x5b, 0x8d, 0x78, 0x08, 0x8e, - 0xa8, 0x20, 0x5d, 0x97, 0xd4, 0x84, 0xb1, 0x58, 0xfd, 0x43, 0xcd, 0xc5, 0xfe, 0xa1, 0x05, 0xb3, - 0x95, 0x6e, 0xb4, 0xcb, 0xd4, 0x83, 0x3a, 0xb7, 0xcf, 0x10, 0x0f, 0x8a, 0xa1, 0xdb, 0xdc, 0x7f, - 0x39, 0x9f, 0xc5, 0xb8, 0xc6, 0x48, 0x49, 0xa3, 0xb9, 0xd6, 0x4d, 0x79, 0x21, 0x0a, 0x36, 0x24, - 0x80, 0x09, 0xdf, 0xe9, 0x46, 0xbb, 0x57, 0xe5, 0x27, 0x8f, 0x78, 0x52, 0xbe, 0xcd, 0x3e, 0xe7, - 0xaa, 0xe4, 0xa8, 0xb5, 0x35, 0x51, 0x8a, 0x92, 0x93, 0xfd, 0x05, 0x98, 0x4d, 0xde, 0xc4, 0x0c, - 0x30, 0x66, 0x2f, 0x41, 0xc1, 0x09, 0x3c, 0x39, 0x62, 0xa7, 0x25, 0x42, 0xa1, 0x82, 0xb7, 0x90, - 0x95, 0x93, 0x17, 0x61, 0x6a, 0xa7, 0xdb, 0x6a, 0xb1, 0x0a, 0xf2, 0xda, 0x43, 0x9f, 0x02, 0xae, - 0xcb, 0x72, 0xd4, 0x18, 0xf6, 0x5f, 0x8c, 0xc3, 0x5c, 0xb5, 0xd5, 0xa5, 0x6f, 0x04, 0x94, 0x2a, - 0xdb, 0x44, 0x05, 0xe6, 0x3a, 0x01, 0xdd, 0x77, 0xe9, 0x83, 0x1a, 0x6d, 0xd1, 0x7a, 0xe4, 0x07, - 0x52, 0x9a, 0x8b, 0x92, 0xd0, 0xdc, 0x66, 0x12, 0x8c, 0x69, 0x7c, 0xf2, 0x3a, 0xcc, 0x3a, 0xf5, - 0xc8, 0xdd, 0xa7, 0x9a, 0x82, 0x10, 0xf7, 0x03, 0x92, 0xc2, 0x6c, 0x25, 0x01, 0xc5, 0x14, 0x36, - 0xf9, 0x2c, 0x2c, 0x84, 0x75, 0xa7, 0x45, 0xef, 0x76, 0x24, 0xab, 0x95, 0x5d, 0x5a, 0xdf, 0xdb, - 0xf4, 0x5d, 0x2f, 0x92, 0x96, 0xa8, 0xe7, 0x24, 0xa5, 0x85, 0x5a, 0x1f, 0x3c, 0xec, 0x4b, 0x81, - 0xfc, 0x2b, 0x0b, 0x2e, 0x75, 0x02, 0xba, 0x19, 0xf8, 0x6d, 0x9f, 0x0d, 0xb5, 0x1e, 0xf3, 0x8c, - 0x34, 0x53, 0xbc, 0x35, 0xa2, 0x2e, 0x25, 0x4a, 0x7a, 0xad, 0xfa, 0x1f, 0x3c, 0x3a, 0x2c, 0x5f, - 0xda, 0x3c, 0x4e, 0x00, 0x3c, 0x5e, 0x3e, 0xf2, 0xaf, 0x2d, 0xb8, 0xdc, 0xf1, 0xc3, 0xe8, 0x98, - 0x4f, 0x28, 0x9e, 0xea, 0x27, 0xd8, 0x47, 0x87, 0xe5, 0xcb, 0x9b, 0xc7, 0x4a, 0x80, 0x8f, 0x91, - 0xd0, 0x3e, 0x9a, 0x86, 0xb3, 0xc6, 0xd8, 0x93, 0xb6, 0x8b, 0xd7, 0xe0, 0x8c, 0x1a, 0x0c, 0xb1, - 0xee, 0x53, 0x8a, 0x6d, 0x4d, 0x15, 0x13, 0x88, 0x49, 0x5c, 0x36, 0xee, 0xf4, 0x50, 0x14, 0xb5, - 0x53, 0xe3, 0x6e, 0x33, 0x01, 0xc5, 0x14, 0x36, 0x59, 0x83, 0x73, 0xb2, 0x04, 0x69, 0xa7, 0xe5, - 0xd6, 0x9d, 0x15, 0xbf, 0x2b, 0x87, 0x5c, 0xb1, 0x7a, 0xf1, 0xe8, 0xb0, 0x7c, 0x6e, 0xb3, 0x17, - 0x8c, 0x59, 0x75, 0xc8, 0x3a, 0x9c, 0x77, 0xba, 0x91, 0xaf, 0xbf, 0xff, 0x9a, 0xc7, 0xb6, 0xd3, - 0x06, 0x1f, 0x5a, 0x53, 0x62, 0xdf, 0xad, 0x64, 0xc0, 0x31, 0xb3, 0x16, 0xd9, 0x4c, 0x51, 0xab, - 0xd1, 0xba, 0xef, 0x35, 0x44, 0x2f, 0x17, 0xe3, 0x13, 0x58, 0x25, 0x03, 0x07, 0x33, 0x6b, 0x92, - 0x16, 0xcc, 0xb6, 0x9d, 0x87, 0x77, 0x3d, 0x67, 0xdf, 0x71, 0x5b, 0x8c, 0x89, 0xb4, 0x5f, 0xf5, - 0x37, 0xaa, 0x74, 0x23, 0xb7, 0xb5, 0x24, 0x6e, 0xf6, 0x97, 0xd6, 0xbc, 0xe8, 0x76, 0x50, 0x8b, - 0x98, 0xa6, 0x2e, 0x34, 0xc8, 0x8d, 0x04, 0x2d, 0x4c, 0xd1, 0x26, 0xb7, 0xe1, 0x02, 0x9f, 0x8e, - 0xab, 0xfe, 0x03, 0x6f, 0x95, 0xb6, 0x9c, 0x03, 0xf5, 0x01, 0x93, 0xfc, 0x03, 0x9e, 0x3e, 0x3a, - 0x2c, 0x5f, 0xa8, 0x65, 0x21, 0x60, 0x76, 0x3d, 0xe2, 0xc0, 0x33, 0x49, 0x00, 0xd2, 0x7d, 0x37, - 0x74, 0x7d, 0x4f, 0x58, 0xa1, 0xa6, 0x62, 0x2b, 0x54, 0xad, 0x3f, 0x1a, 0x1e, 0x47, 0x83, 0xfc, - 0x43, 0x0b, 0xce, 0x67, 0x4d, 0xc3, 0x85, 0x52, 0x1e, 0xf7, 0x8b, 0xa9, 0xa9, 0x25, 0x46, 0x44, - 0xe6, 0xa2, 0x90, 0x29, 0x04, 0x79, 0xcf, 0x82, 0x19, 0xc7, 0x38, 0x41, 0x2f, 0x40, 0x1e, 0xbb, - 0x96, 0x79, 0x26, 0xaf, 0xce, 0x1f, 0x1d, 0x96, 0x13, 0xa7, 0x74, 0x4c, 0x70, 0x24, 0xff, 0xd8, - 0x82, 0x0b, 0x99, 0x73, 0x7c, 0x61, 0xfa, 0x34, 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, - 0x0c, 0xf2, 0x75, 0x4b, 0x6f, 0x65, 0xea, 0xca, 0x69, 0x61, 0x86, 0x8b, 0x76, 0x67, 0x44, 0xa3, - 0x41, 0xac, 0x35, 0x29, 0xc2, 0xd5, 0x73, 0xc6, 0xce, 0xa8, 0x0a, 0x31, 0xcd, 0x9e, 0x7c, 0xcd, - 0x52, 0x5b, 0xa3, 0x96, 0xe8, 0xcc, 0x69, 0x49, 0x44, 0xe2, 0x9d, 0x56, 0x0b, 0x94, 0x62, 0x4e, - 0x7e, 0x16, 0x16, 0x9d, 0x6d, 0x3f, 0x88, 0x32, 0x27, 0xdf, 0xc2, 0x2c, 0x9f, 0x46, 0x97, 0x8f, - 0x0e, 0xcb, 0x8b, 0x95, 0xbe, 0x58, 0x78, 0x0c, 0x05, 0xfb, 0xb7, 0x8b, 0x30, 0x23, 0x4e, 0x42, - 0x72, 0xeb, 0xfa, 0x1d, 0x0b, 0x9e, 0xad, 0x77, 0x83, 0x80, 0x7a, 0x51, 0x2d, 0xa2, 0x9d, 0xde, - 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0xb9, 0xa3, 0xc3, 0xf2, 0xb3, 0x2b, 0xc7, 0xf0, 0xc7, 0x63, - 0xa5, 0x23, 0xff, 0xce, 0x02, 0x5b, 0x22, 0x54, 0x9d, 0xfa, 0x5e, 0x33, 0xf0, 0xbb, 0x5e, 0xa3, - 0xf7, 0x23, 0xc6, 0x4e, 0xf5, 0x23, 0x5e, 0x38, 0x3a, 0x2c, 0xdb, 0x2b, 0x8f, 0x95, 0x02, 0x07, - 0x90, 0x94, 0xbc, 0x01, 0x67, 0x25, 0xd6, 0xb5, 0x87, 0x1d, 0x1a, 0xb8, 0xec, 0xcc, 0x21, 0x15, - 0xc7, 0xd8, 0x5b, 0x29, 0x8d, 0x80, 0xbd, 0x75, 0x48, 0x08, 0x93, 0x0f, 0xa8, 0xdb, 0xdc, 0x8d, - 0x94, 0xfa, 0x34, 0xa2, 0x8b, 0x92, 0xb4, 0x8a, 0xdc, 0x13, 0x34, 0xab, 0xd3, 0x47, 0x87, 0xe5, - 0x49, 0xf9, 0x07, 0x15, 0x27, 0x72, 0x0b, 0x66, 0xc5, 0x39, 0x75, 0xd3, 0xf5, 0x9a, 0x9b, 0xbe, - 0x27, 0xfc, 0x6c, 0x4a, 0xd5, 0x17, 0xd4, 0x86, 0x5f, 0x4b, 0x40, 0x1f, 0x1d, 0x96, 0x67, 0xd4, - 0xef, 0xad, 0x83, 0x0e, 0xc5, 0x54, 0x6d, 0xfb, 0xf7, 0x27, 0x00, 0xd4, 0x70, 0xa5, 0x1d, 0xf2, - 0x61, 0x28, 0x85, 0x34, 0x12, 0x5c, 0xe5, 0xc5, 0x89, 0xb8, 0x8f, 0x52, 0x85, 0x18, 0xc3, 0xc9, - 0x1e, 0x14, 0x3b, 0x4e, 0x37, 0xa4, 0xf9, 0x9c, 0x1f, 0x64, 0xe7, 0x6f, 0x32, 0x8a, 0xe2, 0x60, - 0xca, 0x7f, 0xa2, 0xe0, 0x41, 0xbe, 0x64, 0x01, 0xd0, 0x64, 0x87, 0x8d, 0x6c, 0x20, 0x92, 0x2c, - 0xe3, 0x3e, 0x65, 0x6d, 0x50, 0x9d, 0x3d, 0x3a, 0x2c, 0x83, 0xd1, 0xf5, 0x06, 0x5b, 0xf2, 0x00, - 0xa6, 0x1c, 0xb5, 0xe6, 0x8f, 0x9f, 0xc6, 0x9a, 0xcf, 0xcf, 0x8b, 0x7a, 0xd0, 0x6a, 0x66, 0xe4, - 0x2b, 0x16, 0xcc, 0x86, 0x34, 0x92, 0x5d, 0xc5, 0x56, 0x1e, 0xa9, 0xf0, 0x8e, 0x38, 0xe8, 0x6a, - 0x09, 0x9a, 0x62, 0x05, 0x4d, 0x96, 0x61, 0x8a, 0xaf, 0x12, 0xe5, 0x06, 0x75, 0x1a, 0x34, 0xe0, - 0xe6, 0x08, 0xa9, 0x49, 0x8d, 0x2e, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, 0x8a, 0xaf, 0x12, - 0x65, 0xc3, 0x0d, 0x02, 0x5f, 0x8a, 0x32, 0x95, 0x93, 0x28, 0x06, 0x4d, 0x2d, 0x8a, 0x51, 0x86, - 0x29, 0xbe, 0xf6, 0x37, 0xcf, 0xc0, 0xac, 0x9a, 0x48, 0xb1, 0x66, 0x2f, 0xac, 0x5f, 0x7d, 0x34, - 0xfb, 0x15, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0x4c, 0xd5, 0xa4, 0x62, 0xaf, 0x2b, 0xd7, 0x4c, - 0x20, 0x26, 0x71, 0x49, 0x1b, 0x8a, 0x61, 0x44, 0x3b, 0xea, 0x0e, 0x7c, 0xc4, 0x2b, 0xda, 0x78, - 0x7d, 0x30, 0x2c, 0x09, 0x8c, 0x3c, 0x0a, 0x2e, 0xdc, 0x80, 0x1b, 0x25, 0x6c, 0xba, 0x72, 0x72, - 0xe4, 0x33, 0x3f, 0x93, 0xe6, 0x62, 0xd1, 0x1b, 0xc9, 0x32, 0x4c, 0xb1, 0xcf, 0x50, 0xf6, 0x8b, - 0xa7, 0xa8, 0xec, 0x7f, 0x1a, 0xa6, 0xda, 0xce, 0xc3, 0x5a, 0x37, 0x68, 0x9e, 0xfc, 0x50, 0x21, - 0xbd, 0x0a, 0x05, 0x15, 0xd4, 0xf4, 0xc8, 0x17, 0x2d, 0x63, 0xc9, 0x99, 0xe4, 0xc4, 0xef, 0xe5, - 0xbb, 0xe4, 0xe8, 0xbd, 0xb2, 0xef, 0xe2, 0xd3, 0xa3, 0x7a, 0x4f, 0x3d, 0x71, 0xd5, 0x9b, 0xa9, - 0x91, 0x62, 0x82, 0x68, 0x35, 0xb2, 0x74, 0xaa, 0x6a, 0xe4, 0x4a, 0x82, 0x19, 0xa6, 0x98, 0x73, - 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xa9, 0xca, 0x53, 0x4b, 0x30, 0xc3, 0x14, 0xf3, 0xfe, 0xe7, - 0xcd, 0xe9, 0xd3, 0x39, 0x6f, 0xce, 0xe4, 0x70, 0xde, 0x3c, 0x5e, 0x15, 0x3f, 0x33, 0xaa, 0x2a, - 0x4e, 0x6e, 0x02, 0x69, 0x1c, 0x78, 0x4e, 0xdb, 0xad, 0xcb, 0xc5, 0x92, 0x6f, 0x9b, 0xb3, 0xdc, - 0x1e, 0xb1, 0x28, 0x17, 0x32, 0xb2, 0xda, 0x83, 0x81, 0x19, 0xb5, 0x48, 0x04, 0x53, 0x1d, 0xa5, - 0x71, 0xcd, 0xe5, 0x31, 0xfa, 0x95, 0x06, 0x26, 0xdc, 0x24, 0xd8, 0xc4, 0x53, 0x25, 0xa8, 0x39, - 0x91, 0x75, 0x38, 0xdf, 0x76, 0xbd, 0x4d, 0xbf, 0x11, 0x6e, 0xd2, 0x40, 0x5a, 0x5b, 0x6a, 0x34, - 0x5a, 0x98, 0xe7, 0x6d, 0xc3, 0x4f, 0xd0, 0x1b, 0x19, 0x70, 0xcc, 0xac, 0x65, 0xff, 0x2f, 0x0b, - 0xe6, 0x57, 0x5a, 0x7e, 0xb7, 0x71, 0xcf, 0x89, 0xea, 0xbb, 0xc2, 0x43, 0x80, 0xbc, 0x0e, 0x53, - 0xae, 0x17, 0xd1, 0x60, 0xdf, 0x69, 0xc9, 0xfd, 0xc9, 0x56, 0xe6, 0xd3, 0x35, 0x59, 0xfe, 0xe8, - 0xb0, 0x3c, 0xbb, 0xda, 0x0d, 0xb8, 0x95, 0x5a, 0xac, 0x56, 0xa8, 0xeb, 0x90, 0x6f, 0x5a, 0x70, - 0x56, 0xf8, 0x18, 0xac, 0x3a, 0x91, 0x73, 0xa7, 0x4b, 0x03, 0x97, 0x2a, 0x2f, 0x83, 0x11, 0x17, - 0xaa, 0xb4, 0xac, 0x8a, 0xc1, 0x41, 0xac, 0xa8, 0x6f, 0xa4, 0x39, 0x63, 0xaf, 0x30, 0xf6, 0xaf, - 0x14, 0xe0, 0xe9, 0xbe, 0xb4, 0xc8, 0x22, 0x8c, 0xb9, 0x0d, 0xf9, 0xe9, 0x20, 0xe9, 0x8e, 0xad, - 0x35, 0x70, 0xcc, 0x6d, 0x90, 0x25, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0x85, 0x73, 0x49, 0xab, - 0x87, 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x86, 0x22, 0xf7, 0x28, 0x95, 0xe7, 0x09, 0xae, 0xc5, 0x72, - 0xe7, 0x4d, 0x14, 0xe5, 0xe4, 0x17, 0x2d, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, 0x5d, 0x12, 0xf3, - 0x6d, 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x82, 0x09, 0xa6, 0xd0, 0xfa, - 0x8d, 0x13, 0x6f, 0x8a, 0xfc, 0x26, 0x6a, 0x93, 0xd3, 0x40, 0x49, 0x8b, 0xb5, 0x55, 0x40, 0xa3, - 0x6e, 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x94, 0x90, 0x02, 0x75, 0x29, 0x1a, 0x18, 0xf6, 0xbf, - 0x1c, 0x83, 0xf3, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x42, 0x48, 0x2b, 0x8f, 0xc6, 0x9f, 0xca, 0xbf, - 0x7d, 0xa4, 0xbb, 0x8c, 0xbe, 0xa6, 0x90, 0x0e, 0x7d, 0x92, 0x2f, 0xf9, 0x94, 0x6e, 0xa1, 0xb1, - 0x13, 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0xe7, 0x60, 0x3c, 0x64, 0x3d, 0x5f, 0x48, 0x5e, 0x77, - 0xf0, 0x3e, 0xe2, 0x10, 0x86, 0xd1, 0xf5, 0xdc, 0x48, 0x86, 0x61, 0x68, 0x8c, 0xbb, 0x9e, 0x1b, - 0x21, 0x87, 0xd8, 0xdf, 0x18, 0x83, 0xc5, 0xfe, 0x1f, 0x45, 0xbe, 0x61, 0x01, 0x34, 0xd8, 0x71, - 0x25, 0xe4, 0xbe, 0xcc, 0xc2, 0xbd, 0xc8, 0x39, 0xad, 0x36, 0x5c, 0x55, 0x9c, 0x62, 0x5f, 0x33, - 0x5d, 0x14, 0xa2, 0x21, 0x08, 0xb9, 0xaa, 0x86, 0x3e, 0xbf, 0xaa, 0x11, 0x93, 0x49, 0xd7, 0xd9, - 0xd0, 0x10, 0x34, 0xb0, 0xd8, 0x79, 0xd4, 0x73, 0xda, 0x34, 0xec, 0x38, 0x3a, 0xa8, 0x85, 0x9f, - 0x47, 0x6f, 0xa9, 0x42, 0x8c, 0xe1, 0x76, 0x0b, 0x9e, 0x1f, 0x40, 0xce, 0x9c, 0x62, 0x06, 0xec, - 0xff, 0x61, 0xc1, 0xc5, 0x95, 0x56, 0x37, 0x8c, 0x68, 0xf0, 0x97, 0xc6, 0x75, 0xef, 0x7f, 0x5b, - 0xf0, 0x4c, 0x9f, 0x6f, 0x7e, 0x02, 0x1e, 0x7c, 0xef, 0x24, 0x3d, 0xf8, 0xee, 0x8e, 0x3a, 0xa4, - 0x33, 0xbf, 0xa3, 0x8f, 0x23, 0xdf, 0x6f, 0x5a, 0x70, 0x86, 0x2d, 0x5b, 0x0d, 0xbf, 0x99, 0xd3, - 0xc6, 0xf9, 0x3c, 0x14, 0x7f, 0x9e, 0x6d, 0x40, 0xe9, 0x41, 0xc6, 0x77, 0x25, 0x14, 0x30, 0x36, - 0x67, 0x9c, 0x8e, 0xfb, 0x16, 0x0d, 0xf8, 0x06, 0x54, 0x48, 0xce, 0x99, 0x8a, 0x86, 0xa0, 0x81, - 0x65, 0x7f, 0x12, 0xa4, 0x8f, 0x5c, 0x6a, 0xc6, 0x59, 0x83, 0xcc, 0x38, 0xfb, 0x3f, 0x8c, 0x81, - 0x61, 0xfc, 0x78, 0x02, 0x23, 0xd9, 0x4b, 0x8c, 0xe4, 0x11, 0x0f, 0xee, 0x86, 0x29, 0xa7, 0x5f, - 0x0c, 0xd3, 0x7e, 0x2a, 0x86, 0xe9, 0x56, 0x6e, 0x1c, 0x8f, 0x0f, 0x61, 0xfa, 0x9e, 0x05, 0xcf, - 0xc4, 0xc8, 0xbd, 0x76, 0xc9, 0xc7, 0x2f, 0x4b, 0xaf, 0xc0, 0xb4, 0x13, 0x57, 0x93, 0xe3, 0xc6, - 0x08, 0x20, 0xd1, 0x20, 0x34, 0xf1, 0x62, 0xd7, 0xfb, 0xc2, 0x09, 0x5d, 0xef, 0xc7, 0x8f, 0x77, - 0xbd, 0xb7, 0x7f, 0x38, 0x06, 0x97, 0x7a, 0xbf, 0x4c, 0x4d, 0xa8, 0xc1, 0x2e, 0xf9, 0x5f, 0x85, - 0x99, 0x48, 0x56, 0x30, 0xb6, 0x07, 0x1d, 0xcc, 0xba, 0x65, 0xc0, 0x30, 0x81, 0xc9, 0x6a, 0xd6, - 0xc5, 0x54, 0xae, 0xd5, 0xfd, 0x8e, 0x0a, 0xdc, 0xd0, 0x35, 0x57, 0x0c, 0x18, 0x26, 0x30, 0xb5, - 0x4b, 0xec, 0xf8, 0xa9, 0xbb, 0xc4, 0xd6, 0xe0, 0x82, 0x72, 0x02, 0xbc, 0xee, 0x07, 0x2b, 0x7e, - 0xbb, 0xd3, 0xa2, 0x32, 0x74, 0x83, 0x09, 0x7b, 0x49, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, 0x5d, - 0xd7, 0xfe, 0x5e, 0x01, 0xce, 0xc5, 0xcd, 0xbe, 0xe2, 0x7b, 0x0d, 0x97, 0xfb, 0x91, 0xbc, 0x06, - 0xe3, 0xd1, 0x41, 0x47, 0x35, 0xf6, 0x5f, 0x55, 0xe2, 0x6c, 0x1d, 0x74, 0x58, 0x6f, 0x5f, 0xcc, - 0xa8, 0xc2, 0x2d, 0xc3, 0xbc, 0x12, 0x59, 0xd7, 0xb3, 0x43, 0xf4, 0xc0, 0xcb, 0xc9, 0xd1, 0xfc, - 0xe8, 0xb0, 0x9c, 0x11, 0xcb, 0xbd, 0xa4, 0x29, 0x25, 0xc7, 0x3c, 0xb9, 0x0f, 0xb3, 0x2d, 0x27, - 0x8c, 0xee, 0x76, 0x1a, 0x4e, 0x44, 0xb7, 0x5c, 0xe9, 0xa1, 0x31, 0x5c, 0x3c, 0x84, 0xbe, 0xca, - 0x5e, 0x4f, 0x50, 0xc2, 0x14, 0x65, 0xb2, 0x0f, 0x84, 0x95, 0x6c, 0x05, 0x8e, 0x17, 0x8a, 0xaf, - 0x62, 0xfc, 0x86, 0x8f, 0xbf, 0xd0, 0x27, 0xc3, 0xf5, 0x1e, 0x6a, 0x98, 0xc1, 0x81, 0xbc, 0x00, - 0x13, 0x01, 0x75, 0x42, 0xd9, 0x99, 0xa5, 0x78, 0xfe, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x27, 0xd4, - 0xc4, 0x63, 0x26, 0xd4, 0x9f, 0x5a, 0x30, 0x1b, 0x77, 0xd3, 0x13, 0xd8, 0x59, 0xdb, 0xc9, 0x9d, - 0xf5, 0x46, 0x5e, 0x4b, 0x62, 0x9f, 0xcd, 0xf4, 0x0f, 0x26, 0xcc, 0xef, 0xe3, 0xfe, 0xf0, 0x9f, - 0x87, 0x92, 0x9a, 0xd5, 0x4a, 0x65, 0x1d, 0xf1, 0x80, 0x9d, 0x50, 0x66, 0x8c, 0x38, 0x2e, 0xc9, - 0x04, 0x63, 0x7e, 0x6c, 0x2b, 0x6f, 0xc8, 0x6d, 0x5a, 0x0e, 0x7b, 0xbd, 0x95, 0xab, 0xed, 0x3b, - 0x6b, 0x2b, 0x57, 0x75, 0xc8, 0x5d, 0xb8, 0xd8, 0x09, 0x7c, 0x1e, 0x4d, 0xbc, 0x4a, 0x9d, 0x46, - 0xcb, 0xf5, 0xa8, 0xb2, 0x62, 0x08, 0x4f, 0x8a, 0x67, 0x8e, 0x0e, 0xcb, 0x17, 0x37, 0xb3, 0x51, - 0xb0, 0x5f, 0xdd, 0x64, 0x3c, 0xda, 0xf8, 0x00, 0xf1, 0x68, 0x7f, 0x47, 0xdb, 0x0a, 0x69, 0x28, - 0xa3, 0xc2, 0x3e, 0x93, 0x57, 0x57, 0x66, 0x2c, 0xeb, 0xf1, 0x90, 0xaa, 0x48, 0xa6, 0xa8, 0xd9, - 0xf7, 0x37, 0x48, 0x4d, 0x9c, 0xd0, 0x20, 0x15, 0x87, 0x15, 0x4c, 0xfe, 0x28, 0xc3, 0x0a, 0xa6, - 0x7e, 0xac, 0xc2, 0x0a, 0xde, 0x2f, 0xc2, 0x7c, 0x5a, 0x03, 0x39, 0xfd, 0x58, 0xbb, 0xbf, 0x67, - 0xc1, 0xbc, 0x9a, 0x3d, 0x82, 0x27, 0x55, 0x57, 0x0d, 0xeb, 0x39, 0x4d, 0x5a, 0xa1, 0x4b, 0xe9, - 0x24, 0x04, 0x5b, 0x29, 0x6e, 0xd8, 0xc3, 0x9f, 0xbc, 0x0d, 0xd3, 0xda, 0x22, 0x7f, 0xa2, 0xc0, - 0xbb, 0x39, 0xae, 0x45, 0xc5, 0x24, 0xd0, 0xa4, 0x47, 0xde, 0xb7, 0x00, 0xea, 0x6a, 0x9b, 0x53, - 0xb3, 0xeb, 0x4e, 0x5e, 0xb3, 0x4b, 0x6f, 0xa0, 0xb1, 0xb2, 0xac, 0x8b, 0x42, 0x34, 0x18, 0x93, - 0x5f, 0xe1, 0xb6, 0x78, 0xad, 0xdd, 0x89, 0xe4, 0x06, 0x23, 0xbb, 0x4c, 0x1f, 0xa3, 0x98, 0xc6, - 0xaa, 0x94, 0x01, 0x0a, 0x31, 0x21, 0x84, 0xfd, 0x1a, 0x68, 0x27, 0x57, 0xb6, 0x6c, 0x71, 0x37, - 0xd7, 0x4d, 0x27, 0xda, 0x95, 0x43, 0x50, 0x2f, 0x5b, 0xd7, 0x15, 0x00, 0x63, 0x1c, 0xfb, 0x73, - 0x30, 0xfb, 0x46, 0xe0, 0x74, 0x76, 0x5d, 0x6e, 0xf3, 0x66, 0x67, 0xab, 0x0f, 0xc1, 0xa4, 0xd3, - 0x68, 0x64, 0xe5, 0xcb, 0xa8, 0x88, 0x62, 0x54, 0xf0, 0x81, 0x8e, 0x51, 0xf6, 0xef, 0x5b, 0x40, - 0xe2, 0x7b, 0x43, 0xd7, 0x6b, 0x6e, 0x38, 0x51, 0x7d, 0x97, 0x9d, 0x8f, 0x76, 0x79, 0x69, 0xd6, - 0xf9, 0xe8, 0x86, 0x86, 0xa0, 0x81, 0x45, 0xde, 0x85, 0x69, 0xf1, 0xef, 0x2d, 0x6d, 0x21, 0x18, - 0xdd, 0x57, 0x97, 0x6f, 0x28, 0x5c, 0x26, 0x31, 0x0a, 0x6f, 0xc4, 0x1c, 0xd0, 0x64, 0xc7, 0x9a, - 0x6a, 0xcd, 0xdb, 0x69, 0x75, 0x1f, 0x36, 0xb6, 0xe3, 0xa6, 0xea, 0x04, 0xfe, 0x8e, 0xdb, 0xa2, - 0xe9, 0xa6, 0xda, 0x14, 0xc5, 0xa8, 0xe0, 0x83, 0x35, 0xd5, 0xbf, 0xb1, 0xe0, 0xfc, 0x5a, 0x18, - 0xb9, 0xfe, 0x2a, 0x0d, 0x23, 0xb6, 0xad, 0xb0, 0xc5, 0xa7, 0xdb, 0x1a, 0xc4, 0x5f, 0x7d, 0x15, - 0xe6, 0xe5, 0x1d, 0x66, 0x77, 0x3b, 0xa4, 0x91, 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x92, 0x82, 0x63, - 0x4f, 0x0d, 0x46, 0x45, 0x5e, 0x66, 0xc6, 0x54, 0x0a, 0x49, 0x2a, 0xb5, 0x14, 0x1c, 0x7b, 0x6a, - 0xd8, 0xdf, 0x2d, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0x58, 0x93, 0xaf, 0xf5, 0x8b, 0x35, 0x19, 0x71, - 0x2a, 0x73, 0x5e, 0x27, 0x88, 0x34, 0xf9, 0xbb, 0x16, 0xcc, 0x35, 0x92, 0x2d, 0x9d, 0x8f, 0x4d, - 0x27, 0xab, 0x0f, 0x85, 0xcb, 0x56, 0xaa, 0x10, 0xd3, 0xfc, 0xc9, 0xaf, 0x5a, 0x30, 0x97, 0x14, - 0x53, 0xad, 0xee, 0xa7, 0xd0, 0x48, 0xda, 0xc7, 0x3a, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x0f, - 0xc7, 0x64, 0x97, 0x9e, 0x46, 0x20, 0x05, 0x79, 0x00, 0xa5, 0xa8, 0x15, 0x8a, 0x42, 0xf9, 0xb5, - 0x23, 0x9e, 0x08, 0xb7, 0xd6, 0x6b, 0xc2, 0x7d, 0x20, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, - 0x2f, 0xce, 0xb8, 0xde, 0x91, 0x8c, 0x73, 0x39, 0x8a, 0x6e, 0xad, 0x6c, 0xa6, 0x19, 0xcb, 0x12, - 0xc6, 0x58, 0xf1, 0xb2, 0x7f, 0xcb, 0x82, 0xd2, 0x4d, 0x5f, 0xad, 0x23, 0x3f, 0x9b, 0x83, 0xa1, - 0x47, 0xeb, 0x83, 0xfa, 0x9a, 0x32, 0x3e, 0x62, 0xbc, 0x9e, 0x30, 0xf3, 0x3c, 0x6b, 0xd0, 0x5e, - 0xe2, 0x69, 0xc3, 0x18, 0xa9, 0x9b, 0xfe, 0x76, 0x5f, 0xd3, 0xe3, 0xaf, 0x15, 0xe1, 0xcc, 0x9b, - 0xce, 0x01, 0xf5, 0x22, 0x67, 0xf8, 0x4d, 0xe2, 0x15, 0x98, 0x76, 0x3a, 0xfc, 0x1e, 0xcc, 0xd0, - 0xf1, 0x63, 0xcb, 0x49, 0x0c, 0x42, 0x13, 0x2f, 0x5e, 0xd0, 0x44, 0x54, 0x43, 0xd6, 0x52, 0xb4, - 0x92, 0x82, 0x63, 0x4f, 0x0d, 0x72, 0x13, 0x88, 0x0c, 0xc2, 0xad, 0xd4, 0xeb, 0x7e, 0xd7, 0x13, - 0x4b, 0x9a, 0x30, 0xaa, 0xe8, 0xc3, 0xe6, 0x46, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x9f, 0x85, 0x85, - 0x3a, 0xa7, 0x2c, 0x8f, 0x1e, 0x26, 0x45, 0x71, 0xfc, 0xd4, 0x71, 0x02, 0x2b, 0x7d, 0xf0, 0xb0, - 0x2f, 0x05, 0x26, 0x69, 0x18, 0xf9, 0x81, 0xd3, 0xa4, 0x26, 0xdd, 0x89, 0xa4, 0xa4, 0xb5, 0x1e, - 0x0c, 0xcc, 0xa8, 0x45, 0xbe, 0x00, 0xa5, 0x68, 0x37, 0xa0, 0xe1, 0xae, 0xdf, 0x6a, 0x48, 0xbf, - 0x85, 0x11, 0x2d, 0x6d, 0xb2, 0xf7, 0xb7, 0x14, 0x55, 0x63, 0x78, 0xab, 0x22, 0x8c, 0x79, 0x92, - 0x00, 0x26, 0xc2, 0xba, 0xdf, 0xa1, 0xa1, 0x54, 0xd9, 0x6f, 0xe6, 0xc2, 0x9d, 0x5b, 0x8e, 0x0c, - 0x1b, 0x1f, 0xe7, 0x80, 0x92, 0x93, 0xfd, 0x7b, 0x63, 0x30, 0x63, 0x22, 0x0e, 0xb0, 0x36, 0x7d, - 0xc9, 0x82, 0x99, 0xba, 0xef, 0x45, 0x81, 0xdf, 0x12, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, - 0x95, 0x46, 0x8e, 0xdb, 0x32, 0x4c, 0x61, 0x06, 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb5, 0x60, 0x2e, - 0x76, 0x73, 0x8b, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, 0x97, 0xfa, 0x6b, 0x49, 0x4e, 0x98, 0x66, 0x6d, - 0x6f, 0xc3, 0x7c, 0xba, 0xb7, 0x59, 0x53, 0x76, 0x1c, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0x6e, 0x3a, - 0x61, 0x88, 0x1c, 0x42, 0x5e, 0x84, 0xa9, 0xb6, 0x13, 0x34, 0x5d, 0xcf, 0x69, 0xf1, 0x56, 0x2c, - 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, 0x14, 0x66, 0x36, 0x1c, 0xaf, 0x49, 0x1b, 0x72, - 0x1d, 0x7e, 0x7c, 0x28, 0xdf, 0x9f, 0x8f, 0xc3, 0xb4, 0x71, 0x36, 0x3b, 0xfd, 0x73, 0x56, 0x22, - 0x93, 0x48, 0x21, 0xc7, 0x4c, 0x22, 0x9f, 0x06, 0xd8, 0x71, 0x3d, 0x37, 0xdc, 0x3d, 0x61, 0x8e, - 0x12, 0x7e, 0xaf, 0x7b, 0x5d, 0x53, 0x40, 0x83, 0x5a, 0x7c, 0x79, 0x56, 0x3c, 0x26, 0xe1, 0xd6, - 0xfb, 0x96, 0xb1, 0xdd, 0x4c, 0xe4, 0xe1, 0x2c, 0x60, 0x74, 0xcc, 0x92, 0xda, 0x7e, 0x44, 0x8a, - 0xa5, 0xe3, 0x76, 0xa5, 0x2d, 0x98, 0x0a, 0x68, 0xd8, 0x6d, 0xb3, 0x13, 0xe3, 0xe4, 0xd0, 0xcd, - 0xc0, 0xdd, 0x36, 0x50, 0xd6, 0x47, 0x4d, 0x69, 0xf1, 0x35, 0x38, 0x93, 0x10, 0x61, 0xa8, 0xa4, - 0x4b, 0x3e, 0x64, 0x1a, 0x00, 0x4e, 0x72, 0x99, 0xc3, 0xfa, 0xa2, 0x65, 0x24, 0x29, 0xd1, 0x7d, - 0x21, 0x9c, 0x73, 0x04, 0xcc, 0xfe, 0xe1, 0x04, 0xc8, 0xfb, 0xef, 0x01, 0x96, 0x2b, 0xf3, 0xd6, - 0x6b, 0xec, 0x04, 0xb7, 0x5e, 0x37, 0x61, 0xc6, 0xf5, 0xdc, 0xc8, 0x75, 0x5a, 0xdc, 0xb8, 0x23, - 0xb7, 0x53, 0xe5, 0xbd, 0x3c, 0xb3, 0x66, 0xc0, 0x32, 0xe8, 0x24, 0xea, 0x92, 0x3b, 0x50, 0xe4, - 0xfb, 0x8d, 0x1c, 0xc0, 0xc3, 0x5f, 0xd2, 0x73, 0xff, 0x0c, 0x11, 0xd2, 0x24, 0x28, 0xf1, 0xc3, - 0x87, 0xc8, 0xd2, 0xa2, 0x8f, 0xdf, 0x72, 0x1c, 0xc7, 0x87, 0x8f, 0x14, 0x1c, 0x7b, 0x6a, 0x30, - 0x2a, 0x3b, 0x8e, 0xdb, 0xea, 0x06, 0x34, 0xa6, 0x32, 0x91, 0xa4, 0x72, 0x3d, 0x05, 0xc7, 0x9e, - 0x1a, 0x64, 0x07, 0x66, 0x64, 0x99, 0x70, 0xb9, 0x9a, 0x3c, 0xe1, 0x57, 0x72, 0xd7, 0xba, 0xeb, - 0x06, 0x25, 0x4c, 0xd0, 0x25, 0x5d, 0x38, 0xeb, 0x7a, 0x75, 0xdf, 0xab, 0xb7, 0xba, 0xa1, 0xbb, - 0x4f, 0xe3, 0x78, 0xa2, 0x93, 0x30, 0xbb, 0x70, 0x74, 0x58, 0x3e, 0xbb, 0x96, 0x26, 0x87, 0xbd, - 0x1c, 0xc8, 0x17, 0x2d, 0xb8, 0x50, 0xf7, 0xbd, 0x90, 0xa7, 0x3d, 0xd8, 0xa7, 0xd7, 0x82, 0xc0, - 0x0f, 0x04, 0xef, 0xd2, 0x09, 0x79, 0x73, 0x9b, 0xe2, 0x4a, 0x16, 0x49, 0xcc, 0xe6, 0x44, 0xde, - 0x81, 0xa9, 0x4e, 0xe0, 0xef, 0xbb, 0x0d, 0x1a, 0x48, 0xf7, 0xbd, 0xf5, 0x3c, 0xd2, 0xb0, 0x6c, - 0x4a, 0x9a, 0xf1, 0xd2, 0xa3, 0x4a, 0x50, 0xf3, 0xb3, 0xff, 0xcf, 0x34, 0xcc, 0x26, 0xd1, 0xc9, - 0x2f, 0x00, 0x74, 0x02, 0xbf, 0x4d, 0xa3, 0x5d, 0xaa, 0xe3, 0x42, 0x6e, 0x8d, 0x9a, 0xed, 0x43, - 0xd1, 0x53, 0x2e, 0x2f, 0x6c, 0xb9, 0x88, 0x4b, 0xd1, 0xe0, 0x48, 0x02, 0x98, 0xdc, 0x13, 0xdb, - 0xae, 0xd4, 0x42, 0xde, 0xcc, 0x45, 0x67, 0x92, 0x9c, 0x79, 0x40, 0x83, 0x2c, 0x42, 0xc5, 0x88, - 0x6c, 0x43, 0xe1, 0x01, 0xdd, 0xce, 0x27, 0xd4, 0xfc, 0x1e, 0x95, 0xa7, 0x99, 0xea, 0xe4, 0xd1, - 0x61, 0xb9, 0x70, 0x8f, 0x6e, 0x23, 0x23, 0xce, 0xbe, 0xab, 0x21, 0xee, 0xee, 0xe5, 0x52, 0x31, - 0xe2, 0x77, 0x25, 0x1c, 0x01, 0xc4, 0x77, 0xc9, 0x22, 0x54, 0x8c, 0xc8, 0x3b, 0x50, 0x7a, 0xe0, - 0xec, 0xd3, 0x9d, 0xc0, 0xf7, 0x22, 0xe9, 0x67, 0x35, 0x62, 0xa8, 0xc0, 0x3d, 0x45, 0x4e, 0xf2, - 0xe5, 0xdb, 0xbb, 0x2e, 0xc4, 0x98, 0x1d, 0xd9, 0x87, 0x29, 0x8f, 0x3e, 0x40, 0xda, 0x72, 0xeb, - 0xf9, 0xb8, 0xe6, 0xdf, 0x92, 0xd4, 0x24, 0x67, 0xbe, 0xef, 0xa9, 0x32, 0xd4, 0xbc, 0x58, 0x5f, - 0xde, 0xf7, 0xb7, 0xe5, 0x42, 0x35, 0x62, 0x5f, 0xea, 0x93, 0xa9, 0xe8, 0xcb, 0x9b, 0xfe, 0x36, - 0x32, 0xe2, 0x6c, 0x8e, 0xd4, 0xb5, 0x93, 0x8f, 0x5c, 0xa6, 0x6e, 0xe5, 0xeb, 0xdc, 0x24, 0xe6, - 0x48, 0x5c, 0x8a, 0x06, 0x47, 0xd6, 0xb6, 0x4d, 0x69, 0xac, 0x94, 0x0b, 0xd5, 0x88, 0x6d, 0x9b, - 0x34, 0x7d, 0x8a, 0xb6, 0x55, 0x65, 0xa8, 0x79, 0x31, 0xbe, 0xae, 0xb4, 0xfc, 0xe5, 0xb3, 0x54, - 0x25, 0xed, 0x88, 0x82, 0xaf, 0x2a, 0x43, 0xcd, 0x8b, 0xb5, 0x77, 0xb8, 0x77, 0xf0, 0xc0, 0x69, - 0xed, 0xb9, 0x5e, 0x53, 0xc6, 0x39, 0x8e, 0x9a, 0xd4, 0x77, 0xef, 0xe0, 0x9e, 0xa0, 0x67, 0xb6, - 0x77, 0x5c, 0x8a, 0x06, 0x47, 0xf2, 0x8f, 0x2c, 0x98, 0xe8, 0xb4, 0xba, 0x4d, 0xd7, 0x5b, 0x98, - 0xe1, 0x7a, 0xe2, 0xa7, 0xf2, 0x5c, 0xa1, 0x97, 0x36, 0x39, 0x69, 0xa1, 0x28, 0xfe, 0xb4, 0xf6, - 0xd9, 0xe3, 0x85, 0xbf, 0xf4, 0x67, 0xe5, 0x05, 0xea, 0xd5, 0xfd, 0x86, 0xeb, 0x35, 0x97, 0xef, - 0x87, 0xbe, 0xb7, 0x84, 0xce, 0x03, 0xa5, 0xa3, 0x4b, 0x99, 0x16, 0x3f, 0x0e, 0xd3, 0x06, 0x89, - 0xc7, 0x29, 0x7a, 0x33, 0xa6, 0xa2, 0xf7, 0x5b, 0x13, 0x30, 0x63, 0x26, 0x12, 0x1c, 0x40, 0xfb, - 0xd2, 0x27, 0x8e, 0xb1, 0x61, 0x4e, 0x1c, 0xec, 0x88, 0x69, 0xdc, 0x1e, 0x29, 0xf3, 0xd6, 0x5a, - 0x6e, 0x0a, 0x77, 0x7c, 0xc4, 0x34, 0x0a, 0x43, 0x4c, 0x30, 0x1d, 0xc2, 0xa1, 0x84, 0xa9, 0xad, - 0x42, 0xb1, 0x2b, 0x26, 0xd5, 0xd6, 0x84, 0xaa, 0x76, 0x15, 0x20, 0x4e, 0xa8, 0x27, 0x6f, 0x15, - 0xb5, 0x3e, 0x6c, 0x24, 0xfa, 0x33, 0xb0, 0xc8, 0x0b, 0x30, 0xc1, 0x54, 0x1f, 0xda, 0x90, 0x61, - 0xd8, 0xfa, 0x1c, 0x7f, 0x9d, 0x97, 0xa2, 0x84, 0x92, 0x57, 0x99, 0x96, 0x1a, 0x2b, 0x2c, 0x32, - 0xba, 0xfa, 0x7c, 0xac, 0xa5, 0xc6, 0x30, 0x4c, 0x60, 0x32, 0xd1, 0x29, 0xd3, 0x2f, 0xf8, 0xda, - 0x60, 0x88, 0xce, 0x95, 0x0e, 0x14, 0x30, 0x6e, 0x57, 0x4a, 0xe9, 0x23, 0x7c, 0x4e, 0x17, 0x0d, - 0xbb, 0x52, 0x0a, 0x8e, 0x3d, 0x35, 0xd8, 0xc7, 0xc8, 0x0b, 0xd1, 0x69, 0xe1, 0x6c, 0xdb, 0xe7, - 0x2a, 0xf3, 0xcb, 0xe6, 0x59, 0x2b, 0xc7, 0x39, 0x24, 0x46, 0xed, 0xe0, 0x87, 0xad, 0xd1, 0x8e, - 0x45, 0x9f, 0x83, 0xd9, 0xe4, 0x2e, 0x94, 0xfb, 0xcd, 0xc7, 0x57, 0xc6, 0xe1, 0xdc, 0xad, 0xa6, - 0xeb, 0xa5, 0x93, 0x64, 0x65, 0xe5, 0x48, 0xb7, 0x86, 0xce, 0x91, 0xae, 0xe3, 0xb9, 0x64, 0x06, - 0xf2, 0xec, 0x78, 0x2e, 0x95, 0x0e, 0x3e, 0x89, 0x4b, 0xfe, 0xd4, 0x82, 0x67, 0x9d, 0x86, 0x38, - 0x17, 0x38, 0x2d, 0x59, 0x6a, 0xa4, 0xf6, 0x95, 0x33, 0x3a, 0x1c, 0x71, 0x97, 0xef, 0xfd, 0xf8, - 0xa5, 0xca, 0x31, 0x5c, 0x45, 0x8f, 0xff, 0x94, 0xfc, 0x82, 0x67, 0x8f, 0x43, 0xc5, 0x63, 0xc5, - 0x27, 0x7f, 0x03, 0xe6, 0x12, 0x1f, 0x2c, 0x2d, 0xe1, 0x25, 0x71, 0x61, 0x51, 0x4b, 0x82, 0x30, - 0x8d, 0xbb, 0x78, 0x1b, 0x3e, 0xf8, 0x58, 0x39, 0x87, 0x1a, 0x6c, 0xdf, 0xb1, 0x60, 0xc6, 0xcc, - 0x67, 0x43, 0x5e, 0x84, 0xa9, 0xc8, 0xdf, 0xa3, 0xde, 0xdd, 0x40, 0x39, 0x7b, 0xea, 0x81, 0xbe, - 0xc5, 0xcb, 0x71, 0x1d, 0x35, 0x06, 0xc3, 0xae, 0xb7, 0x5c, 0xea, 0x45, 0x6b, 0x0d, 0xd9, 0xcd, - 0x1a, 0x7b, 0x45, 0x94, 0xaf, 0xa2, 0xc6, 0x10, 0x0e, 0x6c, 0xec, 0x77, 0x8d, 0xd6, 0x03, 0xaa, - 0x5c, 0xc3, 0x0d, 0x07, 0xb6, 0x18, 0x86, 0x09, 0x4c, 0x62, 0x6b, 0x13, 0xe7, 0x78, 0x7c, 0xaf, - 0x91, 0x32, 0x49, 0x7e, 0xc9, 0x82, 0x92, 0x30, 0xd1, 0x23, 0xdd, 0x49, 0xf9, 0x93, 0xa6, 0x8c, - 0x08, 0x95, 0xcd, 0xb5, 0x0c, 0x7f, 0x52, 0xb6, 0x2d, 0xed, 0xb9, 0x9e, 0xfa, 0x12, 0xbd, 0x2d, - 0xbd, 0xe9, 0x7a, 0x0d, 0xe4, 0x10, 0xbd, 0x71, 0x15, 0xfa, 0x9a, 0xce, 0x7e, 0xdd, 0x82, 0x59, - 0x1e, 0xce, 0x1b, 0x1f, 0x6f, 0x5f, 0xd1, 0x7e, 0x53, 0x42, 0x8c, 0x4b, 0x49, 0xbf, 0xa9, 0x47, - 0x87, 0xe5, 0x69, 0x11, 0x00, 0x9c, 0x74, 0xa3, 0xfa, 0x8c, 0xb4, 0x89, 0x71, 0xef, 0xae, 0xb1, - 0xa1, 0x4d, 0x36, 0xda, 0x66, 0x5c, 0x53, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x0b, 0x33, 0x66, 0x5c, - 0x0e, 0x79, 0x05, 0xa6, 0x3b, 0xae, 0xd7, 0x4c, 0xc6, 0x6f, 0xea, 0x7b, 0x83, 0xcd, 0x18, 0x84, - 0x26, 0x1e, 0xaf, 0xe6, 0xc7, 0xd5, 0x52, 0xd7, 0x0d, 0x9b, 0xbe, 0x59, 0x2d, 0xfe, 0xc3, 0xb3, - 0xa4, 0x67, 0xc4, 0x7f, 0xe5, 0x9e, 0x25, 0x3d, 0x83, 0xc7, 0x8f, 0x2e, 0x4b, 0x7a, 0x96, 0x30, - 0xff, 0x6f, 0x65, 0x49, 0xff, 0x19, 0x18, 0x36, 0x3d, 0x26, 0xdb, 0xba, 0x1f, 0x98, 0x31, 0xf6, - 0xba, 0xc5, 0x65, 0x90, 0xbd, 0x84, 0xda, 0xdf, 0x2e, 0xc0, 0x7c, 0xfa, 0x04, 0x9f, 0xb7, 0x73, - 0x04, 0xf9, 0xaa, 0x05, 0xb3, 0x4e, 0x22, 0x15, 0x59, 0x4e, 0x4f, 0xae, 0x24, 0x68, 0x1a, 0xa9, - 0xb0, 0x12, 0xe5, 0x98, 0xe2, 0x4d, 0xfe, 0x0a, 0x4c, 0x46, 0x6e, 0x9b, 0xfa, 0x5d, 0x61, 0xd7, - 0x2b, 0x88, 0xf3, 0xf5, 0x96, 0x28, 0x42, 0x05, 0x63, 0x6b, 0xac, 0xcb, 0x15, 0xa2, 0x80, 0x4a, - 0x2f, 0xda, 0xf9, 0xd8, 0x10, 0x29, 0xca, 0x51, 0x63, 0x90, 0x87, 0x30, 0x29, 0xdc, 0x28, 0x94, - 0xbf, 0xcc, 0x46, 0x4e, 0x96, 0x06, 0xe1, 0xa9, 0x11, 0x77, 0x81, 0xf8, 0x1f, 0xa2, 0x62, 0x67, - 0x7f, 0x14, 0x86, 0xcc, 0x17, 0x6a, 0x5f, 0x03, 0x82, 0x7e, 0xab, 0xb5, 0xed, 0xd4, 0xf7, 0xee, - 0xb9, 0x5e, 0xc3, 0x7f, 0xc0, 0x97, 0xa2, 0x65, 0x28, 0x05, 0x32, 0x7a, 0x32, 0x94, 0xa3, 0x46, - 0xaf, 0x65, 0x2a, 0xac, 0x32, 0xc4, 0x18, 0xc7, 0xfe, 0xc3, 0x31, 0x98, 0x94, 0xa1, 0xbe, 0x4f, - 0xc0, 0x8b, 0x7f, 0x2f, 0x71, 0xbd, 0xbb, 0x96, 0x4b, 0x84, 0x72, 0x5f, 0x17, 0xfe, 0x30, 0xe5, - 0xc2, 0xff, 0x66, 0x3e, 0xec, 0x8e, 0xf7, 0xdf, 0xff, 0x83, 0x22, 0xcc, 0xa5, 0x42, 0xa7, 0x99, - 0x6a, 0xdd, 0xe3, 0xb6, 0x7a, 0x37, 0xd7, 0xe8, 0x6c, 0x1d, 0x96, 0x72, 0xbc, 0x07, 0x6b, 0x98, - 0xc8, 0xee, 0x7c, 0x27, 0xb7, 0x87, 0x2b, 0x7e, 0x92, 0xe8, 0x79, 0x48, 0x8f, 0x4c, 0xf2, 0x4d, - 0x0b, 0xce, 0x39, 0xbd, 0x2f, 0x7f, 0x48, 0x13, 0xe0, 0x9d, 0xdc, 0x9f, 0x14, 0xa9, 0x3e, 0x23, - 0x85, 0xcc, 0x7a, 0x60, 0x05, 0xb3, 0x44, 0xb1, 0xff, 0xb3, 0x05, 0x4f, 0xf7, 0x4d, 0x02, 0xc0, - 0x73, 0x48, 0x05, 0x49, 0xa8, 0x5c, 0x33, 0x72, 0x4e, 0x75, 0xa2, 0xaf, 0x83, 0xd3, 0x69, 0x7f, - 0xd2, 0xec, 0xc9, 0xcb, 0x30, 0xc3, 0x75, 0x34, 0xb6, 0x7a, 0x46, 0xb4, 0x23, 0x6f, 0xb3, 0xf8, - 0xbd, 0x46, 0xcd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x4d, 0x0b, 0x16, 0xfa, 0x65, 0x14, 0x1a, 0xc0, - 0xd6, 0xf2, 0xd7, 0x53, 0x91, 0x10, 0xe5, 0x9e, 0x48, 0x88, 0x94, 0xb5, 0x45, 0x05, 0x3d, 0x18, - 0x86, 0x8e, 0xc2, 0x63, 0x1c, 0xfd, 0xbf, 0x66, 0xc1, 0xc5, 0x3e, 0x13, 0xbe, 0x27, 0x22, 0xc6, - 0x3a, 0x71, 0x44, 0xcc, 0xd8, 0xa0, 0x11, 0x31, 0xf6, 0x1f, 0x15, 0x60, 0x5e, 0xca, 0x13, 0x2b, - 0xea, 0xaf, 0x26, 0xe2, 0x49, 0x7e, 0x2a, 0x15, 0x4f, 0x72, 0x3e, 0x8d, 0xff, 0x93, 0x60, 0x92, - 0x1f, 0xaf, 0x60, 0x92, 0xbf, 0x18, 0x83, 0x0b, 0x99, 0x89, 0x8e, 0xc8, 0x57, 0x32, 0x76, 0xaf, - 0x7b, 0x39, 0x67, 0x54, 0x1a, 0x70, 0xff, 0x1a, 0x35, 0x02, 0xe3, 0x57, 0xcd, 0xc8, 0x07, 0xb1, - 0x1b, 0xed, 0x9c, 0x42, 0x6e, 0xa8, 0x21, 0x83, 0x20, 0xec, 0x5f, 0x2a, 0xc0, 0x95, 0x41, 0x09, - 0xfd, 0x98, 0x06, 0xc9, 0x85, 0x89, 0x20, 0xb9, 0x27, 0xa4, 0x59, 0x9c, 0x4a, 0xbc, 0xdc, 0x3f, - 0x19, 0xd7, 0xdb, 0x5e, 0xef, 0xf8, 0x1c, 0xc8, 0xf5, 0x61, 0x92, 0x69, 0x9f, 0x2a, 0x47, 0x74, - 0xbc, 0x14, 0x4e, 0xd6, 0x44, 0xf1, 0xa3, 0xc3, 0xf2, 0xd9, 0x38, 0xdd, 0x86, 0x2c, 0x44, 0x55, - 0x89, 0x5c, 0x81, 0xa9, 0x40, 0x40, 0x55, 0x58, 0x90, 0xf4, 0x1f, 0x11, 0x65, 0xa8, 0xa1, 0xe4, - 0x0b, 0x86, 0xba, 0x3e, 0x7e, 0x5a, 0x59, 0x65, 0x8e, 0x73, 0x8b, 0x79, 0x1b, 0xa6, 0x42, 0x95, - 0xc8, 0x58, 0x28, 0x2e, 0x2f, 0x0d, 0x18, 0x6d, 0xc6, 0xce, 0xe0, 0x2a, 0xab, 0xb1, 0xf8, 0x3e, - 0x9d, 0xf3, 0x58, 0x93, 0x24, 0xb6, 0x3e, 0xfe, 0x0a, 0xb3, 0x3d, 0xf4, 0x1e, 0x7d, 0x49, 0x04, - 0x93, 0xf2, 0x7d, 0x4b, 0x79, 0x9f, 0xb8, 0x91, 0x53, 0x64, 0x89, 0xf4, 0x3b, 0xe6, 0xa7, 0x4a, - 0x65, 0x86, 0x51, 0xac, 0xec, 0xef, 0x59, 0x30, 0x2d, 0xc7, 0xc8, 0x13, 0x08, 0xbb, 0xbb, 0x9f, - 0x0c, 0xbb, 0xbb, 0x96, 0xcb, 0x8a, 0xd5, 0x27, 0xe6, 0xee, 0x3e, 0xcc, 0x98, 0x19, 0xf6, 0xc8, - 0xa7, 0x8d, 0x15, 0xd7, 0x1a, 0x25, 0x67, 0x95, 0x5a, 0x93, 0xe3, 0xd5, 0xd8, 0xfe, 0xed, 0x92, - 0x6e, 0x45, 0x7e, 0x76, 0x35, 0x47, 0xbe, 0x75, 0xec, 0xc8, 0x37, 0x07, 0xde, 0x58, 0xfe, 0x03, - 0xef, 0x0e, 0x4c, 0xa9, 0x65, 0x51, 0x2a, 0x0f, 0xcf, 0x9b, 0x8e, 0xc8, 0x4c, 0x03, 0x61, 0xc4, - 0x8c, 0xe9, 0xc2, 0xcf, 0xa0, 0xb1, 0xad, 0x57, 0x2d, 0xd7, 0x9a, 0x0c, 0x79, 0x07, 0xa6, 0x1f, - 0xf8, 0xc1, 0x5e, 0xcb, 0x77, 0x78, 0xf6, 0x78, 0xc8, 0xe3, 0xee, 0x5b, 0xdb, 0x6b, 0x45, 0x34, - 0xc8, 0xbd, 0x98, 0x3e, 0x9a, 0xcc, 0x48, 0x05, 0xe6, 0xda, 0xae, 0x87, 0xd4, 0x69, 0xe8, 0xe8, - 0xba, 0x71, 0x91, 0xb9, 0x59, 0xa9, 0xd6, 0x1b, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0xf1, 0x27, 0x48, - 0x58, 0x1b, 0x64, 0x7a, 0xd6, 0xcd, 0xd1, 0x07, 0x63, 0xd2, 0x82, 0x21, 0xc2, 0x21, 0x92, 0xe5, - 0x98, 0xe2, 0x4d, 0x3e, 0x0f, 0x53, 0xa1, 0x4c, 0x9f, 0x97, 0x8f, 0xd3, 0x84, 0x3e, 0xdb, 0x0b, - 0xa2, 0x71, 0x57, 0xaa, 0x12, 0xd4, 0x0c, 0xc9, 0x3a, 0x9c, 0x57, 0xe6, 0x93, 0xc4, 0x0b, 0x5f, - 0x13, 0x71, 0xb6, 0x25, 0xcc, 0x80, 0x63, 0x66, 0x2d, 0xa6, 0xca, 0xf1, 0xcc, 0x95, 0xe2, 0xae, - 0xd1, 0xb8, 0x9e, 0xe3, 0xf3, 0xaf, 0x81, 0x12, 0x7a, 0x5c, 0xf0, 0xe8, 0xd4, 0x08, 0xc1, 0xa3, - 0x35, 0xb8, 0x90, 0x06, 0xf1, 0x34, 0x5a, 0x3c, 0x73, 0x97, 0xb1, 0x85, 0x6e, 0x66, 0x21, 0x61, - 0x76, 0x5d, 0x72, 0x0f, 0x4a, 0x01, 0xe5, 0x87, 0xac, 0x8a, 0x72, 0xd3, 0x1a, 0xda, 0x21, 0x15, - 0x15, 0x01, 0x8c, 0x69, 0xb1, 0x7e, 0x77, 0x92, 0xb9, 0x94, 0xef, 0xe4, 0xf8, 0xb4, 0xac, 0xec, - 0xfb, 0x3e, 0xe9, 0xed, 0xec, 0x7f, 0x3b, 0x07, 0x67, 0x12, 0x36, 0x20, 0xf2, 0x3c, 0x14, 0x79, - 0x5e, 0x31, 0xbe, 0x5a, 0x4d, 0xc5, 0x2b, 0xaa, 0x68, 0x1c, 0x01, 0x23, 0xbf, 0x6c, 0xc1, 0x5c, - 0x27, 0x71, 0xa7, 0xa1, 0x16, 0xf2, 0x11, 0x0d, 0xa7, 0xc9, 0x8b, 0x12, 0xe3, 0x15, 0x82, 0x24, - 0x33, 0x4c, 0x73, 0x67, 0xeb, 0x81, 0xf4, 0xea, 0x6e, 0xd1, 0x80, 0x63, 0x4b, 0x45, 0x4f, 0x93, - 0x58, 0x49, 0x82, 0x31, 0x8d, 0xcf, 0x7a, 0x98, 0x7f, 0xdd, 0x28, 0x8f, 0x17, 0x56, 0x14, 0x01, - 0x8c, 0x69, 0x91, 0xd7, 0x61, 0x56, 0xa6, 0xd0, 0xdd, 0xf4, 0x1b, 0x37, 0x9c, 0x70, 0x57, 0x9e, - 0x70, 0xf4, 0x89, 0x6c, 0x25, 0x01, 0xc5, 0x14, 0x36, 0xff, 0xb6, 0x38, 0x4f, 0x31, 0x27, 0x30, - 0x91, 0x7c, 0xa4, 0x61, 0x25, 0x09, 0xc6, 0x34, 0x3e, 0x79, 0xd1, 0xd8, 0x86, 0xc4, 0xfd, 0xbf, - 0x5e, 0x0d, 0x32, 0xb6, 0xa2, 0x0a, 0xcc, 0x75, 0xf9, 0x81, 0xb0, 0xa1, 0x80, 0x72, 0x3e, 0x6a, - 0x86, 0x77, 0x93, 0x60, 0x4c, 0xe3, 0x93, 0xd7, 0xe0, 0x4c, 0xc0, 0x16, 0x5b, 0x4d, 0x40, 0x38, - 0x05, 0xe8, 0x3b, 0x5f, 0x34, 0x81, 0x98, 0xc4, 0x25, 0x6f, 0xc0, 0xd9, 0x38, 0xe3, 0xa4, 0x22, - 0x20, 0xbc, 0x04, 0x74, 0xfa, 0xb3, 0x4a, 0x1a, 0x01, 0x7b, 0xeb, 0x90, 0xbf, 0x05, 0xf3, 0x46, - 0x4b, 0xac, 0x79, 0x0d, 0xfa, 0x50, 0x66, 0x05, 0xe4, 0x8f, 0x0e, 0xad, 0xa4, 0x60, 0xd8, 0x83, - 0x4d, 0x3e, 0x01, 0xb3, 0x75, 0xbf, 0xd5, 0xe2, 0x6b, 0x9c, 0x78, 0x20, 0x40, 0xa4, 0xff, 0x13, - 0x89, 0x12, 0x13, 0x10, 0x4c, 0x61, 0x92, 0x9b, 0x40, 0xfc, 0x6d, 0xa6, 0x5e, 0xd1, 0xc6, 0x1b, - 0xe2, 0x75, 0x7c, 0xa6, 0x71, 0x9c, 0x49, 0xc6, 0x94, 0xdc, 0xee, 0xc1, 0xc0, 0x8c, 0x5a, 0x3c, - 0x7b, 0x9a, 0x11, 0x83, 0x3b, 0x9b, 0xc7, 0x43, 0x7e, 0x69, 0xf3, 0xc5, 0x63, 0x03, 0x70, 0x03, - 0x98, 0x10, 0x21, 0x3e, 0xf9, 0xe4, 0x01, 0x34, 0x73, 0x85, 0xc7, 0x7b, 0x84, 0x28, 0x45, 0xc9, - 0x89, 0xfc, 0x02, 0x94, 0xb6, 0xd5, 0xc3, 0x11, 0x3c, 0xf9, 0xdf, 0xc8, 0xfb, 0x62, 0xea, 0x0d, - 0x94, 0xf8, 0x78, 0xae, 0x01, 0x18, 0xb3, 0x24, 0x2f, 0xc0, 0xf4, 0x8d, 0xcd, 0x8a, 0x1e, 0x85, - 0x67, 0x79, 0xef, 0x8f, 0xb3, 0x2a, 0x68, 0x02, 0xd8, 0x0c, 0xd3, 0xea, 0x1b, 0x49, 0x5e, 0x7c, - 0x67, 0x68, 0x63, 0x0c, 0x9b, 0xdf, 0xe4, 0x63, 0x6d, 0xe1, 0x5c, 0x0a, 0x5b, 0x96, 0xa3, 0xc6, - 0x20, 0x6f, 0xc3, 0xb4, 0xdc, 0x2f, 0xf8, 0xda, 0x74, 0xfe, 0x64, 0xf1, 0xdd, 0x18, 0x93, 0x40, - 0x93, 0x1e, 0xbf, 0xb3, 0xe5, 0xf9, 0xf4, 0xe9, 0xf5, 0x6e, 0xab, 0xb5, 0x70, 0x81, 0xaf, 0x9b, - 0xf1, 0x9d, 0x6d, 0x0c, 0x42, 0x13, 0x8f, 0xbc, 0xa4, 0x3c, 0xb2, 0x3e, 0x90, 0xb8, 0xc4, 0xd6, - 0x1e, 0x59, 0x5a, 0xe9, 0xee, 0x13, 0x02, 0x72, 0xf1, 0x31, 0xae, 0x50, 0xdb, 0xb0, 0xa8, 0x34, - 0xbe, 0xde, 0x49, 0xb2, 0xb0, 0x90, 0x30, 0x95, 0x2c, 0xde, 0xeb, 0x8b, 0x89, 0xc7, 0x50, 0x21, - 0xdb, 0x50, 0x70, 0x5a, 0xdb, 0x0b, 0x4f, 0xe7, 0xa1, 0xba, 0x56, 0xd6, 0xab, 0x72, 0x44, 0x71, - 0xb7, 0xcd, 0xca, 0x7a, 0x15, 0x19, 0x71, 0xe2, 0xc2, 0xb8, 0xd3, 0xda, 0x0e, 0x17, 0x16, 0xf9, - 0x9c, 0xcd, 0x8d, 0x49, 0x6c, 0x3c, 0x58, 0xaf, 0x86, 0xc8, 0x59, 0xd8, 0x5f, 0x1c, 0xd3, 0x17, - 0x35, 0x3a, 0x15, 0xf3, 0xbb, 0xe6, 0x04, 0xb2, 0xf2, 0x78, 0xe0, 0xbd, 0xe7, 0x21, 0x17, 0xb1, - 0xf7, 0x65, 0x4e, 0x9f, 0x8e, 0x5e, 0x32, 0x72, 0x49, 0x72, 0x95, 0x4c, 0x33, 0x2d, 0x4e, 0xcf, - 0xc9, 0x05, 0xc3, 0xfe, 0x36, 0x68, 0xa3, 0x5f, 0xca, 0x9b, 0x29, 0x80, 0xa2, 0x1b, 0x46, 0xae, - 0x9f, 0x63, 0xd8, 0x73, 0x2a, 0x3f, 0x33, 0x8f, 0xaa, 0xe0, 0x00, 0x14, 0xac, 0x18, 0x4f, 0xaf, - 0xe9, 0x7a, 0x0f, 0xe5, 0xe7, 0xdf, 0xc9, 0xdd, 0x4d, 0x49, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, - 0x7d, 0x31, 0xa8, 0xf3, 0x79, 0xcc, 0x7f, 0xbd, 0x9a, 0xe2, 0x97, 0x1c, 0xdc, 0xf7, 0xa1, 0x10, - 0xb6, 0x5d, 0xa9, 0x2e, 0x8d, 0xc8, 0xab, 0xb6, 0xb1, 0x96, 0xc5, 0xab, 0xb6, 0xb1, 0x86, 0x8c, - 0x09, 0xf9, 0xb2, 0x05, 0xe0, 0xb4, 0xb7, 0x9d, 0x30, 0x74, 0x1a, 0xda, 0x3a, 0x33, 0xe2, 0xbb, - 0x0b, 0x15, 0x4d, 0x2f, 0xc5, 0x9a, 0x3b, 0xe6, 0xc6, 0x50, 0x34, 0x38, 0x93, 0x77, 0x60, 0xd2, - 0x11, 0x0f, 0xdb, 0x49, 0x1f, 0xf3, 0x7c, 0x5e, 0x6b, 0x4c, 0x49, 0xc0, 0xcd, 0x34, 0x12, 0x84, - 0x8a, 0x21, 0xe3, 0x1d, 0x05, 0x0e, 0xdd, 0x71, 0xf7, 0xa4, 0x71, 0xa8, 0x36, 0xf2, 0xd3, 0x0b, - 0x8c, 0x58, 0x16, 0x6f, 0x09, 0x42, 0xc5, 0x50, 0x3c, 0x34, 0xee, 0x78, 0x8e, 0x8e, 0x1c, 0xcc, - 0x27, 0xbe, 0xd4, 0x8c, 0x45, 0x34, 0x1e, 0x1a, 0x37, 0x19, 0x61, 0x92, 0x2f, 0xd9, 0x87, 0x09, - 0x87, 0x3f, 0xb9, 0x29, 0x8f, 0x62, 0x98, 0xc7, 0xf3, 0x9d, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, - 0xd8, 0x53, 0x72, 0x23, 0xbf, 0x61, 0xc1, 0xa4, 0x70, 0x7f, 0x66, 0x0a, 0x29, 0xfb, 0xf6, 0xcf, - 0x9d, 0x42, 0x9e, 0x77, 0xe9, 0x9a, 0x2d, 0x3d, 0x80, 0x3e, 0xac, 0x7d, 0x3b, 0x45, 0xe9, 0xb1, - 0xce, 0xd9, 0x4a, 0xba, 0xc5, 0x4f, 0xc0, 0x8c, 0x49, 0x65, 0x28, 0xf7, 0xec, 0x1f, 0x14, 0x00, - 0x78, 0x43, 0x8b, 0x5c, 0x21, 0x6d, 0x9e, 0x94, 0x76, 0xd7, 0x6f, 0xe4, 0xf4, 0x3c, 0x9f, 0x91, - 0xf2, 0x03, 0x64, 0x06, 0xda, 0x5d, 0xbf, 0x81, 0x92, 0x09, 0x69, 0xc2, 0x78, 0xc7, 0x89, 0x76, - 0xf3, 0xcf, 0x2f, 0x32, 0x25, 0x82, 0x66, 0xa3, 0x5d, 0xe4, 0x0c, 0xc8, 0x7b, 0x56, 0xec, 0x1a, - 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xb5, 0xd9, 0x92, 0x74, 0x86, 0x11, 0x3d, 0xd8, 0xd7, 0x45, 0x66, - 0xf1, 0x7d, 0x0b, 0x66, 0x4c, 0xd4, 0x8c, 0x6e, 0xfa, 0x39, 0xb3, 0x9b, 0xf2, 0x6c, 0x0f, 0xb3, - 0xc7, 0xff, 0x9b, 0x05, 0xc6, 0xe3, 0xf7, 0xb1, 0x17, 0xba, 0x35, 0xb0, 0x17, 0xfa, 0xd8, 0x90, - 0x5e, 0xe8, 0x85, 0xa1, 0xbc, 0xd0, 0xc7, 0x87, 0xf7, 0x42, 0x2f, 0xf6, 0xf7, 0x42, 0xb7, 0xbf, - 0x6e, 0xc1, 0xd9, 0x9e, 0xdd, 0x86, 0xe9, 0xc1, 0x81, 0xef, 0x47, 0x7d, 0x5c, 0x1e, 0x31, 0x06, - 0xa1, 0x89, 0x47, 0x56, 0x61, 0x5e, 0x3e, 0xc1, 0x50, 0xeb, 0xb4, 0xdc, 0xcc, 0xdc, 0x2f, 0x5b, - 0x29, 0x38, 0xf6, 0xd4, 0xb0, 0xbf, 0x6d, 0xc1, 0xb4, 0x11, 0x31, 0xce, 0xbe, 0x83, 0xbb, 0xb1, - 0x4a, 0x31, 0xe2, 0xd7, 0x27, 0xf8, 0x45, 0x95, 0x80, 0x89, 0x3b, 0xd3, 0xa6, 0x91, 0xa0, 0x3b, - 0xbe, 0x33, 0x65, 0xa5, 0x28, 0xa1, 0x22, 0xf5, 0x32, 0xed, 0xf0, 0x46, 0x2f, 0x98, 0xa9, 0x97, - 0x69, 0x07, 0x39, 0x84, 0xb3, 0x63, 0x07, 0x02, 0x19, 0xa0, 0x60, 0x3c, 0x76, 0xe1, 0x04, 0x11, - 0x0a, 0x18, 0xb9, 0x04, 0x05, 0xea, 0x35, 0xa4, 0xf5, 0x42, 0x3f, 0x47, 0x79, 0xcd, 0x6b, 0x20, - 0x2b, 0xb7, 0x6f, 0xc3, 0x8c, 0xf0, 0xce, 0x7d, 0x93, 0x1e, 0x0c, 0xfc, 0xbe, 0x25, 0x1b, 0xed, - 0xa9, 0xf7, 0x2d, 0x59, 0x75, 0x56, 0x6e, 0xff, 0x33, 0x0b, 0x52, 0x2f, 0xb2, 0x18, 0xf7, 0x27, - 0x56, 0xdf, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x76, 0xac, 0xcd, 0xfd, 0x26, 0x90, 0x36, 0x9b, 0x0a, - 0x89, 0xf7, 0x87, 0xa4, 0xe1, 0x28, 0xce, 0x4f, 0xd1, 0x83, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x2a, - 0x84, 0x35, 0xdf, 0x68, 0x79, 0x7c, 0x03, 0x74, 0xa1, 0xc8, 0x49, 0x49, 0xeb, 0xd9, 0x88, 0x96, - 0xe7, 0xde, 0x3c, 0x4f, 0x71, 0x47, 0xca, 0x29, 0xcf, 0xb9, 0xd9, 0x7f, 0x24, 0x64, 0x35, 0x1e, - 0x71, 0x19, 0x40, 0xd6, 0x76, 0x52, 0xd6, 0x1b, 0x79, 0xad, 0x95, 0xd9, 0x32, 0x92, 0x25, 0x80, - 0x0e, 0x0d, 0xea, 0xd4, 0x8b, 0x54, 0xdc, 0x4c, 0x51, 0x46, 0x70, 0xea, 0x52, 0x34, 0x30, 0xec, - 0xaf, 0xb1, 0x09, 0x14, 0xbf, 0xfc, 0x4a, 0xae, 0xa4, 0x7d, 0x45, 0xd3, 0x93, 0x43, 0xbb, 0x8a, - 0x1a, 0xd1, 0x14, 0x63, 0x8f, 0x89, 0xa6, 0xf8, 0x10, 0x4c, 0x06, 0x7e, 0x8b, 0x56, 0x02, 0x2f, - 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa1, 0x82, 0xdb, 0xbf, 0x66, 0xc1, 0x7c, 0x3a, 0xdc, 0x2b, - 0x77, 0x07, 0x56, 0x33, 0x26, 0xbd, 0x30, 0x7c, 0x4c, 0xba, 0xfd, 0x1e, 0x13, 0x32, 0x72, 0xeb, - 0x7b, 0xae, 0x27, 0xc2, 0xb8, 0x59, 0xcb, 0x7d, 0x08, 0x26, 0xa9, 0x7c, 0xc1, 0x52, 0x18, 0x81, - 0xb5, 0x90, 0xea, 0xe1, 0x4a, 0x05, 0x27, 0x15, 0x98, 0x53, 0x57, 0x5f, 0xca, 0x72, 0x2f, 0xd2, - 0x4f, 0x68, 0x4b, 0xe1, 0x6a, 0x12, 0x8c, 0x69, 0x7c, 0xfb, 0x0b, 0x30, 0x6d, 0x6c, 0x4a, 0x7c, - 0xfd, 0x7e, 0xe8, 0xd4, 0xa3, 0xf4, 0xba, 0x77, 0x8d, 0x15, 0xa2, 0x80, 0xf1, 0x0b, 0x06, 0x11, - 0x8d, 0x92, 0x5a, 0xf7, 0x64, 0x0c, 0x8a, 0x84, 0x32, 0x62, 0x01, 0x6d, 0xd2, 0x87, 0x2a, 0x7f, - 0xba, 0x22, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x11, 0xa6, 0x54, 0x92, 0x20, 0x9e, 0x69, 0x43, - 0x19, 0xbf, 0xcd, 0x4c, 0x1b, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, 0xc1, 0x94, 0xca, 0x65, 0xf4, - 0x78, 0x6c, 0xb6, 0x14, 0x85, 0x9e, 0x7b, 0xc3, 0x0f, 0x23, 0x95, 0x80, 0x49, 0xdc, 0xcf, 0xdd, - 0x5a, 0xe3, 0x65, 0xa8, 0xa1, 0xf6, 0x4b, 0x30, 0x97, 0xba, 0xa7, 0x1d, 0x20, 0x2d, 0xc7, 0xef, - 0x15, 0x60, 0xc6, 0xbc, 0xae, 0x1b, 0x60, 0x16, 0x0f, 0xbe, 0x38, 0x66, 0x5c, 0xb1, 0x15, 0x86, - 0xbc, 0x62, 0x33, 0xef, 0x34, 0xc7, 0x4f, 0xf7, 0x4e, 0xb3, 0x98, 0xcf, 0x9d, 0xa6, 0x71, 0xf7, - 0x3e, 0xf1, 0xe4, 0xee, 0xde, 0x7f, 0xa7, 0x08, 0xb3, 0xc9, 0x3c, 0x8f, 0x03, 0xf4, 0xe4, 0x8b, - 0x3d, 0x3d, 0x39, 0xa4, 0x4d, 0xbf, 0x30, 0xaa, 0x4d, 0x7f, 0x7c, 0x54, 0x9b, 0x7e, 0xf1, 0x04, - 0x36, 0xfd, 0x5e, 0x8b, 0xfc, 0xc4, 0xc0, 0x16, 0xf9, 0x4f, 0x6a, 0xaf, 0xbc, 0xc9, 0x84, 0x1b, - 0x4b, 0xec, 0x95, 0x47, 0x92, 0xdd, 0xb0, 0xe2, 0x37, 0x32, 0xbd, 0x1b, 0xa7, 0x1e, 0x63, 0xbb, - 0x0c, 0x32, 0x9d, 0xe8, 0x86, 0xbf, 0x36, 0xfc, 0xc0, 0x10, 0x0e, 0x74, 0xaf, 0xc0, 0xb4, 0x1c, - 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8b, 0x41, 0x68, 0xe2, 0xf1, 0x27, 0xc0, 0x93, 0x0f, - 0xc3, 0xf3, 0x2b, 0x12, 0xf3, 0x09, 0xf0, 0xd4, 0x43, 0xf2, 0x69, 0x7c, 0xfb, 0xf3, 0x70, 0x21, - 0xd3, 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x0d, 0x89, 0x60, 0x88, 0x91, 0x7a, 0x3a, 0x60, - 0xf1, 0x5e, 0x5f, 0x4c, 0x3c, 0x86, 0x8a, 0xfd, 0xad, 0x02, 0xcc, 0x26, 0xdf, 0x8f, 0x24, 0x0f, - 0xb4, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x20, 0x6b, 0xe4, 0x0e, 0xec, 0x7b, 0x59, 0xf1, 0x80, 0x8f, - 0xaf, 0x6d, 0x9d, 0xc8, 0xf0, 0xf4, 0x18, 0xcb, 0x5b, 0x02, 0xc9, 0x8e, 0x3f, 0x11, 0x19, 0x87, - 0x19, 0xca, 0xd3, 0x6c, 0xee, 0xdc, 0xe3, 0x70, 0x39, 0xcd, 0x0a, 0x0d, 0xb6, 0x6c, 0x6f, 0xd9, - 0xa7, 0x81, 0xbb, 0xe3, 0xea, 0xb7, 0xaf, 0xf9, 0xca, 0xfd, 0x96, 0x2c, 0x43, 0x0d, 0xb5, 0xdf, - 0x1b, 0x83, 0x12, 0xcf, 0x8a, 0x74, 0x3d, 0xf0, 0xdb, 0xfc, 0x91, 0xb5, 0xd0, 0x38, 0x39, 0xc8, - 0x6e, 0xbb, 0x39, 0xea, 0x4b, 0x86, 0x31, 0x45, 0xe9, 0x31, 0x6d, 0x94, 0x60, 0x82, 0x23, 0xe9, - 0xc0, 0xd4, 0x8e, 0xcc, 0xe2, 0x2a, 0xfb, 0x6e, 0xc4, 0x4c, 0x84, 0x2a, 0x27, 0xac, 0x68, 0x02, - 0xf5, 0x0f, 0x35, 0x17, 0xdb, 0x81, 0xb9, 0x54, 0x5a, 0x8b, 0xdc, 0x73, 0xbf, 0xfe, 0xcf, 0x71, - 0x28, 0xe9, 0x70, 0x1d, 0xf2, 0xf1, 0x84, 0x19, 0xa7, 0x54, 0xfd, 0xa0, 0xf1, 0x02, 0xd0, 0xae, - 0xdf, 0x78, 0x74, 0x58, 0x9e, 0xd3, 0xc8, 0x29, 0x93, 0xcc, 0x25, 0x28, 0x74, 0x83, 0x56, 0xfa, - 0x9c, 0x76, 0x17, 0xd7, 0x91, 0x95, 0x9b, 0x21, 0x46, 0x85, 0x27, 0x1a, 0x62, 0xc4, 0x76, 0xc9, - 0x6d, 0xbf, 0x71, 0x90, 0x7e, 0x31, 0xa8, 0xea, 0x37, 0x0e, 0x90, 0x43, 0xc8, 0xeb, 0x30, 0x2b, - 0xe3, 0xa6, 0xcc, 0x77, 0xd4, 0x0b, 0xf1, 0xe5, 0xfb, 0x56, 0x02, 0x8a, 0x29, 0x6c, 0xb6, 0xcb, - 0xde, 0x0f, 0x7d, 0x8f, 0x67, 0xf4, 0x9d, 0x48, 0xde, 0xd4, 0xdd, 0xac, 0xdd, 0xbe, 0xc5, 0xcd, - 0x49, 0x1a, 0x23, 0x11, 0x9a, 0x35, 0xf9, 0xd8, 0xd0, 0xac, 0x55, 0x41, 0x9b, 0x49, 0xcb, 0x77, - 0x94, 0x99, 0xea, 0x15, 0x45, 0x97, 0x95, 0x3d, 0x3a, 0x3c, 0xc6, 0xd0, 0xa7, 0x6b, 0x66, 0x05, - 0xb1, 0x95, 0x7e, 0x74, 0x41, 0x6c, 0xf6, 0x5d, 0x98, 0x4b, 0xf5, 0x9f, 0x3a, 0xe6, 0x5b, 0xd9, - 0xc7, 0xfc, 0xc1, 0xde, 0x1c, 0xfa, 0x17, 0x16, 0x9c, 0xed, 0x59, 0x91, 0x06, 0x8d, 0x26, 0x4c, - 0xef, 0x8d, 0x63, 0x27, 0xdf, 0x1b, 0x0b, 0xc3, 0xed, 0x8d, 0xd5, 0xed, 0xef, 0x7c, 0xff, 0xf2, - 0x53, 0xdf, 0xfd, 0xfe, 0xe5, 0xa7, 0xfe, 0xf8, 0xfb, 0x97, 0x9f, 0x7a, 0xef, 0xe8, 0xb2, 0xf5, - 0x9d, 0xa3, 0xcb, 0xd6, 0x77, 0x8f, 0x2e, 0x5b, 0x7f, 0x7c, 0x74, 0xd9, 0xfa, 0x4f, 0x47, 0x97, - 0xad, 0xaf, 0xff, 0xf9, 0xe5, 0xa7, 0x3e, 0xfd, 0xc9, 0xb8, 0xa7, 0x96, 0x55, 0x4f, 0xf1, 0x1f, - 0x1f, 0x51, 0xfd, 0xb2, 0xdc, 0xd9, 0x6b, 0x2e, 0xb3, 0x9e, 0x5a, 0xd6, 0x25, 0xaa, 0xa7, 0xfe, - 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xb2, 0x75, 0xab, 0x44, 0xa1, 0x00, 0x00, + // 8388 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, + 0x75, 0xd8, 0x35, 0x87, 0x43, 0xce, 0x3c, 0x72, 0x49, 0x6e, 0xed, 0xae, 0x8e, 0xc7, 0xbb, 0xdb, + 0x39, 0xf5, 0x39, 0x97, 0x3d, 0xeb, 0x44, 0x4a, 0x7b, 0x77, 0xc9, 0x49, 0xa7, 0x5c, 0x32, 0x43, + 0xee, 0xde, 0x72, 0x8f, 0xdc, 0xe5, 0xbe, 0xe1, 0xde, 0xda, 0x92, 0xce, 0x56, 0x73, 0xa6, 0x38, + 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x85, 0x53, 0x14, 0x43, + 0x82, 0x95, 0xd8, 0x42, 0x10, 0x24, 0x08, 0x14, 0xc3, 0x80, 0x93, 0xd8, 0xbf, 0x84, 0x04, 0xf9, + 0x63, 0x20, 0x42, 0x1c, 0xdb, 0xfa, 0x11, 0x07, 0xf2, 0x8f, 0x44, 0x76, 0x00, 0xd3, 0x11, 0x9d, + 0x3f, 0x09, 0x12, 0x08, 0x09, 0x14, 0x04, 0xde, 0x1f, 0x41, 0x50, 0x9f, 0x5d, 0xdd, 0xd3, 0xc3, + 0x9d, 0xd9, 0x69, 0xae, 0x94, 0xc4, 0xff, 0x66, 0xea, 0x55, 0xbd, 0xf7, 0xba, 0x3e, 0x5e, 0xbd, + 0x7a, 0xf5, 0xde, 0x2b, 0xd8, 0x68, 0xb9, 0xd1, 0x5e, 0x6f, 0x67, 0xb9, 0xe1, 0x77, 0x56, 0x9c, + 0xa0, 0xe5, 0x77, 0x03, 0xff, 0x2e, 0xff, 0xf1, 0xd1, 0xc0, 0x6f, 0xb7, 0xfd, 0x5e, 0x14, 0xae, + 0x74, 0xf7, 0x5b, 0x2b, 0x4e, 0xd7, 0x0d, 0x57, 0x74, 0xc9, 0xc1, 0xc7, 0x9d, 0x76, 0x77, 0xcf, + 0xf9, 0xf8, 0x4a, 0x8b, 0x7a, 0x34, 0x70, 0x22, 0xda, 0x5c, 0xee, 0x06, 0x7e, 0xe4, 0x93, 0x4f, + 0xc5, 0xd8, 0x96, 0x15, 0x36, 0xfe, 0xe3, 0xe7, 0x55, 0xdb, 0xe5, 0xee, 0x7e, 0x6b, 0x99, 0x61, + 0x5b, 0xd6, 0x25, 0x0a, 0xdb, 0xd2, 0x47, 0x0d, 0x5e, 0x5a, 0x7e, 0xcb, 0x5f, 0xe1, 0x48, 0x77, + 0x7a, 0xbb, 0xfc, 0x1f, 0xff, 0xc3, 0x7f, 0x09, 0x62, 0x4b, 0xcf, 0xef, 0xbf, 0x16, 0x2e, 0xbb, + 0x3e, 0xe3, 0x6d, 0x65, 0xc7, 0x89, 0x1a, 0x7b, 0x2b, 0x07, 0x7d, 0x1c, 0x2d, 0xd9, 0x46, 0xa5, + 0x86, 0x1f, 0xd0, 0xac, 0x3a, 0xaf, 0xc4, 0x75, 0x3a, 0x4e, 0x63, 0xcf, 0xf5, 0x68, 0x70, 0x18, + 0x7f, 0x75, 0x87, 0x46, 0x4e, 0x56, 0xab, 0x95, 0x41, 0xad, 0x82, 0x9e, 0x17, 0xb9, 0x1d, 0xda, + 0xd7, 0xe0, 0xaf, 0x3c, 0xac, 0x41, 0xd8, 0xd8, 0xa3, 0x1d, 0xa7, 0xaf, 0xdd, 0xcb, 0x83, 0xda, + 0xf5, 0x22, 0xb7, 0xbd, 0xe2, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x46, 0xf6, 0x0f, 0x0b, 0x50, 0xae, + 0x6e, 0xd4, 0xea, 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x15, 0x0b, 0x66, 0xdb, 0xbe, 0xd3, 0xac, 0x39, + 0x6d, 0xc7, 0x6b, 0xd0, 0x60, 0xd1, 0x7a, 0xce, 0xba, 0x34, 0x73, 0x79, 0x63, 0x79, 0x9c, 0xf1, + 0x5a, 0xae, 0xde, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xb5, 0xf3, 0xdf, 0x3d, + 0xaa, 0x3c, 0x71, 0x7c, 0x54, 0x99, 0xdd, 0x30, 0x28, 0x61, 0x82, 0x2e, 0xf9, 0xa6, 0x05, 0x67, + 0x1b, 0x8e, 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0x9b, 0x81, 0xdf, 0xeb, 0x2e, 0x4e, + 0x9c, 0x02, 0x37, 0x4f, 0x49, 0x6e, 0xce, 0xae, 0xa6, 0xc9, 0x61, 0x3f, 0x07, 0x9c, 0xaf, 0x30, + 0x72, 0x76, 0xda, 0xd4, 0xe4, 0xab, 0x70, 0x9a, 0x7c, 0xd5, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf2, + 0x22, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xb8, 0x38, 0xf9, 0x9c, 0x75, 0xa9, 0x5c, 0x9b, 0x97, + 0xcd, 0xa7, 0xd7, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xad, 0x6e, 0xd4, 0xb6, 0x03, + 0x67, 0x77, 0xd7, 0x6d, 0xa0, 0xdf, 0x8b, 0x5c, 0xaf, 0x65, 0x22, 0xb0, 0x4e, 0x46, 0x40, 0x5e, + 0x85, 0x99, 0x90, 0x06, 0x07, 0x6e, 0x83, 0x6e, 0xf9, 0x41, 0xc4, 0x07, 0xa5, 0x58, 0x3b, 0x27, + 0xab, 0xcf, 0xd4, 0x63, 0x10, 0x9a, 0xf5, 0x58, 0xb3, 0xc0, 0xf7, 0x23, 0x09, 0xe7, 0x7d, 0x56, + 0x8e, 0x9b, 0x61, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x83, 0x05, 0xc7, 0xf3, 0xfc, 0xc8, 0x89, 0x5c, + 0xdf, 0xdb, 0x0a, 0xe8, 0xae, 0x7b, 0x5f, 0x7e, 0xe2, 0xa2, 0x6c, 0xbb, 0x50, 0x4d, 0xc1, 0xb1, + 0xaf, 0x05, 0xf9, 0x86, 0x05, 0x0b, 0x61, 0xe4, 0x36, 0xf6, 0x5d, 0x8f, 0x86, 0xe1, 0xaa, 0xef, + 0xed, 0xba, 0xad, 0xc5, 0x22, 0x1f, 0xb6, 0x1b, 0xe3, 0x0d, 0x5b, 0x3d, 0x85, 0xb5, 0x76, 0x9e, + 0xb1, 0x94, 0x2e, 0xc5, 0x3e, 0xea, 0xe4, 0x23, 0x50, 0x96, 0x3d, 0x4a, 0xc3, 0xc5, 0xa9, 0xe7, + 0x0a, 0x97, 0xca, 0xb5, 0x33, 0xc7, 0x47, 0x95, 0xf2, 0xba, 0x2a, 0xc4, 0x18, 0x6e, 0xaf, 0xc1, + 0x62, 0xb5, 0xb3, 0xe3, 0x84, 0xa1, 0xd3, 0xf4, 0x83, 0xd4, 0xd0, 0x5d, 0x82, 0x52, 0xc7, 0xe9, + 0x76, 0x5d, 0xaf, 0xc5, 0xc6, 0x8e, 0xe1, 0x99, 0x3d, 0x3e, 0xaa, 0x94, 0x36, 0x65, 0x19, 0x6a, + 0xa8, 0xfd, 0xc7, 0x13, 0x30, 0x53, 0xf5, 0x9c, 0xf6, 0x61, 0xe8, 0x86, 0xd8, 0xf3, 0xc8, 0xe7, + 0xa0, 0xc4, 0xa4, 0x56, 0xd3, 0x89, 0x1c, 0xb9, 0xd2, 0x3f, 0xb6, 0x2c, 0x84, 0xc8, 0xb2, 0x29, + 0x44, 0xe2, 0xcf, 0x67, 0xb5, 0x97, 0x0f, 0x3e, 0xbe, 0x7c, 0x73, 0xe7, 0x2e, 0x6d, 0x44, 0x9b, + 0x34, 0x72, 0x6a, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, 0x2e, 0x6d, + 0xc8, 0x95, 0xbb, 0x39, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2b, 0x49, 0x4f, + 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0xcd, 0xfc, 0x48, + 0x72, 0xb4, 0xb5, 0x39, 0x49, 0x74, 0x4a, 0xfc, 0x47, 0x49, 0xce, 0xfe, 0x0f, 0x16, 0x9c, 0x33, + 0x6a, 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x3c, 0x07, 0x93, 0x9e, 0xd3, 0xa1, 0x72, 0x55, + 0x69, 0x96, 0x6f, 0x38, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x87, 0xe2, 0x81, 0xd3, 0xee, 0x51, 0xde, + 0x49, 0xe5, 0xda, 0x19, 0x59, 0xa5, 0xf8, 0x36, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x41, 0x99, 0xff, + 0xb8, 0x1a, 0xf8, 0x9d, 0x9c, 0x3e, 0x4d, 0x72, 0xf8, 0xb6, 0x42, 0x2b, 0xa6, 0x9f, 0xfe, 0x8b, + 0x31, 0x41, 0xfb, 0x4f, 0x2d, 0x98, 0x37, 0x3e, 0x6e, 0xc3, 0x0d, 0x23, 0xf2, 0xd9, 0xbe, 0xc9, + 0xb3, 0x3c, 0xdc, 0xe4, 0x61, 0xad, 0xf9, 0xd4, 0x59, 0x90, 0x5f, 0x5a, 0x52, 0x25, 0xc6, 0xc4, + 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4e, 0x3c, 0x57, 0xb8, 0x34, 0x73, 0x79, 0x3d, 0xb7, + 0x61, 0x8c, 0xfb, 0x77, 0x9d, 0xe1, 0x47, 0x41, 0xc6, 0xfe, 0x67, 0x85, 0xc4, 0xf0, 0x6d, 0x2a, + 0x3e, 0x3e, 0xb0, 0x60, 0xaa, 0xed, 0xec, 0xd0, 0xb6, 0x58, 0x5b, 0x33, 0x97, 0xdf, 0xc9, 0x8d, + 0x13, 0x45, 0x63, 0x79, 0x83, 0xe3, 0xbf, 0xe2, 0x45, 0xc1, 0x61, 0x3c, 0xbd, 0x44, 0x21, 0x4a, + 0xe2, 0xe4, 0xef, 0x59, 0x30, 0x13, 0x4b, 0x35, 0xd5, 0x2d, 0x3b, 0xf9, 0x33, 0x13, 0x0b, 0x53, + 0xc9, 0x91, 0x16, 0xd1, 0x06, 0x04, 0x4d, 0x5e, 0x96, 0x3e, 0x01, 0x33, 0xc6, 0x27, 0x90, 0x05, + 0x28, 0xec, 0xd3, 0x43, 0x31, 0xe1, 0x91, 0xfd, 0x24, 0xe7, 0x13, 0x33, 0x5c, 0x4e, 0xe9, 0x4f, + 0x4e, 0xbc, 0x66, 0x2d, 0xbd, 0x01, 0x0b, 0x69, 0x82, 0xa3, 0xb4, 0xb7, 0xbf, 0x3d, 0x99, 0x98, + 0x98, 0x4c, 0x10, 0x10, 0x1f, 0xa6, 0x3b, 0x34, 0x0a, 0xdc, 0x86, 0x1a, 0xb2, 0xb5, 0xf1, 0x7a, + 0x69, 0x93, 0x23, 0x8b, 0x37, 0x44, 0xf1, 0x3f, 0x44, 0x45, 0x85, 0xec, 0xc1, 0xa4, 0x13, 0xb4, + 0xd4, 0x98, 0x5c, 0xcd, 0x67, 0x59, 0xc6, 0xa2, 0xa2, 0x1a, 0xb4, 0x42, 0xe4, 0x14, 0xc8, 0x0a, + 0x94, 0x23, 0x1a, 0x74, 0x5c, 0xcf, 0x89, 0xc4, 0x0e, 0x5a, 0xaa, 0x9d, 0x95, 0xd5, 0xca, 0xdb, + 0x0a, 0x80, 0x71, 0x1d, 0xd2, 0x86, 0xa9, 0x66, 0x70, 0x88, 0x3d, 0x6f, 0x71, 0x32, 0x8f, 0xae, + 0x58, 0xe3, 0xb8, 0xe2, 0x49, 0x2a, 0xfe, 0xa3, 0xa4, 0x41, 0x7e, 0xdd, 0x82, 0xf3, 0x1d, 0xea, + 0x84, 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, 0x51, 0x8f, 0x0d, 0xec, 0x62, 0x91, 0x13, 0xc7, 0x71, + 0xc7, 0xa1, 0x1f, 0x73, 0xed, 0x19, 0xc9, 0xca, 0xf9, 0x2c, 0x28, 0x66, 0x72, 0x63, 0xff, 0xf1, + 0x24, 0x9c, 0xed, 0x13, 0xec, 0xe4, 0x15, 0x28, 0x76, 0xf7, 0x9c, 0x50, 0x49, 0xea, 0x8b, 0x4a, + 0x4c, 0x6c, 0xb1, 0xc2, 0x07, 0x47, 0x95, 0x33, 0xaa, 0x09, 0x2f, 0x40, 0x51, 0x99, 0xe9, 0x4d, + 0x1d, 0x1a, 0x86, 0x4e, 0x4b, 0x89, 0x6f, 0x63, 0x9a, 0xf0, 0x62, 0x54, 0x70, 0xf2, 0x37, 0x2d, + 0x38, 0x23, 0xa6, 0x0c, 0xd2, 0xb0, 0xd7, 0x8e, 0xd8, 0x16, 0xc5, 0xba, 0xe5, 0x7a, 0x1e, 0xd3, + 0x53, 0xa0, 0xac, 0x5d, 0x90, 0xd4, 0xcf, 0x98, 0xa5, 0x21, 0x26, 0xe9, 0x92, 0x3b, 0x50, 0x0e, + 0x23, 0x27, 0x88, 0x68, 0xb3, 0x1a, 0x71, 0x65, 0x6a, 0xe6, 0xf2, 0x4f, 0x0f, 0x27, 0xbb, 0xb7, + 0xdd, 0x0e, 0x15, 0xfb, 0x44, 0x5d, 0x21, 0xc0, 0x18, 0x17, 0x79, 0x0f, 0x20, 0xe8, 0x79, 0xf5, + 0x5e, 0xa7, 0xe3, 0x04, 0x87, 0x52, 0xbf, 0xba, 0x36, 0xde, 0xe7, 0xa1, 0xc6, 0x17, 0xab, 0x1a, + 0x71, 0x19, 0x1a, 0xf4, 0xc8, 0x97, 0x2c, 0x38, 0x23, 0x66, 0xa2, 0xe2, 0x60, 0x2a, 0x67, 0x0e, + 0xce, 0xb2, 0xae, 0x5d, 0x33, 0x49, 0x60, 0x92, 0xa2, 0xfd, 0xef, 0x92, 0x6a, 0x40, 0x3d, 0x62, + 0x87, 0xad, 0xd6, 0x21, 0xf9, 0x0c, 0x3c, 0x15, 0xf6, 0x1a, 0x0d, 0x1a, 0x86, 0xbb, 0xbd, 0x36, + 0xf6, 0xbc, 0x6b, 0x6e, 0x18, 0xf9, 0xc1, 0xe1, 0x86, 0xdb, 0x71, 0x23, 0x3e, 0xe3, 0x8a, 0xb5, + 0x67, 0x8f, 0x8f, 0x2a, 0x4f, 0xd5, 0x07, 0x55, 0xc2, 0xc1, 0xed, 0x89, 0x03, 0x4f, 0xf7, 0xbc, + 0xc1, 0xe8, 0x85, 0x86, 0x5e, 0x39, 0x3e, 0xaa, 0x3c, 0x7d, 0x7b, 0x70, 0x35, 0x3c, 0x09, 0x87, + 0xfd, 0x5f, 0x2c, 0x26, 0xa9, 0xc5, 0x77, 0x6d, 0xd3, 0x4e, 0xb7, 0xcd, 0xa4, 0xcb, 0xe9, 0xeb, + 0x8f, 0x51, 0x42, 0x7f, 0xc4, 0x7c, 0xb6, 0x3b, 0xc5, 0xff, 0x20, 0x25, 0xd2, 0xfe, 0xcf, 0x16, + 0x9c, 0x4f, 0x57, 0x7e, 0x0c, 0x3a, 0x4f, 0x98, 0xd4, 0x79, 0x6e, 0xe4, 0xfb, 0xb5, 0x03, 0x14, + 0x9f, 0xaf, 0x4c, 0xf6, 0x7f, 0xeb, 0xff, 0xeb, 0xdb, 0x68, 0xbc, 0x2b, 0x16, 0x7e, 0x9c, 0xbb, + 0xe2, 0xe4, 0x4f, 0xd4, 0xae, 0xf8, 0x8f, 0x27, 0x61, 0xb6, 0xea, 0x45, 0x6e, 0x75, 0x77, 0xd7, + 0xf5, 0xdc, 0xe8, 0x90, 0x7c, 0x6d, 0x02, 0x56, 0xba, 0x01, 0xdd, 0xa5, 0x41, 0x40, 0x9b, 0x6b, + 0xbd, 0xc0, 0xf5, 0x5a, 0xf5, 0xc6, 0x1e, 0x6d, 0xf6, 0xda, 0xae, 0xd7, 0x5a, 0x6f, 0x79, 0xbe, + 0x2e, 0xbe, 0x72, 0x9f, 0x36, 0x7a, 0xfc, 0x93, 0xc4, 0xa2, 0xe8, 0x8c, 0xf7, 0x49, 0x5b, 0xa3, + 0x11, 0xad, 0xbd, 0x7c, 0x7c, 0x54, 0x59, 0x19, 0xb1, 0x11, 0x8e, 0xfa, 0x69, 0xe4, 0xab, 0x13, + 0xb0, 0x1c, 0xd0, 0xcf, 0xf7, 0xdc, 0xe1, 0x7b, 0x43, 0x48, 0xad, 0xf6, 0x98, 0xdb, 0xcf, 0x48, + 0x34, 0x6b, 0x97, 0x8f, 0x8f, 0x2a, 0x23, 0xb6, 0xc1, 0x11, 0xbf, 0xcb, 0xde, 0x82, 0x99, 0x6a, + 0xd7, 0x0d, 0xdd, 0xfb, 0xe8, 0xf7, 0x22, 0x3a, 0xc4, 0x11, 0xb7, 0x02, 0xc5, 0xa0, 0xd7, 0xa6, + 0x62, 0x6d, 0x97, 0x6b, 0x65, 0x26, 0x85, 0x90, 0x15, 0xa0, 0x28, 0xb7, 0x7f, 0x91, 0x49, 0x5c, + 0x8e, 0x32, 0x65, 0xdc, 0xb8, 0x0b, 0xc5, 0x80, 0x11, 0x91, 0x33, 0x6b, 0xdc, 0x73, 0x60, 0xcc, + 0xb5, 0x64, 0x82, 0xfd, 0x44, 0x41, 0xc2, 0xfe, 0x9d, 0x09, 0xb8, 0x50, 0xed, 0x76, 0x37, 0x69, + 0xb8, 0x97, 0xe2, 0xe2, 0x97, 0x2d, 0x98, 0x3b, 0x70, 0x83, 0xa8, 0xe7, 0xb4, 0x95, 0xfd, 0x4a, + 0xf0, 0x53, 0x1f, 0x97, 0x1f, 0x4e, 0xed, 0xed, 0x04, 0xea, 0x1a, 0x39, 0x3e, 0xaa, 0xcc, 0x25, + 0xcb, 0x30, 0x45, 0x9e, 0xfc, 0x5d, 0x0b, 0x16, 0x64, 0xd1, 0x0d, 0xbf, 0x49, 0x4d, 0xfb, 0xe8, + 0xed, 0x3c, 0x79, 0xd2, 0xc8, 0x85, 0x5d, 0x2b, 0x5d, 0x8a, 0x7d, 0x4c, 0xd8, 0xff, 0x6d, 0x02, + 0x9e, 0x1c, 0x80, 0x83, 0xfc, 0x86, 0x05, 0xe7, 0x85, 0x51, 0xd5, 0x00, 0x21, 0xdd, 0x95, 0xbd, + 0xf9, 0xb3, 0x79, 0x73, 0x8e, 0x6c, 0x89, 0x53, 0xaf, 0x41, 0x6b, 0x8b, 0x4c, 0x1a, 0xae, 0x66, + 0x90, 0xc6, 0x4c, 0x86, 0x38, 0xa7, 0xc2, 0xcc, 0x9a, 0xe2, 0x74, 0xe2, 0xb1, 0x70, 0x5a, 0xcf, + 0x20, 0x8d, 0x99, 0x0c, 0xd9, 0x7f, 0x1d, 0x9e, 0x3e, 0x01, 0xdd, 0xc3, 0x17, 0xa7, 0xfd, 0x8e, + 0x9e, 0xf5, 0xc9, 0x39, 0x37, 0xc4, 0xba, 0xb6, 0x61, 0x8a, 0x2f, 0x1d, 0xb5, 0xb0, 0x81, 0x6d, + 0x7f, 0x7c, 0x4d, 0x85, 0x28, 0x21, 0xf6, 0xef, 0x58, 0x50, 0x1a, 0xc1, 0x1a, 0x56, 0x49, 0x5a, + 0xc3, 0xca, 0x7d, 0x96, 0xb0, 0xa8, 0xdf, 0x12, 0xf6, 0xe6, 0x78, 0xa3, 0x31, 0x8c, 0x05, 0xec, + 0x87, 0x16, 0x9c, 0xed, 0xb3, 0x98, 0x91, 0x3d, 0x38, 0xdf, 0xf5, 0x9b, 0x4a, 0x6d, 0xba, 0xe6, + 0x84, 0x7b, 0x1c, 0x26, 0x3f, 0xef, 0x15, 0x36, 0x92, 0x5b, 0x19, 0xf0, 0x07, 0x47, 0x95, 0x45, + 0x8d, 0x24, 0x55, 0x01, 0x33, 0x31, 0x92, 0x2e, 0x94, 0x76, 0x5d, 0xda, 0x6e, 0xc6, 0x53, 0x70, + 0x4c, 0x05, 0xe9, 0xaa, 0xc4, 0x26, 0x8c, 0xc5, 0xea, 0x1f, 0x6a, 0x2a, 0xf6, 0x8f, 0x2c, 0x98, + 0xab, 0xf6, 0xa2, 0x3d, 0xa6, 0x1e, 0x34, 0xb8, 0x7d, 0x86, 0x78, 0x50, 0x0c, 0xdd, 0xd6, 0xc1, + 0x2b, 0xf9, 0x08, 0xe3, 0x3a, 0x43, 0x25, 0x8d, 0xe6, 0x5a, 0x37, 0xe5, 0x85, 0x28, 0xc8, 0x90, + 0x00, 0xa6, 0x7c, 0xa7, 0x17, 0xed, 0x5d, 0x96, 0x9f, 0x3c, 0xe6, 0x49, 0xf9, 0x26, 0xfb, 0x9c, + 0xcb, 0x92, 0xa2, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4a, 0xf6, 0x17, 0x61, 0x2e, 0x79, 0x13, 0x33, + 0xc4, 0x9c, 0x7d, 0x16, 0x0a, 0x4e, 0xe0, 0xc9, 0x19, 0x3b, 0x23, 0x2b, 0x14, 0xaa, 0x78, 0x03, + 0x59, 0x39, 0x79, 0x09, 0x4a, 0xbb, 0xbd, 0x76, 0x9b, 0x35, 0x90, 0xd7, 0x1e, 0xfa, 0x14, 0x70, + 0x55, 0x96, 0xa3, 0xae, 0x61, 0xff, 0xf9, 0x24, 0xcc, 0xd7, 0xda, 0x3d, 0xfa, 0x66, 0x40, 0xa9, + 0xb2, 0x4d, 0x54, 0x61, 0xbe, 0x1b, 0xd0, 0x03, 0x97, 0xde, 0xab, 0xd3, 0x36, 0x6d, 0x44, 0x7e, + 0x20, 0xb9, 0x79, 0x52, 0x22, 0x9a, 0xdf, 0x4a, 0x82, 0x31, 0x5d, 0x9f, 0xbc, 0x01, 0x73, 0x4e, + 0x23, 0x72, 0x0f, 0xa8, 0xc6, 0x20, 0xd8, 0xfd, 0x90, 0xc4, 0x30, 0x57, 0x4d, 0x40, 0x31, 0x55, + 0x9b, 0x7c, 0x16, 0x16, 0xc3, 0x86, 0xd3, 0xa6, 0xb7, 0xbb, 0x92, 0xd4, 0xea, 0x1e, 0x6d, 0xec, + 0x6f, 0xf9, 0xae, 0x17, 0x49, 0x4b, 0xd4, 0x73, 0x12, 0xd3, 0x62, 0x7d, 0x40, 0x3d, 0x1c, 0x88, + 0x81, 0xfc, 0x4b, 0x0b, 0x9e, 0xed, 0x06, 0x74, 0x2b, 0xf0, 0x3b, 0x3e, 0x9b, 0x6a, 0x7d, 0xe6, + 0x19, 0x69, 0xa6, 0x78, 0x7b, 0x4c, 0x5d, 0x4a, 0x94, 0xf4, 0x5b, 0xf5, 0x3f, 0x7c, 0x7c, 0x54, + 0x79, 0x76, 0xeb, 0x24, 0x06, 0xf0, 0x64, 0xfe, 0xc8, 0xbf, 0xb2, 0xe0, 0x62, 0xd7, 0x0f, 0xa3, + 0x13, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1f, 0x55, 0x2e, 0x6e, 0x9d, 0xc8, 0x01, 0x3e, + 0x84, 0x43, 0xfb, 0x78, 0x06, 0xce, 0x1a, 0x73, 0x4f, 0xda, 0x2e, 0x5e, 0x87, 0x33, 0x6a, 0x32, + 0xc4, 0xba, 0x4f, 0x39, 0xb6, 0x35, 0x55, 0x4d, 0x20, 0x26, 0xeb, 0xb2, 0x79, 0xa7, 0xa7, 0xa2, + 0x68, 0x9d, 0x9a, 0x77, 0x5b, 0x09, 0x28, 0xa6, 0x6a, 0x93, 0x75, 0x38, 0x27, 0x4b, 0x90, 0x76, + 0xdb, 0x6e, 0xc3, 0x59, 0xf5, 0x7b, 0x72, 0xca, 0x15, 0x6b, 0x4f, 0x1e, 0x1f, 0x55, 0xce, 0x6d, + 0xf5, 0x83, 0x31, 0xab, 0x0d, 0xd9, 0x80, 0xf3, 0x4e, 0x2f, 0xf2, 0xf5, 0xf7, 0x5f, 0xf1, 0xd8, + 0x76, 0xda, 0xe4, 0x53, 0xab, 0x24, 0xf6, 0xdd, 0x6a, 0x06, 0x1c, 0x33, 0x5b, 0x91, 0xad, 0x14, + 0xb6, 0x3a, 0x6d, 0xf8, 0x5e, 0x53, 0x8c, 0x72, 0x31, 0x3e, 0x81, 0x55, 0x33, 0xea, 0x60, 0x66, + 0x4b, 0xd2, 0x86, 0xb9, 0x8e, 0x73, 0xff, 0xb6, 0xe7, 0x1c, 0x38, 0x6e, 0x9b, 0x11, 0x91, 0xf6, + 0xab, 0xc1, 0x46, 0x95, 0x5e, 0xe4, 0xb6, 0x97, 0xc5, 0xcd, 0xfe, 0xf2, 0xba, 0x17, 0xdd, 0x0c, + 0xea, 0x11, 0xd3, 0xd4, 0x85, 0x06, 0xb9, 0x99, 0xc0, 0x85, 0x29, 0xdc, 0xe4, 0x26, 0x5c, 0xe0, + 0xcb, 0x71, 0xcd, 0xbf, 0xe7, 0xad, 0xd1, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x53, + 0xc7, 0x47, 0x95, 0x0b, 0xf5, 0xac, 0x0a, 0x98, 0xdd, 0x8e, 0x38, 0xf0, 0x74, 0x12, 0x80, 0xf4, + 0xc0, 0x0d, 0x5d, 0xdf, 0x13, 0x56, 0xa8, 0x52, 0x6c, 0x85, 0xaa, 0x0f, 0xae, 0x86, 0x27, 0xe1, + 0x20, 0x7f, 0xdf, 0x82, 0xf3, 0x59, 0xcb, 0x70, 0xb1, 0x9c, 0xc7, 0xfd, 0x62, 0x6a, 0x69, 0x89, + 0x19, 0x91, 0x29, 0x14, 0x32, 0x99, 0x20, 0xef, 0x5b, 0x30, 0xeb, 0x18, 0x27, 0xe8, 0x45, 0xc8, + 0x63, 0xd7, 0x32, 0xcf, 0xe4, 0xb5, 0x85, 0xe3, 0xa3, 0x4a, 0xe2, 0x94, 0x8e, 0x09, 0x8a, 0xe4, + 0x1f, 0x5a, 0x70, 0x21, 0x73, 0x8d, 0x2f, 0xce, 0x9c, 0x46, 0x0f, 0xf1, 0x49, 0x92, 0x2d, 0x73, + 0xb2, 0xd9, 0x20, 0xdf, 0xb0, 0xf4, 0x56, 0xa6, 0xae, 0x9c, 0x16, 0x67, 0x39, 0x6b, 0xb7, 0xc6, + 0x34, 0x1a, 0xc4, 0x5a, 0x93, 0x42, 0x5c, 0x3b, 0x67, 0xec, 0x8c, 0xaa, 0x10, 0xd3, 0xe4, 0xc9, + 0xd7, 0x2d, 0xb5, 0x35, 0x6a, 0x8e, 0xce, 0x9c, 0x16, 0x47, 0x24, 0xde, 0x69, 0x35, 0x43, 0x29, + 0xe2, 0xe4, 0xe7, 0x60, 0xc9, 0xd9, 0xf1, 0x83, 0x28, 0x73, 0xf1, 0x2d, 0xce, 0xf1, 0x65, 0x74, + 0xf1, 0xf8, 0xa8, 0xb2, 0x54, 0x1d, 0x58, 0x0b, 0x4f, 0xc0, 0x60, 0xff, 0x56, 0x11, 0x66, 0xc5, + 0x49, 0x48, 0x6e, 0x5d, 0xbf, 0x6d, 0xc1, 0x33, 0x8d, 0x5e, 0x10, 0x50, 0x2f, 0xaa, 0x47, 0xb4, + 0xdb, 0xbf, 0x71, 0x59, 0xa7, 0xba, 0x71, 0x3d, 0x77, 0x7c, 0x54, 0x79, 0x66, 0xf5, 0x04, 0xfa, + 0x78, 0x22, 0x77, 0xe4, 0xdf, 0x5a, 0x60, 0xcb, 0x0a, 0x35, 0xa7, 0xb1, 0xdf, 0x0a, 0xfc, 0x9e, + 0xd7, 0xec, 0xff, 0x88, 0x89, 0x53, 0xfd, 0x88, 0x17, 0x8e, 0x8f, 0x2a, 0xf6, 0xea, 0x43, 0xb9, + 0xc0, 0x21, 0x38, 0x25, 0x6f, 0xc2, 0x59, 0x59, 0xeb, 0xca, 0xfd, 0x2e, 0x0d, 0x5c, 0x76, 0xe6, + 0x90, 0x8a, 0x63, 0xec, 0xad, 0x94, 0xae, 0x80, 0xfd, 0x6d, 0x48, 0x08, 0xd3, 0xf7, 0xa8, 0xdb, + 0xda, 0x8b, 0x94, 0xfa, 0x34, 0xa6, 0x8b, 0x92, 0xb4, 0x8a, 0xdc, 0x11, 0x38, 0x6b, 0x33, 0xc7, + 0x47, 0x95, 0x69, 0xf9, 0x07, 0x15, 0x25, 0x72, 0x03, 0xe6, 0xc4, 0x39, 0x75, 0xcb, 0xf5, 0x5a, + 0x5b, 0xbe, 0x27, 0xfc, 0x6c, 0xca, 0xb5, 0x17, 0xd4, 0x86, 0x5f, 0x4f, 0x40, 0x1f, 0x1c, 0x55, + 0x66, 0xd5, 0xef, 0xed, 0xc3, 0x2e, 0xc5, 0x54, 0x6b, 0xfb, 0xf7, 0xa6, 0x00, 0xd4, 0x74, 0xa5, + 0x5d, 0xf2, 0x11, 0x28, 0x87, 0x34, 0x12, 0x54, 0xe5, 0xc5, 0x89, 0xb8, 0x8f, 0x52, 0x85, 0x18, + 0xc3, 0xc9, 0x3e, 0x14, 0xbb, 0x4e, 0x2f, 0xa4, 0xf9, 0x9c, 0x1f, 0xe4, 0xe0, 0x6f, 0x31, 0x8c, + 0xe2, 0x60, 0xca, 0x7f, 0xa2, 0xa0, 0x41, 0xbe, 0x6c, 0x01, 0xd0, 0xe4, 0x80, 0x8d, 0x6d, 0x20, + 0x92, 0x24, 0xe3, 0x31, 0x65, 0x7d, 0x50, 0x9b, 0x3b, 0x3e, 0xaa, 0x80, 0x31, 0xf4, 0x06, 0x59, + 0x72, 0x0f, 0x4a, 0x8e, 0x92, 0xf9, 0x93, 0xa7, 0x21, 0xf3, 0xf9, 0x79, 0x51, 0x4f, 0x5a, 0x4d, + 0x8c, 0x7c, 0xd5, 0x82, 0xb9, 0x90, 0x46, 0x72, 0xa8, 0x98, 0xe4, 0x91, 0x0a, 0xef, 0x98, 0x93, + 0xae, 0x9e, 0xc0, 0x29, 0x24, 0x68, 0xb2, 0x0c, 0x53, 0x74, 0x15, 0x2b, 0xd7, 0xa8, 0xd3, 0xa4, + 0x01, 0x37, 0x47, 0x48, 0x4d, 0x6a, 0x7c, 0x56, 0x0c, 0x9c, 0x9a, 0x15, 0xa3, 0x0c, 0x53, 0x74, + 0x15, 0x2b, 0x9b, 0x6e, 0x10, 0xf8, 0x92, 0x95, 0x52, 0x4e, 0xac, 0x18, 0x38, 0x35, 0x2b, 0x46, + 0x19, 0xa6, 0xe8, 0xda, 0xdf, 0x3a, 0x03, 0x73, 0x6a, 0x21, 0xc5, 0x9a, 0xbd, 0xb0, 0x7e, 0x0d, + 0xd0, 0xec, 0x57, 0x4d, 0x20, 0x26, 0xeb, 0xb2, 0xc6, 0x62, 0xa9, 0x26, 0x15, 0x7b, 0xdd, 0xb8, + 0x6e, 0x02, 0x31, 0x59, 0x97, 0x74, 0xa0, 0x18, 0x46, 0xb4, 0xab, 0xee, 0xc0, 0xc7, 0xbc, 0xa2, + 0x8d, 0xe5, 0x83, 0x61, 0x49, 0x60, 0xe8, 0x51, 0x50, 0xe1, 0x06, 0xdc, 0x28, 0x61, 0xd3, 0x95, + 0x8b, 0x23, 0x9f, 0xf5, 0x99, 0x34, 0x17, 0x8b, 0xd1, 0x48, 0x96, 0x61, 0x8a, 0x7c, 0x86, 0xb2, + 0x5f, 0x3c, 0x45, 0x65, 0xff, 0xd3, 0x50, 0xea, 0x38, 0xf7, 0xeb, 0xbd, 0xa0, 0xf5, 0xe8, 0x87, + 0x0a, 0xe9, 0x55, 0x28, 0xb0, 0xa0, 0xc6, 0x47, 0xbe, 0x64, 0x19, 0x22, 0x67, 0x9a, 0x23, 0xbf, + 0x93, 0xaf, 0xc8, 0xd1, 0x7b, 0xe5, 0x40, 0xe1, 0xd3, 0xa7, 0x7a, 0x97, 0x1e, 0xbb, 0xea, 0xcd, + 0xd4, 0x48, 0xb1, 0x40, 0xb4, 0x1a, 0x59, 0x3e, 0x55, 0x35, 0x72, 0x35, 0x41, 0x0c, 0x53, 0xc4, + 0x39, 0x3f, 0x62, 0xcd, 0x69, 0x7e, 0xe0, 0x54, 0xf9, 0xa9, 0x27, 0x88, 0x61, 0x8a, 0xf8, 0xe0, + 0xf3, 0xe6, 0xcc, 0xe9, 0x9c, 0x37, 0x67, 0x73, 0x38, 0x6f, 0x9e, 0xac, 0x8a, 0x9f, 0x19, 0x57, + 0x15, 0x27, 0xd7, 0x81, 0x34, 0x0f, 0x3d, 0xa7, 0xe3, 0x36, 0xa4, 0xb0, 0xe4, 0xdb, 0xe6, 0x1c, + 0xb7, 0x47, 0x2c, 0x49, 0x41, 0x46, 0xd6, 0xfa, 0x6a, 0x60, 0x46, 0x2b, 0x12, 0x41, 0xa9, 0xab, + 0x34, 0xae, 0xf9, 0x3c, 0x66, 0xbf, 0xd2, 0xc0, 0x84, 0x9b, 0x04, 0x5b, 0x78, 0xaa, 0x04, 0x35, + 0x25, 0xb2, 0x01, 0xe7, 0x3b, 0xae, 0xb7, 0xe5, 0x37, 0xc3, 0x2d, 0x1a, 0x48, 0x6b, 0x4b, 0x9d, + 0x46, 0x8b, 0x0b, 0xbc, 0x6f, 0xf8, 0x09, 0x7a, 0x33, 0x03, 0x8e, 0x99, 0xad, 0xec, 0xff, 0x69, + 0xc1, 0xc2, 0x6a, 0xdb, 0xef, 0x35, 0xef, 0x38, 0x51, 0x63, 0x4f, 0x78, 0x08, 0x90, 0x37, 0xa0, + 0xe4, 0x7a, 0x11, 0x0d, 0x0e, 0x9c, 0xb6, 0xdc, 0x9f, 0x6c, 0x65, 0x3e, 0x5d, 0x97, 0xe5, 0x0f, + 0x8e, 0x2a, 0x73, 0x6b, 0xbd, 0x80, 0x5b, 0xa9, 0x85, 0xb4, 0x42, 0xdd, 0x86, 0x7c, 0xcb, 0x82, + 0xb3, 0xc2, 0xc7, 0x60, 0xcd, 0x89, 0x9c, 0x5b, 0x3d, 0x1a, 0xb8, 0x54, 0x79, 0x19, 0x8c, 0x29, + 0xa8, 0xd2, 0xbc, 0x2a, 0x02, 0x87, 0xb1, 0xa2, 0xbe, 0x99, 0xa6, 0x8c, 0xfd, 0xcc, 0xd8, 0xbf, + 0x52, 0x80, 0xa7, 0x06, 0xe2, 0x22, 0x4b, 0x30, 0xe1, 0x36, 0xe5, 0xa7, 0x83, 0xc4, 0x3b, 0xb1, + 0xde, 0xc4, 0x09, 0xb7, 0x49, 0x96, 0xb9, 0xce, 0x19, 0xd0, 0x30, 0x54, 0x17, 0xce, 0x65, 0xad, + 0x1e, 0xca, 0x52, 0x34, 0x6a, 0x90, 0x0a, 0x14, 0xb9, 0x47, 0xa9, 0x3c, 0x4f, 0x70, 0x2d, 0x96, + 0x3b, 0x6f, 0xa2, 0x28, 0x27, 0xbf, 0x68, 0x01, 0x08, 0x06, 0xd9, 0x69, 0x44, 0xee, 0x92, 0x98, + 0x6f, 0x37, 0x31, 0xcc, 0x82, 0xcb, 0xf8, 0x3f, 0x1a, 0x54, 0xc9, 0x36, 0x4c, 0x31, 0x85, 0xd6, + 0x6f, 0x3e, 0xf2, 0xa6, 0xc8, 0x6f, 0xa2, 0xb6, 0x38, 0x0e, 0x94, 0xb8, 0x58, 0x5f, 0x05, 0x34, + 0xea, 0x05, 0x1e, 0xeb, 0x5a, 0xbe, 0x0d, 0x96, 0x04, 0x17, 0xa8, 0x4b, 0xd1, 0xa8, 0x61, 0xff, + 0x8b, 0x09, 0x38, 0x9f, 0xc5, 0x3a, 0xdb, 0x6d, 0xa6, 0x04, 0xb7, 0xf2, 0x68, 0xfc, 0x33, 0xf9, + 0xf7, 0x8f, 0x74, 0x97, 0xd1, 0xd7, 0x14, 0xd2, 0xa1, 0x4f, 0xd2, 0x25, 0x3f, 0xa3, 0x7b, 0x68, + 0xe2, 0x11, 0x7b, 0x48, 0x63, 0x4e, 0xf5, 0xd2, 0x73, 0x30, 0x19, 0xb2, 0x91, 0x2f, 0x24, 0xaf, + 0x3b, 0xf8, 0x18, 0x71, 0x08, 0xab, 0xd1, 0xf3, 0xdc, 0x48, 0x86, 0x61, 0xe8, 0x1a, 0xb7, 0x3d, + 0x37, 0x42, 0x0e, 0xb1, 0xbf, 0x39, 0x01, 0x4b, 0x83, 0x3f, 0x8a, 0x7c, 0xd3, 0x02, 0x68, 0xb2, + 0xe3, 0x4a, 0xc8, 0x7d, 0x99, 0x85, 0x7b, 0x91, 0x73, 0x5a, 0x7d, 0xb8, 0xa6, 0x28, 0xc5, 0xbe, + 0x66, 0xba, 0x28, 0x44, 0x83, 0x11, 0x72, 0x59, 0x4d, 0x7d, 0x7e, 0x55, 0x23, 0x16, 0x93, 0x6e, + 0xb3, 0xa9, 0x21, 0x68, 0xd4, 0x62, 0xe7, 0x51, 0xcf, 0xe9, 0xd0, 0xb0, 0xeb, 0xe8, 0xa0, 0x16, + 0x7e, 0x1e, 0xbd, 0xa1, 0x0a, 0x31, 0x86, 0xdb, 0x6d, 0x78, 0x7e, 0x08, 0x3e, 0x73, 0x8a, 0x19, + 0xb0, 0xff, 0xbb, 0x05, 0x4f, 0xae, 0xb6, 0x7b, 0x61, 0x44, 0x83, 0xff, 0x6f, 0x5c, 0xf7, 0xfe, + 0x97, 0x05, 0x4f, 0x0f, 0xf8, 0xe6, 0xc7, 0xe0, 0xc1, 0xf7, 0x6e, 0xd2, 0x83, 0xef, 0xf6, 0xb8, + 0x53, 0x3a, 0xf3, 0x3b, 0x06, 0x38, 0xf2, 0x7d, 0xb3, 0x00, 0x67, 0x98, 0xd8, 0x6a, 0xfa, 0xad, + 0x9c, 0x36, 0xce, 0xe7, 0xa1, 0xf8, 0x79, 0xb6, 0x01, 0xa5, 0x27, 0x19, 0xdf, 0x95, 0x50, 0xc0, + 0xc8, 0x97, 0x2d, 0x98, 0xfe, 0xbc, 0xdc, 0x53, 0xc5, 0x59, 0x6e, 0x4c, 0x61, 0x98, 0xf8, 0x86, + 0x65, 0xb9, 0x43, 0x8a, 0x50, 0x04, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0x45, 0x99, 0xbc, 0x08, 0xd3, + 0xbb, 0x7e, 0xd0, 0xe9, 0xb5, 0x9d, 0x74, 0xfc, 0xdb, 0x55, 0x51, 0x8c, 0x0a, 0xce, 0x16, 0xb9, + 0xd3, 0x75, 0xdf, 0xa6, 0x41, 0x28, 0x3c, 0xd3, 0x13, 0x8b, 0xbc, 0xaa, 0x21, 0x68, 0xd4, 0x5a, + 0xfa, 0x24, 0xcc, 0x9a, 0x8c, 0x8c, 0x14, 0xa2, 0xf0, 0x29, 0x90, 0x0e, 0x81, 0x29, 0xf1, 0x62, + 0x0d, 0x23, 0x5e, 0xec, 0x7f, 0x3f, 0x01, 0x86, 0xa5, 0xe7, 0x31, 0x2c, 0x5b, 0x2f, 0xb1, 0x6c, + 0xc7, 0xb4, 0x52, 0x18, 0x76, 0xab, 0x41, 0x01, 0x5b, 0x07, 0xa9, 0x80, 0xad, 0x1b, 0xb9, 0x51, + 0x3c, 0x39, 0x5e, 0xeb, 0xfb, 0x16, 0x3c, 0x1d, 0x57, 0xee, 0x37, 0xc2, 0x3e, 0x5c, 0x06, 0xbf, + 0x0a, 0x33, 0x4e, 0xdc, 0x4c, 0x2e, 0x12, 0x23, 0x5a, 0x46, 0x83, 0xd0, 0xac, 0x17, 0xc7, 0x19, + 0x14, 0x1e, 0x31, 0xce, 0x60, 0xf2, 0xe4, 0x38, 0x03, 0xfb, 0x47, 0x13, 0xf0, 0x6c, 0xff, 0x97, + 0x29, 0xe9, 0x31, 0x9c, 0x47, 0xc3, 0x6b, 0x30, 0x1b, 0xc9, 0x06, 0xc6, 0x5e, 0xa8, 0x23, 0x77, + 0xb7, 0x0d, 0x18, 0x26, 0x6a, 0xb2, 0x96, 0x0d, 0x21, 0xb7, 0xea, 0x0d, 0xbf, 0xab, 0xa2, 0x54, + 0x74, 0xcb, 0x55, 0x03, 0x86, 0x89, 0x9a, 0xda, 0xff, 0x77, 0xf2, 0xd4, 0xfd, 0x7f, 0xeb, 0x70, + 0x41, 0x79, 0x3c, 0x5e, 0xf5, 0x83, 0x55, 0xbf, 0xd3, 0x6d, 0xd3, 0x48, 0x49, 0x83, 0x52, 0xed, + 0x59, 0xd9, 0xe4, 0x02, 0x66, 0x55, 0xc2, 0xec, 0xb6, 0xf6, 0xf7, 0x0b, 0x70, 0x2e, 0xee, 0xf6, + 0x55, 0xdf, 0x6b, 0xba, 0xdc, 0x69, 0xe6, 0x75, 0x98, 0x8c, 0x0e, 0xbb, 0xaa, 0xb3, 0xff, 0xb2, + 0x62, 0x67, 0xfb, 0xb0, 0xcb, 0x46, 0xfb, 0xc9, 0x8c, 0x26, 0xdc, 0x0c, 0xce, 0x1b, 0x91, 0x0d, + 0xbd, 0x3a, 0xc4, 0x08, 0xbc, 0x92, 0x9c, 0xcd, 0x0f, 0x8e, 0x2a, 0x19, 0x81, 0xeb, 0xcb, 0x1a, + 0x53, 0x72, 0xce, 0x93, 0xbb, 0x30, 0xd7, 0x76, 0xc2, 0xe8, 0x76, 0xb7, 0xe9, 0x44, 0x74, 0xdb, + 0x95, 0xee, 0x28, 0xa3, 0x05, 0x7f, 0xe8, 0x7b, 0xfb, 0x8d, 0x04, 0x26, 0x4c, 0x61, 0x26, 0x07, + 0x40, 0x58, 0xc9, 0x76, 0xe0, 0x78, 0xa1, 0xf8, 0x2a, 0x46, 0x6f, 0xf4, 0x60, 0x13, 0x7d, 0x0c, + 0xde, 0xe8, 0xc3, 0x86, 0x19, 0x14, 0xc8, 0x0b, 0x30, 0x15, 0x50, 0x27, 0xd4, 0xa2, 0x5d, 0xaf, + 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x82, 0x9a, 0x7a, 0xc8, 0x82, 0xfa, 0x13, 0x0b, 0xe6, 0xe2, + 0x61, 0x7a, 0x0c, 0x6a, 0x44, 0x27, 0xa9, 0x46, 0x5c, 0xcb, 0x4b, 0x24, 0x0e, 0xd0, 0x1c, 0x7e, + 0x7f, 0xca, 0xfc, 0x3e, 0xee, 0xfc, 0xff, 0x05, 0x28, 0xab, 0x55, 0xad, 0xf4, 0xf3, 0x31, 0xad, + 0x09, 0x09, 0xcd, 0xcd, 0x08, 0x5a, 0x93, 0x44, 0x30, 0xa6, 0xc7, 0xf4, 0x96, 0xa6, 0xd4, 0x49, + 0xe4, 0xb4, 0xd7, 0x7a, 0x8b, 0xd2, 0x55, 0xb2, 0xf4, 0x16, 0xd5, 0x86, 0xdc, 0x86, 0x27, 0xbb, + 0x81, 0xcf, 0x43, 0xa7, 0xd7, 0xa8, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x26, 0x1b, 0xe1, 0x36, 0xf2, + 0xf4, 0xf1, 0x51, 0xe5, 0xc9, 0xad, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0xf8, 0x6e, 0x72, 0x88, + 0xe0, 0xbb, 0xbf, 0xa5, 0x0d, 0xa3, 0x34, 0x94, 0x21, 0x70, 0x9f, 0xc9, 0x6b, 0x28, 0x33, 0xc4, + 0x7a, 0x3c, 0xa5, 0xaa, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0xad, 0x6f, 0x53, 0x8f, 0x68, 0x7d, 0x8b, + 0x63, 0x28, 0xa6, 0x7f, 0x9c, 0x31, 0x14, 0xa5, 0x9f, 0xa8, 0x18, 0x8a, 0x0f, 0x8a, 0xb0, 0x90, + 0xd6, 0x40, 0x4e, 0x3f, 0xb0, 0xf0, 0xef, 0x58, 0xb0, 0xa0, 0x56, 0x8f, 0xa0, 0xa9, 0x75, 0xf1, + 0x8d, 0x9c, 0x16, 0xad, 0xd0, 0xa5, 0x74, 0xc6, 0x85, 0xed, 0x14, 0x35, 0xec, 0xa3, 0x4f, 0xde, + 0x81, 0x19, 0x7d, 0xfd, 0xf0, 0x48, 0x51, 0x86, 0xf3, 0x5c, 0x8b, 0x8a, 0x51, 0xa0, 0x89, 0x8f, + 0x7c, 0x60, 0x01, 0x34, 0xd4, 0x36, 0xa7, 0x56, 0xd7, 0xad, 0xbc, 0x56, 0x97, 0xde, 0x40, 0x63, + 0x65, 0x59, 0x17, 0x85, 0x68, 0x10, 0x26, 0xbf, 0xc2, 0x2f, 0x1e, 0xb4, 0x76, 0x27, 0x32, 0x39, + 0x8c, 0xed, 0x1f, 0x7e, 0x82, 0x62, 0x1a, 0xab, 0x52, 0x06, 0x28, 0xc4, 0x04, 0x13, 0xf6, 0xeb, + 0xa0, 0x3d, 0x7a, 0x99, 0xd8, 0xe2, 0x3e, 0xbd, 0x5b, 0x4e, 0xb4, 0x27, 0xa7, 0xa0, 0x16, 0x5b, + 0x57, 0x15, 0x00, 0xe3, 0x3a, 0xf6, 0xe7, 0x60, 0xee, 0xcd, 0xc0, 0xe9, 0xee, 0xb9, 0xdc, 0xc0, + 0xcf, 0x0e, 0x92, 0x2f, 0xc2, 0xb4, 0xd3, 0x6c, 0x66, 0x25, 0x07, 0xa9, 0x8a, 0x62, 0x54, 0xf0, + 0xa1, 0xce, 0x8c, 0xf6, 0xef, 0x59, 0x40, 0xe2, 0x4b, 0x52, 0xd7, 0x6b, 0x6d, 0x3a, 0x51, 0x63, + 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, 0xe8, 0x9a, 0x86, 0xa0, 0x51, 0x8b, 0xbc, 0x07, + 0x33, 0xe2, 0xdf, 0xdb, 0xfa, 0xf4, 0x35, 0xbe, 0x63, 0x32, 0xdf, 0x50, 0x38, 0x4f, 0x62, 0x16, + 0x5e, 0x8b, 0x29, 0xa0, 0x49, 0x8e, 0x75, 0xd5, 0xba, 0xb7, 0xdb, 0xee, 0xdd, 0x6f, 0xee, 0xc4, + 0x5d, 0xd5, 0x0d, 0xfc, 0x5d, 0xb7, 0x4d, 0xd3, 0x5d, 0xb5, 0x25, 0x8a, 0x51, 0xc1, 0x87, 0xeb, + 0xaa, 0x7f, 0x6d, 0xc1, 0xf9, 0xf5, 0x30, 0x72, 0xfd, 0x35, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0xc2, + 0xa7, 0xd7, 0x1e, 0xc6, 0x39, 0x7f, 0x0d, 0x16, 0xe4, 0x85, 0x6d, 0x6f, 0x27, 0xa4, 0x91, 0xa1, + 0xc7, 0xeb, 0x75, 0xbc, 0x9a, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0xde, 0xdc, 0xc6, 0x58, 0x0a, + 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2b, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0xc0, + 0x9a, 0xaf, 0x0f, 0x0a, 0xac, 0x19, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x56, 0xf3, 0xb7, 0x2d, + 0x98, 0x6f, 0x26, 0x7b, 0x3a, 0x1f, 0x03, 0x56, 0xd6, 0x18, 0x0a, 0xff, 0xb4, 0x54, 0x21, 0xa6, + 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x3e, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, 0xa1, 0x3c, + 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x26, 0xe4, 0x90, 0x9e, 0x46, 0xd4, 0x08, 0xb9, 0x07, + 0xe5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xea, 0xc2, 0x57, 0x22, + 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, 0x39, 0x8a, + 0x6e, 0xaf, 0x6e, 0xa5, 0x09, 0xcb, 0x12, 0x46, 0x58, 0xd1, 0xb2, 0x7f, 0xd3, 0x82, 0xf2, 0x75, + 0x5f, 0xc9, 0x91, 0x9f, 0xcb, 0xc1, 0xd0, 0xa3, 0xf5, 0x41, 0x7d, 0x27, 0x1b, 0x1f, 0x31, 0xde, + 0x48, 0x98, 0x79, 0x9e, 0x31, 0x70, 0x2f, 0xf3, 0x1c, 0x69, 0x0c, 0xd5, 0x75, 0x7f, 0x67, 0xa0, + 0x9d, 0xf5, 0xd7, 0x8a, 0x70, 0xe6, 0x2d, 0xe7, 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, 0xf1, 0x2a, + 0xcc, 0x38, 0x5d, 0x7e, 0xe9, 0x67, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x59, 0x2f, 0x16, + 0x68, 0x22, 0x84, 0x23, 0x4b, 0x14, 0xad, 0xa6, 0xe0, 0xd8, 0xd7, 0x82, 0x5c, 0x07, 0x22, 0x23, + 0x8e, 0xab, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, 0xec, 0xab, + 0x81, 0x19, 0xad, 0xc8, 0x67, 0x61, 0xb1, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, 0x1c, 0x3f, + 0x75, 0x50, 0xc4, 0xea, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x51, + 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x08, 0xe5, 0x68, 0x2f, + 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0x27, 0x8d, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, 0x15, 0x56, + 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, + 0xaf, 0xe7, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, 0xbb, 0x13, + 0x30, 0x6b, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xd9, 0x82, 0xd9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, + 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x8d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x19, + 0x4c, 0x10, 0x25, 0x5f, 0xb3, 0x60, 0x3e, 0xf6, 0xe9, 0x8b, 0x0d, 0x69, 0xb9, 0x32, 0xa2, 0x45, + 0xfd, 0x95, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x21, 0x3d, 0xda, 0xac, 0x2b, 0xbb, 0x8e, + 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0xb7, 0x9c, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x41, 0xa9, 0xe3, 0x04, + 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, 0x1f, 0x83, + 0xd9, 0x4d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x5b, 0xfc, 0xb3, 0x49, 0x98, 0x31, + 0xce, 0x66, 0xa7, 0x7f, 0xce, 0x4a, 0xa4, 0x4d, 0x29, 0xe4, 0x98, 0x36, 0xe5, 0xd3, 0x00, 0xbb, + 0xae, 0xe7, 0x86, 0x7b, 0x8f, 0x98, 0x90, 0x85, 0x5f, 0x62, 0x5f, 0xd5, 0x18, 0xd0, 0xc0, 0x16, + 0xdf, 0x14, 0x16, 0x4f, 0xc8, 0x2e, 0xf6, 0x81, 0x65, 0x6c, 0x37, 0x53, 0x79, 0x78, 0x46, 0x18, + 0x03, 0xb3, 0xac, 0xb6, 0x1f, 0x71, 0x89, 0x73, 0xd2, 0xae, 0xb4, 0x0d, 0xa5, 0x80, 0x86, 0xbd, + 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0d, 0xdc, 0x47, 0x05, 0x65, 0x7b, 0xd4, 0x98, 0x96, 0x5e, + 0x87, 0x33, 0x09, 0x16, 0x46, 0xba, 0xbe, 0xf1, 0x21, 0xd3, 0x00, 0xf0, 0x28, 0x97, 0x39, 0x6c, + 0x2c, 0xda, 0x46, 0x46, 0x16, 0x3d, 0x16, 0xc2, 0x13, 0x49, 0xc0, 0xec, 0x1f, 0x4d, 0x81, 0xbc, + 0xec, 0x1f, 0x42, 0x5c, 0x99, 0x57, 0x7c, 0x13, 0x8f, 0x70, 0xc5, 0x77, 0x1d, 0x66, 0x5d, 0xcf, + 0x8d, 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xae, 0xda, 0xb3, 0xeb, 0x06, 0x2c, 0x03, + 0x4f, 0xa2, 0x2d, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x09, 0x3c, 0xba, 0x47, 0x02, 0x77, 0x46, + 0x11, 0xf1, 0x5b, 0x02, 0x13, 0x3f, 0x7c, 0x88, 0x94, 0x34, 0xfa, 0xf8, 0x2d, 0xe7, 0x71, 0x7c, + 0xf8, 0x48, 0xc1, 0xb1, 0xaf, 0x05, 0xc3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, 0x2c, 0x53, + 0x49, 0x2c, 0x57, 0x53, 0x70, 0xec, 0x6b, 0x41, 0x76, 0x61, 0x56, 0x96, 0x09, 0xff, 0xb2, 0xe9, + 0x47, 0xfc, 0x4a, 0xee, 0x47, 0x78, 0xd5, 0xc0, 0x84, 0x09, 0xbc, 0xa4, 0x07, 0x67, 0x5d, 0xaf, + 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x3c, 0xf5, 0x28, 0xc4, 0x2e, 0x1c, 0x1f, + 0x55, 0xce, 0xae, 0xa7, 0xd1, 0x61, 0x3f, 0x05, 0xf2, 0x25, 0x0b, 0x2e, 0x34, 0x7c, 0x2f, 0xe4, + 0x39, 0x1e, 0x0e, 0xe8, 0x95, 0x20, 0xf0, 0x03, 0x41, 0xbb, 0xfc, 0x88, 0xb4, 0xb9, 0x4d, 0x71, + 0x35, 0x0b, 0x25, 0x66, 0x53, 0x22, 0xef, 0x42, 0xa9, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, + 0x57, 0x71, 0x23, 0x8f, 0x9c, 0x33, 0x5b, 0x12, 0x67, 0x2c, 0x7a, 0x54, 0x09, 0x6a, 0x7a, 0xf6, + 0xff, 0x9e, 0x81, 0xb9, 0x64, 0x75, 0xf2, 0x0b, 0x00, 0xdd, 0xc0, 0xef, 0xd0, 0x68, 0x8f, 0xea, + 0x20, 0x98, 0x1b, 0xe3, 0xa6, 0x36, 0x51, 0xf8, 0x94, 0x7f, 0x0f, 0x13, 0x17, 0x71, 0x29, 0x1a, + 0x14, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x5b, 0xb9, 0xe8, 0x4c, 0x92, 0x32, + 0x8f, 0xde, 0x90, 0x45, 0xa8, 0x08, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, 0xd5, 0xdf, + 0xa1, 0xf2, 0x34, 0x53, 0x9b, 0x3e, 0x3e, 0xaa, 0x14, 0xee, 0xd0, 0x1d, 0x64, 0xc8, 0xd9, 0x77, + 0x35, 0xc5, 0x25, 0xbf, 0x14, 0x15, 0x6f, 0xe5, 0xe8, 0x31, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x22, + 0x44, 0xde, 0x85, 0xf2, 0x3d, 0xe7, 0x80, 0xee, 0x06, 0xbe, 0x17, 0x49, 0xa7, 0xb2, 0x31, 0xe3, + 0x22, 0xee, 0x28, 0x74, 0x92, 0x2e, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xe4, 0xc8, 0x01, 0x94, 0x3c, + 0x7a, 0x0f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x87, 0x70, 0x43, 0x62, 0x93, 0x94, 0xf9, 0xbe, 0xa7, + 0xca, 0x50, 0xd3, 0x62, 0x63, 0x79, 0xd7, 0xdf, 0x91, 0x82, 0x6a, 0xcc, 0xb1, 0xd4, 0x27, 0x53, + 0x31, 0x96, 0xd7, 0xfd, 0x1d, 0x64, 0xc8, 0xd9, 0x1a, 0x69, 0x68, 0x8f, 0x26, 0x29, 0xa6, 0x6e, + 0xe4, 0xeb, 0xc9, 0x25, 0xd6, 0x48, 0x5c, 0x8a, 0x06, 0x45, 0xd6, 0xb7, 0x2d, 0x69, 0xac, 0x94, + 0x82, 0x6a, 0xcc, 0xbe, 0x4d, 0x9a, 0x3e, 0x45, 0xdf, 0xaa, 0x32, 0xd4, 0xb4, 0x18, 0x5d, 0x57, + 0x5a, 0xfe, 0xf2, 0x11, 0x55, 0x49, 0x3b, 0xa2, 0xa0, 0xab, 0xca, 0x50, 0xd3, 0x62, 0xfd, 0x1d, + 0xee, 0x1f, 0xde, 0x73, 0xda, 0xfb, 0xae, 0xd7, 0x92, 0x41, 0x9d, 0xe3, 0x66, 0x30, 0xde, 0x3f, + 0xbc, 0x23, 0xf0, 0x99, 0xfd, 0x1d, 0x97, 0xa2, 0x41, 0x91, 0xfc, 0x03, 0x0b, 0xa6, 0xba, 0xed, + 0x5e, 0xcb, 0xf5, 0x16, 0x67, 0xf3, 0xf0, 0xf6, 0x49, 0x8a, 0xdc, 0xe5, 0x2d, 0x8e, 0x5a, 0x28, + 0x8a, 0x3f, 0xad, 0x1d, 0x14, 0x79, 0xe1, 0x2f, 0xfd, 0x69, 0x65, 0x91, 0x7a, 0x0d, 0xbf, 0xe9, + 0x7a, 0xad, 0x95, 0xbb, 0xa1, 0xef, 0x2d, 0xa3, 0x73, 0x4f, 0xe9, 0xe8, 0x92, 0xa7, 0xa5, 0x4f, + 0xc0, 0x8c, 0x81, 0xe2, 0x61, 0x8a, 0xde, 0xac, 0xa9, 0xe8, 0xfd, 0xe6, 0x14, 0xcc, 0x9a, 0x59, + 0x13, 0x87, 0xd0, 0xbe, 0xf4, 0x89, 0x63, 0x62, 0x94, 0x13, 0x07, 0x3b, 0x62, 0x1a, 0xb7, 0x47, + 0xca, 0xbc, 0xb5, 0x9e, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x44, 0x47, 0x70, + 0x28, 0x61, 0x6a, 0xab, 0x50, 0xec, 0x8a, 0x49, 0xb5, 0x35, 0xa1, 0xaa, 0x5d, 0x06, 0x88, 0xb3, + 0x07, 0xca, 0x5b, 0x45, 0xad, 0x0f, 0x1b, 0x59, 0x0d, 0x8d, 0x5a, 0xe4, 0x05, 0x98, 0x62, 0xaa, + 0x0f, 0x6d, 0xca, 0x98, 0x73, 0x7d, 0x8e, 0xbf, 0xca, 0x4b, 0x51, 0x42, 0xc9, 0x6b, 0x4c, 0x4b, + 0x8d, 0x15, 0x16, 0x19, 0x4a, 0x7e, 0x3e, 0xd6, 0x52, 0x63, 0x18, 0x26, 0x6a, 0x32, 0xd6, 0x29, + 0xd3, 0x2f, 0xb8, 0x6c, 0x30, 0x58, 0xe7, 0x4a, 0x07, 0x0a, 0x18, 0xb7, 0x2b, 0xa5, 0xf4, 0x11, + 0xbe, 0xa6, 0x8b, 0x86, 0x5d, 0x29, 0x05, 0xc7, 0xbe, 0x16, 0xec, 0x63, 0xe4, 0x85, 0xe8, 0x8c, + 0xf0, 0x2c, 0x1e, 0x70, 0x95, 0xf9, 0x15, 0xf3, 0xac, 0x95, 0xe3, 0x1a, 0x12, 0xb3, 0x76, 0xf8, + 0xc3, 0xd6, 0x78, 0xc7, 0xa2, 0xcf, 0xc1, 0x5c, 0x72, 0x17, 0xca, 0xfd, 0xe6, 0xe3, 0xab, 0x93, + 0x70, 0xee, 0x46, 0xcb, 0xf5, 0xd2, 0x19, 0xc1, 0xb2, 0x12, 0xc2, 0x5b, 0x23, 0x27, 0x84, 0xd7, + 0xc1, 0x6b, 0x32, 0xdd, 0x7a, 0x76, 0xf0, 0x9a, 0xca, 0x7d, 0x9f, 0xac, 0x4b, 0xfe, 0xc4, 0x82, + 0x67, 0x9c, 0xa6, 0x38, 0x17, 0x38, 0x6d, 0x59, 0x6a, 0xe4, 0x31, 0x96, 0x2b, 0x3a, 0x1c, 0x73, + 0x97, 0xef, 0xff, 0xf8, 0xe5, 0xea, 0x09, 0x54, 0xc5, 0x88, 0xff, 0x94, 0xfc, 0x82, 0x67, 0x4e, + 0xaa, 0x8a, 0x27, 0xb2, 0x4f, 0xfe, 0x1a, 0xcc, 0x27, 0x3e, 0x58, 0x5a, 0xc2, 0xcb, 0xe2, 0xc2, + 0xa2, 0x9e, 0x04, 0x61, 0xba, 0xee, 0xd2, 0x4d, 0xf8, 0xf0, 0x43, 0xf9, 0x1c, 0x69, 0xb2, 0x7d, + 0xd7, 0x82, 0x59, 0x33, 0x79, 0x0f, 0x79, 0x09, 0x4a, 0x91, 0xbf, 0x4f, 0xbd, 0xdb, 0x81, 0xf2, + 0x6c, 0xd5, 0x13, 0x7d, 0x9b, 0x97, 0xe3, 0x06, 0xea, 0x1a, 0xac, 0x76, 0xa3, 0xed, 0x52, 0x2f, + 0x5a, 0x6f, 0xca, 0x61, 0xd6, 0xb5, 0x57, 0x45, 0xf9, 0x1a, 0xea, 0x1a, 0xc2, 0x81, 0x8d, 0xfd, + 0xae, 0xd3, 0x46, 0x40, 0x95, 0x1f, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x51, 0x93, 0xd8, 0xda, + 0xc4, 0x39, 0x19, 0xdf, 0x6b, 0xa4, 0x4c, 0x92, 0x5f, 0xb6, 0xa0, 0x2c, 0x4c, 0xf4, 0x48, 0x77, + 0x53, 0xbe, 0xa8, 0x29, 0x23, 0x42, 0x75, 0x6b, 0x3d, 0xc3, 0x17, 0x95, 0x6d, 0x4b, 0xfb, 0xae, + 0xa7, 0xbe, 0x44, 0x6f, 0x4b, 0x6f, 0xb9, 0x5e, 0x13, 0x39, 0x44, 0x6f, 0x5c, 0x85, 0x81, 0xa6, + 0xb3, 0x5f, 0xb7, 0x60, 0x8e, 0xc7, 0x2e, 0xc7, 0xc7, 0xdb, 0x57, 0xb5, 0xdf, 0x94, 0x60, 0xe3, + 0xd9, 0xa4, 0xdf, 0xd4, 0x83, 0xa3, 0xca, 0x8c, 0x88, 0x76, 0x4e, 0xba, 0x51, 0x7d, 0x46, 0xda, + 0xc4, 0xb8, 0x77, 0xd7, 0xc4, 0xc8, 0x26, 0x1b, 0x6d, 0x33, 0xae, 0x2b, 0x24, 0x18, 0xe3, 0xb3, + 0xdf, 0x83, 0x59, 0x33, 0x08, 0x89, 0xbc, 0x0a, 0x33, 0x5d, 0xd7, 0x6b, 0x25, 0x83, 0x55, 0xf5, + 0xbd, 0xc1, 0x56, 0x0c, 0x42, 0xb3, 0x1e, 0x6f, 0xe6, 0xc7, 0xcd, 0x52, 0xd7, 0x0d, 0x5b, 0xbe, + 0xd9, 0x2c, 0xfe, 0xc3, 0x53, 0xc2, 0x67, 0x04, 0xbb, 0xe5, 0x9e, 0x12, 0x3e, 0x83, 0xc6, 0x8f, + 0x2f, 0x25, 0x7c, 0x16, 0x33, 0xff, 0x77, 0xa5, 0x84, 0xff, 0x59, 0x18, 0x35, 0x17, 0x28, 0xdb, + 0xba, 0xef, 0x99, 0x09, 0x05, 0x74, 0x8f, 0xcb, 0x8c, 0x02, 0x12, 0x6a, 0x7f, 0xa7, 0x00, 0x0b, + 0xe9, 0x13, 0x7c, 0xde, 0xce, 0x11, 0xe4, 0x6b, 0x16, 0xcc, 0x39, 0x89, 0xbc, 0x6b, 0x39, 0xbd, + 0x2f, 0x93, 0xc0, 0x69, 0xe4, 0xfd, 0x4a, 0x94, 0x63, 0x8a, 0x36, 0xf9, 0x4b, 0x30, 0x1d, 0xb9, + 0x1d, 0xea, 0xf7, 0x84, 0x5d, 0xaf, 0x20, 0xce, 0xd7, 0xdb, 0xa2, 0x08, 0x15, 0x8c, 0xc9, 0x58, + 0x97, 0x2b, 0x44, 0x01, 0x95, 0x5e, 0xb4, 0x0b, 0xb1, 0x21, 0x52, 0x94, 0xa3, 0xae, 0x41, 0xee, + 0xc3, 0xb4, 0x70, 0xa3, 0x50, 0xfe, 0x32, 0x9b, 0x39, 0x59, 0x1a, 0x84, 0xa7, 0x46, 0x3c, 0x04, + 0xe2, 0x7f, 0x88, 0x8a, 0x9c, 0xfd, 0x31, 0x18, 0x31, 0x39, 0xaa, 0x7d, 0x05, 0x08, 0xfa, 0xed, + 0xf6, 0x8e, 0xd3, 0xd8, 0xbf, 0xe3, 0x7a, 0x4d, 0xff, 0x1e, 0x17, 0x45, 0x2b, 0x50, 0x0e, 0x64, + 0xa8, 0x68, 0x28, 0x67, 0x8d, 0x96, 0x65, 0x2a, 0x86, 0x34, 0xc4, 0xb8, 0x8e, 0xfd, 0x07, 0x13, + 0x30, 0x2d, 0xe3, 0x9a, 0x1f, 0x83, 0x17, 0xff, 0x7e, 0xe2, 0x7a, 0x77, 0x3d, 0x97, 0x70, 0xec, + 0x81, 0x2e, 0xfc, 0x61, 0xca, 0x85, 0xff, 0xad, 0x7c, 0xc8, 0x9d, 0xec, 0xbf, 0xff, 0xfb, 0x45, + 0x98, 0x4f, 0xc5, 0x89, 0x33, 0xd5, 0xba, 0xcf, 0x6d, 0xf5, 0x76, 0xae, 0xa1, 0xe8, 0x3a, 0x06, + 0xe7, 0x64, 0x0f, 0xd6, 0x30, 0x91, 0xca, 0xfa, 0x56, 0x6e, 0xaf, 0x74, 0xfc, 0x45, 0x56, 0xeb, + 0x11, 0x3d, 0x32, 0xc9, 0xb7, 0x2c, 0x38, 0xe7, 0xf4, 0x3f, 0x73, 0x22, 0x4d, 0x80, 0xb7, 0x72, + 0x7f, 0x3f, 0xa5, 0xf6, 0xb4, 0x64, 0x32, 0xeb, 0x35, 0x19, 0xcc, 0x62, 0xc5, 0xfe, 0x4f, 0x16, + 0x3c, 0x35, 0x30, 0xe3, 0x01, 0x4f, 0x98, 0x15, 0x24, 0xa1, 0x52, 0x66, 0xe4, 0x9c, 0xd7, 0x45, + 0x5f, 0x07, 0xa7, 0x73, 0x1c, 0xa5, 0xc9, 0x93, 0x57, 0x60, 0x96, 0xeb, 0x68, 0x4c, 0x7a, 0x46, + 0xb4, 0x2b, 0x6f, 0xb3, 0xf8, 0xbd, 0x46, 0xdd, 0x28, 0xc7, 0x44, 0x2d, 0xfb, 0x5b, 0x16, 0x2c, + 0x0e, 0x4a, 0x9f, 0x34, 0x84, 0xad, 0xe5, 0xaf, 0xa6, 0x22, 0x21, 0x2a, 0x7d, 0x91, 0x10, 0x29, + 0x6b, 0x8b, 0x0a, 0x7a, 0x30, 0x0c, 0x1d, 0x85, 0x87, 0x38, 0xfa, 0x7f, 0xdd, 0x82, 0x27, 0x07, + 0x2c, 0xf8, 0xbe, 0x88, 0x18, 0xeb, 0x91, 0x23, 0x62, 0x26, 0x86, 0x8d, 0x88, 0xb1, 0xff, 0xb0, + 0x00, 0x0b, 0x92, 0x9f, 0x58, 0x51, 0x7f, 0x2d, 0x11, 0x4f, 0xf2, 0x53, 0xa9, 0x78, 0x92, 0xf3, + 0xe9, 0xfa, 0x7f, 0x11, 0x4c, 0xf2, 0x93, 0x15, 0x4c, 0xf2, 0xe7, 0x13, 0x70, 0x21, 0x33, 0xab, + 0x13, 0xf9, 0x6a, 0xc6, 0xee, 0x75, 0x27, 0xe7, 0xf4, 0x51, 0x43, 0xee, 0x5f, 0xe3, 0x46, 0x60, + 0xfc, 0xaa, 0x19, 0xf9, 0x20, 0x76, 0xa3, 0xdd, 0x53, 0x48, 0x84, 0x35, 0x62, 0x10, 0x84, 0xfd, + 0x4b, 0x05, 0xb8, 0x34, 0x2c, 0xa2, 0x9f, 0xd0, 0x20, 0xb9, 0x30, 0x11, 0x24, 0xf7, 0x98, 0x34, + 0x8b, 0x53, 0x89, 0x97, 0xfb, 0x47, 0x93, 0x7a, 0xdb, 0xeb, 0x9f, 0x9f, 0x43, 0xb9, 0x3e, 0x4c, + 0x33, 0xed, 0x53, 0x25, 0xc4, 0x8e, 0x45, 0xe1, 0x74, 0x5d, 0x14, 0x3f, 0x38, 0xaa, 0x9c, 0x8d, + 0x73, 0x8b, 0xc8, 0x42, 0x54, 0x8d, 0xc8, 0x25, 0x28, 0x05, 0x02, 0xaa, 0xc2, 0x82, 0xa4, 0xff, + 0x88, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x34, 0xd4, 0xf5, 0xc9, 0xd3, 0x4a, 0xa1, 0x73, 0x92, 0x5b, + 0xcc, 0x3b, 0x50, 0x0a, 0x55, 0xd6, 0x66, 0xa1, 0xb8, 0xbc, 0x3c, 0x64, 0xb4, 0x19, 0x3b, 0x83, + 0xab, 0x14, 0xce, 0xe2, 0xfb, 0x74, 0x82, 0x67, 0x8d, 0x92, 0xd8, 0xfa, 0xf8, 0x2b, 0xcc, 0xf6, + 0xd0, 0x7f, 0xf4, 0x25, 0x11, 0x4c, 0xcb, 0xc7, 0x3c, 0xe5, 0x7d, 0xe2, 0x66, 0x4e, 0x91, 0x25, + 0xd2, 0xef, 0x98, 0x9f, 0x2a, 0x95, 0x19, 0x46, 0x91, 0xb2, 0xbf, 0x6f, 0xc1, 0x8c, 0x9c, 0x23, + 0x8f, 0x21, 0xec, 0xee, 0x6e, 0x32, 0xec, 0xee, 0x4a, 0x2e, 0x12, 0x6b, 0x40, 0xcc, 0xdd, 0x5d, + 0x98, 0x35, 0xd3, 0x09, 0x92, 0x4f, 0x1b, 0x12, 0xd7, 0x1a, 0x27, 0x41, 0x97, 0x92, 0xc9, 0xb1, + 0x34, 0xb6, 0x7f, 0xab, 0xac, 0x7b, 0x91, 0x9f, 0x5d, 0xcd, 0x99, 0x6f, 0x9d, 0x38, 0xf3, 0xcd, + 0x89, 0x37, 0x91, 0xff, 0xc4, 0xbb, 0x05, 0x25, 0x25, 0x16, 0xa5, 0xf2, 0xf0, 0xbc, 0xe9, 0x88, + 0xcc, 0x34, 0x10, 0x86, 0xcc, 0x58, 0x2e, 0xfc, 0x0c, 0x1a, 0xdb, 0x7a, 0x95, 0xb8, 0xd6, 0x68, + 0xc8, 0xbb, 0x30, 0x73, 0xcf, 0x0f, 0xf6, 0xdb, 0xbe, 0xc3, 0x53, 0xe5, 0x43, 0x1e, 0x77, 0xdf, + 0xda, 0x5e, 0x2b, 0xa2, 0x41, 0xee, 0xc4, 0xf8, 0xd1, 0x24, 0x46, 0xaa, 0x30, 0xdf, 0x71, 0x3d, + 0xa4, 0x4e, 0x53, 0x47, 0xd7, 0x4d, 0x8a, 0x34, 0xd5, 0x4a, 0xb5, 0xde, 0x4c, 0x82, 0x31, 0x5d, + 0x9f, 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0xe6, 0xa2, 0xdd, 0x1a, 0x7f, 0x32, 0x26, 0x2d, 0x18, + 0x22, 0x1c, 0x22, 0x59, 0x8e, 0x29, 0xda, 0xe4, 0x0b, 0x50, 0x0a, 0x65, 0xae, 0xc0, 0x7c, 0x9c, + 0x26, 0xf4, 0xd9, 0x5e, 0x20, 0x8d, 0x87, 0x52, 0x95, 0xa0, 0x26, 0x48, 0x36, 0xe0, 0xbc, 0x32, + 0x9f, 0x24, 0x9e, 0x33, 0x9b, 0x8a, 0x53, 0x4b, 0x61, 0x06, 0x1c, 0x33, 0x5b, 0x31, 0x55, 0x8e, + 0xa7, 0xe9, 0x14, 0x77, 0x8d, 0xc6, 0xf5, 0x1c, 0x5f, 0x7f, 0x4d, 0x94, 0xd0, 0x93, 0x82, 0x47, + 0x4b, 0x63, 0x04, 0x8f, 0xd6, 0xe1, 0x42, 0x1a, 0xc4, 0x73, 0x86, 0xf1, 0x34, 0x65, 0xc6, 0x16, + 0xba, 0x95, 0x55, 0x09, 0xb3, 0xdb, 0x92, 0x3b, 0x50, 0x0e, 0x28, 0x3f, 0x64, 0x55, 0x95, 0x9b, + 0xd6, 0xc8, 0x0e, 0xa9, 0xa8, 0x10, 0x60, 0x8c, 0x8b, 0x8d, 0xbb, 0x93, 0x4c, 0x1c, 0x7d, 0x2b, + 0xc7, 0x77, 0x74, 0xe5, 0xd8, 0x0f, 0xc8, 0xe5, 0x67, 0xff, 0x9b, 0x79, 0x38, 0x93, 0xb0, 0x01, + 0x91, 0xe7, 0xa1, 0xc8, 0x93, 0xa8, 0x71, 0x69, 0x55, 0x8a, 0x25, 0xaa, 0xe8, 0x1c, 0x01, 0x23, + 0xbf, 0x6c, 0xc1, 0x7c, 0x37, 0x71, 0xa7, 0xa1, 0x04, 0xf9, 0x98, 0x86, 0xd3, 0xe4, 0x45, 0x89, + 0xf1, 0xe4, 0x42, 0x92, 0x18, 0xa6, 0xa9, 0x33, 0x79, 0x20, 0xbd, 0xba, 0xdb, 0x34, 0xe0, 0xb5, + 0xa5, 0xa2, 0xa7, 0x51, 0xac, 0x26, 0xc1, 0x98, 0xae, 0xcf, 0x46, 0x98, 0x7f, 0xdd, 0x38, 0x2f, + 0x35, 0x56, 0x15, 0x02, 0x8c, 0x71, 0x91, 0x37, 0x60, 0x4e, 0xe6, 0x0b, 0xde, 0xf2, 0x9b, 0xd7, + 0x9c, 0x70, 0x4f, 0x9e, 0x70, 0xf4, 0x89, 0x6c, 0x35, 0x01, 0xc5, 0x54, 0x6d, 0xfe, 0x6d, 0x71, + 0x52, 0x66, 0x8e, 0x60, 0x2a, 0xf9, 0x22, 0xc5, 0x6a, 0x12, 0x8c, 0xe9, 0xfa, 0xe4, 0x25, 0x63, + 0x1b, 0x12, 0xf7, 0xff, 0x5a, 0x1a, 0x64, 0x6c, 0x45, 0x55, 0x98, 0xef, 0xf1, 0x03, 0x61, 0x53, + 0x01, 0xe5, 0x7a, 0xd4, 0x04, 0x6f, 0x27, 0xc1, 0x98, 0xae, 0x4f, 0x5e, 0x87, 0x33, 0x01, 0x13, + 0xb6, 0x1a, 0x81, 0x70, 0x0a, 0xd0, 0x77, 0xbe, 0x68, 0x02, 0x31, 0x59, 0x97, 0xbc, 0x09, 0x67, + 0xe3, 0xf4, 0x9a, 0x0a, 0x81, 0xf0, 0x12, 0xd0, 0xb9, 0xde, 0xaa, 0xe9, 0x0a, 0xd8, 0xdf, 0x86, + 0xfc, 0x0d, 0x58, 0x30, 0x7a, 0x62, 0xdd, 0x6b, 0xd2, 0xfb, 0x32, 0x05, 0x22, 0x7f, 0x61, 0x69, + 0x35, 0x05, 0xc3, 0xbe, 0xda, 0xe4, 0x93, 0x30, 0xd7, 0xf0, 0xdb, 0x6d, 0x2e, 0xe3, 0xc4, 0x6b, + 0x08, 0x22, 0xd7, 0xa1, 0xc8, 0x0a, 0x99, 0x80, 0x60, 0xaa, 0x26, 0xb9, 0x0e, 0xc4, 0xdf, 0x61, + 0xea, 0x15, 0x6d, 0xbe, 0x49, 0x3d, 0x2a, 0x35, 0x8e, 0x33, 0xc9, 0x98, 0x92, 0x9b, 0x7d, 0x35, + 0x30, 0xa3, 0x15, 0x4f, 0x15, 0x67, 0xc4, 0xe0, 0xce, 0xe5, 0xf1, 0x6a, 0x61, 0xda, 0x7c, 0xf1, + 0xd0, 0x00, 0xdc, 0x00, 0xa6, 0x44, 0x88, 0x4f, 0x3e, 0x49, 0x0f, 0xcd, 0xc4, 0xe8, 0xf1, 0x1e, + 0x21, 0x4a, 0x51, 0x52, 0x22, 0xbf, 0x00, 0xe5, 0x1d, 0xf5, 0x4a, 0x06, 0xcf, 0x74, 0x38, 0xf6, + 0xbe, 0x98, 0x7a, 0xf0, 0x25, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x24, 0xc9, 0x0b, 0x30, 0x73, 0x6d, + 0xab, 0xaa, 0x67, 0xe1, 0x59, 0x3e, 0xfa, 0x93, 0xac, 0x09, 0x9a, 0x00, 0xb6, 0xc2, 0xb4, 0xfa, + 0x46, 0x92, 0x17, 0xdf, 0x19, 0xda, 0x18, 0xab, 0xcd, 0x6f, 0xf2, 0xb1, 0xbe, 0x78, 0x2e, 0x55, + 0x5b, 0x96, 0xa3, 0xae, 0x41, 0xde, 0x81, 0x19, 0xb9, 0x5f, 0x70, 0xd9, 0x74, 0xfe, 0xd1, 0xe2, + 0xbb, 0x31, 0x46, 0x81, 0x26, 0x3e, 0x7e, 0x67, 0xcb, 0x1f, 0x0f, 0xa0, 0x57, 0x7b, 0xed, 0xf6, + 0xe2, 0x05, 0x2e, 0x37, 0xe3, 0x3b, 0xdb, 0x18, 0x84, 0x66, 0x3d, 0xf2, 0xb2, 0xf2, 0xc8, 0xfa, + 0x50, 0xe2, 0x12, 0x5b, 0x7b, 0x64, 0x69, 0xa5, 0x7b, 0x40, 0x08, 0xc8, 0x93, 0x0f, 0x71, 0x85, + 0xda, 0x81, 0x25, 0xa5, 0xf1, 0xf5, 0x2f, 0x92, 0xc5, 0xc5, 0x84, 0xa9, 0x64, 0xe9, 0xce, 0xc0, + 0x9a, 0x78, 0x02, 0x16, 0xb2, 0x03, 0x05, 0xa7, 0xbd, 0xb3, 0xf8, 0x54, 0x1e, 0xaa, 0x6b, 0x75, + 0xa3, 0x26, 0x67, 0x14, 0x77, 0xdb, 0xac, 0x6e, 0xd4, 0x90, 0x21, 0x27, 0x2e, 0x4c, 0x3a, 0xed, + 0x9d, 0x70, 0x71, 0x89, 0xaf, 0xd9, 0xdc, 0x88, 0xc4, 0xc6, 0x83, 0x8d, 0x5a, 0x88, 0x9c, 0x84, + 0xfd, 0xa5, 0x09, 0x7d, 0x51, 0xa3, 0xf3, 0x4e, 0xbf, 0x67, 0x2e, 0x20, 0x2b, 0x8f, 0xd7, 0xec, + 0xfb, 0x5e, 0xad, 0x11, 0x7b, 0x5f, 0xe6, 0xf2, 0xe9, 0x6a, 0x91, 0x91, 0x4b, 0x92, 0xab, 0x64, + 0x4e, 0x6d, 0x71, 0x7a, 0x4e, 0x0a, 0x0c, 0xfb, 0x3b, 0xa0, 0x8d, 0x7e, 0x29, 0x6f, 0xa6, 0x00, + 0x8a, 0x6e, 0x18, 0xb9, 0x7e, 0x8e, 0x61, 0xcf, 0xa9, 0x64, 0xd4, 0x3c, 0xaa, 0x82, 0x03, 0x50, + 0x90, 0x62, 0x34, 0xbd, 0x96, 0xeb, 0xdd, 0x97, 0x9f, 0x7f, 0x2b, 0x77, 0x37, 0x25, 0x41, 0x93, + 0x03, 0x50, 0x90, 0x22, 0x77, 0xc5, 0xa4, 0x2e, 0xe4, 0x31, 0xd6, 0xd5, 0x8d, 0x5a, 0x8a, 0x5e, + 0x72, 0x72, 0xdf, 0x85, 0x42, 0xd8, 0x71, 0xa5, 0xba, 0x34, 0x26, 0xad, 0xfa, 0xe6, 0x7a, 0x16, + 0xad, 0xfa, 0xe6, 0x3a, 0x32, 0x22, 0xe4, 0x2b, 0x16, 0x80, 0xd3, 0xd9, 0x71, 0xc2, 0xd0, 0x69, + 0x6a, 0xeb, 0xcc, 0x98, 0x8f, 0x4c, 0x54, 0x35, 0xbe, 0x14, 0x69, 0xee, 0x98, 0x1b, 0x43, 0xd1, + 0xa0, 0x4c, 0xde, 0x85, 0x69, 0x47, 0xbc, 0xe2, 0x27, 0x7d, 0xcc, 0xf3, 0x79, 0x9a, 0x32, 0xc5, + 0x01, 0x37, 0xd3, 0x48, 0x10, 0x2a, 0x82, 0x8c, 0x76, 0x14, 0x38, 0x74, 0xd7, 0xdd, 0x97, 0xc6, + 0xa1, 0xfa, 0xd8, 0xef, 0x4c, 0x30, 0x64, 0x59, 0xb4, 0x25, 0x08, 0x15, 0x41, 0xf1, 0xaa, 0xba, + 0xe3, 0x39, 0x3a, 0x72, 0x30, 0x9f, 0xf8, 0x52, 0x33, 0x16, 0xd1, 0x78, 0x55, 0xdd, 0x24, 0x84, + 0x49, 0xba, 0xe4, 0x00, 0xa6, 0x1c, 0xfe, 0xbe, 0xa8, 0x3c, 0x8a, 0x61, 0x1e, 0x6f, 0x95, 0xa6, + 0xfa, 0x80, 0x0b, 0x17, 0xf9, 0x8a, 0xa9, 0xa4, 0x46, 0x7e, 0xc3, 0x82, 0x69, 0xe1, 0xfe, 0xcc, + 0x14, 0x52, 0xf6, 0xed, 0x9f, 0x3b, 0x85, 0xa4, 0xf6, 0xd2, 0x35, 0x5b, 0x7a, 0x00, 0x7d, 0x44, + 0xfb, 0x76, 0x8a, 0xd2, 0x13, 0x9d, 0xb3, 0x15, 0x77, 0x4b, 0x9f, 0x84, 0x59, 0x13, 0xcb, 0x48, + 0xee, 0xd9, 0x3f, 0x2c, 0x00, 0xf0, 0x8e, 0x16, 0xb9, 0x42, 0x3a, 0x3c, 0x03, 0xef, 0x9e, 0xdf, + 0xcc, 0xe9, 0x2d, 0x42, 0x23, 0xe5, 0x07, 0xc8, 0x74, 0xbb, 0x7b, 0x7e, 0x13, 0x25, 0x11, 0xd2, + 0x82, 0xc9, 0xae, 0x13, 0xed, 0xe5, 0x9f, 0x5f, 0xa4, 0x24, 0x82, 0x66, 0xa3, 0x3d, 0xe4, 0x04, + 0xc8, 0xfb, 0x56, 0xec, 0x1a, 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xf5, 0xd9, 0xb2, 0x74, 0x86, 0x49, + 0xe5, 0xd2, 0x4c, 0xbb, 0xc8, 0x2c, 0x7d, 0x60, 0xc1, 0xac, 0x59, 0x35, 0x63, 0x98, 0x7e, 0xde, + 0x1c, 0xa6, 0x3c, 0xfb, 0xc3, 0x1c, 0xf1, 0xff, 0x6a, 0x81, 0xf1, 0xd2, 0x7f, 0xec, 0x85, 0x6e, + 0x0d, 0xed, 0x85, 0x3e, 0x31, 0xa2, 0x17, 0x7a, 0x61, 0x24, 0x2f, 0xf4, 0xc9, 0xd1, 0xbd, 0xd0, + 0x8b, 0x83, 0xbd, 0xd0, 0xed, 0x6f, 0x58, 0x70, 0xb6, 0x6f, 0xb7, 0x61, 0x7a, 0x70, 0xe0, 0xfb, + 0xd1, 0x00, 0x97, 0x47, 0x8c, 0x41, 0x68, 0xd6, 0x23, 0x6b, 0xb0, 0x20, 0xdf, 0x9b, 0xa8, 0x77, + 0xdb, 0x6e, 0x66, 0xee, 0x97, 0xed, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0xb1, 0x60, 0xc6, 0x88, + 0x18, 0x67, 0xdf, 0xc1, 0xdd, 0x58, 0x25, 0x1b, 0xf1, 0x53, 0x1b, 0xfc, 0xa2, 0x4a, 0xc0, 0xc4, + 0x9d, 0x69, 0xcb, 0xc8, 0x46, 0x1e, 0xdf, 0x99, 0xb2, 0x52, 0x94, 0x50, 0x91, 0x67, 0x9a, 0x76, + 0x79, 0xa7, 0x17, 0xcc, 0x3c, 0xd3, 0xb4, 0x8b, 0x1c, 0xc2, 0xc9, 0xb1, 0x03, 0x81, 0x0c, 0x50, + 0x30, 0x5e, 0xf6, 0x70, 0x82, 0x08, 0x05, 0x8c, 0x3c, 0x0b, 0x05, 0xea, 0x35, 0xa5, 0xf5, 0x42, + 0xbf, 0xbd, 0x79, 0xc5, 0x6b, 0x22, 0x2b, 0xb7, 0x6f, 0xc2, 0xac, 0xf0, 0xce, 0x7d, 0x8b, 0x1e, + 0x0e, 0xfd, 0x98, 0x27, 0x9b, 0xed, 0xa9, 0xc7, 0x3c, 0x59, 0x73, 0x56, 0x6e, 0xff, 0x53, 0x0b, + 0x52, 0xcf, 0xcf, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x71, 0xa2, 0xcd, + 0xfd, 0x3a, 0x90, 0x0e, 0x5b, 0x0a, 0x89, 0xc7, 0x96, 0xa4, 0xe1, 0x28, 0xce, 0x4f, 0xd1, 0x57, + 0x03, 0x33, 0x5a, 0xd9, 0xff, 0x44, 0x30, 0x6b, 0x3e, 0x48, 0xf3, 0xf0, 0x0e, 0xe8, 0x41, 0x91, + 0xa3, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, 0xfd, 0x79, 0x9e, 0xe2, 0x81, 0x94, 0x4b, 0x9e, 0x53, + 0xb3, 0xff, 0x50, 0xf0, 0x6a, 0xbc, 0x58, 0x33, 0x04, 0xaf, 0x9d, 0x24, 0xaf, 0xd7, 0xf2, 0x92, + 0x95, 0xd9, 0x3c, 0x92, 0x65, 0x80, 0x2e, 0x0d, 0x1a, 0xd4, 0x8b, 0x54, 0xdc, 0x4c, 0x51, 0x46, + 0x70, 0xea, 0x52, 0x34, 0x6a, 0xd8, 0x5f, 0x67, 0x0b, 0x28, 0x7e, 0xe6, 0x96, 0x5c, 0x4a, 0xfb, + 0x8a, 0xa6, 0x17, 0x87, 0x76, 0x15, 0x35, 0xa2, 0x29, 0x26, 0x1e, 0x12, 0x4d, 0xf1, 0x22, 0x4c, + 0x07, 0x7e, 0x9b, 0x56, 0x03, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa0, 0x82, 0xdb, 0xbf, + 0x66, 0xc1, 0x42, 0x3a, 0xdc, 0x2b, 0x77, 0x07, 0x56, 0x33, 0x26, 0xbd, 0x30, 0x7a, 0x4c, 0xba, + 0xfd, 0x3e, 0x63, 0x32, 0x72, 0x1b, 0xfb, 0xae, 0x27, 0xc2, 0xb8, 0x59, 0xcf, 0xbd, 0x08, 0xd3, + 0x54, 0x3e, 0xd7, 0x29, 0x8c, 0xc0, 0x9a, 0x49, 0xf5, 0x4a, 0xa7, 0x82, 0x93, 0x2a, 0xcc, 0xab, + 0xab, 0x2f, 0x65, 0xb9, 0x17, 0xe9, 0x27, 0xb4, 0xa5, 0x70, 0x2d, 0x09, 0xc6, 0x74, 0x7d, 0xfb, + 0x8b, 0x30, 0x63, 0x6c, 0x4a, 0x5c, 0x7e, 0xdf, 0x77, 0x1a, 0x51, 0x5a, 0xee, 0x5d, 0x61, 0x85, + 0x28, 0x60, 0xfc, 0x82, 0x41, 0x44, 0xa3, 0xa4, 0xe4, 0x9e, 0x8c, 0x41, 0x91, 0x50, 0x86, 0x2c, + 0xa0, 0x2d, 0x7a, 0x5f, 0x25, 0x8b, 0x57, 0xc8, 0x90, 0x15, 0xa2, 0x80, 0xd9, 0x2f, 0x41, 0x49, + 0x25, 0x09, 0xe2, 0x99, 0x36, 0x94, 0xf1, 0xdb, 0xcc, 0xb4, 0xe1, 0x07, 0x11, 0x72, 0x88, 0xfd, + 0x36, 0x94, 0x54, 0x2e, 0xa3, 0x87, 0xd7, 0x66, 0xa2, 0x28, 0xf4, 0xdc, 0x6b, 0x7e, 0x18, 0xa9, + 0x04, 0x4c, 0xe2, 0x7e, 0xee, 0xc6, 0x3a, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x86, 0xf9, 0xd4, 0x3d, + 0xed, 0x10, 0x69, 0x39, 0x7e, 0xb7, 0x00, 0xb3, 0xe6, 0x75, 0xdd, 0x10, 0xab, 0x78, 0x78, 0xe1, + 0x98, 0x71, 0xc5, 0x56, 0x18, 0xf1, 0x8a, 0xcd, 0xbc, 0xd3, 0x9c, 0x3c, 0xdd, 0x3b, 0xcd, 0x62, + 0x3e, 0x77, 0x9a, 0xc6, 0xdd, 0xfb, 0xd4, 0xe3, 0xbb, 0x7b, 0xff, 0xed, 0x22, 0xcc, 0x25, 0xf3, + 0x3c, 0x0e, 0x31, 0x92, 0x2f, 0xf5, 0x8d, 0xe4, 0x88, 0x36, 0xfd, 0xc2, 0xb8, 0x36, 0xfd, 0xc9, + 0x71, 0x6d, 0xfa, 0xc5, 0x47, 0xb0, 0xe9, 0xf7, 0x5b, 0xe4, 0xa7, 0x86, 0xb6, 0xc8, 0x7f, 0x4a, + 0x7b, 0xe5, 0x4d, 0x27, 0xdc, 0x58, 0x62, 0xaf, 0x3c, 0x92, 0x1c, 0x86, 0x55, 0xbf, 0x99, 0xe9, + 0xdd, 0x58, 0x7a, 0x88, 0xed, 0x32, 0xc8, 0x74, 0xa2, 0x1b, 0xfd, 0xda, 0xf0, 0x43, 0x23, 0x38, + 0xd0, 0xbd, 0x0a, 0x33, 0x72, 0x3e, 0x71, 0x15, 0x14, 0x92, 0xea, 0x6b, 0x3d, 0x06, 0xa1, 0x59, + 0x8f, 0xbf, 0x77, 0x9e, 0x7c, 0x05, 0x9f, 0x5f, 0x91, 0x98, 0xef, 0x9d, 0xa7, 0x5e, 0xcd, 0x4f, + 0xd7, 0xb7, 0xbf, 0x00, 0x17, 0x32, 0xcd, 0x08, 0xdc, 0x84, 0xcb, 0xb5, 0x23, 0xda, 0x94, 0x15, + 0x0c, 0x36, 0x52, 0xef, 0x24, 0x2c, 0xdd, 0x19, 0x58, 0x13, 0x4f, 0xc0, 0x62, 0x7f, 0xbb, 0x00, + 0x73, 0xc9, 0xc7, 0x32, 0xc9, 0x3d, 0x6d, 0x74, 0xcc, 0xc5, 0xde, 0x29, 0xd0, 0x1a, 0xb9, 0x03, + 0x07, 0x5e, 0x56, 0xdc, 0xe3, 0xf3, 0x6b, 0x47, 0x27, 0x32, 0x3c, 0x3d, 0xc2, 0xf2, 0x96, 0x40, + 0x92, 0xe3, 0xef, 0x61, 0xc6, 0x61, 0x86, 0xf2, 0x34, 0x9b, 0x3b, 0xf5, 0x38, 0x5c, 0x4e, 0x93, + 0x42, 0x83, 0x2c, 0xdb, 0x5b, 0x0e, 0x68, 0xe0, 0xee, 0xba, 0xfa, 0xa1, 0x6f, 0x2e, 0xb9, 0xdf, + 0x96, 0x65, 0xa8, 0xa1, 0xf6, 0xfb, 0x13, 0x50, 0xe6, 0x59, 0x91, 0xae, 0x06, 0x7e, 0x87, 0xbf, + 0x28, 0x17, 0x1a, 0x27, 0x07, 0x39, 0x6c, 0xd7, 0xc7, 0x7d, 0xb6, 0x31, 0xc6, 0x28, 0x3d, 0xa6, + 0x8d, 0x12, 0x4c, 0x50, 0x24, 0x5d, 0x28, 0xed, 0xca, 0x2c, 0xae, 0x72, 0xec, 0xc6, 0xcc, 0x44, + 0xa8, 0x72, 0xc2, 0x8a, 0x2e, 0x50, 0xff, 0x50, 0x53, 0xb1, 0x1d, 0x98, 0x4f, 0xa5, 0xb5, 0xc8, + 0x3d, 0xf7, 0xeb, 0xff, 0x98, 0x84, 0xb2, 0x0e, 0xd7, 0x21, 0x9f, 0x48, 0x98, 0x71, 0xca, 0xb5, + 0x0f, 0x1b, 0xcf, 0x1d, 0xed, 0xf9, 0xcd, 0x07, 0x47, 0x95, 0x79, 0x5d, 0x39, 0x65, 0x92, 0x79, + 0x16, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa7, 0xdd, 0xc6, 0x0d, 0x64, 0xe5, 0x66, 0x88, 0x51, 0xe1, + 0xb1, 0x86, 0x18, 0xb1, 0x5d, 0x72, 0xc7, 0x6f, 0x1e, 0xa6, 0x9f, 0x47, 0xaa, 0xf9, 0xcd, 0x43, + 0xe4, 0x10, 0xf2, 0x06, 0xcc, 0xc9, 0xb8, 0x29, 0xf3, 0xd1, 0xf8, 0x42, 0x7c, 0xf9, 0xbe, 0x9d, + 0x80, 0x62, 0xaa, 0x36, 0xdb, 0x65, 0xef, 0x86, 0xbe, 0xc7, 0x33, 0xfa, 0x4e, 0x25, 0x6f, 0xea, + 0xae, 0xd7, 0x6f, 0xde, 0xe0, 0xe6, 0x24, 0x5d, 0x23, 0x11, 0x9a, 0x35, 0xfd, 0xd0, 0xd0, 0xac, + 0x35, 0x81, 0x9b, 0x71, 0xcb, 0x77, 0x94, 0xd9, 0xda, 0x25, 0x85, 0x97, 0x95, 0x3d, 0x38, 0x3a, + 0xc1, 0xd0, 0xa7, 0x5b, 0x66, 0x05, 0xb1, 0x95, 0x7f, 0x7c, 0x41, 0x6c, 0xf6, 0x6d, 0x98, 0x4f, + 0x8d, 0x9f, 0x3a, 0xe6, 0x5b, 0xd9, 0xc7, 0xfc, 0xe1, 0x1e, 0x58, 0xfa, 0xe7, 0x16, 0x9c, 0xed, + 0x93, 0x48, 0xc3, 0x46, 0x13, 0xa6, 0xf7, 0xc6, 0x89, 0x47, 0xdf, 0x1b, 0x0b, 0xa3, 0xed, 0x8d, + 0xb5, 0x9d, 0xef, 0xfe, 0xe0, 0xe2, 0x13, 0xdf, 0xfb, 0xc1, 0xc5, 0x27, 0xfe, 0xe8, 0x07, 0x17, + 0x9f, 0x78, 0xff, 0xf8, 0xa2, 0xf5, 0xdd, 0xe3, 0x8b, 0xd6, 0xf7, 0x8e, 0x2f, 0x5a, 0x7f, 0x74, + 0x7c, 0xd1, 0xfa, 0x8f, 0xc7, 0x17, 0xad, 0x6f, 0xfc, 0xd9, 0xc5, 0x27, 0x3e, 0xfd, 0xa9, 0x78, + 0xa4, 0x56, 0xd4, 0x48, 0xf1, 0x1f, 0x1f, 0x55, 0xe3, 0xb2, 0xd2, 0xdd, 0x6f, 0xad, 0xb0, 0x91, + 0x5a, 0xd1, 0x25, 0x6a, 0xa4, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x43, 0x1e, 0xac, 0xfd, + 0x31, 0xa2, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -5943,7 +5948,36 @@ func (m *DatadogMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.ApiVersion) i = encodeVarintGenerated(dAtA, i, uint64(len(m.ApiVersion))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x2a + i -= len(m.Formula) + copy(dAtA[i:], m.Formula) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Formula))) + i-- + dAtA[i] = 0x22 + if len(m.Queries) > 0 { + keysForQueries := make([]string, 0, len(m.Queries)) + for k := range m.Queries { + keysForQueries = append(keysForQueries, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForQueries) + for iNdEx := len(keysForQueries) - 1; iNdEx >= 0; iNdEx-- { + v := m.Queries[string(keysForQueries[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForQueries[iNdEx]) + copy(dAtA[i:], keysForQueries[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForQueries[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1a + } + } i -= len(m.Query) copy(dAtA[i:], m.Query) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Query))) @@ -10989,6 +11023,16 @@ func (m *DatadogMetric) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Query) n += 1 + l + sovGenerated(uint64(l)) + if len(m.Queries) > 0 { + for k, v := range m.Queries { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + l = len(m.Formula) + n += 1 + l + sovGenerated(uint64(l)) l = len(m.ApiVersion) n += 1 + l + sovGenerated(uint64(l)) return n @@ -13113,9 +13157,21 @@ func (this *DatadogMetric) String() string { if this == nil { return "nil" } + keysForQueries := make([]string, 0, len(this.Queries)) + for k := range this.Queries { + keysForQueries = append(keysForQueries, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForQueries) + mapStringForQueries := "map[string]string{" + for _, k := range keysForQueries { + mapStringForQueries += fmt.Sprintf("%v: %v,", k, this.Queries[k]) + } + mapStringForQueries += "}" s := strings.Join([]string{`&DatadogMetric{`, `Interval:` + fmt.Sprintf("%v", this.Interval) + `,`, `Query:` + fmt.Sprintf("%v", this.Query) + `,`, + `Queries:` + mapStringForQueries + `,`, + `Formula:` + fmt.Sprintf("%v", this.Formula) + `,`, `ApiVersion:` + fmt.Sprintf("%v", this.ApiVersion) + `,`, `}`, }, "") @@ -20652,6 +20708,165 @@ func (m *DatadogMetric) Unmarshal(dAtA []byte) error { m.Query = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Queries == nil { + m.Queries = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Queries[mapkey] = mapvalue + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Formula", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Formula = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ApiVersion", wireType) } diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index e9ca26687b..248eeaec09 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -617,12 +617,23 @@ message ClusterAnalysisTemplateList { } message DatadogMetric { + // +kubebuilder:default="5m" + // Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric. optional string interval = 1; optional string query = 2; + // Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2 + // +kubebuilder:validation:Type=object + map queries = 3; + + // Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2 + optional string formula = 4; + // ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated. - optional string apiVersion = 3; + // +kubebuilder:validation:Enum=v1;v2 + // +kubebuilder:default=v1 + optional string apiVersion = 5; } // DryRun defines the settings for running the analysis in Dry-Run mode. diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 28a35188c5..01b39597e2 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -1835,16 +1835,39 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac Type: []string{"object"}, Properties: map[string]spec.Schema{ "interval": { + SchemaProps: spec.SchemaProps{ + Description: "Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric.", + Type: []string{"string"}, + Format: "", + }, + }, + "query": { SchemaProps: spec.SchemaProps{ Type: []string{"string"}, Format: "", }, }, - "query": { + "queries": { SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", + Description: "Queries is a map of query_name_as_key: query. You can then use query_name_as_key inside Formula.Used for v2", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "formula": { + SchemaProps: spec.SchemaProps{ + Description: "Formula refers to the Formula made up of the queries. Only useful with Queries. Used for v2", + Type: []string{"string"}, + Format: "", }, }, "apiVersion": { @@ -1855,7 +1878,6 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac }, }, }, - Required: []string{"query"}, }, }, } diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index aec01a262c..82b7cc8cc4 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1098,6 +1098,13 @@ func (in *ClusterAnalysisTemplateList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DatadogMetric) DeepCopyInto(out *DatadogMetric) { *out = *in + if in.Queries != nil { + in, out := &in.Queries, &out.Queries + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return } @@ -1684,7 +1691,7 @@ func (in *MetricProvider) DeepCopyInto(out *MetricProvider) { if in.Datadog != nil { in, out := &in.Datadog, &out.Datadog *out = new(DatadogMetric) - **out = **in + (*in).DeepCopyInto(*out) } if in.Wavefront != nil { in, out := &in.Wavefront, &out.Wavefront diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 28465a76a8..eb0a755c17 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -977,7 +977,7 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchM */ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric { /** - * + * +kubebuilder:default=\"5m\" Interval refers to the Interval time window in Datadog (default: 5m). Not to be confused with the polling rate for the metric. * @type {string} * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric */ @@ -989,7 +989,19 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetr */ query?: string; /** - * ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated. + * + * @type {{ [key: string]: string; }} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + queries?: { [key: string]: string; }; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + formula?: string; + /** + * * @type {string} * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric */ From 9b2d607d1f18a82d4cf9bc8ea22a873d843aa7ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 02:25:09 +0000 Subject: [PATCH 068/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.21.4 to 1.21.6 (#3100) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.21.4 to 1.21.6. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.21.4...service/efs/v1.21.6) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 063a2e2cca..5f3b742ffa 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.21.2 github.com/aws/aws-sdk-go-v2/config v1.18.44 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 872c0cf226..d93399096a 100644 --- a/go.sum +++ b/go.sum @@ -104,7 +104,6 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.21.0/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= @@ -115,12 +114,10 @@ github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpl github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.41/go.mod h1:CrObHAuPneJBlfEJ5T3szXOUkLEThaGfvnhTf33buas= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.35/go.mod h1:SJC1nEVVva1g3pHAIdCp7QsRIkMmLAgoDquQ9Rr8kYw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= @@ -128,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52 github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 h1:qDmaPhgjG6Mc5m/2sP+GFBUcp+bZnJMbFbxTAokRv+Q= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4 h1:hcJmu7oeocSOHQKaifUoMWaSxengFuvGriP7SvuVvTw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.4/go.mod h1:CbJHS0jJJNd2dZOakkG5TBbT8OHz+T0UBzR1ClIdezI= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 h1:qIjRTVTFHa/R+k3Cl3ycLjnWYUXhLThmqW3ZbCn6G6o= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= @@ -141,7 +138,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7 github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 h1:ASNYk1ypWAxRhJjKS0jBnTUeDl7HROOpeSMu1xDA/I8= github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 5597ae6548d34522b0ebd5d7f5c68d7b2f04c83c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 01:08:48 -0700 Subject: [PATCH 069/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.44 to 1.18.45 (#3101) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.44 to 1.18.45. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.44...config/v1.18.45) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 35 ++++++++++++++++------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index 5f3b742ffa..064482f852 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/config v1.18.44 + github.com/aws/aws-sdk-go-v2/config v1.18.45 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 github.com/blang/semver v3.5.1+incompatible @@ -83,16 +83,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect github.com/aws/smithy-go v1.15.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index d93399096a..c9535a7e30 100644 --- a/go.sum +++ b/go.sum @@ -104,39 +104,36 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= -github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= +github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= +github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 h1:qDmaPhgjG6Mc5m/2sP+GFBUcp+bZnJMbFbxTAokRv+Q= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 h1:qIjRTVTFHa/R+k3Cl3ycLjnWYUXhLThmqW3ZbCn6G6o= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 h1:ASNYk1ypWAxRhJjKS0jBnTUeDl7HROOpeSMu1xDA/I8= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= From 439fa5249c0175698cb530d187c4d4a9c76b49da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:44:12 -0700 Subject: [PATCH 070/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.18.45 to 1.19.0 (#3109) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.18.45 to 1.19.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/v1.19.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.18.45...v1.19.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 064482f852..49c62278ef 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/config v1.18.45 + github.com/aws/aws-sdk-go-v2/config v1.19.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 github.com/blang/semver v3.5.1+incompatible diff --git a/go.sum b/go.sum index c9535a7e30..8e5c4d2890 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= -github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/config v1.19.0 h1:AdzDvwH6dWuVARCl3RTLGRc4Ogy+N7yLFxVxXe1ClQ0= +github.com/aws/aws-sdk-go-v2/config v1.19.0/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= From 9ecdeed7aa24843ff71e4380781f0e3075497436 Mon Sep 17 00:00:00 2001 From: Jason Meridth Date: Mon, 23 Oct 2023 06:23:23 -0500 Subject: [PATCH 071/264] docs: add CONTRIBUTING.md at root of repo, directing to docs/ (#3121) Add a root CONTRIBUTING.md that directs to docs/CONTRIBUTING.md # Details - having a `CONTRIBUTING.md` at the root of the repo is a common convention - I looked at the root of the repo initially, didn't find it, then checked the website, but potential contributors may think it doesn't exist as a result Shamelessly copied from https://github.com/argoproj/argo-workflows/pull/10969 (thank you @agilgur5) Signed-off-by: jmeridth --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..e445d367af --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1 @@ +See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md). From 047f2a21732421da486f5b0384c57f023c4305e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 06:24:38 -0500 Subject: [PATCH 072/264] chore(deps): bump golang.org/x/oauth2 from 0.10.0 to 0.13.0 (#3107) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.10.0 to 0.13.0. - [Commits](https://github.com/golang/oauth2/compare/v0.10.0...v0.13.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 49c62278ef..913c92bd35 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.10.0 + golang.org/x/oauth2 v0.13.0 google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 google.golang.org/grpc v1.58.3 google.golang.org/protobuf v1.31.0 @@ -177,12 +177,12 @@ require ( github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.12.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/net v0.16.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect diff --git a/go.sum b/go.sum index 8e5c4d2890..1e8a4b3e21 100644 --- a/go.sum +++ b/go.sum @@ -762,8 +762,8 @@ golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -850,8 +850,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -859,8 +859,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -946,8 +946,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -955,8 +955,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -971,8 +971,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 7f25955852e69e2f221b315395517458f7925ba9 Mon Sep 17 00:00:00 2001 From: Jesse Suen Date: Mon, 23 Oct 2023 05:51:57 -0700 Subject: [PATCH 073/264] fix: rollback to stable with dynamicStableScale could overwhelm stable pods (#3077) * fix: rollback to stable with dynamicStableScale could go under maxUnavailable Signed-off-by: Jesse Suen * test: add unit tests Signed-off-by: Jesse Suen * test: add e2e tests Signed-off-by: Jesse Suen * refactor: move isReplicaSetReferenced to replicaset.go Signed-off-by: Jesse Suen --------- Signed-off-by: Jesse Suen --- rollout/bluegreen.go | 7 +- rollout/canary.go | 49 ++++---- rollout/canary_test.go | 118 ++++++++++++++++++ rollout/replicaset.go | 55 +++++++++ rollout/replicaset_test.go | 182 ++++++++++++++++++++++++++++ rollout/service.go | 15 ++- rollout/service_test.go | 47 +++---- rollout/trafficrouting.go | 43 ++++--- rollout/trafficrouting_test.go | 97 ++++++++++++++- test/e2e/canary_test.go | 60 +++++++++ test/fixtures/common.go | 8 ++ test/fixtures/when.go | 12 ++ utils/replicaset/canary.go | 9 +- utils/replicaset/replicaset.go | 11 -- utils/replicaset/replicaset_test.go | 42 ------- 15 files changed, 631 insertions(+), 124 deletions(-) diff --git a/rollout/bluegreen.go b/rollout/bluegreen.go index 887e022e28..f1bcf7a7bb 100644 --- a/rollout/bluegreen.go +++ b/rollout/bluegreen.go @@ -220,10 +220,9 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForBlueGreen(oldRSs []*appsv1.Re annotationedRSs := int32(0) rolloutReplicas := defaults.GetReplicasOrDefault(c.rollout.Spec.Replicas) for _, targetRS := range oldRSs { - if replicasetutil.IsStillReferenced(c.rollout.Status, targetRS) { - // We should technically never get here because we shouldn't be passing a replicaset list - // which includes referenced ReplicaSets. But we check just in case - c.log.Warnf("Prevented inadvertent scaleDown of RS '%s'", targetRS.Name) + if c.isReplicaSetReferenced(targetRS) { + // We might get here if user interrupted an an update in order to move back to stable. + c.log.Infof("Skip scale down of older RS '%s': still referenced", targetRS.Name) continue } if *targetRS.Spec.Replicas == 0 { diff --git a/rollout/canary.go b/rollout/canary.go index dff4b52d50..b443db507e 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -180,10 +180,9 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli annotationedRSs := int32(0) for _, targetRS := range oldRSs { - if replicasetutil.IsStillReferenced(c.rollout.Status, targetRS) { - // We should technically never get here because we shouldn't be passing a replicaset list - // which includes referenced ReplicaSets. But we check just in case - c.log.Warnf("Prevented inadvertent scaleDown of RS '%s'", targetRS.Name) + if c.isReplicaSetReferenced(targetRS) { + // We might get here if user interrupted an an update in order to move back to stable. + c.log.Infof("Skip scale down of older RS '%s': still referenced", targetRS.Name) continue } if maxScaleDown <= 0 { @@ -220,15 +219,8 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli // and doesn't yet have scale down deadline. This happens when a user changes their // mind in the middle of an V1 -> V2 update, and then applies a V3. We are deciding // what to do with the defunct, intermediate V2 ReplicaSet right now. - if !c.replicaSetReferencedByCanaryTraffic(targetRS) { - // It is safe to scale the intermediate RS down, if no traffic is directed to it. - c.log.Infof("scaling down intermediate RS '%s'", targetRS.Name) - } else { - c.log.Infof("Skip scaling down intermediate RS '%s': still referenced by service", targetRS.Name) - // This ReplicaSet is still referenced by the service. It is not safe to scale - // this down. - continue - } + // It is safe to scale the intermediate RS down, since no traffic is directed to it. + c.log.Infof("scaling down intermediate RS '%s'", targetRS.Name) } } if *targetRS.Spec.Replicas == desiredReplicaCount { @@ -248,19 +240,26 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli return totalScaledDown, nil } -func (c *rolloutContext) replicaSetReferencedByCanaryTraffic(rs *appsv1.ReplicaSet) bool { - rsPodHash := replicasetutil.GetPodTemplateHash(rs) - ro := c.rollout - - if ro.Status.Canary.Weights == nil { - return false - } - - if ro.Status.Canary.Weights.Canary.PodTemplateHash == rsPodHash || ro.Status.Canary.Weights.Stable.PodTemplateHash == rsPodHash { - return true +// isDynamicallyRollingBackToStable returns true if we were in the middle of an canary update with +// dynamic stable scaling, but was interrupted and are now rolling back to stable RS. This is similar +// to, but different than aborting. With abort, desired hash != stable hash and so we know the +// two hashes to balance traffic against. But with dynamically rolling back to stable, the +// desired hash == stable hash, and so we must use the *previous* desired hash and balance traffic +// between previous desired vs. stable hash, in order to safely shift traffic back to stable. +// This function also returns the previous desired hash (where we are weighted to) +func isDynamicallyRollingBackToStable(ro *v1alpha1.Rollout, desiredRS *appsv1.ReplicaSet) (bool, string) { + if rolloututil.IsFullyPromoted(ro) && ro.Spec.Strategy.Canary.TrafficRouting != nil && ro.Spec.Strategy.Canary.DynamicStableScale { + if ro.Status.Canary.Weights != nil { + currSelector := ro.Status.Canary.Weights.Canary.PodTemplateHash + desiredSelector := replicasetutil.GetPodTemplateHash(desiredRS) + if currSelector != desiredSelector { + if desiredRS.Status.AvailableReplicas < *ro.Spec.Replicas { + return true, currSelector + } + } + } } - - return false + return false, "" } // canProceedWithScaleDownAnnotation returns whether or not it is safe to proceed with annotating diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 4adca3fcb9..f136a01e42 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -1890,3 +1891,120 @@ func TestHandleCanaryAbort(t *testing.T) { assert.JSONEq(t, calculatePatch(r1, fmt.Sprintf(expectedPatch, newConditions)), patch) }) } + +func TestIsDynamicallyRollingBackToStable(t *testing.T) { + newRSWithHashAndReplicas := func(hash string, available int32) *appsv1.ReplicaSet { + return &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: hash, + }, + }, + Status: v1.ReplicaSetStatus{ + AvailableReplicas: available, + }, + } + } + + testCases := []struct { + name string + status v1alpha1.RolloutStatus + trafficRoutingDisabled bool + dynamicStableScalingDisabled bool + rsHash string + rsAvailableReplicas *int32 // if nil, will set to rollout replicas + trafficWeights *v1alpha1.TrafficWeights + expectedResult bool + }{ + { + name: "desired RS != stable RS", + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "def456"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not using traffic routing", + trafficRoutingDisabled: true, + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not using dynamicStableScaling", + dynamicStableScalingDisabled: true, + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123", StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "weighted selector == desired RS", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }, + }, + }, + rsHash: "abc123", + expectedResult: false, + }, + { + name: "weighted selector != desired RS, desired not fully available", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "def456", + }, + }, + }, + }, + rsHash: "abc123", + rsAvailableReplicas: pointer.Int32(1), + expectedResult: true, + }, + { + name: "weighted selector != desired RS, desired RS is fully available", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + Canary: v1alpha1.CanaryStatus{ + Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "def456", + }, + }, + }, + }, + rsHash: "abc123", + expectedResult: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + ro := newCanaryRollout("test", 10, nil, nil, nil, intstr.FromInt(0), intstr.FromInt(1)) + if !tc.trafficRoutingDisabled { + ro.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{} + } + if !tc.dynamicStableScalingDisabled { + ro.Spec.Strategy.Canary.DynamicStableScale = true + } + ro.Status = tc.status + + desiredRS := newRSWithHashAndReplicas(tc.rsHash, 1) + if tc.rsAvailableReplicas != nil { + desiredRS.Status.AvailableReplicas = *tc.rsAvailableReplicas + } + + rbToStable, _ := isDynamicallyRollingBackToStable(ro, desiredRS) + + assert.Equal(t, tc.expectedResult, rbToStable) + }) + } +} diff --git a/rollout/replicaset.go b/rollout/replicaset.go index fad23e756e..7d9a71f62a 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -7,6 +7,7 @@ import ( "time" appsv1 "k8s.io/api/apps/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" patchtypes "k8s.io/apimachinery/pkg/types" @@ -15,6 +16,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" + serviceutil "github.com/argoproj/argo-rollouts/utils/service" timeutil "github.com/argoproj/argo-rollouts/utils/time" ) @@ -296,3 +298,56 @@ func (c *rolloutContext) scaleDownDelayHelper(rs *appsv1.ReplicaSet, annotatione return annotationedRSs, desiredReplicaCount, nil } + +// isReplicaSetReferenced returns if the given ReplicaSet is still being referenced by any of +// the current, stable, blue-green services. Used to determine if the ReplicaSet can +// safely be scaled to zero, or deleted. +func (c *rolloutContext) isReplicaSetReferenced(rs *appsv1.ReplicaSet) bool { + rsPodHash := replicasetutil.GetPodTemplateHash(rs) + if rsPodHash == "" { + return false + } + ro := c.rollout + referencesToCheck := []string{ + ro.Status.StableRS, + ro.Status.CurrentPodHash, + ro.Status.BlueGreen.ActiveSelector, + ro.Status.BlueGreen.PreviewSelector, + } + if ro.Status.Canary.Weights != nil { + referencesToCheck = append(referencesToCheck, ro.Status.Canary.Weights.Canary.PodTemplateHash, ro.Status.Canary.Weights.Stable.PodTemplateHash) + } + for _, ref := range referencesToCheck { + if ref == rsPodHash { + return true + } + } + + // The above are static, lightweight checks to see if the selectors we record in our status are + // still referencing the ReplicaSet in question. Those checks aren't always enough. Next, we do + // a deeper check to look up the actual service objects, and see if they are still referencing + // the ReplicaSet. If so, we cannot scale it down. + var servicesToCheck []string + if ro.Spec.Strategy.Canary != nil { + servicesToCheck = []string{ro.Spec.Strategy.Canary.CanaryService, ro.Spec.Strategy.Canary.StableService} + } else { + servicesToCheck = []string{ro.Spec.Strategy.BlueGreen.ActiveService, ro.Spec.Strategy.BlueGreen.PreviewService} + } + for _, svcName := range servicesToCheck { + if svcName == "" { + continue + } + svc, err := c.servicesLister.Services(c.rollout.Namespace).Get(svcName) + if err != nil { + if k8serrors.IsNotFound(err) { + // service doesn't exist + continue + } + return true + } + if serviceutil.GetRolloutSelectorLabel(svc) == rsPodHash { + return true + } + } + return false +} diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index 10c1dc0893..3d87cf3132 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -8,6 +8,9 @@ import ( "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/intstr" + k8sinformers "k8s.io/client-go/informers" k8sfake "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" "k8s.io/utils/pointer" @@ -353,3 +356,182 @@ func TestReconcileOldReplicaSet(t *testing.T) { }) } } + +func TestIsReplicaSetReferenced(t *testing.T) { + newRSWithPodTemplateHash := func(hash string) *appsv1.ReplicaSet { + return &appsv1.ReplicaSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: hash, + }, + }, + } + } + + testCases := []struct { + name string + status v1alpha1.RolloutStatus + canaryService string + stableService string + activeService string + previewService string + services []runtime.Object + rsHash string + expectedResult bool + }{ + { + name: "empty hash", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "", + expectedResult: false, + }, + { + name: "not referenced", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "def456", + expectedResult: false, + }, + { + name: "stable rs referenced", + status: v1alpha1.RolloutStatus{StableRS: "abc123"}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "current rs referenced", + status: v1alpha1.RolloutStatus{CurrentPodHash: "abc123"}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "active referenced", + status: v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{ActiveSelector: "abc123"}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "active referenced", + status: v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{PreviewSelector: "abc123"}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "traffic routed canary current pod hash", + status: v1alpha1.RolloutStatus{Canary: v1alpha1.CanaryStatus{Weights: &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "traffic routed canary current pod hash", + status: v1alpha1.RolloutStatus{Canary: v1alpha1.CanaryStatus{Weights: &v1alpha1.TrafficWeights{ + Stable: v1alpha1.WeightDestination{ + PodTemplateHash: "abc123", + }, + }}}, + rsHash: "abc123", + expectedResult: true, + }, + { + name: "canary service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + canaryService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "stable service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + stableService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "active service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + services: []runtime.Object{newService("mysvc", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "preview service still referenced", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + previewService: "mysvc2", + services: []runtime.Object{newService("mysvc2", 80, map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: "def456"}, nil)}, + rsHash: "def456", + expectedResult: true, + }, + { + name: "service not found", + status: v1alpha1.RolloutStatus{ + CurrentPodHash: "abc123", + StableRS: "abc123", + }, + activeService: "mysvc", + previewService: "mysvc2", + rsHash: "def456", + expectedResult: false, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + + fake := fake.Clientset{} + k8sfake := k8sfake.NewSimpleClientset(tc.services...) + informers := k8sinformers.NewSharedInformerFactory(k8sfake, 0) + servicesLister := informers.Core().V1().Services().Lister() + stopchan := make(chan struct{}) + defer close(stopchan) + informers.Start(stopchan) + informers.WaitForCacheSync(stopchan) + + var r *v1alpha1.Rollout + if tc.activeService != "" { + r = newBlueGreenRollout("test", 1, nil, tc.activeService, tc.previewService) + } else { + r = newCanaryRollout("test", 1, nil, nil, nil, intstr.FromInt(0), intstr.FromInt(1)) + r.Spec.Strategy.Canary.CanaryService = tc.canaryService + r.Spec.Strategy.Canary.StableService = tc.stableService + } + r.Status = tc.status + + roCtx := &rolloutContext{ + rollout: r, + log: logutil.WithRollout(r), + reconcilerBase: reconcilerBase{ + servicesLister: servicesLister, + argoprojclientset: &fake, + kubeclientset: k8sfake, + recorder: record.NewFakeEventRecorder(), + }, + } + rs := newRSWithPodTemplateHash(tc.rsHash) + stillReferenced := roCtx.isReplicaSetReferenced(rs) + + assert.Equal( + t, + tc.expectedResult, + stillReferenced, + ) + }) + } +} diff --git a/rollout/service.go b/rollout/service.go index f808cb55fc..69739b9315 100644 --- a/rollout/service.go +++ b/rollout/service.go @@ -147,7 +147,7 @@ func (c *rolloutContext) awsVerifyTargetGroups(svc *corev1.Service) error { return nil } - c.targetsVerified = pointer.BoolPtr(false) + c.targetsVerified = pointer.Bool(false) // get endpoints of service endpoints, err := c.kubeclientset.CoreV1().Endpoints(svc.Namespace).Get(ctx, svc.Name, metav1.GetOptions{}) @@ -177,7 +177,7 @@ func (c *rolloutContext) awsVerifyTargetGroups(svc *corev1.Service) error { } c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifiedReason}, conditions.TargetGroupVerifiedRegistrationMessage, svc.Name, tgb.Spec.TargetGroupARN, verifyRes.EndpointsRegistered) } - c.targetsVerified = pointer.BoolPtr(true) + c.targetsVerified = pointer.Bool(true) return nil } @@ -266,6 +266,17 @@ func (c *rolloutContext) reconcileStableAndCanaryService() error { return nil } + if dynamicallyRollingBackToStable, currSelector := isDynamicallyRollingBackToStable(c.rollout, c.newRS); dynamicallyRollingBackToStable { + // User may have interrupted an update in order go back to stableRS, and is using dynamic + // stable scaling. If that is the case, the stableRS might be undersized and if we blindly + // switch service selector we could overwhelm stableRS pods. + // If we get here, we detected that the canary service needs to be pointed back to + // stable, but stable is not fully available. Skip the service switch for now. + c.log.Infof("delaying fully promoted service switch of '%s' from %s to %s: ReplicaSet '%s' not fully available", + c.rollout.Spec.Strategy.Canary.CanaryService, currSelector, replicasetutil.GetPodTemplateHash(c.newRS), c.newRS.Name) + return nil + } + err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.newRS, true) if err != nil { return err diff --git a/rollout/service_test.go b/rollout/service_test.go index e29ee53b4a..cb15367a3a 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -437,26 +437,26 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { TargetHealthDescriptions: []elbv2types.TargetHealthDescription{ { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("1.2.3.4"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("1.2.3.4"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("5.6.7.8"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("5.6.7.8"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("2.4.6.8"), // irrelevant - Port: pointer.Int32Ptr(81), // wrong port + Id: pointer.String("2.4.6.8"), // irrelevant + Port: pointer.Int32(81), // wrong port }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("9.8.7.6"), // irrelevant ip - Port: pointer.Int32Ptr(80), + Id: pointer.String("9.8.7.6"), // irrelevant ip + Port: pointer.Int32(80), }, }, }, @@ -464,8 +464,8 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { fakeELB.On("DescribeTargetHealth", mock.Anything, mock.Anything).Return(&thOut, nil) r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ @@ -491,6 +491,7 @@ func TestCanaryAWSVerifyTargetGroupsNotYetReady(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) @@ -536,26 +537,26 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { TargetHealthDescriptions: []elbv2types.TargetHealthDescription{ { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("1.2.3.4"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("1.2.3.4"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("5.6.7.8"), - Port: pointer.Int32Ptr(80), + Id: pointer.String("5.6.7.8"), + Port: pointer.Int32(80), }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("2.4.6.8"), // irrelevant - Port: pointer.Int32Ptr(80), // wrong port + Id: pointer.String("2.4.6.8"), // irrelevant + Port: pointer.Int32(80), // wrong port }, }, { Target: &elbv2types.TargetDescription{ - Id: pointer.StringPtr("9.8.7.6"), // irrelevant ip - Port: pointer.Int32Ptr(80), + Id: pointer.String("9.8.7.6"), // irrelevant ip + Port: pointer.Int32(80), }, }, }, @@ -563,8 +564,8 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { fakeELB.On("DescribeTargetHealth", mock.Anything, mock.Anything).Return(&thOut, nil) r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ Ingress: "ingress", @@ -589,6 +590,7 @@ func TestCanaryAWSVerifyTargetGroupsReady(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) @@ -624,8 +626,8 @@ func TestCanaryAWSVerifyTargetGroupsSkip(t *testing.T) { defer f.Close() r1 := newCanaryRollout("foo", 3, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromString("25%"), intstr.FromString("25%")) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromString("25%"), intstr.FromString("25%")) r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ ALB: &v1alpha1.ALBTrafficRouting{ Ingress: "ingress", @@ -652,6 +654,7 @@ func TestCanaryAWSVerifyTargetGroupsSkip(t *testing.T) { r2.Status.Message = "" r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) r2.Status.StableRS = rs2PodHash + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) healthyCondition, _ := newHealthyCondition(false) diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index c7b3bf7055..a87e31a9e8 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -163,25 +163,20 @@ func (c *rolloutContext) reconcileTrafficRouting() error { canaryHash = c.newRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] } - if rolloututil.IsFullyPromoted(c.rollout) { - // when we are fully promoted. desired canary weight should be 0 + if dynamicallyRollingBackToStable, prevDesiredHash := isDynamicallyRollingBackToStable(c.rollout, c.newRS); dynamicallyRollingBackToStable { + desiredWeight = c.calculateDesiredWeightOnAbortOrStableRollback() + // Since stableRS == desiredRS, we must balance traffic between the + // *previous desired* vs. stable (as opposed to current desired vs. stable). + // The previous desired is remembered in Status.Canary.Weights.Canary.PodTemplateHash. + // See: https://github.com/argoproj/argo-rollouts/issues/3020 + canaryHash = prevDesiredHash + } else if rolloututil.IsFullyPromoted(c.rollout) { err := reconciler.RemoveManagedRoutes() if err != nil { return err } } else if c.pauseContext.IsAborted() { - // when aborted, desired canary weight should immediately be 0 (100% to stable), *unless* - // we are using dynamic stable scaling. In that case, we are dynamically decreasing the - // weight to the canary according to the availability of the stable (whatever it can support). - if c.rollout.Spec.Strategy.Canary.DynamicStableScale { - desiredWeight = 100 - ((100 * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) - if c.rollout.Status.Canary.Weights != nil { - // This ensures that if we are already at a lower weight, then we will not - // increase the weight because stable availability is flapping (e.g. pod restarts) - desiredWeight = minInt(desiredWeight, c.rollout.Status.Canary.Weights.Canary.Weight) - } - } - + desiredWeight = c.calculateDesiredWeightOnAbortOrStableRollback() if (c.rollout.Spec.Strategy.Canary.DynamicStableScale && desiredWeight == 0) || !c.rollout.Spec.Strategy.Canary.DynamicStableScale { // If we are using dynamic stable scale we need to also make sure that desiredWeight=0 aka we are completely // done with aborting before resetting the canary service selectors back to stable @@ -295,6 +290,26 @@ func (c *rolloutContext) reconcileTrafficRouting() error { return nil } +// calculateDesiredWeightOnAbortOrStableRollback returns the desired weight to use when we are either +// aborting, or rolling back to stable RS. +func (c *rolloutContext) calculateDesiredWeightOnAbortOrStableRollback() int32 { + if !c.rollout.Spec.Strategy.Canary.DynamicStableScale { + // When aborting or rolling back to stable RS and dynamicStableScaling is disabled, + // then desired canary weight should immediately be 0 (100% to stable) since we can trust + // that it is fully scaled up + return 0 + } + // When using dynamic stable scaling, we must dynamically decreasing the weight to the canary + // according to the availability of the stable (whatever it can support). + desiredWeight := 100 - ((100 * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) + if c.rollout.Status.Canary.Weights != nil { + // This ensures that if we are already at a lower weight, then we will not + // increase the weight because stable availability is flapping (e.g. pod restarts) + desiredWeight = minInt(desiredWeight, c.rollout.Status.Canary.Weights.Canary.Weight) + } + return desiredWeight +} + // trafficWeightUpdatedMessage returns a message we emit for the kubernetes event whenever we adjust traffic weights func trafficWeightUpdatedMessage(prev, new *v1alpha1.TrafficWeights) string { var details []string diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index 78817492f6..a545d9fae6 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -2,6 +2,7 @@ package rollout import ( "errors" + "fmt" "strconv" "testing" "time" @@ -752,8 +753,8 @@ func TestCanaryWithTrafficRoutingAddScaleDownDelay(t *testing.T) { defer f.Close() r1 := newCanaryRollout("foo", 1, nil, []v1alpha1.CanaryStep{{ - SetWeight: pointer.Int32Ptr(10), - }}, pointer.Int32Ptr(0), intstr.FromInt(1), intstr.FromInt(1)) + SetWeight: pointer.Int32(10), + }}, pointer.Int32(0), intstr.FromInt(1), intstr.FromInt(1)) r1.Spec.Strategy.Canary.CanaryService = "canary" r1.Spec.Strategy.Canary.StableService = "stable" r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ @@ -765,6 +766,7 @@ func TestCanaryWithTrafficRoutingAddScaleDownDelay(t *testing.T) { rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] r2 = updateCanaryRolloutStatus(r2, rs2PodHash, 2, 1, 2, false) r2.Status.ObservedGeneration = strconv.Itoa(int(r2.Generation)) + r2.Status.CurrentStepIndex = pointer.Int32(1) availableCondition, _ := newAvailableCondition(true) conditions.SetRolloutCondition(&r2.Status, availableCondition) completedCondition, _ := newCompletedCondition(true) @@ -1153,3 +1155,94 @@ func TestRolloutReplicaIsAvailableAndGenerationNotBeModifiedShouldModifyVirtualS }).Once().Return(nil) f.run(getKey(r1, t)) } + +// This makes sure we don't set weight to zero if we are rolling back to stable with DynamicStableScale +func TestDontWeightToZeroWhenDynamicallyRollingBackToStable(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32(90), + }, + { + Pause: &v1alpha1.RolloutPause{}, + }, + } + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32(1), intstr.FromInt(1), intstr.FromInt(1)) + r1.Spec.Strategy.Canary.DynamicStableScale = true + r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + SMI: &v1alpha1.SMITrafficRouting{}, + } + r1.Spec.Strategy.Canary.CanaryService = "canary" + r1.Spec.Strategy.Canary.StableService = "stable" + r1.Status.ReadyReplicas = 10 + r1.Status.AvailableReplicas = 10 + r2 := bumpVersion(r1) + + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 9, 9) + + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + canarySelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs2PodHash} + stableSelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs1PodHash} + canarySvc := newService("canary", 80, canarySelector, r1) + stableSvc := newService("stable", 80, stableSelector, r1) + + // simulate rollback to stable + r2.Spec = r1.Spec + r2.Status.StableRS = rs1PodHash + r2.Status.CurrentPodHash = rs1PodHash // will cause IsFullyPromoted() to be true + r2.Status.Canary.Weights = &v1alpha1.TrafficWeights{ + Canary: v1alpha1.WeightDestination{ + Weight: 10, + ServiceName: "canary", + PodTemplateHash: rs2PodHash, + }, + Stable: v1alpha1.WeightDestination{ + Weight: 90, + ServiceName: "stable", + PodTemplateHash: rs1PodHash, + }, + } + + f.kubeobjects = append(f.kubeobjects, rs1, rs2, canarySvc, stableSvc) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + f.expectUpdateReplicaSetAction(rs1) // Updates the revision annotation from 1 to 3 + f.expectUpdateReplicaSetAction(rs1) // repeat of the above (not sure why) + scaleUpIndex := f.expectUpdateReplicaSetAction(rs1) // this one scales the stable RS to 10 + f.expectPatchRolloutAction(r2) + + f.fakeTrafficRouting = newUnmockedFakeTrafficRoutingReconciler() + f.fakeTrafficRouting.On("UpdateHash", mock.Anything, mock.Anything, mock.Anything).Return(func(canaryHash, stableHash string, additionalDestinations ...v1alpha1.WeightDestination) error { + // make sure UpdateHash was called with previous desired hash (not current pod hash) + if canaryHash != rs2PodHash { + return fmt.Errorf("UpdateHash was called with canary hash: %s. Expected: %s", canaryHash, rs2PodHash) + } + if stableHash != rs1PodHash { + return fmt.Errorf("UpdateHash was called with stable hash: %s. Expected: %s", canaryHash, rs1PodHash) + } + return nil + + }) + f.fakeTrafficRouting.On("SetWeight", mock.Anything, mock.Anything).Return(func(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) error { + // make sure SetWeight was not changed + if desiredWeight != 10 { + return fmt.Errorf("SetWeight was called with unexpected weight: %d. Expected: 10", desiredWeight) + } + return nil + }) + f.fakeTrafficRouting.On("SetHeaderRoute", mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("RemoveManagedRoutes", mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(pointer.BoolPtr(true), nil) + f.run(getKey(r1, t)) + + // Make sure we scale up stable ReplicaSet to 10 + rs1Updated := f.getUpdatedReplicaSet(scaleUpIndex) + assert.Equal(t, int32(10), *rs1Updated.Spec.Replicas) +} diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index fe22175074..bc5e60b6c3 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -13,6 +13,7 @@ import ( corev1 "k8s.io/api/core/v1" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/test/fixtures" ) @@ -620,3 +621,62 @@ func (s *CanarySuite) TestCanaryDynamicStableScale() { ExpectServiceSelector("dynamic-stable-scale-canary", map[string]string{"app": "dynamic-stable-scale", "rollouts-pod-template-hash": "868d98995b"}, false). ExpectRevisionPodCount("1", 4) } + +// TestCanaryDynamicStableScaleRollbackToStable verifies when we rollback to stable with +// DynamicStableScale enabled, we do so in a safe manner without shifting traffic back to stable +// before it can handle it +func (s *CanarySuite) TestCanaryDynamicStableScaleRollbackToStable() { + s.Given(). + RolloutObjects(`@functional/canary-dynamic-stable-scale.yaml`). + When(). + ApplyManifests(). + MarkPodsReady("1", 4). // mark all 4 pods ready + WaitForRolloutStatus("Healthy"). + UpdateSpec(). + MarkPodsReady("2", 1). // mark 1 of 1 canary pods ready + WaitForRolloutStatus("Paused"). + Sleep(2*time.Second). + Then(). + ExpectRevisionPodCount("1", 3). + ExpectRevisionPodCount("2", 1). + When(). + UndoRollout(1). // Rollback to stable (revision 1) + Sleep(2*time.Second). + Then(). + ExpectRevisionPodCount("3", 4). // Ensure we fully scale up the stable (now revision 3) + ExpectRevisionPodCount("2", 1). // And do not scale down the previous desired (revision 2) + Assert(func(t *fixtures.Then) { + // Make sure canary service is still pointing to the previous desired (revision 2) + rs3 := t.GetReplicaSetByRevision("3") + rs2 := t.GetReplicaSetByRevision("2") + canarySvc, stableSvc := t.GetServices() + assert.Equal(s.T(), rs2.Labels[rov1.DefaultRolloutUniqueLabelKey], canarySvc.Spec.Selector["rollouts-pod-template-hash"]) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], stableSvc.Spec.Selector["rollouts-pod-template-hash"]) + + // Ensure we did not touch the weights even though we are "fully promoted" + ro := t.GetRollout() + assert.Equal(s.T(), rs2.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Canary.PodTemplateHash) + assert.Equal(s.T(), int32(25), ro.Status.Canary.Weights.Canary.Weight) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Stable.PodTemplateHash) + assert.Equal(s.T(), int32(75), ro.Status.Canary.Weights.Stable.Weight) + }). + When(). + MarkPodsReady("3", 1). // marks the 4th pod of stableRS/newRS (revision 3) ready + WaitForRevisionPodCount("2", 0). // make sure we scale down the previous desired (revision 2) + Then(). + Assert(func(t *fixtures.Then) { + // Make sure canary/stable service is updated to point to revision 3 + rs3 := t.GetReplicaSetByRevision("3") + canarySvc, stableSvc := t.GetServices() + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], canarySvc.Spec.Selector["rollouts-pod-template-hash"]) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], stableSvc.Spec.Selector["rollouts-pod-template-hash"]) + + // Ensure we are 100% back to stable + ro := t.GetRollout() + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Canary.PodTemplateHash) + assert.Equal(s.T(), int32(0), ro.Status.Canary.Weights.Canary.Weight) + assert.Equal(s.T(), rs3.Labels[rov1.DefaultRolloutUniqueLabelKey], ro.Status.Canary.Weights.Stable.PodTemplateHash) + assert.Equal(s.T(), int32(100), ro.Status.Canary.Weights.Stable.Weight) + + }) +} diff --git a/test/fixtures/common.go b/test/fixtures/common.go index 9e060df865..670d2dd2f4 100644 --- a/test/fixtures/common.go +++ b/test/fixtures/common.go @@ -71,6 +71,7 @@ func (c *Common) CheckError(err error) { } } +// Rollout returns the original rollout manifest used in the test func (c *Common) Rollout() *rov1.Rollout { var ro rov1.Rollout err := runtime.DefaultUnstructuredConverter.FromUnstructured(c.rollout.Object, &ro) @@ -78,6 +79,13 @@ func (c *Common) Rollout() *rov1.Rollout { return &ro } +// GetRollout returns the live rollout object in the cluster +func (c *Common) GetRollout() *rov1.Rollout { + ro, err := c.rolloutClient.ArgoprojV1alpha1().Rollouts(c.namespace).Get(context.TODO(), c.Rollout().GetName(), metav1.GetOptions{}) + c.CheckError(err) + return ro +} + func (c *Common) PrintRollout(name string) { streams := genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr} o := options.NewArgoRolloutsOptions(streams) diff --git a/test/fixtures/when.go b/test/fixtures/when.go index 395e614bcf..d9696a7761 100644 --- a/test/fixtures/when.go +++ b/test/fixtures/when.go @@ -25,12 +25,14 @@ import ( "sigs.k8s.io/yaml" "github.com/argoproj/argo-rollouts/pkg/apiclient/rollout" + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/abort" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/promote" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/restart" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/retry" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/status" + "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/cmd/undo" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/options" "github.com/argoproj/argo-rollouts/pkg/kubectl-argo-rollouts/viewcontroller" rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" @@ -185,6 +187,16 @@ func (w *When) RetryRollout() *When { return w } +func (w *When) UndoRollout(toRevision int64) *When { + if w.rollout == nil { + w.t.Fatal("Rollout not set") + } + _, err := undo.RunUndoRollout(w.dynamicClient.Resource(v1alpha1.RolloutGVR).Namespace(w.namespace), w.kubeClient, w.rollout.GetName(), toRevision) + w.CheckError(err) + w.log.Infof("Undo rollout to %d", toRevision) + return w +} + func (w *When) RestartRollout() *When { if w.rollout == nil { w.t.Fatal("Rollout not set") diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index a751cd2be2..40eadb7848 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -41,8 +41,13 @@ func AtDesiredReplicaCountsForCanary(ro *v1alpha1.Rollout, newRS, stableRS *apps return false } } - if GetAvailableReplicaCountForReplicaSets(olderRSs) != int32(0) { - return false + if ro.Spec.Strategy.Canary.TrafficRouting == nil { + // For basic canary, all older ReplicaSets must be scaled to zero since they serve traffic. + // For traffic weighted canary, it's okay if they are still scaled up, since the traffic + // router will prevent them from serving traffic + if GetAvailableReplicaCountForReplicaSets(olderRSs) != int32(0) { + return false + } } return true } diff --git a/utils/replicaset/replicaset.go b/utils/replicaset/replicaset.go index 9aec161b66..b2664afd53 100644 --- a/utils/replicaset/replicaset.go +++ b/utils/replicaset/replicaset.go @@ -592,17 +592,6 @@ func (o ReplicaSetsByRevisionNumber) Less(i, j int) bool { return iRevision < jRevision } -// IsStillReferenced returns if the given ReplicaSet is still being referenced by any of -// the current, stable, blue-green active references. Used to determine if the ReplicaSet can -// safely be scaled to zero, or deleted. -func IsStillReferenced(status v1alpha1.RolloutStatus, rs *appsv1.ReplicaSet) bool { - hash := GetPodTemplateHash(rs) - if hash != "" && (hash == status.StableRS || hash == status.CurrentPodHash || hash == status.BlueGreen.ActiveSelector) { - return true - } - return false -} - // HasScaleDownDeadline returns whether or not the given ReplicaSet is annotated with a scale-down delay func HasScaleDownDeadline(rs *appsv1.ReplicaSet) bool { if rs == nil || rs.Annotations == nil { diff --git a/utils/replicaset/replicaset_test.go b/utils/replicaset/replicaset_test.go index 23bf320955..462fa2b835 100644 --- a/utils/replicaset/replicaset_test.go +++ b/utils/replicaset/replicaset_test.go @@ -1078,48 +1078,6 @@ func TestNeedsRestart(t *testing.T) { }) } -func TestIsStillReferenced(t *testing.T) { - newRSWithPodTemplateHash := func(hash string) *appsv1.ReplicaSet { - return &appsv1.ReplicaSet{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - v1alpha1.DefaultRolloutUniqueLabelKey: hash, - }, - }, - } - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := &appsv1.ReplicaSet{} - assert.False(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("") - assert.False(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{CurrentPodHash: "abc123"} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{BlueGreen: v1alpha1.BlueGreenStatus{ActiveSelector: "abc123"}} - rs := newRSWithPodTemplateHash("abc123") - assert.True(t, IsStillReferenced(status, rs)) - } - { - status := v1alpha1.RolloutStatus{StableRS: "abc123"} - rs := newRSWithPodTemplateHash("def456") - assert.False(t, IsStillReferenced(status, rs)) - } -} - func TestHasScaleDownDeadline(t *testing.T) { { assert.False(t, HasScaleDownDeadline(nil)) From 23c65e0fab26d3896a90697bb4cc4773ffc2d446 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 07:51:54 -0500 Subject: [PATCH 074/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.9 to 1.28.0 (#3124) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.27.9 to 1.28.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.28.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.27.9...service/s3/v1.28.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 913c92bd35..28c850f7cc 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.2 github.com/aws/aws-sdk-go-v2/config v1.19.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 1e8a4b3e21..d73d56a400 100644 --- a/go.sum +++ b/go.sum @@ -120,8 +120,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9 h1:qDmaPhgjG6Mc5m/2sP+GFBUcp+bZnJMbFbxTAokRv+Q= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.27.9/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 h1:qIjRTVTFHa/R+k3Cl3ycLjnWYUXhLThmqW3ZbCn6G6o= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= From afdbfc6716caa03d3ae8b84fd0b6ad268b462300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 08:53:17 -0500 Subject: [PATCH 075/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.19.0 to 1.19.1 (#3123) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.19.0 to 1.19.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/v1.19.1/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.19.0...v1.19.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 28c850f7cc..2eaf498775 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.21.2 - github.com/aws/aws-sdk-go-v2/config v1.19.0 + github.com/aws/aws-sdk-go-v2/config v1.19.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 github.com/blang/semver v3.5.1+incompatible diff --git a/go.sum b/go.sum index d73d56a400..6ded4827e7 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/config v1.19.0 h1:AdzDvwH6dWuVARCl3RTLGRc4Ogy+N7yLFxVxXe1ClQ0= -github.com/aws/aws-sdk-go-v2/config v1.19.0/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/config v1.19.1 h1:oe3vqcGftyk40icfLymhhhNysAwk0NfiwkDi2GTPMXs= +github.com/aws/aws-sdk-go-v2/config v1.19.1/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= From 53fbc5761478c5c65a9fc0f64d9bd91f289543bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Oct 2023 08:57:26 -0500 Subject: [PATCH 076/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.21.6 to 1.22.0 (#3127) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.21.6 to 1.22.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.22.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.21.6...service/s3/v1.22.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2eaf498775..94a587bcde 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.21.2 github.com/aws/aws-sdk-go-v2/config v1.19.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 6ded4827e7..b9dc501a7b 100644 --- a/go.sum +++ b/go.sum @@ -122,8 +122,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21B github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6 h1:qIjRTVTFHa/R+k3Cl3ycLjnWYUXhLThmqW3ZbCn6G6o= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.21.6/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 h1:DEdgH+R4MCPiuYW0G11pzU4U6kn+1WprM8N7gx1wnko= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= From 4471508054420ecbe8346e3c8f8e109a5de7cb11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Oct 2023 09:00:01 -0500 Subject: [PATCH 077/264] chore(deps): bump google.golang.org/grpc from 1.58.3 to 1.59.0 (#3113) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.58.3 to 1.59.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.58.3...v1.59.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 94a587bcde..936133435f 100644 --- a/go.mod +++ b/go.mod @@ -37,8 +37,8 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.13.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 - google.golang.org/grpc v1.58.3 + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.25.8 @@ -58,7 +58,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.21.0 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.27 // indirect @@ -114,7 +114,7 @@ require ( github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect @@ -124,7 +124,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -189,8 +189,8 @@ require ( gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.132.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index b9dc501a7b..ad344aa942 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= -cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= @@ -299,8 +299,8 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -386,8 +386,9 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -1101,12 +1102,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1124,8 +1125,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 3e940a6e719cba1b2a965b301ff3c091e83c358f Mon Sep 17 00:00:00 2001 From: mitchell amihod Date: Mon, 30 Oct 2023 02:47:15 +0000 Subject: [PATCH 078/264] docs(analysis): Add note about availability of new datadog v2 functionality (#3131) Add note about availability of new datadog v2 functionality Signed-off-by: mitchell amihod <4623+meeech@users.noreply.github.com> --- docs/analysis/datadog.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index 6e89058572..adfcd0d146 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -1,8 +1,5 @@ # Datadog Metrics -!!! important - Available since v0.10.0 - A [Datadog](https://www.datadoghq.com/) query can be used to obtain measurements for analysis. ```yaml @@ -46,6 +43,9 @@ stringData: ### Working with Datadog API v2 +!!! important + While some basic v2 functionality is working in earlier versions, the new properties of `formula` and `queries` are only available as of v1.7 + #### Moving to v2 If your old v1 was just a simple metric query - no formula as part of the query - then you can just move to v2 by updating the `apiVersion` in your existing Analysis Template, and everything should work. From c83bf648a26f5f5be8647257dfadfb3d24d404ec Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 30 Oct 2023 17:23:34 -0500 Subject: [PATCH 079/264] fix: docs require build.os to be defined (#3133) * fix read the docs build Signed-off-by: zachaller * fix read the docs build Signed-off-by: zachaller --------- Signed-off-by: zachaller --- .readthedocs.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7b50ab9415..7b5d5d427f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,4 +4,8 @@ mkdocs: fail_on_warning: false python: install: - - requirements: docs/requirements.txt \ No newline at end of file + - requirements: docs/requirements.txt +build: + os: "ubuntu-22.04" + tools: + python: "3.7" \ No newline at end of file From 423be7b9ee37fade38a652b4fc6a43da8c842b5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 21:28:52 -0500 Subject: [PATCH 080/264] chore(deps): bump sigs.k8s.io/yaml from 1.3.0 to 1.4.0 (#3122) Bumps [sigs.k8s.io/yaml](https://github.com/kubernetes-sigs/yaml) from 1.3.0 to 1.4.0. - [Release notes](https://github.com/kubernetes-sigs/yaml/releases) - [Changelog](https://github.com/kubernetes-sigs/yaml/blob/master/RELEASE.md) - [Commits](https://github.com/kubernetes-sigs/yaml/compare/v1.3.0...v1.4.0) --- updated-dependencies: - dependency-name: sigs.k8s.io/yaml dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 936133435f..8747399054 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( k8s.io/kubectl v0.25.8 k8s.io/kubernetes v1.25.8 k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 - sigs.k8s.io/yaml v1.3.0 + sigs.k8s.io/yaml v1.4.0 ) require ( diff --git a/go.sum b/go.sum index ad344aa942..a6867c2e48 100644 --- a/go.sum +++ b/go.sum @@ -1251,5 +1251,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kF sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= From e1b6d0545b0a342edff2a86692b1d43c3fc85092 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 08:30:57 -0500 Subject: [PATCH 081/264] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.21.2 to 1.22.0 (#3136) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.21.2 to 1.22.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.21.2...v1.22.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 8747399054..2eef0d3ae0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.21.2 + github.com/aws/aws-sdk-go-v2 v1.22.0 github.com/aws/aws-sdk-go-v2/config v1.19.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 @@ -93,7 +93,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect - github.com/aws/smithy-go v1.15.0 // indirect + github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index a6867c2e48..0b41d6d081 100644 --- a/go.sum +++ b/go.sum @@ -104,8 +104,9 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.22.0 h1:CpTS3XO3MWNel8ohoazkLZC6scvkYL2k+m0yzFJ17Hg= +github.com/aws/aws-sdk-go-v2 v1.22.0/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.19.1 h1:oe3vqcGftyk40icfLymhhhNysAwk0NfiwkDi2GTPMXs= github.com/aws/aws-sdk-go-v2/config v1.19.1/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= @@ -135,8 +136,9 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSW github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 04e11195fb4046e897574478c51fb14692a07578 Mon Sep 17 00:00:00 2001 From: Dennis Nguyen <1750375+dnguy078@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:03:46 -0700 Subject: [PATCH 082/264] fix: istio destionationrule subsets enforcement (#3126) * istio destionationrule subsets enforcement Signed-off-by: Dennis Nguyen * add users Signed-off-by: Dennis Nguyen * add test case for failure cases Signed-off-by: Dennis Nguyen --------- Signed-off-by: Dennis Nguyen --- USERS.md | 1 + rollout/trafficrouting/istio/istio.go | 17 ++++ rollout/trafficrouting/istio/istio_test.go | 110 +++++++++++++++++++++ 3 files changed, 128 insertions(+) diff --git a/USERS.md b/USERS.md index 4ad9fb29bf..5ca758b084 100644 --- a/USERS.md +++ b/USERS.md @@ -22,6 +22,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Ibotta](https://home.ibotta.com/) 1. [Intuit](https://www.intuit.com/) 1. [New Relic](https://newrelic.com/) +1. [Nextdoor](https://nextdoor.com/) 1. [Nitro](https://www.gonitro.com) 1. [Nozzle](https://nozzle.io) 1. [Opensurvey Inc.](https://opensurvey.co.kr) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index dd44da7b25..8a47a1011d 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -255,6 +255,23 @@ func (r *Reconciler) reconcileVirtualService(obj *unstructured.Unstructured, vsv if err = ValidateHTTPRoutes(r.rollout, vsvcRouteNames, httpRoutes); err != nil { return nil, false, err } + + host, err := r.getDestinationRuleHost() + if err != nil { + return nil, false, err + } + + if host != "" { + var routeDestinations []VirtualServiceRouteDestination + for i, routes := range httpRoutes { + for _, r := range routes.Route { + if r.Destination.Host == host { + routeDestinations = append(routeDestinations, VirtualServiceRouteDestination{Destination: r.Destination, Weight: r.Weight}) + } + } + httpRoutes[i].Route = routeDestinations + } + } } // TLS Routes diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index c18cdedae5..ead1b7e1ee 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -465,6 +465,31 @@ spec: subset: 'canary-subset' weight: 0` +const singleRouteSubsetMultipleDestRuleVsvc = `apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: vsvc + namespace: default +spec: + gateways: + - istio-rollout-gateway + hosts: + - istio-rollout.dev.argoproj.io + http: + - route: + - destination: + host: rollout-service + subset: stable + weight: 100 + - destination: + host: rollout-service + subset: canary + weight: 0 + - destination: + host: additional-service + subset: stable-subset + weight: 20` + const singleRouteTlsVsvc = `apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: @@ -695,6 +720,91 @@ func TestHttpReconcileWeightsBaseCase(t *testing.T) { } } +func TestHttpReconcileMultipleDestRule(t *testing.T) { + ro := rolloutWithDestinationRule() + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil + + dRule1 := unstructuredutil.StrToUnstructuredUnsafe(` +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: istio-destrule + namespace: default +spec: + host: rollout-service + subsets: + - name: stable + - name: canary +`) + dRule2 := unstructuredutil.StrToUnstructuredUnsafe(` +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: additional-istio-destrule + namespace: default +spec: + host: additional-service + subsets: + - name: stable-subset +`) + + obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) + client := testutil.NewFakeDynamicClient(obj, dRule1, dRule2) + vsvcLister, druleLister := getIstioListers(client) + r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) + client.ClearActions() + + vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes + vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes + vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes + modifiedObj, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) + assert.Nil(t, err) + assert.NotNil(t, modifiedObj) + + httpRoutes := extractHttpRoutes(t, modifiedObj) + + // Assertions + assert.Equal(t, httpRoutes[0].Route[0].Destination.Host, "rollout-service") + assert.Equal(t, httpRoutes[0].Route[1].Destination.Host, "rollout-service") + if httpRoutes[0].Route[0].Destination.Subset == "stable" || httpRoutes[0].Route[1].Destination.Subset == "canary" { + assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(90)) + assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(10)) + } else { + assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(10)) + assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(90)) + } + + assert.Equal(t, httpRoutes[0].Route[2].Destination.Host, "additional-service") + assert.Equal(t, httpRoutes[0].Route[2].Destination.Subset, "stable-subset") + assert.Equal(t, httpRoutes[0].Route[2].Weight, int64(20)) +} + +func TestHttpReconcileInvalidMultipleDestRule(t *testing.T) { + ro := rolloutWithDestinationRule() + // set to invalid destination rule + ro.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule = &v1alpha1.IstioDestinationRule{ + Name: "invalid-destination-rule", + CanarySubsetName: "canary", + StableSubsetName: "stable", + } + + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" + ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil + + obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) + client := testutil.NewFakeDynamicClient(obj) + vsvcLister, druleLister := getIstioListers(client) + r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) + client.ClearActions() + + vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes + vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes + vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes + _, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) + assert.Error(t, err, "expected destination rule not found") +} + func TestHttpReconcileHeaderRouteHostBased(t *testing.T) { ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) obj := unstructuredutil.StrToUnstructuredUnsafe(regularVsvc) From f0265daa392dfeec791f64454c9cf6cb887a3ef2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 15:08:21 +0000 Subject: [PATCH 083/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.19.1 to 1.20.0 (#3135) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.19.1 to 1.20.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/v1.20.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.19.1...v1.20.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 38 ++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 2eef0d3ae0..42922c1853 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.22.0 - github.com/aws/aws-sdk-go-v2/config v1.19.1 + github.com/aws/aws-sdk-go-v2/config v1.20.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 github.com/blang/semver v3.5.1+incompatible @@ -83,16 +83,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 // indirect github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 0b41d6d081..73c2cc02d8 100644 --- a/go.sum +++ b/go.sum @@ -107,34 +107,36 @@ github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3eP github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2 v1.22.0 h1:CpTS3XO3MWNel8ohoazkLZC6scvkYL2k+m0yzFJ17Hg= github.com/aws/aws-sdk-go-v2 v1.22.0/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/config v1.19.1 h1:oe3vqcGftyk40icfLymhhhNysAwk0NfiwkDi2GTPMXs= -github.com/aws/aws-sdk-go-v2/config v1.19.1/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= -github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/config v1.20.0 h1:q2+/mqFhY0J9m3Tb5RGFE3R4sdaUkIe4k2EuDfE3c08= +github.com/aws/aws-sdk-go-v2/config v1.20.0/go.mod h1:7+1riCZXyT+sAGvneR5j+Zl1GyfbBUNQurpQTE6FP6k= +github.com/aws/aws-sdk-go-v2/credentials v1.14.0 h1:LQquqPE7cL55RQmA/UBoBKehDlEtMnQKm3B0Q672ePE= +github.com/aws/aws-sdk-go-v2/credentials v1.14.0/go.mod h1:q/3oaTPlamrQWHPwJe56Mjq9g1TYDgddvgTgWJtHTmE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 h1:lF/cVllNAPKgjDwN2RsQUX9g/f6hXer9f10ubLFSoug= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0/go.mod h1:c28nJNzMVVb9TQpZ5q4tzZvwEJwf/7So7Ie2s90l1Fw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 h1:tN6dNNE4SzMuyMnVtQJXGVKX177/d5Zy4MuA1HA4KUc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0/go.mod h1:F6MXWETIeetAHwFHyoHEqrcB3NpijFv9nLP5h9CXtT0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 h1:bfdsbTARDjaC/dSYGMO+E0psxFU4hTvCLnqYAfZ3D38= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0/go.mod h1:Jg8XVv5M2V2wiAMvBFx+O59jg6Yr8vhP0bgNF/IuquM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 h1:21tlTXq3ev10yLMAjXZzpkZbrl49h3ElSjmxD57tD/E= +github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0/go.mod h1:d9YrBHJhyzDCv5UsEVRizHlFV6Q0sLemFq6uxuqWfUw= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 h1:DEdgH+R4MCPiuYW0G11pzU4U6kn+1WprM8N7gx1wnko= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 h1:dJnwy5Awv+uvfk73aRENVbv1cSQQ60ydCkPaun097KM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0/go.mod h1:RsPWWy7u/hwmFX57sQ7MLvrvJeYyNkiMm5BaavpoU18= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 h1:ZIlR6Wr/EgYwBdEz1NWBqdUsTh0mV7A68pId3YZl6H0= +github.com/aws/aws-sdk-go-v2/service/sso v1.16.0/go.mod h1:O7B5cpuhhJKefAKkM7onb0McmpHyKnsH4RrHJhOyq7M= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 h1:3BZyJei4k1SHdSAFhg9Qg15NnG3v5zosZyFWPm7df/A= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0/go.mod h1:Td8EvzggonY02wLaqSpwybI3GbmA0PWoprKGil2uwJg= +github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 h1:f/V5Y9OaHuNRrA9MntNQNAtMFXqhKj8HTEPnH81eXMI= +github.com/aws/aws-sdk-go-v2/service/sts v1.24.0/go.mod h1:HnCUMNz2XqwnEEk5X6oeDYB2HgOLFpJ/LyfilN8WErs= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= From 6e89d76d2ff796be06911926f2d47a9fc0881bbb Mon Sep 17 00:00:00 2001 From: Justin Marquis <76892343+34fathombelow@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:09:06 -0700 Subject: [PATCH 084/264] chore: upgrade cosign (#3139) Signed-off-by: Justin Marquis --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index eefb23923d..f064a81c6d 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -76,7 +76,7 @@ jobs: - name: Install cosign uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 with: - cosign-release: 'v2.0.2' + cosign-release: 'v2.2.0' - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index df9479da3f..157320c45a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,9 +170,9 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.0.3 + uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 with: - cosign-release: 'v2.0.2' + cosign-release: 'v2.2.0' - name: Generate SBOM (spdx) id: spdx-builder From 0593d92a9acf13dc9d578f82a00c0efa3f09c463 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 2 Nov 2023 12:50:50 -0500 Subject: [PATCH 085/264] fix: Revert "fix: istio destionationrule subsets enforcement (#3126)" (#3147) Revert "fix: istio destionationrule subsets enforcement (#3126)" This reverts commit 04e11195fb4046e897574478c51fb14692a07578. Signed-off-by: zachaller --- USERS.md | 1 - rollout/trafficrouting/istio/istio.go | 17 ---- rollout/trafficrouting/istio/istio_test.go | 110 --------------------- 3 files changed, 128 deletions(-) diff --git a/USERS.md b/USERS.md index 5ca758b084..4ad9fb29bf 100644 --- a/USERS.md +++ b/USERS.md @@ -22,7 +22,6 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Ibotta](https://home.ibotta.com/) 1. [Intuit](https://www.intuit.com/) 1. [New Relic](https://newrelic.com/) -1. [Nextdoor](https://nextdoor.com/) 1. [Nitro](https://www.gonitro.com) 1. [Nozzle](https://nozzle.io) 1. [Opensurvey Inc.](https://opensurvey.co.kr) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index 8a47a1011d..dd44da7b25 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -255,23 +255,6 @@ func (r *Reconciler) reconcileVirtualService(obj *unstructured.Unstructured, vsv if err = ValidateHTTPRoutes(r.rollout, vsvcRouteNames, httpRoutes); err != nil { return nil, false, err } - - host, err := r.getDestinationRuleHost() - if err != nil { - return nil, false, err - } - - if host != "" { - var routeDestinations []VirtualServiceRouteDestination - for i, routes := range httpRoutes { - for _, r := range routes.Route { - if r.Destination.Host == host { - routeDestinations = append(routeDestinations, VirtualServiceRouteDestination{Destination: r.Destination, Weight: r.Weight}) - } - } - httpRoutes[i].Route = routeDestinations - } - } } // TLS Routes diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index ead1b7e1ee..c18cdedae5 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -465,31 +465,6 @@ spec: subset: 'canary-subset' weight: 0` -const singleRouteSubsetMultipleDestRuleVsvc = `apiVersion: networking.istio.io/v1alpha3 -kind: VirtualService -metadata: - name: vsvc - namespace: default -spec: - gateways: - - istio-rollout-gateway - hosts: - - istio-rollout.dev.argoproj.io - http: - - route: - - destination: - host: rollout-service - subset: stable - weight: 100 - - destination: - host: rollout-service - subset: canary - weight: 0 - - destination: - host: additional-service - subset: stable-subset - weight: 20` - const singleRouteTlsVsvc = `apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: @@ -720,91 +695,6 @@ func TestHttpReconcileWeightsBaseCase(t *testing.T) { } } -func TestHttpReconcileMultipleDestRule(t *testing.T) { - ro := rolloutWithDestinationRule() - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil - - dRule1 := unstructuredutil.StrToUnstructuredUnsafe(` -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: istio-destrule - namespace: default -spec: - host: rollout-service - subsets: - - name: stable - - name: canary -`) - dRule2 := unstructuredutil.StrToUnstructuredUnsafe(` -apiVersion: networking.istio.io/v1alpha3 -kind: DestinationRule -metadata: - name: additional-istio-destrule - namespace: default -spec: - host: additional-service - subsets: - - name: stable-subset -`) - - obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) - client := testutil.NewFakeDynamicClient(obj, dRule1, dRule2) - vsvcLister, druleLister := getIstioListers(client) - r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) - client.ClearActions() - - vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes - vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes - vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes - modifiedObj, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) - assert.Nil(t, err) - assert.NotNil(t, modifiedObj) - - httpRoutes := extractHttpRoutes(t, modifiedObj) - - // Assertions - assert.Equal(t, httpRoutes[0].Route[0].Destination.Host, "rollout-service") - assert.Equal(t, httpRoutes[0].Route[1].Destination.Host, "rollout-service") - if httpRoutes[0].Route[0].Destination.Subset == "stable" || httpRoutes[0].Route[1].Destination.Subset == "canary" { - assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(90)) - assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(10)) - } else { - assert.Equal(t, httpRoutes[0].Route[0].Weight, int64(10)) - assert.Equal(t, httpRoutes[0].Route[1].Weight, int64(90)) - } - - assert.Equal(t, httpRoutes[0].Route[2].Destination.Host, "additional-service") - assert.Equal(t, httpRoutes[0].Route[2].Destination.Subset, "stable-subset") - assert.Equal(t, httpRoutes[0].Route[2].Weight, int64(20)) -} - -func TestHttpReconcileInvalidMultipleDestRule(t *testing.T) { - ro := rolloutWithDestinationRule() - // set to invalid destination rule - ro.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule = &v1alpha1.IstioDestinationRule{ - Name: "invalid-destination-rule", - CanarySubsetName: "canary", - StableSubsetName: "stable", - } - - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Name = "vsvc" - ro.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes = nil - - obj := unstructuredutil.StrToUnstructuredUnsafe(singleRouteSubsetMultipleDestRuleVsvc) - client := testutil.NewFakeDynamicClient(obj) - vsvcLister, druleLister := getIstioListers(client) - r := NewReconciler(ro, client, record.NewFakeEventRecorder(), vsvcLister, druleLister) - client.ClearActions() - - vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes - vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes - vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes - _, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 10) - assert.Error(t, err, "expected destination rule not found") -} - func TestHttpReconcileHeaderRouteHostBased(t *testing.T) { ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) obj := unstructuredutil.StrToUnstructuredUnsafe(regularVsvc) From 5ec6e9ffc7b5e37a4654302aa042d570e14ec08d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:49:10 -0500 Subject: [PATCH 086/264] docs: Update Changelog (#3148) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 403f5c2f5a..cbdcbfbe3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,34 @@ + +## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) + +### Fix + +* Revert "fix: istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126))" ([#3147](https://github.com/argoproj/argo-rollouts/issues/3147)) + + + +## [v1.6.1](https://github.com/argoproj/argo-rollouts/compare/v1.6.0...v1.6.1) (2023-11-01) + +### Chore + +* upgrade cosign ([#3139](https://github.com/argoproj/argo-rollouts/issues/3139)) +* add missing rollout fields ([#3062](https://github.com/argoproj/argo-rollouts/issues/3062)) +* change file name for readthedocs compatibility ([#2999](https://github.com/argoproj/argo-rollouts/issues/2999)) + +### Fix + +* istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126)) +* docs require build.os to be defined ([#3133](https://github.com/argoproj/argo-rollouts/issues/3133)) +* inopportune scaling events would lose some status fields ([#3060](https://github.com/argoproj/argo-rollouts/issues/3060)) +* rollback to stable with dynamicStableScale could overwhelm stable pods ([#3077](https://github.com/argoproj/argo-rollouts/issues/3077)) +* prevent hot loop when fully promoted rollout is aborted ([#3064](https://github.com/argoproj/argo-rollouts/issues/3064)) +* keep rs informer updated ([#3091](https://github.com/argoproj/argo-rollouts/issues/3091)) +* bump notification-engine to fix double send on self server notifications ([#3095](https://github.com/argoproj/argo-rollouts/issues/3095)) +* sync notification controller configmaps/secrets first ([#3075](https://github.com/argoproj/argo-rollouts/issues/3075)) +* missing notification on error ([#3076](https://github.com/argoproj/argo-rollouts/issues/3076)) + + ## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) From 0071d6227089e0f8d00179f980f94747519d7994 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:52:46 -0500 Subject: [PATCH 087/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.20.0 to 1.22.0 (#3149) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.20.0 to 1.22.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.20.0...v1.22.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 42922c1853..9a732a516a 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.22.0 - github.com/aws/aws-sdk-go-v2/config v1.20.0 + github.com/aws/aws-sdk-go-v2 v1.22.1 + github.com/aws/aws-sdk-go-v2/config v1.22.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 github.com/blang/semver v3.5.1+incompatible @@ -83,16 +83,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.14.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.15.1 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 // indirect github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 73c2cc02d8..34a14ff3cc 100644 --- a/go.sum +++ b/go.sum @@ -105,38 +105,38 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2 v1.22.0 h1:CpTS3XO3MWNel8ohoazkLZC6scvkYL2k+m0yzFJ17Hg= -github.com/aws/aws-sdk-go-v2 v1.22.0/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/config v1.20.0 h1:q2+/mqFhY0J9m3Tb5RGFE3R4sdaUkIe4k2EuDfE3c08= -github.com/aws/aws-sdk-go-v2/config v1.20.0/go.mod h1:7+1riCZXyT+sAGvneR5j+Zl1GyfbBUNQurpQTE6FP6k= -github.com/aws/aws-sdk-go-v2/credentials v1.14.0 h1:LQquqPE7cL55RQmA/UBoBKehDlEtMnQKm3B0Q672ePE= -github.com/aws/aws-sdk-go-v2/credentials v1.14.0/go.mod h1:q/3oaTPlamrQWHPwJe56Mjq9g1TYDgddvgTgWJtHTmE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 h1:lF/cVllNAPKgjDwN2RsQUX9g/f6hXer9f10ubLFSoug= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0/go.mod h1:c28nJNzMVVb9TQpZ5q4tzZvwEJwf/7So7Ie2s90l1Fw= +github.com/aws/aws-sdk-go-v2 v1.22.1 h1:sjnni/AuoTXxHitsIdT0FwmqUuNUuHtufcVDErVFT9U= +github.com/aws/aws-sdk-go-v2 v1.22.1/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= +github.com/aws/aws-sdk-go-v2/config v1.22.0 h1:9Mm99OalzZRz0ab5fpodMoHBApHS6pqRNp3M9NmzvDg= +github.com/aws/aws-sdk-go-v2/config v1.22.0/go.mod h1:2eWgw5lps8fKI7LZVTrRTYP6HE6k/uEFUuTSHfXwqP0= +github.com/aws/aws-sdk-go-v2/credentials v1.15.1 h1:hmf6lAm9hk7uLCfapZn/jL05lm6Uwdbn1B0fgjyuf4M= +github.com/aws/aws-sdk-go-v2/credentials v1.15.1/go.mod h1:QTcHga3ZbQOneJuxmGBOCxiClxmp+TlvmjFexAnJ790= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 h1:gIeH4+o1MN/caGBWjoGQTUTIu94xD6fI5B2+TcwBf70= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2/go.mod h1:wLyMIo/zPOhQhPXTddpfdkSleyigtFi8iMnC+2m/SK4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 h1:tN6dNNE4SzMuyMnVtQJXGVKX177/d5Zy4MuA1HA4KUc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0/go.mod h1:F6MXWETIeetAHwFHyoHEqrcB3NpijFv9nLP5h9CXtT0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 h1:fi1ga6WysOyYb5PAf3Exd6B5GiSNpnZim4h1rhlBqx0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1/go.mod h1:V5CY8wNurvPUibTi9mwqUqpiFZ5LnioKWIFUDtIzdI8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 h1:bfdsbTARDjaC/dSYGMO+E0psxFU4hTvCLnqYAfZ3D38= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0/go.mod h1:Jg8XVv5M2V2wiAMvBFx+O59jg6Yr8vhP0bgNF/IuquM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 h1:21tlTXq3ev10yLMAjXZzpkZbrl49h3ElSjmxD57tD/E= -github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0/go.mod h1:d9YrBHJhyzDCv5UsEVRizHlFV6Q0sLemFq6uxuqWfUw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 h1:ZpaV/j48RlPc4AmOZuPv22pJliXjXq8/reL63YzyFnw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1/go.mod h1:R8aXraabD2e3qv1csxM14/X9WF4wFMIY0kH4YEtYD5M= +github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 h1:DqOQvIfmGkXZUVJnl9VRk0AnxyS59tCtX9k1Pyss4Ak= +github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 h1:DEdgH+R4MCPiuYW0G11pzU4U6kn+1WprM8N7gx1wnko= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 h1:dJnwy5Awv+uvfk73aRENVbv1cSQQ60ydCkPaun097KM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0/go.mod h1:RsPWWy7u/hwmFX57sQ7MLvrvJeYyNkiMm5BaavpoU18= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 h1:2OXw3ppu1XsB6rqKEMV4tnecTjIY3PRV2U6IP6KPJQo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1/go.mod h1:FZB4AdakIqW/yERVdGJA6Z9jraax1beXfhBBnK2wwR8= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 h1:ZIlR6Wr/EgYwBdEz1NWBqdUsTh0mV7A68pId3YZl6H0= -github.com/aws/aws-sdk-go-v2/service/sso v1.16.0/go.mod h1:O7B5cpuhhJKefAKkM7onb0McmpHyKnsH4RrHJhOyq7M= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 h1:3BZyJei4k1SHdSAFhg9Qg15NnG3v5zosZyFWPm7df/A= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0/go.mod h1:Td8EvzggonY02wLaqSpwybI3GbmA0PWoprKGil2uwJg= -github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 h1:f/V5Y9OaHuNRrA9MntNQNAtMFXqhKj8HTEPnH81eXMI= -github.com/aws/aws-sdk-go-v2/service/sts v1.24.0/go.mod h1:HnCUMNz2XqwnEEk5X6oeDYB2HgOLFpJ/LyfilN8WErs= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 h1:I/Oh3IxGPfHXiGnwM54TD6hNr/8TlUrBXAtTyGhR+zw= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.0/go.mod h1:H6NCMvDBqA+CvIaXzaSqM6LWtzv9BzZrqBOqz+PzRF8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 h1:irbXQkfVYIRaewYSXcu4yVk0m2T+JzZd0dkop7FjmO0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0/go.mod h1:4wPNCkM22+oRe71oydP66K50ojDUC33XutSMi2pEF/M= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 h1:sYIFy8tm1xQwRvVQ4CRuBGXKIg9sHNuG6+3UAQuoujk= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.0/go.mod h1:S/LOQUeYDfJeJpFCIJDMjy7dwL4aA33HUdVi+i7uH8k= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= From 02462287944c4de69c9ca367dd3838930469d58b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:38:57 +0000 Subject: [PATCH 088/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.22.0 to 1.24.0 (#3143) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.22.0 to 1.24.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.24.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.22.0...service/s3/v1.24.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9a732a516a..f3998904ee 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.22.1 github.com/aws/aws-sdk-go-v2/config v1.22.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 34a14ff3cc..3f68961f87 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 h1:DqOQvIfmGkXZUVJnl9VRk0AnxyS5 github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0 h1:DEdgH+R4MCPiuYW0G11pzU4U6kn+1WprM8N7gx1wnko= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.22.0/go.mod h1:/ZlJt5r04rRWDg/7K6cQ6Tq0ZUnUMVR2FRg0GGTy/e0= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 h1:2OXw3ppu1XsB6rqKEMV4tnecTjIY3PRV2U6IP6KPJQo= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1/go.mod h1:FZB4AdakIqW/yERVdGJA6Z9jraax1beXfhBBnK2wwR8= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= From 1c455de972d46864eb0b62c480d2336bcf1160cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 12:46:22 -0500 Subject: [PATCH 089/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.28.0 to 1.30.0 (#3144) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.28.0 to 1.30.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.30.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.28.0...service/s3/v1.30.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index f3998904ee..24c829b011 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.22.1 github.com/aws/aws-sdk-go-v2/config v1.22.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.0.0 diff --git a/go.sum b/go.sum index 3f68961f87..b9cf80616a 100644 --- a/go.sum +++ b/go.sum @@ -104,7 +104,6 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2 v1.22.1 h1:sjnni/AuoTXxHitsIdT0FwmqUuNUuHtufcVDErVFT9U= github.com/aws/aws-sdk-go-v2 v1.22.1/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= github.com/aws/aws-sdk-go-v2/config v1.22.0 h1:9Mm99OalzZRz0ab5fpodMoHBApHS6pqRNp3M9NmzvDg= @@ -114,17 +113,15 @@ github.com/aws/aws-sdk-go-v2/credentials v1.15.1/go.mod h1:QTcHga3ZbQOneJuxmGBOC github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 h1:gIeH4+o1MN/caGBWjoGQTUTIu94xD6fI5B2+TcwBf70= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2/go.mod h1:wLyMIo/zPOhQhPXTddpfdkSleyigtFi8iMnC+2m/SK4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 h1:fi1ga6WysOyYb5PAf3Exd6B5GiSNpnZim4h1rhlBqx0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1/go.mod h1:V5CY8wNurvPUibTi9mwqUqpiFZ5LnioKWIFUDtIzdI8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 h1:ZpaV/j48RlPc4AmOZuPv22pJliXjXq8/reL63YzyFnw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1/go.mod h1:R8aXraabD2e3qv1csxM14/X9WF4wFMIY0kH4YEtYD5M= github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 h1:DqOQvIfmGkXZUVJnl9VRk0AnxyS59tCtX9k1Pyss4Ak= github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0 h1:sbCdTI6wyVJ0HLKchI8f2mDu7pUT49ZZYS9ONLOSTfU= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.28.0/go.mod h1:RYCo0XH2XTwdEoMEO7qOlmjNtUAzBYd6BgG4riTiGGw= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 h1:2ObDktnNOsFBXSjiBtSRmiGXAMAtmg28XcIGvygZM+4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0/go.mod h1:G6amy3RheFTRhVYWAaurKAxWTlzo9sxxU6TTvG+AVmA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 h1:2OXw3ppu1XsB6rqKEMV4tnecTjIY3PRV2U6IP6KPJQo= @@ -138,7 +135,6 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0/go.mod h1:4wPNCkM22+oRe71oy github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 h1:sYIFy8tm1xQwRvVQ4CRuBGXKIg9sHNuG6+3UAQuoujk= github.com/aws/aws-sdk-go-v2/service/sts v1.25.0/go.mod h1:S/LOQUeYDfJeJpFCIJDMjy7dwL4aA33HUdVi+i7uH8k= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 5b46e7af4f0c4506f438258cbb7241062aba59c5 Mon Sep 17 00:00:00 2001 From: Michael Crenshaw <350466+crenshaw-dev@users.noreply.github.com> Date: Mon, 6 Nov 2023 09:18:39 -0500 Subject: [PATCH 090/264] chore: add OpenSSF Scorecard badge (#3154) chore: add OpenSSF scorecard Signed-off-by: CI Co-authored-by: CI --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ce786a860b..a630fd41d4 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![codecov](https://codecov.io/gh/argoproj/argo-rollouts/branch/master/graph/badge.svg)](https://codecov.io/gh/argoproj/argo-rollouts) [![slack](https://img.shields.io/badge/slack-argoproj-brightgreen.svg?logo=slack)](https://argoproj.github.io/community/join-slack) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3834/badge)](https://bestpractices.coreinfrastructure.org/projects/3834) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/argoproj/argo-rollouts/badge)](https://api.securityscorecards.dev/projects/github.com/argoproj/argo-rollouts) [![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/argo-rollouts)](https://artifacthub.io/packages/helm/argo/argo-rollouts) ## What is Argo Rollouts? From e4ac54cb472902a3755bf1233472b25b5350a4b2 Mon Sep 17 00:00:00 2001 From: Daniel Metz <136381219+dmetz-figma@users.noreply.github.com> Date: Thu, 9 Nov 2023 23:20:20 -0500 Subject: [PATCH 091/264] docs: fix typo in smi.md (#3160) smi.md: fix typo Before: "Name of service that sends traffic only to the stable po ds" After: "Name of service that sends traffic only to the stable pods" Signed-off-by: Daniel Metz --- docs/features/traffic-management/smi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/traffic-management/smi.md b/docs/features/traffic-management/smi.md index ec635f1729..c2008d9799 100644 --- a/docs/features/traffic-management/smi.md +++ b/docs/features/traffic-management/smi.md @@ -8,7 +8,7 @@ The Argo Rollout controller achieves traffic shaping by creating and manipulating the [TrafficSplit CR](https://github.com/servicemeshinterface/smi-spec/blob/master/traffic-split.md). A TrafficSplit describes the desired traffic routing for an application and relies on the underlying Service Meshes implement that desired state. Instead of worrying about the details of a specific service mesh, a user needs to specify a root Service that clients use to communicate and a list of backends consisting of a Service and weight. The Service Mesh implementing SMI uses this spec to route traffic to the backends Services based on the weights of the backends. For Rollout users, the Argo Rollout controller creates and manipulates the TrafficSplit using the following information: - Canary Service: Name of the service that sends traffic only to the canary pods -- Stable Service: Name of the service that sends traffic only to the stable po ds +- Stable Service: Name of the service that sends traffic only to the stable pods - Root Service: Name of the service that clients use to communicate. If a request comes to this root service not through a proxy, the standard Kubernetes service routing will be used. Below is an example of a Rollout with all the required fields configured: From 19236c670344770f5ffc6c794c676ceab094bed4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:26:52 -0600 Subject: [PATCH 092/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.22.0 to 1.23.0 (#3161) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.22.0 to 1.23.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.22.0...config/v1.23.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 22 +++++++++++----------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 24c829b011..5af0e5a1e8 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.22.1 - github.com/aws/aws-sdk-go-v2/config v1.22.0 + github.com/aws/aws-sdk-go-v2 v1.22.2 + github.com/aws/aws-sdk-go-v2/config v1.23.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible @@ -83,16 +83,16 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 // indirect github.com/aws/smithy-go v1.16.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index b9cf80616a..d3fd7c8f95 100644 --- a/go.sum +++ b/go.sum @@ -104,36 +104,36 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.22.1 h1:sjnni/AuoTXxHitsIdT0FwmqUuNUuHtufcVDErVFT9U= -github.com/aws/aws-sdk-go-v2 v1.22.1/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/config v1.22.0 h1:9Mm99OalzZRz0ab5fpodMoHBApHS6pqRNp3M9NmzvDg= -github.com/aws/aws-sdk-go-v2/config v1.22.0/go.mod h1:2eWgw5lps8fKI7LZVTrRTYP6HE6k/uEFUuTSHfXwqP0= -github.com/aws/aws-sdk-go-v2/credentials v1.15.1 h1:hmf6lAm9hk7uLCfapZn/jL05lm6Uwdbn1B0fgjyuf4M= -github.com/aws/aws-sdk-go-v2/credentials v1.15.1/go.mod h1:QTcHga3ZbQOneJuxmGBOCxiClxmp+TlvmjFexAnJ790= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2 h1:gIeH4+o1MN/caGBWjoGQTUTIu94xD6fI5B2+TcwBf70= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2/go.mod h1:wLyMIo/zPOhQhPXTddpfdkSleyigtFi8iMnC+2m/SK4= +github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= +github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= +github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= +github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= +github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1 h1:fi1ga6WysOyYb5PAf3Exd6B5GiSNpnZim4h1rhlBqx0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1/go.mod h1:V5CY8wNurvPUibTi9mwqUqpiFZ5LnioKWIFUDtIzdI8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1 h1:ZpaV/j48RlPc4AmOZuPv22pJliXjXq8/reL63YzyFnw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1/go.mod h1:R8aXraabD2e3qv1csxM14/X9WF4wFMIY0kH4YEtYD5M= -github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0 h1:DqOQvIfmGkXZUVJnl9VRk0AnxyS59tCtX9k1Pyss4Ak= -github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= +github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 h1:2ObDktnNOsFBXSjiBtSRmiGXAMAtmg28XcIGvygZM+4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0/go.mod h1:G6amy3RheFTRhVYWAaurKAxWTlzo9sxxU6TTvG+AVmA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1 h1:2OXw3ppu1XsB6rqKEMV4tnecTjIY3PRV2U6IP6KPJQo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1/go.mod h1:FZB4AdakIqW/yERVdGJA6Z9jraax1beXfhBBnK2wwR8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.0 h1:I/Oh3IxGPfHXiGnwM54TD6hNr/8TlUrBXAtTyGhR+zw= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.0/go.mod h1:H6NCMvDBqA+CvIaXzaSqM6LWtzv9BzZrqBOqz+PzRF8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0 h1:irbXQkfVYIRaewYSXcu4yVk0m2T+JzZd0dkop7FjmO0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0/go.mod h1:4wPNCkM22+oRe71oydP66K50ojDUC33XutSMi2pEF/M= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.0 h1:sYIFy8tm1xQwRvVQ4CRuBGXKIg9sHNuG6+3UAQuoujk= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.0/go.mod h1:S/LOQUeYDfJeJpFCIJDMjy7dwL4aA33HUdVi+i7uH8k= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 3e74cf5bf5827b3053b1a86ea0dc37634ef61769 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:30:22 -0600 Subject: [PATCH 093/264] chore(deps): bump sigstore/cosign-installer from 3.1.2 to 3.2.0 (#3158) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.1.2 to 3.2.0. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/11086d25041f77fe8fe7b9ea4e48e3b9192b8f19...1fc5bd396d372bee37d608f955b336615edf79c8) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index f064a81c6d..879006dc60 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 + uses: sigstore/cosign-installer@1fc5bd396d372bee37d608f955b336615edf79c8 # v3.2.0 with: cosign-release: 'v2.2.0' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 157320c45a..000af79061 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,7 +170,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@11086d25041f77fe8fe7b9ea4e48e3b9192b8f19 # v3.1.2 + uses: sigstore/cosign-installer@1fc5bd396d372bee37d608f955b336615edf79c8 # v3.2.0 with: cosign-release: 'v2.2.0' From f8d18a3387aaf241e09cb29395d01390181326a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:31:30 -0600 Subject: [PATCH 094/264] chore(deps): bump github.com/spf13/cobra from 1.7.0 to 1.8.0 (#3152) Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5af0e5a1e8..c4cadb80b9 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 diff --git a/go.sum b/go.sum index d3fd7c8f95..bbe996c0e1 100644 --- a/go.sum +++ b/go.sum @@ -180,6 +180,7 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -677,8 +678,8 @@ github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= From d8f0aa42e386884536cef3cab8d36d769b8baa4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Nov 2023 11:32:01 -0600 Subject: [PATCH 095/264] chore(deps): bump github.com/bombsimon/logrusr/v4 from 4.0.0 to 4.1.0 (#3151) Bumps [github.com/bombsimon/logrusr/v4](https://github.com/bombsimon/logrusr) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/bombsimon/logrusr/releases) - [Commits](https://github.com/bombsimon/logrusr/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: github.com/bombsimon/logrusr/v4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c4cadb80b9..996ffe4c59 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible - github.com/bombsimon/logrusr/v4 v4.0.0 + github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 diff --git a/go.sum b/go.sum index bbe996c0e1..a51c295342 100644 --- a/go.sum +++ b/go.sum @@ -146,8 +146,8 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bombsimon/logrusr/v4 v4.0.0 h1:Pm0InGphX0wMhPqC02t31onlq9OVyJ98eP/Vh63t1Oo= -github.com/bombsimon/logrusr/v4 v4.0.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= +github.com/bombsimon/logrusr/v4 v4.1.0 h1:uZNPbwusB0eUXlO8hIUwStE6Lr5bLN6IgYgG+75kuh4= +github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= From 39d21ae8570622c6475c5cef0d96eccb05d97ab6 Mon Sep 17 00:00:00 2001 From: Zubair Haque Date: Fri, 10 Nov 2023 20:42:41 -0500 Subject: [PATCH 096/264] chore: add test for reconcileEphemeralMetadata() (#3163) add test for reconcileEphemeralMetadata() Signed-off-by: zhaque44 --- rollout/ephemeralmetadata_test.go | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/rollout/ephemeralmetadata_test.go b/rollout/ephemeralmetadata_test.go index 24f76d6bac..59daf1be0e 100644 --- a/rollout/ephemeralmetadata_test.go +++ b/rollout/ephemeralmetadata_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -239,3 +240,36 @@ func TestSyncBlueGreenEphemeralMetadataSecondRevision(t *testing.T) { updatedPod := f.getUpdatedPod(podIdx) assert.Equal(t, expectedStableLabels, updatedPod.Labels) } + +func TestReconcileEphemeralMetadata(t *testing.T) { + newRS := &v1.ReplicaSet{} + stableRS := &v1.ReplicaSet{} + + mockContext := &rolloutContext{ + rollout: &v1alpha1.Rollout{ + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + CanaryMetadata: &v1alpha1.PodTemplateMetadata{}, + StableMetadata: &v1alpha1.PodTemplateMetadata{}, + }, + }, + }, + Status: v1alpha1.RolloutStatus{ + StableRS: "some-stable-rs-hash", + }, + }, + newRS: newRS, + stableRS: stableRS, + otherRSs: []*v1.ReplicaSet{new(v1.ReplicaSet), new(v1.ReplicaSet)}, + } + + // Scenario 1: upgrading state when the new ReplicaSet is a canary + err := mockContext.reconcileEphemeralMetadata() + assert.NoError(t, err) + + // Scenario 2: Sync stable metadata to the stable ReplicaSet + mockContext.rollout.Status.StableRS = "" // Set stable ReplicaSet to empty to simulate an upgrading state + err = mockContext.reconcileEphemeralMetadata() + assert.NoError(t, err) +} From 13ef11180c405bb94381df65471bb9c2d82e9494 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:51:27 -0600 Subject: [PATCH 097/264] chore(deps): bump github.com/hashicorp/go-plugin from 1.5.2 to 1.6.0 (#3167) Bumps [github.com/hashicorp/go-plugin](https://github.com/hashicorp/go-plugin) from 1.5.2 to 1.6.0. - [Release notes](https://github.com/hashicorp/go-plugin/releases) - [Changelog](https://github.com/hashicorp/go-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-plugin/compare/v1.5.2...v1.6.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 996ffe4c59..625f844070 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/hashicorp/go-plugin v1.5.2 + github.com/hashicorp/go-plugin v1.6.0 github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 @@ -133,7 +133,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v0.14.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.1 // indirect - github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -179,7 +179,7 @@ require ( go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/go.sum b/go.sum index a51c295342..20df609535 100644 --- a/go.sum +++ b/go.sum @@ -422,15 +422,15 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= -github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= +github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= github.com/hashicorp/go-retryablehttp v0.5.1/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb h1:b5rjCoWHc7eqmAS4/qyk21ZsHyb6Mxv/jykxvNTkU4M= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= @@ -852,8 +852,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 87b7448fc08a3de0c7905f60abc86bd4ec30cd1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 07:45:02 -0600 Subject: [PATCH 098/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.30.0 to 1.30.1 (#3166) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.30.0 to 1.30.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.0...service/s3/v1.30.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 625f844070..30b121df1a 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.22.2 github.com/aws/aws-sdk-go-v2/config v1.23.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 20df609535..ce3208d138 100644 --- a/go.sum +++ b/go.sum @@ -120,8 +120,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAW github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0 h1:2ObDktnNOsFBXSjiBtSRmiGXAMAtmg28XcIGvygZM+4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.0/go.mod h1:G6amy3RheFTRhVYWAaurKAxWTlzo9sxxU6TTvG+AVmA= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 h1:6Bkn/mpcNLl9Ux9q4JNUIAHmaPiQ9OfnYNfzUeAoQxo= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1/go.mod h1:qGqsvz4AZhM2l4G8HjSsOoy1/pjDJvMGDSWOUn4cJbM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= From be241c9143b31320d7c36878c907ed6598698a70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:27:40 -0600 Subject: [PATCH 099/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.23.0 to 1.25.5 (#3183) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.23.0 to 1.25.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.23.0...config/v1.25.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 25 +++++++++++++------------ go.sum | 50 ++++++++++++++++++++++++++------------------------ 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 30b121df1a..60b426d3b6 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.3 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.22.2 - github.com/aws/aws-sdk-go-v2/config v1.23.0 + github.com/aws/aws-sdk-go-v2 v1.23.1 + github.com/aws/aws-sdk-go-v2/config v1.25.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 github.com/blang/semver v3.5.1+incompatible @@ -83,17 +83,18 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.4 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 // indirect - github.com/aws/smithy-go v1.16.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.4 // indirect + github.com/aws/smithy-go v1.17.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index ce3208d138..372801c08c 100644 --- a/go.sum +++ b/go.sum @@ -104,39 +104,41 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.22.2 h1:lV0U8fnhAnPz8YcdmZVV60+tr6CakHzqA6P8T46ExJI= -github.com/aws/aws-sdk-go-v2 v1.22.2/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= -github.com/aws/aws-sdk-go-v2/config v1.23.0 h1:kqzEfGGDIrRJpfJckgwuZfFTbU9NB1jZnRcaO9MpOqE= -github.com/aws/aws-sdk-go-v2/config v1.23.0/go.mod h1:p7wbxKXXjS1GGQOss7VXOazVMFF9bjUGq85/4wR/fSw= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2 h1:rKH7khRMxPdD0u3dHecd0Q7NOVw3EUe7AqdkUOkiOGI= -github.com/aws/aws-sdk-go-v2/credentials v1.15.2/go.mod h1:tXM8wmaeAhfC7nZoCxb0FzM/aRaB1m1WQ7x0qlBLq80= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3 h1:G5KawTAkyHH6WyKQCdHiW4h3PmAXNJpOgwKg3H7sDRE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.3/go.mod h1:hugKmSFnZB+HgNI1sYGT14BUPZkO6alC/e0AWu+0IAQ= +github.com/aws/aws-sdk-go-v2 v1.23.1 h1:qXaFsOOMA+HsZtX8WoCa+gJnbyW7qyFFBlPqvTSzbaI= +github.com/aws/aws-sdk-go-v2 v1.23.1/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2/config v1.25.5 h1:UGKm9hpQS2hoK8CEJ1BzAW8NbUpvwDJJ4lyqXSzu8bk= +github.com/aws/aws-sdk-go-v2/config v1.25.5/go.mod h1:Bf4gDvy4ZcFIK0rqDu1wp9wrubNba2DojiPB2rt6nvI= +github.com/aws/aws-sdk-go-v2/credentials v1.16.4 h1:i7UQYYDSJrtc30RSwJwfBKwLFNnBTiICqAJ0pPdum8E= +github.com/aws/aws-sdk-go-v2/credentials v1.16.4/go.mod h1:Kdh/okh+//vQ/AjEt81CjvkTo64+/zIE4OewP7RpfXk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 h1:KehRNiVzIfAcj6gw98zotVbb/K67taJE0fkfgM6vzqU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5/go.mod h1:VhnExhw6uXy9QzetvpXDolo1/hjhx4u9qukBGkuUwjs= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2 h1:AaQsr5vvGR7rmeSWBtTCcw16tT9r51mWijuCQhzLnq8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.2/go.mod h1:o1IiRn7CWocIFTXJjGKJDOwxv1ibL53NpcvcqGWyRBA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 h1:LAm3Ycm9HJfbSCd5I+wqC2S9Ej7FPrgr5CQoOljJZcE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4/go.mod h1:xEhvbJcyUf/31yfGSQBe01fukXwXJ0gxDp7rLfymWE0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2 h1:UZx8SXZ0YtzRiALzYAWcjb9Y9hZUR7MBKaBQ5ouOjPs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.2/go.mod h1:ipuRpcSaklmxR6C39G187TpBAO132gUfleTGccUPs8c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0 h1:hwZB07/beLiCopuRKF0t+dEHmP39iN4YtDh3X5d3hrg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.6.0/go.mod h1:rdAuXeHWhI/zkpYcO5n8WCpaIgY9MUxFyBsuqq3kjyA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 h1:4GV0kKZzUxiWxSVpn/9gwR0g21NF1Jsyduzo9rHgC/Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4/go.mod h1:dYvTNAggxDZy6y1AF7YDwXsPuHFy/VNEpEI/2dWK9IU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 h1:6Bkn/mpcNLl9Ux9q4JNUIAHmaPiQ9OfnYNfzUeAoQxo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1/go.mod h1:qGqsvz4AZhM2l4G8HjSsOoy1/pjDJvMGDSWOUn4cJbM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2 h1:h7j73yuAVVjic8pqswh+L/7r2IHP43QwRyOu6zcCDDE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.2/go.mod h1:H07AHdK5LSy8F7EJUQhoxyiCNkePoHj2D8P2yGTWafo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 h1:rdovz3rEu0vZKbzoMYPTehp0E8veoE9AyfzqCr5Eeao= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4/go.mod h1:aYCGNjyUCUelhofxlZyj63srdxWUSsBSGg5l6MCuXuE= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1 h1:km+ZNjtLtpXYf42RdaDZnNHm9s7SYAuDGTafy6nd89A= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.1/go.mod h1:aHBr3pvBSD5MbzOvQtYutyPLLRPbl/y9x86XyJJnUXQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1 h1:iRFNqZH4a67IqPvK8xxtyQYnyrlsvwmpHOe9r55ggBA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.1/go.mod h1:pTy5WM+6sNv2tB24JNKFtn6EvciQ5k40ZJ0pq/Iaxj0= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1 h1:txgVXIXWPXyqdiVn92BV6a/rgtpX31HYdsOYj0sVQQQ= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.1/go.mod h1:VAiJiNaoP1L89STFlEMgmHX1bKixY+FaP+TpRFrmyZ4= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.3 h1:CdsSOGlFF3Pn+koXOIpTtvX7st0IuGsZ8kJqcWMlX54= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.3/go.mod h1:oA6VjNsLll2eVuUoF2D+CMyORgNzPEW/3PyUdq6WQjI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1 h1:cbRqFTVnJV+KRpwFl76GJdIZJKKCdTPnjUZ7uWh3pIU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1/go.mod h1:hHL974p5auvXlZPIjJTblXJpbkfK4klBczlsEaMCGVY= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.4 h1:yEvZ4neOQ/KpUqyR+X0ycUTW/kVRNR4nDZ38wStHGAA= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.4/go.mod h1:feTnm2Tk/pJxdX+eooEsxvlvTWBvDm6CasRZ+JOs2IY= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik= -github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI= +github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 586dcbd123a1b73449d1c4c3672615aa7944aef9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:37:50 -0600 Subject: [PATCH 100/264] chore(deps): bump github.com/antonmedv/expr from 1.15.3 to 1.15.4 (#3184) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.15.3 to 1.15.4. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.15.3...v1.15.4) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 60b426d3b6..ff366c851d 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.15.3 + github.com/antonmedv/expr v1.15.4 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.1 diff --git a/go.sum b/go.sum index 372801c08c..ca454d7e56 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.15.3 h1:q3hOJZNvLvhqE8OHBs1cFRdbXFNKuA+bHmRaI+AmRmI= -github.com/antonmedv/expr v1.15.3/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/antonmedv/expr v1.15.4 h1:CrNads8WDnDVJNWt/FeUINBO+vDNjurEwT7SoQN132o= +github.com/antonmedv/expr v1.15.4/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee h1:ZYILioq4v6OIsr7uh0Pcx7JY4KpJ9qs8qbjRqM6HWMY= github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee/go.mod h1:VG9FXG0ddIVGc7NcSTRapaUjCPCYqOji//z6mmBYwCE= From 1f7cb241fb9219b853b52dd8bdccccc377ad5f8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 03:10:53 +0000 Subject: [PATCH 101/264] chore(deps): bump github.com/influxdata/influxdb-client-go/v2 from 2.12.3 to 2.12.4 (#3150) chore(deps): bump github.com/influxdata/influxdb-client-go/v2 Bumps [github.com/influxdata/influxdb-client-go/v2](https://github.com/influxdata/influxdb-client-go) from 2.12.3 to 2.12.4. - [Release notes](https://github.com/influxdata/influxdb-client-go/releases) - [Changelog](https://github.com/influxdata/influxdb-client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-go/compare/v2.12.3...v2.12.4) --- updated-dependencies: - dependency-name: github.com/influxdata/influxdb-client-go/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 9 ++++--- go.sum | 82 +++++++++++----------------------------------------------- 2 files changed, 20 insertions(+), 71 deletions(-) diff --git a/go.mod b/go.mod index ff366c851d..3cc42b370d 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-plugin v1.6.0 - github.com/influxdata/influxdb-client-go/v2 v2.12.3 + github.com/influxdata/influxdb-client-go/v2 v2.12.4 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 github.com/mitchellh/mapstructure v1.5.0 @@ -82,6 +82,7 @@ require ( github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.4 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 // indirect @@ -101,7 +102,7 @@ require ( github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deepmap/oapi-codegen v1.11.0 // indirect + github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect @@ -146,8 +147,8 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.0.0 // indirect diff --git a/go.sum b/go.sum index ca454d7e56..052bb5cfa2 100644 --- a/go.sum +++ b/go.sum @@ -83,6 +83,7 @@ github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 h1:MdZskg1II+YVe+9ss935i8+paqqf4KEuYcTYUWSwABI= github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214/go.mod h1:rjP7sIipbZcagro/6TCk6X0ZeFT2eyudH5+fve/cbBA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -93,6 +94,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antonmedv/expr v1.15.4 h1:CrNads8WDnDVJNWt/FeUINBO+vDNjurEwT7SoQN132o= github.com/antonmedv/expr v1.15.4/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee h1:ZYILioq4v6OIsr7uh0Pcx7JY4KpJ9qs8qbjRqM6HWMY= github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee/go.mod h1:VG9FXG0ddIVGc7NcSTRapaUjCPCYqOji//z6mmBYwCE= @@ -148,6 +151,7 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bombsimon/logrusr/v4 v4.1.0 h1:uZNPbwusB0eUXlO8hIUwStE6Lr5bLN6IgYgG+75kuh4= github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= @@ -186,16 +190,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.11.0 h1:f/X2NdIkaBKsSdpeuwLnY/vDI0AtPUrmB5LMgc7YD+A= -github.com/deepmap/oapi-codegen v1.11.0/go.mod h1:k+ujhoQGxmQYBZBbxhOZNZf4j08qv5mC+OH+fFTnKxM= +github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= +github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -235,14 +235,10 @@ github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -277,26 +273,17 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= @@ -339,7 +326,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -389,7 +375,6 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= @@ -405,7 +390,6 @@ github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4 h1:4EZlYQIiyecYJlUbV github.com/gopackage/ddp v0.0.0-20170117053602-652027933df4/go.mod h1:lEO7XoHJ/xNRBCxrn4h/CEB67h0kW1B0t4ooP2yrjUA= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -445,8 +429,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= +github.com/influxdata/influxdb-client-go/v2 v2.12.4 h1:9qJLqetEmhIlqaF/N9KUtdmRKSbNy6IohggyS3bxWlE= +github.com/influxdata/influxdb-client-go/v2 v2.12.4/go.mod h1:3BQow2tDJRxKi8oUUy/6BtHaSq7wrBIoKieYMXB6knQ= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= @@ -463,7 +447,6 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -473,6 +456,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/ansiterm v1.0.0 h1:gmMvnZRq7JZJx6jkfSq9/+2LMrVEwGwt7UR6G+lmDEg= github.com/juju/ansiterm v1.0.0/go.mod h1:PyXUpnI3olx3bsPcHt98FGPX/KCFZ1Fi+hw1XLI6384= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -487,25 +471,12 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= -github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx v1.2.24/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= @@ -524,18 +495,17 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.10/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= @@ -608,7 +578,6 @@ github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 h1:nV98dkBpqaYbDnhefmOQ+Rn4hE+jD6 github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13/go.mod h1:4OjcxgwdXzezqytxN534MooNmrxRD50geWZxTD7845s= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -644,8 +613,6 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= @@ -686,6 +653,7 @@ github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzu github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -710,15 +678,10 @@ github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 h1:qqllXPzXh+So+mmANlX/gCJrgo+1kQyshMoQ+NASzm0= @@ -733,7 +696,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -761,8 +723,6 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= @@ -799,7 +759,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -845,10 +804,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220513224357-95641704303c/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -935,16 +892,12 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -980,8 +933,6 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1034,7 +985,6 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -1042,7 +992,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 h1:juzzlx91nWAOsHuOVfXZPMXHtJEKouZvY9bBbwlOeYs= gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45/go.mod h1:41y72mzHT7+jFNgyBpJRrZWuZJcLmLrTpq6iGgOFJMQ= gomodules.xyz/notify v0.1.1 h1:1tTuoyswmPvzqPCTEDQK8SZ3ukCxLsonAAwst2+y1a0= @@ -1175,7 +1124,6 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From c7746c41bca0d6632d2a5d96b947c216c3457ad5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Nov 2023 16:06:07 -0600 Subject: [PATCH 102/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.24.0 to 1.24.3 (#3180) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.24.0 to 1.24.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/ecs/v1.24.3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.24.0...service/ecs/v1.24.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3cc42b370d..2ee559fd7e 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.23.1 github.com/aws/aws-sdk-go-v2/config v1.25.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 052bb5cfa2..dd2ae78c5b 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 h1:6Bkn/mpcNLl9Ux9q4JNUIAHmaPiQ9OfnYNfzUeAoQxo= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1/go.mod h1:qGqsvz4AZhM2l4G8HjSsOoy1/pjDJvMGDSWOUn4cJbM= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0 h1:rY5sxFboW+uvGzIKsqD0zH5SWTn5C1gY5dHuQa0jlDE= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.0/go.mod h1:FPfQKsfLtGby26CFyJF4BFWQHIpK7EOKimbrec6OjNs= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 h1:RroiL+zC4velYCQBHJxgErD+VvCeMAUcXEaZGIGbNBU= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3/go.mod h1:LA5Wi7UcSEu2/AAYRE7hgb2dcLhc10kziPXB78w7mpg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 h1:rdovz3rEu0vZKbzoMYPTehp0E8veoE9AyfzqCr5Eeao= From 9bccf0e5fe8b31f0b05c27e8b73442939362ea30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Nov 2023 22:40:16 +0000 Subject: [PATCH 103/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.30.1 to 1.30.3 (#3179) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.30.1 to 1.30.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.1...service/s3/v1.30.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2ee559fd7e..fb0880adfb 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.1 github.com/aws/aws-sdk-go-v2/config v1.25.5 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index dd2ae78c5b..9273a95299 100644 --- a/go.sum +++ b/go.sum @@ -123,8 +123,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 h1:4GV0kKZzUxiWxSVpn/9 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4/go.mod h1:dYvTNAggxDZy6y1AF7YDwXsPuHFy/VNEpEI/2dWK9IU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1 h1:6Bkn/mpcNLl9Ux9q4JNUIAHmaPiQ9OfnYNfzUeAoQxo= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.1/go.mod h1:qGqsvz4AZhM2l4G8HjSsOoy1/pjDJvMGDSWOUn4cJbM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3 h1:gnH8gwkCrLDXPjb8UMR98UAJRWinJohby1WGuZQruZk= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3/go.mod h1:VlMH1Fii3w82/MlAmhGStMYMWZaRiNJvQS30o9psp3Y= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 h1:RroiL+zC4velYCQBHJxgErD+VvCeMAUcXEaZGIGbNBU= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3/go.mod h1:LA5Wi7UcSEu2/AAYRE7hgb2dcLhc10kziPXB78w7mpg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= From e440196430adc264aa23b16f80b01b6ab1421bfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Nov 2023 11:52:09 -0600 Subject: [PATCH 104/264] chore(deps): bump github.com/antonmedv/expr from 1.15.4 to 1.15.5 (#3186) Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.15.4 to 1.15.5. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.15.4...v1.15.5) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fb0880adfb..62ea466d32 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/argoproj/argo-rollouts go 1.20 require ( - github.com/antonmedv/expr v1.15.4 + github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.1 diff --git a/go.sum b/go.sum index 9273a95299..8080183094 100644 --- a/go.sum +++ b/go.sum @@ -92,8 +92,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.15.4 h1:CrNads8WDnDVJNWt/FeUINBO+vDNjurEwT7SoQN132o= -github.com/antonmedv/expr v1.15.4/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/antonmedv/expr v1.15.5 h1:y0Iz3cEwmpRz5/r3w4qQR0MfIqJGdGM1zbhD/v0G5Vg= +github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= From fe702457e75f1bf5ef4f1e6cf7f672b56eebb113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:46:15 -0600 Subject: [PATCH 105/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.30.3 to 1.30.5 (#3193) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.30.3 to 1.30.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.3...service/s3/v1.30.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 62ea466d32..b3db0f91c0 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.23.1 + github.com/aws/aws-sdk-go-v2 v1.23.2 github.com/aws/aws-sdk-go-v2/config v1.25.5 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 @@ -86,8 +86,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.4 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 // indirect diff --git a/go.sum b/go.sum index 8080183094..e7dbe2e247 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.23.1 h1:qXaFsOOMA+HsZtX8WoCa+gJnbyW7qyFFBlPqvTSzbaI= -github.com/aws/aws-sdk-go-v2 v1.23.1/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= +github.com/aws/aws-sdk-go-v2 v1.23.2 h1:UoTll1Y5b88x8h53OlsJGgOHwpggdMr7UVnLjMb3XYg= +github.com/aws/aws-sdk-go-v2 v1.23.2/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= github.com/aws/aws-sdk-go-v2/config v1.25.5 h1:UGKm9hpQS2hoK8CEJ1BzAW8NbUpvwDJJ4lyqXSzu8bk= github.com/aws/aws-sdk-go-v2/config v1.25.5/go.mod h1:Bf4gDvy4ZcFIK0rqDu1wp9wrubNba2DojiPB2rt6nvI= github.com/aws/aws-sdk-go-v2/credentials v1.16.4 h1:i7UQYYDSJrtc30RSwJwfBKwLFNnBTiICqAJ0pPdum8E= @@ -116,15 +116,15 @@ github.com/aws/aws-sdk-go-v2/credentials v1.16.4/go.mod h1:Kdh/okh+//vQ/AjEt81Cj github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 h1:KehRNiVzIfAcj6gw98zotVbb/K67taJE0fkfgM6vzqU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5/go.mod h1:VhnExhw6uXy9QzetvpXDolo1/hjhx4u9qukBGkuUwjs= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4 h1:LAm3Ycm9HJfbSCd5I+wqC2S9Ej7FPrgr5CQoOljJZcE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.4/go.mod h1:xEhvbJcyUf/31yfGSQBe01fukXwXJ0gxDp7rLfymWE0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 h1:16Z1XuMUv63fcyW5bIUno6AFcX4drsrE0gof+xue6g4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5/go.mod h1:pRvFacV2qbRKy34ZFptHZW4wpauJA445bqFbvA6ikSo= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4 h1:4GV0kKZzUxiWxSVpn/9gwR0g21NF1Jsyduzo9rHgC/Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.4/go.mod h1:dYvTNAggxDZy6y1AF7YDwXsPuHFy/VNEpEI/2dWK9IU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5 h1:RxpMuBgzP3Dj1n5CZY6droLFcsn5gc7QsrIcaGQoeCs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5/go.mod h1:dO8Js7ym4Jzg/wcjTgCRVln/jFn3nI82XNhsG2lWbDI= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3 h1:gnH8gwkCrLDXPjb8UMR98UAJRWinJohby1WGuZQruZk= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.3/go.mod h1:VlMH1Fii3w82/MlAmhGStMYMWZaRiNJvQS30o9psp3Y= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 h1:8egOYLCQRxb9Mrs2KM572Kf5xEOFTTkJV36utKlAgl0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5/go.mod h1:OwiuGlzCxOeDWT+M1b763ghxnioWGUV7GtMFSXjRh9s= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 h1:RroiL+zC4velYCQBHJxgErD+VvCeMAUcXEaZGIGbNBU= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3/go.mod h1:LA5Wi7UcSEu2/AAYRE7hgb2dcLhc10kziPXB78w7mpg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= From 57d294e93e7e80ecfe09aa234c31c8b4e74f5cff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 09:47:34 -0600 Subject: [PATCH 106/264] chore(deps): bump golang.org/x/oauth2 from 0.13.0 to 0.15.0 (#3187) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.13.0 to 0.15.0. - [Commits](https://github.com/golang/oauth2/compare/v0.13.0...v0.15.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index b3db0f91c0..13d8fea52f 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.13.0 + golang.org/x/oauth2 v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 @@ -179,12 +179,12 @@ require ( github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect diff --git a/go.sum b/go.sum index e7dbe2e247..ebcab0a4ba 100644 --- a/go.sum +++ b/go.sum @@ -726,8 +726,8 @@ golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -811,8 +811,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -820,8 +820,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -903,8 +903,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -912,8 +912,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -928,8 +928,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From dbf8ccc58b3cd0fc10ac4027297a1fd6f3df44a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:20:12 +0000 Subject: [PATCH 107/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.24.3 to 1.25.2 (#3192) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.24.3 to 1.25.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ecs/v1.24.3...config/v1.25.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 13d8fea52f..2646e3fb17 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.23.2 github.com/aws/aws-sdk-go-v2/config v1.25.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index ebcab0a4ba..6354c86b7f 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 h1:8egOYLCQRxb9Mrs2KM572Kf5xEOFTTkJV36utKlAgl0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5/go.mod h1:OwiuGlzCxOeDWT+M1b763ghxnioWGUV7GtMFSXjRh9s= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3 h1:RroiL+zC4velYCQBHJxgErD+VvCeMAUcXEaZGIGbNBU= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.24.3/go.mod h1:LA5Wi7UcSEu2/AAYRE7hgb2dcLhc10kziPXB78w7mpg= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 h1:l+BorQnGATPRfkoRiNkDbNRMuVbMLPUv9YqwbyPpEns= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2/go.mod h1:VdkWjF6DhqvGqYAUpW+FElI333BDJg+s6znq5H7FuLA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 h1:rdovz3rEu0vZKbzoMYPTehp0E8veoE9AyfzqCr5Eeao= From 33e0612cb68c5f308dcac99697dc5ab10e472e7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:24:07 +0000 Subject: [PATCH 108/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.5 to 1.25.8 (#3191) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.25.5 to 1.25.8. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.5...config/v1.25.8) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 2646e3fb17..12470e0ffd 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.2 - github.com/aws/aws-sdk-go-v2/config v1.25.5 + github.com/aws/aws-sdk-go-v2/config v1.25.8 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 github.com/blang/semver v3.5.1+incompatible @@ -84,17 +84,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.4 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.6 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.25.6 // indirect github.com/aws/smithy-go v1.17.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 6354c86b7f..e3068426e4 100644 --- a/go.sum +++ b/go.sum @@ -109,12 +109,12 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.23.2 h1:UoTll1Y5b88x8h53OlsJGgOHwpggdMr7UVnLjMb3XYg= github.com/aws/aws-sdk-go-v2 v1.23.2/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2/config v1.25.5 h1:UGKm9hpQS2hoK8CEJ1BzAW8NbUpvwDJJ4lyqXSzu8bk= -github.com/aws/aws-sdk-go-v2/config v1.25.5/go.mod h1:Bf4gDvy4ZcFIK0rqDu1wp9wrubNba2DojiPB2rt6nvI= -github.com/aws/aws-sdk-go-v2/credentials v1.16.4 h1:i7UQYYDSJrtc30RSwJwfBKwLFNnBTiICqAJ0pPdum8E= -github.com/aws/aws-sdk-go-v2/credentials v1.16.4/go.mod h1:Kdh/okh+//vQ/AjEt81CjvkTo64+/zIE4OewP7RpfXk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5 h1:KehRNiVzIfAcj6gw98zotVbb/K67taJE0fkfgM6vzqU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.5/go.mod h1:VhnExhw6uXy9QzetvpXDolo1/hjhx4u9qukBGkuUwjs= +github.com/aws/aws-sdk-go-v2/config v1.25.8 h1:CHr7PIzyfevjNiqL9rU6xoqHZKCO2ldY6LmvRDfpRuI= +github.com/aws/aws-sdk-go-v2/config v1.25.8/go.mod h1:zefIy117FDPOVU0xSOFG8mx9kJunuVopzI639tjYXc0= +github.com/aws/aws-sdk-go-v2/credentials v1.16.6 h1:TimIpn1p4v44i0sJMKsnpby1P9sP1ByKLsdm7bvOmwM= +github.com/aws/aws-sdk-go-v2/credentials v1.16.6/go.mod h1:+CLPlYf9FQLeXD8etOYiZxpLQqc3GL4EikxjkFFp1KA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6 h1:pPs23/JLSOlwnmSRNkdbt3upmBeF6QL/3MHEb6KzTyo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6/go.mod h1:jsoDHV44SxWv00wlbx0yA5M7n5rmE5rGk+OGA0suXSw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 h1:16Z1XuMUv63fcyW5bIUno6AFcX4drsrE0gof+xue6g4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5/go.mod h1:pRvFacV2qbRKy34ZFptHZW4wpauJA445bqFbvA6ikSo= @@ -129,16 +129,16 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 h1:l+BorQnGA github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2/go.mod h1:VdkWjF6DhqvGqYAUpW+FElI333BDJg+s6znq5H7FuLA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4 h1:rdovz3rEu0vZKbzoMYPTehp0E8veoE9AyfzqCr5Eeao= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.4/go.mod h1:aYCGNjyUCUelhofxlZyj63srdxWUSsBSGg5l6MCuXuE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5 h1:F+XafeiK7Uf4YwTZfe/JLt+3cB6je9sI7l0TY4f2CkY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5/go.mod h1:NlZuvlkyu6l/F3+qIBsGGtYLL2Z71tCf5NFoNAaG1NY= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.3 h1:CdsSOGlFF3Pn+koXOIpTtvX7st0IuGsZ8kJqcWMlX54= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.3/go.mod h1:oA6VjNsLll2eVuUoF2D+CMyORgNzPEW/3PyUdq6WQjI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1 h1:cbRqFTVnJV+KRpwFl76GJdIZJKKCdTPnjUZ7uWh3pIU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.1/go.mod h1:hHL974p5auvXlZPIjJTblXJpbkfK4klBczlsEaMCGVY= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.4 h1:yEvZ4neOQ/KpUqyR+X0ycUTW/kVRNR4nDZ38wStHGAA= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.4/go.mod h1:feTnm2Tk/pJxdX+eooEsxvlvTWBvDm6CasRZ+JOs2IY= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.5 h1:kuK22ZsITfzaZEkxEl5H/lhy2k3G4clBtcQBI93RbIc= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.5/go.mod h1:/tLqstwPfJLHYGBB5/c8P1ITI82pcGs7cJQuXku2pOg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3 h1:l5d5nrTFMhiUWNoLnV7QNI4m42/3WVSXqSyqVy+elGk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3/go.mod h1:30gKZp2pHQJq3yTmVy+hJKDFynSoYzVqYaxe4yPi+xI= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.6 h1:39dJNBt35p8dFSnQdoy+QbDaPenTxFqqDQFOb1GDYpE= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.6/go.mod h1:6DKEi+8OnUrqEEh6OCam16AYQHWAOyNgRiUGnHoh7Cg= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI= github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 8cae2846f9d2b9995800aeae869c75c8e1448425 Mon Sep 17 00:00:00 2001 From: Philip Clark <35117115+phclark@users.noreply.github.com> Date: Thu, 30 Nov 2023 11:41:45 -0500 Subject: [PATCH 109/264] feat: Rollouts UI List View Refresh (#3118) * feat: Rollouts UI Refresh Signed-off-by: Philip Clark * add test for labels and annotations Signed-off-by: Philip Clark * simplify regex Signed-off-by: Philip Clark * make filters use OR logic Signed-off-by: Philip Clark * add keyboard listener Signed-off-by: Philip Clark * set default display mode to grid Signed-off-by: Philip Clark * set strategy column to left justify Signed-off-by: Philip Clark * add tooltips to view buttons Signed-off-by: Philip Clark * consider unknown status rollouts as needing attention Signed-off-by: Philip Clark * remove duplicate escape key listener Signed-off-by: Philip Clark * group status filters together Signed-off-by: Philip Clark * improve filter logic Signed-off-by: Philip Clark * remove debug logging Signed-off-by: Philip Clark * dont show help on escape Signed-off-by: Philip Clark * properly remove url search params when disabled Signed-off-by: Philip Clark * rename to RolloutGridWidget Signed-off-by: Philip Clark * prevent help menu from loading while searching Signed-off-by: Philip Clark --------- Signed-off-by: Philip Clark --- docs/CONTRIBUTING.md | 23 ++ pkg/kubectl-argo-rollouts/info/info_test.go | 8 + .../info/rollout_info.go | 2 + ui/package.json | 1 + ui/src/app/App.tsx | 11 +- .../confirm-button/confirm-button.tsx | 8 +- ui/src/app/components/header/header.tsx | 20 +- .../app/components/info-item/info-item.scss | 2 +- ui/src/app/components/info-item/info-item.tsx | 6 +- ui/src/app/components/pods/pods.tsx | 5 +- .../rollout-actions/rollout-actions.tsx | 3 +- .../rollout-grid-widget.scss} | 4 +- .../rollout-grid-widget.tsx | 134 +++++++++ ui/src/app/components/rollout/containers.tsx | 3 +- ui/src/app/components/rollout/revision.tsx | 15 +- ui/src/app/components/rollout/rollout.tsx | 7 +- .../rollouts-grid/rollouts-grid.scss | 8 + .../rollouts-grid/rollouts-grid.tsx | 95 ++++++ .../rollouts-home/rollouts-home.scss | 182 ++++++++++++ .../rollouts-home/rollouts-home.tsx | 188 ++++++++++++ .../rollouts-list/rollouts-list.tsx | 258 ---------------- .../rollouts-table/rollouts-table.scss | 18 ++ .../rollouts-table/rollouts-table.tsx | 281 ++++++++++++++++++ .../rollouts-toolbar/rollouts-toolbar.scss | 55 ++++ .../rollouts-toolbar/rollouts-toolbar.tsx | 235 +++++++++++++++ .../components/status-count/status-count.scss | 31 ++ .../components/status-count/status-count.tsx | 16 + .../components/status-icon/status-icon.tsx | 34 ++- ui/src/app/index.tsx | 2 +- ui/yarn.lock | 12 + 30 files changed, 1374 insertions(+), 293 deletions(-) rename ui/src/app/components/{rollouts-list/rollouts-list.scss => rollout-grid-widget/rollout-grid-widget.scss} (98%) create mode 100644 ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx create mode 100644 ui/src/app/components/rollouts-grid/rollouts-grid.scss create mode 100644 ui/src/app/components/rollouts-grid/rollouts-grid.tsx create mode 100644 ui/src/app/components/rollouts-home/rollouts-home.scss create mode 100644 ui/src/app/components/rollouts-home/rollouts-home.tsx delete mode 100644 ui/src/app/components/rollouts-list/rollouts-list.tsx create mode 100644 ui/src/app/components/rollouts-table/rollouts-table.scss create mode 100644 ui/src/app/components/rollouts-table/rollouts-table.tsx create mode 100644 ui/src/app/components/rollouts-toolbar/rollouts-toolbar.scss create mode 100644 ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx create mode 100644 ui/src/app/components/status-count/status-count.scss create mode 100644 ui/src/app/components/status-count/status-count.tsx diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index a13b18ed0e..510bac78af 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -110,6 +110,29 @@ To run a subset of e2e tests, you need to specify the suite with `-run`, and the E2E_TEST_OPTIONS="-run 'TestCanarySuite' -testify.m 'TestCanaryScaleDownOnAbortNoTrafficRouting'" make test-e2e ``` +## Running the UI + +If you'd like to run the UI locally, you first need a running Rollouts controller. This can be a locally running controller with a k3d cluster, as described above, or a controller running in a remote Kubernetes cluster. + +In order for the local React app to communicate with the controller and Kubernetes API, run the following to open a port forward to the dashboard: +```bash +kubectl argo rollouts dashboard +``` + +Note that you can also build the API server and run this instead, + +``` +make plugin +./dist/kubectl-argo-rollouts dashboard +``` + +In another terminal, run the following to start the UI: +```bash +cd ui +yarn install +yarn start +``` + ## Controller architecture Argo Rollouts is actually a collection of individual controllers diff --git a/pkg/kubectl-argo-rollouts/info/info_test.go b/pkg/kubectl-argo-rollouts/info/info_test.go index d7bbe161fd..ab28b48637 100644 --- a/pkg/kubectl-argo-rollouts/info/info_test.go +++ b/pkg/kubectl-argo-rollouts/info/info_test.go @@ -169,3 +169,11 @@ func TestRolloutAborted(t *testing.T) { assert.Equal(t, "Degraded", roInfo.Status) assert.Equal(t, `RolloutAborted: metric "web" assessed Failed due to failed (1) > failureLimit (0)`, roInfo.Message) } + +func TestRolloutInfoMetadata(t *testing.T) { + rolloutObjs := testdata.NewCanaryRollout() + roInfo := NewRolloutInfo(rolloutObjs.Rollouts[0], rolloutObjs.ReplicaSets, rolloutObjs.Pods, rolloutObjs.Experiments, rolloutObjs.AnalysisRuns, nil) + assert.Equal(t, roInfo.ObjectMeta.Name, rolloutObjs.Rollouts[0].Name) + assert.Equal(t, roInfo.ObjectMeta.Annotations, rolloutObjs.Rollouts[0].Annotations) + assert.Equal(t, roInfo.ObjectMeta.Labels, rolloutObjs.Rollouts[0].Labels) +} diff --git a/pkg/kubectl-argo-rollouts/info/rollout_info.go b/pkg/kubectl-argo-rollouts/info/rollout_info.go index 59ee3f076a..8afc8cf02f 100644 --- a/pkg/kubectl-argo-rollouts/info/rollout_info.go +++ b/pkg/kubectl-argo-rollouts/info/rollout_info.go @@ -29,6 +29,8 @@ func NewRolloutInfo( ObjectMeta: &v1.ObjectMeta{ Name: ro.Name, Namespace: ro.Namespace, + Labels: ro.Labels, + Annotations: ro.Annotations, UID: ro.UID, CreationTimestamp: ro.CreationTimestamp, ResourceVersion: ro.ObjectMeta.ResourceVersion, diff --git a/ui/package.json b/ui/package.json index fac0a758f3..46c0e34666 100644 --- a/ui/package.json +++ b/ui/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-regular-svg-icons": "^6.4.0", "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", "antd": "^5.4.2", diff --git a/ui/src/app/App.tsx b/ui/src/app/App.tsx index 60ba5419c6..bcdb94b9df 100644 --- a/ui/src/app/App.tsx +++ b/ui/src/app/App.tsx @@ -7,7 +7,7 @@ import './App.scss'; import {NamespaceContext, RolloutAPI} from './shared/context/api'; import {Modal} from './components/modal/modal'; import {Rollout} from './components/rollout/rollout'; -import {RolloutsList} from './components/rollouts-list/rollouts-list'; +import {RolloutsHome} from './components/rollouts-home/rollouts-home'; import {Shortcut, Shortcuts} from './components/shortcuts/shortcuts'; import {ConfigProvider} from 'antd'; import {theme} from '../config/theme'; @@ -33,7 +33,12 @@ const Page = (props: {path: string; component: React.ReactNode; exact?: boolean; pageHasShortcuts={!!props.shortcuts} showHelp={() => { if (props.shortcuts) { - setShowShortcuts(true); + setShowShortcuts(!showShortcuts); + } + }} + hideHelp={() => { + if (props.shortcuts) { + setShowShortcuts(false); } }} /> @@ -84,7 +89,7 @@ const App = () => { } + component={} shortcuts={[ {key: '/', description: 'Search'}, {key: 'TAB', description: 'Search, navigate search items'}, diff --git a/ui/src/app/components/confirm-button/confirm-button.tsx b/ui/src/app/components/confirm-button/confirm-button.tsx index 4dd4f37e7c..48ce3fba77 100644 --- a/ui/src/app/components/confirm-button/confirm-button.tsx +++ b/ui/src/app/components/confirm-button/confirm-button.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import {Button, Popconfirm, Tooltip} from 'antd'; import {ButtonProps} from 'antd/es/button/button'; import {useState} from 'react'; -import { TooltipPlacement } from 'antd/es/tooltip'; +import {TooltipPlacement} from 'antd/es/tooltip'; interface ConfirmButtonProps extends ButtonProps { skipconfirm?: boolean; @@ -51,7 +51,8 @@ export const ConfirmButton = (props: ConfirmButtonProps) => { onClick={(e) => { e.stopPropagation(); e.preventDefault(); - }}> + }} + > { okText='Yes' cancelText='No' onOpenChange={handleOpenChange} - placement={props.placement || 'bottom'}> + placement={props.placement || 'bottom'} + >
diff --git a/ui/src/app/components/header/header.tsx b/ui/src/app/components/header/header.tsx index e267822108..8bdbfc3a83 100644 --- a/ui/src/app/components/header/header.tsx +++ b/ui/src/app/components/header/header.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import {useParams} from 'react-router'; +import {Key, KeybindingContext} from 'react-keyhooks'; import {NamespaceContext, RolloutAPIContext} from '../../shared/context/api'; import './header.scss'; @@ -11,13 +12,28 @@ import {faBook, faKeyboard} from '@fortawesome/free-solid-svg-icons'; const Logo = () => Argo Logo; -export const Header = (props: {pageHasShortcuts: boolean; changeNamespace: (val: string) => void; showHelp: () => void}) => { +export const Header = (props: {pageHasShortcuts: boolean; changeNamespace: (val: string) => void; showHelp: () => void; hideHelp: () => void}) => { const history = useHistory(); const namespaceInfo = React.useContext(NamespaceContext); const {namespace} = useParams<{namespace: string}>(); const api = React.useContext(RolloutAPIContext); const [version, setVersion] = React.useState('v?'); const [nsInput, setNsInput] = React.useState(namespaceInfo.namespace); + const {useKeybinding} = React.useContext(KeybindingContext); + + useKeybinding([Key.SHIFT, Key.H], + () => { + props.showHelp(); + return true; + }, + true + ); + + useKeybinding(Key.ESCAPE, () => { + props.hideHelp(); + return true; + }); + React.useEffect(() => { const getVersion = async () => { const v = await api.rolloutServiceVersion(); @@ -25,12 +41,14 @@ export const Header = (props: {pageHasShortcuts: boolean; changeNamespace: (val: }; getVersion(); }, []); + React.useEffect(() => { if (namespace && namespace != namespaceInfo.namespace) { props.changeNamespace(namespace); setNsInput(namespace); } }, []); + return (
diff --git a/ui/src/app/components/info-item/info-item.scss b/ui/src/app/components/info-item/info-item.scss index 0cd040dde6..17cc0d4d4d 100644 --- a/ui/src/app/components/info-item/info-item.scss +++ b/ui/src/app/components/info-item/info-item.scss @@ -8,7 +8,7 @@ margin-right: 5px; color: $argo-color-gray-8; display: flex; - align-items: center; + align-items: left; min-width: 0; &--lightweight { diff --git a/ui/src/app/components/info-item/info-item.tsx b/ui/src/app/components/info-item/info-item.tsx index 7e7bf8e617..7928310bc1 100644 --- a/ui/src/app/components/info-item/info-item.tsx +++ b/ui/src/app/components/info-item/info-item.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import './info-item.scss'; -import { Tooltip } from 'antd'; +import {Tooltip} from 'antd'; export enum InfoItemKind { Default = 'default', @@ -40,7 +40,7 @@ export const InfoItem = (props: InfoItemProps) => { /** * Displays a right justified InfoItem (or multiple InfoItems) and a left justfied label */ -export const InfoItemRow = (props: {label: string | React.ReactNode; items?: InfoItemProps | InfoItemProps[]; lightweight?: boolean}) => { +export const InfoItemRow = (props: {label: string | React.ReactNode; items?: InfoItemProps | InfoItemProps[]; lightweight?: boolean; style?: React.CSSProperties}) => { let {label, items} = props; let itemComponents = null; if (!Array.isArray(items)) { @@ -55,7 +55,7 @@ export const InfoItemRow = (props: {label: string | React.ReactNode; items?: Inf
)} - {props.items &&
{itemComponents}
} + {props.items &&
{itemComponents}
} ); }; diff --git a/ui/src/app/components/pods/pods.tsx b/ui/src/app/components/pods/pods.tsx index c3e5fecb32..1107a8444d 100644 --- a/ui/src/app/components/pods/pods.tsx +++ b/ui/src/app/components/pods/pods.tsx @@ -55,7 +55,7 @@ export const ReplicaSets = (props: {replicaSets: RolloutReplicaSetInfo[]; showRe
- ) + ), )} ); @@ -84,7 +84,8 @@ export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boo Scaledown in - }> + } + > ) as any} icon='fa fa-clock'> ); diff --git a/ui/src/app/components/rollout-actions/rollout-actions.tsx b/ui/src/app/components/rollout-actions/rollout-actions.tsx index 94a4b289f2..fd2ff83f7d 100644 --- a/ui/src/app/components/rollout-actions/rollout-actions.tsx +++ b/ui/src/app/components/rollout-actions/rollout-actions.tsx @@ -107,7 +107,8 @@ export const RolloutActionButton = (props: {action: RolloutAction; rollout: Roll disabled={ap.disabled} loading={loading} tooltip={ap.tooltip} - icon={}> + icon={} + > {props.action} ); diff --git a/ui/src/app/components/rollouts-list/rollouts-list.scss b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.scss similarity index 98% rename from ui/src/app/components/rollouts-list/rollouts-list.scss rename to ui/src/app/components/rollout-grid-widget/rollout-grid-widget.scss index f0ec5fdcc7..68f92bf93e 100644 --- a/ui/src/app/components/rollouts-list/rollouts-list.scss +++ b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.scss @@ -171,6 +171,8 @@ $colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; align-items: center; margin-top: 1.5em; z-index: 10 !important; + color: $argo-color-gray-7; + font-size: 14px; } } -} +} \ No newline at end of file diff --git a/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx new file mode 100644 index 0000000000..89497124ff --- /dev/null +++ b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx @@ -0,0 +1,134 @@ +import * as React from 'react'; +import {Link} from 'react-router-dom'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCircleNotch, faRedoAlt} from '@fortawesome/free-solid-svg-icons'; +import {IconDefinition} from '@fortawesome/fontawesome-svg-core'; +import {faStar as faStarSolid} from '@fortawesome/free-solid-svg-icons'; +import {faStar as faStarOutline} from '@fortawesome/free-regular-svg-icons/faStar'; + +import {Tooltip} from 'antd'; + +import {ParsePodStatus, PodStatus, ReplicaSets} from '../pods/pods'; +import {RolloutInfo} from '../../../models/rollout/rollout'; +import {useWatchRollout} from '../../shared/services/rollout'; +import {useClickOutside} from '../../shared/utils/utils'; +import {InfoItemKind, InfoItemRow} from '../info-item/info-item'; +import {RolloutAction, RolloutActionButton} from '../rollout-actions/rollout-actions'; +import {RolloutStatus, StatusIcon} from '../status-icon/status-icon'; +import './rollout-grid-widget.scss'; + +export const isInProgress = (rollout: RolloutInfo): boolean => { + for (const rs of rollout.replicaSets || []) { + for (const p of rs.pods || []) { + const status = ParsePodStatus(p.status); + if (status === PodStatus.Pending) { + return true; + } + } + } + return false; +}; + +export const RolloutGridWidget = (props: { + rollout: RolloutInfo; + deselect: () => void; + selected?: boolean; + isFavorite: boolean; + onFavoriteChange: (rolloutName: string, isFavorite: boolean) => void; +}) => { + const [watching, subscribe] = React.useState(false); + let rollout = props.rollout; + useWatchRollout(props.rollout?.objectMeta?.name, watching, null, (r: RolloutInfo) => (rollout = r)); + const ref = React.useRef(null); + useClickOutside(ref, props.deselect); + + React.useEffect(() => { + if (watching) { + const to = setTimeout(() => { + if (!isInProgress(rollout)) { + subscribe(false); + } + }, 5000); + return () => clearTimeout(to); + } + }, [watching, rollout]); + + return ( + + { + subscribe(true); + setTimeout(() => { + subscribe(false); + }, 1000); + }} + isFavorite={props.isFavorite} + handleFavoriteChange={props.onFavoriteChange} + /> +
+ + {(rollout.strategy || '').toLocaleLowerCase() === 'canary' && } +
+ +
{rollout.message !== 'CanaryPauseStep' && rollout.message}
+
+ subscribe(true)} indicateLoading /> + subscribe(true)} indicateLoading /> +
+ + ); +}; + +const WidgetHeader = (props: {rollout: RolloutInfo; refresh: () => void; isFavorite: boolean; handleFavoriteChange: (rolloutName: string, isFavorite: boolean) => void}) => { + const {rollout} = props; + const [loading, setLoading] = React.useState(false); + React.useEffect(() => { + setTimeout(() => setLoading(false), 500); + }, [loading]); + + const handleFavoriteClick = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + props.handleFavoriteChange(rollout.objectMeta?.name, !props.isFavorite); + }; + + return ( +
+ {props.isFavorite ? ( + + ) : ( + + )} + {rollout.objectMeta?.name} + + + { + props.refresh(); + setLoading(true); + e.preventDefault(); + }} + /> + + + +
+ ); +}; diff --git a/ui/src/app/components/rollout/containers.tsx b/ui/src/app/components/rollout/containers.tsx index c69b30658b..552ac29a93 100644 --- a/ui/src/app/components/rollout/containers.tsx +++ b/ui/src/app/components/rollout/containers.tsx @@ -63,7 +63,8 @@ export const ContainersWidget = (props: ContainersWidgetProps) => { setError(true); } } - }}> + }} + > {error ? 'ERROR' : 'SAVE'} diff --git a/ui/src/app/components/rollout/revision.tsx b/ui/src/app/components/rollout/revision.tsx index e2fcd11526..bd7f7410ce 100644 --- a/ui/src/app/components/rollout/revision.tsx +++ b/ui/src/app/components/rollout/revision.tsx @@ -68,7 +68,8 @@ export const RevisionWidget = (props: RevisionWidgetProps) => { onClick={() => props.rollback(Number(revision.number))} type='default' icon={} - style={{fontSize: '13px', marginRight: '10px'}}> + style={{fontSize: '13px', marginRight: '10px'}} + > Rollback )} @@ -123,11 +124,13 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { {ar.status} - }> + } + >
+ }`} + > @@ -201,7 +204,8 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { )} ); - })}> + })} + >
@@ -264,7 +268,8 @@ const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { )} ); - })}> + })} + > diff --git a/ui/src/app/components/rollout/rollout.tsx b/ui/src/app/components/rollout/rollout.tsx index 91b6c0a9d8..317d223d2d 100644 --- a/ui/src/app/components/rollout/rollout.tsx +++ b/ui/src/app/components/rollout/rollout.tsx @@ -332,7 +332,8 @@ const Step = (props: {step: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1 (props.step.setMirrorRoute && openMirror) ? 'steps__step-title--experiment' : '' - }`}> + }`} + > {icon && } {content} {unit} {props.step.setCanaryScale && ( @@ -457,7 +458,7 @@ const WidgetItemSetMirror = ({value}: {value: GithubComArgoprojArgoRolloutsPkgAp {index} - Path ({stringMatcherType})
{stringMatcherValue}
- + , ); } if (val.method != null) { @@ -479,7 +480,7 @@ const WidgetItemSetMirror = ({value}: {value: GithubComArgoprojArgoRolloutsPkgAp {index} - Method ({stringMatcherType})
{stringMatcherValue}
- + , ); } return fragments; diff --git a/ui/src/app/components/rollouts-grid/rollouts-grid.scss b/ui/src/app/components/rollouts-grid/rollouts-grid.scss new file mode 100644 index 0000000000..4f6e1dc22f --- /dev/null +++ b/ui/src/app/components/rollouts-grid/rollouts-grid.scss @@ -0,0 +1,8 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +.rollouts-grid { + display: flex; + box-sizing: border-box; + flex-wrap: wrap; + padding-top: 20px; +} diff --git a/ui/src/app/components/rollouts-grid/rollouts-grid.tsx b/ui/src/app/components/rollouts-grid/rollouts-grid.tsx new file mode 100644 index 0000000000..a5c9e22a13 --- /dev/null +++ b/ui/src/app/components/rollouts-grid/rollouts-grid.tsx @@ -0,0 +1,95 @@ +import * as React from 'react'; +import {useHistory} from 'react-router-dom'; +import {Key, KeybindingContext, useNav} from 'react-keyhooks'; +import {RolloutInfo} from '../../../models/rollout/rollout'; +import {RolloutGridWidget} from '../rollout-grid-widget/rollout-grid-widget'; +import './rollouts-grid.scss'; + +export const RolloutsGrid = ({ + rollouts, + onFavoriteChange, + favorites, +}: { + rollouts: RolloutInfo[]; + onFavoriteChange: (rolloutName: string, isFavorite: boolean) => void; + favorites: {[key: string]: boolean}; +}) => { + const [itemsPerRow, setItemsPerRow] = React.useState(0); + const rolloutsGridRef = React.useRef(null); + + const handleFavoriteChange = (rolloutName: string, isFavorite: boolean) => { + onFavoriteChange(rolloutName, isFavorite); + }; + + const orderedRollouts = rollouts + .map((rollout) => { + return { + ...rollout, + key: rollout.objectMeta?.uid, + favorite: favorites[rollout.objectMeta?.name] || false, + }; + }) + .sort((a, b) => { + if (a.favorite && !b.favorite) { + return -1; + } else if (!a.favorite && b.favorite) { + return 1; + } else { + return 0; + } + }); + + // Calculate the number of items per row for keyboard navigation + React.useEffect(() => { + const rolloutsGrid = rolloutsGridRef.current; + + const updateItemsPerRow = () => { + if (rolloutsGrid) { + const containerWidth = rolloutsGrid.clientWidth; + const widgetWidth = parseInt(getComputedStyle(document.querySelector('.rollouts-list__widget')).getPropertyValue('width'), 10); + const widgetPadding = parseInt(getComputedStyle(document.querySelector('.rollouts-list__widget')).getPropertyValue('padding'), 10); + const itemsPerRowValue = Math.floor(containerWidth / (widgetWidth + widgetPadding * 2)); + setItemsPerRow(itemsPerRowValue); + } + }; + + updateItemsPerRow(); + + window.addEventListener('resize', updateItemsPerRow); + + return () => { + window.removeEventListener('resize', updateItemsPerRow); + }; + }, []); + + const history = useHistory(); + const [pos, nav, reset] = useNav(orderedRollouts.length); + const {useKeybinding} = React.useContext(KeybindingContext); + + useKeybinding(Key.RIGHT, () => nav(1)); + useKeybinding(Key.LEFT, () => nav(-1)); + useKeybinding(Key.UP, () => nav(-itemsPerRow)); + useKeybinding(Key.DOWN, () => nav(itemsPerRow)); + useKeybinding(Key.ENTER, () => { + if (pos !== undefined) { + history.push(`/rollout/${orderedRollouts[pos].objectMeta?.name}`); + return true; + } + return false; + }); + + return ( +
+ {orderedRollouts.map((rollout, i) => ( + reset()} + isFavorite={favorites[rollout.objectMeta?.name] || false} + onFavoriteChange={handleFavoriteChange} + /> + ))} +
+ ); +}; diff --git a/ui/src/app/components/rollouts-home/rollouts-home.scss b/ui/src/app/components/rollouts-home/rollouts-home.scss new file mode 100644 index 0000000000..575c8350f6 --- /dev/null +++ b/ui/src/app/components/rollouts-home/rollouts-home.scss @@ -0,0 +1,182 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +$WIDGET_WIDTH: 400px; + +$widgetPadding: 17px; +$widgetMarginRight: 20px; +$colWidth: ($WIDGET_WIDTH + (2 * $widgetPadding)) + $widgetMarginRight; + +.rollouts-home { + height: 100vh; + display: flex; + flex-direction: column; +} + +.rollouts-list { + display: flex; + box-sizing: border-box; + flex-wrap: wrap; + + &__search-container { + width: 50% !important; + margin: 0 auto; + } + + &__search { + width: 100%; + font-size: 15px; + } + + &__rollouts-container { + padding: 20px; + display: flex; + flex-wrap: wrap; + + width: 3 * $colWidth; + margin: 0 auto; + + @media screen and (max-width: (3 * $colWidth)) { + width: 2 * $colWidth; + margin: 0 auto; + } + + @media screen and (max-width: (2 * $colWidth)) { + width: $colWidth; + + .rollouts-list__widget { + margin: 0 inherit; + width: 100%; + } + + .rollouts-list__search-container { + width: 100% !important; + } + } + } + + &__empty-message { + padding-top: 70px; + width: 50%; + margin: 0 auto; + color: $argo-color-gray-7; + h1 { + margin-bottom: 1em; + text-align: center; + } + div { + line-height: 1.5em; + } + pre { + overflow: scroll; + cursor: pointer; + line-height: 2em; + font-size: 15px; + padding: 3px 5px; + color: $argo-color-gray-8; + margin: 0.5em 0; + background-color: white; + } + a { + color: $sea; + border-bottom: 1px solid $sea; + } + + &--dark { + color: $shine; + a { + color: $sky; + border-color: $sky; + } + pre { + background-color: $space; + color: $shine; + } + } + + @media screen and (max-width: (2 * $colWidth)) { + width: 80%; + } + } + + &__toolbar { + width: 100%; + padding: 1em 0; + background-color: white; + border-bottom: 1px solid white; + + &--dark { + border-bottom: 1px solid $silver-lining; + background-color: $space; + } + } + + &__widget { + position: relative; + box-sizing: border-box; + padding: 17px; + font-size: 14px; + margin: 0 10px; + color: $argo-color-gray-7; + width: $WIDGET_WIDTH; + height: max-content; + flex-shrink: 0; + margin-bottom: 1.5em; + border-radius: 5px; + background-color: white; + box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.05); + border: 1px solid $argo-color-gray-4; + z-index: 0; + + &:hover, + &--selected { + border-color: $argo-running-color; + } + + &__pods { + margin-bottom: 1em; + } + + &--dark { + color: $dull-shine; + border-color: $silver-lining; + box-shadow: 1px 2px 3px 1px $space; + background: none; + } + + &__refresh { + &:hover { + color: $argo-running-color; + } + } + + &__body { + margin-bottom: 1em; + padding-bottom: 0.75em; + border-bottom: 1px solid $argo-color-gray-4; + &--dark { + border-bottom: 1px solid $silver-lining; + } + } + + header { + color: $argo-color-gray-8; + display: flex; + align-items: center; + font-weight: 600; + font-size: 20px; + margin-bottom: 1em; + } + + &--dark header { + color: $shine; + border-bottom: 1px solid $silver-lining; + } + &__actions { + position: relative; + display: flex; + align-items: center; + margin-top: 1.5em; + z-index: 10 !important; + } + } +} diff --git a/ui/src/app/components/rollouts-home/rollouts-home.tsx b/ui/src/app/components/rollouts-home/rollouts-home.tsx new file mode 100644 index 0000000000..bd70caa2d6 --- /dev/null +++ b/ui/src/app/components/rollouts-home/rollouts-home.tsx @@ -0,0 +1,188 @@ +import * as React from 'react'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCircleNotch} from '@fortawesome/free-solid-svg-icons'; + +import {NamespaceContext} from '../../shared/context/api'; +import {useWatchRollouts} from '../../shared/services/rollout'; +import {RolloutsToolbar, defaultDisplayMode, Filters} from '../rollouts-toolbar/rollouts-toolbar'; +import {RolloutsTable} from '../rollouts-table/rollouts-table'; +import {RolloutsGrid} from '../rollouts-grid/rollouts-grid'; +import './rollouts-home.scss'; + +export const RolloutsHome = () => { + const rolloutsList = useWatchRollouts(); + const rollouts = rolloutsList.items; + const loading = rolloutsList.loading; + const namespaceCtx = React.useContext(NamespaceContext); + + const [filters, setFilters] = React.useState({ + showRequiresAttention: false, + showFavorites: false, + name: '', + displayMode: defaultDisplayMode, + status: { + progressing: false, + degraded: false, + paused: false, + healthy: false, + }, + }); + + const handleFilterChange = (newFilters: Filters) => { + setFilters(newFilters); + }; + + const [favorites, setFavorites] = React.useState(() => { + const favoritesStr = localStorage.getItem('rolloutsFavorites'); + return favoritesStr ? JSON.parse(favoritesStr) : {}; + }); + + const handleFavoriteChange = (rolloutName: string, isFavorite: boolean) => { + const newFavorites = {...favorites}; + if (isFavorite) { + newFavorites[rolloutName] = true; + } else { + delete newFavorites[rolloutName]; + } + setFavorites(newFavorites); + localStorage.setItem('rolloutsFavorites', JSON.stringify(newFavorites)); + }; + + const filteredRollouts = React.useMemo(() => { + return rollouts.filter((r) => { + // If no filters are set, show all rollouts + if (filters.name === '' && !filters.showFavorites && !filters.showRequiresAttention && !Object.values(filters.status).some((value) => value === true)) { + return true; + } + + const statusFiltersSet = Object.values(filters.status).some((value) => value === true); + const nameFilterSet = filters.name !== ''; + + let favoritesMatches = false; + let requiresAttentionMatches = false; + let statusMatches = false; + let nameMatches = false; + + if (filters.showFavorites && favorites[r.objectMeta.name]) { + favoritesMatches = true; + } + if (filters.showRequiresAttention && (r.status === 'Unknown' || r.status === 'Degraded' || (r.status === 'Paused' && r.message !== 'CanaryPauseStep'))) { + requiresAttentionMatches = true; + } + if (statusFiltersSet && filters.status[r.status]) { + statusMatches = true; + } + + for (let term of filters.name.split(',').map((t) => t.trim())) { + if (term === '') continue; // Skip empty terms + + if (term.includes(':')) { + // Filter by label + const [key, value] = term.split(':'); + if (value.startsWith('"') && value.endsWith('"')) { + const exactValue = value.substring(1, value.length - 1); + if (r.objectMeta.labels && r.objectMeta.labels[key] && r.objectMeta.labels[key] === exactValue) { + nameMatches = true; + break; + } + } else if (r.objectMeta.labels && r.objectMeta.labels[key] && r.objectMeta.labels[key].includes(value)) { + nameMatches = true; + break; + } + } else { + // Filter by name + const isNegated = term.startsWith('!'); + term = term.replace(/^!/, ''); + + const isExact = term.startsWith('"') && term.endsWith('"'); + term = term.replace(/"/g, ''); + + if (isExact) { + if (isNegated) { + if (r.objectMeta.name !== term) { + nameMatches = true; + continue; + } + } else { + if (r.objectMeta.name === term) { + nameMatches = true; + break; + } + } + } else { + if (isNegated) { + if (!r.objectMeta.name.includes(term)) { + nameMatches = true; + break; + } + } else { + if (r.objectMeta.name.includes(term)) { + nameMatches = true; + break; + } + } + } + } + } + + return ( + (!nameFilterSet || nameMatches) && + (!filters.showFavorites || favoritesMatches) && + (!filters.showRequiresAttention || requiresAttentionMatches) && + (!statusFiltersSet || statusMatches) + ); + }); + }, [rollouts, filters, favorites]); + + return ( +
+ +
+ {loading ? ( +
+ + Loading... +
+ ) : (rollouts || []).length > 0 ? ( + + {filters.displayMode === 'table' && } + {filters.displayMode !== 'table' && } + + ) : ( + + )} +
+
+ ); +}; + +const EmptyMessage = (props: {namespace: string}) => { + const CodeLine = (props: {children: string}) => { + return ( +
 navigator.clipboard.writeText(props.children)}
+            onKeyDown={() => navigator.clipboard.writeText(props.children)}
+            >{props.children}
); + }; + return ( +
+

No Rollouts to display!

+
+
Make sure you are running the API server in the correct namespace. Your current namespace is:
+
+ {props.namespace} +
+
+
+ To create a new Rollout and Service, run + kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml + kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml + or follow the{' '} + + Getting Started guide + + . +
+
+ ); +}; diff --git a/ui/src/app/components/rollouts-list/rollouts-list.tsx b/ui/src/app/components/rollouts-list/rollouts-list.tsx deleted file mode 100644 index e8c9a4dc5f..0000000000 --- a/ui/src/app/components/rollouts-list/rollouts-list.tsx +++ /dev/null @@ -1,258 +0,0 @@ -import * as React from 'react'; -import {Key, KeybindingContext, useNav} from 'react-keyhooks'; -import {Link, useHistory} from 'react-router-dom'; -import {RolloutInfo} from '../../../models/rollout/rollout'; -import {NamespaceContext} from '../../shared/context/api'; -import {useWatchRollout, useWatchRollouts} from '../../shared/services/rollout'; -import {useClickOutside} from '../../shared/utils/utils'; -import {ParsePodStatus, PodStatus, ReplicaSets} from '../pods/pods'; -import {RolloutAction, RolloutActionButton} from '../rollout-actions/rollout-actions'; -import {RolloutStatus, StatusIcon} from '../status-icon/status-icon'; -import './rollouts-list.scss'; -import {AutoComplete, Tooltip} from 'antd'; -import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCircleNotch, faRedoAlt} from '@fortawesome/free-solid-svg-icons'; -import {InfoItemKind, InfoItemRow} from '../info-item/info-item'; - -const useRolloutNames = (rollouts: RolloutInfo[]) => { - const parseNames = (rl: RolloutInfo[]) => - (rl || []).map((r) => { - const name = r.objectMeta?.name || ''; - return { - label: name, - value: name, - }; - }); - - const [rolloutNames, setRolloutNames] = React.useState(parseNames(rollouts)); - React.useEffect(() => { - setRolloutNames(parseNames(rollouts)); - }, [rollouts]); - - return rolloutNames; -}; - -export const RolloutsList = () => { - const rolloutsList = useWatchRollouts(); - const rollouts = rolloutsList.items; - const loading = rolloutsList.loading; - const [filteredRollouts, setFilteredRollouts] = React.useState(rollouts); - const [pos, nav, reset] = useNav(filteredRollouts.length); - const [searchString, setSearchString] = React.useState(''); - const searchParam = new URLSearchParams(window.location.search).get('q'); - React.useEffect(() => { - if (searchParam && searchParam != searchString) { - setSearchString(searchParam); - } - }, []); - - const searchRef = React.useRef(null); - - React.useEffect(() => { - if (searchRef.current) { - // or, if Input component in your ref, then use input property like: - // searchRef.current.input.focus(); - searchRef.current.focus(); - } - }, [searchRef]); - - const {useKeybinding} = React.useContext(KeybindingContext); - - useKeybinding(Key.RIGHT, () => nav(1)); - useKeybinding(Key.LEFT, () => nav(-1)); - useKeybinding(Key.ESCAPE, () => { - reset(); - if (searchString && searchString !== '') { - setSearchString(''); - return true; - } else { - return false; - } - }); - - const rolloutNames = useRolloutNames(rollouts); - const history = useHistory(); - - useKeybinding(Key.SLASH, () => { - if (!searchString) { - if (searchRef) { - searchRef.current.focus(); - } - return true; - } - return false; - }); - - useKeybinding(Key.ENTER, () => { - if (pos > -1) { - history.push(`/rollout/${filteredRollouts[pos].objectMeta?.name}`); - return true; - } - return false; - }); - - React.useEffect(() => { - const filtered = (rollouts || []).filter((r) => (r.objectMeta?.name || '').includes(searchString)); - if ((filtered || []).length > 0) { - setFilteredRollouts(filtered); - } - if (searchString) { - history.replace(`/${namespaceCtx.namespace}?q=${searchString}`); - } else { - history.replace(`/${namespaceCtx.namespace}`); - } - }, [searchString, rollouts]); - - const namespaceCtx = React.useContext(NamespaceContext); - - return ( -
- {loading ? ( -
- - Loading... -
- ) : (rollouts || []).length > 0 ? ( - -
-
- history.push(`/rollout/${namespaceCtx.namespace}/${val}`)} - options={rolloutNames} - onChange={(val) => setSearchString(val)} - value={searchString} - ref={searchRef} - /> -
-
-
- {(filteredRollouts.sort((a, b) => (a.objectMeta.name < b.objectMeta.name ? -1 : 1)) || []).map((rollout, i) => ( - reset()} /> - ))} -
-
- ) : ( - - )} -
- ); -}; - -const EmptyMessage = (props: {namespace: string}) => { - const CodeLine = (props: {children: string}) => { - return
 navigator.clipboard.writeText(props.children)}>{props.children}
; - }; - return ( -
-

No Rollouts to display!

-
-
Make sure you are running the API server in the correct namespace. Your current namespace is:
-
- {props.namespace} -
-
-
- To create a new Rollout and Service, run - kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/rollout.yaml - kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-rollouts/master/docs/getting-started/basic/service.yaml - or follow the{' '} - - Getting Started guide - - . -
-
- ); -}; - -export const isInProgress = (rollout: RolloutInfo): boolean => { - for (const rs of rollout.replicaSets || []) { - for (const p of rs.pods || []) { - const status = ParsePodStatus(p.status); - if (status === PodStatus.Pending) { - return true; - } - } - } - return false; -}; - -export const RolloutWidget = (props: {rollout: RolloutInfo; deselect: () => void; selected?: boolean}) => { - const [watching, subscribe] = React.useState(false); - let rollout = props.rollout; - useWatchRollout(props.rollout?.objectMeta?.name, watching, null, (r: RolloutInfo) => (rollout = r)); - const ref = React.useRef(null); - useClickOutside(ref, props.deselect); - - React.useEffect(() => { - if (watching) { - const to = setTimeout(() => { - if (!isInProgress(rollout)) { - subscribe(false); - } - }, 5000); - return () => clearTimeout(to); - } - }, [watching, rollout]); - - return ( - - { - subscribe(true); - setTimeout(() => { - subscribe(false); - }, 1000); - }} - /> -
- - {(rollout.strategy || '').toLocaleLowerCase() === 'canary' && } -
- {(rollout.replicaSets || []).length < 1 && } - -
- subscribe(true)} indicateLoading /> - subscribe(true)} indicateLoading /> -
- - ); -}; - -const WidgetHeader = (props: {rollout: RolloutInfo; refresh: () => void}) => { - const {rollout} = props; - const [loading, setLoading] = React.useState(false); - React.useEffect(() => { - setTimeout(() => setLoading(false), 500); - }, [loading]); - return ( -
- {rollout.objectMeta?.name} - - - { - props.refresh(); - setLoading(true); - e.preventDefault(); - }} - /> - - - -
- ); -}; diff --git a/ui/src/app/components/rollouts-table/rollouts-table.scss b/ui/src/app/components/rollouts-table/rollouts-table.scss new file mode 100644 index 0000000000..bd93df799a --- /dev/null +++ b/ui/src/app/components/rollouts-table/rollouts-table.scss @@ -0,0 +1,18 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +.rollouts-table { + width: 100%; +} + +.rollouts-table__row__selected { + background-color: $argo-color-gray-2; + } + +.rollouts-table_widget_actions { + display: flex; + flex-wrap: wrap; +} + +.rollouts-table_widget_actions_button { + margin-top: 10px; +} diff --git a/ui/src/app/components/rollouts-table/rollouts-table.tsx b/ui/src/app/components/rollouts-table/rollouts-table.tsx new file mode 100644 index 0000000000..38124f1e60 --- /dev/null +++ b/ui/src/app/components/rollouts-table/rollouts-table.tsx @@ -0,0 +1,281 @@ +import * as React from 'react'; +import {useHistory} from 'react-router-dom'; +import {Tooltip, Table, TablePaginationConfig} from 'antd'; +import {Key, KeybindingContext} from 'react-keyhooks'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {IconDefinition} from '@fortawesome/fontawesome-svg-core'; +import {faStar as faStarSolid} from '@fortawesome/free-solid-svg-icons'; +import {faStar as faStarOutline} from '@fortawesome/free-regular-svg-icons/faStar'; + +import {RolloutAction, RolloutActionButton} from '../rollout-actions/rollout-actions'; +import {RolloutStatus, StatusIcon} from '../status-icon/status-icon'; +import {ReplicaSetStatus, ReplicaSetStatusIcon} from '../status-icon/status-icon'; +import {RolloutInfo} from '../../../models/rollout/rollout'; +import {InfoItemKind, InfoItemRow} from '../info-item/info-item'; +import { AlignType } from 'rc-table/lib/interface'; +import './rollouts-table.scss'; + +export const RolloutsTable = ({ + rollouts, + onFavoriteChange, + favorites, +}: { + rollouts: RolloutInfo[]; + onFavoriteChange: (rolloutName: string, isFavorite: boolean) => void; + favorites: {[key: string]: boolean}; +}) => { + const tableRef = React.useRef(null); + + const handleFavoriteChange = (rolloutName: string, isFavorite: boolean) => { + onFavoriteChange(rolloutName, isFavorite); + }; + const data = rollouts + .map((rollout) => { + return { + ...rollout, + key: rollout.objectMeta?.uid, + favorite: favorites[rollout.objectMeta?.name] || false, + }; + }) + .sort((a, b) => { + if (a.favorite && !b.favorite) { + return -1; + } else if (!a.favorite && b.favorite) { + return 1; + } else { + return 0; + } + }); + + const columns = [ + { + dataIndex: 'favorite', + key: 'favorite', + render: (favorite: boolean, rollout: RolloutInfo) => { + return favorite ? ( + + ) : ( + + ); + }, + width: 50, + }, + { + title: 'Name', + dataIndex: 'objectMeta', + key: 'name', + width: 300, + render: (objectMeta: {name?: string}) => objectMeta.name, + sorter: (a: any, b: any) => a.objectMeta.name.localeCompare(b.objectMeta.name), + }, + { + title: 'Strategy', + dataIndex: 'strategy', + key: 'strategy', + align: 'left' as AlignType, + sorter: (a: any, b: any) => a.strategy.localeCompare(b.strategy), + render: (strategy: string) => { + return ( + + ); + }, + }, + { + title: 'Step', + dataIndex: 'step', + key: 'step', + render: (text: any, record: {step?: string}) => record.step || '-', + sorter: (a: any, b: any) => { + if (a.step === undefined) { + return -1; + } + if (b.step === undefined) { + return 1; + } else return a.step.localeCompare(b.step); + }, + }, + { + title: 'Weight', + dataIndex: 'setWeight', + key: 'weight', + render: (text: any, record: {setWeight?: number}) => record.setWeight || '-', + sorter: (a: any, b: any) => a.setWeight - b.setWeight, + }, + { + title: 'ReplicaSets', + key: 'replicasets', + width: 200, + sorter: (a: RolloutInfo, b: RolloutInfo) => a.desired - b.desired, + render: (rollout: RolloutInfo) => { + const stableReplicaSets = rollout.replicaSets?.filter((rs) => rs.stable); + const canaryReplicaSets = rollout.replicaSets?.filter((rs) => rs.canary); + const previewReplicaSets = rollout.replicaSets?.filter((rs) => rs.preview); + return ( +
+ {stableReplicaSets?.length > 0 && ( +
+ Stable:{' '} + {stableReplicaSets.map((rs) => ( + + + Rev {rs.revision} ({rs.available}/{rs.replicas}) + + + ))} +
+ )} + {canaryReplicaSets?.length > 0 && ( +
+ Canary:{' '} + {canaryReplicaSets.map((rs) => ( + + + Rev {rs.revision} ({rs.available}/{rs.replicas}) + + + ))} +
+ )} + {previewReplicaSets?.length > 0 && ( +
+ Preview:{' '} + {previewReplicaSets.map((rs) => ( + + + Rev {rs.revision} ({rs.available}/{rs.replicas}) + + + ))} +
+ )} +
+ ); + }, + }, + { + title: 'Status', + sorter: (a: any, b: any) => a.status.localeCompare(b.status), + render: (record: {message?: string; status?: string}) => { + return ( +
+ + {record.status} + +
+ ); + }, + }, + { + title: 'Actions', + dataIndex: 'actions', + key: 'actions', + render: (text: any, rollout: {objectMeta?: {name?: string}}) => { + return ( +
+
+ {}} indicateLoading /> +
+
+ {}} indicateLoading /> +
+
+ {}} indicateLoading /> +
+
+ {}} indicateLoading /> +
+
+ ); + }, + }, + ]; + + const history = useHistory(); + const [selectedRow, setSelectedRow] = React.useState(undefined); + const {useKeybinding} = React.useContext(KeybindingContext); + useKeybinding(Key.UP, () => { + if (selectedRow === undefined) { + setSelectedRow(itemsPerPage - 1); + return true; + } else if (selectedRow > 0) { + setSelectedRow(selectedRow - 1); + return true; + } + return false; + }); + useKeybinding(Key.DOWN, () => { + if (selectedRow === undefined) { + setSelectedRow(0); + return true; + } else if (selectedRow < itemsPerPage - 1) { + setSelectedRow(selectedRow + 1); + return true; + } + return false; + }); + useKeybinding(Key.ENTER, () => { + if (selectedRow !== undefined) { + history.push(`/rollout/${data[selectedRow].objectMeta?.name}`); + return true; + } + return false; + }); + useKeybinding(Key.ESCAPE, () => { + setSelectedRow(undefined); + return false; // let the toolbar handle clearing the search bar + }); + + const [itemsPerPage, setItemsPerPage] = React.useState(10); + const handlePaginationChange = (pagination: TablePaginationConfig) => { + setItemsPerPage(pagination.pageSize); + }; + + return ( + ({ + className: selectedRow === index ? 'rollouts-table__row__selected' : '', + onClick: () => { + history.push(`/rollout/${record.objectMeta?.name}`); + }, + style: {cursor: 'pointer'}, + })} + pagination={ + { + pageSize: itemsPerPage, + onChange: handlePaginationChange, + } as TablePaginationConfig + } + ref={tableRef} + rowClassName='rollouts-table__row' + rowKey={(_, index) => index} + style={{width: '100%', padding: '20px 20px'}} + /> + ); +}; diff --git a/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.scss b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.scss new file mode 100644 index 0000000000..bc234b43c3 --- /dev/null +++ b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.scss @@ -0,0 +1,55 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +.rollouts-toolbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 10px; + border-bottom: 1px solid #fff; + background-color: #fff; +} + +.rollouts-toolbar_requires-attention-checkbox { + flex: 2; + padding-left: 20px; +} + +.rollouts-toolbar_search-container { + min-width: 300px; + padding-left: 20px; + padding-right: 20px; +} + +.rollouts-toolbar_display-modes { + margin-left: auto; +} + +.rollouts-toolbar_mode-button { + color: #989898; + border: none; + padding: 5px; + cursor: pointer; + transition: background-color 0.3s ease; + font-size: 24px; // increase the font-size to make the icon larger +} + +.rollouts-toolbar_mode-button:hover { + background-color: #b2b2b2; +} + +.rollouts-toolbar_mode-button.active { + color: #000000; +} + +.rollouts-toolbar_status-button { + cursor: pointer; + transition: background-color 0.3s ease; +} + +.rollouts-toolbar_status-filters { + display: flex; +} + +.rollouts-toolbar_status-buttons { + margin-left: 20px; +} \ No newline at end of file diff --git a/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx new file mode 100644 index 0000000000..487097c5d0 --- /dev/null +++ b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx @@ -0,0 +1,235 @@ +import * as React from 'react'; + +import {Key, KeybindingContext} from 'react-keyhooks'; +import {useHistory, useLocation} from 'react-router-dom'; + +import {AutoComplete} from 'antd'; +import {Tooltip} from 'antd'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faTableList, faTableCellsLarge} from '@fortawesome/free-solid-svg-icons'; + +import {RolloutInfo} from '../../../models/rollout/rollout'; +import {StatusCount} from '../status-count/status-count'; +import './rollouts-toolbar.scss'; + +export type Filters = { + showRequiresAttention: boolean; + showFavorites?: boolean; + name: string; + displayMode?: string; + status: { + [key: string]: boolean; + }; +}; + +interface StatusCount { + [key: string]: number; +} + +export const defaultDisplayMode = 'grid'; + +export const RolloutsToolbar = ({ + rollouts, + favorites, + onFilterChange, +}: { + rollouts: RolloutInfo[]; + favorites: {[key: string]: boolean}; + onFilterChange: (filters: Filters) => void; +}) => { + const history = useHistory(); + const location = useLocation(); + const searchParams = new URLSearchParams(window.location.search); + const [filters, setFilters] = React.useState({ + showRequiresAttention: searchParams.get('showRequiresAttention') === 'true', + showFavorites: searchParams.get('showFavorites') === 'true', + name: searchParams.get('name') || '', + displayMode: searchParams.get('displayMode') || defaultDisplayMode, + status: { + Progressing: searchParams.get('Progressing') === 'true', + Degraded: searchParams.get('Degraded') === 'true', + Paused: searchParams.get('Paused') === 'true', + Healthy: searchParams.get('Healthy') === 'true', + }, + }); + // Ensure that the filters are updated when the URL changes + onFilterChange(filters); + + const handleFilterChange = (newFilters: Filters) => { + setFilters(newFilters); + onFilterChange(newFilters); + }; + + const handleNameFilterChange = (value: string) => { + const newFilters = { + ...filters, + name: value, + }; + const searchParams = new URLSearchParams(location.search); + if (value) { + searchParams.set('name', value); + } else { + searchParams.delete('name'); + } + history.push({search: searchParams.toString()}); + handleFilterChange(newFilters); + }; + + const handleShowRequiresAttentionChange = (event: React.MouseEvent) => { + const newFilters = { + ...filters, + showRequiresAttention: !filters.showRequiresAttention, + }; + const searchParams = new URLSearchParams(location.search); + if (!filters.showRequiresAttention) { + searchParams.set('showRequiresAttention', 'true'); + } else { + searchParams.delete('showRequiresAttention'); + } + history.push({search: searchParams.toString()}); + handleFilterChange(newFilters); + }; + + const handleShowFavoritesChange = (event: React.MouseEvent) => { + const newFilters = { + ...filters, + showFavorites: !filters.showFavorites, + }; + const searchParams = new URLSearchParams(location.search); + if (!filters.showFavorites) { + searchParams.set('showFavorites', 'true'); + } else { + searchParams.delete('showFavorites'); + } + history.push({search: searchParams.toString()}); + handleFilterChange(newFilters); + }; + + const handleDisplayModeChange = (event: React.MouseEvent) => { + const newFilters = { + ...filters, + displayMode: event.currentTarget.id, + }; + const searchParams = new URLSearchParams(location.search); + if (event.currentTarget.id !== defaultDisplayMode) { + searchParams.set('displayMode', event.currentTarget.id); + } else { + searchParams.delete('displayMode'); + searchParams.delete('displaymode'); + } + history.push({search: searchParams.toString()}); + handleFilterChange(newFilters); + }; + + const handleStatusFilterChange = (event: React.MouseEvent) => { + const searchParams = new URLSearchParams(location.search); + + if (!filters.status[event.currentTarget.id]) { + searchParams.set(event.currentTarget.id, 'true'); + } else { + searchParams.delete(event.currentTarget.id); + } + history.push({search: searchParams.toString()}); + + const newFilters = { + ...filters, + status: { + ...filters.status, + [event.currentTarget.id]: !filters.status[event.currentTarget.id], + }, + }; + handleFilterChange(newFilters); + }; + + const statusCounts: StatusCount = React.useMemo(() => { + const counts: StatusCount = { + Progressing: 0, + Degraded: 0, + Paused: 0, + Healthy: 0, + }; + rollouts.forEach((r) => { + counts[r.status]++; + }); + + return counts; + }, [rollouts]); + + const needsAttentionCount: number = React.useMemo(() => { + const pausedRollouts = rollouts.filter((r) => r.status === 'Paused' && r.message !== 'CanaryPauseStep'); + const degradedRollouts = rollouts.filter((r) => r.status === 'Degraded'); + const unknownRollouts = rollouts.filter((r) => r.status === 'Unknown'); + return pausedRollouts.length + degradedRollouts.length + unknownRollouts.length; + }, [rollouts, statusCounts]); + + const favoriteCount: number = React.useMemo(() => { + return rollouts.filter((r) => favorites[r.objectMeta.name]).length; + }, [rollouts, favorites]); + + const searchRef = React.useRef(null); + const {useKeybinding} = React.useContext(KeybindingContext); + useKeybinding(Key.SLASH, () => { + if (searchRef) { + searchRef.current.focus(); + return true; + } + return false; + }); + + return ( +
+
+ + + + + + +
+ {Object.keys(statusCounts).map((status: string) => { + return ( + + + + ); + })} +
+
+
+ + + + + + +
+ + { + event.stopPropagation(); // Prevents shift+H from opening the help menu + }} + ref={searchRef} + /> + +
+ ); +}; diff --git a/ui/src/app/components/status-count/status-count.scss b/ui/src/app/components/status-count/status-count.scss new file mode 100644 index 0000000000..9dec534d27 --- /dev/null +++ b/ui/src/app/components/status-count/status-count.scss @@ -0,0 +1,31 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +.status-count { + display: flex; + align-items: center; + border: 1px solid $argo-color-gray-4; + border-radius: 5px; + padding: 2px; + margin: 1px; + + &__icon { + font-size: 15px; + color: $argo-color-gray-8; + margin: 5px; + + text-align: center; + flex: 0 0 auto; + } + + &__count { + font-size: 15px; + font-weight: 500; + color: $argo-color-gray-8; + margin-right: 5px; + text-align: right; + flex: 1; + } +} +.status-count.active { + background-color: $argo-color-teal-2; +} diff --git a/ui/src/app/components/status-count/status-count.tsx b/ui/src/app/components/status-count/status-count.tsx new file mode 100644 index 0000000000..83cea4f5ac --- /dev/null +++ b/ui/src/app/components/status-count/status-count.tsx @@ -0,0 +1,16 @@ +import * as React from 'react'; + +import {RolloutStatus, StatusIcon} from '../status-icon/status-icon'; + +import './status-count.scss'; + +export const StatusCount = ({status, count, defaultIcon = 'fa-exclamation-circle', active = false}: {status: String; count: Number; defaultIcon?: String; active?: boolean}) => { + return ( +
+
+ +
+
{count}
+
+ ); +}; diff --git a/ui/src/app/components/status-icon/status-icon.tsx b/ui/src/app/components/status-icon/status-icon.tsx index 257dc50567..5da619a357 100644 --- a/ui/src/app/components/status-icon/status-icon.tsx +++ b/ui/src/app/components/status-icon/status-icon.tsx @@ -9,9 +9,11 @@ export enum RolloutStatus { Healthy = 'Healthy', } -export const StatusIcon = (props: {status: RolloutStatus}): JSX.Element => { +export const StatusIcon = (props: {status: RolloutStatus; showTooltip?: boolean; defaultIcon?: String}): JSX.Element => { let icon, className; let spin = false; + const showTooltip = props.showTooltip ?? true; + const defaultIcon = props.defaultIcon ?? 'fa-question-circle'; const {status} = props; switch (status) { case 'Progressing': { @@ -36,14 +38,19 @@ export const StatusIcon = (props: {status: RolloutStatus}): JSX.Element => { break; } default: { - icon = 'fa-question-circle'; + icon = defaultIcon; className = 'unknown'; } } return ( - - - + + {showTooltip && ( + + + + )} + {!showTooltip && } + ); }; @@ -55,9 +62,11 @@ export enum ReplicaSetStatus { Progressing = 'Progressing', } -export const ReplicaSetStatusIcon = (props: {status: ReplicaSetStatus}) => { +export const ReplicaSetStatusIcon = (props: {status: ReplicaSetStatus; showTooltip?: boolean; defaultIcon?: String}) => { let icon, className; let spin = false; + const showTooltip = props.showTooltip ?? true; + const defaultIcon = props.defaultIcon ?? 'fa-question-circle'; const {status} = props; switch (status) { case 'Healthy': @@ -83,13 +92,18 @@ export const ReplicaSetStatusIcon = (props: {status: ReplicaSetStatus}) => { break; } default: { - icon = 'fa-question-circle'; + icon = defaultIcon; className = 'unknown'; } } return ( - - - + + {showTooltip && ( + + + + )} + {!showTooltip && } + ); }; diff --git a/ui/src/app/index.tsx b/ui/src/app/index.tsx index 3bc5d04223..56521a1185 100644 --- a/ui/src/app/index.tsx +++ b/ui/src/app/index.tsx @@ -6,5 +6,5 @@ ReactDOM.render( , - document.getElementById('root') + document.getElementById('root'), ); diff --git a/ui/yarn.lock b/ui/yarn.lock index 29f5446d37..af1a13d826 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1326,6 +1326,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz#88da2b70d6ca18aaa6ed3687832e11f39e80624b" integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ== +"@fortawesome/fontawesome-common-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" + integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== + "@fortawesome/fontawesome-free@^5.8.1": version "5.15.4" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" @@ -1338,6 +1343,13 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.4.0" +"@fortawesome/free-regular-svg-icons@^6.4.0": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz#aee79ed76ce5dd04931352f9d83700761b8b1b25" + integrity sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.2" + "@fortawesome/free-solid-svg-icons@^6.4.0": version "6.4.0" resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz#48c0e790847fa56299e2f26b82b39663b8ad7119" From 839d727bf3045fe6c5c97396a16b0675aa1bf7c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 08:48:25 -0600 Subject: [PATCH 110/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.8 to 1.25.10 (#3204) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.25.8 to 1.25.10. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.8...config/v1.25.10) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 24 ++++++++++++------------ go.sum | 48 ++++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 12470e0ffd..a7d32c8de7 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.23.2 - github.com/aws/aws-sdk-go-v2/config v1.25.8 + github.com/aws/aws-sdk-go-v2 v1.23.4 + github.com/aws/aws-sdk-go-v2/config v1.25.10 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 github.com/blang/semver v3.5.1+incompatible @@ -84,18 +84,18 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.6 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.8 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.25.6 // indirect - github.com/aws/smithy-go v1.17.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.1 // indirect + github.com/aws/smithy-go v1.18.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index e3068426e4..a1c1578040 100644 --- a/go.sum +++ b/go.sum @@ -107,41 +107,41 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.23.2 h1:UoTll1Y5b88x8h53OlsJGgOHwpggdMr7UVnLjMb3XYg= -github.com/aws/aws-sdk-go-v2 v1.23.2/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA= -github.com/aws/aws-sdk-go-v2/config v1.25.8 h1:CHr7PIzyfevjNiqL9rU6xoqHZKCO2ldY6LmvRDfpRuI= -github.com/aws/aws-sdk-go-v2/config v1.25.8/go.mod h1:zefIy117FDPOVU0xSOFG8mx9kJunuVopzI639tjYXc0= -github.com/aws/aws-sdk-go-v2/credentials v1.16.6 h1:TimIpn1p4v44i0sJMKsnpby1P9sP1ByKLsdm7bvOmwM= -github.com/aws/aws-sdk-go-v2/credentials v1.16.6/go.mod h1:+CLPlYf9FQLeXD8etOYiZxpLQqc3GL4EikxjkFFp1KA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6 h1:pPs23/JLSOlwnmSRNkdbt3upmBeF6QL/3MHEb6KzTyo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.6/go.mod h1:jsoDHV44SxWv00wlbx0yA5M7n5rmE5rGk+OGA0suXSw= +github.com/aws/aws-sdk-go-v2 v1.23.4 h1:2P20ZjH0ouSAu/6yZep8oCmTReathLuEu6dwoqEgjts= +github.com/aws/aws-sdk-go-v2 v1.23.4/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= +github.com/aws/aws-sdk-go-v2/config v1.25.10 h1:qw/e8emDtNufTkrAU86DlQ18DruMyyM7ttW6Lgwp4v0= +github.com/aws/aws-sdk-go-v2/config v1.25.10/go.mod h1:203YiAtb6XyoGxXMPsUVwEcuxCiTQY/r8P27IDjfvMc= +github.com/aws/aws-sdk-go-v2/credentials v1.16.8 h1:phw9nRLy/77bPk6Mfu2SHCOnHwfVB7WWrOa5rZIY2Fc= +github.com/aws/aws-sdk-go-v2/credentials v1.16.8/go.mod h1:MrS4SOin6adbO6wgWhdifyPiq+TX7fPPwyA/ZLC1F5M= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 h1:tQZLSPC2Zj2CqZHonLmWEvCsbpMX5tQvaYJWHadcPek= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8/go.mod h1:5+YpvTHDFffykWr5qAGjqwoh8oVYZOddL3sSrEN7lws= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5 h1:16Z1XuMUv63fcyW5bIUno6AFcX4drsrE0gof+xue6g4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.5/go.mod h1:pRvFacV2qbRKy34ZFptHZW4wpauJA445bqFbvA6ikSo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7 h1:eMqD7ku6WGdmcWWXPYun9m6yk6feSULLhJlAtN6rYG4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7/go.mod h1:0oBIfcDV6LScxEW0VgOqxT3e4aqKRp+SYhB9wAd5E3Q= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5 h1:RxpMuBgzP3Dj1n5CZY6droLFcsn5gc7QsrIcaGQoeCs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.5/go.mod h1:dO8Js7ym4Jzg/wcjTgCRVln/jFn3nI82XNhsG2lWbDI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7 h1:+XYhWhgWs5F3Zx8oa49CXzNvfXrItaDjZB/M172fcHQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7/go.mod h1:L6tcSRyCGxcKfDWUrmv2jv8G1cLDU7d0FUpEFpG9bVE= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 h1:8egOYLCQRxb9Mrs2KM572Kf5xEOFTTkJV36utKlAgl0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5/go.mod h1:OwiuGlzCxOeDWT+M1b763ghxnioWGUV7GtMFSXjRh9s= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 h1:l+BorQnGATPRfkoRiNkDbNRMuVbMLPUv9YqwbyPpEns= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2/go.mod h1:VdkWjF6DhqvGqYAUpW+FElI333BDJg+s6znq5H7FuLA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1 h1:rpkF4n0CyFcrJUG/rNNohoTmhtWlFTRI4BsZOh9PvLs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5 h1:F+XafeiK7Uf4YwTZfe/JLt+3cB6je9sI7l0TY4f2CkY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.5/go.mod h1:NlZuvlkyu6l/F3+qIBsGGtYLL2Z71tCf5NFoNAaG1NY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 h1:dU+ZyhvqMB/T/TxjGagHMCdyUiqaThRIaMu3YvKiSQI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7/go.mod h1:SGORuNqoXyWfTvTp/gBGJfv8jRvW/+nha0XhnIXVI+o= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.5 h1:kuK22ZsITfzaZEkxEl5H/lhy2k3G4clBtcQBI93RbIc= -github.com/aws/aws-sdk-go-v2/service/sso v1.17.5/go.mod h1:/tLqstwPfJLHYGBB5/c8P1ITI82pcGs7cJQuXku2pOg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3 h1:l5d5nrTFMhiUWNoLnV7QNI4m42/3WVSXqSyqVy+elGk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.3/go.mod h1:30gKZp2pHQJq3yTmVy+hJKDFynSoYzVqYaxe4yPi+xI= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.6 h1:39dJNBt35p8dFSnQdoy+QbDaPenTxFqqDQFOb1GDYpE= -github.com/aws/aws-sdk-go-v2/service/sts v1.25.6/go.mod h1:6DKEi+8OnUrqEEh6OCam16AYQHWAOyNgRiUGnHoh7Cg= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.1 h1:V40g2daNO3l1J94JYwqfkyvQMYXi5I25fs3fNQW8iDs= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.1/go.mod h1:0ZWQJP/mBOUxkCvZKybZNz1XmdUKSBxoF0dzgfxtvDs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1 h1:uQrj7SpUNC3r55vc1CDh3qV9wJC66lz546xM9dhSo5s= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1/go.mod h1:oyaTk5xEAOuPXX1kCD7HmIeuLqdj3Bk5yGkqGXtGi14= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.1 h1:K33V7L0XDdb23FMOZySr8bon1jou5SHn1fiv7NJ1SUg= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.1/go.mod h1:YtXUl/sfnS06VksYhr855hTQf2HphfT1Xv/EwuzbPjg= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.17.0 h1:wWJD7LX6PBV6etBUwO0zElG0nWN9rUhp0WdYeHSHAaI= -github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.18.1 h1:pOdBTUfXNazOlxLrgeYalVnuTpKreACHtc62xLwIB3c= +github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From 2270a507be3c52f0cac5a17d51269bf0fb618992 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:22:28 +0000 Subject: [PATCH 111/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.25.2 to 1.26.1 (#3203) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.25.2 to 1.26.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.2...service/s3/v1.26.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a7d32c8de7..9d90f80587 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.23.4 github.com/aws/aws-sdk-go-v2/config v1.25.10 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index a1c1578040..fa991d7db9 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 h1:8egOYLCQRxb9Mrs2KM572Kf5xEOFTTkJV36utKlAgl0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5/go.mod h1:OwiuGlzCxOeDWT+M1b763ghxnioWGUV7GtMFSXjRh9s= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2 h1:l+BorQnGATPRfkoRiNkDbNRMuVbMLPUv9YqwbyPpEns= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.25.2/go.mod h1:VdkWjF6DhqvGqYAUpW+FElI333BDJg+s6znq5H7FuLA= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 h1:WKnQGnFPhqMc9VqQ/x7LX2exkX/0p/ci+zb0F+J5WWA= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1/go.mod h1:HXYFG7xDCmQAYp0pdhCnAkriQMzZzuRR4ONEyIJAbuM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 h1:dU+ZyhvqMB/T/TxjGagHMCdyUiqaThRIaMu3YvKiSQI= From 3d412ed1c95ba04d7dd25f20f2eb74b15425736c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:59:04 +0000 Subject: [PATCH 112/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.30.5 to 1.31.1 (#3201) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.30.5 to 1.31.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.31.1/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.5...service/s3/v1.31.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9d90f80587..09f996d3b4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.4 github.com/aws/aws-sdk-go-v2/config v1.25.10 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index fa991d7db9..c77c3e15a4 100644 --- a/go.sum +++ b/go.sum @@ -123,8 +123,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7 h1:+XYhWhgWs5F3Zx8oa49 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7/go.mod h1:L6tcSRyCGxcKfDWUrmv2jv8G1cLDU7d0FUpEFpG9bVE= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5 h1:8egOYLCQRxb9Mrs2KM572Kf5xEOFTTkJV36utKlAgl0= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.30.5/go.mod h1:OwiuGlzCxOeDWT+M1b763ghxnioWGUV7GtMFSXjRh9s= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1 h1:V6gp1vU04YgQQuRKv7UEsHAV+HWj+OoJ5va6E3bkT2w= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1/go.mod h1:QlnNSwXc1Ti3mRr97E049nvBpEdYd4tV0ha+StOMzAs= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 h1:WKnQGnFPhqMc9VqQ/x7LX2exkX/0p/ci+zb0F+J5WWA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1/go.mod h1:HXYFG7xDCmQAYp0pdhCnAkriQMzZzuRR4ONEyIJAbuM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= From 1600e27e6fd820ffea2830195991087952a42832 Mon Sep 17 00:00:00 2001 From: Andre Marcelo-Tanner Date: Sat, 2 Dec 2023 20:16:01 -0500 Subject: [PATCH 113/264] docs(deps): Specify minimum kustomize version (#3199) * Tests require atleast kustomize v4.5.5, install v5.2.1 if we are using a different version of kustomize Signed-off-by: Andre Marcelo-Tanner * revert version upgrade and just rely on docs Signed-off-by: Andre Marcelo-Tanner --------- Signed-off-by: Andre Marcelo-Tanner --- docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 510bac78af..8eb4a5b96f 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -8,7 +8,7 @@ Install: * [docker](https://docs.docker.com/install/#supported-platforms) * [golang](https://golang.org/) * [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) -* [kustomize](https://github.com/kubernetes-sigs/kustomize/releases) +* [kustomize](https://github.com/kubernetes-sigs/kustomize/releases) >= 4.5.5 * [k3d](https://k3d.io/) recommended Kustomize is required for unit tests (`make test` is using it), so you [must install it](https://kubectl.docs.kubernetes.io/installation/kustomize/) From 4b73347e0b8d9a55a957fea9938535ad2b82d1ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 08:32:18 -0600 Subject: [PATCH 114/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.31.1 to 1.31.2 (#3208) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.31.1 to 1.31.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.31.2/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.31.1...service/s3/v1.31.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 09f996d3b4..721308ec28 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.23.4 + github.com/aws/aws-sdk-go-v2 v1.23.5 github.com/aws/aws-sdk-go-v2/config v1.25.10 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 @@ -86,8 +86,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.8 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 // indirect diff --git a/go.sum b/go.sum index c77c3e15a4..7f0c9b615a 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.23.4 h1:2P20ZjH0ouSAu/6yZep8oCmTReathLuEu6dwoqEgjts= -github.com/aws/aws-sdk-go-v2 v1.23.4/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= +github.com/aws/aws-sdk-go-v2 v1.23.5 h1:xK6C4udTyDMd82RFvNkDQxtAd00xlzFUtX4fF2nMZyg= +github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= github.com/aws/aws-sdk-go-v2/config v1.25.10 h1:qw/e8emDtNufTkrAU86DlQ18DruMyyM7ttW6Lgwp4v0= github.com/aws/aws-sdk-go-v2/config v1.25.10/go.mod h1:203YiAtb6XyoGxXMPsUVwEcuxCiTQY/r8P27IDjfvMc= github.com/aws/aws-sdk-go-v2/credentials v1.16.8 h1:phw9nRLy/77bPk6Mfu2SHCOnHwfVB7WWrOa5rZIY2Fc= @@ -116,15 +116,15 @@ github.com/aws/aws-sdk-go-v2/credentials v1.16.8/go.mod h1:MrS4SOin6adbO6wgWhdif github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 h1:tQZLSPC2Zj2CqZHonLmWEvCsbpMX5tQvaYJWHadcPek= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8/go.mod h1:5+YpvTHDFffykWr5qAGjqwoh8oVYZOddL3sSrEN7lws= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7 h1:eMqD7ku6WGdmcWWXPYun9m6yk6feSULLhJlAtN6rYG4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.7/go.mod h1:0oBIfcDV6LScxEW0VgOqxT3e4aqKRp+SYhB9wAd5E3Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 h1:8GVZIR0y6JRIUNSYI1xAMF4HDfV8H/bOsZ/8AD/uY5Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8/go.mod h1:rwBfu0SoUkBUZndVgPZKAD9Y2JigaZtRP68unRiYToQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7 h1:+XYhWhgWs5F3Zx8oa49CXzNvfXrItaDjZB/M172fcHQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.7/go.mod h1:L6tcSRyCGxcKfDWUrmv2jv8G1cLDU7d0FUpEFpG9bVE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 h1:ZE2ds/qeBkhk3yqYvS3CDCFNvd9ir5hMjlVStLZWrvM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8/go.mod h1:/lAPPymDYL023+TS6DJmjuL42nxix2AvEvfjqOBRODk= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1 h1:V6gp1vU04YgQQuRKv7UEsHAV+HWj+OoJ5va6E3bkT2w= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.1/go.mod h1:QlnNSwXc1Ti3mRr97E049nvBpEdYd4tV0ha+StOMzAs= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 h1:HWB+RXvOQQkhEp8QCpTlgullbCiysRQlo6ulVZRBBtM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 h1:WKnQGnFPhqMc9VqQ/x7LX2exkX/0p/ci+zb0F+J5WWA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1/go.mod h1:HXYFG7xDCmQAYp0pdhCnAkriQMzZzuRR4ONEyIJAbuM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= From 7bdfca435d5cdae1d10278381c30bbe901651ba3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:09:14 +0000 Subject: [PATCH 115/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.1 to 1.26.2 (#3207) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.1 to 1.26.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.1...service/s3/v1.26.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 721308ec28..1c6f34f8de 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.23.5 github.com/aws/aws-sdk-go-v2/config v1.25.10 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 7f0c9b615a..089bb0dd55 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 h1:HWB+RXvOQQkhEp8QCpTlgullbCiysRQlo6ulVZRBBtM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1 h1:WKnQGnFPhqMc9VqQ/x7LX2exkX/0p/ci+zb0F+J5WWA= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.1/go.mod h1:HXYFG7xDCmQAYp0pdhCnAkriQMzZzuRR4ONEyIJAbuM= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 h1:g+IxAIM+48Lerr/7/ndAuiOjFXb3i2Z+Q/R2o0f7bIU= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 h1:dU+ZyhvqMB/T/TxjGagHMCdyUiqaThRIaMu3YvKiSQI= From c067a6942f4ad08a353e772c546ac064517c08a7 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 4 Dec 2023 09:32:53 -0600 Subject: [PATCH 116/264] fix: rollouts getting stuck due to bad rs informer updates (#3200) * fix: for rollouts getting stuck due to bad rs informer updates Signed-off-by: Zach Aller * fix error msg Signed-off-by: Zach Aller * change logic Signed-off-by: Zach Aller * error fmt Signed-off-by: Zach Aller * change if logic Signed-off-by: Zach Aller * add test Signed-off-by: Zach Aller * cleanup test Signed-off-by: Zach Aller * cleanup test Signed-off-by: Zach Aller * do not double call Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/replicaset.go | 20 ++++++++++++----- rollout/replicaset_test.go | 45 +++++++++++++++++++++++++++++++++++--- rollout/sync.go | 18 ++++++++++++--- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/rollout/replicaset.go b/rollout/replicaset.go index 7d9a71f62a..401e1b579d 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -35,9 +35,13 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { } patch := fmt.Sprintf(removeScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) - if err == nil { - c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) - c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return fmt.Errorf("error removing scale-down-deadline annotation from RS '%s': %w", rs.Name, err) + } + c.log.Infof("Removed '%s' annotation from RS '%s'", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name) + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return fmt.Errorf("error updating replicaset informer in removeScaleDownDelay: %w", err) } return err } @@ -60,9 +64,13 @@ func (c *rolloutContext) addScaleDownDelay(rs *appsv1.ReplicaSet, scaleDownDelay deadline := timeutil.MetaNow().Add(scaleDownDelaySeconds).UTC().Format(time.RFC3339) patch := fmt.Sprintf(addScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, deadline) rs, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) - if err == nil { - c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) - c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return fmt.Errorf("error adding scale-down-deadline annotation to RS '%s': %w", rs.Name, err) + } + c.log.Infof("Set '%s' annotation on '%s' to %s (%s)", v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey, rs.Name, deadline, scaleDownDelaySeconds) + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return fmt.Errorf("error updating replicaset informer in addScaleDownDelay: %w", err) } return err } diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index 3d87cf3132..d93fa7c546 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -1,6 +1,7 @@ package rollout import ( + "fmt" "strconv" "testing" "time" @@ -134,8 +135,9 @@ func TestReconcileNewReplicaSet(t *testing.T) { abortScaleDownAnnotated bool abortScaleDownDelayPassed bool expectedNewReplicas int + failRSUpdate bool + abort bool }{ - { name: "New Replica Set matches rollout replica: No scale", rolloutReplicas: 10, @@ -163,6 +165,7 @@ func TestReconcileNewReplicaSet(t *testing.T) { newReplicas: 10, // ScaleDownOnAbort: true, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: true, abortScaleDownDelayPassed: true, scaleExpected: true, @@ -174,6 +177,7 @@ func TestReconcileNewReplicaSet(t *testing.T) { newReplicas: 8, // ScaleDownOnAbort: true, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: true, abortScaleDownDelayPassed: false, scaleExpected: false, @@ -184,10 +188,20 @@ func TestReconcileNewReplicaSet(t *testing.T) { rolloutReplicas: 10, newReplicas: 10, abortScaleDownDelaySeconds: 5, + abort: true, abortScaleDownAnnotated: false, scaleExpected: false, expectedNewReplicas: 0, }, + { + name: "Fail to update RS: No scale and add default annotation", + rolloutReplicas: 10, + newReplicas: 10, + scaleExpected: false, + failRSUpdate: true, + abort: true, + abortScaleDownDelaySeconds: -1, + }, } for i := range tests { test := tests[i] @@ -199,6 +213,12 @@ func TestReconcileNewReplicaSet(t *testing.T) { fake := fake.Clientset{} k8sfake := k8sfake.Clientset{} + if test.failRSUpdate { + k8sfake.PrependReactor("patch", "replicasets", func(action core.Action) (handled bool, ret runtime.Object, err error) { + return true, &appsv1.ReplicaSet{}, fmt.Errorf("should not patch replica set") + }) + } + f := newFixture(t) defer f.Close() f.objects = append(f.objects, rollout) @@ -227,14 +247,21 @@ func TestReconcileNewReplicaSet(t *testing.T) { }, } roCtx.enqueueRolloutAfter = func(obj any, duration time.Duration) {} + + rollout.Status.Abort = test.abort + roCtx.stableRS.Status.AvailableReplicas = int32(test.rolloutReplicas) + rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AbortScaleDownDelaySeconds: &test.abortScaleDownDelaySeconds, + }, + } + if test.abortScaleDownDelaySeconds > 0 { - rollout.Status.Abort = true rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ BlueGreen: &v1alpha1.BlueGreenStrategy{ AbortScaleDownDelaySeconds: &test.abortScaleDownDelaySeconds, }, } - if test.abortScaleDownAnnotated { var deadline string if test.abortScaleDownDelayPassed { @@ -246,7 +273,19 @@ func TestReconcileNewReplicaSet(t *testing.T) { } } + if test.abortScaleDownDelaySeconds < 0 { + rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AbortScaleDownDelaySeconds: nil, + }, + } + } + scaled, err := roCtx.reconcileNewReplicaSet() + if test.failRSUpdate { + assert.Error(t, err) + return + } if err != nil { t.Errorf("unexpected error: %v", err) return diff --git a/rollout/sync.go b/rollout/sync.go index 25c0c14813..2baeac1698 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -91,7 +91,10 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { return nil, fmt.Errorf("error updating replicaset revision: %v", err) } c.log.Infof("Synced revision on ReplicaSet '%s' to '%s'", rs.Name, newRevision) - c.replicaSetInformer.GetIndexer().Update(rs) + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return nil, fmt.Errorf("error updating replicaset informer in syncReplicaSetRevision: %w", err) + } return rs, nil } @@ -372,12 +375,21 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, if fullScaleDown && !c.shouldDelayScaleDownOnAbort() { delete(rsCopy.Annotations, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) } + rs, err = c.kubeclientset.AppsV1().ReplicaSets(rsCopy.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) - if err == nil && sizeNeedsUpdate { + if err != nil { + return scaled, rs, fmt.Errorf("error updating replicaset %s: %w", rs.Name, err) + } + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + err = fmt.Errorf("error updating replicaset informer in scaleReplicaSet: %w", err) + return scaled, rs, err + } + + if sizeNeedsUpdate { scaled = true revision, _ := replicasetutil.Revision(rs) c.recorder.Eventf(rollout, record.EventOptions{EventReason: conditions.ScalingReplicaSetReason}, conditions.ScalingReplicaSetMessage, scalingOperation, rs.Name, revision, oldScale, newScale) - c.replicaSetInformer.GetIndexer().Update(rs) } } return scaled, rs, err From d86c6cea04ad4c0bd1b77f8de02a943d4be3d6a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:43:29 +0000 Subject: [PATCH 117/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.10 to 1.25.11 (#3206) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.25.10 to 1.25.11. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.10...config/v1.25.11) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 1c6f34f8de..9c95b74e24 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.5 - github.com/aws/aws-sdk-go-v2/config v1.25.10 + github.com/aws/aws-sdk-go-v2/config v1.25.11 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 github.com/blang/semver v3.5.1+incompatible @@ -84,17 +84,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.8 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.9 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 // indirect github.com/aws/smithy-go v1.18.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 089bb0dd55..21639354cd 100644 --- a/go.sum +++ b/go.sum @@ -109,12 +109,12 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.23.5 h1:xK6C4udTyDMd82RFvNkDQxtAd00xlzFUtX4fF2nMZyg= github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= -github.com/aws/aws-sdk-go-v2/config v1.25.10 h1:qw/e8emDtNufTkrAU86DlQ18DruMyyM7ttW6Lgwp4v0= -github.com/aws/aws-sdk-go-v2/config v1.25.10/go.mod h1:203YiAtb6XyoGxXMPsUVwEcuxCiTQY/r8P27IDjfvMc= -github.com/aws/aws-sdk-go-v2/credentials v1.16.8 h1:phw9nRLy/77bPk6Mfu2SHCOnHwfVB7WWrOa5rZIY2Fc= -github.com/aws/aws-sdk-go-v2/credentials v1.16.8/go.mod h1:MrS4SOin6adbO6wgWhdifyPiq+TX7fPPwyA/ZLC1F5M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8 h1:tQZLSPC2Zj2CqZHonLmWEvCsbpMX5tQvaYJWHadcPek= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.8/go.mod h1:5+YpvTHDFffykWr5qAGjqwoh8oVYZOddL3sSrEN7lws= +github.com/aws/aws-sdk-go-v2/config v1.25.11 h1:RWzp7jhPRliIcACefGkKp03L0Yofmd2p8M25kbiyvno= +github.com/aws/aws-sdk-go-v2/config v1.25.11/go.mod h1:BVUs0chMdygHsQtvaMyEOpW2GIW+ubrxJLgIz/JU29s= +github.com/aws/aws-sdk-go-v2/credentials v1.16.9 h1:LQo3MUIOzod9JdUK+wxmSdgzLVYUbII3jXn3S/HJZU0= +github.com/aws/aws-sdk-go-v2/credentials v1.16.9/go.mod h1:R7mDuIJoCjH6TxGUc/cylE7Lp/o0bhKVoxdBThsjqCM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 h1:FZVFahMyZle6WcogZCOxo6D/lkDA2lqKIn4/ueUmVXw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9/go.mod h1:kjq7REMIkxdtcEC9/4BVXjOsNY5isz6jQbEgk6osRTU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 h1:8GVZIR0y6JRIUNSYI1xAMF4HDfV8H/bOsZ/8AD/uY5Q= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8/go.mod h1:rwBfu0SoUkBUZndVgPZKAD9Y2JigaZtRP68unRiYToQ= @@ -129,16 +129,16 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 h1:g+IxAIM+4 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7 h1:dU+ZyhvqMB/T/TxjGagHMCdyUiqaThRIaMu3YvKiSQI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.7/go.mod h1:SGORuNqoXyWfTvTp/gBGJfv8jRvW/+nha0XhnIXVI+o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+ZjkOQjDdHd86/JCEucjFKQ9T0atWKO4s2Lgs= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0vV3/csTpbkfKLI5Sb56cJQTCTtJ0ixdb7P+Wedqiw= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.1 h1:V40g2daNO3l1J94JYwqfkyvQMYXi5I25fs3fNQW8iDs= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.1/go.mod h1:0ZWQJP/mBOUxkCvZKybZNz1XmdUKSBxoF0dzgfxtvDs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1 h1:uQrj7SpUNC3r55vc1CDh3qV9wJC66lz546xM9dhSo5s= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.1/go.mod h1:oyaTk5xEAOuPXX1kCD7HmIeuLqdj3Bk5yGkqGXtGi14= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.1 h1:K33V7L0XDdb23FMOZySr8bon1jou5SHn1fiv7NJ1SUg= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.1/go.mod h1:YtXUl/sfnS06VksYhr855hTQf2HphfT1Xv/EwuzbPjg= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 h1:xJPydhNm0Hiqct5TVKEuHG7weC0+sOs4MUnd7A5n5F4= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.2/go.mod h1:zxk6y1X2KXThESWMS5CrKRvISD8mbIMab6nZrCGxDG0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 h1:8dU9zqA77C5egbU6yd4hFLaiIdPv3rU+6cp7sz5FjCU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2/go.mod h1:7Lt5mjQ8x5rVdKqg+sKKDeuwoszDJIIPmkd8BVsEdS0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 h1:fFrLsy08wEbAisqW3KDl/cPHrF43GmV79zXB9EwJiZw= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.2/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.18.1 h1:pOdBTUfXNazOlxLrgeYalVnuTpKreACHtc62xLwIB3c= github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 3b60991f07ed03bf957f6ef7b1b458c200345718 Mon Sep 17 00:00:00 2001 From: Linus Ekman <46067241+linus345@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:06:32 +0100 Subject: [PATCH 118/264] build(deps): always resolve momentjs version 2.29.4 (#3182) Before this change both version 2.29.1 and version 2.29.4 of momentjs were brougth in. The bump from v2.29.1 -> v2.29.4 remediates two CVEs: CVE-2022-24785 [1] and CVE-2022-31129 [2]. The most notable change comes with the bump from v2.29.1 -> v2.29.2 which introduces a breaking change to remediate CVE-2022-24785: Forward slash and backward slash is no longer allowed in locale names. Locales containing either of those characters will not be loaded from the filesystem any longer [3]. Other than that it looks like there's only patch fixes which can be seen in the full changelog [4]. [1] https://github.com/moment/moment/security/advisories/GHSA-8hfj-j24r-96c4 [2] https://github.com/moment/moment/security/advisories/GHSA-wc69-rhjr-hc9g [3] https://gist.github.com/ichernev/1904b564f6679d9aac1ae08ce13bc45c [4] https://github.com/moment/moment/blob/536ad0c348f2f99009755698f491080757a48221/CHANGELOG.md Signed-off-by: Linus Ekman --- ui/package.json | 3 ++- ui/yarn.lock | 7 +------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ui/package.json b/ui/package.json index 46c0e34666..54a119cb85 100644 --- a/ui/package.json +++ b/ui/package.json @@ -72,6 +72,7 @@ "webpack-merge": "^5.7.3" }, "resolutions": { - "@types/react": "16.9.3" + "@types/react": "16.9.3", + "moment": "2.29.4" } } diff --git a/ui/yarn.lock b/ui/yarn.lock index af1a13d826..6cf22cadc4 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -7985,12 +7985,7 @@ moment-timezone@^0.5.33: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.20.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -moment@^2.29.4: +moment@2.29.4, "moment@>= 2.9.0", moment@^2.20.1, moment@^2.29.4: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== From 3ec0eccfdab6c3b093f3e6bc6c928d532ae4d0b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:11:31 +0000 Subject: [PATCH 119/264] docs: Update Changelog (#3214) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbdcbfbe3d..a2756ab2b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ + +## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) + +### Build + +* **deps:** always resolve momentjs version 2.29.4 ([#3182](https://github.com/argoproj/argo-rollouts/issues/3182)) + +### Fix + +* rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) + ## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) From 0ec851942a2444cb4395e495010e0cf193457d45 Mon Sep 17 00:00:00 2001 From: balasoiuroxana <99259311+balasoiuroxana@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:42:14 +0100 Subject: [PATCH 120/264] feat: automatically scale down Deployment after migrating to Rollout (#3111) Automatically scale down Deployment after migrating to Rollout Signed-off-by: balasoiu Co-authored-by: balasoiu --- docs/features/specification.md | 7 + docs/migrating.md | 7 +- manifests/crds/rollout-crd.yaml | 2 + manifests/install.yaml | 2 + pkg/apiclient/rollout/rollout.swagger.json | 4 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1093 +++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 3 + .../rollouts/v1alpha1/openapi_generated.go | 7 + pkg/apis/rollouts/v1alpha1/types.go | 8 + rollout/replicaset.go | 16 + rollout/replicaset_test.go | 68 + rollout/scale_utils.go | 36 + rollout/scale_utils_test.go | 182 +++ rollout/sync.go | 11 +- rollout/sync_test.go | 29 + test/e2e/functional_test.go | 167 +++ test/fixtures/then.go | 28 + ui/src/models/rollout/generated/api.ts | 6 + 18 files changed, 1148 insertions(+), 528 deletions(-) create mode 100644 rollout/scale_utils.go create mode 100644 rollout/scale_utils_test.go diff --git a/docs/features/specification.md b/docs/features/specification.md index 5f2a817c88..85b18f28f6 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -33,6 +33,13 @@ spec: apiVersion: apps/v1 kind: Deployment name: rollout-ref-deployment + # Specifies if the workload (Deployment) is scaled down after migrating to Rollout. + # The possible options are: + # "never": the Deployment is not scaled down + # "onsuccess": the Deployment is scaled down after the Rollout becomes healthy + # "progressively": as the Rollout is scaled up the Deployment is scaled down + # If the Rollout fails the Deployment will be scaled back up. + scaleDown: never|onsuccess|progressively # Template describes the pods that will be created. Same as deployment. # If used, then do not use Rollout workloadRef property. diff --git a/docs/migrating.md b/docs/migrating.md index 62e3494e3d..3e1f85c461 100644 --- a/docs/migrating.md +++ b/docs/migrating.md @@ -54,7 +54,11 @@ Instead of removing Deployment you can scale it down to zero and reference it fr 1. Create a Rollout resource. 1. Reference an existing Deployment using `workloadRef` field. -1. Scale-down an existing Deployment by changing `replicas` field of an existing Deployment to zero. +1. In the `workloadRef` field set the `scaleDown` attribute, which specifies how the Deployment should be scaled down. There are three options available: +* "never": the Deployment is not scaled down +* "onsuccess": the Deployment is scaled down after the Rollout becomes healthy +* "progressively": as the Rollout is scaled up the Deployment is scaled down. +Alternatively, manually scale down an existing Deployment by changing replicas field of an existing Deployment to zero. 1. To perform an update, the change should be made to the Pod template field of the Deployment. Below is an example of a Rollout resource referencing a Deployment. @@ -73,6 +77,7 @@ spec: apiVersion: apps/v1 kind: Deployment name: rollout-ref-deployment + scaleDown: onsuccess strategy: canary: steps: diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index e3f73b1d3e..d12f68d6b5 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -3330,6 +3330,8 @@ spec: type: string name: type: string + scaleDown: + type: string type: object type: object status: diff --git a/manifests/install.yaml b/manifests/install.yaml index 4466ae8106..56c7fbfba0 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -14920,6 +14920,8 @@ spec: type: string name: type: string + scaleDown: + type: string type: object type: object status: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 4a4903a545..988854d75f 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1695,6 +1695,10 @@ "name": { "type": "string", "title": "Name of the referent" + }, + "scaleDown": { + "type": "string", + "title": "Automatically scale down deployment" } }, "title": "ObjectRef holds a references to the Kubernetes object" diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 5f9239efe8..7588a653a7 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3322,532 +3322,533 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8388 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0xd8, 0x35, 0x87, 0x43, 0xce, 0x3c, 0x72, 0x49, 0x6e, 0xed, 0xae, 0x8e, 0xc7, 0xbb, 0xdb, - 0x39, 0xf5, 0x39, 0x97, 0x3d, 0xeb, 0x44, 0x4a, 0x7b, 0x77, 0xc9, 0x49, 0xa7, 0x5c, 0x32, 0x43, - 0xee, 0xde, 0x72, 0x8f, 0xdc, 0xe5, 0xbe, 0xe1, 0xde, 0xda, 0x92, 0xce, 0x56, 0x73, 0xa6, 0x38, - 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x85, 0x53, 0x14, 0x43, - 0x82, 0x95, 0xd8, 0x42, 0x10, 0x24, 0x08, 0x14, 0xc3, 0x80, 0x93, 0xd8, 0xbf, 0x84, 0x04, 0xf9, - 0x63, 0x20, 0x42, 0x1c, 0xdb, 0xfa, 0x11, 0x07, 0xf2, 0x8f, 0x44, 0x76, 0x00, 0xd3, 0x11, 0x9d, - 0x3f, 0x09, 0x12, 0x08, 0x09, 0x14, 0x04, 0xde, 0x1f, 0x41, 0x50, 0x9f, 0x5d, 0xdd, 0xd3, 0xc3, - 0x9d, 0xd9, 0x69, 0xae, 0x94, 0xc4, 0xff, 0x66, 0xea, 0x55, 0xbd, 0xf7, 0xba, 0x3e, 0x5e, 0xbd, - 0x7a, 0xf5, 0xde, 0x2b, 0xd8, 0x68, 0xb9, 0xd1, 0x5e, 0x6f, 0x67, 0xb9, 0xe1, 0x77, 0x56, 0x9c, - 0xa0, 0xe5, 0x77, 0x03, 0xff, 0x2e, 0xff, 0xf1, 0xd1, 0xc0, 0x6f, 0xb7, 0xfd, 0x5e, 0x14, 0xae, - 0x74, 0xf7, 0x5b, 0x2b, 0x4e, 0xd7, 0x0d, 0x57, 0x74, 0xc9, 0xc1, 0xc7, 0x9d, 0x76, 0x77, 0xcf, - 0xf9, 0xf8, 0x4a, 0x8b, 0x7a, 0x34, 0x70, 0x22, 0xda, 0x5c, 0xee, 0x06, 0x7e, 0xe4, 0x93, 0x4f, - 0xc5, 0xd8, 0x96, 0x15, 0x36, 0xfe, 0xe3, 0xe7, 0x55, 0xdb, 0xe5, 0xee, 0x7e, 0x6b, 0x99, 0x61, - 0x5b, 0xd6, 0x25, 0x0a, 0xdb, 0xd2, 0x47, 0x0d, 0x5e, 0x5a, 0x7e, 0xcb, 0x5f, 0xe1, 0x48, 0x77, - 0x7a, 0xbb, 0xfc, 0x1f, 0xff, 0xc3, 0x7f, 0x09, 0x62, 0x4b, 0xcf, 0xef, 0xbf, 0x16, 0x2e, 0xbb, - 0x3e, 0xe3, 0x6d, 0x65, 0xc7, 0x89, 0x1a, 0x7b, 0x2b, 0x07, 0x7d, 0x1c, 0x2d, 0xd9, 0x46, 0xa5, - 0x86, 0x1f, 0xd0, 0xac, 0x3a, 0xaf, 0xc4, 0x75, 0x3a, 0x4e, 0x63, 0xcf, 0xf5, 0x68, 0x70, 0x18, - 0x7f, 0x75, 0x87, 0x46, 0x4e, 0x56, 0xab, 0x95, 0x41, 0xad, 0x82, 0x9e, 0x17, 0xb9, 0x1d, 0xda, - 0xd7, 0xe0, 0xaf, 0x3c, 0xac, 0x41, 0xd8, 0xd8, 0xa3, 0x1d, 0xa7, 0xaf, 0xdd, 0xcb, 0x83, 0xda, - 0xf5, 0x22, 0xb7, 0xbd, 0xe2, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x46, 0xf6, 0x0f, 0x0b, 0x50, 0xae, - 0x6e, 0xd4, 0xea, 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x15, 0x0b, 0x66, 0xdb, 0xbe, 0xd3, 0xac, 0x39, - 0x6d, 0xc7, 0x6b, 0xd0, 0x60, 0xd1, 0x7a, 0xce, 0xba, 0x34, 0x73, 0x79, 0x63, 0x79, 0x9c, 0xf1, - 0x5a, 0xae, 0xde, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xb5, 0xf3, 0xdf, 0x3d, - 0xaa, 0x3c, 0x71, 0x7c, 0x54, 0x99, 0xdd, 0x30, 0x28, 0x61, 0x82, 0x2e, 0xf9, 0xa6, 0x05, 0x67, - 0x1b, 0x8e, 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0x9b, 0x81, 0xdf, 0xeb, 0x2e, 0x4e, - 0x9c, 0x02, 0x37, 0x4f, 0x49, 0x6e, 0xce, 0xae, 0xa6, 0xc9, 0x61, 0x3f, 0x07, 0x9c, 0xaf, 0x30, - 0x72, 0x76, 0xda, 0xd4, 0xe4, 0xab, 0x70, 0x9a, 0x7c, 0xd5, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf2, - 0x22, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xb8, 0x38, 0xf9, 0x9c, 0x75, 0xa9, 0x5c, 0x9b, 0x97, - 0xcd, 0xa7, 0xd7, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xad, 0x6e, 0xd4, 0xb6, 0x03, - 0x67, 0x77, 0xd7, 0x6d, 0xa0, 0xdf, 0x8b, 0x5c, 0xaf, 0x65, 0x22, 0xb0, 0x4e, 0x46, 0x40, 0x5e, - 0x85, 0x99, 0x90, 0x06, 0x07, 0x6e, 0x83, 0x6e, 0xf9, 0x41, 0xc4, 0x07, 0xa5, 0x58, 0x3b, 0x27, - 0xab, 0xcf, 0xd4, 0x63, 0x10, 0x9a, 0xf5, 0x58, 0xb3, 0xc0, 0xf7, 0x23, 0x09, 0xe7, 0x7d, 0x56, - 0x8e, 0x9b, 0x61, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x83, 0x05, 0xc7, 0xf3, 0xfc, 0xc8, 0x89, 0x5c, - 0xdf, 0xdb, 0x0a, 0xe8, 0xae, 0x7b, 0x5f, 0x7e, 0xe2, 0xa2, 0x6c, 0xbb, 0x50, 0x4d, 0xc1, 0xb1, - 0xaf, 0x05, 0xf9, 0x86, 0x05, 0x0b, 0x61, 0xe4, 0x36, 0xf6, 0x5d, 0x8f, 0x86, 0xe1, 0xaa, 0xef, - 0xed, 0xba, 0xad, 0xc5, 0x22, 0x1f, 0xb6, 0x1b, 0xe3, 0x0d, 0x5b, 0x3d, 0x85, 0xb5, 0x76, 0x9e, - 0xb1, 0x94, 0x2e, 0xc5, 0x3e, 0xea, 0xe4, 0x23, 0x50, 0x96, 0x3d, 0x4a, 0xc3, 0xc5, 0xa9, 0xe7, - 0x0a, 0x97, 0xca, 0xb5, 0x33, 0xc7, 0x47, 0x95, 0xf2, 0xba, 0x2a, 0xc4, 0x18, 0x6e, 0xaf, 0xc1, - 0x62, 0xb5, 0xb3, 0xe3, 0x84, 0xa1, 0xd3, 0xf4, 0x83, 0xd4, 0xd0, 0x5d, 0x82, 0x52, 0xc7, 0xe9, - 0x76, 0x5d, 0xaf, 0xc5, 0xc6, 0x8e, 0xe1, 0x99, 0x3d, 0x3e, 0xaa, 0x94, 0x36, 0x65, 0x19, 0x6a, - 0xa8, 0xfd, 0xc7, 0x13, 0x30, 0x53, 0xf5, 0x9c, 0xf6, 0x61, 0xe8, 0x86, 0xd8, 0xf3, 0xc8, 0xe7, - 0xa0, 0xc4, 0xa4, 0x56, 0xd3, 0x89, 0x1c, 0xb9, 0xd2, 0x3f, 0xb6, 0x2c, 0x84, 0xc8, 0xb2, 0x29, - 0x44, 0xe2, 0xcf, 0x67, 0xb5, 0x97, 0x0f, 0x3e, 0xbe, 0x7c, 0x73, 0xe7, 0x2e, 0x6d, 0x44, 0x9b, - 0x34, 0x72, 0x6a, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, 0x2e, 0x6d, - 0xc8, 0x95, 0xbb, 0x39, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2b, 0x49, 0x4f, - 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0xcd, 0xfc, 0x48, - 0x72, 0xb4, 0xb5, 0x39, 0x49, 0x74, 0x4a, 0xfc, 0x47, 0x49, 0xce, 0xfe, 0x0f, 0x16, 0x9c, 0x33, - 0x6a, 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x3c, 0x07, 0x93, 0x9e, 0xd3, 0xa1, 0x72, 0x55, - 0x69, 0x96, 0x6f, 0x38, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x87, 0xe2, 0x81, 0xd3, 0xee, 0x51, 0xde, - 0x49, 0xe5, 0xda, 0x19, 0x59, 0xa5, 0xf8, 0x36, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x41, 0x99, 0xff, - 0xb8, 0x1a, 0xf8, 0x9d, 0x9c, 0x3e, 0x4d, 0x72, 0xf8, 0xb6, 0x42, 0x2b, 0xa6, 0x9f, 0xfe, 0x8b, - 0x31, 0x41, 0xfb, 0x4f, 0x2d, 0x98, 0x37, 0x3e, 0x6e, 0xc3, 0x0d, 0x23, 0xf2, 0xd9, 0xbe, 0xc9, - 0xb3, 0x3c, 0xdc, 0xe4, 0x61, 0xad, 0xf9, 0xd4, 0x59, 0x90, 0x5f, 0x5a, 0x52, 0x25, 0xc6, 0xc4, - 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4e, 0x3c, 0x57, 0xb8, 0x34, 0x73, 0x79, 0x3d, 0xb7, - 0x61, 0x8c, 0xfb, 0x77, 0x9d, 0xe1, 0x47, 0x41, 0xc6, 0xfe, 0x67, 0x85, 0xc4, 0xf0, 0x6d, 0x2a, - 0x3e, 0x3e, 0xb0, 0x60, 0xaa, 0xed, 0xec, 0xd0, 0xb6, 0x58, 0x5b, 0x33, 0x97, 0xdf, 0xc9, 0x8d, - 0x13, 0x45, 0x63, 0x79, 0x83, 0xe3, 0xbf, 0xe2, 0x45, 0xc1, 0x61, 0x3c, 0xbd, 0x44, 0x21, 0x4a, - 0xe2, 0xe4, 0xef, 0x59, 0x30, 0x13, 0x4b, 0x35, 0xd5, 0x2d, 0x3b, 0xf9, 0x33, 0x13, 0x0b, 0x53, - 0xc9, 0x91, 0x16, 0xd1, 0x06, 0x04, 0x4d, 0x5e, 0x96, 0x3e, 0x01, 0x33, 0xc6, 0x27, 0x90, 0x05, - 0x28, 0xec, 0xd3, 0x43, 0x31, 0xe1, 0x91, 0xfd, 0x24, 0xe7, 0x13, 0x33, 0x5c, 0x4e, 0xe9, 0x4f, - 0x4e, 0xbc, 0x66, 0x2d, 0xbd, 0x01, 0x0b, 0x69, 0x82, 0xa3, 0xb4, 0xb7, 0xbf, 0x3d, 0x99, 0x98, - 0x98, 0x4c, 0x10, 0x10, 0x1f, 0xa6, 0x3b, 0x34, 0x0a, 0xdc, 0x86, 0x1a, 0xb2, 0xb5, 0xf1, 0x7a, - 0x69, 0x93, 0x23, 0x8b, 0x37, 0x44, 0xf1, 0x3f, 0x44, 0x45, 0x85, 0xec, 0xc1, 0xa4, 0x13, 0xb4, - 0xd4, 0x98, 0x5c, 0xcd, 0x67, 0x59, 0xc6, 0xa2, 0xa2, 0x1a, 0xb4, 0x42, 0xe4, 0x14, 0xc8, 0x0a, - 0x94, 0x23, 0x1a, 0x74, 0x5c, 0xcf, 0x89, 0xc4, 0x0e, 0x5a, 0xaa, 0x9d, 0x95, 0xd5, 0xca, 0xdb, - 0x0a, 0x80, 0x71, 0x1d, 0xd2, 0x86, 0xa9, 0x66, 0x70, 0x88, 0x3d, 0x6f, 0x71, 0x32, 0x8f, 0xae, - 0x58, 0xe3, 0xb8, 0xe2, 0x49, 0x2a, 0xfe, 0xa3, 0xa4, 0x41, 0x7e, 0xdd, 0x82, 0xf3, 0x1d, 0xea, - 0x84, 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, 0x51, 0x8f, 0x0d, 0xec, 0x62, 0x91, 0x13, 0xc7, 0x71, - 0xc7, 0xa1, 0x1f, 0x73, 0xed, 0x19, 0xc9, 0xca, 0xf9, 0x2c, 0x28, 0x66, 0x72, 0x63, 0xff, 0xf1, - 0x24, 0x9c, 0xed, 0x13, 0xec, 0xe4, 0x15, 0x28, 0x76, 0xf7, 0x9c, 0x50, 0x49, 0xea, 0x8b, 0x4a, - 0x4c, 0x6c, 0xb1, 0xc2, 0x07, 0x47, 0x95, 0x33, 0xaa, 0x09, 0x2f, 0x40, 0x51, 0x99, 0xe9, 0x4d, - 0x1d, 0x1a, 0x86, 0x4e, 0x4b, 0x89, 0x6f, 0x63, 0x9a, 0xf0, 0x62, 0x54, 0x70, 0xf2, 0x37, 0x2d, - 0x38, 0x23, 0xa6, 0x0c, 0xd2, 0xb0, 0xd7, 0x8e, 0xd8, 0x16, 0xc5, 0xba, 0xe5, 0x7a, 0x1e, 0xd3, - 0x53, 0xa0, 0xac, 0x5d, 0x90, 0xd4, 0xcf, 0x98, 0xa5, 0x21, 0x26, 0xe9, 0x92, 0x3b, 0x50, 0x0e, - 0x23, 0x27, 0x88, 0x68, 0xb3, 0x1a, 0x71, 0x65, 0x6a, 0xe6, 0xf2, 0x4f, 0x0f, 0x27, 0xbb, 0xb7, - 0xdd, 0x0e, 0x15, 0xfb, 0x44, 0x5d, 0x21, 0xc0, 0x18, 0x17, 0x79, 0x0f, 0x20, 0xe8, 0x79, 0xf5, - 0x5e, 0xa7, 0xe3, 0x04, 0x87, 0x52, 0xbf, 0xba, 0x36, 0xde, 0xe7, 0xa1, 0xc6, 0x17, 0xab, 0x1a, - 0x71, 0x19, 0x1a, 0xf4, 0xc8, 0x97, 0x2c, 0x38, 0x23, 0x66, 0xa2, 0xe2, 0x60, 0x2a, 0x67, 0x0e, - 0xce, 0xb2, 0xae, 0x5d, 0x33, 0x49, 0x60, 0x92, 0xa2, 0xfd, 0xef, 0x92, 0x6a, 0x40, 0x3d, 0x62, - 0x87, 0xad, 0xd6, 0x21, 0xf9, 0x0c, 0x3c, 0x15, 0xf6, 0x1a, 0x0d, 0x1a, 0x86, 0xbb, 0xbd, 0x36, - 0xf6, 0xbc, 0x6b, 0x6e, 0x18, 0xf9, 0xc1, 0xe1, 0x86, 0xdb, 0x71, 0x23, 0x3e, 0xe3, 0x8a, 0xb5, - 0x67, 0x8f, 0x8f, 0x2a, 0x4f, 0xd5, 0x07, 0x55, 0xc2, 0xc1, 0xed, 0x89, 0x03, 0x4f, 0xf7, 0xbc, - 0xc1, 0xe8, 0x85, 0x86, 0x5e, 0x39, 0x3e, 0xaa, 0x3c, 0x7d, 0x7b, 0x70, 0x35, 0x3c, 0x09, 0x87, - 0xfd, 0x5f, 0x2c, 0x26, 0xa9, 0xc5, 0x77, 0x6d, 0xd3, 0x4e, 0xb7, 0xcd, 0xa4, 0xcb, 0xe9, 0xeb, - 0x8f, 0x51, 0x42, 0x7f, 0xc4, 0x7c, 0xb6, 0x3b, 0xc5, 0xff, 0x20, 0x25, 0xd2, 0xfe, 0xcf, 0x16, - 0x9c, 0x4f, 0x57, 0x7e, 0x0c, 0x3a, 0x4f, 0x98, 0xd4, 0x79, 0x6e, 0xe4, 0xfb, 0xb5, 0x03, 0x14, - 0x9f, 0xaf, 0x4c, 0xf6, 0x7f, 0xeb, 0xff, 0xeb, 0xdb, 0x68, 0xbc, 0x2b, 0x16, 0x7e, 0x9c, 0xbb, - 0xe2, 0xe4, 0x4f, 0xd4, 0xae, 0xf8, 0x8f, 0x27, 0x61, 0xb6, 0xea, 0x45, 0x6e, 0x75, 0x77, 0xd7, - 0xf5, 0xdc, 0xe8, 0x90, 0x7c, 0x6d, 0x02, 0x56, 0xba, 0x01, 0xdd, 0xa5, 0x41, 0x40, 0x9b, 0x6b, - 0xbd, 0xc0, 0xf5, 0x5a, 0xf5, 0xc6, 0x1e, 0x6d, 0xf6, 0xda, 0xae, 0xd7, 0x5a, 0x6f, 0x79, 0xbe, - 0x2e, 0xbe, 0x72, 0x9f, 0x36, 0x7a, 0xfc, 0x93, 0xc4, 0xa2, 0xe8, 0x8c, 0xf7, 0x49, 0x5b, 0xa3, - 0x11, 0xad, 0xbd, 0x7c, 0x7c, 0x54, 0x59, 0x19, 0xb1, 0x11, 0x8e, 0xfa, 0x69, 0xe4, 0xab, 0x13, - 0xb0, 0x1c, 0xd0, 0xcf, 0xf7, 0xdc, 0xe1, 0x7b, 0x43, 0x48, 0xad, 0xf6, 0x98, 0xdb, 0xcf, 0x48, - 0x34, 0x6b, 0x97, 0x8f, 0x8f, 0x2a, 0x23, 0xb6, 0xc1, 0x11, 0xbf, 0xcb, 0xde, 0x82, 0x99, 0x6a, - 0xd7, 0x0d, 0xdd, 0xfb, 0xe8, 0xf7, 0x22, 0x3a, 0xc4, 0x11, 0xb7, 0x02, 0xc5, 0xa0, 0xd7, 0xa6, - 0x62, 0x6d, 0x97, 0x6b, 0x65, 0x26, 0x85, 0x90, 0x15, 0xa0, 0x28, 0xb7, 0x7f, 0x91, 0x49, 0x5c, - 0x8e, 0x32, 0x65, 0xdc, 0xb8, 0x0b, 0xc5, 0x80, 0x11, 0x91, 0x33, 0x6b, 0xdc, 0x73, 0x60, 0xcc, - 0xb5, 0x64, 0x82, 0xfd, 0x44, 0x41, 0xc2, 0xfe, 0x9d, 0x09, 0xb8, 0x50, 0xed, 0x76, 0x37, 0x69, - 0xb8, 0x97, 0xe2, 0xe2, 0x97, 0x2d, 0x98, 0x3b, 0x70, 0x83, 0xa8, 0xe7, 0xb4, 0x95, 0xfd, 0x4a, - 0xf0, 0x53, 0x1f, 0x97, 0x1f, 0x4e, 0xed, 0xed, 0x04, 0xea, 0x1a, 0x39, 0x3e, 0xaa, 0xcc, 0x25, - 0xcb, 0x30, 0x45, 0x9e, 0xfc, 0x5d, 0x0b, 0x16, 0x64, 0xd1, 0x0d, 0xbf, 0x49, 0x4d, 0xfb, 0xe8, - 0xed, 0x3c, 0x79, 0xd2, 0xc8, 0x85, 0x5d, 0x2b, 0x5d, 0x8a, 0x7d, 0x4c, 0xd8, 0xff, 0x6d, 0x02, - 0x9e, 0x1c, 0x80, 0x83, 0xfc, 0x86, 0x05, 0xe7, 0x85, 0x51, 0xd5, 0x00, 0x21, 0xdd, 0x95, 0xbd, - 0xf9, 0xb3, 0x79, 0x73, 0x8e, 0x6c, 0x89, 0x53, 0xaf, 0x41, 0x6b, 0x8b, 0x4c, 0x1a, 0xae, 0x66, - 0x90, 0xc6, 0x4c, 0x86, 0x38, 0xa7, 0xc2, 0xcc, 0x9a, 0xe2, 0x74, 0xe2, 0xb1, 0x70, 0x5a, 0xcf, - 0x20, 0x8d, 0x99, 0x0c, 0xd9, 0x7f, 0x1d, 0x9e, 0x3e, 0x01, 0xdd, 0xc3, 0x17, 0xa7, 0xfd, 0x8e, - 0x9e, 0xf5, 0xc9, 0x39, 0x37, 0xc4, 0xba, 0xb6, 0x61, 0x8a, 0x2f, 0x1d, 0xb5, 0xb0, 0x81, 0x6d, - 0x7f, 0x7c, 0x4d, 0x85, 0x28, 0x21, 0xf6, 0xef, 0x58, 0x50, 0x1a, 0xc1, 0x1a, 0x56, 0x49, 0x5a, - 0xc3, 0xca, 0x7d, 0x96, 0xb0, 0xa8, 0xdf, 0x12, 0xf6, 0xe6, 0x78, 0xa3, 0x31, 0x8c, 0x05, 0xec, - 0x87, 0x16, 0x9c, 0xed, 0xb3, 0x98, 0x91, 0x3d, 0x38, 0xdf, 0xf5, 0x9b, 0x4a, 0x6d, 0xba, 0xe6, - 0x84, 0x7b, 0x1c, 0x26, 0x3f, 0xef, 0x15, 0x36, 0x92, 0x5b, 0x19, 0xf0, 0x07, 0x47, 0x95, 0x45, - 0x8d, 0x24, 0x55, 0x01, 0x33, 0x31, 0x92, 0x2e, 0x94, 0x76, 0x5d, 0xda, 0x6e, 0xc6, 0x53, 0x70, - 0x4c, 0x05, 0xe9, 0xaa, 0xc4, 0x26, 0x8c, 0xc5, 0xea, 0x1f, 0x6a, 0x2a, 0xf6, 0x8f, 0x2c, 0x98, - 0xab, 0xf6, 0xa2, 0x3d, 0xa6, 0x1e, 0x34, 0xb8, 0x7d, 0x86, 0x78, 0x50, 0x0c, 0xdd, 0xd6, 0xc1, - 0x2b, 0xf9, 0x08, 0xe3, 0x3a, 0x43, 0x25, 0x8d, 0xe6, 0x5a, 0x37, 0xe5, 0x85, 0x28, 0xc8, 0x90, - 0x00, 0xa6, 0x7c, 0xa7, 0x17, 0xed, 0x5d, 0x96, 0x9f, 0x3c, 0xe6, 0x49, 0xf9, 0x26, 0xfb, 0x9c, - 0xcb, 0x92, 0xa2, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4a, 0xf6, 0x17, 0x61, 0x2e, 0x79, 0x13, 0x33, - 0xc4, 0x9c, 0x7d, 0x16, 0x0a, 0x4e, 0xe0, 0xc9, 0x19, 0x3b, 0x23, 0x2b, 0x14, 0xaa, 0x78, 0x03, - 0x59, 0x39, 0x79, 0x09, 0x4a, 0xbb, 0xbd, 0x76, 0x9b, 0x35, 0x90, 0xd7, 0x1e, 0xfa, 0x14, 0x70, - 0x55, 0x96, 0xa3, 0xae, 0x61, 0xff, 0xf9, 0x24, 0xcc, 0xd7, 0xda, 0x3d, 0xfa, 0x66, 0x40, 0xa9, - 0xb2, 0x4d, 0x54, 0x61, 0xbe, 0x1b, 0xd0, 0x03, 0x97, 0xde, 0xab, 0xd3, 0x36, 0x6d, 0x44, 0x7e, - 0x20, 0xb9, 0x79, 0x52, 0x22, 0x9a, 0xdf, 0x4a, 0x82, 0x31, 0x5d, 0x9f, 0xbc, 0x01, 0x73, 0x4e, - 0x23, 0x72, 0x0f, 0xa8, 0xc6, 0x20, 0xd8, 0xfd, 0x90, 0xc4, 0x30, 0x57, 0x4d, 0x40, 0x31, 0x55, - 0x9b, 0x7c, 0x16, 0x16, 0xc3, 0x86, 0xd3, 0xa6, 0xb7, 0xbb, 0x92, 0xd4, 0xea, 0x1e, 0x6d, 0xec, - 0x6f, 0xf9, 0xae, 0x17, 0x49, 0x4b, 0xd4, 0x73, 0x12, 0xd3, 0x62, 0x7d, 0x40, 0x3d, 0x1c, 0x88, - 0x81, 0xfc, 0x4b, 0x0b, 0x9e, 0xed, 0x06, 0x74, 0x2b, 0xf0, 0x3b, 0x3e, 0x9b, 0x6a, 0x7d, 0xe6, - 0x19, 0x69, 0xa6, 0x78, 0x7b, 0x4c, 0x5d, 0x4a, 0x94, 0xf4, 0x5b, 0xf5, 0x3f, 0x7c, 0x7c, 0x54, - 0x79, 0x76, 0xeb, 0x24, 0x06, 0xf0, 0x64, 0xfe, 0xc8, 0xbf, 0xb2, 0xe0, 0x62, 0xd7, 0x0f, 0xa3, - 0x13, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1f, 0x55, 0x2e, 0x6e, 0x9d, 0xc8, 0x01, 0x3e, - 0x84, 0x43, 0xfb, 0x78, 0x06, 0xce, 0x1a, 0x73, 0x4f, 0xda, 0x2e, 0x5e, 0x87, 0x33, 0x6a, 0x32, - 0xc4, 0xba, 0x4f, 0x39, 0xb6, 0x35, 0x55, 0x4d, 0x20, 0x26, 0xeb, 0xb2, 0x79, 0xa7, 0xa7, 0xa2, - 0x68, 0x9d, 0x9a, 0x77, 0x5b, 0x09, 0x28, 0xa6, 0x6a, 0x93, 0x75, 0x38, 0x27, 0x4b, 0x90, 0x76, - 0xdb, 0x6e, 0xc3, 0x59, 0xf5, 0x7b, 0x72, 0xca, 0x15, 0x6b, 0x4f, 0x1e, 0x1f, 0x55, 0xce, 0x6d, - 0xf5, 0x83, 0x31, 0xab, 0x0d, 0xd9, 0x80, 0xf3, 0x4e, 0x2f, 0xf2, 0xf5, 0xf7, 0x5f, 0xf1, 0xd8, - 0x76, 0xda, 0xe4, 0x53, 0xab, 0x24, 0xf6, 0xdd, 0x6a, 0x06, 0x1c, 0x33, 0x5b, 0x91, 0xad, 0x14, - 0xb6, 0x3a, 0x6d, 0xf8, 0x5e, 0x53, 0x8c, 0x72, 0x31, 0x3e, 0x81, 0x55, 0x33, 0xea, 0x60, 0x66, - 0x4b, 0xd2, 0x86, 0xb9, 0x8e, 0x73, 0xff, 0xb6, 0xe7, 0x1c, 0x38, 0x6e, 0x9b, 0x11, 0x91, 0xf6, - 0xab, 0xc1, 0x46, 0x95, 0x5e, 0xe4, 0xb6, 0x97, 0xc5, 0xcd, 0xfe, 0xf2, 0xba, 0x17, 0xdd, 0x0c, - 0xea, 0x11, 0xd3, 0xd4, 0x85, 0x06, 0xb9, 0x99, 0xc0, 0x85, 0x29, 0xdc, 0xe4, 0x26, 0x5c, 0xe0, - 0xcb, 0x71, 0xcd, 0xbf, 0xe7, 0xad, 0xd1, 0xb6, 0x73, 0xa8, 0x3e, 0x60, 0x9a, 0x7f, 0xc0, 0x53, - 0xc7, 0x47, 0x95, 0x0b, 0xf5, 0xac, 0x0a, 0x98, 0xdd, 0x8e, 0x38, 0xf0, 0x74, 0x12, 0x80, 0xf4, - 0xc0, 0x0d, 0x5d, 0xdf, 0x13, 0x56, 0xa8, 0x52, 0x6c, 0x85, 0xaa, 0x0f, 0xae, 0x86, 0x27, 0xe1, - 0x20, 0x7f, 0xdf, 0x82, 0xf3, 0x59, 0xcb, 0x70, 0xb1, 0x9c, 0xc7, 0xfd, 0x62, 0x6a, 0x69, 0x89, - 0x19, 0x91, 0x29, 0x14, 0x32, 0x99, 0x20, 0xef, 0x5b, 0x30, 0xeb, 0x18, 0x27, 0xe8, 0x45, 0xc8, - 0x63, 0xd7, 0x32, 0xcf, 0xe4, 0xb5, 0x85, 0xe3, 0xa3, 0x4a, 0xe2, 0x94, 0x8e, 0x09, 0x8a, 0xe4, - 0x1f, 0x5a, 0x70, 0x21, 0x73, 0x8d, 0x2f, 0xce, 0x9c, 0x46, 0x0f, 0xf1, 0x49, 0x92, 0x2d, 0x73, - 0xb2, 0xd9, 0x20, 0xdf, 0xb0, 0xf4, 0x56, 0xa6, 0xae, 0x9c, 0x16, 0x67, 0x39, 0x6b, 0xb7, 0xc6, - 0x34, 0x1a, 0xc4, 0x5a, 0x93, 0x42, 0x5c, 0x3b, 0x67, 0xec, 0x8c, 0xaa, 0x10, 0xd3, 0xe4, 0xc9, - 0xd7, 0x2d, 0xb5, 0x35, 0x6a, 0x8e, 0xce, 0x9c, 0x16, 0x47, 0x24, 0xde, 0x69, 0x35, 0x43, 0x29, - 0xe2, 0xe4, 0xe7, 0x60, 0xc9, 0xd9, 0xf1, 0x83, 0x28, 0x73, 0xf1, 0x2d, 0xce, 0xf1, 0x65, 0x74, - 0xf1, 0xf8, 0xa8, 0xb2, 0x54, 0x1d, 0x58, 0x0b, 0x4f, 0xc0, 0x60, 0xff, 0x56, 0x11, 0x66, 0xc5, - 0x49, 0x48, 0x6e, 0x5d, 0xbf, 0x6d, 0xc1, 0x33, 0x8d, 0x5e, 0x10, 0x50, 0x2f, 0xaa, 0x47, 0xb4, - 0xdb, 0xbf, 0x71, 0x59, 0xa7, 0xba, 0x71, 0x3d, 0x77, 0x7c, 0x54, 0x79, 0x66, 0xf5, 0x04, 0xfa, - 0x78, 0x22, 0x77, 0xe4, 0xdf, 0x5a, 0x60, 0xcb, 0x0a, 0x35, 0xa7, 0xb1, 0xdf, 0x0a, 0xfc, 0x9e, - 0xd7, 0xec, 0xff, 0x88, 0x89, 0x53, 0xfd, 0x88, 0x17, 0x8e, 0x8f, 0x2a, 0xf6, 0xea, 0x43, 0xb9, - 0xc0, 0x21, 0x38, 0x25, 0x6f, 0xc2, 0x59, 0x59, 0xeb, 0xca, 0xfd, 0x2e, 0x0d, 0x5c, 0x76, 0xe6, - 0x90, 0x8a, 0x63, 0xec, 0xad, 0x94, 0xae, 0x80, 0xfd, 0x6d, 0x48, 0x08, 0xd3, 0xf7, 0xa8, 0xdb, - 0xda, 0x8b, 0x94, 0xfa, 0x34, 0xa6, 0x8b, 0x92, 0xb4, 0x8a, 0xdc, 0x11, 0x38, 0x6b, 0x33, 0xc7, - 0x47, 0x95, 0x69, 0xf9, 0x07, 0x15, 0x25, 0x72, 0x03, 0xe6, 0xc4, 0x39, 0x75, 0xcb, 0xf5, 0x5a, - 0x5b, 0xbe, 0x27, 0xfc, 0x6c, 0xca, 0xb5, 0x17, 0xd4, 0x86, 0x5f, 0x4f, 0x40, 0x1f, 0x1c, 0x55, - 0x66, 0xd5, 0xef, 0xed, 0xc3, 0x2e, 0xc5, 0x54, 0x6b, 0xfb, 0xf7, 0xa6, 0x00, 0xd4, 0x74, 0xa5, - 0x5d, 0xf2, 0x11, 0x28, 0x87, 0x34, 0x12, 0x54, 0xe5, 0xc5, 0x89, 0xb8, 0x8f, 0x52, 0x85, 0x18, - 0xc3, 0xc9, 0x3e, 0x14, 0xbb, 0x4e, 0x2f, 0xa4, 0xf9, 0x9c, 0x1f, 0xe4, 0xe0, 0x6f, 0x31, 0x8c, - 0xe2, 0x60, 0xca, 0x7f, 0xa2, 0xa0, 0x41, 0xbe, 0x6c, 0x01, 0xd0, 0xe4, 0x80, 0x8d, 0x6d, 0x20, - 0x92, 0x24, 0xe3, 0x31, 0x65, 0x7d, 0x50, 0x9b, 0x3b, 0x3e, 0xaa, 0x80, 0x31, 0xf4, 0x06, 0x59, - 0x72, 0x0f, 0x4a, 0x8e, 0x92, 0xf9, 0x93, 0xa7, 0x21, 0xf3, 0xf9, 0x79, 0x51, 0x4f, 0x5a, 0x4d, - 0x8c, 0x7c, 0xd5, 0x82, 0xb9, 0x90, 0x46, 0x72, 0xa8, 0x98, 0xe4, 0x91, 0x0a, 0xef, 0x98, 0x93, - 0xae, 0x9e, 0xc0, 0x29, 0x24, 0x68, 0xb2, 0x0c, 0x53, 0x74, 0x15, 0x2b, 0xd7, 0xa8, 0xd3, 0xa4, - 0x01, 0x37, 0x47, 0x48, 0x4d, 0x6a, 0x7c, 0x56, 0x0c, 0x9c, 0x9a, 0x15, 0xa3, 0x0c, 0x53, 0x74, - 0x15, 0x2b, 0x9b, 0x6e, 0x10, 0xf8, 0x92, 0x95, 0x52, 0x4e, 0xac, 0x18, 0x38, 0x35, 0x2b, 0x46, - 0x19, 0xa6, 0xe8, 0xda, 0xdf, 0x3a, 0x03, 0x73, 0x6a, 0x21, 0xc5, 0x9a, 0xbd, 0xb0, 0x7e, 0x0d, - 0xd0, 0xec, 0x57, 0x4d, 0x20, 0x26, 0xeb, 0xb2, 0xc6, 0x62, 0xa9, 0x26, 0x15, 0x7b, 0xdd, 0xb8, - 0x6e, 0x02, 0x31, 0x59, 0x97, 0x74, 0xa0, 0x18, 0x46, 0xb4, 0xab, 0xee, 0xc0, 0xc7, 0xbc, 0xa2, - 0x8d, 0xe5, 0x83, 0x61, 0x49, 0x60, 0xe8, 0x51, 0x50, 0xe1, 0x06, 0xdc, 0x28, 0x61, 0xd3, 0x95, - 0x8b, 0x23, 0x9f, 0xf5, 0x99, 0x34, 0x17, 0x8b, 0xd1, 0x48, 0x96, 0x61, 0x8a, 0x7c, 0x86, 0xb2, - 0x5f, 0x3c, 0x45, 0x65, 0xff, 0xd3, 0x50, 0xea, 0x38, 0xf7, 0xeb, 0xbd, 0xa0, 0xf5, 0xe8, 0x87, - 0x0a, 0xe9, 0x55, 0x28, 0xb0, 0xa0, 0xc6, 0x47, 0xbe, 0x64, 0x19, 0x22, 0x67, 0x9a, 0x23, 0xbf, - 0x93, 0xaf, 0xc8, 0xd1, 0x7b, 0xe5, 0x40, 0xe1, 0xd3, 0xa7, 0x7a, 0x97, 0x1e, 0xbb, 0xea, 0xcd, - 0xd4, 0x48, 0xb1, 0x40, 0xb4, 0x1a, 0x59, 0x3e, 0x55, 0x35, 0x72, 0x35, 0x41, 0x0c, 0x53, 0xc4, - 0x39, 0x3f, 0x62, 0xcd, 0x69, 0x7e, 0xe0, 0x54, 0xf9, 0xa9, 0x27, 0x88, 0x61, 0x8a, 0xf8, 0xe0, - 0xf3, 0xe6, 0xcc, 0xe9, 0x9c, 0x37, 0x67, 0x73, 0x38, 0x6f, 0x9e, 0xac, 0x8a, 0x9f, 0x19, 0x57, - 0x15, 0x27, 0xd7, 0x81, 0x34, 0x0f, 0x3d, 0xa7, 0xe3, 0x36, 0xa4, 0xb0, 0xe4, 0xdb, 0xe6, 0x1c, - 0xb7, 0x47, 0x2c, 0x49, 0x41, 0x46, 0xd6, 0xfa, 0x6a, 0x60, 0x46, 0x2b, 0x12, 0x41, 0xa9, 0xab, - 0x34, 0xae, 0xf9, 0x3c, 0x66, 0xbf, 0xd2, 0xc0, 0x84, 0x9b, 0x04, 0x5b, 0x78, 0xaa, 0x04, 0x35, - 0x25, 0xb2, 0x01, 0xe7, 0x3b, 0xae, 0xb7, 0xe5, 0x37, 0xc3, 0x2d, 0x1a, 0x48, 0x6b, 0x4b, 0x9d, - 0x46, 0x8b, 0x0b, 0xbc, 0x6f, 0xf8, 0x09, 0x7a, 0x33, 0x03, 0x8e, 0x99, 0xad, 0xec, 0xff, 0x69, - 0xc1, 0xc2, 0x6a, 0xdb, 0xef, 0x35, 0xef, 0x38, 0x51, 0x63, 0x4f, 0x78, 0x08, 0x90, 0x37, 0xa0, - 0xe4, 0x7a, 0x11, 0x0d, 0x0e, 0x9c, 0xb6, 0xdc, 0x9f, 0x6c, 0x65, 0x3e, 0x5d, 0x97, 0xe5, 0x0f, - 0x8e, 0x2a, 0x73, 0x6b, 0xbd, 0x80, 0x5b, 0xa9, 0x85, 0xb4, 0x42, 0xdd, 0x86, 0x7c, 0xcb, 0x82, - 0xb3, 0xc2, 0xc7, 0x60, 0xcd, 0x89, 0x9c, 0x5b, 0x3d, 0x1a, 0xb8, 0x54, 0x79, 0x19, 0x8c, 0x29, - 0xa8, 0xd2, 0xbc, 0x2a, 0x02, 0x87, 0xb1, 0xa2, 0xbe, 0x99, 0xa6, 0x8c, 0xfd, 0xcc, 0xd8, 0xbf, - 0x52, 0x80, 0xa7, 0x06, 0xe2, 0x22, 0x4b, 0x30, 0xe1, 0x36, 0xe5, 0xa7, 0x83, 0xc4, 0x3b, 0xb1, - 0xde, 0xc4, 0x09, 0xb7, 0x49, 0x96, 0xb9, 0xce, 0x19, 0xd0, 0x30, 0x54, 0x17, 0xce, 0x65, 0xad, - 0x1e, 0xca, 0x52, 0x34, 0x6a, 0x90, 0x0a, 0x14, 0xb9, 0x47, 0xa9, 0x3c, 0x4f, 0x70, 0x2d, 0x96, - 0x3b, 0x6f, 0xa2, 0x28, 0x27, 0xbf, 0x68, 0x01, 0x08, 0x06, 0xd9, 0x69, 0x44, 0xee, 0x92, 0x98, - 0x6f, 0x37, 0x31, 0xcc, 0x82, 0xcb, 0xf8, 0x3f, 0x1a, 0x54, 0xc9, 0x36, 0x4c, 0x31, 0x85, 0xd6, - 0x6f, 0x3e, 0xf2, 0xa6, 0xc8, 0x6f, 0xa2, 0xb6, 0x38, 0x0e, 0x94, 0xb8, 0x58, 0x5f, 0x05, 0x34, - 0xea, 0x05, 0x1e, 0xeb, 0x5a, 0xbe, 0x0d, 0x96, 0x04, 0x17, 0xa8, 0x4b, 0xd1, 0xa8, 0x61, 0xff, - 0x8b, 0x09, 0x38, 0x9f, 0xc5, 0x3a, 0xdb, 0x6d, 0xa6, 0x04, 0xb7, 0xf2, 0x68, 0xfc, 0x33, 0xf9, - 0xf7, 0x8f, 0x74, 0x97, 0xd1, 0xd7, 0x14, 0xd2, 0xa1, 0x4f, 0xd2, 0x25, 0x3f, 0xa3, 0x7b, 0x68, - 0xe2, 0x11, 0x7b, 0x48, 0x63, 0x4e, 0xf5, 0xd2, 0x73, 0x30, 0x19, 0xb2, 0x91, 0x2f, 0x24, 0xaf, - 0x3b, 0xf8, 0x18, 0x71, 0x08, 0xab, 0xd1, 0xf3, 0xdc, 0x48, 0x86, 0x61, 0xe8, 0x1a, 0xb7, 0x3d, - 0x37, 0x42, 0x0e, 0xb1, 0xbf, 0x39, 0x01, 0x4b, 0x83, 0x3f, 0x8a, 0x7c, 0xd3, 0x02, 0x68, 0xb2, - 0xe3, 0x4a, 0xc8, 0x7d, 0x99, 0x85, 0x7b, 0x91, 0x73, 0x5a, 0x7d, 0xb8, 0xa6, 0x28, 0xc5, 0xbe, - 0x66, 0xba, 0x28, 0x44, 0x83, 0x11, 0x72, 0x59, 0x4d, 0x7d, 0x7e, 0x55, 0x23, 0x16, 0x93, 0x6e, - 0xb3, 0xa9, 0x21, 0x68, 0xd4, 0x62, 0xe7, 0x51, 0xcf, 0xe9, 0xd0, 0xb0, 0xeb, 0xe8, 0xa0, 0x16, - 0x7e, 0x1e, 0xbd, 0xa1, 0x0a, 0x31, 0x86, 0xdb, 0x6d, 0x78, 0x7e, 0x08, 0x3e, 0x73, 0x8a, 0x19, - 0xb0, 0xff, 0xbb, 0x05, 0x4f, 0xae, 0xb6, 0x7b, 0x61, 0x44, 0x83, 0xff, 0x6f, 0x5c, 0xf7, 0xfe, - 0x97, 0x05, 0x4f, 0x0f, 0xf8, 0xe6, 0xc7, 0xe0, 0xc1, 0xf7, 0x6e, 0xd2, 0x83, 0xef, 0xf6, 0xb8, - 0x53, 0x3a, 0xf3, 0x3b, 0x06, 0x38, 0xf2, 0x7d, 0xb3, 0x00, 0x67, 0x98, 0xd8, 0x6a, 0xfa, 0xad, - 0x9c, 0x36, 0xce, 0xe7, 0xa1, 0xf8, 0x79, 0xb6, 0x01, 0xa5, 0x27, 0x19, 0xdf, 0x95, 0x50, 0xc0, - 0xc8, 0x97, 0x2d, 0x98, 0xfe, 0xbc, 0xdc, 0x53, 0xc5, 0x59, 0x6e, 0x4c, 0x61, 0x98, 0xf8, 0x86, - 0x65, 0xb9, 0x43, 0x8a, 0x50, 0x04, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0x45, 0x99, 0xbc, 0x08, 0xd3, - 0xbb, 0x7e, 0xd0, 0xe9, 0xb5, 0x9d, 0x74, 0xfc, 0xdb, 0x55, 0x51, 0x8c, 0x0a, 0xce, 0x16, 0xb9, - 0xd3, 0x75, 0xdf, 0xa6, 0x41, 0x28, 0x3c, 0xd3, 0x13, 0x8b, 0xbc, 0xaa, 0x21, 0x68, 0xd4, 0x5a, - 0xfa, 0x24, 0xcc, 0x9a, 0x8c, 0x8c, 0x14, 0xa2, 0xf0, 0x29, 0x90, 0x0e, 0x81, 0x29, 0xf1, 0x62, - 0x0d, 0x23, 0x5e, 0xec, 0x7f, 0x3f, 0x01, 0x86, 0xa5, 0xe7, 0x31, 0x2c, 0x5b, 0x2f, 0xb1, 0x6c, - 0xc7, 0xb4, 0x52, 0x18, 0x76, 0xab, 0x41, 0x01, 0x5b, 0x07, 0xa9, 0x80, 0xad, 0x1b, 0xb9, 0x51, - 0x3c, 0x39, 0x5e, 0xeb, 0xfb, 0x16, 0x3c, 0x1d, 0x57, 0xee, 0x37, 0xc2, 0x3e, 0x5c, 0x06, 0xbf, - 0x0a, 0x33, 0x4e, 0xdc, 0x4c, 0x2e, 0x12, 0x23, 0x5a, 0x46, 0x83, 0xd0, 0xac, 0x17, 0xc7, 0x19, - 0x14, 0x1e, 0x31, 0xce, 0x60, 0xf2, 0xe4, 0x38, 0x03, 0xfb, 0x47, 0x13, 0xf0, 0x6c, 0xff, 0x97, - 0x29, 0xe9, 0x31, 0x9c, 0x47, 0xc3, 0x6b, 0x30, 0x1b, 0xc9, 0x06, 0xc6, 0x5e, 0xa8, 0x23, 0x77, - 0xb7, 0x0d, 0x18, 0x26, 0x6a, 0xb2, 0x96, 0x0d, 0x21, 0xb7, 0xea, 0x0d, 0xbf, 0xab, 0xa2, 0x54, - 0x74, 0xcb, 0x55, 0x03, 0x86, 0x89, 0x9a, 0xda, 0xff, 0x77, 0xf2, 0xd4, 0xfd, 0x7f, 0xeb, 0x70, - 0x41, 0x79, 0x3c, 0x5e, 0xf5, 0x83, 0x55, 0xbf, 0xd3, 0x6d, 0xd3, 0x48, 0x49, 0x83, 0x52, 0xed, - 0x59, 0xd9, 0xe4, 0x02, 0x66, 0x55, 0xc2, 0xec, 0xb6, 0xf6, 0xf7, 0x0b, 0x70, 0x2e, 0xee, 0xf6, - 0x55, 0xdf, 0x6b, 0xba, 0xdc, 0x69, 0xe6, 0x75, 0x98, 0x8c, 0x0e, 0xbb, 0xaa, 0xb3, 0xff, 0xb2, - 0x62, 0x67, 0xfb, 0xb0, 0xcb, 0x46, 0xfb, 0xc9, 0x8c, 0x26, 0xdc, 0x0c, 0xce, 0x1b, 0x91, 0x0d, - 0xbd, 0x3a, 0xc4, 0x08, 0xbc, 0x92, 0x9c, 0xcd, 0x0f, 0x8e, 0x2a, 0x19, 0x81, 0xeb, 0xcb, 0x1a, - 0x53, 0x72, 0xce, 0x93, 0xbb, 0x30, 0xd7, 0x76, 0xc2, 0xe8, 0x76, 0xb7, 0xe9, 0x44, 0x74, 0xdb, - 0x95, 0xee, 0x28, 0xa3, 0x05, 0x7f, 0xe8, 0x7b, 0xfb, 0x8d, 0x04, 0x26, 0x4c, 0x61, 0x26, 0x07, - 0x40, 0x58, 0xc9, 0x76, 0xe0, 0x78, 0xa1, 0xf8, 0x2a, 0x46, 0x6f, 0xf4, 0x60, 0x13, 0x7d, 0x0c, - 0xde, 0xe8, 0xc3, 0x86, 0x19, 0x14, 0xc8, 0x0b, 0x30, 0x15, 0x50, 0x27, 0xd4, 0xa2, 0x5d, 0xaf, - 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x82, 0x9a, 0x7a, 0xc8, 0x82, 0xfa, 0x13, 0x0b, 0xe6, 0xe2, - 0x61, 0x7a, 0x0c, 0x6a, 0x44, 0x27, 0xa9, 0x46, 0x5c, 0xcb, 0x4b, 0x24, 0x0e, 0xd0, 0x1c, 0x7e, - 0x7f, 0xca, 0xfc, 0x3e, 0xee, 0xfc, 0xff, 0x05, 0x28, 0xab, 0x55, 0xad, 0xf4, 0xf3, 0x31, 0xad, - 0x09, 0x09, 0xcd, 0xcd, 0x08, 0x5a, 0x93, 0x44, 0x30, 0xa6, 0xc7, 0xf4, 0x96, 0xa6, 0xd4, 0x49, - 0xe4, 0xb4, 0xd7, 0x7a, 0x8b, 0xd2, 0x55, 0xb2, 0xf4, 0x16, 0xd5, 0x86, 0xdc, 0x86, 0x27, 0xbb, - 0x81, 0xcf, 0x43, 0xa7, 0xd7, 0xa8, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x26, 0x1b, 0xe1, 0x36, 0xf2, - 0xf4, 0xf1, 0x51, 0xe5, 0xc9, 0xad, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0xf8, 0x6e, 0x72, 0x88, - 0xe0, 0xbb, 0xbf, 0xa5, 0x0d, 0xa3, 0x34, 0x94, 0x21, 0x70, 0x9f, 0xc9, 0x6b, 0x28, 0x33, 0xc4, - 0x7a, 0x3c, 0xa5, 0xaa, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0xad, 0x6f, 0x53, 0x8f, 0x68, 0x7d, 0x8b, - 0x63, 0x28, 0xa6, 0x7f, 0x9c, 0x31, 0x14, 0xa5, 0x9f, 0xa8, 0x18, 0x8a, 0x0f, 0x8a, 0xb0, 0x90, - 0xd6, 0x40, 0x4e, 0x3f, 0xb0, 0xf0, 0xef, 0x58, 0xb0, 0xa0, 0x56, 0x8f, 0xa0, 0xa9, 0x75, 0xf1, - 0x8d, 0x9c, 0x16, 0xad, 0xd0, 0xa5, 0x74, 0xc6, 0x85, 0xed, 0x14, 0x35, 0xec, 0xa3, 0x4f, 0xde, - 0x81, 0x19, 0x7d, 0xfd, 0xf0, 0x48, 0x51, 0x86, 0xf3, 0x5c, 0x8b, 0x8a, 0x51, 0xa0, 0x89, 0x8f, - 0x7c, 0x60, 0x01, 0x34, 0xd4, 0x36, 0xa7, 0x56, 0xd7, 0xad, 0xbc, 0x56, 0x97, 0xde, 0x40, 0x63, - 0x65, 0x59, 0x17, 0x85, 0x68, 0x10, 0x26, 0xbf, 0xc2, 0x2f, 0x1e, 0xb4, 0x76, 0x27, 0x32, 0x39, - 0x8c, 0xed, 0x1f, 0x7e, 0x82, 0x62, 0x1a, 0xab, 0x52, 0x06, 0x28, 0xc4, 0x04, 0x13, 0xf6, 0xeb, - 0xa0, 0x3d, 0x7a, 0x99, 0xd8, 0xe2, 0x3e, 0xbd, 0x5b, 0x4e, 0xb4, 0x27, 0xa7, 0xa0, 0x16, 0x5b, - 0x57, 0x15, 0x00, 0xe3, 0x3a, 0xf6, 0xe7, 0x60, 0xee, 0xcd, 0xc0, 0xe9, 0xee, 0xb9, 0xdc, 0xc0, - 0xcf, 0x0e, 0x92, 0x2f, 0xc2, 0xb4, 0xd3, 0x6c, 0x66, 0x25, 0x07, 0xa9, 0x8a, 0x62, 0x54, 0xf0, - 0xa1, 0xce, 0x8c, 0xf6, 0xef, 0x59, 0x40, 0xe2, 0x4b, 0x52, 0xd7, 0x6b, 0x6d, 0x3a, 0x51, 0x63, - 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, 0xe8, 0x9a, 0x86, 0xa0, 0x51, 0x8b, 0xbc, 0x07, - 0x33, 0xe2, 0xdf, 0xdb, 0xfa, 0xf4, 0x35, 0xbe, 0x63, 0x32, 0xdf, 0x50, 0x38, 0x4f, 0x62, 0x16, - 0x5e, 0x8b, 0x29, 0xa0, 0x49, 0x8e, 0x75, 0xd5, 0xba, 0xb7, 0xdb, 0xee, 0xdd, 0x6f, 0xee, 0xc4, - 0x5d, 0xd5, 0x0d, 0xfc, 0x5d, 0xb7, 0x4d, 0xd3, 0x5d, 0xb5, 0x25, 0x8a, 0x51, 0xc1, 0x87, 0xeb, - 0xaa, 0x7f, 0x6d, 0xc1, 0xf9, 0xf5, 0x30, 0x72, 0xfd, 0x35, 0x1a, 0x46, 0x6c, 0x5b, 0x61, 0xc2, - 0xa7, 0xd7, 0x1e, 0xc6, 0x39, 0x7f, 0x0d, 0x16, 0xe4, 0x85, 0x6d, 0x6f, 0x27, 0xa4, 0x91, 0xa1, - 0xc7, 0xeb, 0x75, 0xbc, 0x9a, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0xde, 0xdc, 0xc6, 0x58, 0x0a, - 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2b, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0xc0, - 0x9a, 0xaf, 0x0f, 0x0a, 0xac, 0x19, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x56, 0xf3, 0xb7, 0x2d, - 0x98, 0x6f, 0x26, 0x7b, 0x3a, 0x1f, 0x03, 0x56, 0xd6, 0x18, 0x0a, 0xff, 0xb4, 0x54, 0x21, 0xa6, - 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x3e, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, 0xa1, 0x3c, - 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x26, 0xe4, 0x90, 0x9e, 0x46, 0xd4, 0x08, 0xb9, 0x07, - 0xe5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xea, 0xc2, 0x57, 0x22, - 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, 0x39, 0x8a, - 0x6e, 0xaf, 0x6e, 0xa5, 0x09, 0xcb, 0x12, 0x46, 0x58, 0xd1, 0xb2, 0x7f, 0xd3, 0x82, 0xf2, 0x75, - 0x5f, 0xc9, 0x91, 0x9f, 0xcb, 0xc1, 0xd0, 0xa3, 0xf5, 0x41, 0x7d, 0x27, 0x1b, 0x1f, 0x31, 0xde, - 0x48, 0x98, 0x79, 0x9e, 0x31, 0x70, 0x2f, 0xf3, 0x1c, 0x69, 0x0c, 0xd5, 0x75, 0x7f, 0x67, 0xa0, - 0x9d, 0xf5, 0xd7, 0x8a, 0x70, 0xe6, 0x2d, 0xe7, 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, 0xf1, 0x2a, - 0xcc, 0x38, 0x5d, 0x7e, 0xe9, 0x67, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x59, 0x2f, 0x16, - 0x68, 0x22, 0x84, 0x23, 0x4b, 0x14, 0xad, 0xa6, 0xe0, 0xd8, 0xd7, 0x82, 0x5c, 0x07, 0x22, 0x23, - 0x8e, 0xab, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, 0xec, 0xab, - 0x81, 0x19, 0xad, 0xc8, 0x67, 0x61, 0xb1, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, 0x1c, 0x3f, - 0x75, 0x50, 0xc4, 0xea, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x51, - 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x08, 0xe5, 0x68, 0x2f, - 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0x27, 0x8d, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, 0x15, 0x56, - 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, 0x54, 0xd9, - 0xaf, 0xe7, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, 0xbb, 0x13, - 0x30, 0x6b, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xd9, 0x82, 0xd9, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x16, - 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x8d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, 0x19, - 0x4c, 0x10, 0x25, 0x5f, 0xb3, 0x60, 0x3e, 0xf6, 0xe9, 0x8b, 0x0d, 0x69, 0xb9, 0x32, 0xa2, 0x45, - 0xfd, 0x95, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x21, 0x3d, 0xda, 0xac, 0x2b, 0xbb, 0x8e, - 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0xb7, 0x9c, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x41, 0xa9, 0xe3, 0x04, - 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, 0x1f, 0x83, - 0xd9, 0x4d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x5b, 0xfc, 0xb3, 0x49, 0x98, 0x31, - 0xce, 0x66, 0xa7, 0x7f, 0xce, 0x4a, 0xa4, 0x4d, 0x29, 0xe4, 0x98, 0x36, 0xe5, 0xd3, 0x00, 0xbb, - 0xae, 0xe7, 0x86, 0x7b, 0x8f, 0x98, 0x90, 0x85, 0x5f, 0x62, 0x5f, 0xd5, 0x18, 0xd0, 0xc0, 0x16, - 0xdf, 0x14, 0x16, 0x4f, 0xc8, 0x2e, 0xf6, 0x81, 0x65, 0x6c, 0x37, 0x53, 0x79, 0x78, 0x46, 0x18, - 0x03, 0xb3, 0xac, 0xb6, 0x1f, 0x71, 0x89, 0x73, 0xd2, 0xae, 0xb4, 0x0d, 0xa5, 0x80, 0x86, 0xbd, - 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0d, 0xdc, 0x47, 0x05, 0x65, 0x7b, 0xd4, 0x98, 0x96, 0x5e, - 0x87, 0x33, 0x09, 0x16, 0x46, 0xba, 0xbe, 0xf1, 0x21, 0xd3, 0x00, 0xf0, 0x28, 0x97, 0x39, 0x6c, - 0x2c, 0xda, 0x46, 0x46, 0x16, 0x3d, 0x16, 0xc2, 0x13, 0x49, 0xc0, 0xec, 0x1f, 0x4d, 0x81, 0xbc, - 0xec, 0x1f, 0x42, 0x5c, 0x99, 0x57, 0x7c, 0x13, 0x8f, 0x70, 0xc5, 0x77, 0x1d, 0x66, 0x5d, 0xcf, - 0x8d, 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xae, 0xda, 0xb3, 0xeb, 0x06, 0x2c, 0x03, - 0x4f, 0xa2, 0x2d, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x09, 0x3c, 0xba, 0x47, 0x02, 0x77, 0x46, - 0x11, 0xf1, 0x5b, 0x02, 0x13, 0x3f, 0x7c, 0x88, 0x94, 0x34, 0xfa, 0xf8, 0x2d, 0xe7, 0x71, 0x7c, - 0xf8, 0x48, 0xc1, 0xb1, 0xaf, 0x05, 0xc3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, 0x2c, 0x53, - 0x49, 0x2c, 0x57, 0x53, 0x70, 0xec, 0x6b, 0x41, 0x76, 0x61, 0x56, 0x96, 0x09, 0xff, 0xb2, 0xe9, - 0x47, 0xfc, 0x4a, 0xee, 0x47, 0x78, 0xd5, 0xc0, 0x84, 0x09, 0xbc, 0xa4, 0x07, 0x67, 0x5d, 0xaf, - 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x3c, 0xf5, 0x28, 0xc4, 0x2e, 0x1c, 0x1f, - 0x55, 0xce, 0xae, 0xa7, 0xd1, 0x61, 0x3f, 0x05, 0xf2, 0x25, 0x0b, 0x2e, 0x34, 0x7c, 0x2f, 0xe4, - 0x39, 0x1e, 0x0e, 0xe8, 0x95, 0x20, 0xf0, 0x03, 0x41, 0xbb, 0xfc, 0x88, 0xb4, 0xb9, 0x4d, 0x71, - 0x35, 0x0b, 0x25, 0x66, 0x53, 0x22, 0xef, 0x42, 0xa9, 0x1b, 0xf8, 0x07, 0x6e, 0x93, 0x06, 0xd2, - 0x57, 0x71, 0x23, 0x8f, 0x9c, 0x33, 0x5b, 0x12, 0x67, 0x2c, 0x7a, 0x54, 0x09, 0x6a, 0x7a, 0xf6, - 0xff, 0x9e, 0x81, 0xb9, 0x64, 0x75, 0xf2, 0x0b, 0x00, 0xdd, 0xc0, 0xef, 0xd0, 0x68, 0x8f, 0xea, - 0x20, 0x98, 0x1b, 0xe3, 0xa6, 0x36, 0x51, 0xf8, 0x94, 0x7f, 0x0f, 0x13, 0x17, 0x71, 0x29, 0x1a, - 0x14, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x5b, 0xb9, 0xe8, 0x4c, 0x92, 0x32, - 0x8f, 0xde, 0x90, 0x45, 0xa8, 0x08, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, 0xd5, 0xdf, - 0xa1, 0xf2, 0x34, 0x53, 0x9b, 0x3e, 0x3e, 0xaa, 0x14, 0xee, 0xd0, 0x1d, 0x64, 0xc8, 0xd9, 0x77, - 0x35, 0xc5, 0x25, 0xbf, 0x14, 0x15, 0x6f, 0xe5, 0xe8, 0x31, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x22, - 0x44, 0xde, 0x85, 0xf2, 0x3d, 0xe7, 0x80, 0xee, 0x06, 0xbe, 0x17, 0x49, 0xa7, 0xb2, 0x31, 0xe3, - 0x22, 0xee, 0x28, 0x74, 0x92, 0x2e, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xe4, 0xc8, 0x01, 0x94, 0x3c, - 0x7a, 0x0f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x87, 0x70, 0x43, 0x62, 0x93, 0x94, 0xf9, 0xbe, 0xa7, - 0xca, 0x50, 0xd3, 0x62, 0x63, 0x79, 0xd7, 0xdf, 0x91, 0x82, 0x6a, 0xcc, 0xb1, 0xd4, 0x27, 0x53, - 0x31, 0x96, 0xd7, 0xfd, 0x1d, 0x64, 0xc8, 0xd9, 0x1a, 0x69, 0x68, 0x8f, 0x26, 0x29, 0xa6, 0x6e, - 0xe4, 0xeb, 0xc9, 0x25, 0xd6, 0x48, 0x5c, 0x8a, 0x06, 0x45, 0xd6, 0xb7, 0x2d, 0x69, 0xac, 0x94, - 0x82, 0x6a, 0xcc, 0xbe, 0x4d, 0x9a, 0x3e, 0x45, 0xdf, 0xaa, 0x32, 0xd4, 0xb4, 0x18, 0x5d, 0x57, - 0x5a, 0xfe, 0xf2, 0x11, 0x55, 0x49, 0x3b, 0xa2, 0xa0, 0xab, 0xca, 0x50, 0xd3, 0x62, 0xfd, 0x1d, - 0xee, 0x1f, 0xde, 0x73, 0xda, 0xfb, 0xae, 0xd7, 0x92, 0x41, 0x9d, 0xe3, 0x66, 0x30, 0xde, 0x3f, - 0xbc, 0x23, 0xf0, 0x99, 0xfd, 0x1d, 0x97, 0xa2, 0x41, 0x91, 0xfc, 0x03, 0x0b, 0xa6, 0xba, 0xed, - 0x5e, 0xcb, 0xf5, 0x16, 0x67, 0xf3, 0xf0, 0xf6, 0x49, 0x8a, 0xdc, 0xe5, 0x2d, 0x8e, 0x5a, 0x28, - 0x8a, 0x3f, 0xad, 0x1d, 0x14, 0x79, 0xe1, 0x2f, 0xfd, 0x69, 0x65, 0x91, 0x7a, 0x0d, 0xbf, 0xe9, - 0x7a, 0xad, 0x95, 0xbb, 0xa1, 0xef, 0x2d, 0xa3, 0x73, 0x4f, 0xe9, 0xe8, 0x92, 0xa7, 0xa5, 0x4f, - 0xc0, 0x8c, 0x81, 0xe2, 0x61, 0x8a, 0xde, 0xac, 0xa9, 0xe8, 0xfd, 0xe6, 0x14, 0xcc, 0x9a, 0x59, - 0x13, 0x87, 0xd0, 0xbe, 0xf4, 0x89, 0x63, 0x62, 0x94, 0x13, 0x07, 0x3b, 0x62, 0x1a, 0xb7, 0x47, - 0xca, 0xbc, 0xb5, 0x9e, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x44, 0x47, 0x70, - 0x28, 0x61, 0x6a, 0xab, 0x50, 0xec, 0x8a, 0x49, 0xb5, 0x35, 0xa1, 0xaa, 0x5d, 0x06, 0x88, 0xb3, - 0x07, 0xca, 0x5b, 0x45, 0xad, 0x0f, 0x1b, 0x59, 0x0d, 0x8d, 0x5a, 0xe4, 0x05, 0x98, 0x62, 0xaa, - 0x0f, 0x6d, 0xca, 0x98, 0x73, 0x7d, 0x8e, 0xbf, 0xca, 0x4b, 0x51, 0x42, 0xc9, 0x6b, 0x4c, 0x4b, - 0x8d, 0x15, 0x16, 0x19, 0x4a, 0x7e, 0x3e, 0xd6, 0x52, 0x63, 0x18, 0x26, 0x6a, 0x32, 0xd6, 0x29, - 0xd3, 0x2f, 0xb8, 0x6c, 0x30, 0x58, 0xe7, 0x4a, 0x07, 0x0a, 0x18, 0xb7, 0x2b, 0xa5, 0xf4, 0x11, - 0xbe, 0xa6, 0x8b, 0x86, 0x5d, 0x29, 0x05, 0xc7, 0xbe, 0x16, 0xec, 0x63, 0xe4, 0x85, 0xe8, 0x8c, - 0xf0, 0x2c, 0x1e, 0x70, 0x95, 0xf9, 0x15, 0xf3, 0xac, 0x95, 0xe3, 0x1a, 0x12, 0xb3, 0x76, 0xf8, - 0xc3, 0xd6, 0x78, 0xc7, 0xa2, 0xcf, 0xc1, 0x5c, 0x72, 0x17, 0xca, 0xfd, 0xe6, 0xe3, 0xab, 0x93, - 0x70, 0xee, 0x46, 0xcb, 0xf5, 0xd2, 0x19, 0xc1, 0xb2, 0x12, 0xc2, 0x5b, 0x23, 0x27, 0x84, 0xd7, - 0xc1, 0x6b, 0x32, 0xdd, 0x7a, 0x76, 0xf0, 0x9a, 0xca, 0x7d, 0x9f, 0xac, 0x4b, 0xfe, 0xc4, 0x82, - 0x67, 0x9c, 0xa6, 0x38, 0x17, 0x38, 0x6d, 0x59, 0x6a, 0xe4, 0x31, 0x96, 0x2b, 0x3a, 0x1c, 0x73, - 0x97, 0xef, 0xff, 0xf8, 0xe5, 0xea, 0x09, 0x54, 0xc5, 0x88, 0xff, 0x94, 0xfc, 0x82, 0x67, 0x4e, - 0xaa, 0x8a, 0x27, 0xb2, 0x4f, 0xfe, 0x1a, 0xcc, 0x27, 0x3e, 0x58, 0x5a, 0xc2, 0xcb, 0xe2, 0xc2, - 0xa2, 0x9e, 0x04, 0x61, 0xba, 0xee, 0xd2, 0x4d, 0xf8, 0xf0, 0x43, 0xf9, 0x1c, 0x69, 0xb2, 0x7d, - 0xd7, 0x82, 0x59, 0x33, 0x79, 0x0f, 0x79, 0x09, 0x4a, 0x91, 0xbf, 0x4f, 0xbd, 0xdb, 0x81, 0xf2, - 0x6c, 0xd5, 0x13, 0x7d, 0x9b, 0x97, 0xe3, 0x06, 0xea, 0x1a, 0xac, 0x76, 0xa3, 0xed, 0x52, 0x2f, - 0x5a, 0x6f, 0xca, 0x61, 0xd6, 0xb5, 0x57, 0x45, 0xf9, 0x1a, 0xea, 0x1a, 0xc2, 0x81, 0x8d, 0xfd, - 0xae, 0xd3, 0x46, 0x40, 0x95, 0x1f, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x51, 0x93, 0xd8, 0xda, - 0xc4, 0x39, 0x19, 0xdf, 0x6b, 0xa4, 0x4c, 0x92, 0x5f, 0xb6, 0xa0, 0x2c, 0x4c, 0xf4, 0x48, 0x77, - 0x53, 0xbe, 0xa8, 0x29, 0x23, 0x42, 0x75, 0x6b, 0x3d, 0xc3, 0x17, 0x95, 0x6d, 0x4b, 0xfb, 0xae, - 0xa7, 0xbe, 0x44, 0x6f, 0x4b, 0x6f, 0xb9, 0x5e, 0x13, 0x39, 0x44, 0x6f, 0x5c, 0x85, 0x81, 0xa6, - 0xb3, 0x5f, 0xb7, 0x60, 0x8e, 0xc7, 0x2e, 0xc7, 0xc7, 0xdb, 0x57, 0xb5, 0xdf, 0x94, 0x60, 0xe3, - 0xd9, 0xa4, 0xdf, 0xd4, 0x83, 0xa3, 0xca, 0x8c, 0x88, 0x76, 0x4e, 0xba, 0x51, 0x7d, 0x46, 0xda, - 0xc4, 0xb8, 0x77, 0xd7, 0xc4, 0xc8, 0x26, 0x1b, 0x6d, 0x33, 0xae, 0x2b, 0x24, 0x18, 0xe3, 0xb3, - 0xdf, 0x83, 0x59, 0x33, 0x08, 0x89, 0xbc, 0x0a, 0x33, 0x5d, 0xd7, 0x6b, 0x25, 0x83, 0x55, 0xf5, - 0xbd, 0xc1, 0x56, 0x0c, 0x42, 0xb3, 0x1e, 0x6f, 0xe6, 0xc7, 0xcd, 0x52, 0xd7, 0x0d, 0x5b, 0xbe, - 0xd9, 0x2c, 0xfe, 0xc3, 0x53, 0xc2, 0x67, 0x04, 0xbb, 0xe5, 0x9e, 0x12, 0x3e, 0x83, 0xc6, 0x8f, - 0x2f, 0x25, 0x7c, 0x16, 0x33, 0xff, 0x77, 0xa5, 0x84, 0xff, 0x59, 0x18, 0x35, 0x17, 0x28, 0xdb, - 0xba, 0xef, 0x99, 0x09, 0x05, 0x74, 0x8f, 0xcb, 0x8c, 0x02, 0x12, 0x6a, 0x7f, 0xa7, 0x00, 0x0b, - 0xe9, 0x13, 0x7c, 0xde, 0xce, 0x11, 0xe4, 0x6b, 0x16, 0xcc, 0x39, 0x89, 0xbc, 0x6b, 0x39, 0xbd, - 0x2f, 0x93, 0xc0, 0x69, 0xe4, 0xfd, 0x4a, 0x94, 0x63, 0x8a, 0x36, 0xf9, 0x4b, 0x30, 0x1d, 0xb9, - 0x1d, 0xea, 0xf7, 0x84, 0x5d, 0xaf, 0x20, 0xce, 0xd7, 0xdb, 0xa2, 0x08, 0x15, 0x8c, 0xc9, 0x58, - 0x97, 0x2b, 0x44, 0x01, 0x95, 0x5e, 0xb4, 0x0b, 0xb1, 0x21, 0x52, 0x94, 0xa3, 0xae, 0x41, 0xee, - 0xc3, 0xb4, 0x70, 0xa3, 0x50, 0xfe, 0x32, 0x9b, 0x39, 0x59, 0x1a, 0x84, 0xa7, 0x46, 0x3c, 0x04, - 0xe2, 0x7f, 0x88, 0x8a, 0x9c, 0xfd, 0x31, 0x18, 0x31, 0x39, 0xaa, 0x7d, 0x05, 0x08, 0xfa, 0xed, - 0xf6, 0x8e, 0xd3, 0xd8, 0xbf, 0xe3, 0x7a, 0x4d, 0xff, 0x1e, 0x17, 0x45, 0x2b, 0x50, 0x0e, 0x64, - 0xa8, 0x68, 0x28, 0x67, 0x8d, 0x96, 0x65, 0x2a, 0x86, 0x34, 0xc4, 0xb8, 0x8e, 0xfd, 0x07, 0x13, - 0x30, 0x2d, 0xe3, 0x9a, 0x1f, 0x83, 0x17, 0xff, 0x7e, 0xe2, 0x7a, 0x77, 0x3d, 0x97, 0x70, 0xec, - 0x81, 0x2e, 0xfc, 0x61, 0xca, 0x85, 0xff, 0xad, 0x7c, 0xc8, 0x9d, 0xec, 0xbf, 0xff, 0xfb, 0x45, - 0x98, 0x4f, 0xc5, 0x89, 0x33, 0xd5, 0xba, 0xcf, 0x6d, 0xf5, 0x76, 0xae, 0xa1, 0xe8, 0x3a, 0x06, - 0xe7, 0x64, 0x0f, 0xd6, 0x30, 0x91, 0xca, 0xfa, 0x56, 0x6e, 0xaf, 0x74, 0xfc, 0x45, 0x56, 0xeb, - 0x11, 0x3d, 0x32, 0xc9, 0xb7, 0x2c, 0x38, 0xe7, 0xf4, 0x3f, 0x73, 0x22, 0x4d, 0x80, 0xb7, 0x72, - 0x7f, 0x3f, 0xa5, 0xf6, 0xb4, 0x64, 0x32, 0xeb, 0x35, 0x19, 0xcc, 0x62, 0xc5, 0xfe, 0x4f, 0x16, - 0x3c, 0x35, 0x30, 0xe3, 0x01, 0x4f, 0x98, 0x15, 0x24, 0xa1, 0x52, 0x66, 0xe4, 0x9c, 0xd7, 0x45, - 0x5f, 0x07, 0xa7, 0x73, 0x1c, 0xa5, 0xc9, 0x93, 0x57, 0x60, 0x96, 0xeb, 0x68, 0x4c, 0x7a, 0x46, - 0xb4, 0x2b, 0x6f, 0xb3, 0xf8, 0xbd, 0x46, 0xdd, 0x28, 0xc7, 0x44, 0x2d, 0xfb, 0x5b, 0x16, 0x2c, - 0x0e, 0x4a, 0x9f, 0x34, 0x84, 0xad, 0xe5, 0xaf, 0xa6, 0x22, 0x21, 0x2a, 0x7d, 0x91, 0x10, 0x29, - 0x6b, 0x8b, 0x0a, 0x7a, 0x30, 0x0c, 0x1d, 0x85, 0x87, 0x38, 0xfa, 0x7f, 0xdd, 0x82, 0x27, 0x07, - 0x2c, 0xf8, 0xbe, 0x88, 0x18, 0xeb, 0x91, 0x23, 0x62, 0x26, 0x86, 0x8d, 0x88, 0xb1, 0xff, 0xb0, - 0x00, 0x0b, 0x92, 0x9f, 0x58, 0x51, 0x7f, 0x2d, 0x11, 0x4f, 0xf2, 0x53, 0xa9, 0x78, 0x92, 0xf3, - 0xe9, 0xfa, 0x7f, 0x11, 0x4c, 0xf2, 0x93, 0x15, 0x4c, 0xf2, 0xe7, 0x13, 0x70, 0x21, 0x33, 0xab, - 0x13, 0xf9, 0x6a, 0xc6, 0xee, 0x75, 0x27, 0xe7, 0xf4, 0x51, 0x43, 0xee, 0x5f, 0xe3, 0x46, 0x60, - 0xfc, 0xaa, 0x19, 0xf9, 0x20, 0x76, 0xa3, 0xdd, 0x53, 0x48, 0x84, 0x35, 0x62, 0x10, 0x84, 0xfd, - 0x4b, 0x05, 0xb8, 0x34, 0x2c, 0xa2, 0x9f, 0xd0, 0x20, 0xb9, 0x30, 0x11, 0x24, 0xf7, 0x98, 0x34, - 0x8b, 0x53, 0x89, 0x97, 0xfb, 0x47, 0x93, 0x7a, 0xdb, 0xeb, 0x9f, 0x9f, 0x43, 0xb9, 0x3e, 0x4c, - 0x33, 0xed, 0x53, 0x25, 0xc4, 0x8e, 0x45, 0xe1, 0x74, 0x5d, 0x14, 0x3f, 0x38, 0xaa, 0x9c, 0x8d, - 0x73, 0x8b, 0xc8, 0x42, 0x54, 0x8d, 0xc8, 0x25, 0x28, 0x05, 0x02, 0xaa, 0xc2, 0x82, 0xa4, 0xff, - 0x88, 0x28, 0x43, 0x0d, 0x25, 0x5f, 0x34, 0xd4, 0xf5, 0xc9, 0xd3, 0x4a, 0xa1, 0x73, 0x92, 0x5b, - 0xcc, 0x3b, 0x50, 0x0a, 0x55, 0xd6, 0x66, 0xa1, 0xb8, 0xbc, 0x3c, 0x64, 0xb4, 0x19, 0x3b, 0x83, - 0xab, 0x14, 0xce, 0xe2, 0xfb, 0x74, 0x82, 0x67, 0x8d, 0x92, 0xd8, 0xfa, 0xf8, 0x2b, 0xcc, 0xf6, - 0xd0, 0x7f, 0xf4, 0x25, 0x11, 0x4c, 0xcb, 0xc7, 0x3c, 0xe5, 0x7d, 0xe2, 0x66, 0x4e, 0x91, 0x25, - 0xd2, 0xef, 0x98, 0x9f, 0x2a, 0x95, 0x19, 0x46, 0x91, 0xb2, 0xbf, 0x6f, 0xc1, 0x8c, 0x9c, 0x23, - 0x8f, 0x21, 0xec, 0xee, 0x6e, 0x32, 0xec, 0xee, 0x4a, 0x2e, 0x12, 0x6b, 0x40, 0xcc, 0xdd, 0x5d, - 0x98, 0x35, 0xd3, 0x09, 0x92, 0x4f, 0x1b, 0x12, 0xd7, 0x1a, 0x27, 0x41, 0x97, 0x92, 0xc9, 0xb1, - 0x34, 0xb6, 0x7f, 0xab, 0xac, 0x7b, 0x91, 0x9f, 0x5d, 0xcd, 0x99, 0x6f, 0x9d, 0x38, 0xf3, 0xcd, - 0x89, 0x37, 0x91, 0xff, 0xc4, 0xbb, 0x05, 0x25, 0x25, 0x16, 0xa5, 0xf2, 0xf0, 0xbc, 0xe9, 0x88, - 0xcc, 0x34, 0x10, 0x86, 0xcc, 0x58, 0x2e, 0xfc, 0x0c, 0x1a, 0xdb, 0x7a, 0x95, 0xb8, 0xd6, 0x68, - 0xc8, 0xbb, 0x30, 0x73, 0xcf, 0x0f, 0xf6, 0xdb, 0xbe, 0xc3, 0x53, 0xe5, 0x43, 0x1e, 0x77, 0xdf, - 0xda, 0x5e, 0x2b, 0xa2, 0x41, 0xee, 0xc4, 0xf8, 0xd1, 0x24, 0x46, 0xaa, 0x30, 0xdf, 0x71, 0x3d, - 0xa4, 0x4e, 0x53, 0x47, 0xd7, 0x4d, 0x8a, 0x34, 0xd5, 0x4a, 0xb5, 0xde, 0x4c, 0x82, 0x31, 0x5d, - 0x9f, 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0xe6, 0xa2, 0xdd, 0x1a, 0x7f, 0x32, 0x26, 0x2d, 0x18, - 0x22, 0x1c, 0x22, 0x59, 0x8e, 0x29, 0xda, 0xe4, 0x0b, 0x50, 0x0a, 0x65, 0xae, 0xc0, 0x7c, 0x9c, - 0x26, 0xf4, 0xd9, 0x5e, 0x20, 0x8d, 0x87, 0x52, 0x95, 0xa0, 0x26, 0x48, 0x36, 0xe0, 0xbc, 0x32, - 0x9f, 0x24, 0x9e, 0x33, 0x9b, 0x8a, 0x53, 0x4b, 0x61, 0x06, 0x1c, 0x33, 0x5b, 0x31, 0x55, 0x8e, - 0xa7, 0xe9, 0x14, 0x77, 0x8d, 0xc6, 0xf5, 0x1c, 0x5f, 0x7f, 0x4d, 0x94, 0xd0, 0x93, 0x82, 0x47, - 0x4b, 0x63, 0x04, 0x8f, 0xd6, 0xe1, 0x42, 0x1a, 0xc4, 0x73, 0x86, 0xf1, 0x34, 0x65, 0xc6, 0x16, - 0xba, 0x95, 0x55, 0x09, 0xb3, 0xdb, 0x92, 0x3b, 0x50, 0x0e, 0x28, 0x3f, 0x64, 0x55, 0x95, 0x9b, - 0xd6, 0xc8, 0x0e, 0xa9, 0xa8, 0x10, 0x60, 0x8c, 0x8b, 0x8d, 0xbb, 0x93, 0x4c, 0x1c, 0x7d, 0x2b, - 0xc7, 0x77, 0x74, 0xe5, 0xd8, 0x0f, 0xc8, 0xe5, 0x67, 0xff, 0x9b, 0x79, 0x38, 0x93, 0xb0, 0x01, - 0x91, 0xe7, 0xa1, 0xc8, 0x93, 0xa8, 0x71, 0x69, 0x55, 0x8a, 0x25, 0xaa, 0xe8, 0x1c, 0x01, 0x23, - 0xbf, 0x6c, 0xc1, 0x7c, 0x37, 0x71, 0xa7, 0xa1, 0x04, 0xf9, 0x98, 0x86, 0xd3, 0xe4, 0x45, 0x89, - 0xf1, 0xe4, 0x42, 0x92, 0x18, 0xa6, 0xa9, 0x33, 0x79, 0x20, 0xbd, 0xba, 0xdb, 0x34, 0xe0, 0xb5, - 0xa5, 0xa2, 0xa7, 0x51, 0xac, 0x26, 0xc1, 0x98, 0xae, 0xcf, 0x46, 0x98, 0x7f, 0xdd, 0x38, 0x2f, - 0x35, 0x56, 0x15, 0x02, 0x8c, 0x71, 0x91, 0x37, 0x60, 0x4e, 0xe6, 0x0b, 0xde, 0xf2, 0x9b, 0xd7, - 0x9c, 0x70, 0x4f, 0x9e, 0x70, 0xf4, 0x89, 0x6c, 0x35, 0x01, 0xc5, 0x54, 0x6d, 0xfe, 0x6d, 0x71, - 0x52, 0x66, 0x8e, 0x60, 0x2a, 0xf9, 0x22, 0xc5, 0x6a, 0x12, 0x8c, 0xe9, 0xfa, 0xe4, 0x25, 0x63, - 0x1b, 0x12, 0xf7, 0xff, 0x5a, 0x1a, 0x64, 0x6c, 0x45, 0x55, 0x98, 0xef, 0xf1, 0x03, 0x61, 0x53, - 0x01, 0xe5, 0x7a, 0xd4, 0x04, 0x6f, 0x27, 0xc1, 0x98, 0xae, 0x4f, 0x5e, 0x87, 0x33, 0x01, 0x13, - 0xb6, 0x1a, 0x81, 0x70, 0x0a, 0xd0, 0x77, 0xbe, 0x68, 0x02, 0x31, 0x59, 0x97, 0xbc, 0x09, 0x67, - 0xe3, 0xf4, 0x9a, 0x0a, 0x81, 0xf0, 0x12, 0xd0, 0xb9, 0xde, 0xaa, 0xe9, 0x0a, 0xd8, 0xdf, 0x86, - 0xfc, 0x0d, 0x58, 0x30, 0x7a, 0x62, 0xdd, 0x6b, 0xd2, 0xfb, 0x32, 0x05, 0x22, 0x7f, 0x61, 0x69, - 0x35, 0x05, 0xc3, 0xbe, 0xda, 0xe4, 0x93, 0x30, 0xd7, 0xf0, 0xdb, 0x6d, 0x2e, 0xe3, 0xc4, 0x6b, - 0x08, 0x22, 0xd7, 0xa1, 0xc8, 0x0a, 0x99, 0x80, 0x60, 0xaa, 0x26, 0xb9, 0x0e, 0xc4, 0xdf, 0x61, - 0xea, 0x15, 0x6d, 0xbe, 0x49, 0x3d, 0x2a, 0x35, 0x8e, 0x33, 0xc9, 0x98, 0x92, 0x9b, 0x7d, 0x35, - 0x30, 0xa3, 0x15, 0x4f, 0x15, 0x67, 0xc4, 0xe0, 0xce, 0xe5, 0xf1, 0x6a, 0x61, 0xda, 0x7c, 0xf1, - 0xd0, 0x00, 0xdc, 0x00, 0xa6, 0x44, 0x88, 0x4f, 0x3e, 0x49, 0x0f, 0xcd, 0xc4, 0xe8, 0xf1, 0x1e, - 0x21, 0x4a, 0x51, 0x52, 0x22, 0xbf, 0x00, 0xe5, 0x1d, 0xf5, 0x4a, 0x06, 0xcf, 0x74, 0x38, 0xf6, - 0xbe, 0x98, 0x7a, 0xf0, 0x25, 0x3e, 0x9e, 0x6b, 0x00, 0xc6, 0x24, 0xc9, 0x0b, 0x30, 0x73, 0x6d, - 0xab, 0xaa, 0x67, 0xe1, 0x59, 0x3e, 0xfa, 0x93, 0xac, 0x09, 0x9a, 0x00, 0xb6, 0xc2, 0xb4, 0xfa, - 0x46, 0x92, 0x17, 0xdf, 0x19, 0xda, 0x18, 0xab, 0xcd, 0x6f, 0xf2, 0xb1, 0xbe, 0x78, 0x2e, 0x55, - 0x5b, 0x96, 0xa3, 0xae, 0x41, 0xde, 0x81, 0x19, 0xb9, 0x5f, 0x70, 0xd9, 0x74, 0xfe, 0xd1, 0xe2, - 0xbb, 0x31, 0x46, 0x81, 0x26, 0x3e, 0x7e, 0x67, 0xcb, 0x1f, 0x0f, 0xa0, 0x57, 0x7b, 0xed, 0xf6, - 0xe2, 0x05, 0x2e, 0x37, 0xe3, 0x3b, 0xdb, 0x18, 0x84, 0x66, 0x3d, 0xf2, 0xb2, 0xf2, 0xc8, 0xfa, - 0x50, 0xe2, 0x12, 0x5b, 0x7b, 0x64, 0x69, 0xa5, 0x7b, 0x40, 0x08, 0xc8, 0x93, 0x0f, 0x71, 0x85, - 0xda, 0x81, 0x25, 0xa5, 0xf1, 0xf5, 0x2f, 0x92, 0xc5, 0xc5, 0x84, 0xa9, 0x64, 0xe9, 0xce, 0xc0, - 0x9a, 0x78, 0x02, 0x16, 0xb2, 0x03, 0x05, 0xa7, 0xbd, 0xb3, 0xf8, 0x54, 0x1e, 0xaa, 0x6b, 0x75, - 0xa3, 0x26, 0x67, 0x14, 0x77, 0xdb, 0xac, 0x6e, 0xd4, 0x90, 0x21, 0x27, 0x2e, 0x4c, 0x3a, 0xed, - 0x9d, 0x70, 0x71, 0x89, 0xaf, 0xd9, 0xdc, 0x88, 0xc4, 0xc6, 0x83, 0x8d, 0x5a, 0x88, 0x9c, 0x84, - 0xfd, 0xa5, 0x09, 0x7d, 0x51, 0xa3, 0xf3, 0x4e, 0xbf, 0x67, 0x2e, 0x20, 0x2b, 0x8f, 0xd7, 0xec, - 0xfb, 0x5e, 0xad, 0x11, 0x7b, 0x5f, 0xe6, 0xf2, 0xe9, 0x6a, 0x91, 0x91, 0x4b, 0x92, 0xab, 0x64, - 0x4e, 0x6d, 0x71, 0x7a, 0x4e, 0x0a, 0x0c, 0xfb, 0x3b, 0xa0, 0x8d, 0x7e, 0x29, 0x6f, 0xa6, 0x00, - 0x8a, 0x6e, 0x18, 0xb9, 0x7e, 0x8e, 0x61, 0xcf, 0xa9, 0x64, 0xd4, 0x3c, 0xaa, 0x82, 0x03, 0x50, - 0x90, 0x62, 0x34, 0xbd, 0x96, 0xeb, 0xdd, 0x97, 0x9f, 0x7f, 0x2b, 0x77, 0x37, 0x25, 0x41, 0x93, - 0x03, 0x50, 0x90, 0x22, 0x77, 0xc5, 0xa4, 0x2e, 0xe4, 0x31, 0xd6, 0xd5, 0x8d, 0x5a, 0x8a, 0x5e, - 0x72, 0x72, 0xdf, 0x85, 0x42, 0xd8, 0x71, 0xa5, 0xba, 0x34, 0x26, 0xad, 0xfa, 0xe6, 0x7a, 0x16, - 0xad, 0xfa, 0xe6, 0x3a, 0x32, 0x22, 0xe4, 0x2b, 0x16, 0x80, 0xd3, 0xd9, 0x71, 0xc2, 0xd0, 0x69, - 0x6a, 0xeb, 0xcc, 0x98, 0x8f, 0x4c, 0x54, 0x35, 0xbe, 0x14, 0x69, 0xee, 0x98, 0x1b, 0x43, 0xd1, - 0xa0, 0x4c, 0xde, 0x85, 0x69, 0x47, 0xbc, 0xe2, 0x27, 0x7d, 0xcc, 0xf3, 0x79, 0x9a, 0x32, 0xc5, - 0x01, 0x37, 0xd3, 0x48, 0x10, 0x2a, 0x82, 0x8c, 0x76, 0x14, 0x38, 0x74, 0xd7, 0xdd, 0x97, 0xc6, - 0xa1, 0xfa, 0xd8, 0xef, 0x4c, 0x30, 0x64, 0x59, 0xb4, 0x25, 0x08, 0x15, 0x41, 0xf1, 0xaa, 0xba, - 0xe3, 0x39, 0x3a, 0x72, 0x30, 0x9f, 0xf8, 0x52, 0x33, 0x16, 0xd1, 0x78, 0x55, 0xdd, 0x24, 0x84, - 0x49, 0xba, 0xe4, 0x00, 0xa6, 0x1c, 0xfe, 0xbe, 0xa8, 0x3c, 0x8a, 0x61, 0x1e, 0x6f, 0x95, 0xa6, - 0xfa, 0x80, 0x0b, 0x17, 0xf9, 0x8a, 0xa9, 0xa4, 0x46, 0x7e, 0xc3, 0x82, 0x69, 0xe1, 0xfe, 0xcc, - 0x14, 0x52, 0xf6, 0xed, 0x9f, 0x3b, 0x85, 0xa4, 0xf6, 0xd2, 0x35, 0x5b, 0x7a, 0x00, 0x7d, 0x44, - 0xfb, 0x76, 0x8a, 0xd2, 0x13, 0x9d, 0xb3, 0x15, 0x77, 0x4b, 0x9f, 0x84, 0x59, 0x13, 0xcb, 0x48, - 0xee, 0xd9, 0x3f, 0x2c, 0x00, 0xf0, 0x8e, 0x16, 0xb9, 0x42, 0x3a, 0x3c, 0x03, 0xef, 0x9e, 0xdf, - 0xcc, 0xe9, 0x2d, 0x42, 0x23, 0xe5, 0x07, 0xc8, 0x74, 0xbb, 0x7b, 0x7e, 0x13, 0x25, 0x11, 0xd2, - 0x82, 0xc9, 0xae, 0x13, 0xed, 0xe5, 0x9f, 0x5f, 0xa4, 0x24, 0x82, 0x66, 0xa3, 0x3d, 0xe4, 0x04, - 0xc8, 0xfb, 0x56, 0xec, 0x1a, 0x53, 0xc8, 0xc7, 0x81, 0x41, 0xf5, 0xd9, 0xb2, 0x74, 0x86, 0x49, - 0xe5, 0xd2, 0x4c, 0xbb, 0xc8, 0x2c, 0x7d, 0x60, 0xc1, 0xac, 0x59, 0x35, 0x63, 0x98, 0x7e, 0xde, - 0x1c, 0xa6, 0x3c, 0xfb, 0xc3, 0x1c, 0xf1, 0xff, 0x6a, 0x81, 0xf1, 0xd2, 0x7f, 0xec, 0x85, 0x6e, - 0x0d, 0xed, 0x85, 0x3e, 0x31, 0xa2, 0x17, 0x7a, 0x61, 0x24, 0x2f, 0xf4, 0xc9, 0xd1, 0xbd, 0xd0, - 0x8b, 0x83, 0xbd, 0xd0, 0xed, 0x6f, 0x58, 0x70, 0xb6, 0x6f, 0xb7, 0x61, 0x7a, 0x70, 0xe0, 0xfb, - 0xd1, 0x00, 0x97, 0x47, 0x8c, 0x41, 0x68, 0xd6, 0x23, 0x6b, 0xb0, 0x20, 0xdf, 0x9b, 0xa8, 0x77, - 0xdb, 0x6e, 0x66, 0xee, 0x97, 0xed, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0xb1, 0x60, 0xc6, 0x88, - 0x18, 0x67, 0xdf, 0xc1, 0xdd, 0x58, 0x25, 0x1b, 0xf1, 0x53, 0x1b, 0xfc, 0xa2, 0x4a, 0xc0, 0xc4, - 0x9d, 0x69, 0xcb, 0xc8, 0x46, 0x1e, 0xdf, 0x99, 0xb2, 0x52, 0x94, 0x50, 0x91, 0x67, 0x9a, 0x76, - 0x79, 0xa7, 0x17, 0xcc, 0x3c, 0xd3, 0xb4, 0x8b, 0x1c, 0xc2, 0xc9, 0xb1, 0x03, 0x81, 0x0c, 0x50, - 0x30, 0x5e, 0xf6, 0x70, 0x82, 0x08, 0x05, 0x8c, 0x3c, 0x0b, 0x05, 0xea, 0x35, 0xa5, 0xf5, 0x42, - 0xbf, 0xbd, 0x79, 0xc5, 0x6b, 0x22, 0x2b, 0xb7, 0x6f, 0xc2, 0xac, 0xf0, 0xce, 0x7d, 0x8b, 0x1e, - 0x0e, 0xfd, 0x98, 0x27, 0x9b, 0xed, 0xa9, 0xc7, 0x3c, 0x59, 0x73, 0x56, 0x6e, 0xff, 0x53, 0x0b, - 0x52, 0xcf, 0xcf, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, 0x71, 0xa2, 0xcd, - 0xfd, 0x3a, 0x90, 0x0e, 0x5b, 0x0a, 0x89, 0xc7, 0x96, 0xa4, 0xe1, 0x28, 0xce, 0x4f, 0xd1, 0x57, - 0x03, 0x33, 0x5a, 0xd9, 0xff, 0x44, 0x30, 0x6b, 0x3e, 0x48, 0xf3, 0xf0, 0x0e, 0xe8, 0x41, 0x91, - 0xa3, 0x92, 0xd6, 0xb3, 0x31, 0x2d, 0xcf, 0xfd, 0x79, 0x9e, 0xe2, 0x81, 0x94, 0x4b, 0x9e, 0x53, - 0xb3, 0xff, 0x50, 0xf0, 0x6a, 0xbc, 0x58, 0x33, 0x04, 0xaf, 0x9d, 0x24, 0xaf, 0xd7, 0xf2, 0x92, - 0x95, 0xd9, 0x3c, 0x92, 0x65, 0x80, 0x2e, 0x0d, 0x1a, 0xd4, 0x8b, 0x54, 0xdc, 0x4c, 0x51, 0x46, - 0x70, 0xea, 0x52, 0x34, 0x6a, 0xd8, 0x5f, 0x67, 0x0b, 0x28, 0x7e, 0xe6, 0x96, 0x5c, 0x4a, 0xfb, - 0x8a, 0xa6, 0x17, 0x87, 0x76, 0x15, 0x35, 0xa2, 0x29, 0x26, 0x1e, 0x12, 0x4d, 0xf1, 0x22, 0x4c, - 0x07, 0x7e, 0x9b, 0x56, 0x03, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa0, 0x82, 0xdb, 0xbf, - 0x66, 0xc1, 0x42, 0x3a, 0xdc, 0x2b, 0x77, 0x07, 0x56, 0x33, 0x26, 0xbd, 0x30, 0x7a, 0x4c, 0xba, - 0xfd, 0x3e, 0x63, 0x32, 0x72, 0x1b, 0xfb, 0xae, 0x27, 0xc2, 0xb8, 0x59, 0xcf, 0xbd, 0x08, 0xd3, - 0x54, 0x3e, 0xd7, 0x29, 0x8c, 0xc0, 0x9a, 0x49, 0xf5, 0x4a, 0xa7, 0x82, 0x93, 0x2a, 0xcc, 0xab, - 0xab, 0x2f, 0x65, 0xb9, 0x17, 0xe9, 0x27, 0xb4, 0xa5, 0x70, 0x2d, 0x09, 0xc6, 0x74, 0x7d, 0xfb, - 0x8b, 0x30, 0x63, 0x6c, 0x4a, 0x5c, 0x7e, 0xdf, 0x77, 0x1a, 0x51, 0x5a, 0xee, 0x5d, 0x61, 0x85, - 0x28, 0x60, 0xfc, 0x82, 0x41, 0x44, 0xa3, 0xa4, 0xe4, 0x9e, 0x8c, 0x41, 0x91, 0x50, 0x86, 0x2c, - 0xa0, 0x2d, 0x7a, 0x5f, 0x25, 0x8b, 0x57, 0xc8, 0x90, 0x15, 0xa2, 0x80, 0xd9, 0x2f, 0x41, 0x49, - 0x25, 0x09, 0xe2, 0x99, 0x36, 0x94, 0xf1, 0xdb, 0xcc, 0xb4, 0xe1, 0x07, 0x11, 0x72, 0x88, 0xfd, - 0x36, 0x94, 0x54, 0x2e, 0xa3, 0x87, 0xd7, 0x66, 0xa2, 0x28, 0xf4, 0xdc, 0x6b, 0x7e, 0x18, 0xa9, - 0x04, 0x4c, 0xe2, 0x7e, 0xee, 0xc6, 0x3a, 0x2f, 0x43, 0x0d, 0xb5, 0x5f, 0x86, 0xf9, 0xd4, 0x3d, - 0xed, 0x10, 0x69, 0x39, 0x7e, 0xb7, 0x00, 0xb3, 0xe6, 0x75, 0xdd, 0x10, 0xab, 0x78, 0x78, 0xe1, - 0x98, 0x71, 0xc5, 0x56, 0x18, 0xf1, 0x8a, 0xcd, 0xbc, 0xd3, 0x9c, 0x3c, 0xdd, 0x3b, 0xcd, 0x62, - 0x3e, 0x77, 0x9a, 0xc6, 0xdd, 0xfb, 0xd4, 0xe3, 0xbb, 0x7b, 0xff, 0xed, 0x22, 0xcc, 0x25, 0xf3, - 0x3c, 0x0e, 0x31, 0x92, 0x2f, 0xf5, 0x8d, 0xe4, 0x88, 0x36, 0xfd, 0xc2, 0xb8, 0x36, 0xfd, 0xc9, - 0x71, 0x6d, 0xfa, 0xc5, 0x47, 0xb0, 0xe9, 0xf7, 0x5b, 0xe4, 0xa7, 0x86, 0xb6, 0xc8, 0x7f, 0x4a, - 0x7b, 0xe5, 0x4d, 0x27, 0xdc, 0x58, 0x62, 0xaf, 0x3c, 0x92, 0x1c, 0x86, 0x55, 0xbf, 0x99, 0xe9, - 0xdd, 0x58, 0x7a, 0x88, 0xed, 0x32, 0xc8, 0x74, 0xa2, 0x1b, 0xfd, 0xda, 0xf0, 0x43, 0x23, 0x38, - 0xd0, 0xbd, 0x0a, 0x33, 0x72, 0x3e, 0x71, 0x15, 0x14, 0x92, 0xea, 0x6b, 0x3d, 0x06, 0xa1, 0x59, - 0x8f, 0xbf, 0x77, 0x9e, 0x7c, 0x05, 0x9f, 0x5f, 0x91, 0x98, 0xef, 0x9d, 0xa7, 0x5e, 0xcd, 0x4f, - 0xd7, 0xb7, 0xbf, 0x00, 0x17, 0x32, 0xcd, 0x08, 0xdc, 0x84, 0xcb, 0xb5, 0x23, 0xda, 0x94, 0x15, - 0x0c, 0x36, 0x52, 0xef, 0x24, 0x2c, 0xdd, 0x19, 0x58, 0x13, 0x4f, 0xc0, 0x62, 0x7f, 0xbb, 0x00, - 0x73, 0xc9, 0xc7, 0x32, 0xc9, 0x3d, 0x6d, 0x74, 0xcc, 0xc5, 0xde, 0x29, 0xd0, 0x1a, 0xb9, 0x03, - 0x07, 0x5e, 0x56, 0xdc, 0xe3, 0xf3, 0x6b, 0x47, 0x27, 0x32, 0x3c, 0x3d, 0xc2, 0xf2, 0x96, 0x40, - 0x92, 0xe3, 0xef, 0x61, 0xc6, 0x61, 0x86, 0xf2, 0x34, 0x9b, 0x3b, 0xf5, 0x38, 0x5c, 0x4e, 0x93, - 0x42, 0x83, 0x2c, 0xdb, 0x5b, 0x0e, 0x68, 0xe0, 0xee, 0xba, 0xfa, 0xa1, 0x6f, 0x2e, 0xb9, 0xdf, - 0x96, 0x65, 0xa8, 0xa1, 0xf6, 0xfb, 0x13, 0x50, 0xe6, 0x59, 0x91, 0xae, 0x06, 0x7e, 0x87, 0xbf, - 0x28, 0x17, 0x1a, 0x27, 0x07, 0x39, 0x6c, 0xd7, 0xc7, 0x7d, 0xb6, 0x31, 0xc6, 0x28, 0x3d, 0xa6, - 0x8d, 0x12, 0x4c, 0x50, 0x24, 0x5d, 0x28, 0xed, 0xca, 0x2c, 0xae, 0x72, 0xec, 0xc6, 0xcc, 0x44, - 0xa8, 0x72, 0xc2, 0x8a, 0x2e, 0x50, 0xff, 0x50, 0x53, 0xb1, 0x1d, 0x98, 0x4f, 0xa5, 0xb5, 0xc8, - 0x3d, 0xf7, 0xeb, 0xff, 0x98, 0x84, 0xb2, 0x0e, 0xd7, 0x21, 0x9f, 0x48, 0x98, 0x71, 0xca, 0xb5, - 0x0f, 0x1b, 0xcf, 0x1d, 0xed, 0xf9, 0xcd, 0x07, 0x47, 0x95, 0x79, 0x5d, 0x39, 0x65, 0x92, 0x79, - 0x16, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa7, 0xdd, 0xc6, 0x0d, 0x64, 0xe5, 0x66, 0x88, 0x51, 0xe1, - 0xb1, 0x86, 0x18, 0xb1, 0x5d, 0x72, 0xc7, 0x6f, 0x1e, 0xa6, 0x9f, 0x47, 0xaa, 0xf9, 0xcd, 0x43, - 0xe4, 0x10, 0xf2, 0x06, 0xcc, 0xc9, 0xb8, 0x29, 0xf3, 0xd1, 0xf8, 0x42, 0x7c, 0xf9, 0xbe, 0x9d, - 0x80, 0x62, 0xaa, 0x36, 0xdb, 0x65, 0xef, 0x86, 0xbe, 0xc7, 0x33, 0xfa, 0x4e, 0x25, 0x6f, 0xea, - 0xae, 0xd7, 0x6f, 0xde, 0xe0, 0xe6, 0x24, 0x5d, 0x23, 0x11, 0x9a, 0x35, 0xfd, 0xd0, 0xd0, 0xac, - 0x35, 0x81, 0x9b, 0x71, 0xcb, 0x77, 0x94, 0xd9, 0xda, 0x25, 0x85, 0x97, 0x95, 0x3d, 0x38, 0x3a, - 0xc1, 0xd0, 0xa7, 0x5b, 0x66, 0x05, 0xb1, 0x95, 0x7f, 0x7c, 0x41, 0x6c, 0xf6, 0x6d, 0x98, 0x4f, - 0x8d, 0x9f, 0x3a, 0xe6, 0x5b, 0xd9, 0xc7, 0xfc, 0xe1, 0x1e, 0x58, 0xfa, 0xe7, 0x16, 0x9c, 0xed, - 0x93, 0x48, 0xc3, 0x46, 0x13, 0xa6, 0xf7, 0xc6, 0x89, 0x47, 0xdf, 0x1b, 0x0b, 0xa3, 0xed, 0x8d, - 0xb5, 0x9d, 0xef, 0xfe, 0xe0, 0xe2, 0x13, 0xdf, 0xfb, 0xc1, 0xc5, 0x27, 0xfe, 0xe8, 0x07, 0x17, - 0x9f, 0x78, 0xff, 0xf8, 0xa2, 0xf5, 0xdd, 0xe3, 0x8b, 0xd6, 0xf7, 0x8e, 0x2f, 0x5a, 0x7f, 0x74, - 0x7c, 0xd1, 0xfa, 0x8f, 0xc7, 0x17, 0xad, 0x6f, 0xfc, 0xd9, 0xc5, 0x27, 0x3e, 0xfd, 0xa9, 0x78, - 0xa4, 0x56, 0xd4, 0x48, 0xf1, 0x1f, 0x1f, 0x55, 0xe3, 0xb2, 0xd2, 0xdd, 0x6f, 0xad, 0xb0, 0x91, - 0x5a, 0xd1, 0x25, 0x6a, 0xa4, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x43, 0x1e, 0xac, 0xfd, - 0x31, 0xa2, 0x00, 0x00, + // 8404 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6f, 0x6c, 0x24, 0xc9, + 0x75, 0x18, 0x7e, 0xcd, 0xe1, 0x90, 0x33, 0x8f, 0x5c, 0x92, 0x5b, 0xbb, 0xab, 0xe3, 0xf1, 0xee, + 0x76, 0x4e, 0x7d, 0xfe, 0xdd, 0x6f, 0xcf, 0x3a, 0x91, 0xd2, 0xde, 0x5d, 0x72, 0xd2, 0x29, 0x97, + 0xcc, 0x90, 0xbb, 0xb7, 0xdc, 0x23, 0x77, 0xb9, 0x6f, 0xb8, 0xb7, 0xb6, 0xa4, 0xb3, 0xd5, 0x9c, + 0x29, 0x0e, 0x7b, 0x39, 0xd3, 0x3d, 0xea, 0xee, 0xe1, 0x2e, 0x4f, 0x07, 0xeb, 0x64, 0xe1, 0x14, + 0xc5, 0x90, 0x60, 0x25, 0xb6, 0x10, 0x04, 0x09, 0x02, 0xc5, 0x30, 0xe0, 0x24, 0xf6, 0x27, 0xc1, + 0x41, 0xbe, 0x18, 0x88, 0x10, 0xc7, 0xb6, 0x3e, 0xc4, 0x81, 0xfc, 0x21, 0x91, 0x1d, 0xc0, 0x74, + 0x44, 0xe7, 0x4b, 0x82, 0x04, 0x42, 0x02, 0x05, 0x81, 0xf7, 0x43, 0x10, 0xd4, 0xdf, 0xae, 0xee, + 0xe9, 0xe1, 0xce, 0xec, 0x34, 0x57, 0x4a, 0xe2, 0x6f, 0x33, 0xf5, 0xaa, 0xde, 0x7b, 0x5d, 0x7f, + 0x5e, 0xbd, 0x7a, 0xf5, 0xde, 0x2b, 0xd8, 0x68, 0xb9, 0xd1, 0x5e, 0x6f, 0x67, 0xb9, 0xe1, 0x77, + 0x56, 0x9c, 0xa0, 0xe5, 0x77, 0x03, 0xff, 0x2e, 0xff, 0xf1, 0xd1, 0xc0, 0x6f, 0xb7, 0xfd, 0x5e, + 0x14, 0xae, 0x74, 0xf7, 0x5b, 0x2b, 0x4e, 0xd7, 0x0d, 0x57, 0x74, 0xc9, 0xc1, 0xc7, 0x9d, 0x76, + 0x77, 0xcf, 0xf9, 0xf8, 0x4a, 0x8b, 0x7a, 0x34, 0x70, 0x22, 0xda, 0x5c, 0xee, 0x06, 0x7e, 0xe4, + 0x93, 0x4f, 0xc5, 0xd8, 0x96, 0x15, 0x36, 0xfe, 0xe3, 0xe7, 0x55, 0xdb, 0xe5, 0xee, 0x7e, 0x6b, + 0x99, 0x61, 0x5b, 0xd6, 0x25, 0x0a, 0xdb, 0xd2, 0x47, 0x0d, 0x5e, 0x5a, 0x7e, 0xcb, 0x5f, 0xe1, + 0x48, 0x77, 0x7a, 0xbb, 0xfc, 0x1f, 0xff, 0xc3, 0x7f, 0x09, 0x62, 0x4b, 0xcf, 0xef, 0xbf, 0x16, + 0x2e, 0xbb, 0x3e, 0xe3, 0x6d, 0x65, 0xc7, 0x89, 0x1a, 0x7b, 0x2b, 0x07, 0x7d, 0x1c, 0x2d, 0xd9, + 0x46, 0xa5, 0x86, 0x1f, 0xd0, 0xac, 0x3a, 0xaf, 0xc4, 0x75, 0x3a, 0x4e, 0x63, 0xcf, 0xf5, 0x68, + 0x70, 0x18, 0x7f, 0x75, 0x87, 0x46, 0x4e, 0x56, 0xab, 0x95, 0x41, 0xad, 0x82, 0x9e, 0x17, 0xb9, + 0x1d, 0xda, 0xd7, 0xe0, 0xaf, 0x3c, 0xac, 0x41, 0xd8, 0xd8, 0xa3, 0x1d, 0xa7, 0xaf, 0xdd, 0xcb, + 0x83, 0xda, 0xf5, 0x22, 0xb7, 0xbd, 0xe2, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x46, 0xf6, 0x0f, 0x0b, + 0x50, 0xae, 0x6e, 0xd4, 0xea, 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x15, 0x0b, 0x66, 0xdb, 0xbe, 0xd3, + 0xac, 0x39, 0x6d, 0xc7, 0x6b, 0xd0, 0x60, 0xd1, 0x7a, 0xce, 0xba, 0x34, 0x73, 0x79, 0x63, 0x79, + 0x9c, 0xf1, 0x5a, 0xae, 0xde, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xb5, 0xf3, + 0xdf, 0x3d, 0xaa, 0x3c, 0x71, 0x7c, 0x54, 0x99, 0xdd, 0x30, 0x28, 0x61, 0x82, 0x2e, 0xf9, 0xa6, + 0x05, 0x67, 0x1b, 0x8e, 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0x9b, 0x81, 0xdf, 0xeb, + 0x2e, 0x4e, 0x9c, 0x02, 0x37, 0x4f, 0x49, 0x6e, 0xce, 0xae, 0xa6, 0xc9, 0x61, 0x3f, 0x07, 0x9c, + 0xaf, 0x30, 0x72, 0x76, 0xda, 0xd4, 0xe4, 0xab, 0x70, 0x9a, 0x7c, 0xd5, 0xd3, 0xe4, 0xb0, 0x9f, + 0x03, 0xf2, 0x22, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xb8, 0x38, 0xf9, 0x9c, 0x75, 0xa9, 0x5c, + 0x9b, 0x97, 0xcd, 0xa7, 0xd7, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xad, 0x6e, 0xd4, + 0xb6, 0x03, 0x67, 0x77, 0xd7, 0x6d, 0xa0, 0xdf, 0x8b, 0x5c, 0xaf, 0x65, 0x22, 0xb0, 0x4e, 0x46, + 0x40, 0x5e, 0x85, 0x99, 0x90, 0x06, 0x07, 0x6e, 0x83, 0x6e, 0xf9, 0x41, 0xc4, 0x07, 0xa5, 0x58, + 0x3b, 0x27, 0xab, 0xcf, 0xd4, 0x63, 0x10, 0x9a, 0xf5, 0x58, 0xb3, 0xc0, 0xf7, 0x23, 0x09, 0xe7, + 0x7d, 0x56, 0x8e, 0x9b, 0x61, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x83, 0x05, 0xc7, 0xf3, 0xfc, 0xc8, + 0x89, 0x5c, 0xdf, 0xdb, 0x0a, 0xe8, 0xae, 0x7b, 0x5f, 0x7e, 0xe2, 0xa2, 0x6c, 0xbb, 0x50, 0x4d, + 0xc1, 0xb1, 0xaf, 0x05, 0xf9, 0x86, 0x05, 0x0b, 0x61, 0xe4, 0x36, 0xf6, 0x5d, 0x8f, 0x86, 0xe1, + 0xaa, 0xef, 0xed, 0xba, 0xad, 0xc5, 0x22, 0x1f, 0xb6, 0x1b, 0xe3, 0x0d, 0x5b, 0x3d, 0x85, 0xb5, + 0x76, 0x9e, 0xb1, 0x94, 0x2e, 0xc5, 0x3e, 0xea, 0xe4, 0x23, 0x50, 0x96, 0x3d, 0x4a, 0xc3, 0xc5, + 0xa9, 0xe7, 0x0a, 0x97, 0xca, 0xb5, 0x33, 0xc7, 0x47, 0x95, 0xf2, 0xba, 0x2a, 0xc4, 0x18, 0x6e, + 0xaf, 0xc1, 0x62, 0xb5, 0xb3, 0xe3, 0x84, 0xa1, 0xd3, 0xf4, 0x83, 0xd4, 0xd0, 0x5d, 0x82, 0x52, + 0xc7, 0xe9, 0x76, 0x5d, 0xaf, 0xc5, 0xc6, 0x8e, 0xe1, 0x99, 0x3d, 0x3e, 0xaa, 0x94, 0x36, 0x65, + 0x19, 0x6a, 0xa8, 0xfd, 0x27, 0x13, 0x30, 0x53, 0xf5, 0x9c, 0xf6, 0x61, 0xe8, 0x86, 0xd8, 0xf3, + 0xc8, 0xe7, 0xa0, 0xc4, 0xa4, 0x56, 0xd3, 0x89, 0x1c, 0xb9, 0xd2, 0x3f, 0xb6, 0x2c, 0x84, 0xc8, + 0xb2, 0x29, 0x44, 0xe2, 0xcf, 0x67, 0xb5, 0x97, 0x0f, 0x3e, 0xbe, 0x7c, 0x73, 0xe7, 0x2e, 0x6d, + 0x44, 0x9b, 0x34, 0x72, 0x6a, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, + 0x2e, 0x6d, 0xc8, 0x95, 0xbb, 0x39, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2b, + 0x49, 0x4f, 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0xcd, + 0xfc, 0x48, 0x72, 0xb4, 0xb5, 0x39, 0x49, 0x74, 0x4a, 0xfc, 0x47, 0x49, 0xce, 0xfe, 0xf7, 0x16, + 0x9c, 0x33, 0x6a, 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x3c, 0x07, 0x93, 0x9e, 0xd3, 0xa1, + 0x72, 0x55, 0x69, 0x96, 0x6f, 0x38, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x87, 0xe2, 0x81, 0xd3, 0xee, + 0x51, 0xde, 0x49, 0xe5, 0xda, 0x19, 0x59, 0xa5, 0xf8, 0x36, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x41, + 0x99, 0xff, 0xb8, 0x1a, 0xf8, 0x9d, 0x9c, 0x3e, 0x4d, 0x72, 0xf8, 0xb6, 0x42, 0x2b, 0xa6, 0x9f, + 0xfe, 0x8b, 0x31, 0x41, 0xfb, 0xcf, 0x2c, 0x98, 0x37, 0x3e, 0x6e, 0xc3, 0x0d, 0x23, 0xf2, 0xd9, + 0xbe, 0xc9, 0xb3, 0x3c, 0xdc, 0xe4, 0x61, 0xad, 0xf9, 0xd4, 0x59, 0x90, 0x5f, 0x5a, 0x52, 0x25, + 0xc6, 0xc4, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4e, 0x3c, 0x57, 0xb8, 0x34, 0x73, 0x79, + 0x3d, 0xb7, 0x61, 0x8c, 0xfb, 0x77, 0x9d, 0xe1, 0x47, 0x41, 0xc6, 0xfe, 0xed, 0x42, 0x62, 0xf8, + 0x36, 0x15, 0x1f, 0x1f, 0x58, 0x30, 0xd5, 0x76, 0x76, 0x68, 0x5b, 0xac, 0xad, 0x99, 0xcb, 0xef, + 0xe4, 0xc6, 0x89, 0xa2, 0xb1, 0xbc, 0xc1, 0xf1, 0x5f, 0xf1, 0xa2, 0xe0, 0x30, 0x9e, 0x5e, 0xa2, + 0x10, 0x25, 0x71, 0xf2, 0xf7, 0x2c, 0x98, 0x89, 0xa5, 0x9a, 0xea, 0x96, 0x9d, 0xfc, 0x99, 0x89, + 0x85, 0xa9, 0xe4, 0x48, 0x8b, 0x68, 0x03, 0x82, 0x26, 0x2f, 0x4b, 0x9f, 0x80, 0x19, 0xe3, 0x13, + 0xc8, 0x02, 0x14, 0xf6, 0xe9, 0xa1, 0x98, 0xf0, 0xc8, 0x7e, 0x92, 0xf3, 0x89, 0x19, 0x2e, 0xa7, + 0xf4, 0x27, 0x27, 0x5e, 0xb3, 0x96, 0xde, 0x80, 0x85, 0x34, 0xc1, 0x51, 0xda, 0xdb, 0xdf, 0x9e, + 0x4c, 0x4c, 0x4c, 0x26, 0x08, 0x88, 0x0f, 0xd3, 0x1d, 0x1a, 0x05, 0x6e, 0x43, 0x0d, 0xd9, 0xda, + 0x78, 0xbd, 0xb4, 0xc9, 0x91, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xa2, 0x42, 0xf6, 0x60, 0xd2, + 0x09, 0x5a, 0x6a, 0x4c, 0xae, 0xe6, 0xb3, 0x2c, 0x63, 0x51, 0x51, 0x0d, 0x5a, 0x21, 0x72, 0x0a, + 0x64, 0x05, 0xca, 0x11, 0x0d, 0x3a, 0xae, 0xe7, 0x44, 0x62, 0x07, 0x2d, 0xd5, 0xce, 0xca, 0x6a, + 0xe5, 0x6d, 0x05, 0xc0, 0xb8, 0x0e, 0x69, 0xc3, 0x54, 0x33, 0x38, 0xc4, 0x9e, 0xb7, 0x38, 0x99, + 0x47, 0x57, 0xac, 0x71, 0x5c, 0xf1, 0x24, 0x15, 0xff, 0x51, 0xd2, 0x20, 0xbf, 0x6e, 0xc1, 0xf9, + 0x0e, 0x75, 0xc2, 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x06, 0x76, 0xb1, 0xc8, 0x89, + 0xe3, 0xb8, 0xe3, 0xd0, 0x8f, 0xb9, 0xf6, 0x8c, 0x64, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xb9, 0xb1, + 0xff, 0x64, 0x12, 0xce, 0xf6, 0x09, 0x76, 0xf2, 0x0a, 0x14, 0xbb, 0x7b, 0x4e, 0xa8, 0x24, 0xf5, + 0x45, 0x25, 0x26, 0xb6, 0x58, 0xe1, 0x83, 0xa3, 0xca, 0x19, 0xd5, 0x84, 0x17, 0xa0, 0xa8, 0xcc, + 0xf4, 0xa6, 0x0e, 0x0d, 0x43, 0xa7, 0xa5, 0xc4, 0xb7, 0x31, 0x4d, 0x78, 0x31, 0x2a, 0x38, 0xf9, + 0x9b, 0x16, 0x9c, 0x11, 0x53, 0x06, 0x69, 0xd8, 0x6b, 0x47, 0x6c, 0x8b, 0x62, 0xdd, 0x72, 0x3d, + 0x8f, 0xe9, 0x29, 0x50, 0xd6, 0x2e, 0x48, 0xea, 0x67, 0xcc, 0xd2, 0x10, 0x93, 0x74, 0xc9, 0x1d, + 0x28, 0x87, 0x91, 0x13, 0x44, 0xb4, 0x59, 0x8d, 0xb8, 0x32, 0x35, 0x73, 0xf9, 0xa7, 0x87, 0x93, + 0xdd, 0xdb, 0x6e, 0x87, 0x8a, 0x7d, 0xa2, 0xae, 0x10, 0x60, 0x8c, 0x8b, 0xbc, 0x07, 0x10, 0xf4, + 0xbc, 0x7a, 0xaf, 0xd3, 0x71, 0x82, 0x43, 0xa9, 0x5f, 0x5d, 0x1b, 0xef, 0xf3, 0x50, 0xe3, 0x8b, + 0x55, 0x8d, 0xb8, 0x0c, 0x0d, 0x7a, 0xe4, 0x4b, 0x16, 0x9c, 0x11, 0x33, 0x51, 0x71, 0x30, 0x95, + 0x33, 0x07, 0x67, 0x59, 0xd7, 0xae, 0x99, 0x24, 0x30, 0x49, 0xd1, 0xfe, 0xb7, 0x49, 0x35, 0xa0, + 0x1e, 0xb1, 0xc3, 0x56, 0xeb, 0x90, 0x7c, 0x06, 0x9e, 0x0a, 0x7b, 0x8d, 0x06, 0x0d, 0xc3, 0xdd, + 0x5e, 0x1b, 0x7b, 0xde, 0x35, 0x37, 0x8c, 0xfc, 0xe0, 0x70, 0xc3, 0xed, 0xb8, 0x11, 0x9f, 0x71, + 0xc5, 0xda, 0xb3, 0xc7, 0x47, 0x95, 0xa7, 0xea, 0x83, 0x2a, 0xe1, 0xe0, 0xf6, 0xc4, 0x81, 0xa7, + 0x7b, 0xde, 0x60, 0xf4, 0x42, 0x43, 0xaf, 0x1c, 0x1f, 0x55, 0x9e, 0xbe, 0x3d, 0xb8, 0x1a, 0x9e, + 0x84, 0xc3, 0xfe, 0xcf, 0x16, 0x93, 0xd4, 0xe2, 0xbb, 0xb6, 0x69, 0xa7, 0xdb, 0x66, 0xd2, 0xe5, + 0xf4, 0xf5, 0xc7, 0x28, 0xa1, 0x3f, 0x62, 0x3e, 0xdb, 0x9d, 0xe2, 0x7f, 0x90, 0x12, 0x69, 0xff, + 0x27, 0x0b, 0xce, 0xa7, 0x2b, 0x3f, 0x06, 0x9d, 0x27, 0x4c, 0xea, 0x3c, 0x37, 0xf2, 0xfd, 0xda, + 0x01, 0x8a, 0xcf, 0x57, 0x26, 0xfb, 0xbf, 0xf5, 0xff, 0xf6, 0x6d, 0x34, 0xde, 0x15, 0x0b, 0x3f, + 0xce, 0x5d, 0x71, 0xf2, 0x27, 0x6a, 0x57, 0xfc, 0xc7, 0x93, 0x30, 0x5b, 0xf5, 0x22, 0xb7, 0xba, + 0xbb, 0xeb, 0x7a, 0x6e, 0x74, 0x48, 0xbe, 0x36, 0x01, 0x2b, 0xdd, 0x80, 0xee, 0xd2, 0x20, 0xa0, + 0xcd, 0xb5, 0x5e, 0xe0, 0x7a, 0xad, 0x7a, 0x63, 0x8f, 0x36, 0x7b, 0x6d, 0xd7, 0x6b, 0xad, 0xb7, + 0x3c, 0x5f, 0x17, 0x5f, 0xb9, 0x4f, 0x1b, 0x3d, 0xfe, 0x49, 0x62, 0x51, 0x74, 0xc6, 0xfb, 0xa4, + 0xad, 0xd1, 0x88, 0xd6, 0x5e, 0x3e, 0x3e, 0xaa, 0xac, 0x8c, 0xd8, 0x08, 0x47, 0xfd, 0x34, 0xf2, + 0xd5, 0x09, 0x58, 0x0e, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xbd, 0x21, 0xa4, 0x56, 0x7b, 0xcc, 0xed, + 0x67, 0x24, 0x9a, 0xb5, 0xcb, 0xc7, 0x47, 0x95, 0x11, 0xdb, 0xe0, 0x88, 0xdf, 0x65, 0x6f, 0xc1, + 0x4c, 0xb5, 0xeb, 0x86, 0xee, 0x7d, 0xf4, 0x7b, 0x11, 0x1d, 0xe2, 0x88, 0x5b, 0x81, 0x62, 0xd0, + 0x6b, 0x53, 0xb1, 0xb6, 0xcb, 0xb5, 0x32, 0x93, 0x42, 0xc8, 0x0a, 0x50, 0x94, 0xdb, 0xbf, 0xc8, + 0x24, 0x2e, 0x47, 0x99, 0x32, 0x6e, 0xdc, 0x85, 0x62, 0xc0, 0x88, 0xc8, 0x99, 0x35, 0xee, 0x39, + 0x30, 0xe6, 0x5a, 0x32, 0xc1, 0x7e, 0xa2, 0x20, 0x61, 0xff, 0xee, 0x04, 0x5c, 0xa8, 0x76, 0xbb, + 0x9b, 0x34, 0xdc, 0x4b, 0x71, 0xf1, 0xcb, 0x16, 0xcc, 0x1d, 0xb8, 0x41, 0xd4, 0x73, 0xda, 0xca, + 0x7e, 0x25, 0xf8, 0xa9, 0x8f, 0xcb, 0x0f, 0xa7, 0xf6, 0x76, 0x02, 0x75, 0x8d, 0x1c, 0x1f, 0x55, + 0xe6, 0x92, 0x65, 0x98, 0x22, 0x4f, 0xfe, 0xae, 0x05, 0x0b, 0xb2, 0xe8, 0x86, 0xdf, 0xa4, 0xa6, + 0x7d, 0xf4, 0x76, 0x9e, 0x3c, 0x69, 0xe4, 0xc2, 0xae, 0x95, 0x2e, 0xc5, 0x3e, 0x26, 0xec, 0xff, + 0x3a, 0x01, 0x4f, 0x0e, 0xc0, 0x41, 0x7e, 0xc3, 0x82, 0xf3, 0xc2, 0xa8, 0x6a, 0x80, 0x90, 0xee, + 0xca, 0xde, 0xfc, 0xd9, 0xbc, 0x39, 0x47, 0xb6, 0xc4, 0xa9, 0xd7, 0xa0, 0xb5, 0x45, 0x26, 0x0d, + 0x57, 0x33, 0x48, 0x63, 0x26, 0x43, 0x9c, 0x53, 0x61, 0x66, 0x4d, 0x71, 0x3a, 0xf1, 0x58, 0x38, + 0xad, 0x67, 0x90, 0xc6, 0x4c, 0x86, 0xec, 0xbf, 0x0e, 0x4f, 0x9f, 0x80, 0xee, 0xe1, 0x8b, 0xd3, + 0x7e, 0x47, 0xcf, 0xfa, 0xe4, 0x9c, 0x1b, 0x62, 0x5d, 0xdb, 0x30, 0xc5, 0x97, 0x8e, 0x5a, 0xd8, + 0xc0, 0xb6, 0x3f, 0xbe, 0xa6, 0x42, 0x94, 0x10, 0xfb, 0x77, 0x2d, 0x28, 0x8d, 0x60, 0x0d, 0xab, + 0x24, 0xad, 0x61, 0xe5, 0x3e, 0x4b, 0x58, 0xd4, 0x6f, 0x09, 0x7b, 0x73, 0xbc, 0xd1, 0x18, 0xc6, + 0x02, 0xf6, 0x43, 0x0b, 0xce, 0xf6, 0x59, 0xcc, 0xc8, 0x1e, 0x9c, 0xef, 0xfa, 0x4d, 0xa5, 0x36, + 0x5d, 0x73, 0xc2, 0x3d, 0x0e, 0x93, 0x9f, 0xf7, 0x0a, 0x1b, 0xc9, 0xad, 0x0c, 0xf8, 0x83, 0xa3, + 0xca, 0xa2, 0x46, 0x92, 0xaa, 0x80, 0x99, 0x18, 0x49, 0x17, 0x4a, 0xbb, 0x2e, 0x6d, 0x37, 0xe3, + 0x29, 0x38, 0xa6, 0x82, 0x74, 0x55, 0x62, 0x13, 0xc6, 0x62, 0xf5, 0x0f, 0x35, 0x15, 0xfb, 0x47, + 0x16, 0xcc, 0x55, 0x7b, 0xd1, 0x1e, 0x53, 0x0f, 0x1a, 0xdc, 0x3e, 0x43, 0x3c, 0x28, 0x86, 0x6e, + 0xeb, 0xe0, 0x95, 0x7c, 0x84, 0x71, 0x9d, 0xa1, 0x92, 0x46, 0x73, 0xad, 0x9b, 0xf2, 0x42, 0x14, + 0x64, 0x48, 0x00, 0x53, 0xbe, 0xd3, 0x8b, 0xf6, 0x2e, 0xcb, 0x4f, 0x1e, 0xf3, 0xa4, 0x7c, 0x93, + 0x7d, 0xce, 0x65, 0x49, 0x51, 0x6b, 0x6b, 0xa2, 0x14, 0x25, 0x25, 0xfb, 0x8b, 0x30, 0x97, 0xbc, + 0x89, 0x19, 0x62, 0xce, 0x3e, 0x0b, 0x05, 0x27, 0xf0, 0xe4, 0x8c, 0x9d, 0x91, 0x15, 0x0a, 0x55, + 0xbc, 0x81, 0xac, 0x9c, 0xbc, 0x04, 0xa5, 0xdd, 0x5e, 0xbb, 0xcd, 0x1a, 0xc8, 0x6b, 0x0f, 0x7d, + 0x0a, 0xb8, 0x2a, 0xcb, 0x51, 0xd7, 0xb0, 0xff, 0x62, 0x12, 0xe6, 0x6b, 0xed, 0x1e, 0x7d, 0x33, + 0xa0, 0x54, 0xd9, 0x26, 0xaa, 0x30, 0xdf, 0x0d, 0xe8, 0x81, 0x4b, 0xef, 0xd5, 0x69, 0x9b, 0x36, + 0x22, 0x3f, 0x90, 0xdc, 0x3c, 0x29, 0x11, 0xcd, 0x6f, 0x25, 0xc1, 0x98, 0xae, 0x4f, 0xde, 0x80, + 0x39, 0xa7, 0x11, 0xb9, 0x07, 0x54, 0x63, 0x10, 0xec, 0x7e, 0x48, 0x62, 0x98, 0xab, 0x26, 0xa0, + 0x98, 0xaa, 0x4d, 0x3e, 0x0b, 0x8b, 0x61, 0xc3, 0x69, 0xd3, 0xdb, 0x5d, 0x49, 0x6a, 0x75, 0x8f, + 0x36, 0xf6, 0xb7, 0x7c, 0xd7, 0x8b, 0xa4, 0x25, 0xea, 0x39, 0x89, 0x69, 0xb1, 0x3e, 0xa0, 0x1e, + 0x0e, 0xc4, 0x40, 0xfe, 0x85, 0x05, 0xcf, 0x76, 0x03, 0xba, 0x15, 0xf8, 0x1d, 0x9f, 0x4d, 0xb5, + 0x3e, 0xf3, 0x8c, 0x34, 0x53, 0xbc, 0x3d, 0xa6, 0x2e, 0x25, 0x4a, 0xfa, 0xad, 0xfa, 0x1f, 0x3e, + 0x3e, 0xaa, 0x3c, 0xbb, 0x75, 0x12, 0x03, 0x78, 0x32, 0x7f, 0xe4, 0x5f, 0x5a, 0x70, 0xb1, 0xeb, + 0x87, 0xd1, 0x09, 0x9f, 0x50, 0x3c, 0xd5, 0x4f, 0xb0, 0x8f, 0x8f, 0x2a, 0x17, 0xb7, 0x4e, 0xe4, + 0x00, 0x1f, 0xc2, 0xa1, 0x7d, 0x3c, 0x03, 0x67, 0x8d, 0xb9, 0x27, 0x6d, 0x17, 0xaf, 0xc3, 0x19, + 0x35, 0x19, 0x62, 0xdd, 0xa7, 0x1c, 0xdb, 0x9a, 0xaa, 0x26, 0x10, 0x93, 0x75, 0xd9, 0xbc, 0xd3, + 0x53, 0x51, 0xb4, 0x4e, 0xcd, 0xbb, 0xad, 0x04, 0x14, 0x53, 0xb5, 0xc9, 0x3a, 0x9c, 0x93, 0x25, + 0x48, 0xbb, 0x6d, 0xb7, 0xe1, 0xac, 0xfa, 0x3d, 0x39, 0xe5, 0x8a, 0xb5, 0x27, 0x8f, 0x8f, 0x2a, + 0xe7, 0xb6, 0xfa, 0xc1, 0x98, 0xd5, 0x86, 0x6c, 0xc0, 0x79, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, + 0x78, 0x6c, 0x3b, 0x6d, 0xf2, 0xa9, 0x55, 0x12, 0xfb, 0x6e, 0x35, 0x03, 0x8e, 0x99, 0xad, 0xc8, + 0x56, 0x0a, 0x5b, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x46, 0xb9, 0x18, 0x9f, 0xc0, 0xaa, 0x19, 0x75, + 0x30, 0xb3, 0x25, 0x69, 0xc3, 0x5c, 0xc7, 0xb9, 0x7f, 0xdb, 0x73, 0x0e, 0x1c, 0xb7, 0xcd, 0x88, + 0x48, 0xfb, 0xd5, 0x60, 0xa3, 0x4a, 0x2f, 0x72, 0xdb, 0xcb, 0xe2, 0x66, 0x7f, 0x79, 0xdd, 0x8b, + 0x6e, 0x06, 0xf5, 0x88, 0x69, 0xea, 0x42, 0x83, 0xdc, 0x4c, 0xe0, 0xc2, 0x14, 0x6e, 0x72, 0x13, + 0x2e, 0xf0, 0xe5, 0xb8, 0xe6, 0xdf, 0xf3, 0xd6, 0x68, 0xdb, 0x39, 0x54, 0x1f, 0x30, 0xcd, 0x3f, + 0xe0, 0xa9, 0xe3, 0xa3, 0xca, 0x85, 0x7a, 0x56, 0x05, 0xcc, 0x6e, 0x47, 0x1c, 0x78, 0x3a, 0x09, + 0x40, 0x7a, 0xe0, 0x86, 0xae, 0xef, 0x09, 0x2b, 0x54, 0x29, 0xb6, 0x42, 0xd5, 0x07, 0x57, 0xc3, + 0x93, 0x70, 0x90, 0xbf, 0x6f, 0xc1, 0xf9, 0xac, 0x65, 0xb8, 0x58, 0xce, 0xe3, 0x7e, 0x31, 0xb5, + 0xb4, 0xc4, 0x8c, 0xc8, 0x14, 0x0a, 0x99, 0x4c, 0x90, 0xf7, 0x2d, 0x98, 0x75, 0x8c, 0x13, 0xf4, + 0x22, 0xe4, 0xb1, 0x6b, 0x99, 0x67, 0xf2, 0xda, 0xc2, 0xf1, 0x51, 0x25, 0x71, 0x4a, 0xc7, 0x04, + 0x45, 0xf2, 0x0f, 0x2d, 0xb8, 0x90, 0xb9, 0xc6, 0x17, 0x67, 0x4e, 0xa3, 0x87, 0xf8, 0x24, 0xc9, + 0x96, 0x39, 0xd9, 0x6c, 0x90, 0x6f, 0x58, 0x7a, 0x2b, 0x53, 0x57, 0x4e, 0x8b, 0xb3, 0x9c, 0xb5, + 0x5b, 0x63, 0x1a, 0x0d, 0x62, 0xad, 0x49, 0x21, 0xae, 0x9d, 0x33, 0x76, 0x46, 0x55, 0x88, 0x69, + 0xf2, 0xe4, 0xeb, 0x96, 0xda, 0x1a, 0x35, 0x47, 0x67, 0x4e, 0x8b, 0x23, 0x12, 0xef, 0xb4, 0x9a, + 0xa1, 0x14, 0x71, 0xf2, 0x73, 0xb0, 0xe4, 0xec, 0xf8, 0x41, 0x94, 0xb9, 0xf8, 0x16, 0xe7, 0xf8, + 0x32, 0xba, 0x78, 0x7c, 0x54, 0x59, 0xaa, 0x0e, 0xac, 0x85, 0x27, 0x60, 0xb0, 0x7f, 0xab, 0x08, + 0xb3, 0xe2, 0x24, 0x24, 0xb7, 0xae, 0xdf, 0xb1, 0xe0, 0x99, 0x46, 0x2f, 0x08, 0xa8, 0x17, 0xd5, + 0x23, 0xda, 0xed, 0xdf, 0xb8, 0xac, 0x53, 0xdd, 0xb8, 0x9e, 0x3b, 0x3e, 0xaa, 0x3c, 0xb3, 0x7a, + 0x02, 0x7d, 0x3c, 0x91, 0x3b, 0xf2, 0x6f, 0x2c, 0xb0, 0x65, 0x85, 0x9a, 0xd3, 0xd8, 0x6f, 0x05, + 0x7e, 0xcf, 0x6b, 0xf6, 0x7f, 0xc4, 0xc4, 0xa9, 0x7e, 0xc4, 0x0b, 0xc7, 0x47, 0x15, 0x7b, 0xf5, + 0xa1, 0x5c, 0xe0, 0x10, 0x9c, 0x92, 0x37, 0xe1, 0xac, 0xac, 0x75, 0xe5, 0x7e, 0x97, 0x06, 0x2e, + 0x3b, 0x73, 0x48, 0xc5, 0x31, 0xf6, 0x56, 0x4a, 0x57, 0xc0, 0xfe, 0x36, 0x24, 0x84, 0xe9, 0x7b, + 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, 0x1a, 0xd3, 0x45, 0x49, 0x5a, 0x45, 0xee, 0x08, 0x9c, 0xb5, + 0x99, 0xe3, 0xa3, 0xca, 0xb4, 0xfc, 0x83, 0x8a, 0x12, 0xb9, 0x01, 0x73, 0xe2, 0x9c, 0xba, 0xe5, + 0x7a, 0xad, 0x2d, 0xdf, 0x13, 0x7e, 0x36, 0xe5, 0xda, 0x0b, 0x6a, 0xc3, 0xaf, 0x27, 0xa0, 0x0f, + 0x8e, 0x2a, 0xb3, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xfb, 0x53, 0x00, 0x6a, + 0xba, 0xd2, 0x2e, 0xf9, 0x08, 0x94, 0x43, 0x1a, 0x09, 0xaa, 0xf2, 0xe2, 0x44, 0xdc, 0x47, 0xa9, + 0x42, 0x8c, 0xe1, 0x64, 0x1f, 0x8a, 0x5d, 0xa7, 0x17, 0xd2, 0x7c, 0xce, 0x0f, 0x72, 0xf0, 0xb7, + 0x18, 0x46, 0x71, 0x30, 0xe5, 0x3f, 0x51, 0xd0, 0x20, 0x5f, 0xb6, 0x00, 0x68, 0x72, 0xc0, 0xc6, + 0x36, 0x10, 0x49, 0x92, 0xf1, 0x98, 0xb2, 0x3e, 0xa8, 0xcd, 0x1d, 0x1f, 0x55, 0xc0, 0x18, 0x7a, + 0x83, 0x2c, 0xb9, 0x07, 0x25, 0x47, 0xc9, 0xfc, 0xc9, 0xd3, 0x90, 0xf9, 0xfc, 0xbc, 0xa8, 0x27, + 0xad, 0x26, 0x46, 0xbe, 0x6a, 0xc1, 0x5c, 0x48, 0x23, 0x39, 0x54, 0x4c, 0xf2, 0x48, 0x85, 0x77, + 0xcc, 0x49, 0x57, 0x4f, 0xe0, 0x14, 0x12, 0x34, 0x59, 0x86, 0x29, 0xba, 0x8a, 0x95, 0x6b, 0xd4, + 0x69, 0xd2, 0x80, 0x9b, 0x23, 0xa4, 0x26, 0x35, 0x3e, 0x2b, 0x06, 0x4e, 0xcd, 0x8a, 0x51, 0x86, + 0x29, 0xba, 0x8a, 0x95, 0x4d, 0x37, 0x08, 0x7c, 0xc9, 0x4a, 0x29, 0x27, 0x56, 0x0c, 0x9c, 0x9a, + 0x15, 0xa3, 0x0c, 0x53, 0x74, 0xed, 0x6f, 0x9d, 0x81, 0x39, 0xb5, 0x90, 0x62, 0xcd, 0x5e, 0x58, + 0xbf, 0x06, 0x68, 0xf6, 0xab, 0x26, 0x10, 0x93, 0x75, 0x59, 0x63, 0xb1, 0x54, 0x93, 0x8a, 0xbd, + 0x6e, 0x5c, 0x37, 0x81, 0x98, 0xac, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x77, 0xe0, 0x63, + 0x5e, 0xd1, 0xc6, 0xf2, 0xc1, 0xb0, 0x24, 0x30, 0xf4, 0x28, 0xa8, 0x70, 0x03, 0x6e, 0x94, 0xb0, + 0xe9, 0xca, 0xc5, 0x91, 0xcf, 0xfa, 0x4c, 0x9a, 0x8b, 0xc5, 0x68, 0x24, 0xcb, 0x30, 0x45, 0x3e, + 0x43, 0xd9, 0x2f, 0x9e, 0xa2, 0xb2, 0xff, 0x69, 0x28, 0x75, 0x9c, 0xfb, 0xf5, 0x5e, 0xd0, 0x7a, + 0xf4, 0x43, 0x85, 0xf4, 0x2a, 0x14, 0x58, 0x50, 0xe3, 0x23, 0x5f, 0xb2, 0x0c, 0x91, 0x33, 0xcd, + 0x91, 0xdf, 0xc9, 0x57, 0xe4, 0xe8, 0xbd, 0x72, 0xa0, 0xf0, 0xe9, 0x53, 0xbd, 0x4b, 0x8f, 0x5d, + 0xf5, 0x66, 0x6a, 0xa4, 0x58, 0x20, 0x5a, 0x8d, 0x2c, 0x9f, 0xaa, 0x1a, 0xb9, 0x9a, 0x20, 0x86, + 0x29, 0xe2, 0x9c, 0x1f, 0xb1, 0xe6, 0x34, 0x3f, 0x70, 0xaa, 0xfc, 0xd4, 0x13, 0xc4, 0x30, 0x45, + 0x7c, 0xf0, 0x79, 0x73, 0xe6, 0x74, 0xce, 0x9b, 0xb3, 0x39, 0x9c, 0x37, 0x4f, 0x56, 0xc5, 0xcf, + 0x8c, 0xab, 0x8a, 0x93, 0xeb, 0x40, 0x9a, 0x87, 0x9e, 0xd3, 0x71, 0x1b, 0x52, 0x58, 0xf2, 0x6d, + 0x73, 0x8e, 0xdb, 0x23, 0x96, 0xa4, 0x20, 0x23, 0x6b, 0x7d, 0x35, 0x30, 0xa3, 0x15, 0x89, 0xa0, + 0xd4, 0x55, 0x1a, 0xd7, 0x7c, 0x1e, 0xb3, 0x5f, 0x69, 0x60, 0xc2, 0x4d, 0x82, 0x2d, 0x3c, 0x55, + 0x82, 0x9a, 0x12, 0xd9, 0x80, 0xf3, 0x1d, 0xd7, 0xdb, 0xf2, 0x9b, 0xe1, 0x16, 0x0d, 0xa4, 0xb5, + 0xa5, 0x4e, 0xa3, 0xc5, 0x05, 0xde, 0x37, 0xfc, 0x04, 0xbd, 0x99, 0x01, 0xc7, 0xcc, 0x56, 0xf6, + 0xff, 0xb0, 0x60, 0x61, 0xb5, 0xed, 0xf7, 0x9a, 0x77, 0x9c, 0xa8, 0xb1, 0x27, 0x3c, 0x04, 0xc8, + 0x1b, 0x50, 0x72, 0xbd, 0x88, 0x06, 0x07, 0x4e, 0x5b, 0xee, 0x4f, 0xb6, 0x32, 0x9f, 0xae, 0xcb, + 0xf2, 0x07, 0x47, 0x95, 0xb9, 0xb5, 0x5e, 0xc0, 0xad, 0xd4, 0x42, 0x5a, 0xa1, 0x6e, 0x43, 0xbe, + 0x65, 0xc1, 0x59, 0xe1, 0x63, 0xb0, 0xe6, 0x44, 0xce, 0xad, 0x1e, 0x0d, 0x5c, 0xaa, 0xbc, 0x0c, + 0xc6, 0x14, 0x54, 0x69, 0x5e, 0x15, 0x81, 0xc3, 0x58, 0x51, 0xdf, 0x4c, 0x53, 0xc6, 0x7e, 0x66, + 0xec, 0x5f, 0x29, 0xc0, 0x53, 0x03, 0x71, 0x91, 0x25, 0x98, 0x70, 0x9b, 0xf2, 0xd3, 0x41, 0xe2, + 0x9d, 0x58, 0x6f, 0xe2, 0x84, 0xdb, 0x24, 0xcb, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x0b, 0xe7, + 0xb2, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x35, 0x48, 0x05, 0x8a, 0xdc, 0xa3, 0x54, 0x9e, 0x27, 0xb8, + 0x16, 0xcb, 0x9d, 0x37, 0x51, 0x94, 0x93, 0x5f, 0xb4, 0x00, 0x04, 0x83, 0xec, 0x34, 0x22, 0x77, + 0x49, 0xcc, 0xb7, 0x9b, 0x18, 0x66, 0xc1, 0x65, 0xfc, 0x1f, 0x0d, 0xaa, 0x64, 0x1b, 0xa6, 0x98, + 0x42, 0xeb, 0x37, 0x1f, 0x79, 0x53, 0xe4, 0x37, 0x51, 0x5b, 0x1c, 0x07, 0x4a, 0x5c, 0xac, 0xaf, + 0x02, 0x1a, 0xf5, 0x02, 0x8f, 0x75, 0x2d, 0xdf, 0x06, 0x4b, 0x82, 0x0b, 0xd4, 0xa5, 0x68, 0xd4, + 0xb0, 0xff, 0xf9, 0x04, 0x9c, 0xcf, 0x62, 0x9d, 0xed, 0x36, 0x53, 0x82, 0x5b, 0x79, 0x34, 0xfe, + 0x99, 0xfc, 0xfb, 0x47, 0xba, 0xcb, 0xe8, 0x6b, 0x0a, 0xe9, 0xd0, 0x27, 0xe9, 0x92, 0x9f, 0xd1, + 0x3d, 0x34, 0xf1, 0x88, 0x3d, 0xa4, 0x31, 0xa7, 0x7a, 0xe9, 0x39, 0x98, 0x0c, 0xd9, 0xc8, 0x17, + 0x92, 0xd7, 0x1d, 0x7c, 0x8c, 0x38, 0x84, 0xd5, 0xe8, 0x79, 0x6e, 0x24, 0xc3, 0x30, 0x74, 0x8d, + 0xdb, 0x9e, 0x1b, 0x21, 0x87, 0xd8, 0xdf, 0x9c, 0x80, 0xa5, 0xc1, 0x1f, 0x45, 0xbe, 0x69, 0x01, + 0x34, 0xd9, 0x71, 0x25, 0xe4, 0xbe, 0xcc, 0xc2, 0xbd, 0xc8, 0x39, 0xad, 0x3e, 0x5c, 0x53, 0x94, + 0x62, 0x5f, 0x33, 0x5d, 0x14, 0xa2, 0xc1, 0x08, 0xb9, 0xac, 0xa6, 0x3e, 0xbf, 0xaa, 0x11, 0x8b, + 0x49, 0xb7, 0xd9, 0xd4, 0x10, 0x34, 0x6a, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, + 0x50, 0x0b, 0x3f, 0x8f, 0xde, 0x50, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3f, 0x04, 0x9f, 0x39, + 0xc5, 0x0c, 0xd8, 0xff, 0xcd, 0x82, 0x27, 0x57, 0xdb, 0xbd, 0x30, 0xa2, 0xc1, 0xff, 0x33, 0xae, + 0x7b, 0xff, 0xd3, 0x82, 0xa7, 0x07, 0x7c, 0xf3, 0x63, 0xf0, 0xe0, 0x7b, 0x37, 0xe9, 0xc1, 0x77, + 0x7b, 0xdc, 0x29, 0x9d, 0xf9, 0x1d, 0x03, 0x1c, 0xf9, 0xbe, 0x59, 0x80, 0x33, 0x4c, 0x6c, 0x35, + 0xfd, 0x56, 0x4e, 0x1b, 0xe7, 0xf3, 0x50, 0xfc, 0x3c, 0xdb, 0x80, 0xd2, 0x93, 0x8c, 0xef, 0x4a, + 0x28, 0x60, 0xe4, 0xcb, 0x16, 0x4c, 0x7f, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xa6, 0x30, 0x4c, + 0x7c, 0xc3, 0xb2, 0xdc, 0x21, 0x45, 0x28, 0x82, 0xf6, 0x1d, 0x54, 0x5b, 0xa9, 0xa2, 0x4c, 0x5e, + 0x84, 0xe9, 0x5d, 0x3f, 0xe8, 0xf4, 0xda, 0x4e, 0x3a, 0xfe, 0xed, 0xaa, 0x28, 0x46, 0x05, 0x67, + 0x8b, 0xdc, 0xe9, 0xba, 0x6f, 0xd3, 0x20, 0x14, 0x9e, 0xe9, 0x89, 0x45, 0x5e, 0xd5, 0x10, 0x34, + 0x6a, 0x2d, 0x7d, 0x12, 0x66, 0x4d, 0x46, 0x46, 0x0a, 0x51, 0xf8, 0x14, 0x48, 0x87, 0xc0, 0x94, + 0x78, 0xb1, 0x86, 0x11, 0x2f, 0xf6, 0xbf, 0x9b, 0x00, 0xc3, 0xd2, 0xf3, 0x18, 0x96, 0xad, 0x97, + 0x58, 0xb6, 0x63, 0x5a, 0x29, 0x0c, 0xbb, 0xd5, 0xa0, 0x80, 0xad, 0x83, 0x54, 0xc0, 0xd6, 0x8d, + 0xdc, 0x28, 0x9e, 0x1c, 0xaf, 0xf5, 0x7d, 0x0b, 0x9e, 0x8e, 0x2b, 0xf7, 0x1b, 0x61, 0x1f, 0x2e, + 0x83, 0x5f, 0x85, 0x19, 0x27, 0x6e, 0x26, 0x17, 0x89, 0x11, 0x2d, 0xa3, 0x41, 0x68, 0xd6, 0x8b, + 0xe3, 0x0c, 0x0a, 0x8f, 0x18, 0x67, 0x30, 0x79, 0x72, 0x9c, 0x81, 0xfd, 0xa3, 0x09, 0x78, 0xb6, + 0xff, 0xcb, 0x94, 0xf4, 0x18, 0xce, 0xa3, 0xe1, 0x35, 0x98, 0x8d, 0x64, 0x03, 0x63, 0x2f, 0xd4, + 0x91, 0xbb, 0xdb, 0x06, 0x0c, 0x13, 0x35, 0x59, 0xcb, 0x86, 0x90, 0x5b, 0xf5, 0x86, 0xdf, 0x55, + 0x51, 0x2a, 0xba, 0xe5, 0xaa, 0x01, 0xc3, 0x44, 0x4d, 0xed, 0xff, 0x3b, 0x79, 0xea, 0xfe, 0xbf, + 0x75, 0xb8, 0xa0, 0x3c, 0x1e, 0xaf, 0xfa, 0xc1, 0xaa, 0xdf, 0xe9, 0xb6, 0x69, 0xa4, 0xa4, 0x41, + 0xa9, 0xf6, 0xac, 0x6c, 0x72, 0x01, 0xb3, 0x2a, 0x61, 0x76, 0x5b, 0xfb, 0xfb, 0x05, 0x38, 0x17, + 0x77, 0xfb, 0xaa, 0xef, 0x35, 0x5d, 0xee, 0x34, 0xf3, 0x3a, 0x4c, 0x46, 0x87, 0x5d, 0xd5, 0xd9, + 0xff, 0xbf, 0x62, 0x67, 0xfb, 0xb0, 0xcb, 0x46, 0xfb, 0xc9, 0x8c, 0x26, 0xdc, 0x0c, 0xce, 0x1b, + 0x91, 0x0d, 0xbd, 0x3a, 0xc4, 0x08, 0xbc, 0x92, 0x9c, 0xcd, 0x0f, 0x8e, 0x2a, 0x19, 0x81, 0xeb, + 0xcb, 0x1a, 0x53, 0x72, 0xce, 0x93, 0xbb, 0x30, 0xd7, 0x76, 0xc2, 0xe8, 0x76, 0xb7, 0xe9, 0x44, + 0x74, 0xdb, 0x95, 0xee, 0x28, 0xa3, 0x05, 0x7f, 0xe8, 0x7b, 0xfb, 0x8d, 0x04, 0x26, 0x4c, 0x61, + 0x26, 0x07, 0x40, 0x58, 0xc9, 0x76, 0xe0, 0x78, 0xa1, 0xf8, 0x2a, 0x46, 0x6f, 0xf4, 0x60, 0x13, + 0x7d, 0x0c, 0xde, 0xe8, 0xc3, 0x86, 0x19, 0x14, 0xc8, 0x0b, 0x30, 0x15, 0x50, 0x27, 0xd4, 0xa2, + 0x5d, 0xaf, 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x82, 0x9a, 0x7a, 0xc8, 0x82, 0xfa, 0x53, 0x0b, + 0xe6, 0xe2, 0x61, 0x7a, 0x0c, 0x6a, 0x44, 0x27, 0xa9, 0x46, 0x5c, 0xcb, 0x4b, 0x24, 0x0e, 0xd0, + 0x1c, 0xfe, 0x60, 0xca, 0xfc, 0x3e, 0xee, 0xfc, 0xff, 0x05, 0x28, 0xab, 0x55, 0xad, 0xf4, 0xf3, + 0x31, 0xad, 0x09, 0x09, 0xcd, 0xcd, 0x08, 0x5a, 0x93, 0x44, 0x30, 0xa6, 0xc7, 0xf4, 0x96, 0xa6, + 0xd4, 0x49, 0xe4, 0xb4, 0xd7, 0x7a, 0x8b, 0xd2, 0x55, 0xb2, 0xf4, 0x16, 0xd5, 0x86, 0xdc, 0x86, + 0x27, 0xbb, 0x81, 0xcf, 0x43, 0xa7, 0xd7, 0xa8, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x26, 0x1b, 0xe1, + 0x36, 0xf2, 0xf4, 0xf1, 0x51, 0xe5, 0xc9, 0xad, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0xf8, 0x6e, + 0x72, 0x88, 0xe0, 0xbb, 0xbf, 0xa5, 0x0d, 0xa3, 0x34, 0x94, 0x21, 0x70, 0x9f, 0xc9, 0x6b, 0x28, + 0x33, 0xc4, 0x7a, 0x3c, 0xa5, 0xaa, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0xad, 0x6f, 0x53, 0x8f, 0x68, + 0x7d, 0x8b, 0x63, 0x28, 0xa6, 0x7f, 0x9c, 0x31, 0x14, 0xa5, 0x9f, 0xa8, 0x18, 0x8a, 0x0f, 0x8a, + 0xb0, 0x90, 0xd6, 0x40, 0x4e, 0x3f, 0xb0, 0xf0, 0xef, 0x58, 0xb0, 0xa0, 0x56, 0x8f, 0xa0, 0xa9, + 0x75, 0xf1, 0x8d, 0x9c, 0x16, 0xad, 0xd0, 0xa5, 0x74, 0xc6, 0x85, 0xed, 0x14, 0x35, 0xec, 0xa3, + 0x4f, 0xde, 0x81, 0x19, 0x7d, 0xfd, 0xf0, 0x48, 0x51, 0x86, 0xf3, 0x5c, 0x8b, 0x8a, 0x51, 0xa0, + 0x89, 0x8f, 0x7c, 0x60, 0x01, 0x34, 0xd4, 0x36, 0xa7, 0x56, 0xd7, 0xad, 0xbc, 0x56, 0x97, 0xde, + 0x40, 0x63, 0x65, 0x59, 0x17, 0x85, 0x68, 0x10, 0x26, 0xbf, 0xc2, 0x2f, 0x1e, 0xb4, 0x76, 0x27, + 0x32, 0x39, 0x8c, 0xed, 0x1f, 0x7e, 0x82, 0x62, 0x1a, 0xab, 0x52, 0x06, 0x28, 0xc4, 0x04, 0x13, + 0xf6, 0xeb, 0xa0, 0x3d, 0x7a, 0x99, 0xd8, 0xe2, 0x3e, 0xbd, 0x5b, 0x4e, 0xb4, 0x27, 0xa7, 0xa0, + 0x16, 0x5b, 0x57, 0x15, 0x00, 0xe3, 0x3a, 0xf6, 0xe7, 0x60, 0xee, 0xcd, 0xc0, 0xe9, 0xee, 0xb9, + 0xdc, 0xc0, 0xcf, 0x0e, 0x92, 0x2f, 0xc2, 0xb4, 0xd3, 0x6c, 0x66, 0x25, 0x07, 0xa9, 0x8a, 0x62, + 0x54, 0xf0, 0xa1, 0xce, 0x8c, 0xf6, 0xef, 0x5b, 0x40, 0xe2, 0x4b, 0x52, 0xd7, 0x6b, 0x6d, 0x3a, + 0x51, 0x63, 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, 0xe8, 0x9a, 0x86, 0xa0, 0x51, 0x8b, + 0xbc, 0x07, 0x33, 0xe2, 0xdf, 0xdb, 0xfa, 0xf4, 0x35, 0xbe, 0x63, 0x32, 0xdf, 0x50, 0x38, 0x4f, + 0x62, 0x16, 0x5e, 0x8b, 0x29, 0xa0, 0x49, 0x8e, 0x75, 0xd5, 0xba, 0xb7, 0xdb, 0xee, 0xdd, 0x6f, + 0xee, 0xc4, 0x5d, 0xd5, 0x0d, 0xfc, 0x5d, 0xb7, 0x4d, 0xd3, 0x5d, 0xb5, 0x25, 0x8a, 0x51, 0xc1, + 0x87, 0xeb, 0xaa, 0x7f, 0x65, 0xc1, 0xf9, 0xf5, 0x30, 0x72, 0xfd, 0x35, 0x1a, 0x46, 0x6c, 0x5b, + 0x61, 0xc2, 0xa7, 0xd7, 0x1e, 0xc6, 0x39, 0x7f, 0x0d, 0x16, 0xe4, 0x85, 0x6d, 0x6f, 0x27, 0xa4, + 0x91, 0xa1, 0xc7, 0xeb, 0x75, 0xbc, 0x9a, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0xde, 0xdc, 0xc6, + 0x58, 0x0a, 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2b, 0xc0, 0x39, 0xfe, 0x19, + 0xa9, 0xc0, 0x9a, 0xaf, 0x0f, 0x0a, 0xac, 0x19, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x56, 0xf3, + 0xb7, 0x2d, 0x98, 0x6f, 0x26, 0x7b, 0x3a, 0x1f, 0x03, 0x56, 0xd6, 0x18, 0x0a, 0xff, 0xb4, 0x54, + 0x21, 0xa6, 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x3e, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, + 0xa1, 0x3c, 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x27, 0xe4, 0x90, 0x9e, 0x46, 0xd4, 0x08, + 0xb9, 0x07, 0xe5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xea, 0xc2, + 0x57, 0x22, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, + 0x39, 0x8a, 0x6e, 0xaf, 0x6e, 0xa5, 0x09, 0xcb, 0x12, 0x46, 0x58, 0xd1, 0xb2, 0x7f, 0xd3, 0x82, + 0xf2, 0x75, 0x5f, 0xc9, 0x91, 0x9f, 0xcb, 0xc1, 0xd0, 0xa3, 0xf5, 0x41, 0x7d, 0x27, 0x1b, 0x1f, + 0x31, 0xde, 0x48, 0x98, 0x79, 0x9e, 0x31, 0x70, 0x2f, 0xf3, 0x1c, 0x69, 0x0c, 0xd5, 0x75, 0x7f, + 0x67, 0xa0, 0x9d, 0xf5, 0xd7, 0x8a, 0x70, 0xe6, 0x2d, 0xe7, 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, + 0xf1, 0x2a, 0xcc, 0x38, 0x5d, 0x7e, 0xe9, 0x67, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x59, + 0x2f, 0x16, 0x68, 0x22, 0x84, 0x23, 0x4b, 0x14, 0xad, 0xa6, 0xe0, 0xd8, 0xd7, 0x82, 0x5c, 0x07, + 0x22, 0x23, 0x8e, 0xab, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, + 0xec, 0xab, 0x81, 0x19, 0xad, 0xc8, 0x67, 0x61, 0xb1, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, + 0x1c, 0x3f, 0x75, 0x50, 0xc4, 0xea, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, + 0x69, 0x51, 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x08, 0xe5, + 0x68, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0x27, 0x8d, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, + 0x15, 0x56, 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, + 0x54, 0xd9, 0xaf, 0xe7, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, + 0x7b, 0x13, 0x30, 0x6b, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xd9, 0x82, 0xd9, 0x86, 0xef, 0x45, 0x81, + 0xdf, 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x8d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, + 0x06, 0x19, 0x4c, 0x10, 0x25, 0x5f, 0xb3, 0x60, 0x3e, 0xf6, 0xe9, 0x8b, 0x0d, 0x69, 0xb9, 0x32, + 0xa2, 0x45, 0xfd, 0x95, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x21, 0x3d, 0xda, 0xac, 0x2b, + 0xbb, 0x8e, 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0xb7, 0x9c, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x41, 0xa9, + 0xe3, 0x04, 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, + 0x1f, 0x83, 0xd9, 0x4d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x5b, 0xfc, 0xf3, 0x49, + 0x98, 0x31, 0xce, 0x66, 0xa7, 0x7f, 0xce, 0x4a, 0xa4, 0x4d, 0x29, 0xe4, 0x98, 0x36, 0xe5, 0xd3, + 0x00, 0xbb, 0xae, 0xe7, 0x86, 0x7b, 0x8f, 0x98, 0x90, 0x85, 0x5f, 0x62, 0x5f, 0xd5, 0x18, 0xd0, + 0xc0, 0x16, 0xdf, 0x14, 0x16, 0x4f, 0xc8, 0x2e, 0xf6, 0x81, 0x65, 0x6c, 0x37, 0x53, 0x79, 0x78, + 0x46, 0x18, 0x03, 0xb3, 0xac, 0xb6, 0x1f, 0x71, 0x89, 0x73, 0xd2, 0xae, 0xb4, 0x0d, 0xa5, 0x80, + 0x86, 0xbd, 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0d, 0xdc, 0x47, 0x05, 0x65, 0x7b, 0xd4, 0x98, + 0x96, 0x5e, 0x87, 0x33, 0x09, 0x16, 0x46, 0xba, 0xbe, 0xf1, 0x21, 0xd3, 0x00, 0xf0, 0x28, 0x97, + 0x39, 0x6c, 0x2c, 0xda, 0x46, 0x46, 0x16, 0x3d, 0x16, 0xc2, 0x13, 0x49, 0xc0, 0xec, 0x1f, 0x4d, + 0x81, 0xbc, 0xec, 0x1f, 0x42, 0x5c, 0x99, 0x57, 0x7c, 0x13, 0x8f, 0x70, 0xc5, 0x77, 0x1d, 0x66, + 0x5d, 0xcf, 0x8d, 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xae, 0xda, 0xb3, 0xeb, 0x06, + 0x2c, 0x03, 0x4f, 0xa2, 0x2d, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x09, 0x3c, 0xba, 0x47, 0x02, + 0x77, 0x46, 0x11, 0xf1, 0x5b, 0x02, 0x13, 0x3f, 0x7c, 0x88, 0x94, 0x34, 0xfa, 0xf8, 0x2d, 0xe7, + 0x71, 0x7c, 0xf8, 0x48, 0xc1, 0xb1, 0xaf, 0x05, 0xc3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, + 0x2c, 0x53, 0x49, 0x2c, 0x57, 0x53, 0x70, 0xec, 0x6b, 0x41, 0x76, 0x61, 0x56, 0x96, 0x09, 0xff, + 0xb2, 0xe9, 0x47, 0xfc, 0x4a, 0xee, 0x47, 0x78, 0xd5, 0xc0, 0x84, 0x09, 0xbc, 0xa4, 0x07, 0x67, + 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x3c, 0xf5, 0x28, 0xc4, 0x2e, + 0x1c, 0x1f, 0x55, 0xce, 0xae, 0xa7, 0xd1, 0x61, 0x3f, 0x05, 0xf2, 0x25, 0x0b, 0x2e, 0x34, 0x7c, + 0x2f, 0xe4, 0x39, 0x1e, 0x0e, 0xe8, 0x95, 0x20, 0xf0, 0x03, 0x41, 0xbb, 0xfc, 0x88, 0xb4, 0xb9, + 0x4d, 0x71, 0x35, 0x0b, 0x25, 0x66, 0x53, 0x22, 0xef, 0x42, 0xa9, 0x1b, 0xf8, 0x07, 0x6e, 0x93, + 0x06, 0xd2, 0x57, 0x71, 0x23, 0x8f, 0x9c, 0x33, 0x5b, 0x12, 0x67, 0x2c, 0x7a, 0x54, 0x09, 0x6a, + 0x7a, 0xf6, 0xff, 0x9a, 0x81, 0xb9, 0x64, 0x75, 0xf2, 0x0b, 0x00, 0xdd, 0xc0, 0xef, 0xd0, 0x68, + 0x8f, 0xea, 0x20, 0x98, 0x1b, 0xe3, 0xa6, 0x36, 0x51, 0xf8, 0x94, 0x7f, 0x0f, 0x13, 0x17, 0x71, + 0x29, 0x1a, 0x14, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x5b, 0xb9, 0xe8, 0x4c, + 0x92, 0x32, 0x8f, 0xde, 0x90, 0x45, 0xa8, 0x08, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, + 0xd5, 0xdf, 0xa1, 0xf2, 0x34, 0x53, 0x9b, 0x3e, 0x3e, 0xaa, 0x14, 0xee, 0xd0, 0x1d, 0x64, 0xc8, + 0xd9, 0x77, 0x35, 0xc5, 0x25, 0xbf, 0x14, 0x15, 0x6f, 0xe5, 0xe8, 0x31, 0x20, 0xbe, 0x4b, 0x16, + 0xa1, 0x22, 0x44, 0xde, 0x85, 0xf2, 0x3d, 0xe7, 0x80, 0xee, 0x06, 0xbe, 0x17, 0x49, 0xa7, 0xb2, + 0x31, 0xe3, 0x22, 0xee, 0x28, 0x74, 0x92, 0x2e, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xe4, 0xc8, 0x01, + 0x94, 0x3c, 0x7a, 0x0f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x87, 0x70, 0x43, 0x62, 0x93, 0x94, 0xf9, + 0xbe, 0xa7, 0xca, 0x50, 0xd3, 0x62, 0x63, 0x79, 0xd7, 0xdf, 0x91, 0x82, 0x6a, 0xcc, 0xb1, 0xd4, + 0x27, 0x53, 0x31, 0x96, 0xd7, 0xfd, 0x1d, 0x64, 0xc8, 0xd9, 0x1a, 0x69, 0x68, 0x8f, 0x26, 0x29, + 0xa6, 0x6e, 0xe4, 0xeb, 0xc9, 0x25, 0xd6, 0x48, 0x5c, 0x8a, 0x06, 0x45, 0xd6, 0xb7, 0x2d, 0x69, + 0xac, 0x94, 0x82, 0x6a, 0xcc, 0xbe, 0x4d, 0x9a, 0x3e, 0x45, 0xdf, 0xaa, 0x32, 0xd4, 0xb4, 0x18, + 0x5d, 0x57, 0x5a, 0xfe, 0xf2, 0x11, 0x55, 0x49, 0x3b, 0xa2, 0xa0, 0xab, 0xca, 0x50, 0xd3, 0x62, + 0xfd, 0x1d, 0xee, 0x1f, 0xde, 0x73, 0xda, 0xfb, 0xae, 0xd7, 0x92, 0x41, 0x9d, 0xe3, 0x66, 0x30, + 0xde, 0x3f, 0xbc, 0x23, 0xf0, 0x99, 0xfd, 0x1d, 0x97, 0xa2, 0x41, 0x91, 0xfc, 0x03, 0x0b, 0xa6, + 0xba, 0xed, 0x5e, 0xcb, 0xf5, 0x16, 0x67, 0xf3, 0xf0, 0xf6, 0x49, 0x8a, 0xdc, 0xe5, 0x2d, 0x8e, + 0x5a, 0x28, 0x8a, 0x3f, 0xad, 0x1d, 0x14, 0x79, 0xe1, 0x2f, 0xfd, 0x59, 0x65, 0x91, 0x7a, 0x0d, + 0xbf, 0xe9, 0x7a, 0xad, 0x95, 0xbb, 0xa1, 0xef, 0x2d, 0xa3, 0x73, 0x4f, 0xe9, 0xe8, 0x92, 0xa7, + 0xa5, 0x4f, 0xc0, 0x8c, 0x81, 0xe2, 0x61, 0x8a, 0xde, 0xac, 0xa9, 0xe8, 0xfd, 0xe6, 0x14, 0xcc, + 0x9a, 0x59, 0x13, 0x87, 0xd0, 0xbe, 0xf4, 0x89, 0x63, 0x62, 0x94, 0x13, 0x07, 0x3b, 0x62, 0x1a, + 0xb7, 0x47, 0xca, 0xbc, 0xb5, 0x9e, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x44, + 0x47, 0x70, 0x28, 0x61, 0x6a, 0xab, 0x50, 0xec, 0x8a, 0x49, 0xb5, 0x35, 0xa1, 0xaa, 0x5d, 0x06, + 0x88, 0xb3, 0x07, 0xca, 0x5b, 0x45, 0xad, 0x0f, 0x1b, 0x59, 0x0d, 0x8d, 0x5a, 0xe4, 0x05, 0x98, + 0x62, 0xaa, 0x0f, 0x6d, 0xca, 0x98, 0x73, 0x7d, 0x8e, 0xbf, 0xca, 0x4b, 0x51, 0x42, 0xc9, 0x6b, + 0x4c, 0x4b, 0x8d, 0x15, 0x16, 0x19, 0x4a, 0x7e, 0x3e, 0xd6, 0x52, 0x63, 0x18, 0x26, 0x6a, 0x32, + 0xd6, 0x29, 0xd3, 0x2f, 0xb8, 0x6c, 0x30, 0x58, 0xe7, 0x4a, 0x07, 0x0a, 0x18, 0xb7, 0x2b, 0xa5, + 0xf4, 0x11, 0xbe, 0xa6, 0x8b, 0x86, 0x5d, 0x29, 0x05, 0xc7, 0xbe, 0x16, 0xec, 0x63, 0xe4, 0x85, + 0xe8, 0x8c, 0xf0, 0x2c, 0x1e, 0x70, 0x95, 0xf9, 0x15, 0xf3, 0xac, 0x95, 0xe3, 0x1a, 0x12, 0xb3, + 0x76, 0xf8, 0xc3, 0xd6, 0x78, 0xc7, 0xa2, 0xcf, 0xc1, 0x5c, 0x72, 0x17, 0xca, 0xfd, 0xe6, 0xe3, + 0xab, 0x93, 0x70, 0xee, 0x46, 0xcb, 0xf5, 0xd2, 0x19, 0xc1, 0xb2, 0x12, 0xc2, 0x5b, 0x23, 0x27, + 0x84, 0xd7, 0xc1, 0x6b, 0x32, 0xdd, 0x7a, 0x76, 0xf0, 0x9a, 0xca, 0x7d, 0x9f, 0xac, 0x4b, 0xfe, + 0xd4, 0x82, 0x67, 0x9c, 0xa6, 0x38, 0x17, 0x38, 0x6d, 0x59, 0x6a, 0xe4, 0x31, 0x96, 0x2b, 0x3a, + 0x1c, 0x73, 0x97, 0xef, 0xff, 0xf8, 0xe5, 0xea, 0x09, 0x54, 0xc5, 0x88, 0xff, 0x94, 0xfc, 0x82, + 0x67, 0x4e, 0xaa, 0x8a, 0x27, 0xb2, 0x4f, 0xfe, 0x1a, 0xcc, 0x27, 0x3e, 0x58, 0x5a, 0xc2, 0xcb, + 0xe2, 0xc2, 0xa2, 0x9e, 0x04, 0x61, 0xba, 0xee, 0xd2, 0x4d, 0xf8, 0xf0, 0x43, 0xf9, 0x1c, 0x69, + 0xb2, 0x7d, 0xd7, 0x82, 0x59, 0x33, 0x79, 0x0f, 0x79, 0x09, 0x4a, 0x91, 0xbf, 0x4f, 0xbd, 0xdb, + 0x81, 0xf2, 0x6c, 0xd5, 0x13, 0x7d, 0x9b, 0x97, 0xe3, 0x06, 0xea, 0x1a, 0xac, 0x76, 0xa3, 0xed, + 0x52, 0x2f, 0x5a, 0x6f, 0xca, 0x61, 0xd6, 0xb5, 0x57, 0x45, 0xf9, 0x1a, 0xea, 0x1a, 0xc2, 0x81, + 0x8d, 0xfd, 0xae, 0xd3, 0x46, 0x40, 0x95, 0x1f, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x51, 0x93, + 0xd8, 0xda, 0xc4, 0x39, 0x19, 0xdf, 0x6b, 0xa4, 0x4c, 0x92, 0xbf, 0x6d, 0x41, 0x59, 0x98, 0xe8, + 0x91, 0xee, 0xa6, 0x7c, 0x51, 0x53, 0x46, 0x84, 0xea, 0xd6, 0x7a, 0x86, 0x2f, 0x2a, 0xdb, 0x96, + 0xf6, 0x5d, 0x4f, 0x7d, 0x89, 0xde, 0x96, 0xde, 0x72, 0xbd, 0x26, 0x72, 0x88, 0xde, 0xb8, 0x0a, + 0x03, 0x37, 0xae, 0x15, 0x28, 0x6b, 0xaf, 0x0e, 0x29, 0xfe, 0xb5, 0xf5, 0x56, 0x7b, 0x81, 0x60, + 0x5c, 0xc7, 0xfe, 0x75, 0x0b, 0xe6, 0x78, 0xb0, 0x73, 0x7c, 0x1e, 0x7e, 0x55, 0x3b, 0x5a, 0x09, + 0xbe, 0x9f, 0x4d, 0x3a, 0x5a, 0x3d, 0x38, 0xaa, 0xcc, 0x88, 0xf0, 0xe8, 0xa4, 0xdf, 0xd5, 0x67, + 0xa4, 0x11, 0x8d, 0xbb, 0x83, 0x4d, 0x8c, 0x6c, 0xe3, 0x89, 0xd9, 0x54, 0x48, 0x30, 0xc6, 0x67, + 0xbf, 0x07, 0xb3, 0x66, 0xd4, 0x12, 0x79, 0x15, 0x66, 0xba, 0xae, 0xd7, 0x4a, 0x46, 0xb7, 0xea, + 0x8b, 0x86, 0xad, 0x18, 0x84, 0x66, 0x3d, 0xde, 0xcc, 0x8f, 0x9b, 0xa5, 0xee, 0x27, 0xb6, 0x7c, + 0xb3, 0x59, 0xfc, 0x87, 0xe7, 0x90, 0xcf, 0x88, 0x8e, 0xcb, 0x3d, 0x87, 0x7c, 0x06, 0x8d, 0x1f, + 0x5f, 0x0e, 0xf9, 0x2c, 0x66, 0xfe, 0xcf, 0xca, 0x21, 0xff, 0xb3, 0x30, 0x6a, 0xf2, 0x50, 0xb6, + 0xd7, 0xdf, 0x33, 0x33, 0x10, 0xe8, 0x1e, 0x97, 0x29, 0x08, 0x24, 0xd4, 0xfe, 0x4e, 0x01, 0x16, + 0xd2, 0x47, 0xfe, 0xbc, 0xbd, 0x29, 0xc8, 0xd7, 0x2c, 0x98, 0x73, 0x12, 0x89, 0xda, 0x72, 0x7a, + 0x90, 0x26, 0x81, 0xd3, 0x48, 0x14, 0x96, 0x28, 0xc7, 0x14, 0x6d, 0xf2, 0xff, 0xc1, 0x74, 0xe4, + 0x76, 0xa8, 0xdf, 0x13, 0x86, 0xc0, 0x82, 0x38, 0x90, 0x6f, 0x8b, 0x22, 0x54, 0x30, 0x26, 0x94, + 0x5d, 0xae, 0x41, 0x05, 0x54, 0xba, 0xdd, 0x2e, 0xc4, 0x96, 0x4b, 0x51, 0x8e, 0xba, 0x06, 0xb9, + 0x0f, 0xd3, 0xc2, 0xef, 0x42, 0x39, 0xd8, 0x6c, 0xe6, 0x64, 0x9a, 0x10, 0xae, 0x1d, 0xf1, 0x10, + 0x88, 0xff, 0x21, 0x2a, 0x72, 0xf6, 0xc7, 0x60, 0xc4, 0x6c, 0xaa, 0xf6, 0x15, 0x20, 0xe8, 0xb7, + 0xdb, 0x3b, 0x4e, 0x63, 0xff, 0x8e, 0xeb, 0x35, 0xfd, 0x7b, 0x5c, 0x14, 0xad, 0x40, 0x39, 0x90, + 0xb1, 0xa5, 0xa1, 0x9c, 0x35, 0x5a, 0x96, 0xa9, 0xa0, 0xd3, 0x10, 0xe3, 0x3a, 0xf6, 0x1f, 0x4e, + 0xc0, 0xb4, 0x0c, 0x84, 0x7e, 0x0c, 0x6e, 0xff, 0xfb, 0x89, 0xfb, 0xe0, 0xf5, 0x5c, 0xe2, 0xb7, + 0x07, 0xfa, 0xfc, 0x87, 0x29, 0x9f, 0xff, 0xb7, 0xf2, 0x21, 0x77, 0xb2, 0xc3, 0xff, 0x1f, 0x14, + 0x61, 0x3e, 0x15, 0x58, 0xce, 0x74, 0xf1, 0x3e, 0x3f, 0xd7, 0xdb, 0xb9, 0xc6, 0xae, 0xeb, 0xa0, + 0x9d, 0x93, 0x5d, 0x5e, 0xc3, 0x44, 0xee, 0xeb, 0x5b, 0xb9, 0x3d, 0xeb, 0xf1, 0x97, 0x69, 0xb0, + 0x47, 0x74, 0xe1, 0x24, 0xdf, 0xb2, 0xe0, 0x9c, 0xd3, 0xff, 0x2e, 0x8a, 0xb4, 0x19, 0xde, 0xca, + 0xfd, 0xc1, 0x95, 0xda, 0xd3, 0x92, 0xc9, 0xac, 0xe7, 0x67, 0x30, 0x8b, 0x15, 0xfb, 0x3f, 0x5a, + 0xf0, 0xd4, 0xc0, 0x14, 0x09, 0x3c, 0xc3, 0x56, 0x90, 0x84, 0x4a, 0x99, 0x91, 0x73, 0x22, 0x18, + 0x7d, 0x7f, 0x9c, 0x4e, 0x8a, 0x94, 0x26, 0x4f, 0x5e, 0x81, 0x59, 0xae, 0xa3, 0x31, 0xe9, 0x19, + 0xd1, 0xae, 0xbc, 0xfe, 0xe2, 0x17, 0x21, 0x75, 0xa3, 0x1c, 0x13, 0xb5, 0xec, 0x6f, 0x59, 0xb0, + 0x38, 0x28, 0xdf, 0xd2, 0x10, 0xc6, 0x99, 0xbf, 0x9a, 0x0a, 0x9d, 0xa8, 0xf4, 0x85, 0x4e, 0xa4, + 0xcc, 0x33, 0x2a, 0x4a, 0xc2, 0xb0, 0x8c, 0x14, 0x1e, 0x12, 0x19, 0xf0, 0x75, 0x0b, 0x9e, 0x1c, + 0xb0, 0xe0, 0xfb, 0x42, 0x68, 0xac, 0x47, 0x0e, 0xa1, 0x99, 0x18, 0x36, 0x84, 0xc6, 0xfe, 0xa3, + 0x02, 0x2c, 0x48, 0x7e, 0x62, 0x45, 0xfd, 0xb5, 0x44, 0x00, 0xca, 0x4f, 0xa5, 0x02, 0x50, 0xce, + 0xa7, 0xeb, 0xff, 0x65, 0xf4, 0xc9, 0x4f, 0x56, 0xf4, 0xc9, 0x5f, 0x4c, 0xc0, 0x85, 0xcc, 0x34, + 0x50, 0xe4, 0xab, 0x19, 0xbb, 0xd7, 0x9d, 0x9c, 0xf3, 0x4d, 0x0d, 0xb9, 0x7f, 0x8d, 0x1b, 0xb2, + 0xf1, 0xab, 0x66, 0xa8, 0x84, 0xd8, 0x8d, 0x76, 0x4f, 0x21, 0x73, 0xd6, 0x88, 0x51, 0x13, 0xf6, + 0x2f, 0x15, 0xe0, 0xd2, 0xb0, 0x88, 0x7e, 0x42, 0xa3, 0xea, 0xc2, 0x44, 0x54, 0xdd, 0x63, 0xd2, + 0x2c, 0x4e, 0x25, 0xc0, 0xee, 0x1f, 0x4d, 0xea, 0x6d, 0xaf, 0x7f, 0x7e, 0x0e, 0xe5, 0x2b, 0x31, + 0xcd, 0xb4, 0x4f, 0x95, 0x41, 0x3b, 0x16, 0x85, 0xd3, 0x75, 0x51, 0xfc, 0xe0, 0xa8, 0x72, 0x36, + 0x4e, 0x46, 0x22, 0x0b, 0x51, 0x35, 0x22, 0x97, 0xa0, 0x14, 0x08, 0xa8, 0x8a, 0x23, 0x92, 0x0e, + 0x27, 0xa2, 0x0c, 0x35, 0x94, 0x7c, 0xd1, 0x50, 0xd7, 0x27, 0x4f, 0x2b, 0xe7, 0xce, 0x49, 0x7e, + 0x34, 0xef, 0x40, 0x29, 0x54, 0x69, 0x9e, 0x85, 0xe2, 0xf2, 0xf2, 0x90, 0xe1, 0x69, 0xec, 0x0c, + 0xae, 0x72, 0x3e, 0x8b, 0xef, 0xd3, 0x19, 0xa1, 0x35, 0x4a, 0x62, 0xeb, 0xe3, 0xaf, 0xb0, 0xf3, + 0x43, 0xff, 0xd1, 0x97, 0x44, 0x30, 0x2d, 0x5f, 0xff, 0x94, 0x17, 0x90, 0x9b, 0x39, 0x85, 0xa2, + 0x48, 0x47, 0x65, 0x7e, 0xaa, 0x54, 0x66, 0x18, 0x45, 0xca, 0xfe, 0xbe, 0x05, 0x33, 0x72, 0x8e, + 0x3c, 0x86, 0x38, 0xbd, 0xbb, 0xc9, 0x38, 0xbd, 0x2b, 0xb9, 0x48, 0xac, 0x01, 0x41, 0x7a, 0x77, + 0x61, 0xd6, 0xcc, 0x3f, 0x48, 0x3e, 0x6d, 0x48, 0x5c, 0x6b, 0x9c, 0x8c, 0x5e, 0x4a, 0x26, 0xc7, + 0xd2, 0xd8, 0xfe, 0xad, 0xb2, 0xee, 0x45, 0x7e, 0x76, 0x35, 0x67, 0xbe, 0x75, 0xe2, 0xcc, 0x37, + 0x27, 0xde, 0x44, 0xfe, 0x13, 0xef, 0x16, 0x94, 0x94, 0x58, 0x94, 0xca, 0xc3, 0xf3, 0xa6, 0xe7, + 0x32, 0xd3, 0x40, 0x18, 0x32, 0x63, 0xb9, 0xf0, 0x33, 0x68, 0x6c, 0x1c, 0x56, 0xe2, 0x5a, 0xa3, + 0x21, 0xef, 0xc2, 0xcc, 0x3d, 0x3f, 0xd8, 0x6f, 0xfb, 0x0e, 0xcf, 0xad, 0x0f, 0x79, 0x5c, 0x96, + 0x6b, 0x03, 0xaf, 0x08, 0x1f, 0xb9, 0x13, 0xe3, 0x47, 0x93, 0x18, 0xa9, 0xc2, 0x7c, 0xc7, 0xf5, + 0x90, 0x3a, 0x4d, 0x1d, 0x8e, 0x37, 0x29, 0xf2, 0x5a, 0x2b, 0xd5, 0x7a, 0x33, 0x09, 0xc6, 0x74, + 0x7d, 0x6e, 0xfc, 0x09, 0x12, 0xd6, 0x06, 0x99, 0xbc, 0x76, 0x6b, 0xfc, 0xc9, 0x98, 0xb4, 0x60, + 0x88, 0xf8, 0x89, 0x64, 0x39, 0xa6, 0x68, 0x93, 0x2f, 0x40, 0x29, 0x94, 0xc9, 0x05, 0xf3, 0xf1, + 0xb2, 0xd0, 0x67, 0x7b, 0x81, 0x34, 0x1e, 0x4a, 0x55, 0x82, 0x9a, 0x20, 0xd9, 0x80, 0xf3, 0xca, + 0x7c, 0x92, 0x78, 0xff, 0x6c, 0x2a, 0xce, 0x45, 0x85, 0x19, 0x70, 0xcc, 0x6c, 0xc5, 0x54, 0x39, + 0x9e, 0xd7, 0x53, 0x5c, 0x4e, 0x1a, 0xf7, 0x79, 0x7c, 0xfd, 0x35, 0x51, 0x42, 0x4f, 0x8a, 0x36, + 0x2d, 0x8d, 0x11, 0x6d, 0x5a, 0x87, 0x0b, 0x69, 0x10, 0x4f, 0x32, 0xc6, 0xf3, 0x9a, 0x19, 0x5b, + 0xe8, 0x56, 0x56, 0x25, 0xcc, 0x6e, 0x4b, 0xee, 0x40, 0x39, 0xa0, 0xfc, 0x90, 0x55, 0x55, 0x7e, + 0x5d, 0x23, 0x7b, 0xb0, 0xa2, 0x42, 0x80, 0x31, 0x2e, 0x36, 0xee, 0x4e, 0x32, 0xd3, 0xf4, 0xad, + 0x1c, 0x1f, 0xde, 0x95, 0x63, 0x3f, 0x20, 0xf9, 0x9f, 0xfd, 0xaf, 0xe7, 0xe1, 0x4c, 0xc2, 0x06, + 0x44, 0x9e, 0x87, 0x22, 0xcf, 0xba, 0xc6, 0xa5, 0x55, 0x29, 0x96, 0xa8, 0xa2, 0x73, 0x04, 0x8c, + 0xfc, 0xb2, 0x05, 0xf3, 0xdd, 0xc4, 0x9d, 0x86, 0x12, 0xe4, 0x63, 0x1a, 0x4e, 0x93, 0x17, 0x25, + 0xc6, 0x1b, 0x0d, 0x49, 0x62, 0x98, 0xa6, 0xce, 0xe4, 0x81, 0x74, 0x03, 0x6f, 0xd3, 0x80, 0xd7, + 0x96, 0x8a, 0x9e, 0x46, 0xb1, 0x9a, 0x04, 0x63, 0xba, 0x3e, 0x1b, 0x61, 0xfe, 0x75, 0xe3, 0x3c, + 0xed, 0x58, 0x55, 0x08, 0x30, 0xc6, 0x45, 0xde, 0x80, 0x39, 0x99, 0x60, 0x78, 0xcb, 0x6f, 0x5e, + 0x73, 0xc2, 0x3d, 0x79, 0xc2, 0xd1, 0x27, 0xb2, 0xd5, 0x04, 0x14, 0x53, 0xb5, 0xf9, 0xb7, 0xc5, + 0x59, 0x9c, 0x39, 0x82, 0xa9, 0xe4, 0x13, 0x16, 0xab, 0x49, 0x30, 0xa6, 0xeb, 0x93, 0x97, 0x8c, + 0x6d, 0x48, 0x38, 0x0c, 0x68, 0x69, 0x90, 0xb1, 0x15, 0x55, 0x61, 0xbe, 0xc7, 0x0f, 0x84, 0x4d, + 0x05, 0x94, 0xeb, 0x51, 0x13, 0xbc, 0x9d, 0x04, 0x63, 0xba, 0x3e, 0x79, 0x1d, 0xce, 0x04, 0x4c, + 0xd8, 0x6a, 0x04, 0xc2, 0x8b, 0x40, 0x5f, 0x12, 0xa3, 0x09, 0xc4, 0x64, 0x5d, 0xf2, 0x26, 0x9c, + 0x8d, 0xf3, 0x71, 0x2a, 0x04, 0xc2, 0xad, 0x40, 0x27, 0x87, 0xab, 0xa6, 0x2b, 0x60, 0x7f, 0x1b, + 0xf2, 0x37, 0x60, 0xc1, 0xe8, 0x89, 0x75, 0xaf, 0x49, 0xef, 0xcb, 0x9c, 0x89, 0xfc, 0x49, 0xa6, + 0xd5, 0x14, 0x0c, 0xfb, 0x6a, 0x93, 0x4f, 0xc2, 0x5c, 0xc3, 0x6f, 0xb7, 0xb9, 0x8c, 0x13, 0xcf, + 0x27, 0x88, 0xe4, 0x88, 0x22, 0x8d, 0x64, 0x02, 0x82, 0xa9, 0x9a, 0xe4, 0x3a, 0x10, 0x7f, 0x87, + 0xa9, 0x57, 0xb4, 0xf9, 0x26, 0xf5, 0xa8, 0xd4, 0x38, 0xce, 0x24, 0x83, 0x50, 0x6e, 0xf6, 0xd5, + 0xc0, 0x8c, 0x56, 0x3c, 0xb7, 0x9c, 0x11, 0xb4, 0x3b, 0x97, 0xc7, 0x33, 0x87, 0x69, 0xf3, 0xc5, + 0x43, 0x23, 0x76, 0x03, 0x98, 0x12, 0x31, 0x41, 0xf9, 0x64, 0x49, 0x34, 0x33, 0xa9, 0xc7, 0x7b, + 0x84, 0x28, 0x45, 0x49, 0x89, 0xfc, 0x02, 0x94, 0x77, 0xd4, 0xb3, 0x1a, 0x3c, 0x35, 0xe2, 0xd8, + 0xfb, 0x62, 0xea, 0x85, 0x98, 0xf8, 0x78, 0xae, 0x01, 0x18, 0x93, 0x24, 0x2f, 0xc0, 0xcc, 0xb5, + 0xad, 0xaa, 0x9e, 0x85, 0x67, 0xf9, 0xe8, 0x4f, 0xb2, 0x26, 0x68, 0x02, 0xd8, 0x0a, 0xd3, 0xea, + 0x1b, 0x49, 0xde, 0x94, 0x67, 0x68, 0x63, 0xac, 0x36, 0xbf, 0xfa, 0xc7, 0xfa, 0xe2, 0xb9, 0x54, + 0x6d, 0x59, 0x8e, 0xba, 0x06, 0x79, 0x07, 0x66, 0xe4, 0x7e, 0xc1, 0x65, 0xd3, 0xf9, 0x47, 0x0b, + 0x08, 0xc7, 0x18, 0x05, 0x9a, 0xf8, 0xf8, 0x9d, 0x2d, 0x7f, 0x6d, 0x80, 0x5e, 0xed, 0xb5, 0xdb, + 0x8b, 0x17, 0xb8, 0xdc, 0x8c, 0xef, 0x6c, 0x63, 0x10, 0x9a, 0xf5, 0xc8, 0xcb, 0xca, 0x85, 0xeb, + 0x43, 0x89, 0x4b, 0x6c, 0xed, 0xc2, 0xa5, 0x95, 0xee, 0x01, 0x31, 0x23, 0x4f, 0x3e, 0xc4, 0x77, + 0x6a, 0x07, 0x96, 0x94, 0xc6, 0xd7, 0xbf, 0x48, 0x16, 0x17, 0x13, 0xa6, 0x92, 0xa5, 0x3b, 0x03, + 0x6b, 0xe2, 0x09, 0x58, 0xc8, 0x0e, 0x14, 0x9c, 0xf6, 0xce, 0xe2, 0x53, 0x79, 0xa8, 0xae, 0xd5, + 0x8d, 0x9a, 0x9c, 0x51, 0xdc, 0xcf, 0xb3, 0xba, 0x51, 0x43, 0x86, 0x9c, 0xb8, 0x30, 0xe9, 0xb4, + 0x77, 0xc2, 0xc5, 0x25, 0xbe, 0x66, 0x73, 0x23, 0x12, 0x1b, 0x0f, 0x36, 0x6a, 0x21, 0x72, 0x12, + 0xf6, 0x97, 0x26, 0xf4, 0x45, 0x8d, 0x4e, 0x54, 0xfd, 0x9e, 0xb9, 0x80, 0xac, 0x3c, 0x9e, 0xbf, + 0xef, 0x7b, 0xe6, 0x46, 0xec, 0x7d, 0x99, 0xcb, 0xa7, 0xab, 0x45, 0x46, 0x2e, 0x59, 0xb1, 0x92, + 0x49, 0xb8, 0xc5, 0xe9, 0x39, 0x29, 0x30, 0xec, 0xef, 0x80, 0x36, 0xfa, 0xa5, 0xdc, 0x9f, 0x02, + 0x28, 0xba, 0x61, 0xe4, 0xfa, 0x39, 0xc6, 0x49, 0xa7, 0xb2, 0x57, 0xf3, 0x30, 0x0c, 0x0e, 0x40, + 0x41, 0x8a, 0xd1, 0xf4, 0x5a, 0xae, 0x77, 0x5f, 0x7e, 0xfe, 0xad, 0xdc, 0xfd, 0x9a, 0x04, 0x4d, + 0x0e, 0x40, 0x41, 0x8a, 0xdc, 0x15, 0x93, 0xba, 0x90, 0xc7, 0x58, 0x57, 0x37, 0x6a, 0x29, 0x7a, + 0xc9, 0xc9, 0x7d, 0x17, 0x0a, 0x61, 0xc7, 0x95, 0xea, 0xd2, 0x98, 0xb4, 0xea, 0x9b, 0xeb, 0x59, + 0xb4, 0xea, 0x9b, 0xeb, 0xc8, 0x88, 0x90, 0xaf, 0x58, 0x00, 0x4e, 0x67, 0xc7, 0x09, 0x43, 0xa7, + 0xa9, 0xad, 0x33, 0x63, 0xbe, 0x4a, 0x51, 0xd5, 0xf8, 0x52, 0xa4, 0xb9, 0x27, 0x6f, 0x0c, 0x45, + 0x83, 0x32, 0x79, 0x17, 0xa6, 0x1d, 0xf1, 0xec, 0x9f, 0x74, 0x4a, 0xcf, 0xe7, 0x2d, 0xcb, 0x14, + 0x07, 0xdc, 0x4c, 0x23, 0x41, 0xa8, 0x08, 0x32, 0xda, 0x51, 0xe0, 0xd0, 0x5d, 0x77, 0x5f, 0x1a, + 0x87, 0xea, 0x63, 0x3f, 0x4c, 0xc1, 0x90, 0x65, 0xd1, 0x96, 0x20, 0x54, 0x04, 0xc5, 0x33, 0xec, + 0x8e, 0xe7, 0xe8, 0x50, 0xc3, 0x7c, 0x02, 0x52, 0xcd, 0xe0, 0x45, 0xe3, 0x19, 0x76, 0x93, 0x10, + 0x26, 0xe9, 0x92, 0x03, 0x98, 0x72, 0xf8, 0x83, 0xa4, 0xf2, 0x28, 0x86, 0x79, 0x3c, 0x6e, 0x9a, + 0xea, 0x03, 0x2e, 0x5c, 0xe4, 0xb3, 0xa7, 0x92, 0x1a, 0xf9, 0x0d, 0x0b, 0xa6, 0x85, 0xbf, 0x34, + 0x53, 0x48, 0xd9, 0xb7, 0x7f, 0xee, 0x14, 0xb2, 0xe0, 0x4b, 0x5f, 0x6e, 0xe9, 0x01, 0xf4, 0x11, + 0xed, 0x0c, 0x2a, 0x4a, 0x4f, 0xf4, 0xe6, 0x56, 0xdc, 0x2d, 0x7d, 0x12, 0x66, 0x4d, 0x2c, 0x23, + 0xf9, 0x73, 0xff, 0xb0, 0x00, 0xc0, 0x3b, 0x5a, 0x24, 0x17, 0xe9, 0xf0, 0x94, 0xbd, 0x7b, 0x7e, + 0x33, 0xa7, 0xc7, 0x0b, 0x8d, 0x1c, 0x21, 0x20, 0xf3, 0xf3, 0xee, 0xf9, 0x4d, 0x94, 0x44, 0x48, + 0x0b, 0x26, 0xbb, 0x4e, 0xb4, 0x97, 0x7f, 0x42, 0x92, 0x92, 0x88, 0xb2, 0x8d, 0xf6, 0x90, 0x13, + 0x20, 0xef, 0x5b, 0xb1, 0x6b, 0x4c, 0x21, 0x1f, 0x07, 0x06, 0xd5, 0x67, 0xcb, 0xd2, 0x19, 0x26, + 0x95, 0x7c, 0x33, 0xed, 0x22, 0xb3, 0xf4, 0x81, 0x05, 0xb3, 0x66, 0xd5, 0x8c, 0x61, 0xfa, 0x79, + 0x73, 0x98, 0xf2, 0xec, 0x0f, 0x73, 0xc4, 0xff, 0x8b, 0x05, 0x10, 0x3f, 0xc5, 0x1f, 0xbb, 0xad, + 0x5b, 0x43, 0xbb, 0xad, 0x4f, 0x8c, 0xe8, 0xb6, 0x5e, 0x18, 0xc9, 0x6d, 0x7d, 0x72, 0x74, 0xb7, + 0xf5, 0xe2, 0x60, 0xb7, 0x75, 0xfb, 0x1b, 0x16, 0x9c, 0xed, 0xdb, 0x6d, 0x98, 0x1e, 0x1c, 0xf8, + 0x7e, 0x34, 0xc0, 0xe5, 0x11, 0x63, 0x10, 0x9a, 0xf5, 0xc8, 0x1a, 0x2c, 0xc8, 0x07, 0x2a, 0xea, + 0xdd, 0xb6, 0x9b, 0x99, 0x2c, 0x66, 0x3b, 0x05, 0xc7, 0xbe, 0x16, 0xf6, 0x77, 0x2c, 0x98, 0x31, + 0x42, 0xcc, 0xd9, 0x77, 0x70, 0xbf, 0x57, 0xc9, 0x46, 0xfc, 0x36, 0x07, 0xbf, 0xa8, 0x12, 0x30, + 0x71, 0x67, 0xda, 0x32, 0xd2, 0x97, 0xc7, 0x77, 0xa6, 0xac, 0x14, 0x25, 0x54, 0x24, 0xa6, 0xa6, + 0x5d, 0xde, 0xe9, 0x05, 0x33, 0x31, 0x35, 0xed, 0x22, 0x87, 0x70, 0x72, 0xec, 0x40, 0x20, 0x5d, + 0x5a, 0x8d, 0xa7, 0x40, 0x9c, 0x20, 0x42, 0x01, 0x23, 0xcf, 0x42, 0x81, 0x7a, 0x4d, 0x69, 0xbd, + 0xd0, 0x8f, 0x75, 0x5e, 0xf1, 0x9a, 0xc8, 0xca, 0xed, 0x9b, 0x30, 0x2b, 0xdc, 0x79, 0xdf, 0xa2, + 0x87, 0x43, 0xbf, 0xfe, 0xc9, 0x66, 0x7b, 0xea, 0xf5, 0x4f, 0xd6, 0x9c, 0x95, 0xdb, 0xff, 0xd4, + 0x82, 0xd4, 0x7b, 0x35, 0xc6, 0xfd, 0x89, 0x35, 0xf0, 0xfe, 0xc4, 0xb4, 0xb9, 0x4f, 0x9c, 0x68, + 0x73, 0xbf, 0x0e, 0xa4, 0xc3, 0x96, 0x42, 0xe2, 0x75, 0x26, 0x69, 0x38, 0x8a, 0x13, 0x5a, 0xf4, + 0xd5, 0xc0, 0x8c, 0x56, 0xf6, 0x3f, 0x11, 0xcc, 0x9a, 0x2f, 0xd8, 0x3c, 0xbc, 0x03, 0x7a, 0x50, + 0xe4, 0xa8, 0xa4, 0xf5, 0x6c, 0x4c, 0xcb, 0x73, 0x7f, 0x62, 0xa8, 0x78, 0x20, 0xe5, 0x92, 0xe7, + 0xd4, 0xec, 0x3f, 0x12, 0xbc, 0x1a, 0x4f, 0xdc, 0x0c, 0xc1, 0x6b, 0x27, 0xc9, 0xeb, 0xb5, 0xbc, + 0x64, 0x65, 0x36, 0x8f, 0x64, 0x19, 0xa0, 0x4b, 0x83, 0x06, 0xf5, 0x22, 0x15, 0x68, 0x53, 0x94, + 0x21, 0x9f, 0xba, 0x14, 0x8d, 0x1a, 0xf6, 0xd7, 0xd9, 0x02, 0x8a, 0xdf, 0xc5, 0x25, 0x97, 0xd2, + 0xbe, 0xa2, 0xe9, 0xc5, 0xa1, 0x5d, 0x45, 0x8d, 0xf0, 0x8b, 0x89, 0x87, 0x84, 0x5f, 0xbc, 0x08, + 0xd3, 0x81, 0xdf, 0xa6, 0xd5, 0xc0, 0x4b, 0x3b, 0xb8, 0x20, 0x2b, 0xc6, 0x1b, 0xa8, 0xe0, 0xf6, + 0xaf, 0x59, 0xb0, 0x90, 0x8e, 0x0f, 0xcb, 0xdd, 0x81, 0xd5, 0x0c, 0x62, 0x2f, 0x8c, 0x1e, 0xc4, + 0x6e, 0xbf, 0xcf, 0x98, 0x8c, 0xdc, 0xc6, 0xbe, 0xeb, 0x89, 0xb8, 0x6f, 0xd6, 0x73, 0x2f, 0xc2, + 0x34, 0x95, 0xef, 0x7b, 0x0a, 0x23, 0xb0, 0x66, 0x52, 0x3d, 0xeb, 0xa9, 0xe0, 0xa4, 0x0a, 0xf3, + 0xea, 0xea, 0x4b, 0x59, 0xee, 0x45, 0xbe, 0x0a, 0x6d, 0x29, 0x5c, 0x4b, 0x82, 0x31, 0x5d, 0xdf, + 0xfe, 0x22, 0xcc, 0x18, 0x9b, 0x12, 0x97, 0xdf, 0xf7, 0x9d, 0x46, 0x94, 0x96, 0x7b, 0x57, 0x58, + 0x21, 0x0a, 0x18, 0xbf, 0x60, 0x10, 0xe1, 0x2b, 0x29, 0xb9, 0x27, 0x83, 0x56, 0x24, 0x94, 0x21, + 0x0b, 0x68, 0x8b, 0xde, 0x57, 0xd9, 0xe5, 0x15, 0x32, 0x64, 0x85, 0x28, 0x60, 0xf6, 0x4b, 0x50, + 0x52, 0x59, 0x85, 0x78, 0x6a, 0x0e, 0x65, 0xfc, 0x36, 0x53, 0x73, 0xf8, 0x41, 0x84, 0x1c, 0x62, + 0xbf, 0x0d, 0x25, 0x95, 0xfc, 0xe8, 0xe1, 0xb5, 0x99, 0x28, 0x0a, 0x3d, 0xf7, 0x9a, 0x1f, 0x46, + 0x2a, 0x63, 0x93, 0xb8, 0x9f, 0xbb, 0xb1, 0xce, 0xcb, 0x50, 0x43, 0xed, 0x97, 0x61, 0x3e, 0x75, + 0x4f, 0x3b, 0x44, 0x1e, 0x8f, 0xdf, 0x2b, 0xc0, 0xac, 0x79, 0x5d, 0x37, 0xc4, 0x2a, 0x1e, 0x5e, + 0x38, 0x66, 0x5c, 0xb1, 0x15, 0x46, 0xbc, 0x62, 0x33, 0xef, 0x34, 0x27, 0x4f, 0xf7, 0x4e, 0xb3, + 0x98, 0xcf, 0x9d, 0xa6, 0x71, 0xf7, 0x3e, 0xf5, 0xf8, 0xee, 0xde, 0x7f, 0xa7, 0x08, 0x73, 0xc9, + 0xc4, 0x90, 0x43, 0x8c, 0xe4, 0x4b, 0x7d, 0x23, 0x39, 0xa2, 0x4d, 0xbf, 0x30, 0xae, 0x4d, 0x7f, + 0x72, 0x5c, 0x9b, 0x7e, 0xf1, 0x11, 0x6c, 0xfa, 0xfd, 0x16, 0xf9, 0xa9, 0xa1, 0x2d, 0xf2, 0x9f, + 0xd2, 0x5e, 0x79, 0xd3, 0x09, 0x37, 0x96, 0xd8, 0x2b, 0x8f, 0x24, 0x87, 0x61, 0xd5, 0x6f, 0x66, + 0x7a, 0x37, 0x96, 0x1e, 0x62, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, + 0x0e, 0x74, 0xaf, 0xc2, 0x8c, 0x9c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, + 0xd6, 0xe3, 0x0f, 0xa4, 0x27, 0x9f, 0xcd, 0xe7, 0x57, 0x24, 0xe6, 0x03, 0xe9, 0xa9, 0x67, 0xf6, + 0xd3, 0xf5, 0xed, 0x2f, 0xc0, 0x85, 0x4c, 0x33, 0x02, 0x37, 0xe1, 0x72, 0xed, 0x88, 0x36, 0x65, + 0x05, 0x83, 0x8d, 0xd4, 0xc3, 0x0a, 0x4b, 0x77, 0x06, 0xd6, 0xc4, 0x13, 0xb0, 0xd8, 0xdf, 0x2e, + 0xc0, 0x5c, 0xf2, 0x75, 0x4d, 0x72, 0x4f, 0x1b, 0x1d, 0x73, 0xb1, 0x77, 0x0a, 0xb4, 0x46, 0xb2, + 0xc1, 0x81, 0x97, 0x15, 0xf7, 0xf8, 0xfc, 0xda, 0xd1, 0x99, 0x0f, 0x4f, 0x8f, 0xb0, 0xbc, 0x25, + 0x90, 0xe4, 0xf8, 0x03, 0x9a, 0x71, 0x5c, 0xa2, 0x3c, 0xcd, 0xe6, 0x4e, 0x3d, 0x8e, 0xaf, 0xd3, + 0xa4, 0xd0, 0x20, 0xcb, 0xf6, 0x96, 0x03, 0x1a, 0xb8, 0xbb, 0xae, 0x7e, 0x19, 0x9c, 0x4b, 0xee, + 0xb7, 0x65, 0x19, 0x6a, 0xa8, 0xfd, 0xfe, 0x04, 0x94, 0x79, 0x1a, 0xa5, 0xab, 0x81, 0xdf, 0xe1, + 0x4f, 0xd0, 0x85, 0xc6, 0xc9, 0x41, 0x0e, 0xdb, 0xf5, 0x71, 0xdf, 0x79, 0x8c, 0x31, 0x4a, 0x8f, + 0x69, 0xa3, 0x04, 0x13, 0x14, 0x49, 0x17, 0x4a, 0xbb, 0x32, 0xed, 0xab, 0x1c, 0xbb, 0x31, 0x53, + 0x17, 0xaa, 0x24, 0xb2, 0xa2, 0x0b, 0xd4, 0x3f, 0xd4, 0x54, 0x6c, 0x07, 0xe6, 0x53, 0x79, 0x30, + 0x72, 0x4f, 0x16, 0xfb, 0xdf, 0x27, 0xa1, 0xac, 0xc3, 0x75, 0xc8, 0x27, 0x12, 0x66, 0x9c, 0x72, + 0xed, 0xc3, 0xc6, 0xfb, 0x48, 0x7b, 0x7e, 0xf3, 0xc1, 0x51, 0x65, 0x5e, 0x57, 0x4e, 0x99, 0x64, + 0x9e, 0x85, 0x42, 0x2f, 0x68, 0xa7, 0xcf, 0x69, 0xb7, 0x71, 0x03, 0x59, 0xb9, 0x19, 0x62, 0x54, + 0x78, 0xac, 0x21, 0x46, 0x6c, 0x97, 0xdc, 0xf1, 0x9b, 0x87, 0xe9, 0xf7, 0x94, 0x6a, 0x7e, 0xf3, + 0x10, 0x39, 0x84, 0xbc, 0x01, 0x73, 0x32, 0x6e, 0xca, 0x7c, 0x65, 0xbe, 0x10, 0x5f, 0xbe, 0x6f, + 0x27, 0xa0, 0x98, 0xaa, 0xcd, 0x76, 0xd9, 0xbb, 0xa1, 0xef, 0xf1, 0x14, 0xc0, 0x53, 0xc9, 0x9b, + 0xba, 0xeb, 0xf5, 0x9b, 0x37, 0xb8, 0x39, 0x49, 0xd7, 0x48, 0x84, 0x66, 0x4d, 0x3f, 0x34, 0x34, + 0x6b, 0x4d, 0xe0, 0x66, 0xdc, 0xf2, 0x1d, 0x65, 0xb6, 0x76, 0x49, 0xe1, 0x65, 0x65, 0x0f, 0x8e, + 0x4e, 0x30, 0xf4, 0xe9, 0x96, 0x59, 0x41, 0x6c, 0xe5, 0x1f, 0x5f, 0x10, 0x9b, 0x7d, 0x1b, 0xe6, + 0x53, 0xe3, 0xa7, 0x8e, 0xf9, 0x56, 0xf6, 0x31, 0x7f, 0xb8, 0x17, 0x99, 0xfe, 0x99, 0x05, 0x67, + 0xfb, 0x24, 0xd2, 0xb0, 0xd1, 0x84, 0xe9, 0xbd, 0x71, 0xe2, 0xd1, 0xf7, 0xc6, 0xc2, 0x68, 0x7b, + 0x63, 0x6d, 0xe7, 0xbb, 0x3f, 0xb8, 0xf8, 0xc4, 0xf7, 0x7e, 0x70, 0xf1, 0x89, 0x3f, 0xfe, 0xc1, + 0xc5, 0x27, 0xde, 0x3f, 0xbe, 0x68, 0x7d, 0xf7, 0xf8, 0xa2, 0xf5, 0xbd, 0xe3, 0x8b, 0xd6, 0x1f, + 0x1f, 0x5f, 0xb4, 0xfe, 0xc3, 0xf1, 0x45, 0xeb, 0x1b, 0x7f, 0x7e, 0xf1, 0x89, 0x4f, 0x7f, 0x2a, + 0x1e, 0xa9, 0x15, 0x35, 0x52, 0xfc, 0xc7, 0x47, 0xd5, 0xb8, 0xac, 0x74, 0xf7, 0x5b, 0x2b, 0x6c, + 0xa4, 0x56, 0x74, 0x89, 0x1a, 0xa9, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x24, 0xf8, 0x71, 0x9d, + 0x62, 0xa2, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -7684,6 +7685,11 @@ func (m *ObjectRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.ScaleDown) + copy(dAtA[i:], m.ScaleDown) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ScaleDown))) + i-- + dAtA[i] = 0x22 i -= len(m.Name) copy(dAtA[i:], m.Name) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) @@ -11673,6 +11679,8 @@ func (m *ObjectRef) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Name) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ScaleDown) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -13668,6 +13676,7 @@ func (this *ObjectRef) String() string { `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ScaleDown:` + fmt.Sprintf("%v", this.ScaleDown) + `,`, `}`, }, "") return s @@ -26636,6 +26645,38 @@ func (m *ObjectRef) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleDown", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ScaleDown = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 248eeaec09..57152d87ec 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1128,6 +1128,9 @@ message ObjectRef { // Name of the referent optional string name = 3; + + // Automatically scale down deployment + optional string scaleDown = 4; } // PauseCondition the reason for a pause and when it started diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 01b39597e2..3b9937ded9 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -3370,6 +3370,13 @@ func schema_pkg_apis_rollouts_v1alpha1_ObjectRef(ref common.ReferenceCallback) c Format: "", }, }, + "scaleDown": { + SchemaProps: spec.SchemaProps{ + Description: "Automatically scale down deployment", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index f2c2dbe7fe..e3c425cb0b 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -137,6 +137,8 @@ type ObjectRef struct { Kind string `json:"kind,omitempty" protobuf:"bytes,2,opt,name=kind"` // Name of the referent Name string `json:"name,omitempty" protobuf:"bytes,3,opt,name=name"` + // Automatically scale down deployment + ScaleDown string `json:"scaleDown,omitempty" protobuf:"bytes,4,opt,name=scaleDown"` } const ( @@ -1081,3 +1083,9 @@ type RolloutList struct { type RollbackWindowSpec struct { Revisions int32 `json:"revisions,omitempty" protobuf:"varint,1,opt,name=revisions"` } + +const ( + ScaleDownNever string = "never" + ScaleDownOnSuccess string = "onsuccess" + ScaleDownProgressively string = "progressively" +) diff --git a/rollout/replicaset.go b/rollout/replicaset.go index 401e1b579d..fc23464f50 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -172,6 +172,22 @@ func (c *rolloutContext) reconcileNewReplicaSet() (bool, error) { } scaled, _, err := c.scaleReplicaSetAndRecordEvent(c.newRS, newReplicasCount) + + if err != nil { + return scaled, err + } + + revision, _ := replicasetutil.Revision(c.newRS) + + if revision == 1 && c.rollout.Spec.WorkloadRef != nil && c.rollout.Spec.WorkloadRef.ScaleDown == v1alpha1.ScaleDownProgressively { + oldScale := defaults.GetReplicasOrDefault(c.newRS.Spec.Replicas) + // scale down the deployment when the rollout has ready replicas or scale up the deployment if rollout fails + if c.rollout.Spec.Replicas != nil && (c.rollout.Status.ReadyReplicas > 0 || oldScale > newReplicasCount) { + targetScale := *c.rollout.Spec.Replicas - c.rollout.Status.ReadyReplicas + err = c.scaleDeployment(&targetScale) + } + } + return scaled, err } diff --git a/rollout/replicaset_test.go b/rollout/replicaset_test.go index d93fa7c546..2e61606c37 100644 --- a/rollout/replicaset_test.go +++ b/rollout/replicaset_test.go @@ -1,6 +1,7 @@ package rollout import ( + "context" "fmt" "strconv" "testing" @@ -574,3 +575,70 @@ func TestIsReplicaSetReferenced(t *testing.T) { }) } } + +func TestScaleDownProgressively(t *testing.T) { + + tests := []struct { + name string + deploymentReplicas int32 + newRSReplicas int + newRSRevision string + rolloutReplicas int32 + rolloutReadyReplicas int32 + abortScaleDownDelaySeconds int32 + expectedDeploymentReplicas int32 + }{ + { + name: "Scale down deployment", + deploymentReplicas: 5, + newRSReplicas: 5, + newRSRevision: "1", + rolloutReplicas: 5, + rolloutReadyReplicas: 3, + abortScaleDownDelaySeconds: 0, + expectedDeploymentReplicas: 2, + }, + { + name: "Scale up deployment", + deploymentReplicas: 0, + newRSReplicas: 5, + newRSRevision: "1", + rolloutReplicas: 5, + rolloutReadyReplicas: 1, + abortScaleDownDelaySeconds: 0, + expectedDeploymentReplicas: 4, + }, + { + name: "Do not scale deployment", + deploymentReplicas: 5, + newRSReplicas: 5, + newRSRevision: "2", + rolloutReplicas: 5, + rolloutReadyReplicas: 3, + abortScaleDownDelaySeconds: 0, + expectedDeploymentReplicas: 5, + }, + } + + for _, test := range tests { + ctx := createScaleDownRolloutContext(v1alpha1.ScaleDownProgressively, test.deploymentReplicas, true, nil) + ctx.rollout.Spec.Strategy = v1alpha1.RolloutStrategy{ + BlueGreen: &v1alpha1.BlueGreenStrategy{ + AbortScaleDownDelaySeconds: &test.abortScaleDownDelaySeconds, + }, + } + ctx.newRS = rs("foo-v2", test.newRSReplicas, nil, noTimestamp, nil) + ctx.newRS.ObjectMeta.Annotations[annotations.RevisionAnnotation] = test.newRSRevision + ctx.pauseContext.removeAbort = true + ctx.rollout.Spec.Replicas = &test.rolloutReplicas + ctx.rollout.Status.ReadyReplicas = test.rolloutReadyReplicas + + _, err := ctx.reconcileNewReplicaSet() + assert.Nil(t, err) + k8sfakeClient := ctx.kubeclientset.(*k8sfake.Clientset) + updatedDeployment, err := k8sfakeClient.AppsV1().Deployments("default").Get(context.TODO(), "workload-test", metav1.GetOptions{}) + assert.Nil(t, err) + assert.Equal(t, test.expectedDeploymentReplicas, *updatedDeployment.Spec.Replicas) + + } +} diff --git a/rollout/scale_utils.go b/rollout/scale_utils.go new file mode 100644 index 0000000000..6759d1a56e --- /dev/null +++ b/rollout/scale_utils.go @@ -0,0 +1,36 @@ +package rollout + +import ( + "context" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func (c *rolloutContext) scaleDeployment(targetScale *int32) error { + deploymentName := c.rollout.Spec.WorkloadRef.Name + namespace := c.rollout.Namespace + deployment, err := c.kubeclientset.AppsV1().Deployments(namespace).Get(context.TODO(), deploymentName, metav1.GetOptions{}) + if err != nil { + c.log.Warnf("Failed to fetch deployment %s: %s", deploymentName, err.Error()) + return err + } + + var newReplicasCount int32 + if *targetScale < 0 { + newReplicasCount = 0 + } else { + newReplicasCount = *targetScale + } + if newReplicasCount == *deployment.Spec.Replicas { + return nil + } + c.log.Infof("Scaling deployment %s to %d replicas", deploymentName, newReplicasCount) + *deployment.Spec.Replicas = newReplicasCount + + _, err = c.kubeclientset.AppsV1().Deployments(namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{}) + if err != nil { + c.log.Warnf("Failed to update deployment %s: %s", deploymentName, err.Error()) + return err + } + return nil +} diff --git a/rollout/scale_utils_test.go b/rollout/scale_utils_test.go new file mode 100644 index 0000000000..0127cfab69 --- /dev/null +++ b/rollout/scale_utils_test.go @@ -0,0 +1,182 @@ +package rollout + +import ( + "context" + "fmt" + "testing" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake" + logutil "github.com/argoproj/argo-rollouts/utils/log" + "github.com/argoproj/argo-rollouts/utils/record" + "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + k8sfake "k8s.io/client-go/kubernetes/fake" + k8stesting "k8s.io/client-go/testing" +) + +type DeploymentActions interface { + Get(ctx context.Context, name string, opts metav1.GetOptions) (*appsv1.Deployment, error) + Update(ctx context.Context, deployment *appsv1.Deployment, opts metav1.UpdateOptions) (*appsv1.Deployment, error) +} + +type KubeClientInterface interface { + Deployments(namespace string) DeploymentActions + AppsV1() AppV1Interface +} + +type AppV1Interface interface { + Deployments(namespace string) DeploymentActions +} + +type mockDeploymentInterface struct { + deployment *appsv1.Deployment +} + +func (m *mockDeploymentInterface) Get(ctx context.Context, name string, opts metav1.GetOptions) (*appsv1.Deployment, error) { + return m.deployment, nil +} + +func (m *mockDeploymentInterface) Update(ctx context.Context, deployment *appsv1.Deployment, opts metav1.UpdateOptions) (*appsv1.Deployment, error) { + m.deployment = deployment + return deployment, nil +} + +type testKubeClient struct { + mockDeployment DeploymentActions +} + +func (t *testKubeClient) AppsV1() AppV1Interface { + return t +} + +func (t *testKubeClient) Deployments(namespace string) DeploymentActions { + return t.mockDeployment +} + +type testRolloutContext struct { + *rolloutContext + kubeClient KubeClientInterface +} + +func createScaleDownRolloutContext(scaleDownMode string, deploymentReplicas int32, deploymentExists bool, updateError error) *testRolloutContext { + ro := &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "rollout-test", + Namespace: "default", + Annotations: map[string]string{ + "rollout.argoproj.io/revision": "1", + }, + }, + Spec: v1alpha1.RolloutSpec{ + WorkloadRef: &v1alpha1.ObjectRef{ + Name: "workload-test", + ScaleDown: scaleDownMode, + }, + }, + Status: v1alpha1.RolloutStatus{ + Phase: v1alpha1.RolloutPhaseHealthy, + }, + } + + fakeDeployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "workload-test", + Namespace: "default", + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &deploymentReplicas, + }, + } + + var k8sfakeClient *k8sfake.Clientset + if deploymentExists { + k8sfakeClient = k8sfake.NewSimpleClientset(fakeDeployment) + } else { + k8sfakeClient = k8sfake.NewSimpleClientset() + } + + if updateError != nil { + k8sfakeClient.PrependReactor("update", "deployments", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { + return true, nil, updateError + }) + } + + mockDeploy := &mockDeploymentInterface{deployment: fakeDeployment} + testClient := &testKubeClient{mockDeployment: mockDeploy} + + ctx := &testRolloutContext{ + rolloutContext: &rolloutContext{ + rollout: ro, + pauseContext: &pauseContext{}, + reconcilerBase: reconcilerBase{ + argoprojclientset: &fake.Clientset{}, + kubeclientset: k8sfakeClient, + recorder: record.NewFakeEventRecorder(), + }, + }, + kubeClient: testClient, + } + ctx.log = logutil.WithRollout(ctx.rollout) + + return ctx +} + +func TestScaleDeployment(t *testing.T) { + tests := []struct { + name string + scaleToZero bool + targetScale *int32 + expectedCount int32 + deploymentExists bool + updateError error + }{ + { + name: "Scale down to zero", + targetScale: int32Ptr(0), + expectedCount: 0, + deploymentExists: true, + }, + { + name: "Scale down to a negative value", + targetScale: int32Ptr(-1), + expectedCount: 0, + deploymentExists: true, + }, + { + name: "Deployment is already scaled", + targetScale: int32Ptr(5), + expectedCount: 5, + deploymentExists: true, + }, + { + name: "Error fetching deployment", + targetScale: int32Ptr(0), + deploymentExists: false, + }, + { + name: "Error updating deployment", + scaleToZero: false, + targetScale: int32Ptr(0), + deploymentExists: true, + updateError: fmt.Errorf("fake update error"), + }, + } + + for _, test := range tests { + ctx := createScaleDownRolloutContext(v1alpha1.ScaleDownOnSuccess, 5, test.deploymentExists, test.updateError) + err := ctx.scaleDeployment(test.targetScale) + + if !test.deploymentExists || test.updateError != nil { + assert.NotNil(t, err) + continue + } + assert.Nil(t, err) + k8sfakeClient := ctx.kubeclientset.(*k8sfake.Clientset) + updatedDeployment, err := k8sfakeClient.AppsV1().Deployments("default").Get(context.TODO(), "workload-test", metav1.GetOptions{}) + assert.Nil(t, err) + assert.Equal(t, *updatedDeployment.Spec.Replicas, test.expectedCount) + } +} diff --git a/rollout/sync.go b/rollout/sync.go index 2baeac1698..a7f600917c 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -1001,6 +1001,7 @@ func (c *rolloutContext) promoteStable(newStatus *v1alpha1.RolloutStatus, reason } } previousStableHash := newStatus.StableRS + revision, _ := replicasetutil.Revision(c.rollout) if previousStableHash != newStatus.CurrentPodHash { // only emit this event when we switched stable if trafficrouting.IsPingPongEnabled(c.rollout) { @@ -1012,9 +1013,17 @@ func (c *rolloutContext) promoteStable(newStatus *v1alpha1.RolloutStatus, reason } newStatus.StableRS = newStatus.CurrentPodHash - revision, _ := replicasetutil.Revision(c.rollout) c.recorder.Eventf(c.rollout, record.EventOptions{EventReason: conditions.RolloutCompletedReason}, conditions.RolloutCompletedMessage, revision, newStatus.CurrentPodHash, reason) } + + if revision == 1 && c.rollout.Status.Phase == v1alpha1.RolloutPhaseHealthy && c.rollout.Spec.WorkloadRef != nil && c.rollout.Spec.WorkloadRef.ScaleDown == v1alpha1.ScaleDownOnSuccess { + var targetScale int32 = 0 + err := c.scaleDeployment(&targetScale) + if err != nil { + return err + } + } + return nil } diff --git a/rollout/sync_test.go b/rollout/sync_test.go index 5748bba0ec..a77fc358cb 100644 --- a/rollout/sync_test.go +++ b/rollout/sync_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -16,12 +17,15 @@ import ( "k8s.io/utils/pointer" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake" "github.com/argoproj/argo-rollouts/utils/annotations" "github.com/argoproj/argo-rollouts/utils/conditions" logutil "github.com/argoproj/argo-rollouts/utils/log" "github.com/argoproj/argo-rollouts/utils/record" timeutil "github.com/argoproj/argo-rollouts/utils/time" + + "context" ) func rs(name string, replicas int, selector map[string]string, timestamp metav1.Time, ownerRef *metav1.OwnerReference) *appsv1.ReplicaSet { @@ -610,3 +614,28 @@ func Test_shouldFullPromote(t *testing.T) { result = ctx.shouldFullPromote(newStatus) assert.Equal(t, result, "Rollback within window") } + +func TestScaleDownDeploymentOnSuccess(t *testing.T) { + ctx := createScaleDownRolloutContext(v1alpha1.ScaleDownOnSuccess, 5, true, nil) + newStatus := &v1alpha1.RolloutStatus{ + CurrentPodHash: "2f646bf702", + StableRS: "15fb5ffc01", + } + err := ctx.promoteStable(newStatus, "reason") + + assert.Nil(t, err) + k8sfakeClient := ctx.kubeclientset.(*k8sfake.Clientset) + updatedDeployment, err := k8sfakeClient.AppsV1().Deployments("default").Get(context.TODO(), "workload-test", metav1.GetOptions{}) + assert.Nil(t, err) + assert.Equal(t, int32(0), *updatedDeployment.Spec.Replicas) + + // test scale deployment error + ctx = createScaleDownRolloutContext(v1alpha1.ScaleDownOnSuccess, 5, false, nil) + newStatus = &v1alpha1.RolloutStatus{ + CurrentPodHash: "2f646bf702", + StableRS: "15fb5ffc01", + } + err = ctx.promoteStable(newStatus, "reason") + + assert.NotNil(t, err) +} diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index e6aff1477f..f3724ca95b 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -1443,3 +1443,170 @@ spec: Then(). ExpectRolloutStatus("Healthy")) } + +func (s *FunctionalSuite) TestScaleDownOnSuccess() { + s.Given(). + RolloutObjects(` +kind: Service +apiVersion: v1 +metadata: + name: rollout-bluegreen-active +spec: + selector: + app: rollout-ref-deployment + ports: + - protocol: TCP + port: 80 + targetPort: 8080 +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + workloadRef: + apiVersion: apps/v1 + kind: Deployment + name: rollout-ref-deployment + scaleDown: onsuccess + strategy: + blueGreen: + activeService: rollout-bluegreen-active +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + selector: + matchLabels: + app: rollout-ref-deployment + template: + metadata: + labels: + app: rollout-ref-deployment + spec: + containers: + - name: rollouts-demo + image: argoproj/rollouts-demo:green +`). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + ExpectDeploymentReplicasCount("The deployment has been scaled to 0 replicas", "rollout-ref-deployment", 0) +} + +func (s *FunctionalSuite) TestScaleDownProgressively() { + s.Given(). + RolloutObjects(` +kind: Service +apiVersion: v1 +metadata: + name: rollout-bluegreen-active +spec: + selector: + app: rollout-ref-deployment + ports: + - protocol: TCP + port: 80 + targetPort: 8080 +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + workloadRef: + apiVersion: apps/v1 + kind: Deployment + name: rollout-ref-deployment + scaleDown: progressively + strategy: + blueGreen: + activeService: rollout-bluegreen-active +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + selector: + matchLabels: + app: rollout-ref-deployment + template: + metadata: + labels: + app: rollout-ref-deployment + spec: + containers: + - name: rollouts-demo + image: argoproj/rollouts-demo:green +`). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + ExpectDeploymentReplicasCount("The deployment has been scaled to 0 replicas", "rollout-ref-deployment", 0) +} + +func (s *FunctionalSuite) TestNeverScaleDown() { + s.Given(). + RolloutObjects(` +kind: Service +apiVersion: v1 +metadata: + name: rollout-bluegreen-active + annotations: + rollout.argoproj.io/scale-down: never +spec: + selector: + app: rollout-ref-deployment + ports: + - protocol: TCP + port: 80 + targetPort: 8080 +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + workloadRef: + apiVersion: apps/v1 + kind: Deployment + name: rollout-ref-deployment + scaleDown: never + strategy: + blueGreen: + activeService: rollout-bluegreen-active +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rollout-ref-deployment +spec: + replicas: 2 + selector: + matchLabels: + app: rollout-ref-deployment + template: + metadata: + labels: + app: rollout-ref-deployment + spec: + containers: + - name: rollouts-demo + image: argoproj/rollouts-demo:green +`). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + Then(). + ExpectDeploymentReplicasCount("The deployment has not been scaled", "rollout-ref-deployment", 2) +} diff --git a/test/fixtures/then.go b/test/fixtures/then.go index c41c14d92a..8183cc2adc 100644 --- a/test/fixtures/then.go +++ b/test/fixtures/then.go @@ -11,6 +11,7 @@ import ( appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rov1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -504,3 +505,30 @@ func (t *Then) Given() *Given { Common: t.Common, } } + +type DeploymentExpectation func(*appsv1.Deployment) bool + +func (t *Then) ExpectDeploymentReplicasCount(expectation string, deploymentName string, expectedReplicaCount int) *Then { + t.t.Helper() + checkDeploymentReplicas := func() (done bool, err error) { + deployment, err := t.kubeClient.AppsV1().Deployments(t.namespace).Get(t.Context, deploymentName, metav1.GetOptions{}) + if err != nil { + return false, err + } + if deployment.Spec.Replicas != nil && *deployment.Spec.Replicas == int32(expectedReplicaCount) { + t.log.Infof("Deployment replicas count expectation '%s' met", expectation) + return true, nil + } + t.log.Errorf("Deployment replicas count expectation '%s' failed. Expected: %d, Actual: %d", expectation, expectedReplicaCount, *deployment.Spec.Replicas) + return false, nil + } + + pollInterval := 5 * time.Second + pollTimeout := 1 * time.Minute + if err := wait.PollImmediate(pollInterval, pollTimeout, checkDeploymentReplicas); err != nil { + t.log.Errorf("Failed to meet deployment replicas count expectation '%s'", expectation) + t.t.FailNow() + } + + return t +} diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index eb0a755c17..563a5e3d9f 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -1700,6 +1700,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ObjectRef { * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ObjectRef */ name?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1ObjectRef + */ + scaleDown?: string; } /** * From d892380842b15da93b3e731d812c56eba7c75a3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:07:15 -0600 Subject: [PATCH 121/264] chore(deps): bump docker/build-push-action from 5.0.0 to 5.1.0 (#3178) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/0565240e2d4ab88bba5387d719585280857ece09...4a13e500e55cf31b7a5d59a38ab2040ab0f42f56) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 879006dc60..7ad249ec56 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 #v5.0.0 + uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 #v5.1.0 with: context: . platforms: ${{ inputs.platforms }} From 23b5302e68322f0e576bbdc063d185b45e3a28f4 Mon Sep 17 00:00:00 2001 From: Mayursinh Sarvaiya Date: Tue, 5 Dec 2023 15:04:14 -0400 Subject: [PATCH 122/264] chore(deps): bump argo-ui and fix browser console errors (#3212) * feat: update argo-ui package Signed-off-by: Mayursinh Sarvaiya * chore: revert back moment package import > allow allowSyntheticDefaultImports Signed-off-by: Mayursinh Sarvaiya * fix: browser console errors Signed-off-by: Mayursinh Sarvaiya --------- Signed-off-by: Mayursinh Sarvaiya --- ui/package.json | 7 +- .../confirm-button/confirm-button.tsx | 5 +- .../rollouts-grid/rollouts-grid.tsx | 8 +- .../rollouts-toolbar/rollouts-toolbar.tsx | 32 +- ui/src/app/webpack.common.js | 6 + ui/tsconfig.json | 5 +- ui/yarn.lock | 720 +++++++++++++++--- 7 files changed, 674 insertions(+), 109 deletions(-) diff --git a/ui/package.json b/ui/package.json index 54a119cb85..10623345ea 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,7 +8,7 @@ "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", "antd": "^5.4.2", - "argo-ui": "git+https://github.com/argoproj/argo-ui.git", + "argo-ui": "git+https://github.com/argoproj/argo-ui.git#5ff344ac9692c14dd108468bd3c020c3c75181cb", "classnames": "2.2.6", "isomorphic-fetch": "^3.0.0", "moment": "^2.29.4", @@ -25,7 +25,7 @@ "web-vitals": "^1.0.1" }, "scripts": { - "start": "webpack serve --config ./src/app/webpack.dev.js", + "start": "NODE_OPTIONS=--openssl-legacy-provider webpack serve --config ./src/app/webpack.dev.js", "build": "rm -rf dist && NODE_OPTIONS=--openssl-legacy-provider webpack --config ./src/app/webpack.prod.js", "test": "react-scripts test", "eject": "react-scripts eject", @@ -60,6 +60,9 @@ "@types/react-dom": "^16.9.3", "@types/react-helmet": "^6.1.0", "@types/react-router-dom": "^5.1.7", + "@types/react-form": "^2.16.1", + "@types/uuid": "^9.0.3", + "@types/react-autocomplete": "^1.8.4", "copy-webpack-plugin": "^6.3.2", "mini-css-extract-plugin": "^1.3.9", "raw-loader": "^4.0.2", diff --git a/ui/src/app/components/confirm-button/confirm-button.tsx b/ui/src/app/components/confirm-button/confirm-button.tsx index 48ce3fba77..e10212d55c 100644 --- a/ui/src/app/components/confirm-button/confirm-button.tsx +++ b/ui/src/app/components/confirm-button/confirm-button.tsx @@ -13,7 +13,10 @@ interface ConfirmButtonProps extends ButtonProps { export const ConfirmButton = (props: ConfirmButtonProps) => { const [open, setOpen] = useState(false); - const [buttonProps, setButtonProps] = useState(props); + + const {skipconfirm, ...coreButtonProps} = props; + + const [buttonProps, setButtonProps] = useState(coreButtonProps); React.useEffect(() => { const tmp = {...props}; diff --git a/ui/src/app/components/rollouts-grid/rollouts-grid.tsx b/ui/src/app/components/rollouts-grid/rollouts-grid.tsx index a5c9e22a13..57883c6586 100644 --- a/ui/src/app/components/rollouts-grid/rollouts-grid.tsx +++ b/ui/src/app/components/rollouts-grid/rollouts-grid.tsx @@ -45,9 +45,13 @@ export const RolloutsGrid = ({ const updateItemsPerRow = () => { if (rolloutsGrid) { + const rolloutsListWidget = document.querySelector('.rollouts-list__widget'); + if (!rolloutsListWidget) { + return; + } const containerWidth = rolloutsGrid.clientWidth; - const widgetWidth = parseInt(getComputedStyle(document.querySelector('.rollouts-list__widget')).getPropertyValue('width'), 10); - const widgetPadding = parseInt(getComputedStyle(document.querySelector('.rollouts-list__widget')).getPropertyValue('padding'), 10); + const widgetWidth = parseInt(getComputedStyle(rolloutsListWidget).getPropertyValue('width'), 10); + const widgetPadding = parseInt(getComputedStyle(rolloutsListWidget).getPropertyValue('padding'), 10); const itemsPerRowValue = Math.floor(containerWidth / (widgetWidth + widgetPadding * 2)); setItemsPerRow(itemsPerRowValue); } diff --git a/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx index 487097c5d0..6863258bc7 100644 --- a/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx +++ b/ui/src/app/components/rollouts-toolbar/rollouts-toolbar.tsx @@ -53,8 +53,11 @@ export const RolloutsToolbar = ({ Healthy: searchParams.get('Healthy') === 'true', }, }); + // Ensure that the filters are updated when the URL changes - onFilterChange(filters); + React.useEffect(() => { + onFilterChange(filters); + }, [filters]); const handleFilterChange = (newFilters: Filters) => { setFilters(newFilters); @@ -139,7 +142,7 @@ export const RolloutsToolbar = ({ [event.currentTarget.id]: !filters.status[event.currentTarget.id], }, }; - handleFilterChange(newFilters); + handleFilterChange(newFilters); }; const statusCounts: StatusCount = React.useMemo(() => { @@ -217,18 +220,19 @@ export const RolloutsToolbar = ({ - { - event.stopPropagation(); // Prevents shift+H from opening the help menu - }} - ref={searchRef} - /> + }> +
+ { + event.stopPropagation(); // Prevents shift+H from opening the help menu + }} + ref={searchRef} + /> +
); diff --git a/ui/src/app/webpack.common.js b/ui/src/app/webpack.common.js index 0907062747..194af2c9b3 100644 --- a/ui/src/app/webpack.common.js +++ b/ui/src/app/webpack.common.js @@ -36,6 +36,12 @@ const config = { test: /\.css$/, loader: 'style-loader!raw-loader', }, + // https://github.com/fkhadra/react-toastify/issues/775#issuecomment-1149569290 + { + test: /\.mjs$/, + include: /node_modules/, + type: "javascript/auto" + }, ], }, node: { diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 4a31dd453b..26cd7a13fe 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -2,13 +2,14 @@ "compilerOptions": { "sourceMap": true, "noImplicitAny": true, - "module": "commonjs", + "module": "CommonJS", "target": "es6", "jsx": "react", "experimentalDecorators": true, "noUnusedLocals": true, "declaration": false, - "lib": ["es2017", "dom"] + "lib": ["es2017", "dom"], + "allowSyntheticDefaultImports": true }, "include": ["./**/*"], "exclude": ["node_modules", "./**/*.test.ts", "./**/*.test.tsx"] diff --git a/ui/yarn.lock b/ui/yarn.lock index 6cf22cadc4..1db343cbbe 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -9,6 +9,19 @@ dependencies: "@ctrl/tinycolor" "^3.4.0" +"@ant-design/cssinjs@^1.17.5": + version "1.18.0" + resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.18.0.tgz#92701684cab5fc67bb62bc813ec1b4a33258018d" + integrity sha512-NXzfnNjJgpn+L6d0cD2cS14Tsqs46Bsua6PwVMlmN+F0OEoa9PhJRwUWmI+HyIrc4cgVZVfQTDpXC0p07Jmglw== + dependencies: + "@babel/runtime" "^7.11.1" + "@emotion/hash" "^0.8.0" + "@emotion/unitless" "^0.7.5" + classnames "^2.3.1" + csstype "^3.0.10" + rc-util "^5.35.0" + stylis "^4.0.13" + "@ant-design/cssinjs@^1.7.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@ant-design/cssinjs/-/cssinjs-1.8.1.tgz#326682e779f5cd074668391a6698b50342a07d92" @@ -27,6 +40,11 @@ resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a" integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== +"@ant-design/icons-svg@^4.3.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz#4b2f65a17d4d32b526baa6414aca2117382bf8da" + integrity sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g== + "@ant-design/icons@^5.0.0": version "5.0.1" resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.0.1.tgz#febb1fdc5776f58187b2c953ac9a4496069d045b" @@ -38,6 +56,17 @@ classnames "^2.2.6" rc-util "^5.9.4" +"@ant-design/icons@^5.2.6": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.2.6.tgz#2d4a9a37f531eb2a20cebec01d6fb69cf593900d" + integrity sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/icons-svg" "^4.3.0" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.31.1" + "@ant-design/react-slick@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.0.tgz#4696eecaa2dea0429e47ae24c267015cfd6df35c" @@ -49,6 +78,17 @@ resize-observer-polyfill "^1.5.1" throttle-debounce "^5.0.0" +"@ant-design/react-slick@~1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz#241bb412aeacf7ff5d50c61fa5db66773fde6b56" + integrity sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ== + dependencies: + "@babel/runtime" "^7.10.4" + classnames "^2.2.5" + json2mq "^0.2.0" + resize-observer-polyfill "^1.5.1" + throttle-debounce "^5.0.0" + "@babel/code-frame@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -1225,12 +1265,12 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.4.2", "@babel/runtime@^7.8.7": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b" - integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA== +"@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" + integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.14.0" "@babel/template@^7.10.4", "@babel/template@^7.12.13", "@babel/template@^7.3.3": version "7.12.13" @@ -1291,6 +1331,11 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8" integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== +"@ctrl/tinycolor@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz#b6c75a56a1947cc916ea058772d666a2c8932f31" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + "@discoveryjs/json-ext@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" @@ -1331,10 +1376,10 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== -"@fortawesome/fontawesome-free@^5.8.1": - version "5.15.4" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" - integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== +"@fortawesome/fontawesome-free@^6.2.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz#55cc8410abf1003b726324661ce5b0d1c10de258" + integrity sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw== "@fortawesome/fontawesome-svg-core@^6.4.0": version "6.4.0" @@ -1629,6 +1674,16 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28" integrity sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ== +"@rc-component/color-picker@~1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@rc-component/color-picker/-/color-picker-1.4.1.tgz#dcab0b660e9c4ed63a7582db68ed4a77c862cb93" + integrity sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw== + dependencies: + "@babel/runtime" "^7.10.1" + "@ctrl/tinycolor" "^3.6.0" + classnames "^2.2.6" + rc-util "^5.30.0" + "@rc-component/context@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.3.0.tgz#608ccf0abcbec9406751b17a4b35db08e481c110" @@ -1637,6 +1692,14 @@ "@babel/runtime" "^7.10.1" rc-util "^5.27.0" +"@rc-component/context@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@rc-component/context/-/context-1.4.0.tgz#dc6fb021d6773546af8f016ae4ce9aea088395e8" + integrity sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== + dependencies: + "@babel/runtime" "^7.10.1" + rc-util "^5.27.0" + "@rc-component/mini-decimal@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz#e5dbc20a6a5b0e234d279bc71ce730ab865d3910" @@ -1653,6 +1716,15 @@ classnames "^2.3.2" rc-util "^5.24.4" +"@rc-component/mutate-observer@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz#ee53cc88b78aade3cd0653609215a44779386fd8" + integrity sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + "@rc-component/portal@^1.0.0-6", "@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.1.tgz#1a30ffe51c240b54360cba8e8bfc5d1f559325c4" @@ -1662,6 +1734,26 @@ classnames "^2.3.2" rc-util "^5.24.4" +"@rc-component/portal@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-1.1.2.tgz#55db1e51d784e034442e9700536faaa6ab63fc71" + integrity sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== + dependencies: + "@babel/runtime" "^7.18.0" + classnames "^2.3.2" + rc-util "^5.24.4" + +"@rc-component/tour@~1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.10.0.tgz#b05bc327438f1c583439e2d2dcc10ec0530aea19" + integrity sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A== + dependencies: + "@babel/runtime" "^7.18.0" + "@rc-component/portal" "^1.0.0-9" + "@rc-component/trigger" "^1.3.6" + classnames "^2.3.2" + rc-util "^5.24.4" + "@rc-component/tour@~1.8.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-1.8.0.tgz#fda8b533e36db1d4254e3ffbcefe3395c346eb1c" @@ -1686,6 +1778,18 @@ rc-resize-observer "^1.3.1" rc-util "^5.29.2" +"@rc-component/trigger@^1.17.0", "@rc-component/trigger@^1.18.0", "@rc-component/trigger@^1.18.2": + version "1.18.2" + resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-1.18.2.tgz#dc52c4c66fa8aaccaf0710498f2429fc05454e3b" + integrity sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA== + dependencies: + "@babel/runtime" "^7.23.2" + "@rc-component/portal" "^1.1.0" + classnames "^2.3.2" + rc-motion "^2.0.0" + rc-resize-observer "^1.3.1" + rc-util "^5.38.0" + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -1882,13 +1986,13 @@ dependencies: "@babel/runtime" "^7.12.5" -"@tippy.js/react@^2.1.2": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@tippy.js/react/-/react-2.2.3.tgz#2ffb0af6693055be7db4b329b2d3cc7f2356f68e" - integrity sha512-5XYvbQujzDj9r00JYEz/cBtm6DutjOdv2azdco53B+eWF7FDBCQfkLVn87wimfEpmGK0vqRQv/cwFxFcoOP98Q== +"@tippy.js/react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@tippy.js/react/-/react-3.1.1.tgz#027e4595e55f31430741fe8e0d92aaddfbe47efd" + integrity sha512-KF45vW/jKh/nBXk/2zzTFslv/T46zOMkIoDJ56ymZ+M00yHttk58J5wZ29oqGqDIUnobWSZD+cFpbR4u/UUvgw== dependencies: prop-types "^15.6.2" - tippy.js "^4.3.4" + tippy.js "^5.1.1" "@types/anymatch@*": version "1.3.1" @@ -2063,10 +2167,10 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== -"@types/react-autocomplete@^1.8.5": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@types/react-autocomplete/-/react-autocomplete-1.8.6.tgz#999d0cd10ac4164ea605da04d263e5fb3fd5745f" - integrity sha512-v3MOyT7gfMfu0K1Y6n9inGVO325evf96YY3Aw4i4WJs5f9+7Y/TVMPbNXoXRnbhlubgkqel19VnrCdBSodwOEg== +"@types/react-autocomplete@^1.8.4": + version "1.8.9" + resolved "https://registry.yarnpkg.com/@types/react-autocomplete/-/react-autocomplete-1.8.9.tgz#f7062603878a1f206584d0acbb9b8ac8620cd1b7" + integrity sha512-Il8qJEKvPU0uW+HOPiRHIKxGF61RM6cM5tEnZDmM5ek78OK5kfv04AZbNyqdPsuTnwp8HIRgBnQH2RhgKILjcg== dependencies: "@types/react" "*" @@ -2078,9 +2182,9 @@ "@types/react" "^16" "@types/react-form@^2.16.1": - version "2.16.4" - resolved "https://registry.yarnpkg.com/@types/react-form/-/react-form-2.16.4.tgz#e31790e6fe9fb90765e87c3a215f28f04814d171" - integrity sha512-Qj91wZVqqjdeGdMOPlFR91I6E241qnflP0p7nbuX0xJFgy1Rqrae1MtTg3wXGYqOxqF8DQhTTTF9oeVB7Ns8zg== + version "2.16.12" + resolved "https://registry.yarnpkg.com/@types/react-form/-/react-form-2.16.12.tgz#17e28e7b797fe9b9e5235f1a63c845753f987793" + integrity sha512-qVTmFkboa84RMArBZ+aYelpvMuKwciEOIOYbcsOJukb633wWjenWZGfB607LgzcGNaqGoP7Dupg/FmXz2eRcJg== dependencies: "@types/react" "*" @@ -2152,6 +2256,11 @@ dependencies: source-map "^0.6.1" +"@types/uuid@^9.0.3": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" + integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== + "@types/webpack-sources@*": version "2.1.0" resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz#8882b0bd62d1e0ce62f183d0d01b72e6e82e8c10" @@ -2676,6 +2785,60 @@ antd@^5.4.2: scroll-into-view-if-needed "^3.0.3" throttle-debounce "^5.0.0" +antd@^5.6.1: + version "5.11.5" + resolved "https://registry.yarnpkg.com/antd/-/antd-5.11.5.tgz#e1528aa9a10c035ce2921d487b96da2d07b4feaa" + integrity sha512-qB1YmvO4Zm4r48M0Ptxn7orpaXeMPSeTrrw6dAgtTYN+ysnWD/D/zlxFc5g73GywIzZ10XGqvNC+74A+HD0yeQ== + dependencies: + "@ant-design/colors" "^7.0.0" + "@ant-design/cssinjs" "^1.17.5" + "@ant-design/icons" "^5.2.6" + "@ant-design/react-slick" "~1.0.2" + "@babel/runtime" "^7.18.3" + "@ctrl/tinycolor" "^3.6.1" + "@rc-component/color-picker" "~1.4.1" + "@rc-component/mutate-observer" "^1.1.0" + "@rc-component/tour" "~1.10.0" + "@rc-component/trigger" "^1.18.2" + classnames "^2.3.2" + copy-to-clipboard "^3.3.3" + dayjs "^1.11.1" + qrcode.react "^3.1.0" + rc-cascader "~3.20.0" + rc-checkbox "~3.1.0" + rc-collapse "~3.7.1" + rc-dialog "~9.3.4" + rc-drawer "~6.5.2" + rc-dropdown "~4.1.0" + rc-field-form "~1.40.0" + rc-image "~7.5.1" + rc-input "~1.3.6" + rc-input-number "~8.4.0" + rc-mentions "~2.9.1" + rc-menu "~9.12.2" + rc-motion "^2.9.0" + rc-notification "~5.3.0" + rc-pagination "~3.7.0" + rc-picker "~3.14.6" + rc-progress "~3.5.1" + rc-rate "~2.12.0" + rc-resize-observer "^1.4.0" + rc-segmented "~2.2.2" + rc-select "~14.10.0" + rc-slider "~10.4.0" + rc-steps "~6.0.1" + rc-switch "~4.1.0" + rc-table "~7.36.0" + rc-tabs "~12.13.1" + rc-textarea "~1.5.3" + rc-tooltip "~6.1.2" + rc-tree "~5.8.2" + rc-tree-select "~5.15.0" + rc-upload "~4.3.5" + rc-util "^5.38.1" + scroll-into-view-if-needed "^3.1.0" + throttle-debounce "^5.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2697,28 +2860,30 @@ aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -"argo-ui@git+https://github.com/argoproj/argo-ui.git": +"argo-ui@git+https://github.com/argoproj/argo-ui.git#5ff344ac9692c14dd108468bd3c020c3c75181cb": version "1.0.0" - resolved "git+https://github.com/argoproj/argo-ui.git#a7be8b3208549c7cf5a0b9531ca41af5614f0eda" + resolved "git+https://github.com/argoproj/argo-ui.git#5ff344ac9692c14dd108468bd3c020c3c75181cb" dependencies: - "@fortawesome/fontawesome-free" "^5.8.1" - "@tippy.js/react" "^2.1.2" - "@types/react-autocomplete" "^1.8.5" - "@types/react-form" "^2.16.1" - "@types/react-helmet" "^6.1.0" - classnames "^2.2.5" + "@fortawesome/fontawesome-free" "^6.2.1" + "@tippy.js/react" "^3.1.1" + antd "^5.6.1" + classnames "^2.2.6" + core-js "^3.32.1" foundation-sites "^6.4.3" - history "^4.7.2" - moment "^2.20.1" - prop-types "^15.6.0" - react-autocomplete "^1.8.1" + history "^4.10.1" + moment "^2.29.4" + moment-timezone "^0.5.34" + prop-types "^15.8.1" + react-autocomplete "1.8.1" react-form "^2.16.0" react-helmet "^6.1.0" react-router-dom "^4.2.2" - react-toastify "^5.0.1" - rxjs "^6.6.6" - typescript "^4.0.3" - xterm "2.4.0" + react-toastify "9.0.8" + rxjs "^7.8.1" + typescript "^4.9.5" + uuid "^9.0.0" + xterm "^4.19.0" + xterm-addon-fit "^0.5.0" argparse@^1.0.7: version "1.0.10" @@ -3731,6 +3896,11 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3968,7 +4138,7 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-to-clipboard@^3.2.0: +copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== @@ -4010,6 +4180,11 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== +core-js@^3.32.1: + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.3.tgz#3c644a323f0f533a0d360e9191e37f7fc059088d" + integrity sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw== + core-js@^3.6.5: version "3.12.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" @@ -4355,11 +4530,6 @@ csstype@^3.0.10: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -4638,14 +4808,6 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - dom-scroll-into-view@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.0.1.tgz#32abb92f0d8feca6215162aef43e4b449ab8d99c" @@ -6031,7 +6193,7 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -history@^4.7.2, history@^4.9.0: +history@^4.10.1, history@^4.7.2, history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== @@ -7985,7 +8147,14 @@ moment-timezone@^0.5.33: dependencies: moment ">= 2.9.0" -moment@2.29.4, "moment@>= 2.9.0", moment@^2.20.1, moment@^2.29.4: +moment-timezone@^0.5.34: + version "0.5.43" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.43.tgz#3dd7f3d0c67f78c23cd1906b9b2137a09b3c4790" + integrity sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ== + dependencies: + moment "^2.29.4" + +moment@2.29.4, "moment@>= 2.9.0", moment@^2.29.4: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== @@ -8769,7 +8938,7 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -popper.js@^1.14.7: +popper.js@^1.16.0: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== @@ -9544,7 +9713,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9753,6 +9922,18 @@ rc-cascader@~3.10.0: rc-tree "~5.7.0" rc-util "^5.6.1" +rc-cascader@~3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/rc-cascader/-/rc-cascader-3.20.0.tgz#b270f9d84ed83417ee7309ef5e56e415f1586076" + integrity sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw== + dependencies: + "@babel/runtime" "^7.12.5" + array-tree-filter "^2.1.0" + classnames "^2.3.1" + rc-select "~14.10.0" + rc-tree "~5.8.1" + rc-util "^5.37.0" + rc-checkbox@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.0.0.tgz#6b426d16c7d2ed9fee219a1dfb14d2c504a45300" @@ -9762,6 +9943,15 @@ rc-checkbox@~3.0.0: classnames "^2.3.2" rc-util "^5.25.2" +rc-checkbox@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/rc-checkbox/-/rc-checkbox-3.1.0.tgz#6be0d9d8de2cc96fb5e37f9036a1c3e360d0a42d" + integrity sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.3.2" + rc-util "^5.25.2" + rc-collapse@~3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.5.2.tgz#abb7d144ad55bd9cbd201fa95bc5b271da2aa7c3" @@ -9772,6 +9962,16 @@ rc-collapse@~3.5.2: rc-motion "^2.3.4" rc-util "^5.27.0" +rc-collapse@~3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/rc-collapse/-/rc-collapse-3.7.2.tgz#d11538ff9c705a5c988d9a4dfcc051a919692fe3" + integrity sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.3.4" + rc-util "^5.27.0" + rc-dialog@~9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.1.0.tgz#6bf6fcc0453503b7643e54a5a445e835e3850649" @@ -9783,6 +9983,17 @@ rc-dialog@~9.1.0: rc-motion "^2.3.0" rc-util "^5.21.0" +rc-dialog@~9.3.4: + version "9.3.4" + resolved "https://registry.yarnpkg.com/rc-dialog/-/rc-dialog-9.3.4.tgz#e0decb3d4a0dbe36524a67ed2f8fe2daa4b7b73c" + integrity sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.0.0-8" + classnames "^2.2.6" + rc-motion "^2.3.0" + rc-util "^5.21.0" + rc-drawer@~6.1.1: version "6.1.5" resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.1.5.tgz#c4137b944c16b7c179d0dba6f06ebe54f9311ec8" @@ -9794,6 +10005,17 @@ rc-drawer@~6.1.1: rc-motion "^2.6.1" rc-util "^5.21.2" +rc-drawer@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rc-drawer/-/rc-drawer-6.5.2.tgz#49c1f279261992f6d4653d32a03b14acd436d610" + integrity sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/portal" "^1.1.1" + classnames "^2.2.6" + rc-motion "^2.6.1" + rc-util "^5.36.0" + rc-dropdown@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.0.1.tgz#f65d9d3d89750241057db59d5a75e43cd4576b68" @@ -9804,6 +10026,16 @@ rc-dropdown@~4.0.0: rc-trigger "^5.3.1" rc-util "^5.17.0" +rc-dropdown@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-4.1.0.tgz#418a68939631520de80d0865d02b440eeeb4168e" + integrity sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw== + dependencies: + "@babel/runtime" "^7.18.3" + "@rc-component/trigger" "^1.7.0" + classnames "^2.2.6" + rc-util "^5.17.0" + rc-field-form@~1.29.0: version "1.29.2" resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.29.2.tgz#1c07f29eb88c13e2987fd0bd1e977dfea9e789a7" @@ -9813,6 +10045,15 @@ rc-field-form@~1.29.0: async-validator "^4.1.0" rc-util "^5.8.0" +rc-field-form@~1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.40.0.tgz#808dce06ebae1c3aea574e672b673533fc98f11f" + integrity sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg== + dependencies: + "@babel/runtime" "^7.18.0" + async-validator "^4.1.0" + rc-util "^5.32.2" + rc-image@~5.16.0: version "5.16.0" resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.16.0.tgz#79d5864bc1c5d66c4620176cc131d34cd4f4bea8" @@ -9825,6 +10066,18 @@ rc-image@~5.16.0: rc-motion "^2.6.2" rc-util "^5.0.6" +rc-image@~7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-7.5.1.tgz#39a93354e14fe3e5eaafd9c9464e8fe3c6c171a0" + integrity sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/portal" "^1.0.2" + classnames "^2.2.6" + rc-dialog "~9.3.4" + rc-motion "^2.6.2" + rc-util "^5.34.1" + rc-input-number@~7.4.0: version "7.4.2" resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-7.4.2.tgz#7c52d26b986461aa16e486d469dc0476d97c6ea3" @@ -9835,6 +10088,17 @@ rc-input-number@~7.4.0: classnames "^2.2.5" rc-util "^5.28.0" +rc-input-number@~8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/rc-input-number/-/rc-input-number-8.4.0.tgz#f0d0caa2ce3a4e37f062556f9cb4c08c8c23322d" + integrity sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/mini-decimal" "^1.0.1" + classnames "^2.2.5" + rc-input "~1.3.5" + rc-util "^5.28.0" + rc-input@~1.0.0, rc-input@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.0.4.tgz#2f2c73c884f41e80685bb2eb7b9d5533e8540a77" @@ -9844,6 +10108,15 @@ rc-input@~1.0.0, rc-input@~1.0.4: classnames "^2.2.1" rc-util "^5.18.1" +rc-input@~1.3.5, rc-input@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/rc-input/-/rc-input-1.3.6.tgz#038b74779b6c8b688ff60a41c3976d1db7a1d7d6" + integrity sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.18.1" + rc-mentions@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.2.0.tgz#27900ec04d067c58205309897efd190f5d8f4ac8" @@ -9857,6 +10130,31 @@ rc-mentions@~2.2.0: rc-textarea "~1.2.0" rc-util "^5.22.5" +rc-mentions@~2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/rc-mentions/-/rc-mentions-2.9.1.tgz#cfe55913fd5bc156ef9814f38c1a2ceefee032ce" + integrity sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew== + dependencies: + "@babel/runtime" "^7.22.5" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.6" + rc-input "~1.3.5" + rc-menu "~9.12.0" + rc-textarea "~1.5.0" + rc-util "^5.34.1" + +rc-menu@~9.12.0, rc-menu@~9.12.2: + version "9.12.2" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.12.2.tgz#1bab34646421224eff5c5b7de993f8ea1238418e" + integrity sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.17.0" + classnames "2.x" + rc-motion "^2.4.3" + rc-overflow "^1.3.1" + rc-util "^5.27.0" + rc-menu@~9.8.0, rc-menu@~9.8.3: version "9.8.4" resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-9.8.4.tgz#58bf19d471e3c74ff4bcfdb0f02a3826ebe2553b" @@ -9878,6 +10176,15 @@ rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motio classnames "^2.2.1" rc-util "^5.21.0" +rc-motion@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/rc-motion/-/rc-motion-2.9.0.tgz#9e18a1b8d61e528a97369cf9a7601e9b29205710" + integrity sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-util "^5.21.0" + rc-notification@~5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.0.3.tgz#2566d4a6b2334c171bad0cb9a8b80cb1a24b29e6" @@ -9888,6 +10195,16 @@ rc-notification@~5.0.0: rc-motion "^2.6.0" rc-util "^5.20.1" +rc-notification@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/rc-notification/-/rc-notification-5.3.0.tgz#e31c86fe2350598ade8cff383babd1befa7a94fe" + integrity sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.9.0" + rc-util "^5.20.1" + rc-overflow@^1.0.0, rc-overflow@^1.2.8: version "1.3.0" resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.0.tgz#964f7db14aab611c3047788d3b8ee472732fee09" @@ -9898,6 +10215,16 @@ rc-overflow@^1.0.0, rc-overflow@^1.2.8: rc-resize-observer "^1.0.0" rc-util "^5.19.2" +rc-overflow@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.3.2.tgz#72ee49e85a1308d8d4e3bd53285dc1f3e0bcce2c" + integrity sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-resize-observer "^1.0.0" + rc-util "^5.37.0" + rc-pagination@~3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.3.1.tgz#38e364674adf2a753a4fa26e0d9d88ebe523ed0f" @@ -9906,6 +10233,25 @@ rc-pagination@~3.3.1: "@babel/runtime" "^7.10.1" classnames "^2.2.1" +rc-pagination@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.7.0.tgz#4c4332800688ec0fd3b2435c4772f7f8d4d7b50e" + integrity sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-util "^5.32.2" + +rc-picker@~3.14.6: + version "3.14.6" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-3.14.6.tgz#60fc34f9883272e10f6c593fa6d82e7e7a70781b" + integrity sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "^2.2.1" + rc-util "^5.30.0" + rc-picker@~3.6.1: version "3.6.2" resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-3.6.2.tgz#68d13af7d240e792769a306ed6447e66e47040aa" @@ -9925,6 +10271,15 @@ rc-progress@~3.4.1: classnames "^2.2.6" rc-util "^5.16.1" +rc-progress@~3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/rc-progress/-/rc-progress-3.5.1.tgz#a3cdfd2fe04eb5c3d43fa1c69e7dd70c73b102ae" + integrity sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.6" + rc-util "^5.16.1" + rc-rate@~2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.10.0.tgz#b16fd906c13bfc26b4776e27a14d13d06d50c635" @@ -9934,6 +10289,15 @@ rc-rate@~2.10.0: classnames "^2.2.5" rc-util "^5.0.1" +rc-rate@~2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/rc-rate/-/rc-rate-2.12.0.tgz#0182deffed3b009cdcc61660da8746c39ed91ed5" + integrity sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.0.1" + rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0, rc-resize-observer@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz#b61b9f27048001243617b81f95e53d7d7d7a6a3d" @@ -9944,6 +10308,16 @@ rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.2.0, rc-util "^5.27.0" resize-observer-polyfill "^1.5.1" +rc-resize-observer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz#7bba61e6b3c604834980647cce6451914750d0cc" + integrity sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== + dependencies: + "@babel/runtime" "^7.20.7" + classnames "^2.2.1" + rc-util "^5.38.0" + resize-observer-polyfill "^1.5.1" + rc-segmented@~2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.1.2.tgz#14c9077a1dae9c2ccb2ef5fbc5662c1c48c7ce8e" @@ -9954,6 +10328,29 @@ rc-segmented@~2.1.2: rc-motion "^2.4.4" rc-util "^5.17.0" +rc-segmented@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/rc-segmented/-/rc-segmented-2.2.2.tgz#a34f12ce6c0975fc3042ae7656bcd18e1744798e" + integrity sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA== + dependencies: + "@babel/runtime" "^7.11.1" + classnames "^2.2.1" + rc-motion "^2.4.4" + rc-util "^5.17.0" + +rc-select@~14.10.0: + version "14.10.0" + resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.10.0.tgz#5f60e61ed7c9a83c8591616b1174a1c4ab2de0cd" + integrity sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/trigger" "^1.5.0" + classnames "2.x" + rc-motion "^2.0.1" + rc-overflow "^1.3.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.2" + rc-select@~14.4.0, rc-select@~14.4.3: version "14.4.3" resolved "https://registry.yarnpkg.com/rc-select/-/rc-select-14.4.3.tgz#68d7f1b6bcb41543f69901951facd5e097fb835d" @@ -9976,6 +10373,15 @@ rc-slider@~10.1.0: classnames "^2.2.5" rc-util "^5.27.0" +rc-slider@~10.4.0: + version "10.4.1" + resolved "https://registry.yarnpkg.com/rc-slider/-/rc-slider-10.4.1.tgz#357d5b8aa85cb27379d8c9e8eb12f03a4cefb7d7" + integrity sha512-wiHRWgzEEHcgF7MWDd0ODsMpqBwszT558R2qH52fplJwctw/L9J8ipEt89ZqVASlh0QFG9kJPgBuL2+cbdLRUw== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.5" + rc-util "^5.27.0" + rc-steps@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.0.tgz#f7148f8097d5d135f19b96c1b4f4b50ad6093753" @@ -9985,6 +10391,15 @@ rc-steps@~6.0.0: classnames "^2.2.3" rc-util "^5.16.1" +rc-steps@~6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rc-steps/-/rc-steps-6.0.1.tgz#c2136cd0087733f6d509209a84a5c80dc29a274d" + integrity sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== + dependencies: + "@babel/runtime" "^7.16.7" + classnames "^2.2.3" + rc-util "^5.16.1" + rc-switch@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.0.0.tgz#55fbf99fc2d680791175037d379e170ba51fbe78" @@ -9994,6 +10409,15 @@ rc-switch@~4.0.0: classnames "^2.2.1" rc-util "^5.0.1" +rc-switch@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rc-switch/-/rc-switch-4.1.0.tgz#f37d81b4e0c5afd1274fd85367b17306bf25e7d7" + integrity sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== + dependencies: + "@babel/runtime" "^7.21.0" + classnames "^2.2.1" + rc-util "^5.30.0" + rc-table@~7.31.0: version "7.31.1" resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.31.1.tgz#85487b25d98559d6e684b3348e893da1d1f48232" @@ -10005,6 +10429,31 @@ rc-table@~7.31.0: rc-resize-observer "^1.1.0" rc-util "^5.27.1" +rc-table@~7.36.0: + version "7.36.0" + resolved "https://registry.yarnpkg.com/rc-table/-/rc-table-7.36.0.tgz#95e50805392b6a723105c3eb77eefb1e14ba1ced" + integrity sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w== + dependencies: + "@babel/runtime" "^7.10.1" + "@rc-component/context" "^1.4.0" + classnames "^2.2.5" + rc-resize-observer "^1.1.0" + rc-util "^5.37.0" + rc-virtual-list "^3.11.1" + +rc-tabs@~12.13.1: + version "12.13.1" + resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.13.1.tgz#e28c5652dfed4e72eb27a75a2691754afd3e5f68" + integrity sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ== + dependencies: + "@babel/runtime" "^7.11.2" + classnames "2.x" + rc-dropdown "~4.1.0" + rc-menu "~9.12.0" + rc-motion "^2.6.2" + rc-resize-observer "^1.0.0" + rc-util "^5.34.1" + rc-tabs@~12.5.6: version "12.5.10" resolved "https://registry.yarnpkg.com/rc-tabs/-/rc-tabs-12.5.10.tgz#0e41c723fac66c4f0bcad3271429fff6653b0721" @@ -10029,6 +10478,17 @@ rc-textarea@~1.2.0, rc-textarea@~1.2.2: rc-resize-observer "^1.0.0" rc-util "^5.27.0" +rc-textarea@~1.5.0, rc-textarea@~1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/rc-textarea/-/rc-textarea-1.5.3.tgz#513e837d308584996c05f540f4f58645a3a8c89a" + integrity sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "^2.2.1" + rc-input "~1.3.5" + rc-resize-observer "^1.0.0" + rc-util "^5.27.0" + rc-tooltip@~6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.0.1.tgz#6a5e33bd6c3f6afe8851ea90e7af43e5c26b3cc6" @@ -10038,6 +10498,26 @@ rc-tooltip@~6.0.0: "@rc-component/trigger" "^1.0.4" classnames "^2.3.1" +rc-tooltip@~6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/rc-tooltip/-/rc-tooltip-6.1.2.tgz#33923ecfb2cf24347975093cbd0b048ab33c9567" + integrity sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw== + dependencies: + "@babel/runtime" "^7.11.2" + "@rc-component/trigger" "^1.18.0" + classnames "^2.3.1" + +rc-tree-select@~5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.15.0.tgz#8591f1dd28b043dde6fa1ca30c7acb198b160a42" + integrity sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-select "~14.10.0" + rc-tree "~5.8.1" + rc-util "^5.16.1" + rc-tree-select@~5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/rc-tree-select/-/rc-tree-select-5.8.0.tgz#b3d861b7b2111d3a96b56040b851d5e280d71c95" @@ -10060,6 +10540,17 @@ rc-tree@~5.7.0: rc-util "^5.16.1" rc-virtual-list "^3.4.8" +rc-tree@~5.8.1, rc-tree@~5.8.2: + version "5.8.2" + resolved "https://registry.yarnpkg.com/rc-tree/-/rc-tree-5.8.2.tgz#ed3a3f7c56597bbeab3303407a9e1739bbf15621" + integrity sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg== + dependencies: + "@babel/runtime" "^7.10.1" + classnames "2.x" + rc-motion "^2.0.1" + rc-util "^5.16.1" + rc-virtual-list "^3.5.1" + rc-trigger@^5.1.2, rc-trigger@^5.3.1, rc-trigger@^5.3.4: version "5.3.4" resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.3.4.tgz#6b4b26e32825677c837d1eb4d7085035eecf9a61" @@ -10080,6 +10571,15 @@ rc-upload@~4.3.0: classnames "^2.2.5" rc-util "^5.2.0" +rc-upload@~4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/rc-upload/-/rc-upload-4.3.5.tgz#12fc69b2af74d08646a104828831bcaf44076eda" + integrity sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA== + dependencies: + "@babel/runtime" "^7.18.3" + classnames "^2.2.5" + rc-util "^5.2.0" + rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.19.2, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.21.2, rc-util@^5.22.5, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.26.0, rc-util@^5.27.0, rc-util@^5.27.1, rc-util@^5.28.0, rc-util@^5.29.2, rc-util@^5.6.1, rc-util@^5.8.0, rc-util@^5.9.4: version "5.29.3" resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.29.3.tgz#dc02b7b2103468e9fdf14e0daa58584f47898e37" @@ -10088,6 +10588,24 @@ rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.15.0, rc-util@^5.16.0, rc-util@^5.16. "@babel/runtime" "^7.18.3" react-is "^16.12.0" +rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1: + version "5.38.1" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-5.38.1.tgz#4915503b89855f5c5cd9afd4c72a7a17568777bb" + integrity sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^18.2.0" + +rc-virtual-list@^3.11.1, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2: + version "3.11.3" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz#77d4e12e20c1ba314b43c0e37e118296674c5401" + integrity sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q== + dependencies: + "@babel/runtime" "^7.20.0" + classnames "^2.2.6" + rc-resize-observer "^1.0.0" + rc-util "^5.36.0" + rc-virtual-list@^3.4.13, rc-virtual-list@^3.4.8: version "3.4.13" resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.13.tgz#20acc934b263abcf7b7c161f50ef82281b2f7e8d" @@ -10110,10 +10628,10 @@ react-app-polyfill@^2.0.0: regenerator-runtime "^0.13.7" whatwg-fetch "^3.4.1" -react-autocomplete@^1.8.1: +react-autocomplete@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/react-autocomplete/-/react-autocomplete-1.8.1.tgz#ebbbc400006aa91ad538b2d14727b9e7e5d06310" - integrity sha1-67vEAABqqRrVOLLRRye55+XQYxA= + integrity sha512-YQGVN5POdcI3G89wUVWnJhk9rLF6JeB6Ik6xnNpfvSMG4tJkksBzqOE4mkFNGqEz+2AaQw13xNmVXresg9E3zg== dependencies: dom-scroll-into-view "1.0.1" prop-types "^15.5.10" @@ -10217,6 +10735,11 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-keyhooks@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/react-keyhooks/-/react-keyhooks-0.2.3.tgz#57050244d9c501e5b812e2ee3156d8fb967afda9" @@ -10380,25 +10903,12 @@ react-side-effect@^2.1.0: resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== -react-toastify@^5.0.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-5.5.0.tgz#f55de44f6b5e3ce3b13b69e5bb4427f2c9404822" - integrity sha512-jsVme7jALIFGRyQsri/g4YTsRuaaGI70T6/ikjwZMB4mwTZaCWqj5NqxhGrRStKlJc5npXKKvKeqTiRGQl78LQ== +react-toastify@9.0.8: + version "9.0.8" + resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.0.8.tgz#3876c89fc6211a29027b3075010b5ec39ebe4f7e" + integrity sha512-EwM+teWt49HSHx+67qI08yLAW1zAsBxCXLCsUfxHYv1W7/R3ZLhrqKalh7j+kjgPna1h5LQMSMwns4tB4ww2yQ== dependencies: - "@babel/runtime" "^7.4.2" - classnames "^2.2.6" - prop-types "^15.7.2" - react-transition-group "^4" - -react-transition-group@^4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" + clsx "^1.1.1" react@^16.9.3: version "16.14.0" @@ -10572,6 +11082,11 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" @@ -10927,6 +11442,13 @@ rxjs@^6.6.6: dependencies: tslib "^1.9.0" +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -11041,6 +11563,13 @@ scroll-into-view-if-needed@^3.0.3: dependencies: compute-scroll-into-view "^3.0.2" +scroll-into-view-if-needed@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== + dependencies: + compute-scroll-into-view "^3.0.2" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -11950,12 +12479,12 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tippy.js@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-4.3.5.tgz#882bff8d92f09bb0546d2826d5668c0560006f54" - integrity sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA== +tippy.js@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-5.2.1.tgz#e08d7332c103a15e427124d710d881fca82365d6" + integrity sha512-66UT6JRVn3dXNCORE+0UvUK3JZqV/VhLlU6HTDm3FmrweUUFUxUGvT8tUQ7ycMp+uhuLAwQw6dBabyC+iKf/MA== dependencies: - popper.js "^1.14.7" + popper.js "^1.16.0" tmpl@1.0.x: version "1.0.4" @@ -12089,6 +12618,11 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tsutils@^3.17.1: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -12187,10 +12721,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.0.3: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.0.4: version "5.0.4" @@ -12403,6 +12937,11 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -13028,10 +13567,15 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -xterm@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-2.4.0.tgz#d70227993b74323e36495ab9c7bdee0bc8d0dbba" - integrity sha1-1wInmTt0Mj42SVq5x73uC8jQ27o= +xterm-addon-fit@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz#2d51b983b786a97dcd6cde805e700c7f913bc596" + integrity sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ== + +xterm@^4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" + integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== y18n@^4.0.0: version "4.0.3" From d378ce76b62180f9c8efc4ccd358263f4171353d Mon Sep 17 00:00:00 2001 From: dlorenc Date: Wed, 6 Dec 2023 11:14:30 -0500 Subject: [PATCH 123/264] chore(deps): Bump k8s dependencies to v1.26.11 (#3211) * Bump k8s dependencies to v1.26.0. This addresses a few CVEs, but was slightly challenging because of some Kubernetes API changes. In particular, the Ingress type signatures changed. This required some surgery on a function that wrapped the extensionsv1beta1 Ingress and v1 Ingress types, attempting to provide some compatibility. The API changes were kind of tough to deal with, but fortunately the only field required by anything else in this project was the Hostname field, so I changed the function to just normalize the hostnames into a slice. Signed-off-by: Dan Lorenc * Update codegen. Signed-off-by: Dan Lorenc * bump the replace deps, and re-run codegen Signed-off-by: Zach Aller * bump to 0.26.11 and possible fix for new crd properties Signed-off-by: Zach Aller * remove local changes Signed-off-by: Zach Aller * switch alb test off of extensions and on to v1 Signed-off-by: Zach Aller --------- Signed-off-by: Dan Lorenc Signed-off-by: Zach Aller Co-authored-by: Zach Aller --- .../features/kustomize/rollout_cr_schema.json | 525 +++++++++++++++++- .../kubectl-argo-rollouts.md | 1 + .../kubectl-argo-rollouts_abort.md | 1 + .../kubectl-argo-rollouts_completion.md | 1 + .../kubectl-argo-rollouts_create.md | 1 + ...ubectl-argo-rollouts_create_analysisrun.md | 1 + .../kubectl-argo-rollouts_dashboard.md | 1 + .../kubectl-argo-rollouts_get.md | 1 + .../kubectl-argo-rollouts_get_experiment.md | 1 + .../kubectl-argo-rollouts_get_rollout.md | 1 + .../kubectl-argo-rollouts_lint.md | 1 + .../kubectl-argo-rollouts_list.md | 1 + .../kubectl-argo-rollouts_list_experiments.md | 1 + .../kubectl-argo-rollouts_list_rollouts.md | 1 + .../kubectl-argo-rollouts_notifications.md | 1 + ...tl-argo-rollouts_notifications_template.md | 1 + ...rgo-rollouts_notifications_template_get.md | 1 + ...-rollouts_notifications_template_notify.md | 1 + ...ctl-argo-rollouts_notifications_trigger.md | 1 + ...argo-rollouts_notifications_trigger_get.md | 1 + ...argo-rollouts_notifications_trigger_run.md | 1 + .../kubectl-argo-rollouts_pause.md | 1 + .../kubectl-argo-rollouts_promote.md | 1 + .../kubectl-argo-rollouts_restart.md | 1 + .../kubectl-argo-rollouts_retry.md | 1 + .../kubectl-argo-rollouts_retry_experiment.md | 1 + .../kubectl-argo-rollouts_retry_rollout.md | 1 + .../kubectl-argo-rollouts_set.md | 1 + .../kubectl-argo-rollouts_set_image.md | 1 + .../kubectl-argo-rollouts_status.md | 1 + .../kubectl-argo-rollouts_terminate.md | 1 + ...ctl-argo-rollouts_terminate_analysisrun.md | 1 + ...ectl-argo-rollouts_terminate_experiment.md | 1 + .../kubectl-argo-rollouts_undo.md | 1 + .../kubectl-argo-rollouts_version.md | 1 + go.mod | 84 ++- go.sum | 78 +-- hack/gen-crd-spec/main.go | 1 + hack/installers/install-codegen-go-tools.sh | 2 +- manifests/crds/analysis-run-crd.yaml | 70 ++- manifests/crds/analysis-template-crd.yaml | 70 ++- .../crds/cluster-analysis-template-crd.yaml | 70 ++- manifests/crds/experiment-crd.yaml | 69 ++- manifests/crds/rollout-crd.yaml | 69 ++- manifests/install.yaml | 348 +++++++++++- pkg/apiclient/rollout/rollout.swagger.json | 108 +++- pkg/apis/rollouts/validation/validation.go | 3 +- pkg/client/clientset/versioned/clientset.go | 3 +- .../informers/externalversions/factory.go | 79 ++- rollout/trafficrouting/alb/alb.go | 12 +- rollout/trafficrouting/alb/alb_test.go | 315 ++++++----- ui/src/models/rollout/generated/api.ts | 123 +++- utils/ingress/ingress_test.go | 13 +- utils/ingress/wrapper.go | 15 +- utils/ingress/wrapper_test.go | 28 +- 55 files changed, 1811 insertions(+), 308 deletions(-) diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 21ed8d1d66..ee80d008cd 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -387,8 +387,7 @@ } }, "required": [ - "action", - "onPodConditions" + "action" ], "type": "object" }, @@ -1632,6 +1631,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -2582,6 +2599,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -3542,6 +3577,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -3901,6 +3954,35 @@ }, "type": "array" }, + "resourceClaims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "source": { + "properties": { + "resourceClaimName": { + "type": "string" + }, + "resourceClaimTemplateName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "restartPolicy": { "type": "string" }, @@ -3910,6 +3992,24 @@ "schedulerName": { "type": "string" }, + "schedulingGates": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "securityContext": { "properties": { "fsGroup": { @@ -4905,8 +5005,7 @@ } }, "required": [ - "action", - "onPodConditions" + "action" ], "type": "object" }, @@ -6150,6 +6249,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -7100,6 +7217,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -8060,6 +8195,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -8419,6 +8572,35 @@ }, "type": "array" }, + "resourceClaims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "source": { + "properties": { + "resourceClaimName": { + "type": "string" + }, + "resourceClaimTemplateName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "restartPolicy": { "type": "string" }, @@ -8428,6 +8610,24 @@ "schedulerName": { "type": "string" }, + "schedulingGates": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "securityContext": { "properties": { "fsGroup": { @@ -9423,8 +9623,7 @@ } }, "required": [ - "action", - "onPodConditions" + "action" ], "type": "object" }, @@ -10668,6 +10867,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -11618,6 +11835,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -12578,6 +12813,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -12937,6 +13190,35 @@ }, "type": "array" }, + "resourceClaims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "source": { + "properties": { + "resourceClaimName": { + "type": "string" + }, + "resourceClaimTemplateName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "restartPolicy": { "type": "string" }, @@ -12946,6 +13228,24 @@ "schedulerName": { "type": "string" }, + "schedulingGates": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "securityContext": { "properties": { "fsGroup": { @@ -14919,6 +15219,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -15869,6 +16187,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -16829,6 +17165,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -17188,6 +17542,35 @@ }, "type": "array" }, + "resourceClaims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "source": { + "properties": { + "resourceClaimName": { + "type": "string" + }, + "resourceClaimTemplateName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "restartPolicy": { "type": "string" }, @@ -17197,6 +17580,24 @@ "schedulerName": { "type": "string" }, + "schedulingGates": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "securityContext": { "properties": { "fsGroup": { @@ -18384,6 +18785,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -19299,6 +19718,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -20250,6 +20687,24 @@ }, "resources": { "properties": { + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map" + }, "limits": { "x-kubernetes-preserve-unknown-fields": true }, @@ -20551,6 +21006,64 @@ "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge" }, + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "x-kubernetes-map-type": "atomic" + }, + "resourceClaims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "source": { + "properties": { + "resourceClaimName": { + "type": "string" + }, + "resourceClaimTemplateName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge,retainKeys" + }, + "schedulingGates": { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-map-keys": [ + "name" + ], + "x-kubernetes-list-type": "map", + "x-kubernetes-patch-merge-key": "name", + "x-kubernetes-patch-strategy": "merge" + }, "topologySpreadConstraints": { "items": { "properties": { diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts.md index 4e2bcc21f4..473f555d46 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts.md @@ -41,6 +41,7 @@ kubectl argo rollouts retry guestbook --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server -h, --help help for kubectl-argo-rollouts --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_abort.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_abort.md index f022a09b65..044ad9bc84 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_abort.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_abort.md @@ -38,6 +38,7 @@ kubectl argo rollouts abort guestbook --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_completion.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_completion.md index a22b057163..68cc073f38 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_completion.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_completion.md @@ -66,6 +66,7 @@ kubectl argo rollouts completion [bash|zsh|fish|powershell] --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create.md index ce4ad148ce..789bb71785 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create.md @@ -38,6 +38,7 @@ kubectl argo rollouts create -f my-experiment.yaml -w --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create_analysisrun.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create_analysisrun.md index 3f43c1f2a0..2714a0566f 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create_analysisrun.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_create_analysisrun.md @@ -51,6 +51,7 @@ kubectl argo rollouts create analysisrun --global --from my-analysis-cluster-tem --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_dashboard.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_dashboard.md index d51cdb52c7..eb6ee9e6fc 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_dashboard.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_dashboard.md @@ -30,6 +30,7 @@ kubectl argo rollouts dashboard [flags] --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get.md index 552551a9f0..7059ab9d0c 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get.md @@ -41,6 +41,7 @@ kubectl argo rollouts get experiment my-experiment --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_experiment.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_experiment.md index de3c438670..56fbb3d996 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_experiment.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_experiment.md @@ -52,6 +52,7 @@ kubectl argo rollouts get experiment my-experiment -w --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_rollout.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_rollout.md index 2581c7d1c8..77b04d2217 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_rollout.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_get_rollout.md @@ -53,6 +53,7 @@ kubectl argo rollouts get rollout guestbook -w --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_lint.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_lint.md index db560b6399..b0997bc2f2 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_lint.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_lint.md @@ -36,6 +36,7 @@ kubectl argo rollouts lint -f my-rollout.yaml --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list.md index cdc673efda..bbaa94c809 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list.md @@ -39,6 +39,7 @@ kubectl argo rollouts list experiments --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_experiments.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_experiments.md index f15c3aa86b..4add56c247 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_experiments.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_experiments.md @@ -42,6 +42,7 @@ kubectl argo rollouts list experiments --watch --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_rollouts.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_rollouts.md index 503091170e..e861ca20c8 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_rollouts.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_list_rollouts.md @@ -45,6 +45,7 @@ kubectl argo rollouts list rollouts --watch --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications.md index 72a7b4635b..f32667d9f6 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications.md @@ -22,6 +22,7 @@ kubectl argo rollouts notifications [flags] --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server -h, --help help for notifications --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template.md index 2fc9e2a9ef..0617a720e8 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template.md @@ -29,6 +29,7 @@ kubectl argo rollouts notifications template [flags] --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_get.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_get.md index 7dec5ef4ce..4748720d92 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_get.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_get.md @@ -41,6 +41,7 @@ kubectl argo rollouts notifications template get app-sync-succeeded -o=yaml --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_notify.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_notify.md index ecd2e1b663..c9a2a100e9 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_notify.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_template_notify.md @@ -42,6 +42,7 @@ kubectl argo rollouts notifications template notify app-sync-succeeded guestbook --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger.md index 6ba01befea..d18d2750d9 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger.md @@ -29,6 +29,7 @@ kubectl argo rollouts notifications trigger [flags] --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_get.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_get.md index 11f1586772..3efb765450 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_get.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_get.md @@ -41,6 +41,7 @@ kubectl argo rollouts notifications trigger get on-sync-failed -o=yaml --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_run.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_run.md index 9782976189..64202b0f7d 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_run.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_notifications_trigger_run.md @@ -41,6 +41,7 @@ kubectl argo rollouts notifications trigger run on-sync-status-unknown ./sample- --cluster string The name of the kubeconfig cluster to use --config-map string argo-rollouts-notification-configmap.yaml file path --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to a kube config. Only required if out-of-cluster diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_pause.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_pause.md index c90c2efbaa..a40f67ea40 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_pause.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_pause.md @@ -35,6 +35,7 @@ kubectl argo rollouts pause guestbook --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_promote.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_promote.md index 5e22f988b9..9d140bf6e4 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_promote.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_promote.md @@ -42,6 +42,7 @@ kubectl argo rollouts promote guestbook --full --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_restart.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_restart.md index c7fa91ea44..94f94125b5 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_restart.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_restart.md @@ -39,6 +39,7 @@ kubectl argo rollouts restart ROLLOUT_NAME --in 10s --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry.md index 8d4fcf14e0..fc150355c3 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry.md @@ -38,6 +38,7 @@ kubectl argo rollouts retry experiment my-experiment --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_experiment.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_experiment.md index 2ab8acf4d7..23d7d4b9e1 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_experiment.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_experiment.md @@ -35,6 +35,7 @@ kubectl argo rollouts retry experiment my-experiment --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_rollout.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_rollout.md index 4b1b664624..049ecc2088 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_rollout.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_retry_rollout.md @@ -35,6 +35,7 @@ kubectl argo rollouts retry rollout guestbook --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set.md index 1944152089..b77a16231a 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set.md @@ -35,6 +35,7 @@ kubectl argo rollouts set image my-rollout demo=argoproj/rollouts-demo:yellow --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set_image.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set_image.md index 10ec065625..5f89a6a506 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set_image.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_set_image.md @@ -35,6 +35,7 @@ kubectl argo rollouts set image my-rollout www=image:v2 --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_status.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_status.md index c57023eb56..e1221d4056 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_status.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_status.md @@ -42,6 +42,7 @@ kubectl argo rollouts status --timeout 60s guestbook --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate.md index 0041f90d4b..4491cca5fe 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate.md @@ -38,6 +38,7 @@ kubectl argo rollouts terminate experiment my-experiment --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_analysisrun.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_analysisrun.md index 8dece8a431..268b7a0150 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_analysisrun.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_analysisrun.md @@ -35,6 +35,7 @@ kubectl argo rollouts terminate analysis guestbook-877894d5b-4-success-rate.1 --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_experiment.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_experiment.md index 85d793ba68..d99866bb35 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_experiment.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_terminate_experiment.md @@ -35,6 +35,7 @@ kubectl argo rollouts terminate experiment my-experiment --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_undo.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_undo.md index 1cc0c826c8..0ddf539dc9 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_undo.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_undo.md @@ -39,6 +39,7 @@ kubectl argo rollouts undo guestbook --to-revision=3 --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_version.md b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_version.md index 7294c5dd12..5f8d91d5da 100644 --- a/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_version.md +++ b/docs/generated/kubectl-argo-rollouts/kubectl-argo-rollouts_version.md @@ -39,6 +39,7 @@ kubectl argo rollouts version --short --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use + --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure -v, --kloglevel int Log level for kubernetes client library --kubeconfig string Path to the kubeconfig file to use for CLI requests. diff --git a/go.mod b/go.mod index 9c95b74e24..22fd6c668e 100644 --- a/go.mod +++ b/go.mod @@ -41,18 +41,18 @@ require ( google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.25.8 - k8s.io/apiextensions-apiserver v0.25.8 - k8s.io/apimachinery v0.25.8 - k8s.io/apiserver v0.25.8 - k8s.io/cli-runtime v0.25.8 - k8s.io/client-go v0.25.8 - k8s.io/code-generator v0.25.8 - k8s.io/component-base v0.25.8 + k8s.io/api v0.26.11 + k8s.io/apiextensions-apiserver v0.26.11 + k8s.io/apimachinery v0.26.11 + k8s.io/apiserver v0.26.11 + k8s.io/cli-runtime v0.26.11 + k8s.io/client-go v0.26.11 + k8s.io/code-generator v0.26.11 + k8s.io/component-base v0.26.11 k8s.io/klog/v2 v2.80.1 k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 - k8s.io/kubectl v0.25.8 - k8s.io/kubernetes v1.25.8 + k8s.io/kubectl v0.26.11 + k8s.io/kubernetes v1.26.11 k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 sigs.k8s.io/yaml v1.4.0 ) @@ -60,18 +60,11 @@ require ( require ( cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/PagerDuty/go-pagerduty v1.7.0 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/matryer/is v1.4.0 // indirect - github.com/russross/blackfriday v1.6.0 // indirect ) require ( @@ -167,6 +160,7 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/slack-go/slack v0.12.2 // indirect github.com/spf13/cast v1.5.1 // indirect @@ -180,13 +174,13 @@ require ( go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect golang.org/x/crypto v0.16.0 // indirect - golang.org/x/mod v0.8.0 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.12.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.132.0 // indirect @@ -198,7 +192,7 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/cluster-bootstrap v0.25.8 // indirect - k8s.io/component-helpers v0.25.8 // indirect + k8s.io/component-helpers v0.26.11 // indirect k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/kustomize/api v0.12.1 // indirect @@ -208,29 +202,29 @@ require ( replace ( github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 - k8s.io/api v0.0.0 => k8s.io/api v0.25.8 - k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.25.8 - k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.25.8 - k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.25.8 - k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.25.8 - k8s.io/client-go v0.0.0 => k8s.io/client-go v0.25.8 - k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.25.8 - k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.25.8 - k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.25.8 - k8s.io/component-base v0.0.0 => k8s.io/component-base v0.25.8 - k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.25.8 - k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.25.8 - k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.25.8 - k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.25.8 - k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.25.8 - k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.25.8 - k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.25.8 - k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.25.8 - k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.25.8 - k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.25.8 - k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.25.8 - k8s.io/metrics v0.0.0 => k8s.io/metrics v0.25.8 - k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.25.8 - k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.25.8 - k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.25.8 + k8s.io/api v0.0.0 => k8s.io/api v0.26.11 + k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.26.11 + k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.26.11 + k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.26.11 + k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.26.11 + k8s.io/client-go v0.0.0 => k8s.io/client-go v0.26.11 + k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.26.11 + k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.26.11 + k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.26.11 + k8s.io/component-base v0.0.0 => k8s.io/component-base v0.26.11 + k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.26.11 + k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.26.11 + k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.26.11 + k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.26.11 + k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.26.11 + k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.26.11 + k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.26.11 + k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.26.11 + k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.26.11 + k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.26.11 + k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.26.11 + k8s.io/metrics v0.0.0 => k8s.io/metrics v0.26.11 + k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.26.11 + k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.26.11 + k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.26.11 ) diff --git a/go.sum b/go.sum index 21639354cd..6648468c34 100644 --- a/go.sum +++ b/go.sum @@ -38,29 +38,13 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= @@ -284,8 +268,6 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -564,14 +546,14 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= +github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= +github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 h1:nV98dkBpqaYbDnhefmOQ+Rn4hE+jD6AtjYHXaU5WyJI= @@ -613,10 +595,9 @@ github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPH github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/servicemeshinterface/smi-sdk-go v0.5.0 h1:9cZdhvGbGDlmnp9qqmcQL+RL6KZ3IzHfDLoA5Axg8n0= @@ -721,7 +702,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= @@ -760,8 +740,9 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -986,8 +967,9 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1138,31 +1120,31 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.17.8/go.mod h1:N++Llhs8kCixMUoCaXXAyMMPbo8dDVnh+IQ36xZV2/0= k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= -k8s.io/api v0.25.8 h1:pcbnWkCcmjNhp6OEKqR+ojO0CJydpOOw7WiWedjLJAU= -k8s.io/api v0.25.8/go.mod h1:FaJqAtI13XOERtpLOQTkW3SiSf0lqsUohYqaxCyHI18= -k8s.io/apiextensions-apiserver v0.25.8 h1:PBji7zCXwYoEabNcNOfvb3asd5LIwZKh1mowrbwn010= -k8s.io/apiextensions-apiserver v0.25.8/go.mod h1:3wN73ddXCwLTE1exhoBiWp5G3u6xRfoNt0cKTHZ5KGE= +k8s.io/api v0.26.11 h1:hLhTZRdYc3vBBOY4wbEyTLWgMyieOAk2Ws9NG57QqO4= +k8s.io/api v0.26.11/go.mod h1:bSr/A0TKRt5W2OMDdexkM/ER1NxOxiQqNNFXW2nMZrM= +k8s.io/apiextensions-apiserver v0.26.11 h1:6/T0Jm9c+Aw1AYUflPOz2sAsty304/DDSkciTr8+HuE= +k8s.io/apiextensions-apiserver v0.26.11/go.mod h1:xMqWxAB+AvSTdmFRVWlpavY9bJl/3g6yWiPn/fwZbT0= k8s.io/apimachinery v0.17.8/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= -k8s.io/apimachinery v0.25.8 h1:c4kI9xm0U5nid8sBpBvM+2VHlv4Af8KnbhZIodZF/54= -k8s.io/apimachinery v0.25.8/go.mod h1:ZTl0drTQaFi5gMM3snYI5tWV1XJmRH1gfnDx2QCLsxk= -k8s.io/apiserver v0.25.8 h1:ZTYdLdouAu8D6h9QavMaQZiAV+EfWK87VGdOyb6RZMQ= -k8s.io/apiserver v0.25.8/go.mod h1:IJ1r0vqXxwa+3QbrxAHWqdmoGZnVDDMzWtIK9ju3maI= -k8s.io/cli-runtime v0.25.8 h1:3+I4zgdcY0KoCAWgqfQEMkhKOK35ailULxeTMcrBAfs= -k8s.io/cli-runtime v0.25.8/go.mod h1:Kbi+0tb9s/Gtsp3HfMJ/P20K3MYeC4t/CMDaV4pZiJQ= +k8s.io/apimachinery v0.26.11 h1:w//840HHdwSRKqD15j9YX9HLlU6RPlfrvW0xEhLk2+0= +k8s.io/apimachinery v0.26.11/go.mod h1:2/HZp0l6coXtS26du1Bk36fCuAEr/lVs9Q9NbpBtd1Y= +k8s.io/apiserver v0.26.11 h1:JcrlATLu5xQVLV7/rfRFFl9ivvNLmZH0dM3DFFdFp+w= +k8s.io/apiserver v0.26.11/go.mod h1:htEG/Q3sI3+6Is3Z26QzBjaCGICsz/kFj+IhIP4oJuE= +k8s.io/cli-runtime v0.26.11 h1:HO3Sgf06XkT8/8wWnhskfz4+LMKrChRz+A13vDJSQrE= +k8s.io/cli-runtime v0.26.11/go.mod h1:D98GjQtDmqn7WDuKBgWivd6R8qEs3yzT19EmCM5pqBs= k8s.io/client-go v0.17.8/go.mod h1:SJsDS64AAtt9VZyeaQMb4Ck5etCitZ/FwajWdzua5eY= k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= -k8s.io/client-go v0.25.8 h1:PruqsI6qccbowI5wjeNosyE1BiKViChRWVOvCZtYnXY= -k8s.io/client-go v0.25.8/go.mod h1:Wiu5CQCaOqWugLrdvl04HK90P0QMc4oxQ3BXoJGjD+A= +k8s.io/client-go v0.26.11 h1:RjfZr5+vQjjTRmk4oCqHyC0cgrZXPjw+X+ge35sk4GI= +k8s.io/client-go v0.26.11/go.mod h1:+emNszw9va/uRJIM5ALTBtFnlZMTjwBrNjRfEh0iuw8= k8s.io/cluster-bootstrap v0.25.8 h1:2JoXlDAnki1rmYMdrExP5tYXJgJhCERYHtAbucjZgs8= k8s.io/cluster-bootstrap v0.25.8/go.mod h1:O7q/A8Os259t1Tm2S9Zn9XipZ9eej0AfApj1htCT0Lc= k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.25.8 h1:rhj7PQgiTdDiV2D9Ep0wHRppQ/jrG7DDJ5vPpEtRtck= -k8s.io/code-generator v0.25.8/go.mod h1:DHfpdhSUrwqF0f4oLqCtF8gYbqlndNetjBEz45nWzJI= -k8s.io/component-base v0.25.8 h1:lQ5Ouw7lupdpXn5slRjAeHnlMK/aAEbPf9jjSWbOD3c= -k8s.io/component-base v0.25.8/go.mod h1:MkC9Lz4fXoGOgB2WhFBU4zjiviIEeJS3sVhTxX9vt6s= -k8s.io/component-helpers v0.25.8 h1:jTi68SNaCis1s4//S7CXOtmzIOqhiY5CUroZuD2+OEg= -k8s.io/component-helpers v0.25.8/go.mod h1:+EZENL02v1dJXJvAYXZfAldATLviWL7Y/K3Pw8LB3MU= +k8s.io/code-generator v0.26.11 h1:S0PJxapUhG6LWYezYB/FVE5Gf4BxGY0fCwnLrwfQ/70= +k8s.io/code-generator v0.26.11/go.mod h1:Hjxj7hpvSxcNnYIWzCSuEdwN0/9aHlezQRKJXr0Kv8U= +k8s.io/component-base v0.26.11 h1:1/JmB6fexefGByfFyIK6aHksZZVtaDskttzXOzmZ6zA= +k8s.io/component-base v0.26.11/go.mod h1:jYNisnoM6iWFRUg51pxaQabzL5fBYTr5CMpsLjUYGp0= +k8s.io/component-helpers v0.26.11 h1:XD2/2lik/5n1WFepDvgHzIGL0tix/EU3GaxGJHdsgkA= +k8s.io/component-helpers v0.26.11/go.mod h1:lw3bchkI0NHMPmb+CE73GznPW0Mvqd/Y9UVMEqBkysE= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= @@ -1178,10 +1160,10 @@ k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.25.8 h1:i6nlpU5LQyg9J19mKihJo1oE7FE7+Zg1cF4TOpJQmEQ= -k8s.io/kubectl v0.25.8/go.mod h1:IPmVLfTvFIZKl0vwyl0LkegIbk2jsnaVmkpDgDymCPI= -k8s.io/kubernetes v1.25.8 h1:RQ3Rf3aScxhg/xDT1GebWFHOtYodM83Q/Yxvgku39G4= -k8s.io/kubernetes v1.25.8/go.mod h1:mEIT8S9Ir6R4R8N6VLmfxcNFAmGU2hEtV780TuPYlug= +k8s.io/kubectl v0.26.11 h1:cVPzYA4HKefU3tPiVK7hZpJ+5Lm04XoyvCCY5ODznpQ= +k8s.io/kubectl v0.26.11/go.mod h1:xjEX/AHtEQrGj2AGqVopyHr/JU1hLy1k7Yn48JuK9LQ= +k8s.io/kubernetes v1.26.11 h1:g3r1IAUqsaHnOG2jdpoagJ5W9UCXkR2ljQ/7BmCzPNg= +k8s.io/kubernetes v1.26.11/go.mod h1:z1URAaBJ+XnOTr3Q/l4umxRUxn/OyD2fbkUgS0Bl7u4= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= diff --git a/hack/gen-crd-spec/main.go b/hack/gen-crd-spec/main.go index c879472a53..a3e31d92b8 100644 --- a/hack/gen-crd-spec/main.go +++ b/hack/gen-crd-spec/main.go @@ -322,6 +322,7 @@ var patchAnnotationKeys = map[string]bool{ "x-kubernetes-patch-strategy": true, "x-kubernetes-list-map-keys": true, "x-kubernetes-list-type": true, + "x-kubernetes-map-type": true, } // injectPatchAnnotations injects patch annotations from given schema definitions and drop properties that don't have diff --git a/hack/installers/install-codegen-go-tools.sh b/hack/installers/install-codegen-go-tools.sh index d6c7d5b864..9630fd615b 100755 --- a/hack/installers/install-codegen-go-tools.sh +++ b/hack/installers/install-codegen-go-tools.sh @@ -45,7 +45,7 @@ go_mod_install k8s.io/code-generator/cmd/lister-gen go_mod_install k8s.io/kube-openapi/cmd/openapi-gen # controller-gen is run by ./hack/gen-crd-spec to generate the CRDs -go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.12.1 +go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.13.0 # swagger cli is used to generate swagger docs go install github.com/go-swagger/go-swagger/cmd/swagger@v0.30.5 diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 44326292a3..ac5f15a519 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: analysisruns.argoproj.io spec: group: argoproj.io @@ -279,7 +279,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -1086,6 +1085,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -1691,6 +1702,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2303,6 +2326,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2533,12 +2568,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index b160a966f2..fa3b525ee4 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: analysistemplates.argoproj.io spec: group: argoproj.io @@ -275,7 +275,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -1082,6 +1081,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -1687,6 +1698,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2299,6 +2322,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2529,12 +2564,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index c38373a3f9..82c9643111 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: clusteranalysistemplates.argoproj.io spec: group: argoproj.io @@ -275,7 +275,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -1082,6 +1081,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -1687,6 +1698,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2299,6 +2322,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2529,12 +2564,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/manifests/crds/experiment-crd.yaml b/manifests/crds/experiment-crd.yaml index 3693004db0..319f837a05 100644 --- a/manifests/crds/experiment-crd.yaml +++ b/manifests/crds/experiment-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: experiments.argoproj.io spec: group: argoproj.io @@ -928,6 +928,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -1533,6 +1545,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2145,6 +2169,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2375,12 +2411,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index d12f68d6b5..f03259a9a3 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: rollouts.argoproj.io spec: group: argoproj.io @@ -1712,6 +1712,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2317,6 +2329,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2929,6 +2953,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -3159,12 +3195,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/manifests/install.yaml b/manifests/install.yaml index 56c7fbfba0..35287a8188 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: analysisruns.argoproj.io spec: group: argoproj.io @@ -280,7 +280,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -1087,6 +1086,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -1692,6 +1703,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2304,6 +2327,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -2534,12 +2569,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: @@ -3062,7 +3128,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: analysistemplates.argoproj.io spec: group: argoproj.io @@ -3335,7 +3401,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -4142,6 +4207,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -4747,6 +4824,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -5359,6 +5448,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -5589,12 +5690,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: @@ -6003,7 +6135,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: clusteranalysistemplates.argoproj.io spec: group: argoproj.io @@ -6276,7 +6408,6 @@ spec: x-kubernetes-list-type: atomic required: - action - - onPodConditions type: object type: array x-kubernetes-list-type: atomic @@ -7083,6 +7214,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -7688,6 +7831,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -8300,6 +8455,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -8530,12 +8697,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: @@ -8944,7 +9142,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: experiments.argoproj.io spec: group: argoproj.io @@ -9870,6 +10068,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -10475,6 +10685,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -11087,6 +11309,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -11317,12 +11551,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: @@ -11592,7 +11857,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.12.1 + controller-gen.kubebuilder.io/version: v0.13.0 name: rollouts.argoproj.io spec: group: argoproj.io @@ -13302,6 +13567,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -13907,6 +14184,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -14519,6 +14808,18 @@ spec: type: object resources: properties: + claims: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map limits: x-kubernetes-preserve-unknown-fields: true requests: @@ -14749,12 +15050,43 @@ spec: - conditionType type: object type: array + resourceClaims: + items: + properties: + name: + type: string + source: + properties: + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map restartPolicy: type: string runtimeClassName: type: string schedulerName: type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map securityContext: properties: fsGroup: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 988854d75f..eb114c003c 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -2754,7 +2754,7 @@ }, "podFailurePolicy": { "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicy", - "description": "Specifies the policy of handling failed pods. In particular, it allows to\nspecify the set of actions and conditions which need to be\nsatisfied to take the associated action.\nIf empty, the default behaviour applies - the counter of failed pods,\nrepresented by the jobs's .status.failed field, is incremented and it is\nchecked against the backoffLimit. This field cannot be used in combination\nwith restartPolicy=OnFailure.\n\nThis field is alpha-level. To use this field, you must enable the\n`JobPodFailurePolicy` feature gate (disabled by default).\n+optional" + "description": "Specifies the policy of handling failed pods. In particular, it allows to\nspecify the set of actions and conditions which need to be\nsatisfied to take the associated action.\nIf empty, the default behaviour applies - the counter of failed pods,\nrepresented by the jobs's .status.failed field, is incremented and it is\nchecked against the backoffLimit. This field cannot be used in combination\nwith restartPolicy=OnFailure.\n\nThis field is beta-level. It can be used when the `JobPodFailurePolicy`\nfeature gate is enabled (enabled by default).\n+optional" }, "backoffLimit": { "type": "integer", @@ -2854,7 +2854,7 @@ "items": { "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnPodConditionsPattern" }, - "title": "Represents the requirement on the pod conditions. The requirement is represented\nas a list of pod condition patterns. The requirement is satisfied if at\nleast one pattern matches an actual pod condition. At most 20 elements are allowed.\n+listType=atomic" + "title": "Represents the requirement on the pod conditions. The requirement is represented\nas a list of pod condition patterns. The requirement is satisfied if at\nleast one pattern matches an actual pod condition. At most 20 elements are allowed.\n+listType=atomic\n+optional" } }, "description": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met.\nOne of OnExitCodes and onPodConditions, but not both, can be used in each rule." @@ -3052,6 +3052,20 @@ }, "description": "Represents a cinder volume resource in Openstack.\nA Cinder volume must exist before mounting to a container.\nThe volume must also be in the same region as the kubelet.\nCinder volumes support ownership management and SELinux relabeling." }, + "k8s.io.api.core.v1.ClaimSource": { + "type": "object", + "properties": { + "resourceClaimName": { + "type": "string", + "description": "ResourceClaimName is the name of a ResourceClaim object in the same\nnamespace as this pod." + }, + "resourceClaimTemplateName": { + "type": "string", + "description": "ResourceClaimTemplateName is the name of a ResourceClaimTemplate\nobject in the same namespace as this pod.\n\nThe template will be used to create a new ResourceClaim, which will\nbe bound to this pod. When this pod is deleted, the ResourceClaim\nwill also be deleted. The name of the ResourceClaim will be \u003cpod\nname\u003e-\u003cresource name\u003e, where \u003cresource name\u003e is the\nPodResourceClaim.Name. Pod validation will reject the pod if the\nconcatenated name is not valid for a ResourceClaim (e.g. too long).\n\nAn existing ResourceClaim with that name that is not owned by the\npod will not be used for the pod to avoid using an unrelated\nresource by mistake. Scheduling and pod startup are then blocked\nuntil the unrelated ResourceClaim is removed.\n\nThis field is immutable and no changes will be made to the\ncorresponding ResourceClaim by the control plane after creating the\nResourceClaim." + } + }, + "description": "ClaimSource describes a reference to a ResourceClaim.\n\nExactly one of these fields should be set. Consumers of this type must\ntreat an empty object as if it has an unknown value." + }, "k8s.io.api.core.v1.ConfigMapEnvSource": { "type": "object", "properties": { @@ -3733,7 +3747,7 @@ "properties": { "name": { "type": "string", - "title": "The header field name" + "description": "The header field name.\nThis will be canonicalized upon output, so case-variant names will be understood as the same header." }, "value": { "type": "string", @@ -4023,11 +4037,11 @@ }, "dataSource": { "$ref": "#/definitions/k8s.io.api.core.v1.TypedLocalObjectReference", - "title": "dataSource field can be used to specify either:\n* An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n* An existing PVC (PersistentVolumeClaim)\nIf the provisioner or an external controller can support the specified data source,\nit will create a new volume based on the contents of the specified data source.\nIf the AnyVolumeDataSource feature gate is enabled, this field will always have\nthe same contents as the DataSourceRef field.\n+optional" + "title": "dataSource field can be used to specify either:\n* An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)\n* An existing PVC (PersistentVolumeClaim)\nIf the provisioner or an external controller can support the specified data source,\nit will create a new volume based on the contents of the specified data source.\nWhen the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef,\nand dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified.\nIf the namespace is specified, then dataSourceRef will not be copied to dataSource.\n+optional" }, "dataSourceRef": { - "$ref": "#/definitions/k8s.io.api.core.v1.TypedLocalObjectReference", - "title": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\nvolume is desired. This may be any local object from a non-empty API group (non\ncore object) or a PersistentVolumeClaim object.\nWhen this field is specified, volume binding will only succeed if the type of\nthe specified object matches some installed volume populator or dynamic\nprovisioner.\nThis field will replace the functionality of the DataSource field and as such\nif both fields are non-empty, they must have the same value. For backwards\ncompatibility, both fields (DataSource and DataSourceRef) will be set to the same\nvalue automatically if one of them is empty and the other is non-empty.\nThere are two important differences between DataSource and DataSourceRef:\n* While DataSource only allows two specific types of objects, DataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While DataSource ignores disallowed values (dropping them), DataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n+optional" + "$ref": "#/definitions/k8s.io.api.core.v1.TypedObjectReference", + "title": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\nvolume is desired. This may be any object from a non-empty API group (non\ncore object) or a PersistentVolumeClaim object.\nWhen this field is specified, volume binding will only succeed if the type of\nthe specified object matches some installed volume populator or dynamic\nprovisioner.\nThis field will replace the functionality of the dataSource field and as such\nif both fields are non-empty, they must have the same value. For backwards\ncompatibility, when namespace isn't specified in dataSourceRef,\nboth fields (dataSource and dataSourceRef) will be set to the same\nvalue automatically if one of them is empty and the other is non-empty.\nWhen namespace is specified in dataSourceRef,\ndataSource isn't set to the same value and must be empty.\nThere are three important differences between dataSource and dataSourceRef:\n* While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n(Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n+optional" } }, "title": "PersistentVolumeClaimSpec describes the common attributes of storage devices\nand allows a Source for provider-specific attributes" @@ -4200,6 +4214,30 @@ }, "title": "PodReadinessGate contains the reference to a pod condition" }, + "k8s.io.api.core.v1.PodResourceClaim": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name uniquely identifies this resource claim inside the pod.\nThis must be a DNS_LABEL." + }, + "source": { + "$ref": "#/definitions/k8s.io.api.core.v1.ClaimSource", + "description": "Source describes where to find the ResourceClaim." + } + }, + "description": "PodResourceClaim references exactly one ResourceClaim through a ClaimSource.\nIt adds a name to it that uniquely identifies the ResourceClaim inside the Pod.\nContainers that need access to the ResourceClaim reference it with this name." + }, + "k8s.io.api.core.v1.PodSchedulingGate": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the scheduling gate.\nEach scheduling gate must have a unique name field." + } + }, + "description": "PodSchedulingGate is associated to a Pod to guard its scheduling." + }, "k8s.io.api.core.v1.PodSecurityContext": { "type": "object", "properties": { @@ -4231,7 +4269,7 @@ "type": "string", "format": "int64" }, - "title": "A list of groups applied to the first process run in each container, in addition\nto the container's primary GID. If unspecified, no groups will be added to\nany container.\nNote that this field cannot be set when spec.os.name is windows.\n+optional" + "title": "A list of groups applied to the first process run in each container, in addition\nto the container's primary GID, the fsGroup (if specified), and group memberships\ndefined in the container image for the uid of the container process. If unspecified,\nno additional groups are added to any container. Note that group memberships\ndefined in the container image for the uid of the container process are still effective,\neven if they are not included in this list.\nNote that this field cannot be set when spec.os.name is windows.\n+optional" }, "fsGroup": { "type": "string", @@ -4443,6 +4481,20 @@ "hostUsers": { "type": "boolean", "title": "Use the host's user namespace.\nOptional: Default to true.\nIf set to true or not present, the pod will be run in the host user namespace, useful\nfor when the pod needs a feature only available to the host user namespace, such as\nloading a kernel module with CAP_SYS_MODULE.\nWhen set to false, a new userns is created for the pod. Setting false is useful for\nmitigating container breakout vulnerabilities even allowing users to run their\ncontainers as root without actually having root privileges on the host.\nThis field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.\n+k8s:conversion-gen=false\n+optional" + }, + "schedulingGates": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.core.v1.PodSchedulingGate" + }, + "description": "SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\nMore info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness.\n\nThis is an alpha-level feature enabled by PodSchedulingReadiness feature gate.\n+optional\n+patchMergeKey=name\n+patchStrategy=merge\n+listType=map\n+listMapKey=name" + }, + "resourceClaims": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.core.v1.PodResourceClaim" + }, + "description": "ResourceClaims defines which ResourceClaims must be allocated\nand reserved before the Pod is allowed to start. The resources\nwill be made available to those containers which consume them\nby name.\n\nThis is an alpha field and requires enabling the\nDynamicResourceAllocation feature gate.\n\nThis field is immutable.\n\n+patchMergeKey=name\n+patchStrategy=merge,retainKeys\n+listType=map\n+listMapKey=name\n+featureGate=DynamicResourceAllocation\n+optional" } }, "description": "PodSpec is a description of a pod." @@ -4645,6 +4697,16 @@ }, "description": "Represents a Rados Block Device mount that lasts the lifetime of a pod.\nRBD volumes support ownership management and SELinux relabeling." }, + "k8s.io.api.core.v1.ResourceClaim": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name must match the name of one entry in pod.spec.resourceClaims of\nthe Pod where this field is used. It makes that resource available\ninside a container." + } + }, + "description": "ResourceClaim references one entry in PodSpec.ResourceClaims." + }, "k8s.io.api.core.v1.ResourceFieldSelector": { "type": "object", "properties": { @@ -4679,6 +4741,13 @@ "$ref": "#/definitions/k8s.io.apimachinery.pkg.api.resource.Quantity" }, "title": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" + }, + "claims": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.core.v1.ResourceClaim" + }, + "description": "Claims lists the names of resources, defined in spec.resourceClaims,\nthat are used by this container.\n\nThis is an alpha field and requires enabling the\nDynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.\n\n+listType=map\n+listMapKey=name\n+featureGate=DynamicResourceAllocation\n+optional" } }, "description": "ResourceRequirements describes the compute resource requirements." @@ -5023,11 +5092,11 @@ }, "nodeAffinityPolicy": { "type": "string", - "description": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\nwhen calculating pod topology spread skew. Options are:\n- Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n- Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy.\nThis is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" + "description": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector\nwhen calculating pod topology spread skew. Options are:\n- Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations.\n- Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy.\nThis is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" }, "nodeTaintsPolicy": { "type": "string", - "description": "NodeTaintsPolicy indicates how we will treat node taints when calculating\npod topology spread skew. Options are:\n- Honor: nodes without taints, along with tainted nodes for which the incoming pod\nhas a toleration, are included.\n- Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy.\nThis is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" + "description": "NodeTaintsPolicy indicates how we will treat node taints when calculating\npod topology spread skew. Options are:\n- Honor: nodes without taints, along with tainted nodes for which the incoming pod\nhas a toleration, are included.\n- Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy.\nThis is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.\n+optional" }, "matchLabelKeys": { "type": "array", @@ -5057,6 +5126,27 @@ }, "title": "TypedLocalObjectReference contains enough information to let you locate the\ntyped referenced object inside the same namespace.\n+structType=atomic" }, + "k8s.io.api.core.v1.TypedObjectReference": { + "type": "object", + "properties": { + "apiGroup": { + "type": "string", + "title": "APIGroup is the group for the resource being referenced.\nIf APIGroup is not specified, the specified Kind must be in the core API group.\nFor any other third-party types, APIGroup is required.\n+optional" + }, + "kind": { + "type": "string", + "title": "Kind is the type of resource being referenced" + }, + "name": { + "type": "string", + "title": "Name is the name of resource being referenced" + }, + "namespace": { + "type": "string", + "title": "Namespace is the namespace of resource being referenced\nNote that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details.\n(Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n+featureGate=CrossNamespaceVolumeDataSource\n+optional" + } + } + }, "k8s.io.api.core.v1.Volume": { "type": "object", "properties": { diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 34c4e3cbf9..210aed25ac 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -94,7 +94,6 @@ var allowAllPodValidationOptions = apivalidation.PodValidationOptions{ AllowDownwardAPIHugePages: true, AllowInvalidPodDeletionCost: true, AllowIndivisibleHugePagesValues: true, - AllowWindowsHostProcessField: true, AllowExpandedDNSConfig: true, } @@ -117,7 +116,7 @@ func ValidateRolloutSpec(rollout *v1alpha1.Rollout, fldPath *field.Path) field.E message := fmt.Sprintf(MissingFieldMessage, ".spec.selector") allErrs = append(allErrs, field.Required(fldPath.Child("selector"), message)) } else { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) + allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, unversionedvalidation.LabelSelectorValidationOptions{}, fldPath.Child("selector"))...) if len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 { allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is invalid for deployment")) } diff --git a/pkg/client/clientset/versioned/clientset.go b/pkg/client/clientset/versioned/clientset.go index fef1aaafe4..146286fd64 100644 --- a/pkg/client/clientset/versioned/clientset.go +++ b/pkg/client/clientset/versioned/clientset.go @@ -33,8 +33,7 @@ type Interface interface { ArgoprojV1alpha1() argoprojv1alpha1.ArgoprojV1alpha1Interface } -// Clientset contains the clients for groups. Each group has exactly one -// version included in a Clientset. +// Clientset contains the clients for groups. type Clientset struct { *discovery.DiscoveryClient argoprojV1alpha1 *argoprojv1alpha1.ArgoprojV1alpha1Client diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go index ad38e29a88..1e6b2cef58 100644 --- a/pkg/client/informers/externalversions/factory.go +++ b/pkg/client/informers/externalversions/factory.go @@ -47,6 +47,11 @@ type sharedInformerFactory struct { // startedInformers is used for tracking which informers have been started. // This allows Start() to be called multiple times safely. startedInformers map[reflect.Type]bool + // wg tracks how many goroutines were started. + wg sync.WaitGroup + // shuttingDown is true when Shutdown has been called. It may still be running + // because it needs to wait for goroutines. + shuttingDown bool } // WithCustomResyncConfig sets a custom resync period for the specified informer types. @@ -107,20 +112,39 @@ func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResy return factory } -// Start initializes all requested informers. func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) { f.lock.Lock() defer f.lock.Unlock() + if f.shuttingDown { + return + } + for informerType, informer := range f.informers { if !f.startedInformers[informerType] { - go informer.Run(stopCh) + f.wg.Add(1) + // We need a new variable in each loop iteration, + // otherwise the goroutine would use the loop variable + // and that keeps changing. + informer := informer + go func() { + defer f.wg.Done() + informer.Run(stopCh) + }() f.startedInformers[informerType] = true } } } -// WaitForCacheSync waits for all started informers' cache were synced. +func (f *sharedInformerFactory) Shutdown() { + f.lock.Lock() + f.shuttingDown = true + f.lock.Unlock() + + // Will return immediately if there is nothing to wait for. + f.wg.Wait() +} + func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool { informers := func() map[reflect.Type]cache.SharedIndexInformer { f.lock.Lock() @@ -167,11 +191,58 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal // SharedInformerFactory provides shared informers for resources in all known // API group versions. +// +// It is typically used like this: +// +// ctx, cancel := context.Background() +// defer cancel() +// factory := NewSharedInformerFactory(client, resyncPeriod) +// defer factory.WaitForStop() // Returns immediately if nothing was started. +// genericInformer := factory.ForResource(resource) +// typedInformer := factory.SomeAPIGroup().V1().SomeType() +// factory.Start(ctx.Done()) // Start processing these informers. +// synced := factory.WaitForCacheSync(ctx.Done()) +// for v, ok := range synced { +// if !ok { +// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v) +// return +// } +// } +// +// // Creating informers can also be created after Start, but then +// // Start must be called again: +// anotherGenericInformer := factory.ForResource(resource) +// factory.Start(ctx.Done()) type SharedInformerFactory interface { internalinterfaces.SharedInformerFactory - ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + + // Start initializes all requested informers. They are handled in goroutines + // which run until the stop channel gets closed. + Start(stopCh <-chan struct{}) + + // Shutdown marks a factory as shutting down. At that point no new + // informers can be started anymore and Start will return without + // doing anything. + // + // In addition, Shutdown blocks until all goroutines have terminated. For that + // to happen, the close channel(s) that they were started with must be closed, + // either before Shutdown gets called or while it is waiting. + // + // Shutdown may be called multiple times, even concurrently. All such calls will + // block until all goroutines have terminated. + Shutdown() + + // WaitForCacheSync blocks until all started informers' caches were synced + // or the stop channel gets closed. WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool + // ForResource gives generic access to a shared informer of the matching type. + ForResource(resource schema.GroupVersionResource) (GenericInformer, error) + + // InternalInformerFor returns the SharedIndexInformer for obj using an internal + // client. + InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer + Argoproj() rollouts.Interface } diff --git a/rollout/trafficrouting/alb/alb.go b/rollout/trafficrouting/alb/alb.go index d91f211655..8e81b113c7 100644 --- a/rollout/trafficrouting/alb/alb.go +++ b/rollout/trafficrouting/alb/alb.go @@ -251,22 +251,22 @@ func (r *Reconciler) VerifyWeightPerIngress(desiredWeight int32, ingresses []str resourceIDToDest[resourceID] = dest } - loadBalancerStatus := ingress.GetLoadBalancerStatus() - if len(loadBalancerStatus.Ingress) == 0 { + hostnames := ingress.GetLoadBalancerHostnames() + if len(hostnames) == 0 { r.log.Infof("LoadBalancer not yet allocated") } - for _, lbIngress := range loadBalancerStatus.Ingress { - if lbIngress.Hostname == "" { + for _, hostname := range hostnames { + if hostname == "" { continue } - lb, err := r.aws.FindLoadBalancerByDNSName(ctx, lbIngress.Hostname) + lb, err := r.aws.FindLoadBalancerByDNSName(ctx, hostname) if err != nil { r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.TargetGroupVerifyErrorReason}, conditions.TargetGroupVerifyErrorMessage, canaryService, "unknown", err.Error()) return pointer.Bool(false), err } if lb == nil || lb.LoadBalancerArn == nil { - r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.LoadBalancerNotFoundReason}, conditions.LoadBalancerNotFoundMessage, lbIngress.Hostname) + r.cfg.Recorder.Warnf(rollout, record.EventOptions{EventReason: conditions.LoadBalancerNotFoundReason}, conditions.LoadBalancerNotFoundMessage, hostname) return pointer.Bool(false), nil } diff --git a/rollout/trafficrouting/alb/alb_test.go b/rollout/trafficrouting/alb/alb_test.go index 52fd5a6ec7..fb131849d4 100644 --- a/rollout/trafficrouting/alb/alb_test.go +++ b/rollout/trafficrouting/alb/alb_test.go @@ -7,15 +7,15 @@ import ( "strings" "testing" + networkingv1 "k8s.io/api/networking/v1" + elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types" "github.com/stretchr/testify/assert" - corev1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/intstr" kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" k8stesting "k8s.io/client-go/testing" @@ -125,7 +125,7 @@ func albActionAnnotation(stable string) string { return fmt.Sprintf("%s%s%s", ingressutil.ALBIngressAnnotation, ingressutil.ALBActionPrefix, stable) } -func ingress(name, stableSvc, canarySvc, actionService string, port, weight int32, managedBy string, includeStickyConfig bool) *extensionsv1beta1.Ingress { +func ingress(name, stableSvc, canarySvc, actionService string, port, weight int32, managedBy string, includeStickyConfig bool) *networkingv1.Ingress { managedByValue := ingressutil.ManagedALBAnnotations{ managedBy: ingressutil.ManagedALBAnnotation{albActionAnnotation(actionService)}, } @@ -139,7 +139,7 @@ func ingress(name, stableSvc, canarySvc, actionService string, port, weight int3 panic(err) } - i := &extensionsv1beta1.Ingress{ + i := &networkingv1.Ingress{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: metav1.NamespaceDefault, @@ -148,16 +148,22 @@ func ingress(name, stableSvc, canarySvc, actionService string, port, weight int3 ingressutil.ManagedAnnotations: managedByValue.String(), }, }, - Spec: extensionsv1beta1.IngressSpec{ - Rules: []extensionsv1beta1.IngressRule{ + Spec: networkingv1.IngressSpec{ + Rules: []networkingv1.IngressRule{ { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: actionService, - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: actionService, + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + Number: 0, + }, + }, + Resource: nil, }, }, }, @@ -207,7 +213,7 @@ func TestIngressNotFound(t *testing.T) { ro := fakeRollout("stable-service", "canary-service", nil, "stable-ingress", 443) client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -227,7 +233,7 @@ func TestIngressNotFoundMultiIngress(t *testing.T) { ro := fakeRolloutWithMultiIngress("stable-service", "canary-service", nil, []string{"stable-ingress", "multi-ingress"}, 443) client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -250,7 +256,7 @@ func TestServiceNotFoundInIngress(t *testing.T) { client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -274,8 +280,8 @@ func TestServiceNotFoundInMultiIngress(t *testing.T) { client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -296,8 +302,8 @@ func TestNoChanges(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -320,9 +326,9 @@ func TestNoChangesMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -345,8 +351,8 @@ func TestErrorOnInvalidManagedBy(t *testing.T) { i.Annotations[ingressutil.ManagedAnnotations] = "test" client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -369,9 +375,9 @@ func TestErrorOnInvalidManagedByMultiIngress(t *testing.T) { mi.Annotations[ingressutil.ManagedAnnotations] = "test" client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -393,8 +399,8 @@ func TestSetInitialDesiredWeight(t *testing.T) { i.Annotations = map[string]string{} client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -418,9 +424,9 @@ func TestSetInitialDesiredWeightMultiIngress(t *testing.T) { i.Annotations = map[string]string{} client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -446,8 +452,8 @@ func TestSetWeightPingPong(t *testing.T) { i.Annotations = map[string]string{} client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -475,9 +481,9 @@ func TestSetWeightPingPongMultiIngress(t *testing.T) { i.Annotations = map[string]string{} client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -500,8 +506,8 @@ func TestUpdateDesiredWeightWithStickyConfig(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, true) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) assert.Nil(t, err) r, err := NewReconciler(ReconcilerConfig{ Rollout: ro, @@ -522,9 +528,9 @@ func TestUpdateDesiredWeightWithStickyConfigMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, true) client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) assert.Nil(t, err) r, err := NewReconciler(ReconcilerConfig{ Rollout: ro, @@ -544,8 +550,8 @@ func TestUpdateDesiredWeight(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -568,9 +574,9 @@ func TestUpdateDesiredWeightMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -646,8 +652,8 @@ func TestErrorPatching(t *testing.T) { client := fake.NewSimpleClientset(i) client.ReactionChain = nil k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -677,9 +683,9 @@ func TestErrorPatchingMultiIngress(t *testing.T) { client := fake.NewSimpleClientset(i, mi) client.ReactionChain = nil k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -800,8 +806,9 @@ func TestVerifyWeight(t *testing.T) { SetWeight: pointer.Int32Ptr(10), }} i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) - i.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + + i.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", }, @@ -810,8 +817,8 @@ func TestVerifyWeight(t *testing.T) { client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1001,15 +1008,15 @@ func TestVerifyWeightMultiIngress(t *testing.T) { }} i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 5, ro.Name, false) - i.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + i.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", }, }, } - mi.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + mi.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-multi-ingress.us-west-2.elb.amazonaws.com", }, @@ -1018,9 +1025,9 @@ func TestVerifyWeightMultiIngress(t *testing.T) { client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1224,8 +1231,8 @@ func TestSetWeightWithMultipleBackends(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1272,9 +1279,9 @@ func TestSetWeightWithMultipleBackendsMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1337,8 +1344,8 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 0, ro.Name, false) i.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"] = fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, 443, 10, weightDestinations[0].ServiceName, 443, weightDestinations[0].Weight, weightDestinations[1].ServiceName, 443, weightDestinations[1].Weight, STABLE_SVC, 443, 85) - i.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + i.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", }, @@ -1347,8 +1354,8 @@ func TestVerifyWeightWithAdditionalDestinations(t *testing.T) { client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1552,15 +1559,15 @@ func TestVerifyWeightWithAdditionalDestinationsMultiIngress(t *testing.T) { i.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"] = fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, 443, 10, weightDestinations[0].ServiceName, 443, weightDestinations[0].Weight, weightDestinations[1].ServiceName, 443, weightDestinations[1].Weight, STABLE_SVC, 443, 85) mi.Annotations["alb.ingress.kubernetes.io/actions.stable-svc"] = fmt.Sprintf(actionTemplateWithExperiments, CANARY_SVC, 443, 10, weightDestinations[0].ServiceName, 443, weightDestinations[0].Weight, weightDestinations[1].ServiceName, 443, weightDestinations[1].Weight, STABLE_SVC, 443, 85) - i.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + i.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-test-abc-123.us-west-2.elb.amazonaws.com", }, }, } - mi.Status.LoadBalancer = corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + mi.Status.LoadBalancer = networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { Hostname: "verify-weight-multi-ingress.us-west-2.elb.amazonaws.com", }, @@ -1569,9 +1576,9 @@ func TestVerifyWeightWithAdditionalDestinationsMultiIngress(t *testing.T) { client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1835,8 +1842,8 @@ func TestSetHeaderRoute(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1875,9 +1882,9 @@ func TestSetHeaderRouteWithDifferentHeaderNames(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1926,9 +1933,9 @@ func TestSetHeaderRouteWithDuplicateHeaderNameMatches(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, "action1", 443, 10, ro.Name, false) client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -1977,9 +1984,9 @@ func TestSetHeaderRouteMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, "action2", 443, 10, ro.Name, false) client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -2025,15 +2032,21 @@ func TestRemoveManagedRoutes(t *testing.T) { i.Annotations["alb.ingress.kubernetes.io/actions.header-route"] = "{}" i.Annotations["alb.ingress.kubernetes.io/conditions.header-route"] = "{}" i.Annotations[ingressutil.ManagedAnnotations] = managedByValue.String() - i.Spec.Rules = []extensionsv1beta1.IngressRule{ + i.Spec.Rules = []networkingv1.IngressRule{ { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "action1", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "action1", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + Number: 0, + }, + }, + Resource: nil, }, }, }, @@ -2041,13 +2054,19 @@ func TestRemoveManagedRoutes(t *testing.T) { }, }, { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "header-route", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "header-route", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + Number: 0, + }, + }, + Resource: nil, }, }, }, @@ -2058,8 +2077,8 @@ func TestRemoveManagedRoutes(t *testing.T) { client := fake.NewSimpleClientset(i) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -2100,15 +2119,21 @@ func TestRemoveManagedRoutesMultiIngress(t *testing.T) { i.Annotations["alb.ingress.kubernetes.io/actions.header-route"] = "{}" i.Annotations["alb.ingress.kubernetes.io/conditions.header-route"] = "{}" i.Annotations[ingressutil.ManagedAnnotations] = managedByValue.String() - i.Spec.Rules = []extensionsv1beta1.IngressRule{ + i.Spec.Rules = []networkingv1.IngressRule{ { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "action1", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "action1", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + Number: 0, + }, + }, + Resource: nil, }, }, }, @@ -2116,13 +2141,19 @@ func TestRemoveManagedRoutesMultiIngress(t *testing.T) { }, }, { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "header-route", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "header-route", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + Number: 0, + }, + }, + Resource: nil, }, }, }, @@ -2134,15 +2165,20 @@ func TestRemoveManagedRoutesMultiIngress(t *testing.T) { mi.Annotations["alb.ingress.kubernetes.io/actions.header-route"] = "{}" mi.Annotations["alb.ingress.kubernetes.io/conditions.header-route"] = "{}" mi.Annotations[ingressutil.ManagedAnnotations] = managedByValue.String() - mi.Spec.Rules = []extensionsv1beta1.IngressRule{ + mi.Spec.Rules = []networkingv1.IngressRule{ { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "action1", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "action1", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + }, + }, + Resource: nil, }, }, }, @@ -2150,13 +2186,18 @@ func TestRemoveManagedRoutesMultiIngress(t *testing.T) { }, }, { - IngressRuleValue: extensionsv1beta1.IngressRuleValue{ - HTTP: &extensionsv1beta1.HTTPIngressRuleValue{ - Paths: []extensionsv1beta1.HTTPIngressPath{ + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: []networkingv1.HTTPIngressPath{ { - Backend: extensionsv1beta1.IngressBackend{ - ServiceName: "header-route", - ServicePort: intstr.Parse("use-annotation"), + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: "header-route", + Port: networkingv1.ServiceBackendPort{ + Name: "use-annotation", + }, + }, + Resource: nil, }, }, }, @@ -2167,9 +2208,9 @@ func TestRemoveManagedRoutesMultiIngress(t *testing.T) { client := fake.NewSimpleClientset(i, mi) k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -2198,8 +2239,8 @@ func TestSetMirrorRoute(t *testing.T) { i := ingress("ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } @@ -2230,9 +2271,9 @@ func TestSetMirrorRouteMultiIngress(t *testing.T) { mi := ingress("multi-ingress", STABLE_SVC, CANARY_SVC, STABLE_SVC, 443, 10, ro.Name, false) client := fake.NewSimpleClientset() k8sI := kubeinformers.NewSharedInformerFactory(client, 0) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(i) - k8sI.Extensions().V1beta1().Ingresses().Informer().GetIndexer().Add(mi) - ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeExtensions, client, k8sI) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(i) + k8sI.Networking().V1().Ingresses().Informer().GetIndexer().Add(mi) + ingressWrapper, err := ingressutil.NewIngressWrapper(ingressutil.IngressModeNetworking, client, k8sI) if err != nil { t.Fatal(err) } diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 563a5e3d9f..acbbf9418a 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -3494,6 +3494,25 @@ export interface K8sIoApiCoreV1CinderVolumeSource { */ secretRef?: K8sIoApiCoreV1LocalObjectReference; } +/** + * ClaimSource describes a reference to a ResourceClaim. Exactly one of these fields should be set. Consumers of this type must treat an empty object as if it has an unknown value. + * @export + * @interface K8sIoApiCoreV1ClaimSource + */ +export interface K8sIoApiCoreV1ClaimSource { + /** + * ResourceClaimName is the name of a ResourceClaim object in the same namespace as this pod. + * @type {string} + * @memberof K8sIoApiCoreV1ClaimSource + */ + resourceClaimName?: string; + /** + * ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long). An existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed. This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim. + * @type {string} + * @memberof K8sIoApiCoreV1ClaimSource + */ + resourceClaimTemplateName?: string; +} /** * ConfigMapEnvSource selects a ConfigMap to populate the environment variables with. The contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables. * @export @@ -4354,7 +4373,7 @@ export interface K8sIoApiCoreV1HTTPGetAction { */ export interface K8sIoApiCoreV1HTTPHeader { /** - * + * The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. * @type {string} * @memberof K8sIoApiCoreV1HTTPHeader */ @@ -4729,10 +4748,10 @@ export interface K8sIoApiCoreV1PersistentVolumeClaimSpec { dataSource?: K8sIoApiCoreV1TypedLocalObjectReference; /** * - * @type {K8sIoApiCoreV1TypedLocalObjectReference} + * @type {K8sIoApiCoreV1TypedObjectReference} * @memberof K8sIoApiCoreV1PersistentVolumeClaimSpec */ - dataSourceRef?: K8sIoApiCoreV1TypedLocalObjectReference; + dataSourceRef?: K8sIoApiCoreV1TypedObjectReference; } /** * PersistentVolumeClaimTemplate is used to produce PersistentVolumeClaim objects as part of an EphemeralVolumeSource. @@ -4930,6 +4949,38 @@ export interface K8sIoApiCoreV1PodReadinessGate { */ conditionType?: string; } +/** + * PodResourceClaim references exactly one ResourceClaim through a ClaimSource. It adds a name to it that uniquely identifies the ResourceClaim inside the Pod. Containers that need access to the ResourceClaim reference it with this name. + * @export + * @interface K8sIoApiCoreV1PodResourceClaim + */ +export interface K8sIoApiCoreV1PodResourceClaim { + /** + * Name uniquely identifies this resource claim inside the pod. This must be a DNS_LABEL. + * @type {string} + * @memberof K8sIoApiCoreV1PodResourceClaim + */ + name?: string; + /** + * + * @type {K8sIoApiCoreV1ClaimSource} + * @memberof K8sIoApiCoreV1PodResourceClaim + */ + source?: K8sIoApiCoreV1ClaimSource; +} +/** + * PodSchedulingGate is associated to a Pod to guard its scheduling. + * @export + * @interface K8sIoApiCoreV1PodSchedulingGate + */ +export interface K8sIoApiCoreV1PodSchedulingGate { + /** + * Name of the scheduling gate. Each scheduling gate must have a unique name field. + * @type {string} + * @memberof K8sIoApiCoreV1PodSchedulingGate + */ + name?: string; +} /** * PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext. * @export @@ -5225,6 +5276,18 @@ export interface K8sIoApiCoreV1PodSpec { * @memberof K8sIoApiCoreV1PodSpec */ hostUsers?: boolean; + /** + * SchedulingGates is an opaque list of values that if specified will block scheduling the pod. More info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness. This is an alpha-level feature enabled by PodSchedulingReadiness feature gate. +optional +patchMergeKey=name +patchStrategy=merge +listType=map +listMapKey=name + * @type {Array} + * @memberof K8sIoApiCoreV1PodSpec + */ + schedulingGates?: Array; + /** + * ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name. This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. This field is immutable. +patchMergeKey=name +patchStrategy=merge,retainKeys +listType=map +listMapKey=name +featureGate=DynamicResourceAllocation +optional + * @type {Array} + * @memberof K8sIoApiCoreV1PodSpec + */ + resourceClaims?: Array; } /** * @@ -5486,6 +5549,19 @@ export interface K8sIoApiCoreV1RBDVolumeSource { */ readOnly?: boolean; } +/** + * ResourceClaim references one entry in PodSpec.ResourceClaims. + * @export + * @interface K8sIoApiCoreV1ResourceClaim + */ +export interface K8sIoApiCoreV1ResourceClaim { + /** + * Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container. + * @type {string} + * @memberof K8sIoApiCoreV1ResourceClaim + */ + name?: string; +} /** * * @export @@ -5529,6 +5605,12 @@ export interface K8sIoApiCoreV1ResourceRequirements { * @memberof K8sIoApiCoreV1ResourceRequirements */ requests?: { [key: string]: K8sIoApimachineryPkgApiResourceQuantity; }; + /** + * Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. +listType=map +listMapKey=name +featureGate=DynamicResourceAllocation +optional + * @type {Array} + * @memberof K8sIoApiCoreV1ResourceRequirements + */ + claims?: Array; } /** * @@ -5994,13 +6076,13 @@ export interface K8sIoApiCoreV1TopologySpreadConstraint { */ minDomains?: number; /** - * NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional + * NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. If this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional * @type {string} * @memberof K8sIoApiCoreV1TopologySpreadConstraint */ nodeAffinityPolicy?: string; /** - * NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional + * NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. If this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag. +optional * @type {string} * @memberof K8sIoApiCoreV1TopologySpreadConstraint */ @@ -6037,6 +6119,37 @@ export interface K8sIoApiCoreV1TypedLocalObjectReference { */ name?: string; } +/** + * + * @export + * @interface K8sIoApiCoreV1TypedObjectReference + */ +export interface K8sIoApiCoreV1TypedObjectReference { + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1TypedObjectReference + */ + apiGroup?: string; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1TypedObjectReference + */ + kind?: string; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1TypedObjectReference + */ + name?: string; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1TypedObjectReference + */ + namespace?: string; +} /** * Volume represents a named volume in a pod that may be accessed by any container in the pod. * @export diff --git a/utils/ingress/ingress_test.go b/utils/ingress/ingress_test.go index 7d6cecee63..ccbd3449f1 100644 --- a/utils/ingress/ingress_test.go +++ b/utils/ingress/ingress_test.go @@ -8,7 +8,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - corev1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -587,12 +586,12 @@ func getNetworkingIngress() *networkingv1.Ingress { }, }, Status: networkingv1.IngressStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + LoadBalancer: networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { IP: "127.0.0.1", Hostname: "localhost", - Ports: []corev1.PortStatus{ + Ports: []networkingv1.IngressPortStatus{ { Port: 8080, Protocol: "http", @@ -630,12 +629,12 @@ func getExtensionsIngress() *extensionsv1beta1.Ingress { }, }, Status: extensionsv1beta1.IngressStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + LoadBalancer: extensionsv1beta1.IngressLoadBalancerStatus{ + Ingress: []extensionsv1beta1.IngressLoadBalancerIngress{ { IP: "127.0.0.1", Hostname: "localhost", - Ports: []corev1.PortStatus{ + Ports: []extensionsv1beta1.IngressPortStatus{ { Port: 8080, Protocol: "http", diff --git a/utils/ingress/wrapper.go b/utils/ingress/wrapper.go index d70b6a96ed..c21bad82f7 100644 --- a/utils/ingress/wrapper.go +++ b/utils/ingress/wrapper.go @@ -6,7 +6,6 @@ import ( "sort" "sync" - corev1 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -322,15 +321,19 @@ func (i *Ingress) GetNamespace() string { } } -func (i *Ingress) GetLoadBalancerStatus() corev1.LoadBalancerStatus { +func (i *Ingress) GetLoadBalancerHostnames() []string { + hostnames := []string{} switch i.mode { case IngressModeNetworking: - return i.ingress.Status.LoadBalancer + for _, ingress := range i.ingress.Status.LoadBalancer.Ingress { + hostnames = append(hostnames, ingress.Hostname) + } case IngressModeExtensions: - return i.legacyIngress.Status.LoadBalancer - default: - return corev1.LoadBalancerStatus{} + for _, ingress := range i.legacyIngress.Status.LoadBalancer.Ingress { + hostnames = append(hostnames, ingress.Hostname) + } } + return hostnames } func (i *Ingress) Mode() IngressMode { diff --git a/utils/ingress/wrapper_test.go b/utils/ingress/wrapper_test.go index 9e8f511494..0d8be79150 100644 --- a/utils/ingress/wrapper_test.go +++ b/utils/ingress/wrapper_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/stretchr/testify/assert" - corev1 "k8s.io/api/core/v1" "k8s.io/api/extensions/v1beta1" + networkingv1 "k8s.io/api/networking/v1" v1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" @@ -450,30 +450,30 @@ func TestDeepCopy(t *testing.T) { }) } -func TestGetLoadBalancerStatus(t *testing.T) { - t.Run("will get loadbalancer status from wrapped networking.Ingress", func(t *testing.T) { +func TestGetLoadBalancerHostnames(t *testing.T) { + t.Run("will get loadbalancer hostnames from wrapped networking.Ingress", func(t *testing.T) { // given t.Parallel() i := getNetworkingIngress() ni := ingress.NewIngress(i) // when - lbs := ni.GetLoadBalancerStatus() + lbs := ni.GetLoadBalancerHostnames() // then - assert.Equal(t, i.Status.LoadBalancer, lbs) + assert.Equal(t, []string{"localhost"}, lbs) }) - t.Run("will get loadbalancer status from wrapped extensions.Ingress", func(t *testing.T) { + t.Run("will get loadbalancer hostnames from wrapped extensions.Ingress", func(t *testing.T) { // given t.Parallel() i := getExtensionsIngress() li := ingress.NewLegacyIngress(i) // when - lbs := li.GetLoadBalancerStatus() + lbs := li.GetLoadBalancerHostnames() // then - assert.Equal(t, i.Status.LoadBalancer, lbs) + assert.Equal(t, []string{"localhost"}, lbs) }) } @@ -914,12 +914,12 @@ func getNetworkingIngress() *v1.Ingress { }, }, Status: v1.IngressStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + LoadBalancer: networkingv1.IngressLoadBalancerStatus{ + Ingress: []networkingv1.IngressLoadBalancerIngress{ { IP: "127.0.0.1", Hostname: "localhost", - Ports: []corev1.PortStatus{ + Ports: []networkingv1.IngressPortStatus{ { Port: 8080, Protocol: "http", @@ -954,12 +954,12 @@ func getExtensionsIngress() *v1beta1.Ingress { }, }, Status: v1beta1.IngressStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{ + LoadBalancer: v1beta1.IngressLoadBalancerStatus{ + Ingress: []v1beta1.IngressLoadBalancerIngress{ { IP: "127.0.0.1", Hostname: "localhost", - Ports: []corev1.PortStatus{ + Ports: []v1beta1.IngressPortStatus{ { Port: 8080, Protocol: "http", From 003af7b4f377bf223c36054d6daa779f6f9d7ecf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:11:21 -0600 Subject: [PATCH 124/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.2 to 1.26.3 (#3229) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.2 to 1.26.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.2...service/s3/v1.26.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 22fd6c668e..fa34f312a9 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.23.5 github.com/aws/aws-sdk-go-v2/config v1.25.11 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 6648468c34..a27df254b0 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 h1:HWB+RXvOQQkhEp8QCpTlgullbCiysRQlo6ulVZRBBtM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2 h1:g+IxAIM+48Lerr/7/ndAuiOjFXb3i2Z+Q/R2o0f7bIU= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.2/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 h1:k+RlNAWIefNxYdrQtM6e4ItwxO4r++Y9Sa9vNE5jx6M= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+ZjkOQjDdHd86/JCEucjFKQ9T0atWKO4s2Lgs= From a3a449c9e4bc68d2ae46e5661d248d09ad8759d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:12:14 -0600 Subject: [PATCH 125/264] chore(deps): bump actions/setup-go from 4.1.0 to 5.0.0 (#3228) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4.1.0 to 5.0.0. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v4.1.0...v5.0.0) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 6 +++--- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index a3e7aed29f..39c9578148 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.0 with: go-version: '1.20' - uses: actions/checkout@v4 diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index 6746b7406d..a0c2dfdde6 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -24,7 +24,7 @@ jobs: with: python-version: 3.x - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.0 with: go-version: '1.20' - name: build diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 961203bcef..d2d98e564c 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -36,7 +36,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.0 with: go-version: ${{ env.GOLANG_VERSION }} - name: Checkout code @@ -51,7 +51,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.0 with: go-version: ${{ env.GOLANG_VERSION }} id: go @@ -103,7 +103,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Setup Golang - uses: actions/setup-go@v4.1.0 + uses: actions/setup-go@v5.0.0 with: go-version: ${{ env.GOLANG_VERSION }} # k8s codegen generates files into GOPATH location instead of the GitHub git checkout location diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 7ad249ec56..de25b6fbee 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -69,7 +69,7 @@ jobs: if: ${{ github.ref_type != 'tag'}} - name: Setup Golang - uses: actions/setup-go@v4.1.0 # v3.5.0 + uses: actions/setup-go@v5.0.0 # v3.5.0 with: go-version: ${{ inputs.go-version }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 000af79061..a128541f04 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -91,7 +91,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v4.1.0 # v4.0.1 + uses: actions/setup-go@v5.0.0 # v4.0.1 with: go-version: ${{ env.GOLANG_VERSION }} @@ -165,7 +165,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Golang - uses: actions/setup-go@v4.1.0 # v4.0.0 + uses: actions/setup-go@v5.0.0 # v4.0.0 with: go-version: ${{ env.GOLANG_VERSION }} From 4c7a99b2dac07175802616cf8918735a2aaa61a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 08:37:44 -0600 Subject: [PATCH 126/264] chore(deps): bump actions/setup-python from 4 to 5 (#3227) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/gh-pages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index a0c2dfdde6..49aff35408 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.x - name: Set up Go From 2723b7d601fc3e0ea9fbf8dcb00fcbf3db60f2ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 08:49:27 -0600 Subject: [PATCH 127/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.31.2 to 1.31.3 (#3226) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.31.2 to 1.31.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.31.2...service/s3/v1.31.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fa34f312a9..44a8593b82 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.5 github.com/aws/aws-sdk-go-v2/config v1.25.11 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index a27df254b0..ee159b4ffb 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 h1:ZE2ds/qeBkhk3yqYvS3 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8/go.mod h1:/lAPPymDYL023+TS6DJmjuL42nxix2AvEvfjqOBRODk= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2 h1:HWB+RXvOQQkhEp8QCpTlgullbCiysRQlo6ulVZRBBtM= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.2/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 h1:JnMjYtQ/iTSb0QYvO47ds0R8stSUOr9t3VhIJWf/Y+Y= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 h1:k+RlNAWIefNxYdrQtM6e4ItwxO4r++Y9Sa9vNE5jx6M= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= From 5bcacd9a65ce5befd2e53775fa948f02dbb31258 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:22:08 +0000 Subject: [PATCH 128/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.11 to 1.25.12 (#3230) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.25.11 to 1.25.12. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.11...config/v1.25.12) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 44a8593b82..e83343cc7c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.23.5 - github.com/aws/aws-sdk-go-v2/config v1.25.11 + github.com/aws/aws-sdk-go-v2/config v1.25.12 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 github.com/blang/semver v3.5.1+incompatible @@ -77,7 +77,7 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.9 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.10 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect @@ -85,9 +85,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 // indirect github.com/aws/smithy-go v1.18.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index ee159b4ffb..3a7111b9bf 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.23.5 h1:xK6C4udTyDMd82RFvNkDQxtAd00xlzFUtX4fF2nMZyg= github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= -github.com/aws/aws-sdk-go-v2/config v1.25.11 h1:RWzp7jhPRliIcACefGkKp03L0Yofmd2p8M25kbiyvno= -github.com/aws/aws-sdk-go-v2/config v1.25.11/go.mod h1:BVUs0chMdygHsQtvaMyEOpW2GIW+ubrxJLgIz/JU29s= -github.com/aws/aws-sdk-go-v2/credentials v1.16.9 h1:LQo3MUIOzod9JdUK+wxmSdgzLVYUbII3jXn3S/HJZU0= -github.com/aws/aws-sdk-go-v2/credentials v1.16.9/go.mod h1:R7mDuIJoCjH6TxGUc/cylE7Lp/o0bhKVoxdBThsjqCM= +github.com/aws/aws-sdk-go-v2/config v1.25.12 h1:mF4cMuNh/2G+d19nWnm1vJ/ak0qK6SbqF0KtSX9pxu0= +github.com/aws/aws-sdk-go-v2/config v1.25.12/go.mod h1:lOvvqtZP9p29GIjOTuA/76HiVk0c/s8qRcFRq2+E2uc= +github.com/aws/aws-sdk-go-v2/credentials v1.16.10 h1:VmRkuoKaGl2ZDNGkkRQgw80Hxj1Bb9a+bsT5shqlCwo= +github.com/aws/aws-sdk-go-v2/credentials v1.16.10/go.mod h1:WEn22lpd50buTs/TDqywytW5xQ2zPOMbYipIlqI6xXg= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 h1:FZVFahMyZle6WcogZCOxo6D/lkDA2lqKIn4/ueUmVXw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9/go.mod h1:kjq7REMIkxdtcEC9/4BVXjOsNY5isz6jQbEgk6osRTU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= @@ -117,12 +117,12 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+Zj github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0vV3/csTpbkfKLI5Sb56cJQTCTtJ0ixdb7P+Wedqiw= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 h1:xJPydhNm0Hiqct5TVKEuHG7weC0+sOs4MUnd7A5n5F4= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.2/go.mod h1:zxk6y1X2KXThESWMS5CrKRvISD8mbIMab6nZrCGxDG0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 h1:8dU9zqA77C5egbU6yd4hFLaiIdPv3rU+6cp7sz5FjCU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2/go.mod h1:7Lt5mjQ8x5rVdKqg+sKKDeuwoszDJIIPmkd8BVsEdS0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.2 h1:fFrLsy08wEbAisqW3KDl/cPHrF43GmV79zXB9EwJiZw= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.2/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.3 h1:wKspi1zc2ZVcgZEu3k2Mt4zGKQSoZTftsoUTLsYPcVo= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.3/go.mod h1:zxk6y1X2KXThESWMS5CrKRvISD8mbIMab6nZrCGxDG0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3 h1:CxAHBS0BWSUqI7qzXHc2ZpTeHaM9JNnWJ9BN6Kmo2CY= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3/go.mod h1:7Lt5mjQ8x5rVdKqg+sKKDeuwoszDJIIPmkd8BVsEdS0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 h1:KfREzajmHCSYjCaMRtdLr9boUMA7KPpoPApitPlbNeo= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.3/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.18.1 h1:pOdBTUfXNazOlxLrgeYalVnuTpKreACHtc62xLwIB3c= github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 1305129da1c4c6251251952a1d377b07fc2475cc Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 7 Dec 2023 16:58:50 -0600 Subject: [PATCH 129/264] fix: conflict on updates to replicaset revision (#3216) * fix: possibly fix conflict on updates to revision Signed-off-by: Zach Aller * wip Signed-off-by: Zach Aller * fix one test Signed-off-by: Zach Aller * fix tests Signed-off-by: Zach Aller * cleanup Signed-off-by: Zach Aller * change order Signed-off-by: Zach Aller * change order to match reality Signed-off-by: Zach Aller * add comments on exptected actions Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/canary_test.go | 15 ++++++++------- rollout/sync.go | 6 ++++-- rollout/trafficrouting_test.go | 8 ++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/rollout/canary_test.go b/rollout/canary_test.go index f136a01e42..6fc3dda93c 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -823,9 +823,9 @@ func TestRollBackToStable(t *testing.T) { f.rolloutLister = append(f.rolloutLister, r2) f.objects = append(f.objects, r2) - updatedRSIndex := f.expectUpdateReplicaSetAction(rs1) - f.expectUpdateReplicaSetAction(rs1) - patchIndex := f.expectPatchRolloutAction(r2) + updatedRSIndex := f.expectUpdateReplicaSetAction(rs1) // Bump replicaset revision from 1 to 3 + f.expectUpdateRolloutAction(r2) // Bump rollout revision from 1 to 3 + patchIndex := f.expectPatchRolloutAction(r2) // Patch rollout status f.run(getKey(r2, t)) expectedRS1 := rs1.DeepCopy() @@ -883,9 +883,9 @@ func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { f.rolloutLister = append(f.rolloutLister, r2) f.objects = append(f.objects, r2) - f.expectUpdateReplicaSetAction(rs1) - f.expectUpdateReplicaSetAction(rs1) - rolloutPatchIndex := f.expectPatchRolloutAction(r2) + f.expectUpdateReplicaSetAction(rs1) // Update replicaset revision from 1 to 3 + f.expectUpdateRolloutAction(r2) // Update rollout revision from 1 to 3 + rolloutPatchIndex := f.expectPatchRolloutAction(r2) // Patch rollout status f.run(getKey(r2, t)) expectedStepIndex := len(steps) @@ -963,7 +963,8 @@ func TestRollBackToStableAndStepChange(t *testing.T) { f.objects = append(f.objects, r2) updatedRSIndex := f.expectUpdateReplicaSetAction(rs1) - f.expectUpdateReplicaSetAction(rs1) + //f.expectUpdateReplicaSetAction(rs1) + f.expectUpdateRolloutAction(r2) patchIndex := f.expectPatchRolloutAction(r2) f.run(getKey(r2, t)) diff --git a/rollout/sync.go b/rollout/sync.go index a7f600917c..a37627f680 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -280,7 +280,8 @@ func (c *rolloutContext) createDesiredReplicaSet() (*appsv1.ReplicaSet, error) { // syncReplicasOnly is responsible for reconciling rollouts on scaling events. func (c *rolloutContext) syncReplicasOnly() error { c.log.Infof("Syncing replicas only due to scaling event") - _, err := c.getAllReplicaSetsAndSyncRevision(false) + var err error + c.newRS, err = c.getAllReplicaSetsAndSyncRevision(false) if err != nil { return err } @@ -326,7 +327,8 @@ func (c *rolloutContext) syncReplicasOnly() error { // // rsList should come from getReplicaSetsForRollout(r). func (c *rolloutContext) isScalingEvent() (bool, error) { - _, err := c.getAllReplicaSetsAndSyncRevision(false) + var err error + c.newRS, err = c.getAllReplicaSetsAndSyncRevision(false) if err != nil { return false, err } diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index a545d9fae6..f26039a34d 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -1213,10 +1213,10 @@ func TestDontWeightToZeroWhenDynamicallyRollingBackToStable(t *testing.T) { f.rolloutLister = append(f.rolloutLister, r2) f.objects = append(f.objects, r2) - f.expectUpdateReplicaSetAction(rs1) // Updates the revision annotation from 1 to 3 - f.expectUpdateReplicaSetAction(rs1) // repeat of the above (not sure why) - scaleUpIndex := f.expectUpdateReplicaSetAction(rs1) // this one scales the stable RS to 10 - f.expectPatchRolloutAction(r2) + f.expectUpdateReplicaSetAction(rs1) // Updates the revision annotation from 1 to 3 from func isScalingEvent + f.expectUpdateRolloutAction(r2) // Update the rollout revision from 1 to 3 + scaleUpIndex := f.expectUpdateReplicaSetAction(rs1) // Scale The replicaset from 1 to 10 from func scaleReplicaSet + f.expectPatchRolloutAction(r2) // Updates the rollout status from the scaling to 10 action f.fakeTrafficRouting = newUnmockedFakeTrafficRoutingReconciler() f.fakeTrafficRouting.On("UpdateHash", mock.Anything, mock.Anything, mock.Anything).Return(func(canaryHash, stableHash string, additionalDestinations ...v1alpha1.WeightDestination) error { From eeb2719479a32a604e498aff19b671f690ddaf97 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 8 Dec 2023 09:26:08 -0600 Subject: [PATCH 130/264] fix: make sure we use the updated rs when we write back to informer (#3237) Signed-off-by: Zach Aller --- rollout/replicaset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollout/replicaset.go b/rollout/replicaset.go index fc23464f50..912417ca1a 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -34,7 +34,7 @@ func (c *rolloutContext) removeScaleDownDelay(rs *appsv1.ReplicaSet) error { return nil } patch := fmt.Sprintf(removeScaleDownAtAnnotationsPatch, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) - _, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) + rs, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.JSONPatchType, []byte(patch), metav1.PatchOptions{}) if err != nil { return fmt.Errorf("error removing scale-down-deadline annotation from RS '%s': %w", rs.Name, err) } From 3a63141261f5165b31d5db60a55ff05104bc68d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 09:34:36 -0600 Subject: [PATCH 131/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.3 to 1.26.4 (#3234) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.3 to 1.26.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.3...service/s3/v1.26.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index e83343cc7c..69f2fc10f8 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.23.5 + github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.25.12 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 @@ -79,8 +79,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.10 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect @@ -88,7 +88,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.18.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 // indirect - github.com/aws/smithy-go v1.18.1 // indirect + github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 3a7111b9bf..cb9cdfbfd5 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.23.5 h1:xK6C4udTyDMd82RFvNkDQxtAd00xlzFUtX4fF2nMZyg= -github.com/aws/aws-sdk-go-v2 v1.23.5/go.mod h1:t3szzKfP0NeRU27uBFczDivYJjsmSnqI8kIvKyWb9ds= +github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= +github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= github.com/aws/aws-sdk-go-v2/config v1.25.12 h1:mF4cMuNh/2G+d19nWnm1vJ/ak0qK6SbqF0KtSX9pxu0= github.com/aws/aws-sdk-go-v2/config v1.25.12/go.mod h1:lOvvqtZP9p29GIjOTuA/76HiVk0c/s8qRcFRq2+E2uc= github.com/aws/aws-sdk-go-v2/credentials v1.16.10 h1:VmRkuoKaGl2ZDNGkkRQgw80Hxj1Bb9a+bsT5shqlCwo= @@ -100,17 +100,17 @@ github.com/aws/aws-sdk-go-v2/credentials v1.16.10/go.mod h1:WEn22lpd50buTs/TDqyw github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 h1:FZVFahMyZle6WcogZCOxo6D/lkDA2lqKIn4/ueUmVXw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9/go.mod h1:kjq7REMIkxdtcEC9/4BVXjOsNY5isz6jQbEgk6osRTU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 h1:8GVZIR0y6JRIUNSYI1xAMF4HDfV8H/bOsZ/8AD/uY5Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8/go.mod h1:rwBfu0SoUkBUZndVgPZKAD9Y2JigaZtRP68unRiYToQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 h1:ZE2ds/qeBkhk3yqYvS3CDCFNvd9ir5hMjlVStLZWrvM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8/go.mod h1:/lAPPymDYL023+TS6DJmjuL42nxix2AvEvfjqOBRODk= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 h1:JnMjYtQ/iTSb0QYvO47ds0R8stSUOr9t3VhIJWf/Y+Y= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3 h1:k+RlNAWIefNxYdrQtM6e4ItwxO4r++Y9Sa9vNE5jx6M= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.3/go.mod h1:iXnv//Yhh2cn1LcdYtxdi+iW1SF/Bw9w4jh/dd/lCEk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 h1:bSjDWRQTcUorD6q0oTUmzrXOmWkTveezefwpP9wArxA= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+ZjkOQjDdHd86/JCEucjFKQ9T0atWKO4s2Lgs= @@ -124,8 +124,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3/go.mod h1:7Lt5mjQ8x5rVdKqg+ github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 h1:KfREzajmHCSYjCaMRtdLr9boUMA7KPpoPApitPlbNeo= github.com/aws/aws-sdk-go-v2/service/sts v1.26.3/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.18.1 h1:pOdBTUfXNazOlxLrgeYalVnuTpKreACHtc62xLwIB3c= -github.com/aws/smithy-go v1.18.1/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From d0faf585d338a17f7b09833eb69ba2d7af2339f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:09:48 +0000 Subject: [PATCH 132/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.31.3 to 1.31.4 (#3235) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.31.3 to 1.31.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.31.3...service/athena/v1.31.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 69f2fc10f8..44d4da996b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.25.12 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index cb9cdfbfd5..407bea5c1e 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrw github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3 h1:JnMjYtQ/iTSb0QYvO47ds0R8stSUOr9t3VhIJWf/Y+Y= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.3/go.mod h1:YHhAfr9Qd5xd0fLT2B7LxDFWbIZ6RbaI81Hu2ASCiTY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 h1:gnbvANwxZdFG0rd+0SPwJxcwVUdoO9FnKBOk26spse8= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 h1:bSjDWRQTcUorD6q0oTUmzrXOmWkTveezefwpP9wArxA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= From 5cbd128e8daec4940f926eb8d8e3642222f660ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:11:03 -0600 Subject: [PATCH 133/264] chore(deps): bump actions/stale from 8 to 9 (#3232) Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v8...v9) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale-issues-pr.yml | 2 +- .github/workflows/waiting-issues.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale-issues-pr.yml b/.github/workflows/stale-issues-pr.yml index 79508bdefd..041a5206ab 100644 --- a/.github/workflows/stale-issues-pr.yml +++ b/.github/workflows/stale-issues-pr.yml @@ -13,7 +13,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: operations-per-run: 250 stale-issue-message: 'This issue is stale because it has been open 60 days with no activity.' diff --git a/.github/workflows/waiting-issues.yml b/.github/workflows/waiting-issues.yml index 6dd92d0683..56b30b5608 100644 --- a/.github/workflows/waiting-issues.yml +++ b/.github/workflows/waiting-issues.yml @@ -13,7 +13,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: operations-per-run: 250 stale-issue-message: 'This issue is stale because it has awaiting-response label for 5 days with no activity. Remove stale label or comment or this will be closed in 5 days.' From 147b74a15c8f8387e7c7ef5e353a59745c13a70b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:20:48 -0600 Subject: [PATCH 134/264] chore(deps): bump github.com/influxdata/influxdb-client-go/v2 from 2.12.4 to 2.13.0 (#3217) chore(deps): bump github.com/influxdata/influxdb-client-go/v2 Bumps [github.com/influxdata/influxdb-client-go/v2](https://github.com/influxdata/influxdb-client-go) from 2.12.4 to 2.13.0. - [Release notes](https://github.com/influxdata/influxdb-client-go/releases) - [Changelog](https://github.com/influxdata/influxdb-client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-go/compare/v2.12.4...v2.13.0) --- updated-dependencies: - dependency-name: github.com/influxdata/influxdb-client-go/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 44d4da996b..c38c009961 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/golang/protobuf v1.5.3 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-plugin v1.6.0 - github.com/influxdata/influxdb-client-go/v2 v2.12.4 + github.com/influxdata/influxdb-client-go/v2 v2.13.0 github.com/juju/ansiterm v1.0.0 github.com/machinebox/graphql v0.2.2 github.com/mitchellh/mapstructure v1.5.0 @@ -95,7 +95,6 @@ require ( github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/docker/distribution v2.8.1+incompatible // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect @@ -141,7 +140,7 @@ require ( github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.0.0 // indirect @@ -154,6 +153,7 @@ require ( github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 // indirect diff --git a/go.sum b/go.sum index 407bea5c1e..7129bd77a9 100644 --- a/go.sum +++ b/go.sum @@ -178,8 +178,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= -github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -411,8 +409,8 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb-client-go/v2 v2.12.4 h1:9qJLqetEmhIlqaF/N9KUtdmRKSbNy6IohggyS3bxWlE= -github.com/influxdata/influxdb-client-go/v2 v2.12.4/go.mod h1:3BQow2tDJRxKi8oUUy/6BtHaSq7wrBIoKieYMXB6knQ= +github.com/influxdata/influxdb-client-go/v2 v2.13.0 h1:ioBbLmR5NMbAjP4UVA5r9b5xGjpABD7j65pI8kFphDM= +github.com/influxdata/influxdb-client-go/v2 v2.13.0/go.mod h1:k+spCbt9hcvqvUiz0sr5D8LolXHqAAOfPw9v/RIRHl4= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= @@ -486,8 +484,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= @@ -534,6 +533,8 @@ github.com/newrelic/newrelic-client-go v1.1.0/go.mod h1:RYMXt7hgYw7nzuXIGd2BH0F1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= +github.com/oapi-codegen/runtime v1.0.0/go.mod h1:LmCUMQuPB4M/nLXilQXhHw+BLZdDb18B34OO356yJ/A= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= From 8d20ab74eaa579f023110aeabefbc55f08cff4e4 Mon Sep 17 00:00:00 2001 From: Liming Liu Date: Sat, 9 Dec 2023 00:26:21 +0800 Subject: [PATCH 135/264] chore: leave the validation of setHeaderRoute to the plugin when plugins is not empty. (#2898) chore: leave the validation of setHeaderRoute to the plugin if plugins not empty. Signed-off-by: Liming Liu Co-authored-by: Ubuntu --- pkg/apis/rollouts/validation/validation.go | 2 +- .../rollouts/validation/validation_test.go | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 210aed25ac..066c13038a 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -304,7 +304,7 @@ func ValidateRolloutStrategyCanary(rollout *v1alpha1.Rollout, fldPath *field.Pat if step.SetHeaderRoute != nil { trafficRouting := rollout.Spec.Strategy.Canary.TrafficRouting - if trafficRouting == nil || (trafficRouting.Istio == nil && trafficRouting.ALB == nil && trafficRouting.Apisix == nil) { + if trafficRouting == nil || (trafficRouting.Istio == nil && trafficRouting.ALB == nil && trafficRouting.Apisix == nil && len(trafficRouting.Plugins) == 0) { allErrs = append(allErrs, field.Invalid(stepFldPath.Child("setHeaderRoute"), step.SetHeaderRoute, InvalidSetHeaderRouteTrafficPolicy)) } else if step.SetHeaderRoute.Match != nil && len(step.SetHeaderRoute.Match) > 0 { for j, match := range step.SetHeaderRoute.Match { diff --git a/pkg/apis/rollouts/validation/validation_test.go b/pkg/apis/rollouts/validation/validation_test.go index 9722d0d093..58a4571ae7 100644 --- a/pkg/apis/rollouts/validation/validation_test.go +++ b/pkg/apis/rollouts/validation/validation_test.go @@ -1,6 +1,7 @@ package validation import ( + "encoding/json" "fmt" "testing" @@ -305,6 +306,42 @@ func TestValidateRolloutStrategyCanarySetHeaderRoute(t *testing.T) { }) } +func TestValidateRolloutStrategyCanarySetHeaderRoutePlugins(t *testing.T) { + ro := &v1alpha1.Rollout{} + ro.Spec.Strategy.Canary = &v1alpha1.CanaryStrategy{ + CanaryService: "canary", + StableService: "stable", + } + + t.Run("using SetHeaderRoute step with plugins", func(t *testing.T) { + invalidRo := ro.DeepCopy() + routeName := "test" + invalidRo.Spec.Strategy.Canary.Steps = []v1alpha1.CanaryStep{{ + SetHeaderRoute: &v1alpha1.SetHeaderRoute{ + Name: routeName, + Match: []v1alpha1.HeaderRoutingMatch{ + { + HeaderName: "agent", + HeaderValue: &v1alpha1.StringMatch{Exact: "chrome"}, + }, + }, + }, + }} + invalidRo.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + ManagedRoutes: []v1alpha1.MangedRoutes{ + { + Name: routeName, + }, + }, + Plugins: map[string]json.RawMessage{ + "anyplugin": []byte(`{"key": "value"}`), + }, + } + allErrs := ValidateRolloutStrategyCanary(invalidRo, field.NewPath("")) + assert.Equal(t, 0, len(allErrs)) + }) +} + func TestValidateRolloutStrategyCanarySetHeaderRouteIstio(t *testing.T) { ro := &v1alpha1.Rollout{} ro.Spec.Strategy.Canary = &v1alpha1.CanaryStrategy{ From 54d83d676b10d8246766bdbd5d407c0d39e3d9d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Dec 2023 16:45:09 +0000 Subject: [PATCH 136/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.25.12 to 1.26.0 (#3236) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.25.12 to 1.26.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.25.12...config/v1.26.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index c38c009961..b654c3da83 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 - github.com/aws/aws-sdk-go-v2/config v1.25.12 + github.com/aws/aws-sdk-go-v2/config v1.26.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 github.com/blang/semver v3.5.1+incompatible @@ -77,17 +77,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.10 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.11 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.4 // indirect github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 7129bd77a9..0be6fd1676 100644 --- a/go.sum +++ b/go.sum @@ -93,12 +93,12 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.25.12 h1:mF4cMuNh/2G+d19nWnm1vJ/ak0qK6SbqF0KtSX9pxu0= -github.com/aws/aws-sdk-go-v2/config v1.25.12/go.mod h1:lOvvqtZP9p29GIjOTuA/76HiVk0c/s8qRcFRq2+E2uc= -github.com/aws/aws-sdk-go-v2/credentials v1.16.10 h1:VmRkuoKaGl2ZDNGkkRQgw80Hxj1Bb9a+bsT5shqlCwo= -github.com/aws/aws-sdk-go-v2/credentials v1.16.10/go.mod h1:WEn22lpd50buTs/TDqywytW5xQ2zPOMbYipIlqI6xXg= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 h1:FZVFahMyZle6WcogZCOxo6D/lkDA2lqKIn4/ueUmVXw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9/go.mod h1:kjq7REMIkxdtcEC9/4BVXjOsNY5isz6jQbEgk6osRTU= +github.com/aws/aws-sdk-go-v2/config v1.26.0 h1:uItWWbD/FmHPGSa6GJFyZJD/RPakVjS0fmoq1vccjNw= +github.com/aws/aws-sdk-go-v2/config v1.26.0/go.mod h1:8Rf77VTcX9MMkoMIsCnuwmef+Y1bs2Zhvw9IXHdD/Po= +github.com/aws/aws-sdk-go-v2/credentials v1.16.11 h1:Gcut3tJSU7F/C5W/NnFimqnJqljF58rmaw7QlbigN3U= +github.com/aws/aws-sdk-go-v2/credentials v1.16.11/go.mod h1:CysUbSCfqvEbEQTd9Ubg2RrJy2EFM+AUHJOqqj0guTo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4= @@ -111,18 +111,18 @@ github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 h1:gnbvANwxZdFG0rd+0SPwJ github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 h1:bSjDWRQTcUorD6q0oTUmzrXOmWkTveezefwpP9wArxA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 h1:e3PCNeEaev/ZF01cQyNZgmYE9oYYePIMJs2mWSKG514= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3/go.mod h1:gIeeNyaL8tIEqZrzAnTeyhHcE0yysCtcaP+N9kxLZ+E= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 h1:EamsKe+ZjkOQjDdHd86/JCEucjFKQ9T0atWKO4s2Lgs= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8/go.mod h1:Q0vV3/csTpbkfKLI5Sb56cJQTCTtJ0ixdb7P+Wedqiw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.3 h1:wKspi1zc2ZVcgZEu3k2Mt4zGKQSoZTftsoUTLsYPcVo= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.3/go.mod h1:zxk6y1X2KXThESWMS5CrKRvISD8mbIMab6nZrCGxDG0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3 h1:CxAHBS0BWSUqI7qzXHc2ZpTeHaM9JNnWJ9BN6Kmo2CY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.3/go.mod h1:7Lt5mjQ8x5rVdKqg+sKKDeuwoszDJIIPmkd8BVsEdS0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.3 h1:KfREzajmHCSYjCaMRtdLr9boUMA7KPpoPApitPlbNeo= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.3/go.mod h1:7Ld9eTqocTvJqqJ5K/orbSDwmGcpRdlDiLjz2DO+SL8= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.4 h1:2UVO4N/polvKeP+yCA8TLEmidEKxmNTeVpsZnj/bbgA= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.4/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4 h1:3JXkQ1F5n73qTpSPas6AQ8/6HFksgnB24JlNPLt3SlM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.4 h1:gaRFldXhoT36jVMfQ+AjAYwSfjO5LMgy1u0ObcKFhhc= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.4/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 31d19dd2d72f887df904a7bbc79b379643a2e93b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:51:44 -0600 Subject: [PATCH 137/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.31.4 to 1.32.0 (#3239) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.31.4 to 1.32.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.32.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/athena/v1.31.4...service/s3/v1.32.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b654c3da83..a1c5110048 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.26.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 0be6fd1676..e5cc5e14cb 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrw github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4 h1:gnbvANwxZdFG0rd+0SPwJxcwVUdoO9FnKBOk26spse8= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.31.4/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 h1:f426fLs4hcrLuczLBqWf1Ob6FKJhISaR4e9Iw3Scr5A= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 h1:bSjDWRQTcUorD6q0oTUmzrXOmWkTveezefwpP9wArxA= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= From 0300af1a5047100d59c7495b7cacc4c1d12571a8 Mon Sep 17 00:00:00 2001 From: Oleksandr Saulyak Date: Mon, 11 Dec 2023 16:25:15 +0200 Subject: [PATCH 138/264] fix: canary step analysis run wasn't terminated as keep running after promote action being called. Fixes #3220 (#3221) * fix: canary step analysis run wasn't terminated as keep running after promote action being called Signed-off-by: oleksandr-codefresh * fix unit test: added test case for canary step analysis run wasn't terminated as keep running after promote action being called Signed-off-by: oleksandr-codefresh --------- Signed-off-by: oleksandr-codefresh Co-authored-by: pasha-codefresh --- rollout/analysis.go | 5 ++- rollout/analysis_test.go | 78 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/rollout/analysis.go b/rollout/analysis.go index b2528aaf3b..49583287f6 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -372,7 +372,10 @@ func (c *rolloutContext) reconcileStepBasedAnalysisRun() (*v1alpha1.AnalysisRun, return currentAr, nil } - if step == nil || step.Analysis == nil || index == nil { + // for promotion cases + analysisRunFromPreviousStep := step != nil && step.Analysis != nil && currentAr != nil && currentAr.GetLabels()[v1alpha1.RolloutCanaryStepIndexLabel] != strconv.Itoa(int(*index)) + + if step == nil || step.Analysis == nil || index == nil || analysisRunFromPreviousStep { err := c.cancelAnalysisRuns([]*v1alpha1.AnalysisRun{currentAr}) return nil, err } diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index de9a5e1db3..624134fbb6 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -614,6 +614,84 @@ func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } +func TestCreateAnalysisRunOnPromotedAnalysisStepIfPreviousStepWasAnalysisToo(t *testing.T) { + f := newFixture(t) + defer f.Close() + + at := analysisTemplate("bar") + steps := []v1alpha1.CanaryStep{{ + Analysis: &v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.RolloutAnalysisTemplate{ + { + TemplateName: at.Name, + }, + }, + }, + }, { + Analysis: &v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.RolloutAnalysisTemplate{ + { + TemplateName: at.Name, + }, + }, + }, + }} + + r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r2 := bumpVersion(r1) + ar0Step := analysisRun(at, v1alpha1.RolloutTypeStepLabel, r2) + ar0Step.Status.Phase = v1alpha1.AnalysisPhaseRunning + + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 0, 0) + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + //rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 1, 0, 1, false) + progressingCondition, _ := newProgressingCondition(conditions.ReplicaSetUpdatedReason, rs2, "") + conditions.SetRolloutCondition(&r2.Status, progressingCondition) + availableCondition, _ := newAvailableCondition(true) + conditions.SetRolloutCondition(&r2.Status, availableCondition) + completedCondition, _ := newCompletedCondition(false) + conditions.SetRolloutCondition(&r2.Status, completedCondition) + r2.Status.Canary.CurrentStepAnalysisRunStatus = &v1alpha1.RolloutAnalysisRunStatus{ + Name: ar0Step.Name, + Status: "", + } + + f.rolloutLister = append(f.rolloutLister, r2) + f.analysisTemplateLister = append(f.analysisTemplateLister, at) + f.analysisRunLister = append(f.analysisRunLister, ar0Step) + f.objects = append(f.objects, r2, at, ar0Step) + + patchOldAnalysisIndex := f.expectPatchAnalysisRunAction(ar0Step) + //createdIndex := f.expectCreateAnalysisRunAction(ar0Step) + index := f.expectPatchRolloutAction(r2) + + // simulate promote action + r2.Status.CurrentStepIndex = pointer.Int32Ptr(1) + + f.run(getKey(r2, t)) + + assert.True(t, f.verifyPatchedAnalysisRun(patchOldAnalysisIndex, ar0Step)) + // should terminate analysis run for old step + patchedOldAr := f.getPatchedAnalysisRun(patchOldAnalysisIndex) + assert.True(t, patchedOldAr.Spec.Terminate) + + // should patch rollout with relevant currentStepAnalysisRun + patch := f.getPatchedRollout(index) + expectedPatch := `{ + "status": { + "canary": { + "currentStepAnalysisRunStatus":null + } + } + }` + assert.JSONEq(t, calculatePatch(r2, expectedPatch), patch) +} + func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { f := newFixture(t) defer f.Close() From 88cc9d2a0a70f742d67a21f20fa95043de9099fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 14:46:58 +0000 Subject: [PATCH 139/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.4 to 1.26.5 (#3240) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.4 to 1.26.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.26.5/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.4...service/s3/v1.26.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a1c5110048..50c318e5f2 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.26.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index e5cc5e14cb..3ce23ffcb3 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 h1:f426fLs4hcrLuczLBqWf1Ob6FKJhISaR4e9Iw3Scr5A= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4 h1:bSjDWRQTcUorD6q0oTUmzrXOmWkTveezefwpP9wArxA= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.4/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 h1:AKlGBk57mRssGQmWqV3I/azLW1Sb7RnlYbJEqTlpKEY= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= From 22afc4bc23ba4d2c48fba17386e834f333cb0b6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:20:26 +0000 Subject: [PATCH 140/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.0 to 1.26.1 (#3241) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.0 to 1.26.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.0...config/v1.26.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 50c318e5f2..5f002ff9f3 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 - github.com/aws/aws-sdk-go-v2/config v1.26.0 + github.com/aws/aws-sdk-go-v2/config v1.26.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 github.com/blang/semver v3.5.1+incompatible @@ -77,17 +77,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.11 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.12 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.4 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 // indirect github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 3ce23ffcb3..cd30bf41e4 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.0 h1:uItWWbD/FmHPGSa6GJFyZJD/RPakVjS0fmoq1vccjNw= -github.com/aws/aws-sdk-go-v2/config v1.26.0/go.mod h1:8Rf77VTcX9MMkoMIsCnuwmef+Y1bs2Zhvw9IXHdD/Po= -github.com/aws/aws-sdk-go-v2/credentials v1.16.11 h1:Gcut3tJSU7F/C5W/NnFimqnJqljF58rmaw7QlbigN3U= -github.com/aws/aws-sdk-go-v2/credentials v1.16.11/go.mod h1:CysUbSCfqvEbEQTd9Ubg2RrJy2EFM+AUHJOqqj0guTo= +github.com/aws/aws-sdk-go-v2/config v1.26.1 h1:z6DqMxclFGL3Zfo+4Q0rLnAZ6yVkzCRxhRMsiRQnD1o= +github.com/aws/aws-sdk-go-v2/config v1.26.1/go.mod h1:ZB+CuKHRbb5v5F0oJtGdhFTelmrxd4iWO1lf0rQwSAg= +github.com/aws/aws-sdk-go-v2/credentials v1.16.12 h1:v/WgB8NxprNvr5inKIiVVrXPuuTegM+K8nncFkr1usU= +github.com/aws/aws-sdk-go-v2/credentials v1.16.12/go.mod h1:X21k0FjEJe+/pauud82HYiQbEr9jRKY3kXEIQ4hXeTQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= @@ -105,8 +105,8 @@ github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VD github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 h1:f426fLs4hcrLuczLBqWf1Ob6FKJhISaR4e9Iw3Scr5A= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 h1:AKlGBk57mRssGQmWqV3I/azLW1Sb7RnlYbJEqTlpKEY= @@ -117,12 +117,12 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.4 h1:2UVO4N/polvKeP+yCA8TLEmidEKxmNTeVpsZnj/bbgA= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.4/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4 h1:3JXkQ1F5n73qTpSPas6AQ8/6HFksgnB24JlNPLt3SlM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.4/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.4 h1:gaRFldXhoT36jVMfQ+AjAYwSfjO5LMgy1u0ObcKFhhc= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.4/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 h1:ldSFWz9tEHAwHNmjx2Cvy1MjP5/L9kNoR0skc6wyOOM= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.5/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 h1:2k9KmFawS63euAkY4/ixVNsYYwrwnd5fIvgEKkfZFNM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 h1:5UYvv8JUvllZsRnfrcMQ+hJ9jNICmcgKPAO1CER25Wg= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.5/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From 98f0e3a70021c6f4e55a822c71eb5bf85b3ea8f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:43:11 -0600 Subject: [PATCH 141/264] chore(deps): bump google.golang.org/grpc from 1.59.0 to 1.60.0 (#3246) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.59.0 to 1.60.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.59.0...v1.60.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 5f002ff9f3..b9ba1cef58 100644 --- a/go.mod +++ b/go.mod @@ -37,8 +37,8 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.15.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.59.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 + google.golang.org/grpc v1.60.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 @@ -184,9 +184,9 @@ require ( gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.132.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index cd30bf41e4..ae13e2c144 100644 --- a/go.sum +++ b/go.sum @@ -817,7 +817,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1004,8 +1004,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1037,12 +1038,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1060,8 +1061,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= +google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From e71a42c665f4c6b4946272d17805c23addc5d1e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:43:37 -0600 Subject: [PATCH 142/264] chore(deps): bump sigstore/cosign-installer from 3.2.0 to 3.3.0 (#3245) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/1fc5bd396d372bee37d608f955b336615edf79c8...9614fae9e5c5eddabb09f90a270fcb487c9f7149) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index de25b6fbee..110f1ff159 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@1fc5bd396d372bee37d608f955b336615edf79c8 # v3.2.0 + uses: sigstore/cosign-installer@9614fae9e5c5eddabb09f90a270fcb487c9f7149 # v3.3.0 with: cosign-release: 'v2.2.0' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a128541f04..ed68865e82 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,7 +170,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@1fc5bd396d372bee37d608f955b336615edf79c8 # v3.2.0 + uses: sigstore/cosign-installer@9614fae9e5c5eddabb09f90a270fcb487c9f7149 # v3.3.0 with: cosign-release: 'v2.2.0' From 3a257e3740312fc826606d2fd408beb51f7900cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:45:41 -0600 Subject: [PATCH 143/264] docs: Update Changelog (#3244) * update changelog * Update CHANGELOG.md --------- Co-authored-by: zachaller --- CHANGELOG.md | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2756ab2b8..5023a1e9c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,244 @@ * rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) + +## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) + +### Fix + +* Revert "fix: istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126))" ([#3147](https://github.com/argoproj/argo-rollouts/issues/3147)) + + + +## [v1.6.1](https://github.com/argoproj/argo-rollouts/compare/v1.6.0...v1.6.1) (2023-11-01) + +### Chore + +* upgrade cosign ([#3139](https://github.com/argoproj/argo-rollouts/issues/3139)) +* add missing rollout fields ([#3062](https://github.com/argoproj/argo-rollouts/issues/3062)) +* change file name for readthedocs compatibility ([#2999](https://github.com/argoproj/argo-rollouts/issues/2999)) + +### Fix + +* istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126)) +* docs require build.os to be defined ([#3133](https://github.com/argoproj/argo-rollouts/issues/3133)) +* inopportune scaling events would lose some status fields ([#3060](https://github.com/argoproj/argo-rollouts/issues/3060)) +* rollback to stable with dynamicStableScale could overwhelm stable pods ([#3077](https://github.com/argoproj/argo-rollouts/issues/3077)) +* prevent hot loop when fully promoted rollout is aborted ([#3064](https://github.com/argoproj/argo-rollouts/issues/3064)) +* keep rs informer updated ([#3091](https://github.com/argoproj/argo-rollouts/issues/3091)) +* bump notification-engine to fix double send on self server notifications ([#3095](https://github.com/argoproj/argo-rollouts/issues/3095)) +* sync notification controller configmaps/secrets first ([#3075](https://github.com/argoproj/argo-rollouts/issues/3075)) +* missing notification on error ([#3076](https://github.com/argoproj/argo-rollouts/issues/3076)) + + + +## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) + +### Chore + +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 ([#2950](https://github.com/argoproj/argo-rollouts/issues/2950)) +* **deps:** bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 ([#2951](https://github.com/argoproj/argo-rollouts/issues/2951)) + +### Docs + +* update supported k8s version ([#2949](https://github.com/argoproj/argo-rollouts/issues/2949)) + +### Fix + +* analysis step should be ignored after promote ([#3016](https://github.com/argoproj/argo-rollouts/issues/3016)) +* **controller:** rollback should skip all steps to active rs within RollbackWindow ([#2953](https://github.com/argoproj/argo-rollouts/issues/2953)) +* **controller:** typo fix ("Secrete" -> "Secret") in secret informer ([#2965](https://github.com/argoproj/argo-rollouts/issues/2965)) + + + +## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) + +### Chore + +* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) +* bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) +* Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) +* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) +* add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) +* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) +* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) +* Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) +* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) +* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) +* **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) +* **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 ([#2884](https://github.com/argoproj/argo-rollouts/issues/2884)) +* **deps:** bump docker/setup-qemu-action from 2.1.0 to 2.2.0 ([#2878](https://github.com/argoproj/argo-rollouts/issues/2878)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 ([#2883](https://github.com/argoproj/argo-rollouts/issues/2883)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 ([#2880](https://github.com/argoproj/argo-rollouts/issues/2880)) +* **deps:** bump actions/setup-go from 4.0.0 to 4.0.1 ([#2881](https://github.com/argoproj/argo-rollouts/issues/2881)) +* **deps:** bump docker/setup-buildx-action from 2.5.0 to 2.9.1 ([#2879](https://github.com/argoproj/argo-rollouts/issues/2879)) +* **deps:** bump docker/login-action from 2.1.0 to 2.2.0 ([#2877](https://github.com/argoproj/argo-rollouts/issues/2877)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 ([#2886](https://github.com/argoproj/argo-rollouts/issues/2886)) +* **deps:** bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 ([#2882](https://github.com/argoproj/argo-rollouts/issues/2882)) +* **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) +* **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) +* **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) +* **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) +* **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) +* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) +* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) +* **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) +* **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) +* **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) +* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) +* **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) +* **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) +* **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) +* **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) +* **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) +* **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 ([#2708](https://github.com/argoproj/argo-rollouts/issues/2708)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 ([#2710](https://github.com/argoproj/argo-rollouts/issues/2710)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 ([#2705](https://github.com/argoproj/argo-rollouts/issues/2705)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 ([#2704](https://github.com/argoproj/argo-rollouts/issues/2704)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 ([#2703](https://github.com/argoproj/argo-rollouts/issues/2703)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 ([#2702](https://github.com/argoproj/argo-rollouts/issues/2702)) +* **deps:** bump peter-evans/create-pull-request from 4 to 5 ([#2697](https://github.com/argoproj/argo-rollouts/issues/2697)) +* **deps:** bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#2698](https://github.com/argoproj/argo-rollouts/issues/2698)) +* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 ([#2684](https://github.com/argoproj/argo-rollouts/issues/2684)) + +### Ci + +* generate attestations during a release ([#2785](https://github.com/argoproj/argo-rollouts/issues/2785)) +* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) + +### Docs + +* mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) +* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) +* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) +* Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) +* Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) +* support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) +* Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) +* Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) +* use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) +* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) +* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) +* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) +* Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) +* Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) +* Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) +* Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) +* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) +* Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) +* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) +* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) +* **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) +* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) +* **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) + +### Feat + +* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) +* enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) +* support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) +* Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) +* Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) +* Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) +* add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) +* retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) +* **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) +* **controller:** Add custom metadata support for AnalysisRun. Fixes [#2740](https://github.com/argoproj/argo-rollouts/issues/2740) ([#2743](https://github.com/argoproj/argo-rollouts/issues/2743)) +* **dashboard:** Refresh Rollouts dashboard UI ([#2723](https://github.com/argoproj/argo-rollouts/issues/2723)) +* **metricprovider:** allow user to define metrics.provider.job.metadata ([#2762](https://github.com/argoproj/argo-rollouts/issues/2762)) + +### Fix + +* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) +* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) +* rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) +* get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) +* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) +* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) +* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) +* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) +* add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) +* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) +* **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) +* **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) +* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) +* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) +* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) +* **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) + +### Refactor + +* change plugin naming pattern [#2720](https://github.com/argoproj/argo-rollouts/issues/2720) ([#2722](https://github.com/argoproj/argo-rollouts/issues/2722)) + +### BREAKING CHANGE + + +The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. + +Remove name label from k8s some client metrics + +The `name` label in the `controller_clientset_k8s_request_total` metric +produce an excessive amount of cardinality for `events` and `replicasets`. +This can lead to hundreds of thousands of unique metrics over a couple +weeks in a large deployment. Set the name to "N/A" for these client request +types. + + + +## [v1.6.4](https://github.com/argoproj/argo-rollouts/compare/v1.6.3...v1.6.4) (2023-12-08) + +### Fix + +* make sure we use the updated rs when we write back to informer ([#3237](https://github.com/argoproj/argo-rollouts/issues/3237)) +* conflict on updates to replicaset revision ([#3216](https://github.com/argoproj/argo-rollouts/issues/3216)) + + + +## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) + +### Build + +* **deps:** always resolve momentjs version 2.29.4 ([#3182](https://github.com/argoproj/argo-rollouts/issues/3182)) + +### Fix + +* rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) + ## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) From 0eff316b85296ffcaae6306a91d4b7db78f63a86 Mon Sep 17 00:00:00 2001 From: emily-blixt-ck <135056947+emily-blixt-ck@users.noreply.github.com> Date: Mon, 18 Dec 2023 06:54:12 -0800 Subject: [PATCH 144/264] feat: add analysis modal (#3174) * reset branch Signed-off-by: Emily * update tsconfig and moment imports Signed-off-by: Emily * rename component for clarity Signed-off-by: Emily * fix moment imports Signed-off-by: Zach Aller * bring in ticker from argo-ui Signed-off-by: Emily --------- Signed-off-by: Emily Signed-off-by: Zach Aller Co-authored-by: Zach Aller --- ui/jest.config.js | 8 + ui/package.json | 7 +- .../analysis-modal/analysis-modal.tsx | 81 + .../components/analysis-modal/constants.ts | 15 + .../criteria-list/criteria-list.scss | 19 + .../criteria-list/criteria-list.tsx | 116 ++ .../analysis-modal/header/header.scss | 7 + .../analysis-modal/header/header.tsx | 38 + .../analysis-modal/legend/legend.tsx | 44 + .../metric-chart/metric-chart.scss | 79 + .../metric-chart/metric-chart.tsx | 161 ++ .../metric-label/metric-label.scss | 9 + .../metric-label/metric-label.tsx | 28 + .../metric-table/metric-table.scss | 32 + .../metric-table/metric-table.tsx | 66 + .../analysis-modal/panels/index.tsx | 2 + .../analysis-modal/panels/metric-panel.tsx | 137 ++ .../analysis-modal/panels/styles.scss | 61 + .../analysis-modal/panels/summary-panel.tsx | 73 + .../analysis-modal/query-box/query-box.scss | 50 + .../analysis-modal/query-box/query-box.tsx | 42 + .../status-indicator/status-indicator.scss | 84 + .../status-indicator/status-indicator.tsx | 26 + .../app/components/analysis-modal/styles.scss | 8 + .../analysis-modal/theme/theme.scss | 35 + .../analysis-modal/transforms.test.ts | 548 ++++++ .../components/analysis-modal/transforms.ts | 648 +++++++ ui/src/app/components/analysis-modal/types.ts | 70 + ui/src/app/components/pods/pods.tsx | 92 +- ui/src/app/components/rollout/revision.tsx | 264 +-- ui/src/app/components/rollout/rollout.tsx | 1 - ui/src/app/components/ticker/ticker.tsx | 40 + ui/src/config/theme.ts | 27 +- ui/tsconfig.json | 3 +- ui/yarn.lock | 1557 ++++++++++++++++- 35 files changed, 4189 insertions(+), 289 deletions(-) create mode 100644 ui/jest.config.js create mode 100644 ui/src/app/components/analysis-modal/analysis-modal.tsx create mode 100644 ui/src/app/components/analysis-modal/constants.ts create mode 100644 ui/src/app/components/analysis-modal/criteria-list/criteria-list.scss create mode 100644 ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx create mode 100644 ui/src/app/components/analysis-modal/header/header.scss create mode 100644 ui/src/app/components/analysis-modal/header/header.tsx create mode 100644 ui/src/app/components/analysis-modal/legend/legend.tsx create mode 100644 ui/src/app/components/analysis-modal/metric-chart/metric-chart.scss create mode 100644 ui/src/app/components/analysis-modal/metric-chart/metric-chart.tsx create mode 100644 ui/src/app/components/analysis-modal/metric-label/metric-label.scss create mode 100644 ui/src/app/components/analysis-modal/metric-label/metric-label.tsx create mode 100644 ui/src/app/components/analysis-modal/metric-table/metric-table.scss create mode 100644 ui/src/app/components/analysis-modal/metric-table/metric-table.tsx create mode 100644 ui/src/app/components/analysis-modal/panels/index.tsx create mode 100644 ui/src/app/components/analysis-modal/panels/metric-panel.tsx create mode 100644 ui/src/app/components/analysis-modal/panels/styles.scss create mode 100644 ui/src/app/components/analysis-modal/panels/summary-panel.tsx create mode 100644 ui/src/app/components/analysis-modal/query-box/query-box.scss create mode 100644 ui/src/app/components/analysis-modal/query-box/query-box.tsx create mode 100644 ui/src/app/components/analysis-modal/status-indicator/status-indicator.scss create mode 100644 ui/src/app/components/analysis-modal/status-indicator/status-indicator.tsx create mode 100644 ui/src/app/components/analysis-modal/styles.scss create mode 100644 ui/src/app/components/analysis-modal/theme/theme.scss create mode 100644 ui/src/app/components/analysis-modal/transforms.test.ts create mode 100644 ui/src/app/components/analysis-modal/transforms.ts create mode 100644 ui/src/app/components/analysis-modal/types.ts create mode 100644 ui/src/app/components/ticker/ticker.tsx diff --git a/ui/jest.config.js b/ui/jest.config.js new file mode 100644 index 0000000000..7548de4101 --- /dev/null +++ b/ui/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + roots: ['/src'], + testMatch: ['**/?(*.)+(spec|test).+(ts|tsx|js)'], + transform: { + '^.+\\.(ts|tsx)$': 'ts-jest', + }, + modulePathIgnorePatterns: ['generated'], +}; diff --git a/ui/package.json b/ui/package.json index 10623345ea..69eb7872cd 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,6 +20,7 @@ "react-hot-loader": "^3.1.3", "react-keyhooks": "^0.2.3", "react-router-dom": "5.2.0", + "recharts": "^2.9.0", "rxjs": "^6.6.6", "typescript": "^5.0.4", "web-vitals": "^1.0.1" @@ -27,7 +28,7 @@ "scripts": { "start": "NODE_OPTIONS=--openssl-legacy-provider webpack serve --config ./src/app/webpack.dev.js", "build": "rm -rf dist && NODE_OPTIONS=--openssl-legacy-provider webpack --config ./src/app/webpack.prod.js", - "test": "react-scripts test", + "test": "jest", "eject": "react-scripts eject", "protogen": "../hack/swagger-codegen.sh generate -i ../pkg/apiclient/rollout/rollout.swagger.json -l typescript-fetch -o src/models/rollout/generated" }, @@ -54,7 +55,7 @@ "@testing-library/react": "^11.1.0", "@testing-library/user-event": "^12.1.10", "@types/classnames": "2.2.9", - "@types/jest": "^26.0.15", + "@types/jest": "^29.5.10", "@types/node": "^12.0.0", "@types/react": "^16.9.3", "@types/react-dom": "^16.9.3", @@ -64,10 +65,12 @@ "@types/uuid": "^9.0.3", "@types/react-autocomplete": "^1.8.4", "copy-webpack-plugin": "^6.3.2", + "jest": "^29.7.0", "mini-css-extract-plugin": "^1.3.9", "raw-loader": "^4.0.2", "react-scripts": "4.0.3", "sass": "^1.32.8", + "ts-jest": "^29.1.1", "ts-loader": "^8.0.17", "webpack-bundle-analyzer": "^4.4.0", "webpack-cli": "^4.5.0", diff --git a/ui/src/app/components/analysis-modal/analysis-modal.tsx b/ui/src/app/components/analysis-modal/analysis-modal.tsx new file mode 100644 index 0000000000..e5394995da --- /dev/null +++ b/ui/src/app/components/analysis-modal/analysis-modal.tsx @@ -0,0 +1,81 @@ +import * as React from 'react'; +import {Modal, Tabs} from 'antd'; +import {RolloutAnalysisRunInfo} from '../../../models/rollout/generated'; + +import MetricLabel from './metric-label/metric-label'; +import {MetricPanel, SummaryPanel} from './panels'; +import {analysisEndTime, analysisStartTime, getAdjustedMetricPhase, metricStatusLabel, metricSubstatus, transformMetrics} from './transforms'; +import {AnalysisStatus} from './types'; + +import classNames from 'classnames'; +import './styles.scss'; + +const cx = classNames; + +interface AnalysisModalProps { + analysis: RolloutAnalysisRunInfo; + analysisName: string; + images: string[]; + onClose: () => void; + open: boolean; + revision: string; +} + +export const AnalysisModal = ({analysis, analysisName, images, onClose, open, revision}: AnalysisModalProps) => { + const analysisResults = analysis.specAndStatus?.status; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const analysisStart = analysisStartTime(analysis.objectMeta?.creationTimestamp); + const analysisEnd = analysisEndTime(analysisResults?.metricResults ?? []); + + const analysisSubstatus = metricSubstatus( + (analysisResults?.phase ?? AnalysisStatus.Unknown) as AnalysisStatus, + analysisResults?.runSummary.failed ?? 0, + analysisResults?.runSummary.error ?? 0, + analysisResults?.runSummary.inconclusive ?? 0 + ); + const transformedMetrics = transformMetrics(analysis.specAndStatus); + + const adjustedAnalysisStatus = getAdjustedMetricPhase(analysis.status as AnalysisStatus); + + const tabItems = [ + { + label: , + key: 'analysis-summary', + children: ( + + ), + }, + ...Object.values(transformedMetrics) + .sort((a, b) => a.name.localeCompare(b.name)) + .map((metric) => ({ + label: , + key: metric.name, + children: ( + + ), + })), + ]; + + return ( + + + + ); +}; diff --git a/ui/src/app/components/analysis-modal/constants.ts b/ui/src/app/components/analysis-modal/constants.ts new file mode 100644 index 0000000000..c1a35ce0d5 --- /dev/null +++ b/ui/src/app/components/analysis-modal/constants.ts @@ -0,0 +1,15 @@ +import {AnalysisStatus, FunctionalStatus} from './types'; + +export const METRIC_FAILURE_LIMIT_DEFAULT = 0; +export const METRIC_INCONCLUSIVE_LIMIT_DEFAULT = 0; +export const METRIC_CONSECUTIVE_ERROR_LIMIT_DEFAULT = 4; + +export const ANALYSIS_STATUS_THEME_MAP: {[key in AnalysisStatus]: string} = { + Successful: FunctionalStatus.SUCCESS, + Error: FunctionalStatus.WARNING, + Failed: FunctionalStatus.ERROR, + Running: FunctionalStatus.IN_PROGRESS, + Pending: FunctionalStatus.INACTIVE, + Inconclusive: FunctionalStatus.WARNING, + Unknown: FunctionalStatus.INACTIVE, // added by frontend +}; diff --git a/ui/src/app/components/analysis-modal/criteria-list/criteria-list.scss b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.scss new file mode 100644 index 0000000000..8427680d0c --- /dev/null +++ b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.scss @@ -0,0 +1,19 @@ +@import '../theme/theme.scss'; + +.criteria-list { + margin: 0; + padding-left: 0; + list-style-type: none; +} + +.icon-pass { + color: $success-foreground; +} + +.icon-fail { + color: $error-foreground; +} + +.icon-pending { + color: $in-progress-foreground; +} diff --git a/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx new file mode 100644 index 0000000000..51247b6d22 --- /dev/null +++ b/ui/src/app/components/analysis-modal/criteria-list/criteria-list.tsx @@ -0,0 +1,116 @@ +import * as React from 'react'; +import {Space, Typography} from 'antd'; + +import {AnalysisStatus} from '../types'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; + +import {faCheck, faRotateRight, faXmark} from '@fortawesome/free-solid-svg-icons'; + +import classNames from 'classnames'; +import './criteria-list.scss'; + +const {Text} = Typography; + +enum CriterionStatus { + Fail = 'FAIL', + Pass = 'PASS', + InProgress = 'IN_PROGRESS', + Pending = 'PENDING', +} + +const defaultCriterionStatus = (analysisStatus: AnalysisStatus) => (analysisStatus === AnalysisStatus.Pending ? CriterionStatus.Pending : CriterionStatus.InProgress); + +const criterionLabel = (measurementLabel: string, maxAllowed: number) => (maxAllowed === 0 ? `No ${measurementLabel}.` : `Fewer than ${maxAllowed + 1} ${measurementLabel}.`); + +interface CriteriaListItemProps { + children: React.ReactNode; + showIcon: boolean; + status: CriterionStatus; +} + +const CriteriaListItem = ({children, showIcon, status}: CriteriaListItemProps) => { + let StatusIcon: React.ReactNode | null = null; + switch (status) { + case CriterionStatus.Fail: { + StatusIcon = ; + break; + } + case CriterionStatus.Pass: { + StatusIcon = ; + break; + } + case CriterionStatus.InProgress: { + StatusIcon = ; + break; + } + case CriterionStatus.Pending: + default: { + break; + } + } + + return ( +
  • + + {showIcon && <>{StatusIcon}} + {children} + +
  • + ); +}; + +interface CriteriaListProps { + analysisStatus: AnalysisStatus; + className?: string[] | string; + consecutiveErrors: number; + failures: number; + inconclusives: number; + maxConsecutiveErrors: number; + maxFailures: number; + maxInconclusives: number; + showIcons: boolean; +} + +const CriteriaList = ({ + analysisStatus, + className, + consecutiveErrors, + failures, + inconclusives, + maxConsecutiveErrors, + maxFailures, + maxInconclusives, + showIcons, +}: CriteriaListProps) => { + let failureStatus = defaultCriterionStatus(analysisStatus); + let errorStatus = defaultCriterionStatus(analysisStatus); + let inconclusiveStatus = defaultCriterionStatus(analysisStatus); + + if (analysisStatus !== AnalysisStatus.Pending && analysisStatus !== AnalysisStatus.Running) { + failureStatus = failures <= maxFailures ? CriterionStatus.Pass : CriterionStatus.Fail; + errorStatus = consecutiveErrors <= maxConsecutiveErrors ? CriterionStatus.Pass : CriterionStatus.Fail; + inconclusiveStatus = inconclusives <= maxInconclusives ? CriterionStatus.Pass : CriterionStatus.Fail; + } + + return ( +
      + {maxFailures > -1 && ( + + {criterionLabel('measurement failures', maxFailures)} + + )} + {maxConsecutiveErrors > -1 && ( + + {criterionLabel('consecutive measurement errors', maxConsecutiveErrors)} + + )} + {maxInconclusives > -1 && ( + + {criterionLabel('inconclusive measurements', maxInconclusives)} + + )} +
    + ); +}; + +export default CriteriaList; diff --git a/ui/src/app/components/analysis-modal/header/header.scss b/ui/src/app/components/analysis-modal/header/header.scss new file mode 100644 index 0000000000..36909a0e71 --- /dev/null +++ b/ui/src/app/components/analysis-modal/header/header.scss @@ -0,0 +1,7 @@ +.icon { + font-size: 14px; +} + +h4.title { + margin: 0; // antd override +} diff --git a/ui/src/app/components/analysis-modal/header/header.tsx b/ui/src/app/components/analysis-modal/header/header.tsx new file mode 100644 index 0000000000..e329daeda2 --- /dev/null +++ b/ui/src/app/components/analysis-modal/header/header.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; + +import {Space, Typography} from 'antd'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faMagnifyingGlassChart} from '@fortawesome/free-solid-svg-icons'; + +import StatusIndicator from '../status-indicator/status-indicator'; +import {AnalysisStatus, FunctionalStatus} from '../types'; + +import classNames from 'classnames/bind'; +import './header.scss'; + +const {Text, Title} = Typography; +const cx = classNames; + +interface HeaderProps { + className?: string[] | string; + status: AnalysisStatus; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; + subtitle?: string; + title: string; +} + +const Header = ({className, status, substatus, subtitle, title}: HeaderProps) => ( + + + + +
    + + {title} + + {subtitle && {subtitle}} +
    +
    +); + +export default Header; diff --git a/ui/src/app/components/analysis-modal/legend/legend.tsx b/ui/src/app/components/analysis-modal/legend/legend.tsx new file mode 100644 index 0000000000..e861c8cf75 --- /dev/null +++ b/ui/src/app/components/analysis-modal/legend/legend.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; + +import {Space, Typography} from 'antd'; + +import {AnalysisStatus} from '../types'; +import StatusIndicator from '../status-indicator/status-indicator'; + +import classNames from 'classnames'; + +const {Text} = Typography; + +interface LegendItemProps { + label: string; + status: AnalysisStatus; +} + +const LegendItem = ({label, status}: LegendItemProps) => ( + + + {label} + +); + +const pluralize = (count: number, singular: string, plural: string) => (count === 1 ? singular : plural); + +interface LegendProps { + className?: string[] | string; + errors: number; + failures: number; + inconclusives: number; + successes: number; +} + +const Legend = ({className, errors, failures, inconclusives, successes}: LegendProps) => ( + + + + + {inconclusives > 0 && } + +); + +export default Legend; +export {LegendItem}; diff --git a/ui/src/app/components/analysis-modal/metric-chart/metric-chart.scss b/ui/src/app/components/analysis-modal/metric-chart/metric-chart.scss new file mode 100644 index 0000000000..953b10e06c --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-chart/metric-chart.scss @@ -0,0 +1,79 @@ +@import '../theme/theme.scss'; + +@mixin chartDot($background, $foreground) { + fill: $background; + stroke: $foreground; +} + +.metric-chart svg { + overflow: visible; +} + +.metric-chart-tooltip { + background: white; + max-width: 350px; + padding: 8px; + box-shadow: $shadow-1; +} + +.metric-chart-tooltip-timestamp { + margin-left: 16px; +} + +.metric-chart-tooltip-status { + display: flex; + + > :first-child { + margin: 4px 4px 0 0; + } +} + +.chart-axis text, +.chart-label > tspan { + stroke: $gray-10; + font-size: 11px; + font-family: $font-family-primary; + font-weight: 100; +} + +.dot-ERROR { + @include chartDot($error-background, $error-foreground); +} +.dot-INACTIVE { + @include chartDot($inactive-background, $inactive-foreground); +} +.dot-IN_PROGRESS { + @include chartDot($in-progress-background, $in-progress-foreground); +} +.dot-SUCCESS { + @include chartDot($success-background, $success-foreground); +} +.dot-WARNING { + @include chartDot($warning-background, $warning-foreground); +} + +.chart-line > path { + stroke: $gray-11; +} + +.reference-line { + &.is-ERROR > line { + stroke: $error-foreground; + } + &.is-SUCCESS > line { + stroke: $success-foreground; + } +} + +.reference-area { + > path { + opacity: 0.3; + } + + &.is-ERROR > path { + fill: $error-background; + } + &.is-SUCCESS > path { + fill: $success-background; + } +} diff --git a/ui/src/app/components/analysis-modal/metric-chart/metric-chart.tsx b/ui/src/app/components/analysis-modal/metric-chart/metric-chart.tsx new file mode 100644 index 0000000000..f912acddbf --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-chart/metric-chart.tsx @@ -0,0 +1,161 @@ +// eslint-disable-file @typescript-eslint/ban-ts-comment +import * as React from 'react'; +import * as moment from 'moment'; +import {CartesianGrid, DotProps, Label, Line, LineChart, ReferenceLine, ResponsiveContainer, Tooltip, TooltipProps, XAxis, YAxis} from 'recharts'; +import {NameType, ValueType} from 'recharts/types/component/DefaultTooltipContent'; +import {Typography} from 'antd'; + +import {AnalysisStatus, FunctionalStatus, TransformedMeasurement} from '../types'; +import {ANALYSIS_STATUS_THEME_MAP} from '../constants'; +import {isValidDate} from '../transforms'; + +import StatusIndicator from '../status-indicator/status-indicator'; + +import classNames from 'classnames/bind'; +import './metric-chart.scss'; + +const {Text} = Typography; +const cx = classNames; + +const CHART_HEIGHT = 254; +const X_AXIS_HEIGHT = 45; + +const defaultValueFormatter = (value: number | string | null) => (value === null ? '' : value.toString()); + +const timeTickFormatter = (axisData?: string) => { + if (axisData === undefined || !isValidDate(axisData)) { + return ''; + } + return moment(axisData).format('LT'); +}; + +type MeasurementDotProps = DotProps & { + payload?: { + phase: AnalysisStatus; + startedAt: string; + value: string | null; + }; +}; + +const MeasurementDot = ({cx, cy, payload}: MeasurementDotProps) => ( + +); + +type TooltipContentProps = TooltipProps & { + conditionKeys: string[]; + valueFormatter: (value: number | string | null) => string; +}; + +const TooltipContent = ({active, conditionKeys, payload, valueFormatter}: TooltipContentProps) => { + if (!active || payload?.length === 0 || !payload?.[0].payload) { + return null; + } + + const data = payload[0].payload; + let label; + if (data.phase === AnalysisStatus.Error) { + label = data.message ?? 'Measurement error'; + } else if (conditionKeys.length > 0) { + const sublabels = conditionKeys.map((cKey) => (conditionKeys.length > 1 ? `${valueFormatter(data.chartValue[cKey])} (${cKey})` : valueFormatter(data.chartValue[cKey]))); + label = sublabels.join(' , '); + } else { + label = valueFormatter(data.chartValue); + } + + return ( +
    + + {moment(data.startedAt).format('LTS')} + +
    + + {label} +
    +
    + ); +}; + +interface MetricChartProps { + className?: string[] | string; + conditionKeys: string[]; + data: TransformedMeasurement[]; + failThresholds: number[] | null; + max: number | null; + min: number | null; + successThresholds: number[] | null; + valueFormatter?: (value: number | string | null) => string; + yAxisFormatter?: (value: any, index: number) => string; + yAxisLabel: string; +} + +const MetricChart = ({ + className, + conditionKeys, + data, + failThresholds, + max, + min, + successThresholds, + valueFormatter = defaultValueFormatter, + yAxisFormatter = defaultValueFormatter, + yAxisLabel, +}: MetricChartProps) => { + // show ticks at boundaries of analysis + // @ts-ignore + const startingTick = data[0]?.startedAt ?? ''; + // @ts-ignore + const endingTick = data[data.length - 1]?.finishedAt ?? ''; + const timeTicks: any[] = [startingTick, endingTick]; + + return ( + + + + + + + } filterNull={false} isAnimationActive={true} /> + {failThresholds !== null && ( + <> + {failThresholds.map((threshold) => ( + + ))} + + )} + {successThresholds !== null && ( + <> + {successThresholds.map((threshold) => ( + + ))} + + )} + {conditionKeys.length === 0 ? ( + } + /> + ) : ( + <> + {conditionKeys.map((cKey) => ( + } /> + ))} + + )} + + + ); +}; + +export default MetricChart; diff --git a/ui/src/app/components/analysis-modal/metric-label/metric-label.scss b/ui/src/app/components/analysis-modal/metric-label/metric-label.scss new file mode 100644 index 0000000000..33b0f965fc --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-label/metric-label.scss @@ -0,0 +1,9 @@ +.metric-label { + display: block; + width: 140px; + min-width: 140px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/ui/src/app/components/analysis-modal/metric-label/metric-label.tsx b/ui/src/app/components/analysis-modal/metric-label/metric-label.tsx new file mode 100644 index 0000000000..5725f17cdc --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-label/metric-label.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; + +import {Space} from 'antd'; + +import {AnalysisStatus, FunctionalStatus} from '../types'; +import StatusIndicator from '../status-indicator/status-indicator'; + +import classNames from 'classnames/bind'; +import './metric-label.scss'; + +const cx = classNames; + +interface AnalysisModalProps { + label: string; + status: AnalysisStatus; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; +} + +const MetricLabel = ({label, status, substatus}: AnalysisModalProps) => ( + + + + {label} + + +); + +export default MetricLabel; diff --git a/ui/src/app/components/analysis-modal/metric-table/metric-table.scss b/ui/src/app/components/analysis-modal/metric-table/metric-table.scss new file mode 100644 index 0000000000..69a19025bb --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-table/metric-table.scss @@ -0,0 +1,32 @@ +@import '../theme/theme.scss'; + +.metric-table { + border: 1px solid $gray-4; +} + +.error-message { + font-style: italic; +} + +.condition { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: $space-unit; + font-size: 12px; + + &::before { + content: ''; + display: block; + height: 2px; + width: 12px; + margin-right: $space-unit; + } + + &.is-ERROR::before { + background: $error-foreground; + } + &.is-SUCCESS::before { + background: $success-foreground; + } +} diff --git a/ui/src/app/components/analysis-modal/metric-table/metric-table.tsx b/ui/src/app/components/analysis-modal/metric-table/metric-table.tsx new file mode 100644 index 0000000000..1fdbd1363d --- /dev/null +++ b/ui/src/app/components/analysis-modal/metric-table/metric-table.tsx @@ -0,0 +1,66 @@ +import * as React from 'react'; +import * as moment from 'moment'; +import {Table, Typography} from 'antd'; + +import {AnalysisStatus, TransformedMeasurement, TransformedValueObject} from '../types'; +import StatusIndicator from '../status-indicator/status-indicator'; +import {isValidDate} from '../transforms'; + +import classNames from 'classnames/bind'; +import './metric-table.scss'; + +const {Column} = Table; +const {Text} = Typography; + +const timeColFormatter = (startTime?: string) => (isValidDate(startTime) ? moment(startTime).format('LTS') : ''); + +const isObject = (tValue: TransformedValueObject | number | string | null) => typeof tValue === 'object' && !Array.isArray(tValue) && tValue !== null; + +const columnValueLabel = (value: any, valueKey: string) => (isObject(value) && valueKey in (value as TransformedValueObject) ? (value as TransformedValueObject)[valueKey] : ''); + +interface MetricTableProps { + className?: string[] | string; + conditionKeys: string[]; + data: TransformedMeasurement[]; + failCondition: string | null; + successCondition: string | null; +} + +const MetricTable = ({className, conditionKeys, data, failCondition, successCondition}: MetricTableProps) => ( +
    +
    + } align='center' /> + {conditionKeys.length > 0 ? ( + <> + {conditionKeys.map((cKey) => ( + { + const isError = columnValue.phase === AnalysisStatus.Error; + const errorMessage = columnValue.message ?? 'Measurement error'; + const label = isError ? errorMessage : columnValueLabel(columnValue.tableValue, cKey); + return {label}; + }} + /> + ))} + + ) : ( + + )} + {timeColFormatter(startedAt)}} /> +
    + {failCondition !== null && ( + + Failure condition: {failCondition} + + )} + {successCondition !== null && ( + + Success condition: {successCondition} + + )} + +); + +export default MetricTable; diff --git a/ui/src/app/components/analysis-modal/panels/index.tsx b/ui/src/app/components/analysis-modal/panels/index.tsx new file mode 100644 index 0000000000..5636632889 --- /dev/null +++ b/ui/src/app/components/analysis-modal/panels/index.tsx @@ -0,0 +1,2 @@ +export {default as MetricPanel} from './metric-panel'; +export {default as SummaryPanel} from './summary-panel'; diff --git a/ui/src/app/components/analysis-modal/panels/metric-panel.tsx b/ui/src/app/components/analysis-modal/panels/metric-panel.tsx new file mode 100644 index 0000000000..b1deba1c6f --- /dev/null +++ b/ui/src/app/components/analysis-modal/panels/metric-panel.tsx @@ -0,0 +1,137 @@ +// eslint-disable-file @typescript-eslint/ban-ts-comment +import * as React from 'react'; + +import {Radio, Typography} from 'antd'; +import type {RadioChangeEvent} from 'antd'; +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faChartLine, faList} from '@fortawesome/free-solid-svg-icons'; + +import Header from '../header/header'; +import CriteriaList from '../criteria-list/criteria-list'; +import Legend from '../legend/legend'; +import MetricChart from '../metric-chart/metric-chart'; +import MetricTable from '../metric-table/metric-table'; +import QueryBox from '../query-box/query-box'; +import {AnalysisStatus, FunctionalStatus, TransformedMetricSpec, TransformedMetricStatus} from '../types'; +import {isFiniteNumber} from '../transforms'; +import {METRIC_CONSECUTIVE_ERROR_LIMIT_DEFAULT, METRIC_FAILURE_LIMIT_DEFAULT, METRIC_INCONCLUSIVE_LIMIT_DEFAULT} from '../constants'; + +import classNames from 'classnames'; +import './styles.scss'; + +const cx = classNames; + +const {Paragraph, Title} = Typography; + +interface MetricPanelProps { + className?: string[] | string; + metricName: string; + metricSpec?: TransformedMetricSpec; + metricResults: TransformedMetricStatus; + status: AnalysisStatus; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; +} + +const MetricPanel = ({className, metricName, metricSpec, metricResults, status, substatus}: MetricPanelProps) => { + const consecutiveErrorLimit = isFiniteNumber(metricSpec.consecutiveErrorLimit ?? null) ? metricSpec.consecutiveErrorLimit : METRIC_CONSECUTIVE_ERROR_LIMIT_DEFAULT; + const failureLimit = isFiniteNumber(metricSpec.failureLimit ?? null) ? metricSpec.failureLimit : METRIC_FAILURE_LIMIT_DEFAULT; + const inconclusiveLimit = isFiniteNumber(metricSpec.inconclusiveLimit ?? null) ? metricSpec.inconclusiveLimit : METRIC_INCONCLUSIVE_LIMIT_DEFAULT; + + const canChartMetric = metricResults.chartable && metricResults.chartMax !== null; + + const [selectedView, setSelectedView] = React.useState(canChartMetric ? 'chart' : 'table'); + + const onChangeView = ({target: {value}}: RadioChangeEvent) => { + setSelectedView(value); + }; + + return ( +
    +
    +
    + {canChartMetric && ( + + + + + + + + + )} +
    + {status === AnalysisStatus.Pending && ( + + {metricName} analysis measurements have not yet begun. Measurement information will appear here when it becomes available. + + )} + {status !== AnalysisStatus.Pending && metricResults.transformedMeasurements.length === 0 && ( + Measurement results for {metricName} cannot be displayed. + )} + {status !== AnalysisStatus.Pending && metricResults.transformedMeasurements.length > 0 && ( + <> + + {selectedView === 'chart' && ( + + )} + {selectedView === 'table' && ( + + )} + + )} +
    + + Pass requirements + + 0} + /> +
    + {Array.isArray(metricSpec?.queries) && ( + <> +
    + + {metricSpec.queries.length > 1 ? 'Queries' : 'Query'} + +
    + {metricSpec.queries.map((query) => ( + + ))} + + )} +
    + ); +}; + +export default MetricPanel; diff --git a/ui/src/app/components/analysis-modal/panels/styles.scss b/ui/src/app/components/analysis-modal/panels/styles.scss new file mode 100644 index 0000000000..b0010c55dd --- /dev/null +++ b/ui/src/app/components/analysis-modal/panels/styles.scss @@ -0,0 +1,61 @@ +@import '../theme/theme.scss'; + +// Analysis Panel + +.analysis-header { + margin: $space-unit 0 (3 * $space-unit); +} + +.label { + display: block; +} + +// Metric Panel + +.metric-header { + display: flex; + align-items: center; + justify-content: space-between; + margin: $space-unit 0; +} + +.legend { + display: flex; + justify-content: flex-end; +} + +h5.section-title { + margin-bottom: 0; // antd override +} + +.query-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: $space-unit; +} + +.query-box { + :not(:last-child) { + margin-bottom: $space-small; + } + + :last-child { + margin-bottom: $space-large; + } +} + +// Common + +.summary-section, +.metric-section { + margin-bottom: 3 * $space-unit; + + &.medium-space { + margin-bottom: $space-medium; + } + + &.top-content { + margin-top: $space-unit; + } +} diff --git a/ui/src/app/components/analysis-modal/panels/summary-panel.tsx b/ui/src/app/components/analysis-modal/panels/summary-panel.tsx new file mode 100644 index 0000000000..4b2d7bb829 --- /dev/null +++ b/ui/src/app/components/analysis-modal/panels/summary-panel.tsx @@ -0,0 +1,73 @@ +import * as React from 'react'; +import * as moment from 'moment'; +import {Typography} from 'antd'; + +import {AnalysisStatus, FunctionalStatus} from '../types'; +import Header from '../header/header'; + +import classNames from 'classnames/bind'; +import './styles.scss'; + +const cx = classNames; + +const {Text} = Typography; + +const timeRangeFormatter = (start: number, end: number | null) => { + const startFormatted = moment(start).format('LLL'); + if (end === null) { + return `${startFormatted} - present`; + } + const isSameDate = moment(start).isSame(moment(end), 'day'); + const endFormatted = isSameDate ? moment(end).format('LT') : moment(end).format('LLL'); + return `${startFormatted} - ${endFormatted}`; +}; + +interface SummaryPanelProps { + className?: string[] | string; + endTime: number | null; + images: string[]; + message?: string; + revision: string; + startTime: number | null; + status: AnalysisStatus; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; + title: string; +} + +const SummaryPanel = ({className, endTime, images, message, revision, startTime, status, substatus, title}: SummaryPanelProps) => ( +
    +
    + {images.length > 0 && ( +
    + + {images.length > 1 ? `Versions` : `Version`} + + {images.join(', ')} +
    + )} +
    + + Revision + + {revision} +
    + {startTime !== null && ( +
    + + Run time + + {timeRangeFormatter(startTime, endTime)} +
    + )} + {message && ( +
    + + Summary + + {message} +
    + )} +
    +); + +export default SummaryPanel; diff --git a/ui/src/app/components/analysis-modal/query-box/query-box.scss b/ui/src/app/components/analysis-modal/query-box/query-box.scss new file mode 100644 index 0000000000..c12be636b2 --- /dev/null +++ b/ui/src/app/components/analysis-modal/query-box/query-box.scss @@ -0,0 +1,50 @@ +@import '../theme/theme.scss'; + +.query-box { + position: relative; + padding: $space-small 48px $space-small $space-small; + background-color: $gray-2; + border: 1px solid $gray-4; + max-height: 70px; + overflow: hidden; + transition: max-height 0.3s ease-in-out; + + &.can-expand { + cursor: pointer; + } + + .query { + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: auto hidden; + white-space: pre-wrap; + word-wrap: break-word; + text-overflow: ellipsis; + line-clamp: 3; + -webkit-line-clamp: 3; + font-family: $font-family-mono; + font-size: 12px; + margin-bottom: 0; + } + + &.is-expanded { + max-height: 500px; + + .query { + line-clamp: initial; + -webkit-line-clamp: initial; + } + } +} + +.query-copy-button { + position: absolute; + font-size: 18px; + line-height: 1; + top: 8px; + right: 6px; + + svg { + color: $ant-primary; + } +} diff --git a/ui/src/app/components/analysis-modal/query-box/query-box.tsx b/ui/src/app/components/analysis-modal/query-box/query-box.tsx new file mode 100644 index 0000000000..188731c5a8 --- /dev/null +++ b/ui/src/app/components/analysis-modal/query-box/query-box.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; + +import {Typography} from 'antd'; + +import classNames from 'classnames'; +import './query-box.scss'; + +const {Paragraph} = Typography; + +interface QueryBoxProps { + className?: string[] | string; + query: string; +} + +const QueryBox = ({className, query}: QueryBoxProps) => { + const queryTextRef = React.useRef(null); + const [canExpand, setCanExpand] = React.useState(false); + const [expanded, toggleExpanded] = React.useState(false); + + React.useEffect(() => { + setCanExpand(queryTextRef.current?.offsetHeight !== queryTextRef.current?.scrollHeight); + }, [queryTextRef]); + + const expandQuery = () => { + toggleExpanded(true); + setCanExpand(false); + }; + + return ( +
    +
    +                {query}
    +            
    + +
    + ); +}; + +export default QueryBox; diff --git a/ui/src/app/components/analysis-modal/status-indicator/status-indicator.scss b/ui/src/app/components/analysis-modal/status-indicator/status-indicator.scss new file mode 100644 index 0000000000..35799cf1ff --- /dev/null +++ b/ui/src/app/components/analysis-modal/status-indicator/status-indicator.scss @@ -0,0 +1,84 @@ +@import '../theme/theme.scss'; + +@mixin indicator($background, $foreground) { + background: $background; + border-color: $foreground; + + &, + svg { + color: $foreground; + } +} + +.indicator-wrapper { + position: relative; + border-radius: 50%; +} + +.indicator { + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + border-style: solid; + border-width: 1px; + + &.is-small { + width: 14px; + min-width: 14px; + height: 14px; + } + + &.is-large { + width: 28px; + min-width: 28px; + height: 28px; + } + + &, + &.is-INACTIVE { + @include indicator($inactive-background, $inactive-foreground); + } + + &.is-IN_PROGRESS { + @include indicator($in-progress-background, $in-progress-foreground); + } + + &.is-SUCCESS { + @include indicator($success-background, $success-foreground); + } + + &.is-WARNING { + @include indicator($warning-background, $warning-foreground); + } + + &.is-ERROR { + @include indicator($error-background, $error-foreground); + } +} + +.substatus { + position: absolute; + border: 1px solid white; + border-radius: 50%; + top: -3px; + left: -2px; + + &.is-small { + width: 8px; + height: 8px; + } + + &.is-large { + width: 12px; + height: 12px; + } + + &.is-WARNING { + background: $warning-foreground; + } + + &.is-ERROR { + background: $error-foreground; + } +} diff --git a/ui/src/app/components/analysis-modal/status-indicator/status-indicator.tsx b/ui/src/app/components/analysis-modal/status-indicator/status-indicator.tsx new file mode 100644 index 0000000000..5dd30f8e5d --- /dev/null +++ b/ui/src/app/components/analysis-modal/status-indicator/status-indicator.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; + +import {AnalysisStatus, FunctionalStatus} from '../types'; +import {ANALYSIS_STATUS_THEME_MAP} from '../constants'; + +import classNames from 'classnames'; +import './status-indicator.scss'; + +const cx = classNames; + +interface StatusIndicatorProps { + children?: React.ReactNode; + className?: string[] | string; + size?: 'small' | 'large'; + status: AnalysisStatus; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; +} + +const StatusIndicator = ({children, className, size = 'large', status, substatus}: StatusIndicatorProps) => ( +
    +
    {children}
    + {substatus !== undefined &&
    } +
    +); + +export default StatusIndicator; diff --git a/ui/src/app/components/analysis-modal/styles.scss b/ui/src/app/components/analysis-modal/styles.scss new file mode 100644 index 0000000000..89c15c36fe --- /dev/null +++ b/ui/src/app/components/analysis-modal/styles.scss @@ -0,0 +1,8 @@ +.tabs { + min-height: 550px; + margin-top: 16px !important; // antd override + + .ant-tabs-tab { + padding-left: 0 !important; // antd override + } +} diff --git a/ui/src/app/components/analysis-modal/theme/theme.scss b/ui/src/app/components/analysis-modal/theme/theme.scss new file mode 100644 index 0000000000..0d8f934264 --- /dev/null +++ b/ui/src/app/components/analysis-modal/theme/theme.scss @@ -0,0 +1,35 @@ +@import 'node_modules/argo-ui/v2/styles/colors'; + +// antd colors +$gray-2: #fafafa; +$gray-4: #f0f0f0; +$gray-5: #d9d9d9; +$gray-6: #bfbfbf; +$gray-7: #8c8c8c; +$gray-10: #262626; +$gray-11: #1f1f1f; +$gray-12: #141414; + +$ant-primary: #44505f; // from config/theme.ts + +$success-background: lighten($argo-success-color-dark, 35); +$success-foreground: $argo-success-color-dark; +$warning-background: lighten($argo-status-warning-color, 25); +$warning-foreground: $argo-status-warning-color; +$error-background: lighten($argo-failed-color, 20); +$error-foreground: $argo-failed-color-dark; +$in-progress-background: lighten($argo-running-color-dark, 40); +$in-progress-foreground: $argo-running-color-dark; +$inactive-background: lighten($argo-waiting-color, 20); +$inactive-foreground: $argo-waiting-color-dark; + +$space-unit: 4px; +$space-small: 8px; +$space-medium: 16px; +$space-large: 24px; + +$shadow-1: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05); + +$font-family-primary: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +$font-family-mono: sfmono-regular, Consolas, liberation mono, Menlo, Courier, monospace; diff --git a/ui/src/app/components/analysis-modal/transforms.test.ts b/ui/src/app/components/analysis-modal/transforms.test.ts new file mode 100644 index 0000000000..5c2c2a667e --- /dev/null +++ b/ui/src/app/components/analysis-modal/transforms.test.ts @@ -0,0 +1,548 @@ +// eslint-disable-file @typescript-eslint/ban-ts-comment + +import { + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult, +} from '../../../models/rollout/generated'; +import { + analysisEndTime, + analysisStartTime, + argValue, + chartMax, + conditionDetails, + formatKeyValueMeasurement, + formatMultiItemArrayMeasurement, + formatSingleItemArrayMeasurement, + formatThresholdsForChart, + formattedValue, + interpolateQuery, + isChartable, + isValidDate, + metricProvider, + metricStatusLabel, + metricSubstatus, + printableCloudWatchQuery, + printableDatadogQuery, +} from './transforms'; +import {AnalysisStatus, FunctionalStatus} from './types'; + +const MOCK_METRICS_WITHOUT_END_TIMES: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult[] = [ + { + measurements: [], + }, + { + measurements: [{}, {}], + }, +]; + +const MOCK_METRICS_WITH_END_TIMES: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult[] = [ + { + measurements: [ + { + // @ts-ignore + finishedAt: '2023-11-16T00:25:23Z', + }, + { + // @ts-ignore + finishedAt: '2023-11-16T00:26:23Z', + }, + { + // @ts-ignore + finishedAt: '2023-11-16T00:27:23Z', + }, + { + // @ts-ignore + finishedAt: '2023-11-16T00:28:23Z', + }, + ], + }, +]; + +const MOCK_ARGS: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[] = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, + { + name: 'application-name', + value: 'istio-host-split-canary', + }, + { + name: 'cpu-usage-threshold', + }, + { + name: 'success-rate-threshold', + value: '0.95', + }, + { + name: 'latency-threshold', + value: '500', + }, +]; + +const MOCK_PROVIDER_PROMETHEUS: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider = { + prometheus: { + address: 'https://prometheus-k8s.monitoring:9090', + query: 'sum(irate(istio_requests_total{destination_service_name=~"{{args.service-name}}",response_code!~"5.*"}[1m])) \n/\nsum(irate(istio_requests_total{destination_service_name=~"{{args.service-name}}"}[1m]))', + }, +}; +const MOCK_PROVIDER_NEWRELIC: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider = { + newRelic: { + query: "FROM Transaction SELECT percentage(count(*), WHERE httpResponseCode != 500) as successRate where appName = '{{ args.application-name }}'", + }, +}; +const MOCK_PROVIDER_DATADOG_V2_1: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider = { + datadog: { + apiVersion: 'v2', + query: 'sum:requests.errors{service:{{args.service-name}}}.as_count()', + formula: "moving_rollup(a, 60, 'sum') / b", + }, +}; +const MOCK_PROVIDER_DATADOG_V2_2: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider = { + datadog: { + apiVersion: 'v2', + queries: { + a: 'sum:requests.errors{service:{{args.service-name}}}.as_count()', + b: 'sum:requests{service:{{args.service-name}}}.as_count()', + }, + formula: "moving_rollup(a, 60, 'sum') / b", + }, +}; + +const MOCK_PROVIDER_CLOUDWATCH: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric = { + metricDataQueries: [ + { + id: 'rate', + expression: 'errors / requests', + }, + { + id: 'errors', + metricStat: { + metric: { + namespace: 'app', + metricName: 'errors', + }, + stat: 'Sum', + unit: 'Count', + }, + returnData: false, + }, + { + id: 'requests', + metricStat: { + metric: { + namespace: 'app', + metricName: 'requests', + }, + stat: 'Sum', + unit: 'Count', + }, + returnData: false, + }, + ], +}; + +const MOCK_ARGS_PROMETHEUS = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, +]; +const MOCK_QUERY_PROMETHEUS = + 'sum(irate(istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m])) / sum(irate(istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m]))'; + +const MOCK_ARGS_NEWRELIC = [{name: 'application-name', value: 'myApp'}]; +const MOCK_QUERY_NEWRELIC = "FROM Transaction SELECT percentage(count(*), WHERE httpResponseCode != 500) as successRate where appName = '{{ args.application-name }}'"; + +const MOCK_ARGS_DATADOG = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, +]; +const MOCK_QUERY_DATADOG = 'sum:requests.error.rate{service:{{args.service-name}}}'; + +const MOCK_ARGS_WAVEFRONT = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, +]; +const MOCK_QUERY_WAVEFRONT = + 'sum(rate(5m, ts("istio.requestcount.count", response_code!=500 and destination_service="{{args.service-name}}"))) / sum(rate(5m, ts("istio.requestcount.count", reporter=client and destination_service="{{args.service-name}}")))'; + +const MOCK_QUERY_GRAPHITE = + "target=summarize(asPercent(sumSeries(stats.timers.httpServerRequests.app.{{args.service-name}}.exception.*.method.*.outcome.{CLIENT_ERROR,INFORMATIONAL,REDIRECTION,SUCCESS}.status.*.uri.*.count), sumSeries(stats.timers.httpServerRequests.app.{{args.service-name}}.exception.*.method.*.outcome.*.status.*.uri.*.count)),'5min','avg')"; +const MOCK_ARGS_GRAPHITE = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, +]; + +const MOCK_QUERY_INFLUXDB = + 'from(bucket: "app_istio") range(start: -15m) filter(fn: (r) => r["destination_workload"] == "{{ args.application-name }}")|> filter(fn: (r) => r["_measurement"] == "istio:istio_requests_errors_percentage:rate1m:5xx")'; +const MOCK_ARGS_INFLUXDB = [{name: 'application-name', value: 'myApp'}]; + +const MOCK_QUERY_SKYWALKING = + 'query queryData($duration: Duration!) { service_apdex: readMetricsValues(condition: { name: "service_apdex", entity: { scope: Service, serviceName: "{{ args.service-name }}", normal: true } }, duration: $duration) { label values { values { value } } } }'; +const MOCK_ARGS_SKYWALKING = [ + { + name: 'service-name', + value: 'istio-host-split-canary', + }, +]; + +const MOCK_CONDITION_1 = 'result[0] < .95'; +const MOCK_CONDITION_2 = 'result[0] > .5 && result[0] < .95'; +const MOCK_CONDITION_3 = 'result.successRate >= 0.95'; +const MOCK_CONDITION_4 = 'result.successRate >= {{ args.success-rate-threshold }}'; +const MOCK_CONDITION_5 = 'result.successRate >= {{ args.success-rate-threshold }} && result.errorRate <= 0.1'; + +describe('analysis modal transforms', () => { + beforeAll(() => {}); + afterAll(() => {}); + + test('isValidDate() for undefined', () => { + expect(isValidDate()).toBe(false); + }); + test('isValidDate() for a non-date recognized string', () => { + expect(isValidDate('abcd')).toBe(false); + }); + test('isValidDate() for a date recognized string', () => { + expect(isValidDate('2023-11-16T00:25:23Z')).toBe(true); + }); + + test('analysisStartTime() for undefined', () => { + expect(analysisStartTime()).toBeNull(); + }); + test('analysisStartTime() for a non-date recognized string', () => { + expect(analysisStartTime('abcd')).toBeNull(); + }); + test('analysisStartTime() for a date recognized string', () => { + expect(analysisStartTime('2023-11-16T00:25:23Z')).toBe(1700094323000); + }); + + test('analysisEndTime() for no metric results', () => { + expect(analysisEndTime([])).toBe(null); + }); + test('analysisEndTime() for analysis with metrics but no measurements', () => { + expect(analysisEndTime(MOCK_METRICS_WITHOUT_END_TIMES)).toBe(null); + }); + test('analysisEndTime() for measurements with finishedAt times', () => { + expect(analysisEndTime(MOCK_METRICS_WITH_END_TIMES)).toBe(1700094503000); + }); + + test('argValue() for empty args', () => { + expect(argValue([], 'cpu-threhold')).toBeNull(); + }); + test('argValue() for missing arg name / value', () => { + expect(argValue(MOCK_ARGS, 'memory-threshold')).toBeNull(); + }); + test('argValue() for missing arg value', () => { + expect(argValue(MOCK_ARGS, 'cpu-usage-treshold')).toBeNull(); + }); + test('argValue() for present arg name / value', () => { + expect(argValue(MOCK_ARGS, 'latency-threshold')).toBe('500'); + }); + + test('metricProvider() for known provider', () => { + expect(metricProvider(MOCK_PROVIDER_PROMETHEUS)).toBe('prometheus'); + }); + + test('conditionDetails with missing condition', () => { + expect(conditionDetails(undefined, MOCK_ARGS, MOCK_PROVIDER_PROMETHEUS)).toEqual({ + label: null, + thresholds: [], + conditionKeys: [], + }); + }); + test('conditionDetails() with missing provider', () => { + expect(conditionDetails(MOCK_CONDITION_1, MOCK_ARGS)).toEqual({ + label: null, + thresholds: [], + conditionKeys: [], + }); + }); + test('conditionDetails() for unsupported format', () => { + expect(conditionDetails('result in resultsArray', MOCK_ARGS, MOCK_PROVIDER_PROMETHEUS)).toEqual({ + label: 'result in resultsArray', + thresholds: [], + conditionKeys: [], + }); + }); + test('conditionDetails() with missing args', () => { + expect(conditionDetails(MOCK_CONDITION_1, undefined, MOCK_PROVIDER_PROMETHEUS)).toEqual({ + conditionKeys: ['0'], + label: 'result[0] < .95', + thresholds: [0.95], + }); + }); + test('conditionDetails() for condition like result[0] [>, <] [number]', () => { + expect(conditionDetails(MOCK_CONDITION_1, MOCK_ARGS, MOCK_PROVIDER_PROMETHEUS)).toEqual({ + conditionKeys: ['0'], + label: 'result[0] < .95', + thresholds: [0.95], + }); + }); + test('conditionDetails() for multiple conditions like result[0] [>, <] [number] && result[0] [>, <] [number]', () => { + expect(conditionDetails(MOCK_CONDITION_2, MOCK_ARGS, MOCK_PROVIDER_PROMETHEUS)).toEqual({ + conditionKeys: ['0'], + label: 'result[0] > .5 && result[0] < .95', + thresholds: [0.5, 0.95], + }); + }); + test('conditionDetails() for condition like result.[key] [>, <] [number]', () => { + expect(conditionDetails(MOCK_CONDITION_3, MOCK_ARGS, MOCK_PROVIDER_NEWRELIC)).toEqual({ + conditionKeys: ['successRate'], + label: 'result.successRate >= 0.95', + thresholds: [0.95], + }); + }); + test('conditionDetails() for condition like result.[key] [>, <] [arg value]', () => { + expect(conditionDetails(MOCK_CONDITION_4, MOCK_ARGS, MOCK_PROVIDER_NEWRELIC)).toEqual({ + conditionKeys: ['successRate'], + label: 'result.successRate >= 0.95', + thresholds: [0.95], + }); + }); + test('conditionDetails() for multiple condition like result.[key1] [>, <] [arg value] && result.[key2] [>, <] [number]', () => { + expect(conditionDetails(MOCK_CONDITION_5, MOCK_ARGS, MOCK_PROVIDER_NEWRELIC)).toEqual({ + conditionKeys: ['successRate', 'errorRate'], + label: 'result.successRate >= 0.95 && result.errorRate <= 0.1', + thresholds: [0.95, 0.1], + }); + }); + + test('formatThresholdsForChart() with number values', () => { + expect(formatThresholdsForChart([0, 1.1, 2.22, 3.333, 4.4444, 5.55555])).toEqual([0, 1.1, 2.22, 3.33, 4.44, 5.56]); + }); + + test('chartMax() for 0 max value and null thresholds', () => { + expect(chartMax(0, null, null)).toBe(1); + }); + test('chartMax() for 1 max value and null thresholds', () => { + expect(chartMax(1, null, null)).toBe(1.2); + }); + test('chartMax() for max value and thresholds that are the same', () => { + expect(chartMax(2, [2], [2])).toBe(2.4); + }); + test('chartMax() for max value that is above thresholds', () => { + expect(chartMax(4, [2, 3], [1, 2])).toBe(4.8); + }); + test('chartMax() for fail threshold that is above value and success threshold', () => { + expect(chartMax(2, [2, 3, 4], [1, 2])).toBe(4.8); + }); + test('chartMax() for success threshold that is above value and fail threshold', () => { + expect(chartMax(2, [2, 3, 4], [1, 2, 6])).toBe(7.2); + }); + + test('metricSubstatus() for metric with pending status', () => { + expect(metricSubstatus(AnalysisStatus.Pending, 0, 0, 0)).toBe(undefined); + }); + test('metricSubstatus() for successful metric with no issues', () => { + expect(metricSubstatus(AnalysisStatus.Successful, 0, 0, 0)).toBe(undefined); + }); + test('metricSubstatus() for successful metric with failures', () => { + expect(metricSubstatus(AnalysisStatus.Successful, 2, 0, 0)).toBe(FunctionalStatus.ERROR); + }); + test('metricSubstatus() for successful metric with errors', () => { + expect(metricSubstatus(AnalysisStatus.Successful, 0, 2, 0)).toBe(FunctionalStatus.WARNING); + }); + + test('metricStatusLabel() for metric with unknown status', () => { + expect(metricStatusLabel(AnalysisStatus.Unknown, 0, 0, 0)).toBe('Analysis status unknown'); + }); + test('metricStatusLabel() for metric with successful status with failures', () => { + expect(metricStatusLabel(AnalysisStatus.Successful, 1, 0, 0)).toBe('Analysis passed with measurement failures'); + }); + test('metricStatusLabel() for metric with successful status with errors', () => { + expect(metricStatusLabel(AnalysisStatus.Successful, 0, 1, 0)).toBe('Analysis passed with measurement errors'); + }); + test('metricStatusLabel() for metric with successful status with inconclusives', () => { + expect(metricStatusLabel(AnalysisStatus.Successful, 0, 0, 1)).toBe('Analysis passed with inconclusive measurements'); + }); + test('metricStatusLabel() for metric with successful status with multiple issues', () => { + expect(metricStatusLabel(AnalysisStatus.Successful, 1, 2, 3)).toBe('Analysis passed with multiple issues'); + }); + + test('interpolateQuery() for no query', () => { + expect(interpolateQuery(undefined, MOCK_ARGS)).toBe(undefined); + }); + test('interpolateQuery() for prometheus query with no args', () => { + expect(interpolateQuery(MOCK_QUERY_PROMETHEUS, [])).toBe(MOCK_QUERY_PROMETHEUS); + }); + test('interpolateQuery() for prometheus query and args', () => { + expect(interpolateQuery(MOCK_QUERY_PROMETHEUS, MOCK_ARGS_PROMETHEUS)).toBe( + 'sum(irate(istio_requests_total{reporter="source",destination_service=~"istio-host-split-canary",response_code!~"5.*"}[5m])) / sum(irate(istio_requests_total{reporter="source",destination_service=~"istio-host-split-canary"}[5m]))' + ); + }); + test('interpolateQuery() for newrelic query and args', () => { + expect(interpolateQuery(MOCK_QUERY_NEWRELIC, MOCK_ARGS_NEWRELIC)).toBe( + "FROM Transaction SELECT percentage(count(*), WHERE httpResponseCode != 500) as successRate where appName = 'myApp'" + ); + }); + test('interpolateQuery() for simple datadog query and args', () => { + expect(interpolateQuery(MOCK_QUERY_DATADOG, MOCK_ARGS_DATADOG)).toBe('sum:requests.error.rate{service:istio-host-split-canary}'); + }); + test('interpolateQuery() for wavefront query and args', () => { + expect(interpolateQuery(MOCK_QUERY_WAVEFRONT, MOCK_ARGS_WAVEFRONT)).toBe( + 'sum(rate(5m, ts("istio.requestcount.count", response_code!=500 and destination_service="istio-host-split-canary"))) / sum(rate(5m, ts("istio.requestcount.count", reporter=client and destination_service="istio-host-split-canary")))' + ); + }); + test('interpolateQuery() for graphite query and args', () => { + expect(interpolateQuery(MOCK_QUERY_GRAPHITE, MOCK_ARGS_GRAPHITE)).toBe( + "target=summarize(asPercent(sumSeries(stats.timers.httpServerRequests.app.istio-host-split-canary.exception.*.method.*.outcome.{CLIENT_ERROR,INFORMATIONAL,REDIRECTION,SUCCESS}.status.*.uri.*.count), sumSeries(stats.timers.httpServerRequests.app.istio-host-split-canary.exception.*.method.*.outcome.*.status.*.uri.*.count)),'5min','avg')" + ); + }); + test('interpolateQuery() for influxdb query and args', () => { + expect(interpolateQuery(MOCK_QUERY_INFLUXDB, MOCK_ARGS_INFLUXDB)).toBe( + 'from(bucket: "app_istio") range(start: -15m) filter(fn: (r) => r["destination_workload"] == "myApp")|> filter(fn: (r) => r["_measurement"] == "istio:istio_requests_errors_percentage:rate1m:5xx")' + ); + }); + test('interpolateQuery() for skywalking query and args', () => { + expect(interpolateQuery(MOCK_QUERY_SKYWALKING, MOCK_ARGS_SKYWALKING)).toBe( + 'query queryData($duration: Duration!) { service_apdex: readMetricsValues(condition: { name: "service_apdex", entity: { scope: Service, serviceName: "istio-host-split-canary", normal: true } }, duration: $duration) { label values { values { value } } } }' + ); + }); + + test('printableDataDogQuery() with v2 query and formula', () => { + expect(printableDatadogQuery(MOCK_PROVIDER_DATADOG_V2_1.datadog, MOCK_ARGS_DATADOG)).toStrictEqual([ + `query: sum:requests.errors{service:istio-host-split-canary}.as_count(), formula: moving_rollup(a, 60, 'sum') / b`, + ]); + }); + test('printableDataDogQuery() with v2 queries and formula', () => { + expect(printableDatadogQuery(MOCK_PROVIDER_DATADOG_V2_2.datadog, MOCK_ARGS_DATADOG)).toStrictEqual([ + `queries: {"a":"sum:requests.errors{service:istio-host-split-canary}.as_count()","b":"sum:requests{service:istio-host-split-canary}.as_count()"}, formula: moving_rollup(a, 60, 'sum') / b`, + ]); + }); + + test('printableCloudWatchQuery() with metricDataQueries', () => { + expect(printableCloudWatchQuery(MOCK_PROVIDER_CLOUDWATCH)).toStrictEqual([ + '{"id":"rate","expression":"errors / requests"}', + '{"id":"errors","metricStat":{"metric":{"namespace":"app","metricName":"errors"},"stat":"Sum","unit":"Count"},"returnData":false}', + '{"id":"requests","metricStat":{"metric":{"namespace":"app","metricName":"requests"},"stat":"Sum","unit":"Count"},"returnData":false}', + ]); + }); + + test('isChartable() for undefined', () => { + expect(isChartable(undefined)).toBe(false); + }); + test('isChartable() for null', () => { + expect(isChartable(null)).toBe(true); + }); + test('isChartable() for a string', () => { + expect(isChartable('abc')).toBe(false); + }); + test('isChartable() for an array', () => { + expect(isChartable([1, 2, 5, 3])).toBe(false); + }); + test('isChartable() for a positive number', () => { + expect(isChartable(5)).toBe(true); + }); + test('isChartable() for a negative number', () => { + expect(isChartable(-5)).toBe(true); + }); + + test('formattedValue() for null', () => { + expect(formattedValue(null)).toBe(null); + }); + test('formattedValue() for an int', () => { + expect(formattedValue(1)).toBe(1); + }); + test('formattedValue() for a float', () => { + expect(formattedValue(1.2653)).toBe(1.27); + }); + test('formattedValue() for a string', () => { + expect(formattedValue('abc')).toBe('abc'); + }); + test('formattedValue() for an array of numbers', () => { + expect(formattedValue([1, 4, 3, 7])).toBe('1,4,3,7'); + }); + + test('formatSingleItemArrayMeasurement() with out of bounds accessor', () => { + expect(formatSingleItemArrayMeasurement([4], 1)).toEqual({ + canChart: true, + chartValue: {1: null}, + tableValue: {1: null}, + }); + }); + test('formatSingleItemArrayMeasurement() for a value like [`abc`] with accessor 0', () => { + expect(formatSingleItemArrayMeasurement(['abc'], 0)).toEqual({ + canChart: false, + tableValue: {0: 'abc'}, + }); + }); + test('formatSingleItemArrayMeasurement() for a value like [4] with accessor 0', () => { + expect(formatSingleItemArrayMeasurement([4], 0)).toEqual({ + canChart: true, + chartValue: {0: 4}, + tableValue: {0: 4}, + }); + }); + test('formatSingleItemArrayMeasurement() for a value like [null] with accessor 0', () => { + expect(formatSingleItemArrayMeasurement([null], 0)).toEqual({ + canChart: true, + chartValue: {0: null}, + tableValue: {0: null}, + }); + }); + + test('formatMultiItemArrayMeasurement() with an empty array', () => { + expect(formatMultiItemArrayMeasurement([])).toEqual({ + canChart: false, + tableValue: '', + }); + }); + test('formatMultiItemArrayMeasurement() with all numbers', () => { + expect(formatMultiItemArrayMeasurement([4, 6, 3, 5])).toEqual({ + canChart: true, + chartValue: 4, + tableValue: '4,6,3,5', + }); + }); + test('formatMultiItemArrayMeasurement() with null as the first item', () => { + expect(formatMultiItemArrayMeasurement([null, 6, 3, 5])).toEqual({ + canChart: true, + chartValue: null, + tableValue: 'null,6,3,5', + }); + }); + test('formatMultiItemArrayMeasurement() with a string as the first item', () => { + expect(formatMultiItemArrayMeasurement(['abc', 6, 3, 5])).toEqual({ + canChart: false, + tableValue: 'abc,6,3,5', + }); + }); + + test('formatKeyValueMeasurement() with key value pairs and no matching accessors', () => { + expect(formatKeyValueMeasurement({cpuUsage: 50, latency: 500}, ['errorRate'])).toEqual({ + canChart: false, + chartValue: {errorRate: null}, + tableValue: {errorRate: null}, + }); + }); + test('formatKeyValueMeasurement() with key value pairs and a single matching accessor', () => { + expect(formatKeyValueMeasurement({cpuUsage: 50, latency: 500}, ['latency'])).toEqual({ + canChart: true, + chartValue: {latency: 500}, + tableValue: {latency: 500}, + }); + }); + test('formatKeyValueMeasurement() with key value pairs and multiple matching accessors', () => { + expect(formatKeyValueMeasurement({cpuUsage: 50, latency: 500}, ['latency', 'cpuUsage'])).toEqual({ + canChart: true, + chartValue: {latency: 500, cpuUsage: 50}, + tableValue: {latency: 500, cpuUsage: 50}, + }); + }); + test('formatKeyValueMeasurement() with key value pairs all null and matching accessors', () => { + expect(formatKeyValueMeasurement({cpuUsage: null, latency: null}, ['latency', 'cpuUsage'])).toEqual({ + canChart: false, + chartValue: {latency: null, cpuUsage: null}, + tableValue: {latency: null, cpuUsage: null}, + }); + }); +}); diff --git a/ui/src/app/components/analysis-modal/transforms.ts b/ui/src/app/components/analysis-modal/transforms.ts new file mode 100644 index 0000000000..a655dda1c4 --- /dev/null +++ b/ui/src/app/components/analysis-modal/transforms.ts @@ -0,0 +1,648 @@ +// eslint-disable-file @typescript-eslint/ban-ts-comment +import * as moment from 'moment'; + +import { + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult, + RolloutAnalysisRunSpecAndStatus, +} from '../../../models/rollout/generated'; +import {AnalysisStatus, FunctionalStatus, MeasurementSetInfo, MeasurementValueInfo, TransformedMeasurement, TransformedMetric, TransformedValueObject} from './types'; + +export const isFiniteNumber = (value: any) => Number.isFinite(value); + +export const roundNumber = (value: number): number => Math.round(value * 100) / 100; + +export const isValidDate = (value?: string): boolean => value !== undefined && moment(value).isValid(); + +// Overall Analysis Utils + +/** + * + * @param startTime start time of the analysis run + * @returns timestamp in ms or null + */ +export const analysisStartTime = (startTime?: string): number | null => (isValidDate(startTime) ? new Date(startTime).getTime() : null); + +/** + * + * @param metricResults array of metric results + * @returns timestamp in ms or null + */ +export const analysisEndTime = (metricResults: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult[]): number | null => { + if (metricResults.length === 0) { + return null; + } + + const measurementEndTimes: number[] = []; + metricResults.forEach((metricResult) => { + (metricResult.measurements ?? []).forEach((measurement) => { + // @ts-ignore + if (isValidDate(measurement.finishedAt)) { + // @ts-ignore + measurementEndTimes.push(new Date(measurement.finishedAt).getTime()); + } + }); + }); + + const latestTime = Math.max(...measurementEndTimes); + return isFiniteNumber(latestTime) ? latestTime : null; +}; + +// Arg Utils + +/** + * + * @param args arguments name/value pairs associated with the analysis run + * @param argName name of arg for which to find the value + * @returns + * value associated with the arg + * or null if args is empty + * or null if argName is not present in args + * or null if arg value is undefined or null + */ +export const argValue = (args: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[], argName: string): string | null => + args.find((arg) => arg.name === argName)?.value ?? null; + +// Metric Utils + +/** + * + * @param providerInfo metric provider object + * @returns first key in the provider object + */ +export const metricProvider = (providerInfo: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider): string => + Object.keys(providerInfo)?.[0] ?? 'unsupported provider'; + +const PROVIDER_CONDITION_SUPPORT: { + [key: string]: (resultAccessor: string) => { + isFormatSupported: boolean; + conditionKey: string | null; + }; +} = { + prometheus: (resultAccessor: string) => ({ + isFormatSupported: resultAccessor === 'result[0]', + conditionKey: '0', + }), + datadog: (resultAccessor: string) => ({ + isFormatSupported: ['result', 'default(result, 0)'].includes(resultAccessor), + conditionKey: resultAccessor.includes('0') ? '0' : null, + }), + wavefront: (resultAccessor: string) => ({ + isFormatSupported: resultAccessor === 'result', + conditionKey: null, + }), + newRelic: (resultAccessor: string) => ({ + isFormatSupported: resultAccessor.startsWith('result.'), + conditionKey: resultAccessor.substring(7), + }), + cloudWatch: (resultAccessor: string) => ({ + isFormatSupported: false, + conditionKey: null, + }), + graphite: (resultAccessor: string) => ({ + isFormatSupported: resultAccessor === 'result[0]', + conditionKey: '0', + }), + influxdb: (resultAccessor: string) => ({ + isFormatSupported: resultAccessor === 'result[0]', + conditionKey: '0', + }), + skywalking: (resultAccessor: string) => ({ + isFormatSupported: false, + conditionKey: null, + }), +}; + +/** + * + * @param condition failure_condition or success_condition with the format + * [result accessor] [operator] {{ args.[argname] }} + * or [result accessor] [operator] [value] + * @param args arguments name/value pairs associated with the analysis run + * @returns + * label - a friendly fail/success condition label and + * thresholds - threshold values that can be converted into numbers + * conditionKeys - string keys for the values being compared in the condition + */ +export const conditionDetails = ( + condition?: string, + args: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[] = [], + provider?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider +): { + label: string | null; + thresholds: number[]; + conditionKeys: string[]; +} => { + if (condition === undefined || condition === '' || provider === undefined || metricProvider(provider) === 'unsupported provider') { + return { + label: null, + thresholds: [], + conditionKeys: [], + }; + } + + const interpolatedCondition = interpolateQuery(condition, args); + const subconditions = interpolatedCondition.split(/ && | \|\| /); + + const providerType = metricProvider(provider); + const thresholds: number[] = []; + const conditionKeys: string[] = []; + + // for each subcondition, if it deemed to be a supported subcondition, add keys and numeric thresholds + subconditions.forEach((subcondition) => { + const subconditionParts = subcondition.split(' '); + if (subconditionParts.length === 3) { + const providerInfo = PROVIDER_CONDITION_SUPPORT[providerType]?.(subconditionParts[0].trim()); + const isFormatSupported = providerInfo?.isFormatSupported ?? false; + const conditionKey = providerInfo?.conditionKey ?? null; + + const isUnderOverThreshold = subconditionParts[1].includes('<') || subconditionParts[1].includes('>'); + const isChartableThreshold = isFiniteNumber(parseFloat(subconditionParts[2])); + + if (isFormatSupported && isUnderOverThreshold && isChartableThreshold) { + if (conditionKey !== null) { + conditionKeys.push(conditionKey); + } + thresholds.push(Number(subconditionParts[2])); + } + } + }); + + return { + label: interpolatedCondition, + thresholds, + conditionKeys: [...new Set(conditionKeys)], + }; +}; + +/** + * + * @param thresholds threshold values + * @returns number formatted to two decimal points + */ +export const formatThresholdsForChart = (thresholds: number[]): (number | null)[] => thresholds.map((t) => roundNumber(t)); + +/** + * + * @param valueMax max value for a measurement + * @param failThresholds fail thresholds for the metric + * @param successThresholds success thresholds for the metric + * @returns 120% of the max content value which could either be a data point or one of the thresholds + * or 1 if the max value is less than 1 and there are no thresholds + */ +export const chartMax = (valueMax: number, failThresholds: number[] | null, successThresholds: number[] | null) => { + if (valueMax < 1 && failThresholds === null && successThresholds === null) { + return 1; + } + const failThresholdMax = failThresholds !== null && failThresholds.length > 0 ? Math.max(...failThresholds) : Number.NEGATIVE_INFINITY; + const successThresholdMax = successThresholds !== null && successThresholds.length > 0 ? Math.max(...successThresholds) : Number.NEGATIVE_INFINITY; + return roundNumber(Math.max(valueMax, failThresholdMax, successThresholdMax) * 1.2); +}; + +/** + * + * @param phase analysis phase + * @returns analysis phase adjusted to render the UI status with a more accurate functional status + */ +export const getAdjustedMetricPhase = (phase?: AnalysisStatus): AnalysisStatus => (phase === AnalysisStatus.Error ? AnalysisStatus.Failed : phase ?? AnalysisStatus.Unknown); + +/** + * + * @param specAndStatus analysis spec and status information + * @returns analysis metrics with additional information to render to the UI + */ +export const transformMetrics = (specAndStatus?: RolloutAnalysisRunSpecAndStatus): {[key: string]: TransformedMetric} => { + if (specAndStatus?.spec === undefined || specAndStatus?.status === undefined) { + return {}; + } + + const {spec, status} = specAndStatus; + + const transformedMetrics: {[key: string]: TransformedMetric} = {}; + status.metricResults?.forEach((metricResults, idx) => { + const metricName = metricResults?.name ?? `Unknown metric ${idx}`; + const metricSpec = spec?.metrics?.find((m) => m.name === metricName); + + if (metricSpec !== undefined) { + // spec values + const failConditionInfo = conditionDetails(metricSpec.failureCondition, spec.args, metricSpec.provider); + const failThresholds = failConditionInfo.thresholds.length > 0 ? formatThresholdsForChart(failConditionInfo.thresholds) : null; + const successConditionInfo = conditionDetails(metricSpec.successCondition, spec.args, metricSpec.provider); + const successThresholds = successConditionInfo.thresholds.length > 0 ? formatThresholdsForChart(successConditionInfo.thresholds) : null; + + // value keys are needed for measurement values formatted as {key1: value1, key2: value2} + const conditionKeys = [...new Set([...failConditionInfo.conditionKeys, ...successConditionInfo.conditionKeys])]; + + // results values + const transformedMeasurementInfo = transformMeasurements(conditionKeys, metricResults?.measurements); + const {measurements, chartable, min, max} = transformedMeasurementInfo; + + const metricStatus = (metricResults?.phase ?? AnalysisStatus.Unknown) as AnalysisStatus; + const measurementFailures = metricResults?.failed ?? 0; + const measurementErrors = metricResults?.error ?? 0; + const measurementInconclusives = metricResults?.inconclusive ?? 0; + + transformedMetrics[metricName] = { + name: metricName, + spec: { + ...metricSpec, + queries: metricQueries(metricSpec.provider, spec.args), + failConditionLabel: failConditionInfo.label, + failThresholds, + successConditionLabel: successConditionInfo.label, + successThresholds, + conditionKeys, + }, + status: { + ...metricResults, + adjustedPhase: getAdjustedMetricPhase(metricStatus), + statusLabel: metricStatusLabel(metricStatus, measurementFailures, measurementErrors, measurementInconclusives), + substatus: metricSubstatus(metricStatus, measurementFailures, measurementErrors, measurementInconclusives), + transformedMeasurements: measurements, + chartable, + chartMin: min, + chartMax: chartMax(max, failThresholds, successThresholds), + }, + }; + } + }); + + return transformedMetrics; +}; + +/** + * + * @param status analysis metric status + * @param failures number of measurement failures + * @param errors number of measurement errors + * @param inconclusives number of inconclusive measurements + * @returns ui state substatus to indicate that there were errors/failures/ + * inconclusives + */ +export const metricSubstatus = (status: AnalysisStatus, failures: number, errors: number, inconclusives: number): FunctionalStatus.ERROR | FunctionalStatus.WARNING | undefined => { + switch (status) { + case AnalysisStatus.Pending: + case AnalysisStatus.Failed: + case AnalysisStatus.Inconclusive: + case AnalysisStatus.Error: + return undefined; + case AnalysisStatus.Running: + case AnalysisStatus.Successful: + if (failures > 0) { + return FunctionalStatus.ERROR; + } + if (errors > 0 || inconclusives > 0) { + return FunctionalStatus.WARNING; + } + return undefined; + default: + return undefined; + } +}; + +/** + * + * @param status analysis metric status + * @param failures number of measurement failures + * @param errors number of measurement errors + * @param inconclusives number of inconclusive measurements + * @returns descriptive label to include more details beyond the overall + * analysis status + */ +export const metricStatusLabel = (status: AnalysisStatus, failures: number, errors: number, inconclusives: number) => { + let extraDetails = ''; + const hasFailures = failures > 0; + const hasErrors = errors > 0; + const hasInconclusives = inconclusives > 0; + switch (status) { + case AnalysisStatus.Unknown: + return 'Analysis status unknown'; + case AnalysisStatus.Pending: + return 'Analysis pending'; + case AnalysisStatus.Running: + return 'Analysis in progress'; + case AnalysisStatus.Failed: + return `Analysis failed`; + case AnalysisStatus.Inconclusive: + return `Analysis inconclusive`; + case AnalysisStatus.Error: + return 'Analysis errored'; + case AnalysisStatus.Successful: + if (hasFailures && !hasErrors && !hasInconclusives) { + extraDetails = 'with measurement failures'; + } else if (!hasFailures && hasErrors && !hasInconclusives) { + extraDetails = 'with measurement errors'; + } else if (!hasFailures && !hasErrors && hasInconclusives) { + extraDetails = 'with inconclusive measurements'; + } else if (hasFailures || hasErrors || hasInconclusives) { + extraDetails = 'with multiple issues'; + } + return `Analysis passed ${extraDetails}`.trim(); + default: + return ''; + } +}; + +/** + * + * @param query query for an analysis run metric + * @param args arguments name/value pairs associated with the analysis run + * @returns the query with all {{ args.[argName] }} replaced with + * the value of the arg + */ +export const interpolateQuery = (query?: string, args?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[]) => { + if (query === undefined) { + return undefined; + } + if (args === undefined || args.length === 0) { + return query; + } + + const regex = /\{{.*?\}}/g; + return query.replace(regex, (match) => { + const argPieces = match.replace(/[{ }]/g, '').split('.'); + const replacementValue = argValue(args, argPieces?.[1] ?? ''); + return replacementValue ?? match; + }); +}; + +/** + * + * @param datadog datadog metric object + * @param args arguments name/value pairs associated with the analysis run + * @returns query formatted for display or undefined + */ +export const printableDatadogQuery = ( + datadog: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric, + args: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[] +): string[] | undefined => { + if ((datadog.apiVersion ?? '').toLowerCase() === 'v1' && 'query' in datadog) { + return [interpolateQuery(datadog.query, args)]; + } + if ((datadog.apiVersion ?? '').toLowerCase() === 'v2') { + if ('query' in datadog) { + return 'formula' in datadog ? [`query: ${interpolateQuery(datadog.query, args)}, formula: ${datadog.formula}`] : [interpolateQuery(datadog.query, args)]; + } + if ('queries' in datadog) { + let interpolatedQueries: {[key: string]: string} = {}; + Object.keys(datadog.queries).forEach((queryKey) => { + interpolatedQueries[queryKey] = interpolateQuery(datadog.queries[queryKey], args); + }); + return 'formula' in datadog + ? [`queries: ${JSON.stringify(interpolatedQueries)}, formula: ${datadog.formula}`] + : Object.values(datadog.queries).map((query) => interpolateQuery(query, args)); + } + } + return undefined; +}; + +/** + * + * @param cloudWatch cloudwatch metric object + * @returns query formatted for display or undefined + */ +export const printableCloudWatchQuery = (cloudWatch: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1CloudWatchMetric): string[] | undefined => { + return Array.isArray(cloudWatch.metricDataQueries) ? cloudWatch.metricDataQueries.map((query) => JSON.stringify(query)) : undefined; +}; + +/** + * + * @param provider metric provider object + * @param args arguments name/value pairs associated with the analysis run + * @returns query formatted for display or undefined + */ +export const metricQueries = ( + provider?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricProvider | null, + args: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Argument[] = [] +): string[] | undefined => { + if (provider === undefined || provider === null) { + return undefined; + } + const providerType = metricProvider(provider); + switch (providerType) { + case 'prometheus': + return [interpolateQuery(provider.prometheus.query, args)]; + case 'datadog': + return printableDatadogQuery(provider.datadog, args); + case 'wavefront': + return [interpolateQuery(provider.wavefront.query, args)]; + case 'newRelic': + return [interpolateQuery(provider.newRelic.query, args)]; + case 'cloudWatch': + return printableCloudWatchQuery(provider.cloudWatch); + case 'graphite': + return [interpolateQuery(provider.graphite.query, args)]; + case 'influxdb': + return [interpolateQuery(provider.influxdb.query, args)]; + case 'skywalking': + return [interpolateQuery(provider.skywalking.query, args)]; + // not currently supported: kayenta, web, job, plugin + default: + return undefined; + } +}; + +// Measurement Utils + +/** + * + * @param conditionKeys keys from success/fail conditions used in some cases to pull values from the measurement result + * @param measurements array of metric measurements + * @returns formatted measurement values and chart information if the metric can be charted + */ +export const transformMeasurements = (conditionKeys: string[], measurements?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement[]): MeasurementSetInfo => { + if (measurements === undefined || measurements.length === 0) { + return { + chartable: false, + min: 0, + max: null, + measurements: [], + }; + } + + return measurements.reduce( + ( + acc: {chartable: boolean; min: number; max: number | null; measurements: TransformedMeasurement[]}, + currMeasurement: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement + ) => { + const transformedValue = transformMeasurementValue(conditionKeys, currMeasurement.value); + const {canChart, tableValue} = transformedValue; + const canCompareToBoundaries = canChart && transformedValue.chartValue !== null && isFiniteNumber(transformedValue.chartValue ?? null); + + return { + chartable: acc.chartable && canChart, + min: canCompareToBoundaries ? Math.min(Number(transformedValue.chartValue), acc.min) : acc.min, + max: canCompareToBoundaries ? Math.max(Number(transformedValue.chartValue), acc.max ?? 0) : acc.max, + measurements: [ + ...acc.measurements, + { + ...currMeasurement, + chartValue: transformedValue.chartValue, + tableValue, + }, + ], + }; + }, + {chartable: true, min: 0, max: null, measurements: [] as TransformedMeasurement[]} + ); +}; + +/** + * + * @param value value to check for chartability + * @returns whether the data point can be added to a line chart (number or null) + */ +export const isChartable = (value: any): boolean => isFiniteNumber(value) || value === null; + +type FormattedMeasurementValue = number | string | null; + +/** + * + * @param value value to display + * @returns value formatted for display purposes + */ +export const formattedValue = (value: any): FormattedMeasurementValue => { + const isNum = isFiniteNumber(value); + return isNum ? roundNumber(Number(value)) : value?.toString() ?? null; +}; + +/** + * + * @param value measurement value number (examples: 4 or 4.05) + * @returns information about displaying the measurement value + */ +const formatNumberMeasurement = (value: number): MeasurementValueInfo => { + const displayValue = formattedValue(value); + return { + canChart: true, + chartValue: displayValue, + tableValue: displayValue, + }; +}; + +/** + * + * @param value measurement value array (examples: [4] or [null] or ['anything else']) + * @param accessor key by which to access measurement value + * @returns information about displaying the measurement value + */ +export const formatSingleItemArrayMeasurement = (value: FormattedMeasurementValue[], accessor: number): MeasurementValueInfo => { + if (isFiniteNumber(accessor)) { + const measurementValue = value?.[accessor] ?? null; + // if it's a number or null, chart it + if (isFiniteNumber(measurementValue) || measurementValue === null) { + const displayValue = formattedValue(measurementValue); + return { + canChart: isChartable(measurementValue), + chartValue: {[accessor]: displayValue}, + tableValue: {[accessor]: displayValue}, + }; + } + // if it exists, but it's not a good format, just put it in a table + return { + canChart: false, + tableValue: {[accessor]: measurementValue.toString()}, + }; + } + return { + canChart: false, + tableValue: value.toString(), + }; +}; + +/** + * + * @param value measurement value array (examples: [4,6,3,5] or [4,6,null,5] or [4,6,'a string',5]) + * @returns information about displaying the measurement value (charts a chartable first value, shows stringified value in table)) + */ +export const formatMultiItemArrayMeasurement = (value: FormattedMeasurementValue[]): MeasurementValueInfo => { + if (value.length === 0) { + return { + canChart: false, + tableValue: '', + }; + } + + const firstMeasurementValue = value[0]; + const canChartFirstValue = isChartable(firstMeasurementValue); + return { + canChart: canChartFirstValue, + ...(canChartFirstValue && {chartValue: formattedValue(firstMeasurementValue)}), + tableValue: value.map((v) => String(v)).toString(), + }; +}; + +/** + * + * @param value measurement value object (example: { key1: 5, key2: 154, key3: 'abc' } + * @param accessors keys by which to access measurement values + * @returns information about displaying the measurement value (returns TransformedObjectValue)) + */ +export const formatKeyValueMeasurement = (value: {[key: string]: FormattedMeasurementValue}, accessors: string[]): MeasurementValueInfo => { + const transformedValue: TransformedValueObject = {}; + let canChart = true; + accessors.forEach((accessor) => { + if (accessor in value) { + const measurementValue = value[accessor]; + const displayValue = formattedValue(measurementValue); + canChart = canChart && isChartable(measurementValue); + transformedValue[accessor] = displayValue; + } else { + transformedValue[accessor] = null; + } + }); + return { + canChart: canChart && !Object.values(transformedValue).every((v: FormattedMeasurementValue) => v === null), + chartValue: transformedValue, + tableValue: transformedValue, + }; +}; + +/** + * + * @param conditionKeys keys from success/fail conditions used in some cases to pull values from the measurement result + * @param value measurement value returned by provider + * @returns chart and table data along with a flag indicating whether the measurement value can be charted + */ +const transformMeasurementValue = (conditionKeys: string[], value?: string): MeasurementValueInfo => { + if (value === undefined || value === '') { + return { + canChart: true, + chartValue: null, + tableValue: null, + }; + } + + const parsedValue = JSON.parse(value); + + // single number measurement value + if (isFiniteNumber(parsedValue)) { + return formatNumberMeasurement(parsedValue); + } + + // single item array measurement value + if (Array.isArray(parsedValue) && parsedValue.length > 0 && conditionKeys.length === 1) { + const accessor = parseInt(conditionKeys[0]); + return formatSingleItemArrayMeasurement(parsedValue, accessor); + } + + // multi-item array measurement value + if (Array.isArray(parsedValue) && parsedValue.length > 0) { + return formatMultiItemArrayMeasurement(parsedValue); + } + + // key / value pairs measurement value + if (typeof parsedValue === 'object' && !Array.isArray(parsedValue) && conditionKeys.length > 0) { + return formatKeyValueMeasurement(parsedValue, conditionKeys); + } + + // unsupported formats are stringified and put into table + return { + canChart: false, + tableValue: parsedValue.toString(), + }; +}; diff --git a/ui/src/app/components/analysis-modal/types.ts b/ui/src/app/components/analysis-modal/types.ts new file mode 100644 index 0000000000..5b4479a16b --- /dev/null +++ b/ui/src/app/components/analysis-modal/types.ts @@ -0,0 +1,70 @@ +import { + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric, + GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult, +} from '../../../models/rollout/generated'; + +export enum AnalysisStatus { + Successful = 'Successful', + Error = 'Error', + Failed = 'Failed', + Running = 'Running', + Pending = 'Pending', + Inconclusive = 'Inconclusive', + Unknown = 'Unknown', // added by frontend +} + +export enum FunctionalStatus { + ERROR = 'ERROR', + INACTIVE = 'INACTIVE', + IN_PROGRESS = 'IN_PROGRESS', + SUCCESS = 'SUCCESS', + WARNING = 'WARNING', +} + +export type TransformedMetricStatus = GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1MetricResult & { + adjustedPhase: AnalysisStatus; + chartable: boolean; + chartMax: number | null; + chartMin: number; + statusLabel: string; + substatus?: FunctionalStatus.ERROR | FunctionalStatus.WARNING; + transformedMeasurements: TransformedMeasurement[]; +}; + +export type TransformedMetricSpec = GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Metric & { + failConditionLabel: string | null; + failThresholds: number[] | null; + queries?: string[]; + successConditionLabel: string | null; + successThresholds: number[] | null; + conditionKeys: string[]; +}; + +export type TransformedMetric = { + name: string; + spec?: TransformedMetricSpec; + status: TransformedMetricStatus; +}; + +export type TransformedValueObject = { + [key: string]: number | string | null; +}; + +export type TransformedMeasurement = GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Measurement & { + chartValue?: TransformedValueObject | number | string | null; + tableValue: TransformedValueObject | number | string | null; +}; + +export type MeasurementSetInfo = { + chartable: boolean; + max: number | null; + measurements: TransformedMeasurement[]; + min: number; +}; + +export type MeasurementValueInfo = { + canChart: boolean; + chartValue?: TransformedValueObject | number | string | null; + tableValue: TransformedValueObject | number | string | null; +}; diff --git a/ui/src/app/components/pods/pods.tsx b/ui/src/app/components/pods/pods.tsx index 1107a8444d..ec0d65eead 100644 --- a/ui/src/app/components/pods/pods.tsx +++ b/ui/src/app/components/pods/pods.tsx @@ -1,14 +1,16 @@ import * as React from 'react'; import * as moment from 'moment'; -import {Duration, Ticker} from 'argo-ui'; +import {DropDown, Duration} from 'argo-ui'; import {RolloutReplicaSetInfo} from '../../../models/rollout/generated'; import {ReplicaSetStatus, ReplicaSetStatusIcon} from '../status-icon/status-icon'; import './pods.scss'; -import {Dropdown, MenuProps, Tooltip} from 'antd'; +import {Tooltip} from 'antd'; + import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {IconDefinition, faCheck, faCircleNotch, faClipboard, faExclamationTriangle, faQuestionCircle, faTimes} from '@fortawesome/free-solid-svg-icons'; import {EllipsisMiddle} from '../ellipsis-middle/ellipsis-middle'; import {InfoItem} from '../info-item/info-item'; +import {Ticker} from '../ticker/ticker'; export enum PodStatus { Pending = 'pending', @@ -48,15 +50,11 @@ export const ReplicaSets = (props: {replicaSets: RolloutReplicaSetInfo[]; showRe return (
    - {replicaSets?.map( - (rsInfo) => - rsInfo.pods && - rsInfo.pods.length > 0 && ( -
    - -
    - ), - )} + {replicaSets?.map((rsInfo) => ( +
    + +
    + ))}
    ); }; @@ -84,9 +82,8 @@ export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boo Scaledown in - } - > - ) as any} icon='fa fa-clock'> + }> + ) as any} icon='fa fa-clock' /> ); }} @@ -97,40 +94,27 @@ export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boo )} - {props.rs.pods && props.rs.pods.length > 0 && ( -
    - {(props.rs?.pods || []).map((pod, i) => ( - -
    Status: {pod.status}
    -
    {pod.objectMeta?.name}
    -
    - } - /> - ))} -
    - )} +
    + {(props.rs?.pods || []).length > 0 + ? (props.rs?.pods || []).map((pod, i) => ( + +
    Status: {pod.status}
    +
    {pod.objectMeta?.name}
    +
    + } + /> + )) + : 'No Pods!'} + ); }; -const CopyMenu = (name: string): MenuProps['items'] => { - return [ - { - key: 1, - label: ( -
    navigator.clipboard.writeText(name)}> - Copy Name -
    - ), - }, - ]; -}; - export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; status: string; tooltip: React.ReactNode; customIcon?: IconDefinition}) => { let icon: IconDefinition; let spin = false; @@ -172,12 +156,18 @@ export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; st } return ( - - -
    - -
    -
    -
    + ( + +
    + +
    +
    + )}> +
    navigator.clipboard.writeText(name)}> + Copy Name +
    +
    ); }; diff --git a/ui/src/app/components/rollout/revision.tsx b/ui/src/app/components/rollout/revision.tsx index bd7f7410ce..394a3d09fe 100644 --- a/ui/src/app/components/rollout/revision.tsx +++ b/ui/src/app/components/rollout/revision.tsx @@ -1,16 +1,22 @@ import * as React from 'react'; +import * as moment from 'moment'; import {RolloutAnalysisRunInfo, RolloutExperimentInfo, RolloutReplicaSetInfo} from '../../../models/rollout/generated'; import {IconForTag} from '../../shared/utils/utils'; -import {PodWidget, ReplicaSets} from '../pods/pods'; +import {ReplicaSets} from '../pods/pods'; import {ImageInfo, parseImages} from './rollout'; import './rollout.scss'; import '../pods/pods.scss'; import {ConfirmButton} from '../confirm-button/confirm-button'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faChartBar, faChevronCircleDown, faChevronCircleUp, faUndoAlt} from '@fortawesome/free-solid-svg-icons'; -import {Button, Tooltip} from 'antd'; -import moment = require('moment'); +import {faChevronCircleDown, faChevronCircleUp, faUndoAlt} from '@fortawesome/free-solid-svg-icons'; +import {Button, Space, Tooltip, Typography} from 'antd'; import {InfoItemProps, InfoItemRow} from '../info-item/info-item'; +import {AnalysisModal} from '../analysis-modal/analysis-modal'; +import StatusIndicator from '../analysis-modal/status-indicator/status-indicator'; +import {AnalysisStatus} from '../analysis-modal/types'; +import {getAdjustedMetricPhase} from '../analysis-modal/transforms'; + +const {Text} = Typography; function formatTimestamp(ts: string): string { const inputFormat = 'YYYY-MM-DD HH:mm:ss Z z'; @@ -49,27 +55,25 @@ interface RevisionWidgetProps { initCollapsed?: boolean; rollback?: (revision: number) => void; current: boolean; - message: String; } -export const RevisionWidget = (props: RevisionWidgetProps) => { - const {revision, initCollapsed} = props; +export const RevisionWidget = ({current, initCollapsed, revision, rollback}: RevisionWidgetProps) => { const [collapsed, setCollapsed] = React.useState(initCollapsed); const icon = collapsed ? faChevronCircleDown : faChevronCircleUp; - const images = parseImages(revision.replicaSets); + const images = parseImages(revision.replicaSets ?? []); const hasPods = (revision.replicaSets || []).some((rs) => rs.pods?.length > 0); + return (
    Revision {revision.number}
    - {!props.current && props.rollback && ( + {!current && rollback && ( props.rollback(Number(revision.number))} + onClick={() => rollback(Number(revision.number))} type='default' icon={} - style={{fontSize: '13px', marginRight: '10px'}} - > + style={{fontSize: '13px', marginRight: '10px'}}> Rollback )} @@ -84,11 +88,9 @@ export const RevisionWidget = (props: RevisionWidgetProps) => { {(revision.analysisRuns || []).length > 0 && ( - -
    - -
    -
    +
    + +
    )}
    )} @@ -96,185 +98,67 @@ export const RevisionWidget = (props: RevisionWidgetProps) => { ); }; -const AnalysisRunWidget = (props: {analysisRuns: RolloutAnalysisRunInfo[]}) => { - const {analysisRuns} = props; - const [selection, setSelection] = React.useState(null); +const analysisName = (ar: RolloutAnalysisRunInfo): string => { + const temp = ar.objectMeta?.name?.split('-') ?? ''; + const len = temp.length; + return len < 2 ? 'Analysis' : `Analysis ${temp[len - 2] + '-' + temp[len - 1]}`; +}; + +interface AnalysisRunWidgetProps { + analysisRuns: RolloutAnalysisRunInfo[]; + images: ImageInfo[]; + revision: string; +} + +const AnalysisRunWidget = ({analysisRuns, images, revision}: AnalysisRunWidgetProps) => { + const [selectedAnalysis, setSelectedAnalysis] = React.useState(null); + const imageNames = images.map((img) => img.image); return (
    Analysis Runs
    - {analysisRuns.map((ar) => { - let temp = ar.objectMeta.name.split('-'); - let len = temp.length; - return ( - -
    - Name: {ar.objectMeta.name} -
    -
    - Created at: - {formatTimestamp(JSON.stringify(ar.objectMeta?.creationTimestamp))} -
    -
    - Status: - {ar.status} -
    - - } - > -
    - -
    -
    - ); - })} -
    - - {selection && ( - -
    - {selection.objectMeta?.name} - -
    - {selection?.jobs && ( -
    -
    - {selection.jobs.map((job) => { - return ( - -
    job-name: {job.objectMeta?.name}
    -
    StartedAt: {formatTimestamp(JSON.stringify(job.startedAt))}
    -
    Status: {job.status}
    -
    MetricName: {job.metricName}
    -
    - } - customIcon={faChartBar} - /> - ); - })} -
    - metric.name === selection.jobs[0].metricName) - .map((metric) => { - return ( - - {metric?.name && ( -
    - MetricName: {metric.name} -
    - )} - {metric?.successCondition && ( -
    - SuccessCondition: - {metric.successCondition} -
    - )} - {metric?.failureLimit && ( -
    - FailureLimit: {metric.failureLimit} -
    - )} - {metric?.inconclusiveLimit && ( -
    - InconclusiveLimit: - {metric.inconclusiveLimit} -
    - )} - {metric?.count && ( -
    - Count: - {metric.count} -
    - )} -
    - ); - })} - > - -
    -
    - )} - {selection?.nonJobInfo && ( -
    -
    - {selection.nonJobInfo.map((nonJob) => { - return ( - -
    Value: {JSON.stringify(JSON.parse(nonJob.value), null, 2)}
    -
    StartedAt: {formatTimestamp(JSON.stringify(nonJob.startedAt))}
    -
    Status: {nonJob.status}
    -
    MetricName: {nonJob.metricName}
    -
    - } - customIcon={faChartBar} - /> - ); - })} -
    - metric.name === selection.nonJobInfo[0].metricName) - .map((metric) => { - return ( - - {metric?.name && ( -
    - MetricName: {metric.name} -
    - )} - {metric?.successCondition && ( -
    - SuccessCondition: - {metric.successCondition} -
    - )} - {metric?.failureLimit && ( -
    - FailureLimit: {metric.failureLimit} -
    - )} - {metric?.inconclusiveLimit && ( -
    - InconclusiveLimit: - {metric.inconclusiveLimit} -
    - )} - {metric?.count && ( -
    - Count: - {metric.count} -
    - )} -
    - ); - })} - > - -
    + {analysisRuns.map((ar) => ( + +
    + Name: {ar.objectMeta.name} +
    +
    + Created at: + {formatTimestamp(JSON.stringify(ar.objectMeta?.creationTimestamp))} +
    +
    + Status: + {ar.status} +
    + + }> +
    +
    - )} - +
    + ))} +
    + {selectedAnalysis !== null && ( + ar.objectMeta.name === selectedAnalysis.objectMeta.name)} + analysisName={analysisName(selectedAnalysis)} + images={imageNames} + revision={revision} + open={selectedAnalysis !== null} + onClose={() => setSelectedAnalysis(null)} + /> )}
    ); diff --git a/ui/src/app/components/rollout/rollout.tsx b/ui/src/app/components/rollout/rollout.tsx index 317d223d2d..f26b22a9a7 100644 --- a/ui/src/app/components/rollout/rollout.tsx +++ b/ui/src/app/components/rollout/rollout.tsx @@ -159,7 +159,6 @@ export const RolloutWidget = (props: {rollout: RolloutRolloutInfo; interactive?: initCollapsed={false} rollback={interactive ? (r) => interactive.api.rolloutServiceUndoRollout({}, interactive.namespace, rollout.objectMeta.name, `${r}`) : null} current={i === 0} - message={rollout.message} /> ))}
    diff --git a/ui/src/app/components/ticker/ticker.tsx b/ui/src/app/components/ticker/ticker.tsx new file mode 100644 index 0000000000..6b07fc9cca --- /dev/null +++ b/ui/src/app/components/ticker/ticker.tsx @@ -0,0 +1,40 @@ +import * as moment from 'moment'; +import * as React from 'react'; +import {interval, Subscription} from 'rxjs'; + +export class Ticker extends React.Component<{intervalMs?: number; disabled?: boolean; children?: (time: moment.Moment) => React.ReactNode}, {time: moment.Moment}> { + private subscription: Subscription | null = null; + + constructor(props: {intervalMs?: number; children?: (time: moment.Moment) => React.ReactNode}) { + super(props); + this.state = {time: moment()}; + this.ensureSubscribed(); + } + + public render() { + return this.props.children && this.props.children(this.state.time); + } + + public componentDidUpdate() { + this.ensureSubscribed(); + } + + public componentWillUnmount() { + this.ensureUnsubscribed(); + } + + private ensureSubscribed() { + if (this.props.disabled) { + this.ensureUnsubscribed(); + } else if (!this.subscription) { + this.subscription = interval(this.props.intervalMs || 1000).subscribe(() => this.setState({time: moment()})); + } + } + + private ensureUnsubscribed() { + if (this.subscription != null) { + this.subscription.unsubscribe(); + this.subscription = null; + } + } +} diff --git a/ui/src/config/theme.ts b/ui/src/config/theme.ts index c377896a2e..ef2390a25c 100644 --- a/ui/src/config/theme.ts +++ b/ui/src/config/theme.ts @@ -1,15 +1,18 @@ -import { ThemeConfig } from 'antd/es/config-provider'; +import {ThemeConfig} from 'antd/es/config-provider'; export const theme: ThemeConfig = { - components: { - Button: { - colorPrimary: '#44505f', - colorPrimaryBgHover: '#626f7e', - colorPrimaryHover: '#626f7e', - colorPrimaryActive: '#626f7e', - borderRadius: 100, - borderRadiusSM: 100, - borderRadiusLG: 100 - } - } + components: { + Button: { + colorPrimary: '#44505f', + colorPrimaryBgHover: '#626f7e', + colorPrimaryHover: '#626f7e', + colorPrimaryActive: '#626f7e', + borderRadius: 100, + borderRadiusSM: 100, + borderRadiusLG: 100, + }, + }, + token: { + colorPrimary: '#44505f', + }, }; diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 26cd7a13fe..33aaf1dfd9 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -12,5 +12,6 @@ "allowSyntheticDefaultImports": true }, "include": ["./**/*"], - "exclude": ["node_modules", "./**/*.test.ts", "./**/*.test.tsx"] + "exclude": ["node_modules", "./**/*.test.tsx"], + "types": ["node", "jest"] } diff --git a/ui/yarn.lock b/ui/yarn.lock index 1db343cbbe..06695f961e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@ant-design/colors@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-7.0.0.tgz#eb7eecead124c3533aea05d61254f0a17f2b61b3" @@ -110,11 +118,24 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.4.tgz#03ae5af150be94392cb5c7ccd97db5a19a5da6aa" + integrity sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/compat-data@^7.12.1", "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== +"@babel/compat-data@^7.22.9": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== + "@babel/core@7.12.3": version "7.12.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" @@ -158,6 +179,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.11.6": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.3" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.12.1", "@babel/generator@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.2.tgz#d5773e8b557d421fd6ce0d5efa5fd7fc22567c30" @@ -167,6 +209,16 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.23.3", "@babel/generator@^7.23.4", "@babel/generator@^7.7.2": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.4.tgz#4a41377d8566ec18f807f42962a7f3551de83d1c" + integrity sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ== + dependencies: + "@babel/types" "^7.23.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -192,6 +244,17 @@ browserslist "^4.14.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.2.tgz#4e455b0329af29c2d3ad254b5dd5aed34595385d" @@ -226,6 +289,11 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -242,6 +310,14 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -257,6 +333,13 @@ "@babel/traverse" "^7.13.15" "@babel/types" "^7.13.16" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -271,6 +354,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" @@ -285,6 +375,17 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.2" +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -297,6 +398,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -323,6 +429,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -337,16 +450,38 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -366,6 +501,15 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" +"@babel/helpers@^7.23.2": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.4.tgz#7d2cfb969aa43222032193accd7329851facf3c1" + integrity sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.4" + "@babel/types" "^7.23.4" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -375,11 +519,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.2.tgz#0c1680aa44ad4605b16cbdcc5c341a61bde9c746" integrity sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ== +"@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.4.tgz#409fbe690c333bb70187e2de4021e1e47a026661" + integrity sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" @@ -635,6 +793,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -698,6 +863,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" @@ -1281,6 +1453,15 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" @@ -1295,6 +1476,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.23.3", "@babel/traverse@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.4.tgz#c2790f7edf106d059a0098770fe70801417f3f85" + integrity sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg== + dependencies: + "@babel/code-frame" "^7.23.4" + "@babel/generator" "^7.23.4" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.4" + "@babel/types" "^7.23.4" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.6", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" @@ -1303,6 +1500,15 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" +"@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.4.tgz#7206a1810fc512a7f7f7d4dace4cb4c1c9dbfb8e" + integrity sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1469,6 +1675,18 @@ jest-util "^26.6.2" slash "^3.0.0" +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + "@jest/core@^26.6.0", "@jest/core@^26.6.3": version "26.6.3" resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" @@ -1503,6 +1721,40 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/environment@^26.6.0", "@jest/environment@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" @@ -1513,6 +1765,31 @@ "@types/node" "*" jest-mock "^26.6.2" +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + "@jest/fake-timers@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" @@ -1525,6 +1802,18 @@ jest-mock "^26.6.2" jest-util "^26.6.2" +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + "@jest/globals@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" @@ -1534,6 +1823,16 @@ "@jest/types" "^26.6.2" expect "^26.6.2" +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + "@jest/reporters@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" @@ -1566,6 +1865,43 @@ optionalDependencies: node-notifier "^8.0.0" +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jest/source-map@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" @@ -1575,6 +1911,15 @@ graceful-fs "^4.2.4" source-map "^0.6.0" +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" @@ -1585,6 +1930,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^26.6.3": version "26.6.3" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" @@ -1596,6 +1951,16 @@ jest-runner "^26.6.3" jest-runtime "^26.6.3" +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + "@jest/transform@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" @@ -1617,6 +1982,27 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^26.6.0", "@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" @@ -1628,6 +2014,50 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -1818,6 +2248,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -1825,6 +2260,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" @@ -2015,6 +2464,17 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__generator@*": version "7.6.2" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" @@ -2042,6 +2502,57 @@ resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.9.tgz#d868b6febb02666330410fe7f58f3c4b8258be7b" integrity sha512-MNl+rT5UmZeilaPxAVs6YaPC2m6aA8rofviZbhbxpPpl61uKodfdQVsBtgJGTqGizEf02oW3tsVe7FYB8kK14A== +"@types/d3-array@^3.0.3": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.9.tgz#54feabd29d1f15940d422c16008c63c1e4e3d188" + integrity sha512-mZowFN3p64ajCJJ4riVYlOjNlBJv3hctgAY01pjw3qTnJePD8s9DZmYDzhHKvzfCYvdjwylkU38+Vdt7Cu2FDA== + +"@types/d3-color@*": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.2.tgz#7939eed011a908287cd1bcfd11580c17b2ac7f8a" + integrity sha512-At+Ski7dL8Bs58E8g8vPcFJc8tGcaC12Z4m07+p41+DRqnZQcAlp3NfYjLrhNYv+zEyQitU1CUxXNjqUyf+c0g== + +"@types/d3-ease@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.1.tgz#ef386d2f28602dba82206888047f97f7f7f7558a" + integrity sha512-VZofjpEt8HWv3nxUAosj5o/+4JflnJ7Bbv07k17VO3T2WRuzGdZeookfaF60iVh5RdhVG49LE5w6LIshVUC6rg== + +"@types/d3-interpolate@^3.0.1": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.3.tgz#e10c06c4bf11bd770ed56184a0d76cd516ff4ded" + integrity sha512-6OZ2EIB4lLj+8cUY7I/Cgn9Q+hLdA4DjJHYOQDiHL0SzqS1K9DL5xIOVBSIHgF+tiuO9MU1D36qvdIvRDRPh+Q== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.1.tgz#6171c9e388904014764661a37613e3c4ab8df22d" + integrity sha512-blRhp7ki7pVznM8k6lk5iUU9paDbVRVq+/xpf0RRgSJn5gr6SE7RcFtxooYGMBOc1RZiGyqRpVdu5AD0z0ooMA== + +"@types/d3-scale@^4.0.2": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.6.tgz#9d221949f37b90b52696ec99f9b1e972d55fe10d" + integrity sha512-lo3oMLSiqsQUovv8j15X4BNEDOsnHuGjeVg7GRbAuB2PUa1prK5BNSOu6xixgNf3nqxPl4I1BqJWrPvFGlQoGQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^3.1.0": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.4.tgz#748a256d5e499cdfb3e48beca9c557f3ea0ff15c" + integrity sha512-M2/xsWPsjaZc5ifMKp1EBp0gqJG0eO/zlldJNOC85Y/5DGsBQ49gDkRJ2h5GY7ZVD6KUumvZWsylSbvTaJTqKg== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.2.tgz#f4425b2ebcb04495a7b2390da03633ef1a8adbe5" + integrity sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg== + +"@types/d3-timer@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.1.tgz#8dac23292df0e559a3aa459d8efca78a734c3fbe" + integrity sha512-GGTvzKccVEhxmRfJEB6zhY9ieT4UhGVUIQaBzFpUO9OXy2ycAlnPCSJLzmGGgqt3KVjqN3QCQB4g1rsZnHsWhg== + "@types/eslint@^7.2.6": version "7.2.10" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.10.tgz#4b7a9368d46c0f8cd5408c23288a59aa2394d917" @@ -2075,6 +2586,13 @@ dependencies: "@types/node" "*" +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + "@types/history@*": version "4.7.8" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" @@ -2090,26 +2608,31 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" - integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^26.0.15": +"@types/jest@*": version "26.0.23" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7" integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA== @@ -2117,6 +2640,14 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" +"@types/jest@^29.5.10": + version "29.5.10" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.10.tgz#a10fc5bab9e426081c12b2ef73d24d4f0c9b7f50" + integrity sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -2133,9 +2664,11 @@ integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== "@types/node@*": - version "15.0.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.3.tgz#ee09fcaac513576474c327da5818d421b98db88a" - integrity sha512-/WbxFeBU+0F79z9RdEOXH4CsDga+ibi5M8uEYr91u3CkT/pdWcV8MCook+4wDPnZBexRdwWS+PiVZ2xJviAzcQ== + version "20.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" + integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== + dependencies: + undici-types "~5.26.4" "@types/node@^12.0.0": version "12.20.13" @@ -2283,14 +2816,21 @@ source-map "^0.6.0" "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" @@ -2712,10 +3252,10 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -2731,6 +3271,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + antd@^5.4.2: version "5.4.2" resolved "https://registry.yarnpkg.com/antd/-/antd-5.4.2.tgz#3923b96da76fc7276992e9fc0286ebb3a638e016" @@ -3145,6 +3690,19 @@ babel-jest@^26.6.0, babel-jest@^26.6.3: graceful-fs "^4.2.4" slash "^3.0.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-loader@8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" @@ -3174,6 +3732,17 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + babel-plugin-jest-hoist@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" @@ -3184,6 +3753,16 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" @@ -3266,6 +3845,14 @@ babel-preset-jest@^26.6.2: babel-plugin-jest-hoist "^26.6.2" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + babel-preset-react-app@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz#689b60edc705f8a70ce87f47ab0e560a317d7045" @@ -3439,7 +4026,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3538,6 +4125,23 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4 escalade "^3.1.1" node-releases "^1.1.71" +browserslist@^4.21.9: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== + dependencies: + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3713,6 +4317,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== +caniuse-lite@^1.0.30001541: + version "1.0.30001565" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz#a528b253c8a2d95d2b415e11d8b9942acc100c4f" + integrity sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3747,7 +4356,15 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -3819,6 +4436,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -3837,6 +4459,11 @@ cjs-module-lexer@^0.6.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3887,6 +4514,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -4111,6 +4747,11 @@ convert-source-map@^0.3.3: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4258,6 +4899,19 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4535,6 +5189,77 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -4595,6 +5320,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decimal.js@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" @@ -4610,6 +5340,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + deep-diff@^0.3.5: version "0.3.8" resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" @@ -4733,6 +5468,11 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -4808,6 +5548,13 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + dom-scroll-into-view@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.0.1.tgz#32abb92f0d8feca6215162aef43e4b449ab8d99c" @@ -4926,6 +5673,11 @@ electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.723: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== +electron-to-chromium@^1.4.535: + version "1.4.596" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.596.tgz#6752d1aa795d942d49dfc5d3764d6ea283fab1d7" + integrity sha512-zW3zbZ40Icb2BCWjm47nxwcFGYlIgdXkAx85XDO7cyky9J4QQfq8t0W19/TLZqq3JPQXtlv8BPIGmfa9Jb4scg== + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -4939,6 +5691,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emittery@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" @@ -5386,7 +6143,7 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -5489,6 +6246,17 @@ expect@^26.6.0, expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -5581,6 +6349,11 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-equals@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + fast-glob@^3.1.1, fast-glob@^3.2.4: version "3.2.5" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" @@ -5593,7 +6366,7 @@ fast-glob@^3.1.1, fast-glob@^3.2.4: micromatch "^4.0.2" picomatch "^2.2.1" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5885,11 +6658,21 @@ fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -5900,7 +6683,7 @@ gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6065,6 +6848,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -6183,6 +6971,13 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -6562,6 +7357,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -6692,6 +7492,13 @@ is-core-module@^2.0.0, is-core-module@^2.2.0: dependencies: has "^1.0.3" +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -6970,6 +7777,11 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" @@ -6980,6 +7792,28 @@ istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -7006,6 +7840,14 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -7015,6 +7857,15 @@ jest-changed-files@^26.6.2: execa "^4.0.0" throat "^5.0.0" +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + jest-circus@26.6.0: version "26.6.0" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" @@ -7042,6 +7893,32 @@ jest-circus@26.6.0: stack-utils "^2.0.2" throat "^5.0.0" +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-cli@^26.6.0: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" @@ -7061,6 +7938,23 @@ jest-cli@^26.6.0: prompts "^2.0.1" yargs "^15.4.1" +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + jest-config@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" @@ -7085,6 +7979,34 @@ jest-config@^26.6.3: micromatch "^4.0.2" pretty-format "^26.6.2" +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-diff@^26.0.0, jest-diff@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" @@ -7095,6 +8017,16 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-docblock@^26.0.0: version "26.0.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" @@ -7102,6 +8034,13 @@ jest-docblock@^26.0.0: dependencies: detect-newline "^3.0.0" +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + jest-each@^26.6.0, jest-each@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" @@ -7113,6 +8052,17 @@ jest-each@^26.6.0, jest-each@^26.6.2: jest-util "^26.6.2" pretty-format "^26.6.2" +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + jest-environment-jsdom@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" @@ -7138,11 +8088,28 @@ jest-environment-node@^26.6.2: jest-mock "^26.6.2" jest-util "^26.6.2" +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-haste-map@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" @@ -7164,6 +8131,25 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-jasmine2@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" @@ -7196,6 +8182,14 @@ jest-leak-detector@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" @@ -7206,6 +8200,16 @@ jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-message-util@^26.6.0, jest-message-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" @@ -7221,6 +8225,21 @@ jest-message-util@^26.6.0, jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" @@ -7229,6 +8248,15 @@ jest-mock@^26.6.2: "@jest/types" "^26.6.2" "@types/node" "*" +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" @@ -7239,6 +8267,11 @@ jest-regex-util@^26.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + jest-resolve-dependencies@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" @@ -7248,6 +8281,14 @@ jest-resolve-dependencies@^26.6.3: jest-regex-util "^26.0.0" jest-snapshot "^26.6.2" +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + jest-resolve@26.6.0: version "26.6.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" @@ -7276,6 +8317,21 @@ jest-resolve@^26.6.2: resolve "^1.18.1" slash "^3.0.0" +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + jest-runner@^26.6.0, jest-runner@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" @@ -7302,6 +8358,33 @@ jest-runner@^26.6.0, jest-runner@^26.6.3: source-map-support "^0.5.6" throat "^5.0.0" +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runtime@^26.6.0, jest-runtime@^26.6.3: version "26.6.3" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" @@ -7335,6 +8418,34 @@ jest-runtime@^26.6.0, jest-runtime@^26.6.3: strip-bom "^4.0.0" yargs "^15.4.1" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-serializer@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" @@ -7365,6 +8476,32 @@ jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: pretty-format "^26.6.2" semver "^7.3.2" +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + jest-util@^26.6.0, jest-util@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" @@ -7377,6 +8514,18 @@ jest-util@^26.6.0, jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" @@ -7389,6 +8538,18 @@ jest-validate@^26.6.2: leven "^3.1.0" pretty-format "^26.6.2" +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + jest-watch-typeahead@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" @@ -7415,6 +8576,20 @@ jest-watcher@^26.3.0, jest-watcher@^26.6.2: jest-util "^26.6.2" string-length "^4.0.1" +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + jest-worker@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" @@ -7432,6 +8607,16 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@26.6.0: version "26.6.0" resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" @@ -7441,6 +8626,16 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7562,6 +8757,11 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7766,7 +8966,7 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.memoize@^4.1.2: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -7861,6 +9061,18 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -7972,6 +9184,14 @@ micromatch@^4.0.0, micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -8347,6 +9567,11 @@ node-releases@^1.1.61, node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -8639,7 +9864,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -8751,7 +9976,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -8829,6 +10054,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8869,11 +10099,21 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8903,6 +10143,11 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -9670,6 +10915,15 @@ pretty-format@^26.0.0, pretty-format@^26.6.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9801,6 +11055,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -10725,7 +11984,7 @@ react-hot-loader@^3.1.3: redbox-react "^1.3.6" source-map "^0.6.1" -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.10.2, react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -10735,7 +11994,7 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.2.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== @@ -10748,7 +12007,7 @@ react-keyhooks@^0.2.3: "@types/react" "^16.9.3" react "^16.9.3" -react-lifecycles-compat@^3.0.0: +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -10778,6 +12037,13 @@ react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-resize-detector@^8.0.4: + version "8.1.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-8.1.0.tgz#1c7817db8bc886e2dbd3fbe3b26ea8e56be0524a" + integrity sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w== + dependencies: + lodash "^4.17.21" + react-router-dom@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" @@ -10903,6 +12169,14 @@ react-side-effect@^2.1.0: resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== +react-smooth@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.5.tgz#d153b7dffc7143d0c99e82db1532f8cf93f20ecd" + integrity sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA== + dependencies: + fast-equals "^5.0.0" + react-transition-group "2.9.0" + react-toastify@9.0.8: version "9.0.8" resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.0.8.tgz#3876c89fc6211a29027b3075010b5ec39ebe4f7e" @@ -10910,6 +12184,16 @@ react-toastify@9.0.8: dependencies: clsx "^1.1.1" +react-transition-group@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + dependencies: + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + react@^16.9.3: version "16.14.0" resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" @@ -11001,6 +12285,28 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.9.0.tgz#dde7531298cffe8677b1206967830d34f7972ea6" + integrity sha512-cVgiAU3W5UrA8nRRV/N0JrudgZzY/vjkzrlShbH+EFo1vs4nMlXgshZWLI0DfDLmn4/p4pF7Lq7F5PU+K94Ipg== + dependencies: + classnames "^2.2.5" + eventemitter3 "^4.0.1" + lodash "^4.17.19" + react-is "^16.10.2" + react-resize-detector "^8.0.4" + react-smooth "^2.0.4" + recharts-scale "^0.4.4" + tiny-invariant "^1.3.1" + victory-vendor "^36.6.8" + rechoir@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" @@ -11297,6 +12603,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + resolve@1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" @@ -11313,6 +12624,15 @@ resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.20.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -11602,6 +12922,11 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -11609,6 +12934,13 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: dependencies: lru-cache "^6.0.0" +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -11758,6 +13090,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -11875,6 +13212,14 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -12022,6 +13367,13 @@ stack-utils@^2.0.2: dependencies: escape-string-regexp "^2.0.0" +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + stackframe@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4" @@ -12123,6 +13475,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" @@ -12196,6 +13557,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -12279,6 +13647,13 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -12287,6 +13662,11 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svg-parser@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" @@ -12474,6 +13854,11 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== +tiny-invariant@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" @@ -12486,6 +13871,11 @@ tippy.js@^5.1.1: dependencies: popper.js "^1.16.0" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -12582,6 +13972,20 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + ts-loader@^8.0.17: version "8.2.0" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.2.0.tgz#6a3aeaa378aecda543e2ed2c332d3123841d52e0" @@ -12741,6 +14145,11 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12838,6 +14247,14 @@ upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -12956,6 +14373,15 @@ v8-to-istanbul@^7.0.0: convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -12988,6 +14414,26 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +victory-vendor@^36.6.8: + version "36.6.11" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.11.tgz#acae770717c2dae541a54929c304ecab5ab6ac2a" + integrity sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -13014,6 +14460,13 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + warning@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -13525,6 +14978,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -13540,6 +15002,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" @@ -13582,6 +15052,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -13613,6 +15088,11 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -13646,6 +15126,19 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From cac9455113d51bc8a9b936479abd036aa1cb790c Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Wed, 20 Dec 2023 18:13:03 +0200 Subject: [PATCH 145/264] docs: mention archival of the SMI spec (#3263) Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> --- docs/features/traffic-management/smi.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/features/traffic-management/smi.md b/docs/features/traffic-management/smi.md index c2008d9799..3f460be93c 100644 --- a/docs/features/traffic-management/smi.md +++ b/docs/features/traffic-management/smi.md @@ -3,6 +3,9 @@ !!! important Available since v0.9.0 +!!! warning + The Cloud Native Computing Foundation [has archived the SMI Spec](https://www.cncf.io/blog/2023/10/03/cncf-archives-the-service-mesh-interface-smi-project/). The recommended way forward is to look at the [Gateway API](https://gateway-api.sigs.k8s.io/), [Project Gamma](https://gateway-api.sigs.k8s.io/concepts/gamma/) and the [Argo Rollouts Gateway API Plugin](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-gatewayapi). + [Service Mesh Interface](https://smi-spec.io/) (SMI) is a standard interface for service meshes on Kubernetes leveraged by many Service Mesh implementations (like Linkerd). SMI offers this functionality through a set of CRDs, and the Argo Rollouts controller creates these resources to manipulate the traffic routing into the desired state. The Argo Rollout controller achieves traffic shaping by creating and manipulating the [TrafficSplit CR](https://github.com/servicemeshinterface/smi-spec/blob/master/traffic-split.md). A TrafficSplit describes the desired traffic routing for an application and relies on the underlying Service Meshes implement that desired state. Instead of worrying about the details of a specific service mesh, a user needs to specify a root Service that clients use to communicate and a list of backends consisting of a Service and weight. The Service Mesh implementing SMI uses this spec to route traffic to the backends Services based on the weights of the backends. For Rollout users, the Argo Rollout controller creates and manipulates the TrafficSplit using the following information: From b8a179fb121166e48cda184e1d1b3819b4722035 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 10:14:06 -0600 Subject: [PATCH 146/264] chore(deps): bump actions/upload-artifact from 3 to 4 (#3255) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e.yaml | 6 +++--- .github/workflows/go.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 39c9578148..15ea19c835 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Event File path: ${{ github.event_path }} @@ -85,13 +85,13 @@ jobs: [[ -f rerunreport.txt ]] && cat rerunreport.txt || echo "No rerun report found" - name: Upload E2E Test Results if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: E2E Test Results (k8s ${{ matrix.kubernetes-minor-version }}) path: | junit.xml - name: Upload e2e-controller logs - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: e2e-controller-k8s-${{ matrix.kubernetes-minor-version }}.log path: /tmp/e2e-controller.log diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d2d98e564c..8636f91e6e 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Event File path: ${{ github.event_path }} @@ -77,14 +77,14 @@ jobs: - name: Upload Unit Test Results if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Unit Test Results path: | junit.xml - name: Generate code coverage artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: code-coverage path: coverage.out From 3f0bb808ad5e1484755592425c4449df5864e637 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 10:14:37 -0600 Subject: [PATCH 147/264] chore(deps): bump github/codeql-action from 2 to 3 (#3252) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f9915287da..4116801130 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -31,7 +31,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 # Override language selection by uncommenting this and choosing your languages # with: # languages: go, javascript, csharp, python, cpp, java @@ -39,7 +39,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -53,4 +53,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 From 1ecd39461af23439ac84e4330057b2711a5b530e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:22:16 +0000 Subject: [PATCH 148/264] chore(deps): bump google.golang.org/grpc from 1.60.0 to 1.60.1 (#3260) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.60.0 to 1.60.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.60.0...v1.60.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b9ba1cef58..71a06cea65 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 - google.golang.org/grpc v1.60.0 + google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 diff --git a/go.sum b/go.sum index ae13e2c144..599336c90f 100644 --- a/go.sum +++ b/go.sum @@ -1061,8 +1061,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.60.0 h1:6FQAR0kM31P6MRdeluor2w2gPaS4SVNrD/DNTxrQ15k= -google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From c6c16d7c580449791a3184b696e83270ecedfcd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 09:19:24 -0600 Subject: [PATCH 149/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.32.0 to 1.32.1 (#3270) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.32.0 to 1.32.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.32.0...service/ec2/v1.32.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 71a06cea65..d43a7f4e64 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.26.1 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 599336c90f..7a0d1f9cb1 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrw github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0 h1:f426fLs4hcrLuczLBqWf1Ob6FKJhISaR4e9Iw3Scr5A= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.0/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 h1:IQ+uLXwS5Eelikc5ZdR0P55XPo+tqWh+k872KdpAjFA= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 h1:AKlGBk57mRssGQmWqV3I/azLW1Sb7RnlYbJEqTlpKEY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= From 0b00594447abc9cc5a7ffd56024a3115c7b024d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:19:56 -0600 Subject: [PATCH 150/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.5 to 1.26.6 (#3269) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.5 to 1.26.6. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.5...service/s3/v1.26.6) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d43a7f4e64..33dd7015ff 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.24.0 github.com/aws/aws-sdk-go-v2/config v1.26.1 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 diff --git a/go.sum b/go.sum index 7a0d1f9cb1..7bf066d40c 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsM github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 h1:IQ+uLXwS5Eelikc5ZdR0P55XPo+tqWh+k872KdpAjFA= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5 h1:AKlGBk57mRssGQmWqV3I/azLW1Sb7RnlYbJEqTlpKEY= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.5/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 h1:twI2uRmpbm0KBog3Ay61IqOtNp6+QxKfSA78zftME/o= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= From 7a68832aa02dc854c6afcd31f99c491277214a0c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:20:12 -0600 Subject: [PATCH 151/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.1 to 1.26.2 (#3268) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.1 to 1.26.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.1...config/v1.26.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 33dd7015ff..5f0e5835af 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.0 - github.com/aws/aws-sdk-go-v2/config v1.26.1 + github.com/aws/aws-sdk-go-v2/config v1.26.2 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 github.com/blang/semver v3.5.1+incompatible @@ -77,7 +77,7 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.13 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect @@ -87,7 +87,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 // indirect github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 7bf066d40c..233118f6a0 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.1 h1:z6DqMxclFGL3Zfo+4Q0rLnAZ6yVkzCRxhRMsiRQnD1o= -github.com/aws/aws-sdk-go-v2/config v1.26.1/go.mod h1:ZB+CuKHRbb5v5F0oJtGdhFTelmrxd4iWO1lf0rQwSAg= -github.com/aws/aws-sdk-go-v2/credentials v1.16.12 h1:v/WgB8NxprNvr5inKIiVVrXPuuTegM+K8nncFkr1usU= -github.com/aws/aws-sdk-go-v2/credentials v1.16.12/go.mod h1:X21k0FjEJe+/pauud82HYiQbEr9jRKY3kXEIQ4hXeTQ= +github.com/aws/aws-sdk-go-v2/config v1.26.2 h1:+RWLEIWQIGgrz2pBPAUoGgNGs1TOyF4Hml7hCnYj2jc= +github.com/aws/aws-sdk-go-v2/config v1.26.2/go.mod h1:l6xqvUxt0Oj7PI/SUXYLNyZ9T/yBPn3YTQcJLLOdtR8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.13 h1:WLABQ4Cp4vXtXfOWOS3MEZKr6AAYUpMczLhgKtAjQ/8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.13/go.mod h1:Qg6x82FXwW0sJHzYruxGiuApNo31UEtJvXVSZAXeWiw= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= @@ -121,8 +121,8 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 h1:ldSFWz9tEHAwHNmjx2Cvy1MjP5/L github.com/aws/aws-sdk-go-v2/service/sso v1.18.5/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 h1:2k9KmFawS63euAkY4/ixVNsYYwrwnd5fIvgEKkfZFNM= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.5 h1:5UYvv8JUvllZsRnfrcMQ+hJ9jNICmcgKPAO1CER25Wg= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.5/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 h1:HJeiuZ2fldpd0WqngyMR6KW7ofkXNLyOaHwEIGm39Cs= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.6/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From ede86a886f3d0e3e111f6973831d9678f75928cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Dec 2023 12:02:49 -0600 Subject: [PATCH 152/264] chore(deps): bump google.golang.org/protobuf from 1.31.0 to 1.32.0 (#3273) Bumps google.golang.org/protobuf from 1.31.0 to 1.32.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f0e5835af..df99645b25 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( golang.org/x/oauth2 v0.15.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 k8s.io/apiextensions-apiserver v0.26.11 diff --git a/go.sum b/go.sum index 233118f6a0..29c235fb00 100644 --- a/go.sum +++ b/go.sum @@ -1077,8 +1077,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= From 192009a272da4731305e051a3b2684e6244d1478 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Tue, 2 Jan 2024 09:59:54 -0600 Subject: [PATCH 153/264] fix: updates to replicas and pod template at the same time causes rollout to get stuck (#3272) * fix: fix the rollout stuck when pod/replicas changed together or canary strategy. Signed-off-by: Liming Liu * add one unit test case for empty canary service. Signed-off-by: Liming Liu * use rollout status to get the replicaset hash instead of service Signed-off-by: Zach Aller --------- Signed-off-by: Liming Liu Signed-off-by: Zach Aller Co-authored-by: Liming Liu --- rollout/canary.go | 7 +++++++ rollout/canary_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/rollout/canary.go b/rollout/canary.go index b443db507e..f37e03bab1 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -435,6 +435,13 @@ func (c *rolloutContext) reconcileCanaryReplicaSets() (bool, error) { return true, nil } + // If we have updated both the replica count and the pod template hash c.newRS will be nil we want to reconcile the newRS so we look at the + // rollout status to get the newRS to reconcile it. + if c.newRS == nil && c.rollout.Status.CurrentPodHash != c.rollout.Status.StableRS { + rs, _ := replicasetutil.GetReplicaSetByTemplateHash(c.allRSs, c.rollout.Status.CurrentPodHash) + c.newRS = rs + } + scaledNewRS, err := c.reconcileNewReplicaSet() if err != nil { return false, err diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 6fc3dda93c..d92cfd2c17 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -1,6 +1,7 @@ package rollout import ( + "context" "encoding/json" "fmt" "strconv" @@ -2009,3 +2010,46 @@ func TestIsDynamicallyRollingBackToStable(t *testing.T) { }) } } + +func TestCanaryReplicaAndSpecChangedTogether(t *testing.T) { + f := newFixture(t) + defer f.Close() + + originReplicas := 3 + r1 := newCanaryRollout("foo", originReplicas, nil, nil, nil, intstr.FromInt(1), intstr.FromInt(0)) + canarySVCName := "canary" + stableSVCName := "stable" + r1.Spec.Strategy.Canary.CanaryService = canarySVCName + r1.Spec.Strategy.Canary.StableService = stableSVCName + + stableRS := newReplicaSetWithStatus(r1, originReplicas, originReplicas) + stableSVC := newService(stableSVCName, 80, + map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: stableRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]}, r1) + + r2 := bumpVersion(r1) + canaryRS := newReplicaSetWithStatus(r2, originReplicas, originReplicas) + canarySVC := newService(canarySVCName, 80, + map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: canaryRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]}, r2) + + f.replicaSetLister = append(f.replicaSetLister, canaryRS, stableRS) + f.serviceLister = append(f.serviceLister, canarySVC, stableSVC) + + r3 := bumpVersion(r2) + r3.Spec.Replicas = pointer.Int32(int32(originReplicas) + 5) + r3.Status.StableRS = stableRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + r3.Status.CurrentPodHash = canaryRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + f.rolloutLister = append(f.rolloutLister, r3) + f.kubeobjects = append(f.kubeobjects, canaryRS, stableRS, canarySVC, stableSVC) + f.objects = append(f.objects, r3) + + ctrl, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := ctrl.newRolloutContext(r3) + assert.NoError(t, err) + err = roCtx.reconcile() + assert.NoError(t, err) + updated, err := f.kubeclient.AppsV1().ReplicaSets(r3.Namespace).Get(context.Background(), canaryRS.Name, metav1.GetOptions{}) + assert.NoError(t, err) + // check the canary one is updated + assert.NotEqual(t, originReplicas, int(*updated.Spec.Replicas)) +} From 0fab0f2afbd1e7bbd985f76e2ee73bb84a7db6de Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Tue, 2 Jan 2024 12:08:04 -0600 Subject: [PATCH 154/264] chore: remove year from codegen license (#3282) * chore: run codegen in 2024 Signed-off-by: Zach Aller * chore: remove year from codegen Signed-off-by: Zach Aller * chore: remove year from codegen Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- hack/custom-boilerplate.go.txt | 2 -- pkg/apis/rollouts/v1alpha1/generated.pb.go | 2 -- pkg/apis/rollouts/v1alpha1/generated.proto | 2 -- pkg/apis/rollouts/v1alpha1/openapi_generated.go | 2 -- 4 files changed, 8 deletions(-) diff --git a/hack/custom-boilerplate.go.txt b/hack/custom-boilerplate.go.txt index e4cd20e380..2b7dbd2b46 100644 --- a/hack/custom-boilerplate.go.txt +++ b/hack/custom-boilerplate.go.txt @@ -1,6 +1,4 @@ /* -Copyright YEAR The Kubernetes sample-controller Authors. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 7588a653a7..a3fd1dd33d 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -1,6 +1,4 @@ /* -Copyright 2023 The Kubernetes sample-controller Authors. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 57152d87ec..1612197d8b 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1,6 +1,4 @@ /* -Copyright 2023 The Kubernetes sample-controller Authors. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 3b9937ded9..122afd311e 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -2,8 +2,6 @@ // +build !ignore_autogenerated /* -Copyright 2023 The Kubernetes sample-controller Authors. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at From c5ef3dc69968630fb7515f9edb8b0305cdbc4b0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 10:49:18 -0600 Subject: [PATCH 155/264] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.24.0 to 1.24.1 (#3291) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.24.0 to 1.24.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.24.0...v1.24.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index df99645b25..fb5b9d9711 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.24.0 + github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.2 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 diff --git a/go.sum b/go.sum index 29c235fb00..f679da432e 100644 --- a/go.sum +++ b/go.sum @@ -91,8 +91,8 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.24.0 h1:890+mqQ+hTpNuw0gGP6/4akolQkSToDJgHfQE7AwGuk= -github.com/aws/aws-sdk-go-v2 v1.24.0/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= +github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= github.com/aws/aws-sdk-go-v2/config v1.26.2 h1:+RWLEIWQIGgrz2pBPAUoGgNGs1TOyF4Hml7hCnYj2jc= github.com/aws/aws-sdk-go-v2/config v1.26.2/go.mod h1:l6xqvUxt0Oj7PI/SUXYLNyZ9T/yBPn3YTQcJLLOdtR8= github.com/aws/aws-sdk-go-v2/credentials v1.16.13 h1:WLABQ4Cp4vXtXfOWOS3MEZKr6AAYUpMczLhgKtAjQ/8= From 39732ce7c83e5be466374504c6b261b4877842d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 10:49:35 -0600 Subject: [PATCH 156/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.6 to 1.26.7 (#3290) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.6 to 1.26.7. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.6...service/s3/v1.26.7) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index fb5b9d9711..fcfbdd1716 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.2 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.7.0 @@ -79,8 +79,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.16.13 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect diff --git a/go.sum b/go.sum index f679da432e..311eb5555c 100644 --- a/go.sum +++ b/go.sum @@ -100,17 +100,17 @@ github.com/aws/aws-sdk-go-v2/credentials v1.16.13/go.mod h1:Qg6x82FXwW0sJHzYruxG github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9 h1:v+HbZaCGmOwnTTVS86Fleq0vPzOd7tnJGbFhP0stNLs= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.9/go.mod h1:Xjqy+Nyj7VDLBtCMkQYOw1QYfAEZCVLrfI0ezve8wd4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9 h1:N94sVhRACtXyVcjXxrwK1SKFIJrA9pOJ5yu2eSHnmls= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.9/go.mod h1:hqamLz7g1/4EJP+GH5NBhcUMLjW+gKLQabgyz6/7WAU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 h1:IQ+uLXwS5Eelikc5ZdR0P55XPo+tqWh+k872KdpAjFA= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6 h1:twI2uRmpbm0KBog3Ay61IqOtNp6+QxKfSA78zftME/o= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.6/go.mod h1:Tpt4kC8x1HfYuh2rG/6yXZrxjABETERrUl9IdA/IS98= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 h1:ystNRv96lPnlDFU/K3O4/erHR+kPaiDbDGi/192uXQ4= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= From d02a05f1f15162c2e96ddf722bfb56cf686cf994 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:21:00 +0000 Subject: [PATCH 157/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.2 to 1.26.3 (#3289) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.2 to 1.26.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.2...config/v1.26.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index fcfbdd1716..249a65c9cd 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 - github.com/aws/aws-sdk-go-v2/config v1.26.2 + github.com/aws/aws-sdk-go-v2/config v1.26.3 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible @@ -77,17 +77,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.13 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.14 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 311eb5555c..c9bd9fd333 100644 --- a/go.sum +++ b/go.sum @@ -93,12 +93,12 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.2 h1:+RWLEIWQIGgrz2pBPAUoGgNGs1TOyF4Hml7hCnYj2jc= -github.com/aws/aws-sdk-go-v2/config v1.26.2/go.mod h1:l6xqvUxt0Oj7PI/SUXYLNyZ9T/yBPn3YTQcJLLOdtR8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.13 h1:WLABQ4Cp4vXtXfOWOS3MEZKr6AAYUpMczLhgKtAjQ/8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.13/go.mod h1:Qg6x82FXwW0sJHzYruxGiuApNo31UEtJvXVSZAXeWiw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10 h1:w98BT5w+ao1/r5sUuiH6JkVzjowOKeOJRHERyy1vh58= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.10/go.mod h1:K2WGI7vUvkIv1HoNbfBA1bvIZ+9kL3YVmWxeKuLQsiw= +github.com/aws/aws-sdk-go-v2/config v1.26.3 h1:dKuc2jdp10y13dEEvPqWxqLoc0vF3Z9FC45MvuQSxOA= +github.com/aws/aws-sdk-go-v2/config v1.26.3/go.mod h1:Bxgi+DeeswYofcYO0XyGClwlrq3DZEXli0kLf4hkGA0= +github.com/aws/aws-sdk-go-v2/credentials v1.16.14 h1:mMDTwwYO9A0/JbOCOG7EOZHtYM+o7OfGWfu0toa23VE= +github.com/aws/aws-sdk-go-v2/credentials v1.16.14/go.mod h1:cniAUh3ErQPHtCQGPT5ouvSAQ0od8caTO9OOuufZOAE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= @@ -113,16 +113,16 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 h1:ystNRv96l github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9 h1:Nf2sHxjMJR8CSImIVCONRi4g0Su3J+TSTbS7G0pUeMU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.9/go.mod h1:idky4TER38YIjr2cADF1/ugFMKvZV7p//pVeV5LZbF0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.5 h1:ldSFWz9tEHAwHNmjx2Cvy1MjP5/L9kNoR0skc6wyOOM= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.5/go.mod h1:CaFfXLYL376jgbP7VKC96uFcU8Rlavak0UlAwk1Dlhc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5 h1:2k9KmFawS63euAkY4/ixVNsYYwrwnd5fIvgEKkfZFNM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.5/go.mod h1:W+nd4wWDVkSUIox9bacmkBP5NMFQeTJ/xqNabpzSR38= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.6 h1:HJeiuZ2fldpd0WqngyMR6KW7ofkXNLyOaHwEIGm39Cs= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.6/go.mod h1:XX5gh4CB7wAs4KhcF46G6C8a2i7eupU19dcAAE+EydU= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 h1:dGrs+Q/WzhsiUKh82SfTVN66QzyulXuMDTV/G8ZxOac= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.6/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6 h1:Yf2MIo9x+0tyv76GljxzqA3WtC5mw7NmazD2chwjxE4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= From feda353e2ee171a46cee0ed61e64d21db8e3252e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:55:11 +0000 Subject: [PATCH 158/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.32.1 to 1.32.2 (#3288) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.32.1 to 1.32.2. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.32.1...service/ec2/v1.32.2) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 249a65c9cd..6a0a7281ee 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.3 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index c9bd9fd333..860cde8804 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2m github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1 h1:IQ+uLXwS5Eelikc5ZdR0P55XPo+tqWh+k872KdpAjFA= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.1/go.mod h1:G63GKqSBLpBmO3tN1/PwM2NC65XvSd00zJWTZk202bc= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 h1:vQfCIHSDouEvbE4EuDrlCGKcrtABEqF3cMt61nGEV4g= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 h1:ystNRv96lPnlDFU/K3O4/erHR+kPaiDbDGi/192uXQ4= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= From 99ae20c0ffdfd2543856561fd528fcd51b4fb0a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:20:39 -0600 Subject: [PATCH 159/264] chore(deps): bump golang.org/x/oauth2 from 0.15.0 to 0.16.0 (#3294) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.15.0 to 0.16.0. - [Commits](https://github.com/golang/oauth2/compare/v0.15.0...v0.16.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 6a0a7281ee..efd2d317b1 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.15.0 + golang.org/x/oauth2 v0.16.0 google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.32.0 @@ -173,11 +173,11 @@ require ( github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.0 // indirect diff --git a/go.sum b/go.sum index 860cde8804..ceef3c9149 100644 --- a/go.sum +++ b/go.sum @@ -707,8 +707,8 @@ golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -793,8 +793,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -802,8 +802,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -885,8 +885,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -894,8 +894,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From bc992a3fe082e6dc19529194b331d7134928257d Mon Sep 17 00:00:00 2001 From: Leegin <114397475+Leegin-darknight@users.noreply.github.com> Date: Fri, 12 Jan 2024 00:49:21 +0530 Subject: [PATCH 160/264] docs: Fixed the key for headers in prometheus based argo analysis (#3306) Signed-off-by: Leegin <114397475+Leegin-darknight@users.noreply.github.com> --- docs/analysis/prometheus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/analysis/prometheus.md b/docs/analysis/prometheus.md index b64ed5d06b..cb93bf0e5d 100644 --- a/docs/analysis/prometheus.md +++ b/docs/analysis/prometheus.md @@ -23,7 +23,7 @@ spec: # timeout is expressed in seconds timeout: 40 headers: - - name: X-Scope-Org-ID + - key: X-Scope-OrgID value: tenant_a query: | sum(irate( From 180b4bffcd7d4e14821463830b371f8f13864af7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Jan 2024 20:28:41 -0600 Subject: [PATCH 161/264] chore(deps): bump github.com/evanphx/json-patch/v5 from 5.7.0 to 5.8.0 (#3309) Bumps [github.com/evanphx/json-patch/v5](https://github.com/evanphx/json-patch) from 5.7.0 to 5.8.0. - [Release notes](https://github.com/evanphx/json-patch/releases) - [Commits](https://github.com/evanphx/json-patch/compare/v5.7.0...v5.8.0) --- updated-dependencies: - dependency-name: github.com/evanphx/json-patch/v5 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index efd2d317b1..77aa7fae8e 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 - github.com/evanphx/json-patch/v5 v5.7.0 + github.com/evanphx/json-patch/v5 v5.8.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index ceef3c9149..9c6063d59c 100644 --- a/go.sum +++ b/go.sum @@ -202,8 +202,8 @@ github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.7.0 h1:nJqP7uwL84RJInrohHfW0Fx3awjbm8qZeFv0nW9SYGc= -github.com/evanphx/json-patch/v5 v5.7.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= +github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= From d9f985310fdf54d6d22bc54d97800127bc309041 Mon Sep 17 00:00:00 2001 From: Regina Scott <50851526+reginapizza@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:40:31 +0000 Subject: [PATCH 162/264] chore: update follow-redirects to 1.15.5 (#3314) update follow-redirects to 1.15.5 Signed-off-by: Regina Scott --- ui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/yarn.lock b/ui/yarn.lock index 06695f961e..c8fbf6b82b 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -6529,9 +6529,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== for-in@^1.0.2: version "1.0.2" From db0c8d4a87658399c0615ab3d23c22361c5399e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:00:37 -0600 Subject: [PATCH 163/264] chore(deps): bump actions/cache from 3 to 4 (#3315) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2e.yaml | 2 +- .github/workflows/go.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 15ea19c835..8587e74426 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -60,7 +60,7 @@ jobs: sudo chmod 755 ~/.kube/config kubectl version kubectl create ns argo-rollouts - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 8636f91e6e..d8ce7bf844 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -60,7 +60,7 @@ jobs: uses: actions/checkout@v4 - name: Restore go build cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/go-build key: ${{ runner.os }}-go-build-v1-${{ github.run_id }} @@ -112,15 +112,15 @@ jobs: run: | mkdir -p ~/go/src/github.com/argoproj ln -s $(pwd) ~/go/src/github.com/argoproj/argo-rollouts - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: /home/runner/.cache/go-build key: GOCACHE-${{ hashFiles('**/go.mod') }} - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: /home/runner/go/pkg/mod key: GOMODCACHE-${{ hashFiles('**/go.mod') }} - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: /home/runner/go/bin key: go-bin-v1-${{ hashFiles('**/go.mod') }} From c688dd89a7f883c8c004b4024b390104b5be5770 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:00:55 -0600 Subject: [PATCH 164/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.3 to 1.26.4 (#3313) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.3 to 1.26.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.3...config/v1.26.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 77aa7fae8e..582d469d4d 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 - github.com/aws/aws-sdk-go-v2/config v1.26.3 + github.com/aws/aws-sdk-go-v2/config v1.26.4 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible @@ -77,7 +77,7 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.14 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.15 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect @@ -86,7 +86,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect github.com/aws/smithy-go v1.19.0 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index 9c6063d59c..5b570b1ea6 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.3 h1:dKuc2jdp10y13dEEvPqWxqLoc0vF3Z9FC45MvuQSxOA= -github.com/aws/aws-sdk-go-v2/config v1.26.3/go.mod h1:Bxgi+DeeswYofcYO0XyGClwlrq3DZEXli0kLf4hkGA0= -github.com/aws/aws-sdk-go-v2/credentials v1.16.14 h1:mMDTwwYO9A0/JbOCOG7EOZHtYM+o7OfGWfu0toa23VE= -github.com/aws/aws-sdk-go-v2/credentials v1.16.14/go.mod h1:cniAUh3ErQPHtCQGPT5ouvSAQ0od8caTO9OOuufZOAE= +github.com/aws/aws-sdk-go-v2/config v1.26.4 h1:Juj7LhtxNudNUlfX22K5AnLafO+v4eq9PA3VWSCIQs4= +github.com/aws/aws-sdk-go-v2/config v1.26.4/go.mod h1:tioqQ7wvxMYnTDpoTTLHhV3Zh+z261i/f2oz+ds8eNI= +github.com/aws/aws-sdk-go-v2/credentials v1.16.15 h1:P0/m1LU08MF2kRzx4P//+7lNjiJod1z4xI2WpWhdpTQ= +github.com/aws/aws-sdk-go-v2/credentials v1.16.15/go.mod h1:pgtMCf7Dx4GWw5EpHOTc2Sy17LIP0A0N2C9nQ83pQ/0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= @@ -119,8 +119,8 @@ github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2 github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 h1:dGrs+Q/WzhsiUKh82SfTVN66QzyulXuMDTV/G8ZxOac= github.com/aws/aws-sdk-go-v2/service/sso v1.18.6/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6 h1:Yf2MIo9x+0tyv76GljxzqA3WtC5mw7NmazD2chwjxE4= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= From 31fe59bc0848e68d1a64b912449c3f6a8f85af50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 09:16:31 -0600 Subject: [PATCH 165/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.4 to 1.26.5 (#3319) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.4 to 1.26.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.4...config/v1.26.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 582d469d4d..9bf897e095 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 - github.com/aws/aws-sdk-go-v2/config v1.26.4 + github.com/aws/aws-sdk-go-v2/config v1.26.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible @@ -77,7 +77,7 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.15 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect @@ -85,7 +85,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect github.com/aws/smithy-go v1.19.0 // indirect diff --git a/go.sum b/go.sum index 5b570b1ea6..5c8709929c 100644 --- a/go.sum +++ b/go.sum @@ -93,10 +93,10 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.4 h1:Juj7LhtxNudNUlfX22K5AnLafO+v4eq9PA3VWSCIQs4= -github.com/aws/aws-sdk-go-v2/config v1.26.4/go.mod h1:tioqQ7wvxMYnTDpoTTLHhV3Zh+z261i/f2oz+ds8eNI= -github.com/aws/aws-sdk-go-v2/credentials v1.16.15 h1:P0/m1LU08MF2kRzx4P//+7lNjiJod1z4xI2WpWhdpTQ= -github.com/aws/aws-sdk-go-v2/credentials v1.16.15/go.mod h1:pgtMCf7Dx4GWw5EpHOTc2Sy17LIP0A0N2C9nQ83pQ/0= +github.com/aws/aws-sdk-go-v2/config v1.26.5 h1:lodGSevz7d+kkFJodfauThRxK9mdJbyutUxGq1NNhvw= +github.com/aws/aws-sdk-go-v2/config v1.26.5/go.mod h1:DxHrz6diQJOc9EwDslVRh84VjjrE17g+pVZXUeSxaDU= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= @@ -117,8 +117,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIG github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.6 h1:dGrs+Q/WzhsiUKh82SfTVN66QzyulXuMDTV/G8ZxOac= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.6/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= From 07355a0720f4ebc938f47eede07050e12337889b Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 24 Jan 2024 15:43:13 -0600 Subject: [PATCH 166/264] fix: keep rs inormer updated upon updating labels and annotations (#3321) * fix: keep rs inormer updated upon updating labels and annotations Signed-off-by: Zach Aller * give error some context Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/ephemeralmetadata.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rollout/ephemeralmetadata.go b/rollout/ephemeralmetadata.go index 92fc5d2670..60b745ed29 100644 --- a/rollout/ephemeralmetadata.go +++ b/rollout/ephemeralmetadata.go @@ -2,6 +2,7 @@ package rollout import ( "context" + "fmt" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -81,9 +82,13 @@ func (c *rolloutContext) syncEphemeralMetadata(ctx context.Context, rs *appsv1.R } // 2. Update ReplicaSet so that any new pods it creates will have the metadata - _, err = c.kubeclientset.AppsV1().ReplicaSets(modifiedRS.Namespace).Update(ctx, modifiedRS, metav1.UpdateOptions{}) + rs, err = c.kubeclientset.AppsV1().ReplicaSets(modifiedRS.Namespace).Update(ctx, modifiedRS, metav1.UpdateOptions{}) if err != nil { - return err + return fmt.Errorf("error updating replicaset in syncEphemeralMetadata: %w", err) + } + err = c.replicaSetInformer.GetIndexer().Update(rs) + if err != nil { + return fmt.Errorf("error updating replicaset informer in syncEphemeralMetadata: %w", err) } c.log.Infof("synced ephemeral metadata %v to ReplicaSet %s", podMetadata, rs.Name) return nil From d77d18930870eb80c15e91b056ba2d791de39f85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:59:22 -0600 Subject: [PATCH 167/264] chore(deps): bump google.golang.org/grpc from 1.60.1 to 1.61.0 (#3325) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.60.1 to 1.61.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.60.1...v1.61.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 49 +++++++++++++++++++++---------------------------- 2 files changed, 31 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index 9bf897e095..a0a9d7cbe2 100644 --- a/go.mod +++ b/go.mod @@ -37,8 +37,8 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.16.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 - google.golang.org/grpc v1.60.1 + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 + google.golang.org/grpc v1.61.0 google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 @@ -58,7 +58,7 @@ require ( ) require ( - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/PagerDuty/go-pagerduty v1.7.0 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 // indirect @@ -112,14 +112,14 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.4 // indirect + github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/gregdel/pushover v1.2.1 // indirect @@ -183,10 +183,10 @@ require ( golang.org/x/tools v0.12.0 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect - google.golang.org/api v0.132.0 // indirect + google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect + google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 5c8709929c..044296f657 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= @@ -162,11 +162,7 @@ github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEM github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -196,7 +192,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -326,8 +321,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= github.com/google/go-github/v53 v53.0.0 h1:T1RyHbSnpHYnoF0ZYKiIPSgPtuJ8G6vgc0MKodXsQDQ= @@ -349,16 +345,16 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= @@ -703,7 +699,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= @@ -786,7 +781,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= @@ -817,7 +811,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -996,8 +990,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.132.0 h1:8t2/+qZ26kAOGSmOiHwVycqVaDg7q3JDILrNi/Z6rvc= -google.golang.org/api v0.132.0/go.mod h1:AeTBC6GpJnJSRJjktDcPX0QwtS8pGYZOV6MSuSCusw0= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1038,12 +1032,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= -google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 h1:6GQBEOdGkX6MMTLT9V+TjtIRZCw9VPD5Z+yHY9wMgS0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1060,9 +1054,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 6dd961a479b7a657393f49bebf27333e3bcd319b Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 25 Jan 2024 09:48:17 -0600 Subject: [PATCH 168/264] fix: log rs name when update fails (#3318) fix logging rs name when update fails Signed-off-by: Zach Aller --- rollout/sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollout/sync.go b/rollout/sync.go index a37627f680..7ec692154e 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -380,7 +380,7 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, rs, err = c.kubeclientset.AppsV1().ReplicaSets(rsCopy.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) if err != nil { - return scaled, rs, fmt.Errorf("error updating replicaset %s: %w", rs.Name, err) + return scaled, rs, fmt.Errorf("error updating replicaset %s: %w", rsCopy.Name, err) } err = c.replicaSetInformer.GetIndexer().Update(rs) if err != nil { From 1a332e340ab98a7b4bd0e17abae818b112a4d68a Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 25 Jan 2024 10:09:09 -0600 Subject: [PATCH 169/264] chore: add logging context around replicaset updates (#3326) * chore: add more logging Signed-off-by: Zach Aller * chore: remove accidental files Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/bluegreen.go | 8 ++++++-- rollout/canary.go | 10 +++++++--- rollout/replicaset.go | 4 ++-- rollout/sync.go | 11 +++++++---- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/rollout/bluegreen.go b/rollout/bluegreen.go index f1bcf7a7bb..9904de9dab 100644 --- a/rollout/bluegreen.go +++ b/rollout/bluegreen.go @@ -1,6 +1,7 @@ package rollout import ( + "fmt" "math" "sort" @@ -22,7 +23,7 @@ func (c *rolloutContext) rolloutBlueGreen() error { } c.newRS, err = c.getAllReplicaSetsAndSyncRevision(true) if err != nil { - return err + return fmt.Errorf("failed to getAllReplicaSetsAndSyncRevision in rolloutBlueGreen create true: %w", err) } // This must happen right after the new replicaset is created @@ -82,6 +83,9 @@ func (c *rolloutContext) reconcileBlueGreenStableReplicaSet(activeSvc *corev1.Se c.log.Infof("Reconciling stable ReplicaSet '%s'", activeRS.Name) _, _, err := c.scaleReplicaSetAndRecordEvent(activeRS, defaults.GetReplicasOrDefault(c.rollout.Spec.Replicas)) + if err != nil { + return fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in reconcileBlueGreenStableReplicaSet: %w", err) + } return err } @@ -243,7 +247,7 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForBlueGreen(oldRSs []*appsv1.Re // Scale down. _, _, err = c.scaleReplicaSetAndRecordEvent(targetRS, desiredReplicaCount) if err != nil { - return false, err + return false, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in scaleDownOldReplicaSetsForBlueGreen: %w", err) } hasScaled = true } diff --git a/rollout/canary.go b/rollout/canary.go index f37e03bab1..a003b092a3 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -1,6 +1,7 @@ package rollout import ( + "fmt" "sort" appsv1 "k8s.io/api/apps/v1" @@ -21,14 +22,14 @@ func (c *rolloutContext) rolloutCanary() error { if replicasetutil.PodTemplateOrStepsChanged(c.rollout, c.newRS) { c.newRS, err = c.getAllReplicaSetsAndSyncRevision(false) if err != nil { - return err + return fmt.Errorf("failed to getAllReplicaSetsAndSyncRevision in rolloutCanary with PodTemplateOrStepsChanged: %w", err) } return c.syncRolloutStatusCanary() } c.newRS, err = c.getAllReplicaSetsAndSyncRevision(true) if err != nil { - return err + return fmt.Errorf("failed to getAllReplicaSetsAndSyncRevision in rolloutCanary create true: %w", err) } err = c.podRestarter.Reconcile(c) @@ -110,6 +111,9 @@ func (c *rolloutContext) reconcileCanaryStableReplicaSet() (bool, error) { _, desiredStableRSReplicaCount = replicasetutil.CalculateReplicaCountsForTrafficRoutedCanary(c.rollout, c.rollout.Status.Canary.Weights) } scaled, _, err := c.scaleReplicaSetAndRecordEvent(c.stableRS, desiredStableRSReplicaCount) + if err != nil { + return scaled, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in reconcileCanaryStableReplicaSet:L %w", err) + } return scaled, err } @@ -230,7 +234,7 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli // Scale down. _, _, err = c.scaleReplicaSetAndRecordEvent(targetRS, desiredReplicaCount) if err != nil { - return totalScaledDown, err + return totalScaledDown, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in scaleDownOldReplicaSetsForCanary: %w", err) } scaleDownCount := *targetRS.Spec.Replicas - desiredReplicaCount maxScaleDown -= scaleDownCount diff --git a/rollout/replicaset.go b/rollout/replicaset.go index 912417ca1a..c16ce6f037 100644 --- a/rollout/replicaset.go +++ b/rollout/replicaset.go @@ -174,7 +174,7 @@ func (c *rolloutContext) reconcileNewReplicaSet() (bool, error) { scaled, _, err := c.scaleReplicaSetAndRecordEvent(c.newRS, newReplicasCount) if err != nil { - return scaled, err + return scaled, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in reconcileNewReplicaSet: %w", err) } revision, _ := replicasetutil.Revision(c.newRS) @@ -279,7 +279,7 @@ func (c *rolloutContext) cleanupUnhealthyReplicas(oldRSs []*appsv1.ReplicaSet) ( } _, updatedOldRS, err := c.scaleReplicaSetAndRecordEvent(targetRS, newReplicasCount) if err != nil { - return nil, totalScaledDown, err + return nil, totalScaledDown, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in cleanupUnhealthyReplicas: %w", err) } totalScaledDown += scaledDownCount oldRSs[i] = updatedOldRS diff --git a/rollout/sync.go b/rollout/sync.go index 7ec692154e..167430a702 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -283,7 +283,7 @@ func (c *rolloutContext) syncReplicasOnly() error { var err error c.newRS, err = c.getAllReplicaSetsAndSyncRevision(false) if err != nil { - return err + return fmt.Errorf("failed to getAllReplicaSetsAndSyncRevision in syncReplicasOnly: %w", err) } newStatus := c.rollout.Status.DeepCopy() @@ -296,7 +296,7 @@ func (c *rolloutContext) syncReplicasOnly() error { if err := c.reconcileBlueGreenReplicaSets(activeSvc); err != nil { // If we get an error while trying to scale, the rollout will be requeued // so we can abort this resync - return err + return fmt.Errorf("failed to reconcileBlueGreenReplicaSets in syncReplicasOnly: %w", err) } activeRS, _ := replicasetutil.GetReplicaSetByTemplateHash(c.allRSs, newStatus.BlueGreen.ActiveSelector) if activeRS != nil { @@ -314,7 +314,7 @@ func (c *rolloutContext) syncReplicasOnly() error { if _, err := c.reconcileCanaryReplicaSets(); err != nil { // If we get an error while trying to scale, the rollout will be requeued // so we can abort this resync - return err + return fmt.Errorf("failed to reconcileCanaryReplicaSets in syncReplicasOnly: %w", err) } newStatus.AvailableReplicas = replicasetutil.GetAvailableReplicaCountForReplicaSets(c.allRSs) newStatus.HPAReplicas = replicasetutil.GetActualReplicaCountForReplicaSets(c.allRSs) @@ -330,7 +330,7 @@ func (c *rolloutContext) isScalingEvent() (bool, error) { var err error c.newRS, err = c.getAllReplicaSetsAndSyncRevision(false) if err != nil { - return false, err + return false, fmt.Errorf("failed to getAllReplicaSetsAndSyncRevision in isScalingEvent: %w", err) } for _, rs := range controller.FilterActiveReplicaSets(c.allRSs) { @@ -357,6 +357,9 @@ func (c *rolloutContext) scaleReplicaSetAndRecordEvent(rs *appsv1.ReplicaSet, ne scalingOperation = "down" } scaled, newRS, err := c.scaleReplicaSet(rs, newScale, c.rollout, scalingOperation) + if err != nil { + return scaled, newRS, fmt.Errorf("failed to scaleReplicaSet in scaleReplicaSetAndRecordEvent: %w", err) + } return scaled, newRS, err } From a07417ac6ca7bb2e7290948751d1da8f050db90b Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Thu, 25 Jan 2024 13:39:10 -0600 Subject: [PATCH 170/264] chore: bump notification engine lib (#3327) * chore: bump notification engine lib Signed-off-by: Zach Aller * chore: bump notification engine lib Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- docs/generated/notification-services/awssqs.md | 6 +++--- docs/generated/notification-services/github.md | 2 +- .../generated/notification-services/googlechat.md | 2 +- docs/generated/notification-services/opsgenie.md | 4 ++-- docs/generated/notification-services/pagerduty.md | 12 ++++++------ .../notification-services/pagerduty_v2.md | 2 +- docs/generated/notification-services/slack.md | 14 +++++++++----- docs/generated/notification-services/teams.md | 2 +- docs/generated/notification-services/webhook.md | 15 ++++++++++++--- go.mod | 2 +- go.sum | 4 ++-- 11 files changed, 39 insertions(+), 26 deletions(-) diff --git a/docs/generated/notification-services/awssqs.md b/docs/generated/notification-services/awssqs.md index 6bbc47cbbc..6b744f4744 100755 --- a/docs/generated/notification-services/awssqs.md +++ b/docs/generated/notification-services/awssqs.md @@ -4,10 +4,10 @@ This notification service is capable of sending simple messages to AWS SQS queue. -* `queue` - name of the queue you are intending to send messages to. Can be overwriten with target destination annotation. +* `queue` - name of the queue you are intending to send messages to. Can be overridden with target destination annotation. * `region` - region of the sqs queue can be provided via env variable AWS_DEFAULT_REGION * `key` - optional, aws access key must be either referenced from a secret via variable or via env variable AWS_ACCESS_KEY_ID -* `secret` - optional, aws access secret must be either referenced from a secret via variableor via env variable AWS_SECRET_ACCESS_KEY +* `secret` - optional, aws access secret must be either referenced from a secret via variable or via env variable AWS_SECRET_ACCESS_KEY * `account` optional, external accountId of the queue * `endpointUrl` optional, useful for development with localstack @@ -63,7 +63,7 @@ stringData: ### Minimal configuration using AWS Env variables -Ensure following list of enviromental variable is injected via OIDC, or other method. And assuming SQS is local to the account. +Ensure following list of environment variables are injected via OIDC, or other method. And assuming SQS is local to the account. You may skip usage of secret for sensitive data and omit other parameters. (Setting parameters via ConfigMap takes precedent.) Variables: diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index 913efef6ec..be76ab150d 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -87,5 +87,5 @@ template.app-deployed: | - If `github.repoURLPath` and `github.revisionPath` are same as above, they can be omitted. - Automerge is optional and `true` by default for github deployments to ensure the requested ref is up to date with the default branch. Setting this option to `false` is required if you would like to deploy older refs in your default branch. - For more information see the [Github Deployment API Docs](https://docs.github.com/en/rest/deployments/deployments?apiVersion=2022-11-28#create-a-deployment). + For more information see the [GitHub Deployment API Docs](https://docs.github.com/en/rest/deployments/deployments?apiVersion=2022-11-28#create-a-deployment). - If `github.pullRequestComment.content` is set to 65536 characters or more, it will be truncated. diff --git a/docs/generated/notification-services/googlechat.md b/docs/generated/notification-services/googlechat.md index fa3bdce8da..885ce685a4 100755 --- a/docs/generated/notification-services/googlechat.md +++ b/docs/generated/notification-services/googlechat.md @@ -89,7 +89,7 @@ It is possible send both simple text and card messages in a chat thread by speci ```yaml template.app-sync-succeeded: | - message: The app {{ .app.metadata.name }} has succesfully synced! + message: The app {{ .app.metadata.name }} has successfully synced! googlechat: threadKey: {{ .app.metadata.name }} ``` diff --git a/docs/generated/notification-services/opsgenie.md b/docs/generated/notification-services/opsgenie.md index 665d0081e7..c590a4ac97 100755 --- a/docs/generated/notification-services/opsgenie.md +++ b/docs/generated/notification-services/opsgenie.md @@ -12,8 +12,8 @@ To be able to send notifications with argocd-notifications you have to create an 8. Give your integration a name, copy the "API key" and safe it somewhere for later 9. Make sure the checkboxes for "Create and Update Access" and "enable" are selected, disable the other checkboxes to remove unnecessary permissions 10. Click "Safe Integration" at the bottom -11. Check your browser for the correct server apiURL. If it is "app.opsgenie.com" then use the us/international api url `api.opsgenie.com` in the next step, otherwise use `api.eu.opsgenie.com` (european api). -12. You are finished with configuring opsgenie. Now you need to configure argocd-notifications. Use the apiUrl, the team name and the apiKey to configure the opsgenie integration in the `argocd-notifications-secret` secret. +11. Check your browser for the correct server apiURL. If it is "app.opsgenie.com" then use the US/international api url `api.opsgenie.com` in the next step, otherwise use `api.eu.opsgenie.com` (European API). +12. You are finished with configuring opsgenie. Now you need to configure argocd-notifications. Use the apiUrl, the team name and the apiKey to configure the Opsgenie integration in the `argocd-notifications-secret` secret. ```yaml apiVersion: v1 diff --git a/docs/generated/notification-services/pagerduty.md b/docs/generated/notification-services/pagerduty.md index 0e1ab96533..3b507e7fdb 100755 --- a/docs/generated/notification-services/pagerduty.md +++ b/docs/generated/notification-services/pagerduty.md @@ -1,17 +1,17 @@ -# Pagerduty +# PagerDuty ## Parameters -The Pagerduty notification service is used to create pagerduty incidents and requires specifying the following settings: +The PagerDuty notification service is used to create PagerDuty incidents and requires specifying the following settings: -* `pagerdutyToken` - the pagerduty auth token +* `pagerdutyToken` - the PagerDuty auth token * `from` - email address of a valid user associated with the account making the request. * `serviceID` - The ID of the resource. ## Example -The following snippet contains sample Pagerduty service configuration: +The following snippet contains sample PagerDuty service configuration: ```yaml apiVersion: v1 @@ -35,7 +35,7 @@ data: ## Template -[Notification templates](../templates.md) support specifying subject for pagerduty notifications: +[Notification templates](../templates.md) support specifying subject for PagerDuty notifications: ```yaml apiVersion: v1 @@ -62,5 +62,5 @@ apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: annotations: - notifications.argoproj.io/subscribe.on-rollout-aborted.pagerduty: "" + notifications.argoproj.io/subscribe.on-rollout-aborted.pagerduty: "" ``` diff --git a/docs/generated/notification-services/pagerduty_v2.md b/docs/generated/notification-services/pagerduty_v2.md index 21e8d942e4..01eee28fc0 100755 --- a/docs/generated/notification-services/pagerduty_v2.md +++ b/docs/generated/notification-services/pagerduty_v2.md @@ -74,5 +74,5 @@ apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: annotations: - notifications.argoproj.io/subscribe.on-rollout-aborted.pagerdutyv2: "" + notifications.argoproj.io/subscribe.on-rollout-aborted.pagerdutyv2: "" ``` diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 15937597c1..0f3fdf1739 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -6,11 +6,15 @@ If you want to send message using incoming webhook, you can use [webhook](./webh The Slack notification service configuration includes following settings: -* `token` - the app token -* `apiURL` - optional, the server url, e.g. https://example.com/api -* `username` - optional, the app username -* `icon` - optional, the app icon, e.g. :robot_face: or https://example.com/image.png -* `insecureSkipVerify` - optional bool, true or false +| **Option** | **Required** | **Type** | **Description** | **Example** | +| -------------------- | ------------ | -------------- | --------------- | ----------- | +| `apiURL` | False | `string` | The server URL. | `https://example.com/api` | +| `channels` | False | `list[string]` | | `["my-channel-1", "my-channel-2"]` | +| `icon` | False | `string` | The app icon. | `:robot_face:` or `https://example.com/image.png` | +| `insecureSkipVerify` | False | `bool` | | `true` | +| `signingSecret` | False | `string` | | `8f742231b10e8888abcd99yyyzzz85a5` | +| `token` | **True** | `string` | The app's OAuth access token. | `xoxb-1234567890-1234567890123-5n38u5ed63fgzqlvuyxvxcx6` | +| `username` | False | `string` | The app username. | `argocd` | ## Configuration diff --git a/docs/generated/notification-services/teams.md b/docs/generated/notification-services/teams.md index b5b9a228c4..8b8c6b819c 100755 --- a/docs/generated/notification-services/teams.md +++ b/docs/generated/notification-services/teams.md @@ -113,7 +113,7 @@ template.app-sync-succeeded: | ### summary field -You can set a summary of the message that will be shown on Notifcation & Activity Feed +You can set a summary of the message that will be shown on Notification & Activity Feed ![](https://user-images.githubusercontent.com/6957724/116587921-84c4d480-a94d-11eb-9da4-f365151a12e7.jpg) diff --git a/docs/generated/notification-services/webhook.md b/docs/generated/notification-services/webhook.md index bd45b1f69e..9650984022 100755 --- a/docs/generated/notification-services/webhook.md +++ b/docs/generated/notification-services/webhook.md @@ -1,7 +1,7 @@ # Webhook The webhook notification service allows sending a generic HTTP request using the templatized request body and URL. -Using Webhook you might trigger a Jenkins job, update Github commit status. +Using Webhook you might trigger a Jenkins job, update GitHub commit status. ## Parameters @@ -9,8 +9,17 @@ The Webhook notification service configuration includes following settings: - `url` - the url to send the webhook to - `headers` - optional, the headers to pass along with the webhook -- `basicAuth` - optional, the basic authentication to pass along with the webook +- `basicAuth` - optional, the basic authentication to pass along with the webhook - `insecureSkipVerify` - optional bool, true or false +- `retryWaitMin` - Optional, the minimum wait time between retries. Default value: 1s. +- `retryWaitMax` - Optional, the maximum wait time between retries. Default value: 5s. +- `retryMax` - Optional, the maximum number of retries. Default value: 3. + +## Retry Behavior + +The webhook service will automatically retry the request if it fails due to network errors or if the server returns a 5xx status code. The number of retries and the wait time between retries can be configured using the `retryMax`, `retryWaitMin`, and `retryWaitMax` parameters. + +The wait time between retries is between `retryWaitMin` and `retryWaitMax`. If all retries fail, the `Send` method will return an error. ## Configuration @@ -67,7 +76,7 @@ metadata: ## Examples -### Set Github commit status +### Set GitHub commit status ```yaml apiVersion: v1 diff --git a/go.mod b/go.mod index a0a9d7cbe2..80001b1f8c 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/antonmedv/expr v1.15.5 - github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee + github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.5 diff --git a/go.sum b/go.sum index 044296f657..5b4b5431ad 100644 --- a/go.sum +++ b/go.sum @@ -81,8 +81,8 @@ github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4J github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee h1:ZYILioq4v6OIsr7uh0Pcx7JY4KpJ9qs8qbjRqM6HWMY= -github.com/argoproj/notifications-engine v0.4.1-0.20231011160156-2d2d1a75dbee/go.mod h1:VG9FXG0ddIVGc7NcSTRapaUjCPCYqOji//z6mmBYwCE= +github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 h1:MYlXNoATpyNCYXlh0iMs1xd2Q+VWzNbl8Zg6G/lQjKQ= +github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1/go.mod h1:E/vv4+by868m0mmflaRfGBmKBtAupoF+mmyfekP8QCk= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= From ae3a53a2dee686d6e35ce464ed27acefa464ce9b Mon Sep 17 00:00:00 2001 From: Nauris Sadovskis Date: Fri, 26 Jan 2024 19:12:40 +0100 Subject: [PATCH 171/264] feat: Add support for aggregator type in DataDog metric provider (#3293) * Add ability to select metric aggregator Signed-off-by: Nauris * Add check and tests Signed-off-by: Nauris * extra codegen Signed-off-by: Nauris * aggregator: switch to using enum Signed-off-by: Nauris * aggregator: add test for validating enum values Signed-off-by: Nauris * aggregator: add test for default value Signed-off-by: Nauris * docs: add a section on overriding default aggregator Signed-off-by: Nauris * Update docs/analysis/datadog.md Co-authored-by: mitchell amihod Signed-off-by: Nauris --------- Signed-off-by: Nauris Co-authored-by: mitchell amihod --- docs/analysis/datadog.md | 24 + .../features/kustomize/rollout_cr_schema.json | 45 + manifests/crds/analysis-run-crd.yaml | 13 + manifests/crds/analysis-template-crd.yaml | 13 + .../crds/cluster-analysis-template-crd.yaml | 13 + manifests/install.yaml | 39 + metricproviders/datadog/datadog.go | 14 +- metricproviders/datadog/datadog_test.go | 40 + pkg/apiclient/rollout/rollout.swagger.json | 4 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 4 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1095 +++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 5 + .../rollouts/v1alpha1/openapi_generated.go | 7 + ui/src/models/rollout/generated/api.ts | 6 + 14 files changed, 790 insertions(+), 532 deletions(-) diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index adfcd0d146..7bca70be10 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -150,6 +150,30 @@ However, empty query results yielding a `nil` value can be handled using the `de successCondition: default(result, 0) < 0.05 ``` +#### Metric aggregation (v2 only) + +By default, Datadog analysis run is configured to use `last` metric aggregator when querying Datadog v2 API. This value can be overriden by specifying a new `aggregator` value from a list of supported aggregators (`avg,min,max,sum,last,percentile,mean,l2norm,area`) for the V2 API ([docs](https://docs.datadoghq.com/api/latest/metrics/#query-scalar-data-across-multiple-products)). + +For example, using count-based distribution metric (`count:metric{*}.as_count()`) with values `1,9,3,7,5` in a given `interval` will make `last` aggregator return `5`. To return a sum of all values (`25`), set `aggregator: sum` in Datadog provider block and use `moving_rollup()` function to aggregate values in the specified rollup interval. These functions can be combined in a `formula` to perform additional calculations: + +```yaml +... + metrics: + - name: error-percentage + interval: 30s + successCondition: default(result, 0) < 5 + failureLimit: 3 + provider: + datadog: + apiVersion: v2 + interval: 5m + aggregator: sum # override default aggregator + queries: + a: count:requests.errors{service:my-service}.as_count() + b: count:requests{service:my-service}.as_count() + formula: "moving_rollup(a, 300, 'sum') / moving_rollup(b, 300, 'sum') * 100" # percentage of requests with errors +``` + #### Templates and Helm Helm and Argo Rollouts both try to parse things between `{{ ... }}` when rendering templates. If you use Helm to deliver your manifests, you will need to escape `{{ args.whatever }}`. Using the example above, here it is set up for Helm: diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index ee80d008cd..815298b254 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -243,6 +243,21 @@ }, "datadog": { "properties": { + "aggregator": { + "default": "last", + "enum": [ + "avg", + "min", + "max", + "sum", + "last", + "percentile", + "mean", + "l2norm", + "area" + ], + "type": "string" + }, "apiVersion": { "default": "v1", "enum": [ @@ -4861,6 +4876,21 @@ }, "datadog": { "properties": { + "aggregator": { + "default": "last", + "enum": [ + "avg", + "min", + "max", + "sum", + "last", + "percentile", + "mean", + "l2norm", + "area" + ], + "type": "string" + }, "apiVersion": { "default": "v1", "enum": [ @@ -9479,6 +9509,21 @@ }, "datadog": { "properties": { + "aggregator": { + "default": "last", + "enum": [ + "avg", + "min", + "max", + "sum", + "last", + "percentile", + "mean", + "l2norm", + "area" + ], + "type": "string" + }, "apiVersion": { "default": "v1", "enum": [ diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index ac5f15a519..18af57ec8c 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -178,6 +178,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index fa3b525ee4..9dbaa69c65 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -174,6 +174,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 82c9643111..9fadaef522 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -174,6 +174,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: diff --git a/manifests/install.yaml b/manifests/install.yaml index 35287a8188..c1829c0f80 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -179,6 +179,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: @@ -3300,6 +3313,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: @@ -6307,6 +6333,19 @@ spec: type: object datadog: properties: + aggregator: + default: last + enum: + - avg + - min + - max + - sum + - last + - percentile + - mean + - l2norm + - area + type: string apiVersion: default: v1 enum: diff --git a/metricproviders/datadog/datadog.go b/metricproviders/datadog/datadog.go index 0924f4cdd3..48b60fc0f3 100644 --- a/metricproviders/datadog/datadog.go +++ b/metricproviders/datadog/datadog.go @@ -188,7 +188,7 @@ func (p *Provider) createRequest(dd *v1alpha1.DatadogMetric, now int64, interval dd.Queries = map[string]string{"query": dd.Query} } - return p.createRequestV2(dd.Queries, dd.Formula, now, interval, url) + return p.createRequestV2(dd.Queries, dd.Formula, now, interval, dd.Aggregator, url) } func (p *Provider) createRequestV1(query string, now int64, interval int64, url *url.URL) (*http.Request, error) { @@ -201,11 +201,11 @@ func (p *Provider) createRequestV1(query string, now int64, interval int64, url return &http.Request{Method: "GET"}, nil } -func buildQueriesPayload(queries map[string]string) []map[string]string { +func buildQueriesPayload(queries map[string]string, aggregator string) []map[string]string { qp := make([]map[string]string, 0, len(queries)) for k, v := range queries { p := map[string]string{ - "aggregator": "last", + "aggregator": aggregator, "data_source": "metrics", "name": k, "query": v, @@ -215,7 +215,7 @@ func buildQueriesPayload(queries map[string]string) []map[string]string { return qp } -func (p *Provider) createRequestV2(queries map[string]string, formula string, now int64, interval int64, url *url.URL) (*http.Request, error) { +func (p *Provider) createRequestV2(queries map[string]string, formula string, now int64, interval int64, aggregator string, url *url.URL) (*http.Request, error) { formulas := []map[string]string{} // ddAPI supports multiple formulas but doesn't make sense in our context // can't have a 'blank' formula, so have to guard @@ -229,7 +229,7 @@ func (p *Provider) createRequestV2(queries map[string]string, formula string, no // Datadog requires milliseconds for v2 api From: (now - interval) * 1000, To: now * 1000, - Queries: buildQueriesPayload(queries), + Queries: buildQueriesPayload(queries, aggregator), Formulas: formulas, } @@ -411,6 +411,10 @@ func validateIncomingProps(dd *v1alpha1.DatadogMetric) error { return errors.New("When multiple queries are provided you must include a formula.") } + if dd.ApiVersion == "v1" && dd.Aggregator != "" { + return errors.New("Aggregator is not supported in v1. Please review the Analysis Template.") + } + return nil } diff --git a/metricproviders/datadog/datadog_test.go b/metricproviders/datadog/datadog_test.go index 50513d8e13..fe817f385e 100644 --- a/metricproviders/datadog/datadog_test.go +++ b/metricproviders/datadog/datadog_test.go @@ -52,6 +52,26 @@ func TestDatadogSpecDefaults(t *testing.T) { defaultInterval := string(ddSpec.Properties["interval"].Default.Raw) assert.Equal(t, "\"5m\"", defaultInterval, "Default interval should be \"5m\" ") }) + + t.Run("aggregator: Validate enum exists to restrict aggregator to 9 options", func(t *testing.T) { + aggregatorEnums := ddSpec.Properties["aggregator"].Enum + assert.Equal(t, 9, len(aggregatorEnums), "Expecting 9 enum options") + assert.Equal(t, "\"avg\"", string(aggregatorEnums[0].Raw), "\"avg\" expected, got %s", string(aggregatorEnums[0].Raw)) + assert.Equal(t, "\"min\"", string(aggregatorEnums[1].Raw), "\"min\" expected, got %s", string(aggregatorEnums[1].Raw)) + assert.Equal(t, "\"max\"", string(aggregatorEnums[2].Raw), "\"max\" expected, got %s", string(aggregatorEnums[2].Raw)) + assert.Equal(t, "\"sum\"", string(aggregatorEnums[3].Raw), "\"sum\" expected, got %s", string(aggregatorEnums[3].Raw)) + assert.Equal(t, "\"last\"", string(aggregatorEnums[4].Raw), "\"last\" expected, got %s", string(aggregatorEnums[4].Raw)) + assert.Equal(t, "\"percentile\"", string(aggregatorEnums[5].Raw), "\"percentile\" expected, got %s", string(aggregatorEnums[5].Raw)) + assert.Equal(t, "\"mean\"", string(aggregatorEnums[6].Raw), "\"mean\" expected, got %s", string(aggregatorEnums[6].Raw)) + assert.Equal(t, "\"l2norm\"", string(aggregatorEnums[7].Raw), "\"l2norm\" expected, got %s", string(aggregatorEnums[7].Raw)) + assert.Equal(t, "\"area\"", string(aggregatorEnums[8].Raw), "\"area\" expected, got %s", string(aggregatorEnums[8].Raw)) + }) + + t.Run("aggregator: Validate default is last", func(t *testing.T) { + defaultAggregator := string(ddSpec.Properties["aggregator"].Default.Raw) + assert.Equal(t, "\"last\"", defaultAggregator, "Default aggregator should be \"last\" ") + }) + } func TestValidateIncomingProps(t *testing.T) { @@ -104,6 +124,15 @@ func TestValidateIncomingProps(t *testing.T) { }, expectedErrorMessage: "Formula are only valid when queries are set", }, + { + name: "v1 query with aggregator", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v1", + Query: "foo", + Aggregator: "sum", + }, + expectedErrorMessage: "Aggregator is not supported in v1. Please review the Analysis Template.", + }, { name: "More than 1 queries with no formula", metric: &v1alpha1.DatadogMetric{ @@ -131,6 +160,17 @@ func TestValidateIncomingProps(t *testing.T) { }, expectedErrorMessage: "", }, + { + name: "valid queries with v2 and an aggregator", + metric: &v1alpha1.DatadogMetric{ + ApiVersion: "v2", + Query: "", + Queries: map[string]string{"a": "sum:api_gateway.request.count{*}.as_count()", "b": "fish bike"}, + Formula: "a + b", + Aggregator: "avg", + }, + expectedErrorMessage: "", + }, } for _, test := range tests { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index eb114c003c..092d8798a7 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1181,6 +1181,10 @@ "apiVersion": { "type": "string", "title": "ApiVersion refers to the Datadog API version being used (default: v1). v1 will eventually be deprecated.\n+kubebuilder:validation:Enum=v1;v2\n+kubebuilder:default=v1" + }, + "aggregator": { + "type": "string", + "title": "+kubebuilder:default=\"last\"\n+kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area\nAggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2" } } }, diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index af47a99222..3fe7664680 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -582,4 +582,8 @@ type DatadogMetric struct { // +kubebuilder:validation:Enum=v1;v2 // +kubebuilder:default=v1 ApiVersion string `json:"apiVersion,omitempty" protobuf:"bytes,5,opt,name=apiVersion"` + // +kubebuilder:default="last" + // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area + // Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2 + Aggregator string `json:"aggregator,omitempty" protobuf:"bytes,6,opt,name=aggregator"` } diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index a3fd1dd33d..12f65842ce 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3320,533 +3320,534 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8404 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6f, 0x6c, 0x24, 0xc9, - 0x75, 0x18, 0x7e, 0xcd, 0xe1, 0x90, 0x33, 0x8f, 0x5c, 0x92, 0x5b, 0xbb, 0xab, 0xe3, 0xf1, 0xee, - 0x76, 0x4e, 0x7d, 0xfe, 0xdd, 0x6f, 0xcf, 0x3a, 0x91, 0xd2, 0xde, 0x5d, 0x72, 0xd2, 0x29, 0x97, - 0xcc, 0x90, 0xbb, 0xb7, 0xdc, 0x23, 0x77, 0xb9, 0x6f, 0xb8, 0xb7, 0xb6, 0xa4, 0xb3, 0xd5, 0x9c, - 0x29, 0x0e, 0x7b, 0x39, 0xd3, 0x3d, 0xea, 0xee, 0xe1, 0x2e, 0x4f, 0x07, 0xeb, 0x64, 0xe1, 0x14, - 0xc5, 0x90, 0x60, 0x25, 0xb6, 0x10, 0x04, 0x09, 0x02, 0xc5, 0x30, 0xe0, 0x24, 0xf6, 0x27, 0xc1, - 0x41, 0xbe, 0x18, 0x88, 0x10, 0xc7, 0xb6, 0x3e, 0xc4, 0x81, 0xfc, 0x21, 0x91, 0x1d, 0xc0, 0x74, - 0x44, 0xe7, 0x4b, 0x82, 0x04, 0x42, 0x02, 0x05, 0x81, 0xf7, 0x43, 0x10, 0xd4, 0xdf, 0xae, 0xee, - 0xe9, 0xe1, 0xce, 0xec, 0x34, 0x57, 0x4a, 0xe2, 0x6f, 0x33, 0xf5, 0xaa, 0xde, 0x7b, 0x5d, 0x7f, - 0x5e, 0xbd, 0x7a, 0xf5, 0xde, 0x2b, 0xd8, 0x68, 0xb9, 0xd1, 0x5e, 0x6f, 0x67, 0xb9, 0xe1, 0x77, - 0x56, 0x9c, 0xa0, 0xe5, 0x77, 0x03, 0xff, 0x2e, 0xff, 0xf1, 0xd1, 0xc0, 0x6f, 0xb7, 0xfd, 0x5e, - 0x14, 0xae, 0x74, 0xf7, 0x5b, 0x2b, 0x4e, 0xd7, 0x0d, 0x57, 0x74, 0xc9, 0xc1, 0xc7, 0x9d, 0x76, - 0x77, 0xcf, 0xf9, 0xf8, 0x4a, 0x8b, 0x7a, 0x34, 0x70, 0x22, 0xda, 0x5c, 0xee, 0x06, 0x7e, 0xe4, - 0x93, 0x4f, 0xc5, 0xd8, 0x96, 0x15, 0x36, 0xfe, 0xe3, 0xe7, 0x55, 0xdb, 0xe5, 0xee, 0x7e, 0x6b, - 0x99, 0x61, 0x5b, 0xd6, 0x25, 0x0a, 0xdb, 0xd2, 0x47, 0x0d, 0x5e, 0x5a, 0x7e, 0xcb, 0x5f, 0xe1, - 0x48, 0x77, 0x7a, 0xbb, 0xfc, 0x1f, 0xff, 0xc3, 0x7f, 0x09, 0x62, 0x4b, 0xcf, 0xef, 0xbf, 0x16, - 0x2e, 0xbb, 0x3e, 0xe3, 0x6d, 0x65, 0xc7, 0x89, 0x1a, 0x7b, 0x2b, 0x07, 0x7d, 0x1c, 0x2d, 0xd9, - 0x46, 0xa5, 0x86, 0x1f, 0xd0, 0xac, 0x3a, 0xaf, 0xc4, 0x75, 0x3a, 0x4e, 0x63, 0xcf, 0xf5, 0x68, - 0x70, 0x18, 0x7f, 0x75, 0x87, 0x46, 0x4e, 0x56, 0xab, 0x95, 0x41, 0xad, 0x82, 0x9e, 0x17, 0xb9, - 0x1d, 0xda, 0xd7, 0xe0, 0xaf, 0x3c, 0xac, 0x41, 0xd8, 0xd8, 0xa3, 0x1d, 0xa7, 0xaf, 0xdd, 0xcb, - 0x83, 0xda, 0xf5, 0x22, 0xb7, 0xbd, 0xe2, 0x7a, 0x51, 0x18, 0x05, 0xe9, 0x46, 0xf6, 0x0f, 0x0b, - 0x50, 0xae, 0x6e, 0xd4, 0xea, 0x91, 0x13, 0xf5, 0x42, 0xf2, 0x15, 0x0b, 0x66, 0xdb, 0xbe, 0xd3, - 0xac, 0x39, 0x6d, 0xc7, 0x6b, 0xd0, 0x60, 0xd1, 0x7a, 0xce, 0xba, 0x34, 0x73, 0x79, 0x63, 0x79, - 0x9c, 0xf1, 0x5a, 0xae, 0xde, 0x0b, 0x91, 0x86, 0x7e, 0x2f, 0x68, 0x50, 0xa4, 0xbb, 0xb5, 0xf3, - 0xdf, 0x3d, 0xaa, 0x3c, 0x71, 0x7c, 0x54, 0x99, 0xdd, 0x30, 0x28, 0x61, 0x82, 0x2e, 0xf9, 0xa6, - 0x05, 0x67, 0x1b, 0x8e, 0xe7, 0x04, 0x87, 0xdb, 0x4e, 0xd0, 0xa2, 0xd1, 0x9b, 0x81, 0xdf, 0xeb, - 0x2e, 0x4e, 0x9c, 0x02, 0x37, 0x4f, 0x49, 0x6e, 0xce, 0xae, 0xa6, 0xc9, 0x61, 0x3f, 0x07, 0x9c, - 0xaf, 0x30, 0x72, 0x76, 0xda, 0xd4, 0xe4, 0xab, 0x70, 0x9a, 0x7c, 0xd5, 0xd3, 0xe4, 0xb0, 0x9f, - 0x03, 0xf2, 0x22, 0x4c, 0xbb, 0x5e, 0x2b, 0xa0, 0x61, 0xb8, 0x38, 0xf9, 0x9c, 0x75, 0xa9, 0x5c, - 0x9b, 0x97, 0xcd, 0xa7, 0xd7, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xad, 0x6e, 0xd4, - 0xb6, 0x03, 0x67, 0x77, 0xd7, 0x6d, 0xa0, 0xdf, 0x8b, 0x5c, 0xaf, 0x65, 0x22, 0xb0, 0x4e, 0x46, - 0x40, 0x5e, 0x85, 0x99, 0x90, 0x06, 0x07, 0x6e, 0x83, 0x6e, 0xf9, 0x41, 0xc4, 0x07, 0xa5, 0x58, - 0x3b, 0x27, 0xab, 0xcf, 0xd4, 0x63, 0x10, 0x9a, 0xf5, 0x58, 0xb3, 0xc0, 0xf7, 0x23, 0x09, 0xe7, - 0x7d, 0x56, 0x8e, 0x9b, 0x61, 0x0c, 0x42, 0xb3, 0x1e, 0x59, 0x83, 0x05, 0xc7, 0xf3, 0xfc, 0xc8, - 0x89, 0x5c, 0xdf, 0xdb, 0x0a, 0xe8, 0xae, 0x7b, 0x5f, 0x7e, 0xe2, 0xa2, 0x6c, 0xbb, 0x50, 0x4d, - 0xc1, 0xb1, 0xaf, 0x05, 0xf9, 0x86, 0x05, 0x0b, 0x61, 0xe4, 0x36, 0xf6, 0x5d, 0x8f, 0x86, 0xe1, - 0xaa, 0xef, 0xed, 0xba, 0xad, 0xc5, 0x22, 0x1f, 0xb6, 0x1b, 0xe3, 0x0d, 0x5b, 0x3d, 0x85, 0xb5, - 0x76, 0x9e, 0xb1, 0x94, 0x2e, 0xc5, 0x3e, 0xea, 0xe4, 0x23, 0x50, 0x96, 0x3d, 0x4a, 0xc3, 0xc5, - 0xa9, 0xe7, 0x0a, 0x97, 0xca, 0xb5, 0x33, 0xc7, 0x47, 0x95, 0xf2, 0xba, 0x2a, 0xc4, 0x18, 0x6e, - 0xaf, 0xc1, 0x62, 0xb5, 0xb3, 0xe3, 0x84, 0xa1, 0xd3, 0xf4, 0x83, 0xd4, 0xd0, 0x5d, 0x82, 0x52, - 0xc7, 0xe9, 0x76, 0x5d, 0xaf, 0xc5, 0xc6, 0x8e, 0xe1, 0x99, 0x3d, 0x3e, 0xaa, 0x94, 0x36, 0x65, - 0x19, 0x6a, 0xa8, 0xfd, 0x27, 0x13, 0x30, 0x53, 0xf5, 0x9c, 0xf6, 0x61, 0xe8, 0x86, 0xd8, 0xf3, - 0xc8, 0xe7, 0xa0, 0xc4, 0xa4, 0x56, 0xd3, 0x89, 0x1c, 0xb9, 0xd2, 0x3f, 0xb6, 0x2c, 0x84, 0xc8, - 0xb2, 0x29, 0x44, 0xe2, 0xcf, 0x67, 0xb5, 0x97, 0x0f, 0x3e, 0xbe, 0x7c, 0x73, 0xe7, 0x2e, 0x6d, - 0x44, 0x9b, 0x34, 0x72, 0x6a, 0x44, 0x8e, 0x02, 0xc4, 0x65, 0xa8, 0xb1, 0x12, 0x1f, 0x26, 0xc3, - 0x2e, 0x6d, 0xc8, 0x95, 0xbb, 0x39, 0xe6, 0x0a, 0x89, 0x59, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2b, - 0x49, 0x4f, 0xb2, 0x7f, 0xc8, 0x09, 0x91, 0x7b, 0x30, 0x15, 0x72, 0x59, 0x26, 0x17, 0xe5, 0xcd, - 0xfc, 0x48, 0x72, 0xb4, 0xb5, 0x39, 0x49, 0x74, 0x4a, 0xfc, 0x47, 0x49, 0xce, 0xfe, 0xf7, 0x16, - 0x9c, 0x33, 0x6a, 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x3c, 0x07, 0x93, 0x9e, 0xd3, 0xa1, - 0x72, 0x55, 0x69, 0x96, 0x6f, 0x38, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x87, 0xe2, 0x81, 0xd3, 0xee, - 0x51, 0xde, 0x49, 0xe5, 0xda, 0x19, 0x59, 0xa5, 0xf8, 0x36, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x41, - 0x99, 0xff, 0xb8, 0x1a, 0xf8, 0x9d, 0x9c, 0x3e, 0x4d, 0x72, 0xf8, 0xb6, 0x42, 0x2b, 0xa6, 0x9f, - 0xfe, 0x8b, 0x31, 0x41, 0xfb, 0xcf, 0x2c, 0x98, 0x37, 0x3e, 0x6e, 0xc3, 0x0d, 0x23, 0xf2, 0xd9, - 0xbe, 0xc9, 0xb3, 0x3c, 0xdc, 0xe4, 0x61, 0xad, 0xf9, 0xd4, 0x59, 0x90, 0x5f, 0x5a, 0x52, 0x25, - 0xc6, 0xc4, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0x2e, 0x4e, 0x3c, 0x57, 0xb8, 0x34, 0x73, 0x79, - 0x3d, 0xb7, 0x61, 0x8c, 0xfb, 0x77, 0x9d, 0xe1, 0x47, 0x41, 0xc6, 0xfe, 0xed, 0x42, 0x62, 0xf8, - 0x36, 0x15, 0x1f, 0x1f, 0x58, 0x30, 0xd5, 0x76, 0x76, 0x68, 0x5b, 0xac, 0xad, 0x99, 0xcb, 0xef, - 0xe4, 0xc6, 0x89, 0xa2, 0xb1, 0xbc, 0xc1, 0xf1, 0x5f, 0xf1, 0xa2, 0xe0, 0x30, 0x9e, 0x5e, 0xa2, - 0x10, 0x25, 0x71, 0xf2, 0xf7, 0x2c, 0x98, 0x89, 0xa5, 0x9a, 0xea, 0x96, 0x9d, 0xfc, 0x99, 0x89, - 0x85, 0xa9, 0xe4, 0x48, 0x8b, 0x68, 0x03, 0x82, 0x26, 0x2f, 0x4b, 0x9f, 0x80, 0x19, 0xe3, 0x13, - 0xc8, 0x02, 0x14, 0xf6, 0xe9, 0xa1, 0x98, 0xf0, 0xc8, 0x7e, 0x92, 0xf3, 0x89, 0x19, 0x2e, 0xa7, - 0xf4, 0x27, 0x27, 0x5e, 0xb3, 0x96, 0xde, 0x80, 0x85, 0x34, 0xc1, 0x51, 0xda, 0xdb, 0xdf, 0x9e, - 0x4c, 0x4c, 0x4c, 0x26, 0x08, 0x88, 0x0f, 0xd3, 0x1d, 0x1a, 0x05, 0x6e, 0x43, 0x0d, 0xd9, 0xda, - 0x78, 0xbd, 0xb4, 0xc9, 0x91, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xa2, 0x42, 0xf6, 0x60, 0xd2, - 0x09, 0x5a, 0x6a, 0x4c, 0xae, 0xe6, 0xb3, 0x2c, 0x63, 0x51, 0x51, 0x0d, 0x5a, 0x21, 0x72, 0x0a, - 0x64, 0x05, 0xca, 0x11, 0x0d, 0x3a, 0xae, 0xe7, 0x44, 0x62, 0x07, 0x2d, 0xd5, 0xce, 0xca, 0x6a, - 0xe5, 0x6d, 0x05, 0xc0, 0xb8, 0x0e, 0x69, 0xc3, 0x54, 0x33, 0x38, 0xc4, 0x9e, 0xb7, 0x38, 0x99, - 0x47, 0x57, 0xac, 0x71, 0x5c, 0xf1, 0x24, 0x15, 0xff, 0x51, 0xd2, 0x20, 0xbf, 0x6e, 0xc1, 0xf9, - 0x0e, 0x75, 0xc2, 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x06, 0x76, 0xb1, 0xc8, 0x89, - 0xe3, 0xb8, 0xe3, 0xd0, 0x8f, 0xb9, 0xf6, 0x8c, 0x64, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xb9, 0xb1, - 0xff, 0x64, 0x12, 0xce, 0xf6, 0x09, 0x76, 0xf2, 0x0a, 0x14, 0xbb, 0x7b, 0x4e, 0xa8, 0x24, 0xf5, - 0x45, 0x25, 0x26, 0xb6, 0x58, 0xe1, 0x83, 0xa3, 0xca, 0x19, 0xd5, 0x84, 0x17, 0xa0, 0xa8, 0xcc, - 0xf4, 0xa6, 0x0e, 0x0d, 0x43, 0xa7, 0xa5, 0xc4, 0xb7, 0x31, 0x4d, 0x78, 0x31, 0x2a, 0x38, 0xf9, - 0x9b, 0x16, 0x9c, 0x11, 0x53, 0x06, 0x69, 0xd8, 0x6b, 0x47, 0x6c, 0x8b, 0x62, 0xdd, 0x72, 0x3d, - 0x8f, 0xe9, 0x29, 0x50, 0xd6, 0x2e, 0x48, 0xea, 0x67, 0xcc, 0xd2, 0x10, 0x93, 0x74, 0xc9, 0x1d, - 0x28, 0x87, 0x91, 0x13, 0x44, 0xb4, 0x59, 0x8d, 0xb8, 0x32, 0x35, 0x73, 0xf9, 0xa7, 0x87, 0x93, - 0xdd, 0xdb, 0x6e, 0x87, 0x8a, 0x7d, 0xa2, 0xae, 0x10, 0x60, 0x8c, 0x8b, 0xbc, 0x07, 0x10, 0xf4, - 0xbc, 0x7a, 0xaf, 0xd3, 0x71, 0x82, 0x43, 0xa9, 0x5f, 0x5d, 0x1b, 0xef, 0xf3, 0x50, 0xe3, 0x8b, - 0x55, 0x8d, 0xb8, 0x0c, 0x0d, 0x7a, 0xe4, 0x4b, 0x16, 0x9c, 0x11, 0x33, 0x51, 0x71, 0x30, 0x95, - 0x33, 0x07, 0x67, 0x59, 0xd7, 0xae, 0x99, 0x24, 0x30, 0x49, 0xd1, 0xfe, 0xb7, 0x49, 0x35, 0xa0, - 0x1e, 0xb1, 0xc3, 0x56, 0xeb, 0x90, 0x7c, 0x06, 0x9e, 0x0a, 0x7b, 0x8d, 0x06, 0x0d, 0xc3, 0xdd, - 0x5e, 0x1b, 0x7b, 0xde, 0x35, 0x37, 0x8c, 0xfc, 0xe0, 0x70, 0xc3, 0xed, 0xb8, 0x11, 0x9f, 0x71, - 0xc5, 0xda, 0xb3, 0xc7, 0x47, 0x95, 0xa7, 0xea, 0x83, 0x2a, 0xe1, 0xe0, 0xf6, 0xc4, 0x81, 0xa7, - 0x7b, 0xde, 0x60, 0xf4, 0x42, 0x43, 0xaf, 0x1c, 0x1f, 0x55, 0x9e, 0xbe, 0x3d, 0xb8, 0x1a, 0x9e, - 0x84, 0xc3, 0xfe, 0xcf, 0x16, 0x93, 0xd4, 0xe2, 0xbb, 0xb6, 0x69, 0xa7, 0xdb, 0x66, 0xd2, 0xe5, - 0xf4, 0xf5, 0xc7, 0x28, 0xa1, 0x3f, 0x62, 0x3e, 0xdb, 0x9d, 0xe2, 0x7f, 0x90, 0x12, 0x69, 0xff, - 0x27, 0x0b, 0xce, 0xa7, 0x2b, 0x3f, 0x06, 0x9d, 0x27, 0x4c, 0xea, 0x3c, 0x37, 0xf2, 0xfd, 0xda, - 0x01, 0x8a, 0xcf, 0x57, 0x26, 0xfb, 0xbf, 0xf5, 0xff, 0xf6, 0x6d, 0x34, 0xde, 0x15, 0x0b, 0x3f, - 0xce, 0x5d, 0x71, 0xf2, 0x27, 0x6a, 0x57, 0xfc, 0xc7, 0x93, 0x30, 0x5b, 0xf5, 0x22, 0xb7, 0xba, - 0xbb, 0xeb, 0x7a, 0x6e, 0x74, 0x48, 0xbe, 0x36, 0x01, 0x2b, 0xdd, 0x80, 0xee, 0xd2, 0x20, 0xa0, - 0xcd, 0xb5, 0x5e, 0xe0, 0x7a, 0xad, 0x7a, 0x63, 0x8f, 0x36, 0x7b, 0x6d, 0xd7, 0x6b, 0xad, 0xb7, - 0x3c, 0x5f, 0x17, 0x5f, 0xb9, 0x4f, 0x1b, 0x3d, 0xfe, 0x49, 0x62, 0x51, 0x74, 0xc6, 0xfb, 0xa4, - 0xad, 0xd1, 0x88, 0xd6, 0x5e, 0x3e, 0x3e, 0xaa, 0xac, 0x8c, 0xd8, 0x08, 0x47, 0xfd, 0x34, 0xf2, - 0xd5, 0x09, 0x58, 0x0e, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xbd, 0x21, 0xa4, 0x56, 0x7b, 0xcc, 0xed, - 0x67, 0x24, 0x9a, 0xb5, 0xcb, 0xc7, 0x47, 0x95, 0x11, 0xdb, 0xe0, 0x88, 0xdf, 0x65, 0x6f, 0xc1, - 0x4c, 0xb5, 0xeb, 0x86, 0xee, 0x7d, 0xf4, 0x7b, 0x11, 0x1d, 0xe2, 0x88, 0x5b, 0x81, 0x62, 0xd0, - 0x6b, 0x53, 0xb1, 0xb6, 0xcb, 0xb5, 0x32, 0x93, 0x42, 0xc8, 0x0a, 0x50, 0x94, 0xdb, 0xbf, 0xc8, - 0x24, 0x2e, 0x47, 0x99, 0x32, 0x6e, 0xdc, 0x85, 0x62, 0xc0, 0x88, 0xc8, 0x99, 0x35, 0xee, 0x39, - 0x30, 0xe6, 0x5a, 0x32, 0xc1, 0x7e, 0xa2, 0x20, 0x61, 0xff, 0xee, 0x04, 0x5c, 0xa8, 0x76, 0xbb, - 0x9b, 0x34, 0xdc, 0x4b, 0x71, 0xf1, 0xcb, 0x16, 0xcc, 0x1d, 0xb8, 0x41, 0xd4, 0x73, 0xda, 0xca, - 0x7e, 0x25, 0xf8, 0xa9, 0x8f, 0xcb, 0x0f, 0xa7, 0xf6, 0x76, 0x02, 0x75, 0x8d, 0x1c, 0x1f, 0x55, - 0xe6, 0x92, 0x65, 0x98, 0x22, 0x4f, 0xfe, 0xae, 0x05, 0x0b, 0xb2, 0xe8, 0x86, 0xdf, 0xa4, 0xa6, - 0x7d, 0xf4, 0x76, 0x9e, 0x3c, 0x69, 0xe4, 0xc2, 0xae, 0x95, 0x2e, 0xc5, 0x3e, 0x26, 0xec, 0xff, - 0x3a, 0x01, 0x4f, 0x0e, 0xc0, 0x41, 0x7e, 0xc3, 0x82, 0xf3, 0xc2, 0xa8, 0x6a, 0x80, 0x90, 0xee, - 0xca, 0xde, 0xfc, 0xd9, 0xbc, 0x39, 0x47, 0xb6, 0xc4, 0xa9, 0xd7, 0xa0, 0xb5, 0x45, 0x26, 0x0d, - 0x57, 0x33, 0x48, 0x63, 0x26, 0x43, 0x9c, 0x53, 0x61, 0x66, 0x4d, 0x71, 0x3a, 0xf1, 0x58, 0x38, - 0xad, 0x67, 0x90, 0xc6, 0x4c, 0x86, 0xec, 0xbf, 0x0e, 0x4f, 0x9f, 0x80, 0xee, 0xe1, 0x8b, 0xd3, - 0x7e, 0x47, 0xcf, 0xfa, 0xe4, 0x9c, 0x1b, 0x62, 0x5d, 0xdb, 0x30, 0xc5, 0x97, 0x8e, 0x5a, 0xd8, - 0xc0, 0xb6, 0x3f, 0xbe, 0xa6, 0x42, 0x94, 0x10, 0xfb, 0x77, 0x2d, 0x28, 0x8d, 0x60, 0x0d, 0xab, - 0x24, 0xad, 0x61, 0xe5, 0x3e, 0x4b, 0x58, 0xd4, 0x6f, 0x09, 0x7b, 0x73, 0xbc, 0xd1, 0x18, 0xc6, - 0x02, 0xf6, 0x43, 0x0b, 0xce, 0xf6, 0x59, 0xcc, 0xc8, 0x1e, 0x9c, 0xef, 0xfa, 0x4d, 0xa5, 0x36, - 0x5d, 0x73, 0xc2, 0x3d, 0x0e, 0x93, 0x9f, 0xf7, 0x0a, 0x1b, 0xc9, 0xad, 0x0c, 0xf8, 0x83, 0xa3, - 0xca, 0xa2, 0x46, 0x92, 0xaa, 0x80, 0x99, 0x18, 0x49, 0x17, 0x4a, 0xbb, 0x2e, 0x6d, 0x37, 0xe3, - 0x29, 0x38, 0xa6, 0x82, 0x74, 0x55, 0x62, 0x13, 0xc6, 0x62, 0xf5, 0x0f, 0x35, 0x15, 0xfb, 0x47, - 0x16, 0xcc, 0x55, 0x7b, 0xd1, 0x1e, 0x53, 0x0f, 0x1a, 0xdc, 0x3e, 0x43, 0x3c, 0x28, 0x86, 0x6e, - 0xeb, 0xe0, 0x95, 0x7c, 0x84, 0x71, 0x9d, 0xa1, 0x92, 0x46, 0x73, 0xad, 0x9b, 0xf2, 0x42, 0x14, - 0x64, 0x48, 0x00, 0x53, 0xbe, 0xd3, 0x8b, 0xf6, 0x2e, 0xcb, 0x4f, 0x1e, 0xf3, 0xa4, 0x7c, 0x93, - 0x7d, 0xce, 0x65, 0x49, 0x51, 0x6b, 0x6b, 0xa2, 0x14, 0x25, 0x25, 0xfb, 0x8b, 0x30, 0x97, 0xbc, - 0x89, 0x19, 0x62, 0xce, 0x3e, 0x0b, 0x05, 0x27, 0xf0, 0xe4, 0x8c, 0x9d, 0x91, 0x15, 0x0a, 0x55, - 0xbc, 0x81, 0xac, 0x9c, 0xbc, 0x04, 0xa5, 0xdd, 0x5e, 0xbb, 0xcd, 0x1a, 0xc8, 0x6b, 0x0f, 0x7d, - 0x0a, 0xb8, 0x2a, 0xcb, 0x51, 0xd7, 0xb0, 0xff, 0x62, 0x12, 0xe6, 0x6b, 0xed, 0x1e, 0x7d, 0x33, - 0xa0, 0x54, 0xd9, 0x26, 0xaa, 0x30, 0xdf, 0x0d, 0xe8, 0x81, 0x4b, 0xef, 0xd5, 0x69, 0x9b, 0x36, - 0x22, 0x3f, 0x90, 0xdc, 0x3c, 0x29, 0x11, 0xcd, 0x6f, 0x25, 0xc1, 0x98, 0xae, 0x4f, 0xde, 0x80, - 0x39, 0xa7, 0x11, 0xb9, 0x07, 0x54, 0x63, 0x10, 0xec, 0x7e, 0x48, 0x62, 0x98, 0xab, 0x26, 0xa0, - 0x98, 0xaa, 0x4d, 0x3e, 0x0b, 0x8b, 0x61, 0xc3, 0x69, 0xd3, 0xdb, 0x5d, 0x49, 0x6a, 0x75, 0x8f, - 0x36, 0xf6, 0xb7, 0x7c, 0xd7, 0x8b, 0xa4, 0x25, 0xea, 0x39, 0x89, 0x69, 0xb1, 0x3e, 0xa0, 0x1e, - 0x0e, 0xc4, 0x40, 0xfe, 0x85, 0x05, 0xcf, 0x76, 0x03, 0xba, 0x15, 0xf8, 0x1d, 0x9f, 0x4d, 0xb5, - 0x3e, 0xf3, 0x8c, 0x34, 0x53, 0xbc, 0x3d, 0xa6, 0x2e, 0x25, 0x4a, 0xfa, 0xad, 0xfa, 0x1f, 0x3e, - 0x3e, 0xaa, 0x3c, 0xbb, 0x75, 0x12, 0x03, 0x78, 0x32, 0x7f, 0xe4, 0x5f, 0x5a, 0x70, 0xb1, 0xeb, - 0x87, 0xd1, 0x09, 0x9f, 0x50, 0x3c, 0xd5, 0x4f, 0xb0, 0x8f, 0x8f, 0x2a, 0x17, 0xb7, 0x4e, 0xe4, - 0x00, 0x1f, 0xc2, 0xa1, 0x7d, 0x3c, 0x03, 0x67, 0x8d, 0xb9, 0x27, 0x6d, 0x17, 0xaf, 0xc3, 0x19, - 0x35, 0x19, 0x62, 0xdd, 0xa7, 0x1c, 0xdb, 0x9a, 0xaa, 0x26, 0x10, 0x93, 0x75, 0xd9, 0xbc, 0xd3, - 0x53, 0x51, 0xb4, 0x4e, 0xcd, 0xbb, 0xad, 0x04, 0x14, 0x53, 0xb5, 0xc9, 0x3a, 0x9c, 0x93, 0x25, - 0x48, 0xbb, 0x6d, 0xb7, 0xe1, 0xac, 0xfa, 0x3d, 0x39, 0xe5, 0x8a, 0xb5, 0x27, 0x8f, 0x8f, 0x2a, - 0xe7, 0xb6, 0xfa, 0xc1, 0x98, 0xd5, 0x86, 0x6c, 0xc0, 0x79, 0xa7, 0x17, 0xf9, 0xfa, 0xfb, 0xaf, - 0x78, 0x6c, 0x3b, 0x6d, 0xf2, 0xa9, 0x55, 0x12, 0xfb, 0x6e, 0x35, 0x03, 0x8e, 0x99, 0xad, 0xc8, - 0x56, 0x0a, 0x5b, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x46, 0xb9, 0x18, 0x9f, 0xc0, 0xaa, 0x19, 0x75, - 0x30, 0xb3, 0x25, 0x69, 0xc3, 0x5c, 0xc7, 0xb9, 0x7f, 0xdb, 0x73, 0x0e, 0x1c, 0xb7, 0xcd, 0x88, - 0x48, 0xfb, 0xd5, 0x60, 0xa3, 0x4a, 0x2f, 0x72, 0xdb, 0xcb, 0xe2, 0x66, 0x7f, 0x79, 0xdd, 0x8b, - 0x6e, 0x06, 0xf5, 0x88, 0x69, 0xea, 0x42, 0x83, 0xdc, 0x4c, 0xe0, 0xc2, 0x14, 0x6e, 0x72, 0x13, - 0x2e, 0xf0, 0xe5, 0xb8, 0xe6, 0xdf, 0xf3, 0xd6, 0x68, 0xdb, 0x39, 0x54, 0x1f, 0x30, 0xcd, 0x3f, - 0xe0, 0xa9, 0xe3, 0xa3, 0xca, 0x85, 0x7a, 0x56, 0x05, 0xcc, 0x6e, 0x47, 0x1c, 0x78, 0x3a, 0x09, - 0x40, 0x7a, 0xe0, 0x86, 0xae, 0xef, 0x09, 0x2b, 0x54, 0x29, 0xb6, 0x42, 0xd5, 0x07, 0x57, 0xc3, - 0x93, 0x70, 0x90, 0xbf, 0x6f, 0xc1, 0xf9, 0xac, 0x65, 0xb8, 0x58, 0xce, 0xe3, 0x7e, 0x31, 0xb5, - 0xb4, 0xc4, 0x8c, 0xc8, 0x14, 0x0a, 0x99, 0x4c, 0x90, 0xf7, 0x2d, 0x98, 0x75, 0x8c, 0x13, 0xf4, - 0x22, 0xe4, 0xb1, 0x6b, 0x99, 0x67, 0xf2, 0xda, 0xc2, 0xf1, 0x51, 0x25, 0x71, 0x4a, 0xc7, 0x04, - 0x45, 0xf2, 0x0f, 0x2d, 0xb8, 0x90, 0xb9, 0xc6, 0x17, 0x67, 0x4e, 0xa3, 0x87, 0xf8, 0x24, 0xc9, - 0x96, 0x39, 0xd9, 0x6c, 0x90, 0x6f, 0x58, 0x7a, 0x2b, 0x53, 0x57, 0x4e, 0x8b, 0xb3, 0x9c, 0xb5, - 0x5b, 0x63, 0x1a, 0x0d, 0x62, 0xad, 0x49, 0x21, 0xae, 0x9d, 0x33, 0x76, 0x46, 0x55, 0x88, 0x69, - 0xf2, 0xe4, 0xeb, 0x96, 0xda, 0x1a, 0x35, 0x47, 0x67, 0x4e, 0x8b, 0x23, 0x12, 0xef, 0xb4, 0x9a, - 0xa1, 0x14, 0x71, 0xf2, 0x73, 0xb0, 0xe4, 0xec, 0xf8, 0x41, 0x94, 0xb9, 0xf8, 0x16, 0xe7, 0xf8, - 0x32, 0xba, 0x78, 0x7c, 0x54, 0x59, 0xaa, 0x0e, 0xac, 0x85, 0x27, 0x60, 0xb0, 0x7f, 0xab, 0x08, - 0xb3, 0xe2, 0x24, 0x24, 0xb7, 0xae, 0xdf, 0xb1, 0xe0, 0x99, 0x46, 0x2f, 0x08, 0xa8, 0x17, 0xd5, - 0x23, 0xda, 0xed, 0xdf, 0xb8, 0xac, 0x53, 0xdd, 0xb8, 0x9e, 0x3b, 0x3e, 0xaa, 0x3c, 0xb3, 0x7a, - 0x02, 0x7d, 0x3c, 0x91, 0x3b, 0xf2, 0x6f, 0x2c, 0xb0, 0x65, 0x85, 0x9a, 0xd3, 0xd8, 0x6f, 0x05, - 0x7e, 0xcf, 0x6b, 0xf6, 0x7f, 0xc4, 0xc4, 0xa9, 0x7e, 0xc4, 0x0b, 0xc7, 0x47, 0x15, 0x7b, 0xf5, - 0xa1, 0x5c, 0xe0, 0x10, 0x9c, 0x92, 0x37, 0xe1, 0xac, 0xac, 0x75, 0xe5, 0x7e, 0x97, 0x06, 0x2e, - 0x3b, 0x73, 0x48, 0xc5, 0x31, 0xf6, 0x56, 0x4a, 0x57, 0xc0, 0xfe, 0x36, 0x24, 0x84, 0xe9, 0x7b, - 0xd4, 0x6d, 0xed, 0x45, 0x4a, 0x7d, 0x1a, 0xd3, 0x45, 0x49, 0x5a, 0x45, 0xee, 0x08, 0x9c, 0xb5, - 0x99, 0xe3, 0xa3, 0xca, 0xb4, 0xfc, 0x83, 0x8a, 0x12, 0xb9, 0x01, 0x73, 0xe2, 0x9c, 0xba, 0xe5, - 0x7a, 0xad, 0x2d, 0xdf, 0x13, 0x7e, 0x36, 0xe5, 0xda, 0x0b, 0x6a, 0xc3, 0xaf, 0x27, 0xa0, 0x0f, - 0x8e, 0x2a, 0xb3, 0xea, 0xf7, 0xf6, 0x61, 0x97, 0x62, 0xaa, 0xb5, 0xfd, 0xfb, 0x53, 0x00, 0x6a, - 0xba, 0xd2, 0x2e, 0xf9, 0x08, 0x94, 0x43, 0x1a, 0x09, 0xaa, 0xf2, 0xe2, 0x44, 0xdc, 0x47, 0xa9, - 0x42, 0x8c, 0xe1, 0x64, 0x1f, 0x8a, 0x5d, 0xa7, 0x17, 0xd2, 0x7c, 0xce, 0x0f, 0x72, 0xf0, 0xb7, - 0x18, 0x46, 0x71, 0x30, 0xe5, 0x3f, 0x51, 0xd0, 0x20, 0x5f, 0xb6, 0x00, 0x68, 0x72, 0xc0, 0xc6, - 0x36, 0x10, 0x49, 0x92, 0xf1, 0x98, 0xb2, 0x3e, 0xa8, 0xcd, 0x1d, 0x1f, 0x55, 0xc0, 0x18, 0x7a, - 0x83, 0x2c, 0xb9, 0x07, 0x25, 0x47, 0xc9, 0xfc, 0xc9, 0xd3, 0x90, 0xf9, 0xfc, 0xbc, 0xa8, 0x27, - 0xad, 0x26, 0x46, 0xbe, 0x6a, 0xc1, 0x5c, 0x48, 0x23, 0x39, 0x54, 0x4c, 0xf2, 0x48, 0x85, 0x77, - 0xcc, 0x49, 0x57, 0x4f, 0xe0, 0x14, 0x12, 0x34, 0x59, 0x86, 0x29, 0xba, 0x8a, 0x95, 0x6b, 0xd4, - 0x69, 0xd2, 0x80, 0x9b, 0x23, 0xa4, 0x26, 0x35, 0x3e, 0x2b, 0x06, 0x4e, 0xcd, 0x8a, 0x51, 0x86, - 0x29, 0xba, 0x8a, 0x95, 0x4d, 0x37, 0x08, 0x7c, 0xc9, 0x4a, 0x29, 0x27, 0x56, 0x0c, 0x9c, 0x9a, - 0x15, 0xa3, 0x0c, 0x53, 0x74, 0xed, 0x6f, 0x9d, 0x81, 0x39, 0xb5, 0x90, 0x62, 0xcd, 0x5e, 0x58, - 0xbf, 0x06, 0x68, 0xf6, 0xab, 0x26, 0x10, 0x93, 0x75, 0x59, 0x63, 0xb1, 0x54, 0x93, 0x8a, 0xbd, - 0x6e, 0x5c, 0x37, 0x81, 0x98, 0xac, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x77, 0xe0, 0x63, - 0x5e, 0xd1, 0xc6, 0xf2, 0xc1, 0xb0, 0x24, 0x30, 0xf4, 0x28, 0xa8, 0x70, 0x03, 0x6e, 0x94, 0xb0, - 0xe9, 0xca, 0xc5, 0x91, 0xcf, 0xfa, 0x4c, 0x9a, 0x8b, 0xc5, 0x68, 0x24, 0xcb, 0x30, 0x45, 0x3e, - 0x43, 0xd9, 0x2f, 0x9e, 0xa2, 0xb2, 0xff, 0x69, 0x28, 0x75, 0x9c, 0xfb, 0xf5, 0x5e, 0xd0, 0x7a, - 0xf4, 0x43, 0x85, 0xf4, 0x2a, 0x14, 0x58, 0x50, 0xe3, 0x23, 0x5f, 0xb2, 0x0c, 0x91, 0x33, 0xcd, - 0x91, 0xdf, 0xc9, 0x57, 0xe4, 0xe8, 0xbd, 0x72, 0xa0, 0xf0, 0xe9, 0x53, 0xbd, 0x4b, 0x8f, 0x5d, - 0xf5, 0x66, 0x6a, 0xa4, 0x58, 0x20, 0x5a, 0x8d, 0x2c, 0x9f, 0xaa, 0x1a, 0xb9, 0x9a, 0x20, 0x86, - 0x29, 0xe2, 0x9c, 0x1f, 0xb1, 0xe6, 0x34, 0x3f, 0x70, 0xaa, 0xfc, 0xd4, 0x13, 0xc4, 0x30, 0x45, - 0x7c, 0xf0, 0x79, 0x73, 0xe6, 0x74, 0xce, 0x9b, 0xb3, 0x39, 0x9c, 0x37, 0x4f, 0x56, 0xc5, 0xcf, - 0x8c, 0xab, 0x8a, 0x93, 0xeb, 0x40, 0x9a, 0x87, 0x9e, 0xd3, 0x71, 0x1b, 0x52, 0x58, 0xf2, 0x6d, - 0x73, 0x8e, 0xdb, 0x23, 0x96, 0xa4, 0x20, 0x23, 0x6b, 0x7d, 0x35, 0x30, 0xa3, 0x15, 0x89, 0xa0, - 0xd4, 0x55, 0x1a, 0xd7, 0x7c, 0x1e, 0xb3, 0x5f, 0x69, 0x60, 0xc2, 0x4d, 0x82, 0x2d, 0x3c, 0x55, - 0x82, 0x9a, 0x12, 0xd9, 0x80, 0xf3, 0x1d, 0xd7, 0xdb, 0xf2, 0x9b, 0xe1, 0x16, 0x0d, 0xa4, 0xb5, - 0xa5, 0x4e, 0xa3, 0xc5, 0x05, 0xde, 0x37, 0xfc, 0x04, 0xbd, 0x99, 0x01, 0xc7, 0xcc, 0x56, 0xf6, - 0xff, 0xb0, 0x60, 0x61, 0xb5, 0xed, 0xf7, 0x9a, 0x77, 0x9c, 0xa8, 0xb1, 0x27, 0x3c, 0x04, 0xc8, - 0x1b, 0x50, 0x72, 0xbd, 0x88, 0x06, 0x07, 0x4e, 0x5b, 0xee, 0x4f, 0xb6, 0x32, 0x9f, 0xae, 0xcb, - 0xf2, 0x07, 0x47, 0x95, 0xb9, 0xb5, 0x5e, 0xc0, 0xad, 0xd4, 0x42, 0x5a, 0xa1, 0x6e, 0x43, 0xbe, - 0x65, 0xc1, 0x59, 0xe1, 0x63, 0xb0, 0xe6, 0x44, 0xce, 0xad, 0x1e, 0x0d, 0x5c, 0xaa, 0xbc, 0x0c, - 0xc6, 0x14, 0x54, 0x69, 0x5e, 0x15, 0x81, 0xc3, 0x58, 0x51, 0xdf, 0x4c, 0x53, 0xc6, 0x7e, 0x66, - 0xec, 0x5f, 0x29, 0xc0, 0x53, 0x03, 0x71, 0x91, 0x25, 0x98, 0x70, 0x9b, 0xf2, 0xd3, 0x41, 0xe2, - 0x9d, 0x58, 0x6f, 0xe2, 0x84, 0xdb, 0x24, 0xcb, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x0b, 0xe7, - 0xb2, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x35, 0x48, 0x05, 0x8a, 0xdc, 0xa3, 0x54, 0x9e, 0x27, 0xb8, - 0x16, 0xcb, 0x9d, 0x37, 0x51, 0x94, 0x93, 0x5f, 0xb4, 0x00, 0x04, 0x83, 0xec, 0x34, 0x22, 0x77, - 0x49, 0xcc, 0xb7, 0x9b, 0x18, 0x66, 0xc1, 0x65, 0xfc, 0x1f, 0x0d, 0xaa, 0x64, 0x1b, 0xa6, 0x98, - 0x42, 0xeb, 0x37, 0x1f, 0x79, 0x53, 0xe4, 0x37, 0x51, 0x5b, 0x1c, 0x07, 0x4a, 0x5c, 0xac, 0xaf, - 0x02, 0x1a, 0xf5, 0x02, 0x8f, 0x75, 0x2d, 0xdf, 0x06, 0x4b, 0x82, 0x0b, 0xd4, 0xa5, 0x68, 0xd4, - 0xb0, 0xff, 0xf9, 0x04, 0x9c, 0xcf, 0x62, 0x9d, 0xed, 0x36, 0x53, 0x82, 0x5b, 0x79, 0x34, 0xfe, - 0x99, 0xfc, 0xfb, 0x47, 0xba, 0xcb, 0xe8, 0x6b, 0x0a, 0xe9, 0xd0, 0x27, 0xe9, 0x92, 0x9f, 0xd1, - 0x3d, 0x34, 0xf1, 0x88, 0x3d, 0xa4, 0x31, 0xa7, 0x7a, 0xe9, 0x39, 0x98, 0x0c, 0xd9, 0xc8, 0x17, - 0x92, 0xd7, 0x1d, 0x7c, 0x8c, 0x38, 0x84, 0xd5, 0xe8, 0x79, 0x6e, 0x24, 0xc3, 0x30, 0x74, 0x8d, - 0xdb, 0x9e, 0x1b, 0x21, 0x87, 0xd8, 0xdf, 0x9c, 0x80, 0xa5, 0xc1, 0x1f, 0x45, 0xbe, 0x69, 0x01, - 0x34, 0xd9, 0x71, 0x25, 0xe4, 0xbe, 0xcc, 0xc2, 0xbd, 0xc8, 0x39, 0xad, 0x3e, 0x5c, 0x53, 0x94, - 0x62, 0x5f, 0x33, 0x5d, 0x14, 0xa2, 0xc1, 0x08, 0xb9, 0xac, 0xa6, 0x3e, 0xbf, 0xaa, 0x11, 0x8b, - 0x49, 0xb7, 0xd9, 0xd4, 0x10, 0x34, 0x6a, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, - 0x50, 0x0b, 0x3f, 0x8f, 0xde, 0x50, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3f, 0x04, 0x9f, 0x39, - 0xc5, 0x0c, 0xd8, 0xff, 0xcd, 0x82, 0x27, 0x57, 0xdb, 0xbd, 0x30, 0xa2, 0xc1, 0xff, 0x33, 0xae, - 0x7b, 0xff, 0xd3, 0x82, 0xa7, 0x07, 0x7c, 0xf3, 0x63, 0xf0, 0xe0, 0x7b, 0x37, 0xe9, 0xc1, 0x77, - 0x7b, 0xdc, 0x29, 0x9d, 0xf9, 0x1d, 0x03, 0x1c, 0xf9, 0xbe, 0x59, 0x80, 0x33, 0x4c, 0x6c, 0x35, - 0xfd, 0x56, 0x4e, 0x1b, 0xe7, 0xf3, 0x50, 0xfc, 0x3c, 0xdb, 0x80, 0xd2, 0x93, 0x8c, 0xef, 0x4a, - 0x28, 0x60, 0xe4, 0xcb, 0x16, 0x4c, 0x7f, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xa6, 0x30, 0x4c, - 0x7c, 0xc3, 0xb2, 0xdc, 0x21, 0x45, 0x28, 0x82, 0xf6, 0x1d, 0x54, 0x5b, 0xa9, 0xa2, 0x4c, 0x5e, - 0x84, 0xe9, 0x5d, 0x3f, 0xe8, 0xf4, 0xda, 0x4e, 0x3a, 0xfe, 0xed, 0xaa, 0x28, 0x46, 0x05, 0x67, - 0x8b, 0xdc, 0xe9, 0xba, 0x6f, 0xd3, 0x20, 0x14, 0x9e, 0xe9, 0x89, 0x45, 0x5e, 0xd5, 0x10, 0x34, - 0x6a, 0x2d, 0x7d, 0x12, 0x66, 0x4d, 0x46, 0x46, 0x0a, 0x51, 0xf8, 0x14, 0x48, 0x87, 0xc0, 0x94, - 0x78, 0xb1, 0x86, 0x11, 0x2f, 0xf6, 0xbf, 0x9b, 0x00, 0xc3, 0xd2, 0xf3, 0x18, 0x96, 0xad, 0x97, - 0x58, 0xb6, 0x63, 0x5a, 0x29, 0x0c, 0xbb, 0xd5, 0xa0, 0x80, 0xad, 0x83, 0x54, 0xc0, 0xd6, 0x8d, - 0xdc, 0x28, 0x9e, 0x1c, 0xaf, 0xf5, 0x7d, 0x0b, 0x9e, 0x8e, 0x2b, 0xf7, 0x1b, 0x61, 0x1f, 0x2e, - 0x83, 0x5f, 0x85, 0x19, 0x27, 0x6e, 0x26, 0x17, 0x89, 0x11, 0x2d, 0xa3, 0x41, 0x68, 0xd6, 0x8b, - 0xe3, 0x0c, 0x0a, 0x8f, 0x18, 0x67, 0x30, 0x79, 0x72, 0x9c, 0x81, 0xfd, 0xa3, 0x09, 0x78, 0xb6, - 0xff, 0xcb, 0x94, 0xf4, 0x18, 0xce, 0xa3, 0xe1, 0x35, 0x98, 0x8d, 0x64, 0x03, 0x63, 0x2f, 0xd4, - 0x91, 0xbb, 0xdb, 0x06, 0x0c, 0x13, 0x35, 0x59, 0xcb, 0x86, 0x90, 0x5b, 0xf5, 0x86, 0xdf, 0x55, - 0x51, 0x2a, 0xba, 0xe5, 0xaa, 0x01, 0xc3, 0x44, 0x4d, 0xed, 0xff, 0x3b, 0x79, 0xea, 0xfe, 0xbf, - 0x75, 0xb8, 0xa0, 0x3c, 0x1e, 0xaf, 0xfa, 0xc1, 0xaa, 0xdf, 0xe9, 0xb6, 0x69, 0xa4, 0xa4, 0x41, - 0xa9, 0xf6, 0xac, 0x6c, 0x72, 0x01, 0xb3, 0x2a, 0x61, 0x76, 0x5b, 0xfb, 0xfb, 0x05, 0x38, 0x17, - 0x77, 0xfb, 0xaa, 0xef, 0x35, 0x5d, 0xee, 0x34, 0xf3, 0x3a, 0x4c, 0x46, 0x87, 0x5d, 0xd5, 0xd9, - 0xff, 0xbf, 0x62, 0x67, 0xfb, 0xb0, 0xcb, 0x46, 0xfb, 0xc9, 0x8c, 0x26, 0xdc, 0x0c, 0xce, 0x1b, - 0x91, 0x0d, 0xbd, 0x3a, 0xc4, 0x08, 0xbc, 0x92, 0x9c, 0xcd, 0x0f, 0x8e, 0x2a, 0x19, 0x81, 0xeb, - 0xcb, 0x1a, 0x53, 0x72, 0xce, 0x93, 0xbb, 0x30, 0xd7, 0x76, 0xc2, 0xe8, 0x76, 0xb7, 0xe9, 0x44, - 0x74, 0xdb, 0x95, 0xee, 0x28, 0xa3, 0x05, 0x7f, 0xe8, 0x7b, 0xfb, 0x8d, 0x04, 0x26, 0x4c, 0x61, - 0x26, 0x07, 0x40, 0x58, 0xc9, 0x76, 0xe0, 0x78, 0xa1, 0xf8, 0x2a, 0x46, 0x6f, 0xf4, 0x60, 0x13, - 0x7d, 0x0c, 0xde, 0xe8, 0xc3, 0x86, 0x19, 0x14, 0xc8, 0x0b, 0x30, 0x15, 0x50, 0x27, 0xd4, 0xa2, - 0x5d, 0xaf, 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x82, 0x9a, 0x7a, 0xc8, 0x82, 0xfa, 0x53, 0x0b, - 0xe6, 0xe2, 0x61, 0x7a, 0x0c, 0x6a, 0x44, 0x27, 0xa9, 0x46, 0x5c, 0xcb, 0x4b, 0x24, 0x0e, 0xd0, - 0x1c, 0xfe, 0x60, 0xca, 0xfc, 0x3e, 0xee, 0xfc, 0xff, 0x05, 0x28, 0xab, 0x55, 0xad, 0xf4, 0xf3, - 0x31, 0xad, 0x09, 0x09, 0xcd, 0xcd, 0x08, 0x5a, 0x93, 0x44, 0x30, 0xa6, 0xc7, 0xf4, 0x96, 0xa6, - 0xd4, 0x49, 0xe4, 0xb4, 0xd7, 0x7a, 0x8b, 0xd2, 0x55, 0xb2, 0xf4, 0x16, 0xd5, 0x86, 0xdc, 0x86, - 0x27, 0xbb, 0x81, 0xcf, 0x43, 0xa7, 0xd7, 0xa8, 0xd3, 0x6c, 0xbb, 0x1e, 0x55, 0x26, 0x1b, 0xe1, - 0x36, 0xf2, 0xf4, 0xf1, 0x51, 0xe5, 0xc9, 0xad, 0xec, 0x2a, 0x38, 0xa8, 0x6d, 0x32, 0xf8, 0x6e, - 0x72, 0x88, 0xe0, 0xbb, 0xbf, 0xa5, 0x0d, 0xa3, 0x34, 0x94, 0x21, 0x70, 0x9f, 0xc9, 0x6b, 0x28, - 0x33, 0xc4, 0x7a, 0x3c, 0xa5, 0xaa, 0x92, 0x28, 0x6a, 0xf2, 0x83, 0xad, 0x6f, 0x53, 0x8f, 0x68, - 0x7d, 0x8b, 0x63, 0x28, 0xa6, 0x7f, 0x9c, 0x31, 0x14, 0xa5, 0x9f, 0xa8, 0x18, 0x8a, 0x0f, 0x8a, - 0xb0, 0x90, 0xd6, 0x40, 0x4e, 0x3f, 0xb0, 0xf0, 0xef, 0x58, 0xb0, 0xa0, 0x56, 0x8f, 0xa0, 0xa9, - 0x75, 0xf1, 0x8d, 0x9c, 0x16, 0xad, 0xd0, 0xa5, 0x74, 0xc6, 0x85, 0xed, 0x14, 0x35, 0xec, 0xa3, - 0x4f, 0xde, 0x81, 0x19, 0x7d, 0xfd, 0xf0, 0x48, 0x51, 0x86, 0xf3, 0x5c, 0x8b, 0x8a, 0x51, 0xa0, - 0x89, 0x8f, 0x7c, 0x60, 0x01, 0x34, 0xd4, 0x36, 0xa7, 0x56, 0xd7, 0xad, 0xbc, 0x56, 0x97, 0xde, - 0x40, 0x63, 0x65, 0x59, 0x17, 0x85, 0x68, 0x10, 0x26, 0xbf, 0xc2, 0x2f, 0x1e, 0xb4, 0x76, 0x27, - 0x32, 0x39, 0x8c, 0xed, 0x1f, 0x7e, 0x82, 0x62, 0x1a, 0xab, 0x52, 0x06, 0x28, 0xc4, 0x04, 0x13, - 0xf6, 0xeb, 0xa0, 0x3d, 0x7a, 0x99, 0xd8, 0xe2, 0x3e, 0xbd, 0x5b, 0x4e, 0xb4, 0x27, 0xa7, 0xa0, - 0x16, 0x5b, 0x57, 0x15, 0x00, 0xe3, 0x3a, 0xf6, 0xe7, 0x60, 0xee, 0xcd, 0xc0, 0xe9, 0xee, 0xb9, - 0xdc, 0xc0, 0xcf, 0x0e, 0x92, 0x2f, 0xc2, 0xb4, 0xd3, 0x6c, 0x66, 0x25, 0x07, 0xa9, 0x8a, 0x62, - 0x54, 0xf0, 0xa1, 0xce, 0x8c, 0xf6, 0xef, 0x5b, 0x40, 0xe2, 0x4b, 0x52, 0xd7, 0x6b, 0x6d, 0x3a, - 0x51, 0x63, 0x8f, 0x9d, 0x8f, 0xf6, 0x78, 0x69, 0xd6, 0xf9, 0xe8, 0x9a, 0x86, 0xa0, 0x51, 0x8b, - 0xbc, 0x07, 0x33, 0xe2, 0xdf, 0xdb, 0xfa, 0xf4, 0x35, 0xbe, 0x63, 0x32, 0xdf, 0x50, 0x38, 0x4f, - 0x62, 0x16, 0x5e, 0x8b, 0x29, 0xa0, 0x49, 0x8e, 0x75, 0xd5, 0xba, 0xb7, 0xdb, 0xee, 0xdd, 0x6f, - 0xee, 0xc4, 0x5d, 0xd5, 0x0d, 0xfc, 0x5d, 0xb7, 0x4d, 0xd3, 0x5d, 0xb5, 0x25, 0x8a, 0x51, 0xc1, - 0x87, 0xeb, 0xaa, 0x7f, 0x65, 0xc1, 0xf9, 0xf5, 0x30, 0x72, 0xfd, 0x35, 0x1a, 0x46, 0x6c, 0x5b, - 0x61, 0xc2, 0xa7, 0xd7, 0x1e, 0xc6, 0x39, 0x7f, 0x0d, 0x16, 0xe4, 0x85, 0x6d, 0x6f, 0x27, 0xa4, - 0x91, 0xa1, 0xc7, 0xeb, 0x75, 0xbc, 0x9a, 0x82, 0x63, 0x5f, 0x0b, 0x86, 0x45, 0xde, 0xdc, 0xc6, - 0x58, 0x0a, 0x49, 0x2c, 0xf5, 0x14, 0x1c, 0xfb, 0x5a, 0xd8, 0xdf, 0x2b, 0xc0, 0x39, 0xfe, 0x19, - 0xa9, 0xc0, 0x9a, 0xaf, 0x0f, 0x0a, 0xac, 0x19, 0x73, 0x29, 0x73, 0x5a, 0x8f, 0x10, 0x56, 0xf3, - 0xb7, 0x2d, 0x98, 0x6f, 0x26, 0x7b, 0x3a, 0x1f, 0x03, 0x56, 0xd6, 0x18, 0x0a, 0xff, 0xb4, 0x54, - 0x21, 0xa6, 0xe9, 0x93, 0x5f, 0xb5, 0x60, 0x3e, 0xc9, 0xa6, 0x92, 0xee, 0xa7, 0xd0, 0x49, 0xda, - 0xa1, 0x3c, 0x59, 0x1e, 0x62, 0x9a, 0x05, 0xfb, 0x0f, 0x27, 0xe4, 0x90, 0x9e, 0x46, 0xd4, 0x08, - 0xb9, 0x07, 0xe5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x63, 0x9e, 0x08, 0xb7, 0x37, 0xea, 0xc2, - 0x57, 0x22, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2d, 0x4e, 0xb8, 0xd1, 0x95, 0x84, 0x73, - 0x39, 0x8a, 0x6e, 0xaf, 0x6e, 0xa5, 0x09, 0xcb, 0x12, 0x46, 0x58, 0xd1, 0xb2, 0x7f, 0xd3, 0x82, - 0xf2, 0x75, 0x5f, 0xc9, 0x91, 0x9f, 0xcb, 0xc1, 0xd0, 0xa3, 0xf5, 0x41, 0x7d, 0x27, 0x1b, 0x1f, - 0x31, 0xde, 0x48, 0x98, 0x79, 0x9e, 0x31, 0x70, 0x2f, 0xf3, 0x1c, 0x69, 0x0c, 0xd5, 0x75, 0x7f, - 0x67, 0xa0, 0x9d, 0xf5, 0xd7, 0x8a, 0x70, 0xe6, 0x2d, 0xe7, 0x90, 0x7a, 0x91, 0x33, 0xfa, 0x26, - 0xf1, 0x2a, 0xcc, 0x38, 0x5d, 0x7e, 0xe9, 0x67, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x59, - 0x2f, 0x16, 0x68, 0x22, 0x84, 0x23, 0x4b, 0x14, 0xad, 0xa6, 0xe0, 0xd8, 0xd7, 0x82, 0x5c, 0x07, - 0x22, 0x23, 0x8e, 0xab, 0x8d, 0x86, 0xdf, 0xf3, 0x84, 0x48, 0x13, 0x46, 0x15, 0x7d, 0xd8, 0xdc, - 0xec, 0xab, 0x81, 0x19, 0xad, 0xc8, 0x67, 0x61, 0xb1, 0xc1, 0x31, 0xcb, 0xa3, 0x87, 0x89, 0x51, - 0x1c, 0x3f, 0x75, 0x50, 0xc4, 0xea, 0x80, 0x7a, 0x38, 0x10, 0x03, 0xe3, 0x34, 0x8c, 0xfc, 0xc0, - 0x69, 0x51, 0x13, 0xef, 0x54, 0x92, 0xd3, 0x7a, 0x5f, 0x0d, 0xcc, 0x68, 0x45, 0xbe, 0x08, 0xe5, - 0x68, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x6e, 0x4a, 0x27, 0x8d, 0x31, 0x2d, 0x6d, 0x72, 0xf4, 0xb7, - 0x15, 0x56, 0x63, 0x7a, 0xab, 0x22, 0x8c, 0x69, 0x92, 0x00, 0xa6, 0xc2, 0x86, 0xdf, 0xa5, 0xa1, - 0x54, 0xd9, 0xaf, 0xe7, 0x42, 0x9d, 0x5b, 0x8e, 0x0c, 0x1b, 0x1f, 0xa7, 0x80, 0x92, 0x92, 0xfd, - 0x7b, 0x13, 0x30, 0x6b, 0x56, 0x1c, 0x42, 0x36, 0x7d, 0xd9, 0x82, 0xd9, 0x86, 0xef, 0x45, 0x81, - 0xdf, 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x86, 0x6a, 0x8d, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, - 0x06, 0x19, 0x4c, 0x10, 0x25, 0x5f, 0xb3, 0x60, 0x3e, 0xf6, 0xe9, 0x8b, 0x0d, 0x69, 0xb9, 0x32, - 0xa2, 0x45, 0xfd, 0x95, 0x24, 0x25, 0x4c, 0x93, 0xb6, 0x77, 0x60, 0x21, 0x3d, 0xda, 0xac, 0x2b, - 0xbb, 0x8e, 0x5c, 0xeb, 0x85, 0xb8, 0x2b, 0xb7, 0x9c, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x41, 0xa9, - 0xe3, 0x04, 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x17, 0x0b, 0x86, 0x40, 0x92, 0xe5, 0xa8, 0x6b, 0xd8, - 0x1f, 0x83, 0xd9, 0x4d, 0xc7, 0x6b, 0xd1, 0xa6, 0x94, 0xc3, 0x0f, 0x8f, 0x5b, 0xfc, 0xf3, 0x49, - 0x98, 0x31, 0xce, 0x66, 0xa7, 0x7f, 0xce, 0x4a, 0xa4, 0x4d, 0x29, 0xe4, 0x98, 0x36, 0xe5, 0xd3, - 0x00, 0xbb, 0xae, 0xe7, 0x86, 0x7b, 0x8f, 0x98, 0x90, 0x85, 0x5f, 0x62, 0x5f, 0xd5, 0x18, 0xd0, - 0xc0, 0x16, 0xdf, 0x14, 0x16, 0x4f, 0xc8, 0x2e, 0xf6, 0x81, 0x65, 0x6c, 0x37, 0x53, 0x79, 0x78, - 0x46, 0x18, 0x03, 0xb3, 0xac, 0xb6, 0x1f, 0x71, 0x89, 0x73, 0xd2, 0xae, 0xb4, 0x0d, 0xa5, 0x80, - 0x86, 0xbd, 0x0e, 0x3b, 0x31, 0x4e, 0x8f, 0xdc, 0x0d, 0xdc, 0x47, 0x05, 0x65, 0x7b, 0xd4, 0x98, - 0x96, 0x5e, 0x87, 0x33, 0x09, 0x16, 0x46, 0xba, 0xbe, 0xf1, 0x21, 0xd3, 0x00, 0xf0, 0x28, 0x97, - 0x39, 0x6c, 0x2c, 0xda, 0x46, 0x46, 0x16, 0x3d, 0x16, 0xc2, 0x13, 0x49, 0xc0, 0xec, 0x1f, 0x4d, - 0x81, 0xbc, 0xec, 0x1f, 0x42, 0x5c, 0x99, 0x57, 0x7c, 0x13, 0x8f, 0x70, 0xc5, 0x77, 0x1d, 0x66, - 0x5d, 0xcf, 0x8d, 0x5c, 0xa7, 0xcd, 0x8d, 0x3b, 0x72, 0x3b, 0x55, 0xae, 0xda, 0xb3, 0xeb, 0x06, - 0x2c, 0x03, 0x4f, 0xa2, 0x2d, 0xb9, 0x05, 0x45, 0xbe, 0xdf, 0xc8, 0x09, 0x3c, 0xba, 0x47, 0x02, - 0x77, 0x46, 0x11, 0xf1, 0x5b, 0x02, 0x13, 0x3f, 0x7c, 0x88, 0x94, 0x34, 0xfa, 0xf8, 0x2d, 0xe7, - 0x71, 0x7c, 0xf8, 0x48, 0xc1, 0xb1, 0xaf, 0x05, 0xc3, 0xb2, 0xeb, 0xb8, 0xed, 0x5e, 0x40, 0x63, - 0x2c, 0x53, 0x49, 0x2c, 0x57, 0x53, 0x70, 0xec, 0x6b, 0x41, 0x76, 0x61, 0x56, 0x96, 0x09, 0xff, - 0xb2, 0xe9, 0x47, 0xfc, 0x4a, 0xee, 0x47, 0x78, 0xd5, 0xc0, 0x84, 0x09, 0xbc, 0xa4, 0x07, 0x67, - 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0x0f, 0x68, 0x1c, 0x3c, 0xf5, 0x28, 0xc4, 0x2e, - 0x1c, 0x1f, 0x55, 0xce, 0xae, 0xa7, 0xd1, 0x61, 0x3f, 0x05, 0xf2, 0x25, 0x0b, 0x2e, 0x34, 0x7c, - 0x2f, 0xe4, 0x39, 0x1e, 0x0e, 0xe8, 0x95, 0x20, 0xf0, 0x03, 0x41, 0xbb, 0xfc, 0x88, 0xb4, 0xb9, - 0x4d, 0x71, 0x35, 0x0b, 0x25, 0x66, 0x53, 0x22, 0xef, 0x42, 0xa9, 0x1b, 0xf8, 0x07, 0x6e, 0x93, - 0x06, 0xd2, 0x57, 0x71, 0x23, 0x8f, 0x9c, 0x33, 0x5b, 0x12, 0x67, 0x2c, 0x7a, 0x54, 0x09, 0x6a, - 0x7a, 0xf6, 0xff, 0x9a, 0x81, 0xb9, 0x64, 0x75, 0xf2, 0x0b, 0x00, 0xdd, 0xc0, 0xef, 0xd0, 0x68, - 0x8f, 0xea, 0x20, 0x98, 0x1b, 0xe3, 0xa6, 0x36, 0x51, 0xf8, 0x94, 0x7f, 0x0f, 0x13, 0x17, 0x71, - 0x29, 0x1a, 0x14, 0x49, 0x00, 0xd3, 0xfb, 0x62, 0xdb, 0x95, 0x5a, 0xc8, 0x5b, 0xb9, 0xe8, 0x4c, - 0x92, 0x32, 0x8f, 0xde, 0x90, 0x45, 0xa8, 0x08, 0x91, 0x1d, 0x28, 0xdc, 0xa3, 0x3b, 0xf9, 0xc4, - 0xd5, 0xdf, 0xa1, 0xf2, 0x34, 0x53, 0x9b, 0x3e, 0x3e, 0xaa, 0x14, 0xee, 0xd0, 0x1d, 0x64, 0xc8, - 0xd9, 0x77, 0x35, 0xc5, 0x25, 0xbf, 0x14, 0x15, 0x6f, 0xe5, 0xe8, 0x31, 0x20, 0xbe, 0x4b, 0x16, - 0xa1, 0x22, 0x44, 0xde, 0x85, 0xf2, 0x3d, 0xe7, 0x80, 0xee, 0x06, 0xbe, 0x17, 0x49, 0xa7, 0xb2, - 0x31, 0xe3, 0x22, 0xee, 0x28, 0x74, 0x92, 0x2e, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xe4, 0xc8, 0x01, - 0x94, 0x3c, 0x7a, 0x0f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x87, 0x70, 0x43, 0x62, 0x93, 0x94, 0xf9, - 0xbe, 0xa7, 0xca, 0x50, 0xd3, 0x62, 0x63, 0x79, 0xd7, 0xdf, 0x91, 0x82, 0x6a, 0xcc, 0xb1, 0xd4, - 0x27, 0x53, 0x31, 0x96, 0xd7, 0xfd, 0x1d, 0x64, 0xc8, 0xd9, 0x1a, 0x69, 0x68, 0x8f, 0x26, 0x29, - 0xa6, 0x6e, 0xe4, 0xeb, 0xc9, 0x25, 0xd6, 0x48, 0x5c, 0x8a, 0x06, 0x45, 0xd6, 0xb7, 0x2d, 0x69, - 0xac, 0x94, 0x82, 0x6a, 0xcc, 0xbe, 0x4d, 0x9a, 0x3e, 0x45, 0xdf, 0xaa, 0x32, 0xd4, 0xb4, 0x18, - 0x5d, 0x57, 0x5a, 0xfe, 0xf2, 0x11, 0x55, 0x49, 0x3b, 0xa2, 0xa0, 0xab, 0xca, 0x50, 0xd3, 0x62, - 0xfd, 0x1d, 0xee, 0x1f, 0xde, 0x73, 0xda, 0xfb, 0xae, 0xd7, 0x92, 0x41, 0x9d, 0xe3, 0x66, 0x30, - 0xde, 0x3f, 0xbc, 0x23, 0xf0, 0x99, 0xfd, 0x1d, 0x97, 0xa2, 0x41, 0x91, 0xfc, 0x03, 0x0b, 0xa6, - 0xba, 0xed, 0x5e, 0xcb, 0xf5, 0x16, 0x67, 0xf3, 0xf0, 0xf6, 0x49, 0x8a, 0xdc, 0xe5, 0x2d, 0x8e, - 0x5a, 0x28, 0x8a, 0x3f, 0xad, 0x1d, 0x14, 0x79, 0xe1, 0x2f, 0xfd, 0x59, 0x65, 0x91, 0x7a, 0x0d, - 0xbf, 0xe9, 0x7a, 0xad, 0x95, 0xbb, 0xa1, 0xef, 0x2d, 0xa3, 0x73, 0x4f, 0xe9, 0xe8, 0x92, 0xa7, - 0xa5, 0x4f, 0xc0, 0x8c, 0x81, 0xe2, 0x61, 0x8a, 0xde, 0xac, 0xa9, 0xe8, 0xfd, 0xe6, 0x14, 0xcc, - 0x9a, 0x59, 0x13, 0x87, 0xd0, 0xbe, 0xf4, 0x89, 0x63, 0x62, 0x94, 0x13, 0x07, 0x3b, 0x62, 0x1a, - 0xb7, 0x47, 0xca, 0xbc, 0xb5, 0x9e, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x44, - 0x47, 0x70, 0x28, 0x61, 0x6a, 0xab, 0x50, 0xec, 0x8a, 0x49, 0xb5, 0x35, 0xa1, 0xaa, 0x5d, 0x06, - 0x88, 0xb3, 0x07, 0xca, 0x5b, 0x45, 0xad, 0x0f, 0x1b, 0x59, 0x0d, 0x8d, 0x5a, 0xe4, 0x05, 0x98, - 0x62, 0xaa, 0x0f, 0x6d, 0xca, 0x98, 0x73, 0x7d, 0x8e, 0xbf, 0xca, 0x4b, 0x51, 0x42, 0xc9, 0x6b, - 0x4c, 0x4b, 0x8d, 0x15, 0x16, 0x19, 0x4a, 0x7e, 0x3e, 0xd6, 0x52, 0x63, 0x18, 0x26, 0x6a, 0x32, - 0xd6, 0x29, 0xd3, 0x2f, 0xb8, 0x6c, 0x30, 0x58, 0xe7, 0x4a, 0x07, 0x0a, 0x18, 0xb7, 0x2b, 0xa5, - 0xf4, 0x11, 0xbe, 0xa6, 0x8b, 0x86, 0x5d, 0x29, 0x05, 0xc7, 0xbe, 0x16, 0xec, 0x63, 0xe4, 0x85, - 0xe8, 0x8c, 0xf0, 0x2c, 0x1e, 0x70, 0x95, 0xf9, 0x15, 0xf3, 0xac, 0x95, 0xe3, 0x1a, 0x12, 0xb3, - 0x76, 0xf8, 0xc3, 0xd6, 0x78, 0xc7, 0xa2, 0xcf, 0xc1, 0x5c, 0x72, 0x17, 0xca, 0xfd, 0xe6, 0xe3, - 0xab, 0x93, 0x70, 0xee, 0x46, 0xcb, 0xf5, 0xd2, 0x19, 0xc1, 0xb2, 0x12, 0xc2, 0x5b, 0x23, 0x27, - 0x84, 0xd7, 0xc1, 0x6b, 0x32, 0xdd, 0x7a, 0x76, 0xf0, 0x9a, 0xca, 0x7d, 0x9f, 0xac, 0x4b, 0xfe, - 0xd4, 0x82, 0x67, 0x9c, 0xa6, 0x38, 0x17, 0x38, 0x6d, 0x59, 0x6a, 0xe4, 0x31, 0x96, 0x2b, 0x3a, - 0x1c, 0x73, 0x97, 0xef, 0xff, 0xf8, 0xe5, 0xea, 0x09, 0x54, 0xc5, 0x88, 0xff, 0x94, 0xfc, 0x82, - 0x67, 0x4e, 0xaa, 0x8a, 0x27, 0xb2, 0x4f, 0xfe, 0x1a, 0xcc, 0x27, 0x3e, 0x58, 0x5a, 0xc2, 0xcb, - 0xe2, 0xc2, 0xa2, 0x9e, 0x04, 0x61, 0xba, 0xee, 0xd2, 0x4d, 0xf8, 0xf0, 0x43, 0xf9, 0x1c, 0x69, - 0xb2, 0x7d, 0xd7, 0x82, 0x59, 0x33, 0x79, 0x0f, 0x79, 0x09, 0x4a, 0x91, 0xbf, 0x4f, 0xbd, 0xdb, - 0x81, 0xf2, 0x6c, 0xd5, 0x13, 0x7d, 0x9b, 0x97, 0xe3, 0x06, 0xea, 0x1a, 0xac, 0x76, 0xa3, 0xed, - 0x52, 0x2f, 0x5a, 0x6f, 0xca, 0x61, 0xd6, 0xb5, 0x57, 0x45, 0xf9, 0x1a, 0xea, 0x1a, 0xc2, 0x81, - 0x8d, 0xfd, 0xae, 0xd3, 0x46, 0x40, 0x95, 0x1f, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x51, 0x93, - 0xd8, 0xda, 0xc4, 0x39, 0x19, 0xdf, 0x6b, 0xa4, 0x4c, 0x92, 0xbf, 0x6d, 0x41, 0x59, 0x98, 0xe8, - 0x91, 0xee, 0xa6, 0x7c, 0x51, 0x53, 0x46, 0x84, 0xea, 0xd6, 0x7a, 0x86, 0x2f, 0x2a, 0xdb, 0x96, - 0xf6, 0x5d, 0x4f, 0x7d, 0x89, 0xde, 0x96, 0xde, 0x72, 0xbd, 0x26, 0x72, 0x88, 0xde, 0xb8, 0x0a, - 0x03, 0x37, 0xae, 0x15, 0x28, 0x6b, 0xaf, 0x0e, 0x29, 0xfe, 0xb5, 0xf5, 0x56, 0x7b, 0x81, 0x60, - 0x5c, 0xc7, 0xfe, 0x75, 0x0b, 0xe6, 0x78, 0xb0, 0x73, 0x7c, 0x1e, 0x7e, 0x55, 0x3b, 0x5a, 0x09, - 0xbe, 0x9f, 0x4d, 0x3a, 0x5a, 0x3d, 0x38, 0xaa, 0xcc, 0x88, 0xf0, 0xe8, 0xa4, 0xdf, 0xd5, 0x67, - 0xa4, 0x11, 0x8d, 0xbb, 0x83, 0x4d, 0x8c, 0x6c, 0xe3, 0x89, 0xd9, 0x54, 0x48, 0x30, 0xc6, 0x67, - 0xbf, 0x07, 0xb3, 0x66, 0xd4, 0x12, 0x79, 0x15, 0x66, 0xba, 0xae, 0xd7, 0x4a, 0x46, 0xb7, 0xea, - 0x8b, 0x86, 0xad, 0x18, 0x84, 0x66, 0x3d, 0xde, 0xcc, 0x8f, 0x9b, 0xa5, 0xee, 0x27, 0xb6, 0x7c, - 0xb3, 0x59, 0xfc, 0x87, 0xe7, 0x90, 0xcf, 0x88, 0x8e, 0xcb, 0x3d, 0x87, 0x7c, 0x06, 0x8d, 0x1f, - 0x5f, 0x0e, 0xf9, 0x2c, 0x66, 0xfe, 0xcf, 0xca, 0x21, 0xff, 0xb3, 0x30, 0x6a, 0xf2, 0x50, 0xb6, - 0xd7, 0xdf, 0x33, 0x33, 0x10, 0xe8, 0x1e, 0x97, 0x29, 0x08, 0x24, 0xd4, 0xfe, 0x4e, 0x01, 0x16, - 0xd2, 0x47, 0xfe, 0xbc, 0xbd, 0x29, 0xc8, 0xd7, 0x2c, 0x98, 0x73, 0x12, 0x89, 0xda, 0x72, 0x7a, - 0x90, 0x26, 0x81, 0xd3, 0x48, 0x14, 0x96, 0x28, 0xc7, 0x14, 0x6d, 0xf2, 0xff, 0xc1, 0x74, 0xe4, - 0x76, 0xa8, 0xdf, 0x13, 0x86, 0xc0, 0x82, 0x38, 0x90, 0x6f, 0x8b, 0x22, 0x54, 0x30, 0x26, 0x94, - 0x5d, 0xae, 0x41, 0x05, 0x54, 0xba, 0xdd, 0x2e, 0xc4, 0x96, 0x4b, 0x51, 0x8e, 0xba, 0x06, 0xb9, - 0x0f, 0xd3, 0xc2, 0xef, 0x42, 0x39, 0xd8, 0x6c, 0xe6, 0x64, 0x9a, 0x10, 0xae, 0x1d, 0xf1, 0x10, - 0x88, 0xff, 0x21, 0x2a, 0x72, 0xf6, 0xc7, 0x60, 0xc4, 0x6c, 0xaa, 0xf6, 0x15, 0x20, 0xe8, 0xb7, - 0xdb, 0x3b, 0x4e, 0x63, 0xff, 0x8e, 0xeb, 0x35, 0xfd, 0x7b, 0x5c, 0x14, 0xad, 0x40, 0x39, 0x90, - 0xb1, 0xa5, 0xa1, 0x9c, 0x35, 0x5a, 0x96, 0xa9, 0xa0, 0xd3, 0x10, 0xe3, 0x3a, 0xf6, 0x1f, 0x4e, - 0xc0, 0xb4, 0x0c, 0x84, 0x7e, 0x0c, 0x6e, 0xff, 0xfb, 0x89, 0xfb, 0xe0, 0xf5, 0x5c, 0xe2, 0xb7, - 0x07, 0xfa, 0xfc, 0x87, 0x29, 0x9f, 0xff, 0xb7, 0xf2, 0x21, 0x77, 0xb2, 0xc3, 0xff, 0x1f, 0x14, - 0x61, 0x3e, 0x15, 0x58, 0xce, 0x74, 0xf1, 0x3e, 0x3f, 0xd7, 0xdb, 0xb9, 0xc6, 0xae, 0xeb, 0xa0, - 0x9d, 0x93, 0x5d, 0x5e, 0xc3, 0x44, 0xee, 0xeb, 0x5b, 0xb9, 0x3d, 0xeb, 0xf1, 0x97, 0x69, 0xb0, - 0x47, 0x74, 0xe1, 0x24, 0xdf, 0xb2, 0xe0, 0x9c, 0xd3, 0xff, 0x2e, 0x8a, 0xb4, 0x19, 0xde, 0xca, - 0xfd, 0xc1, 0x95, 0xda, 0xd3, 0x92, 0xc9, 0xac, 0xe7, 0x67, 0x30, 0x8b, 0x15, 0xfb, 0x3f, 0x5a, - 0xf0, 0xd4, 0xc0, 0x14, 0x09, 0x3c, 0xc3, 0x56, 0x90, 0x84, 0x4a, 0x99, 0x91, 0x73, 0x22, 0x18, - 0x7d, 0x7f, 0x9c, 0x4e, 0x8a, 0x94, 0x26, 0x4f, 0x5e, 0x81, 0x59, 0xae, 0xa3, 0x31, 0xe9, 0x19, - 0xd1, 0xae, 0xbc, 0xfe, 0xe2, 0x17, 0x21, 0x75, 0xa3, 0x1c, 0x13, 0xb5, 0xec, 0x6f, 0x59, 0xb0, - 0x38, 0x28, 0xdf, 0xd2, 0x10, 0xc6, 0x99, 0xbf, 0x9a, 0x0a, 0x9d, 0xa8, 0xf4, 0x85, 0x4e, 0xa4, - 0xcc, 0x33, 0x2a, 0x4a, 0xc2, 0xb0, 0x8c, 0x14, 0x1e, 0x12, 0x19, 0xf0, 0x75, 0x0b, 0x9e, 0x1c, - 0xb0, 0xe0, 0xfb, 0x42, 0x68, 0xac, 0x47, 0x0e, 0xa1, 0x99, 0x18, 0x36, 0x84, 0xc6, 0xfe, 0xa3, - 0x02, 0x2c, 0x48, 0x7e, 0x62, 0x45, 0xfd, 0xb5, 0x44, 0x00, 0xca, 0x4f, 0xa5, 0x02, 0x50, 0xce, - 0xa7, 0xeb, 0xff, 0x65, 0xf4, 0xc9, 0x4f, 0x56, 0xf4, 0xc9, 0x5f, 0x4c, 0xc0, 0x85, 0xcc, 0x34, - 0x50, 0xe4, 0xab, 0x19, 0xbb, 0xd7, 0x9d, 0x9c, 0xf3, 0x4d, 0x0d, 0xb9, 0x7f, 0x8d, 0x1b, 0xb2, - 0xf1, 0xab, 0x66, 0xa8, 0x84, 0xd8, 0x8d, 0x76, 0x4f, 0x21, 0x73, 0xd6, 0x88, 0x51, 0x13, 0xf6, - 0x2f, 0x15, 0xe0, 0xd2, 0xb0, 0x88, 0x7e, 0x42, 0xa3, 0xea, 0xc2, 0x44, 0x54, 0xdd, 0x63, 0xd2, - 0x2c, 0x4e, 0x25, 0xc0, 0xee, 0x1f, 0x4d, 0xea, 0x6d, 0xaf, 0x7f, 0x7e, 0x0e, 0xe5, 0x2b, 0x31, - 0xcd, 0xb4, 0x4f, 0x95, 0x41, 0x3b, 0x16, 0x85, 0xd3, 0x75, 0x51, 0xfc, 0xe0, 0xa8, 0x72, 0x36, - 0x4e, 0x46, 0x22, 0x0b, 0x51, 0x35, 0x22, 0x97, 0xa0, 0x14, 0x08, 0xa8, 0x8a, 0x23, 0x92, 0x0e, - 0x27, 0xa2, 0x0c, 0x35, 0x94, 0x7c, 0xd1, 0x50, 0xd7, 0x27, 0x4f, 0x2b, 0xe7, 0xce, 0x49, 0x7e, - 0x34, 0xef, 0x40, 0x29, 0x54, 0x69, 0x9e, 0x85, 0xe2, 0xf2, 0xf2, 0x90, 0xe1, 0x69, 0xec, 0x0c, - 0xae, 0x72, 0x3e, 0x8b, 0xef, 0xd3, 0x19, 0xa1, 0x35, 0x4a, 0x62, 0xeb, 0xe3, 0xaf, 0xb0, 0xf3, - 0x43, 0xff, 0xd1, 0x97, 0x44, 0x30, 0x2d, 0x5f, 0xff, 0x94, 0x17, 0x90, 0x9b, 0x39, 0x85, 0xa2, - 0x48, 0x47, 0x65, 0x7e, 0xaa, 0x54, 0x66, 0x18, 0x45, 0xca, 0xfe, 0xbe, 0x05, 0x33, 0x72, 0x8e, - 0x3c, 0x86, 0x38, 0xbd, 0xbb, 0xc9, 0x38, 0xbd, 0x2b, 0xb9, 0x48, 0xac, 0x01, 0x41, 0x7a, 0x77, - 0x61, 0xd6, 0xcc, 0x3f, 0x48, 0x3e, 0x6d, 0x48, 0x5c, 0x6b, 0x9c, 0x8c, 0x5e, 0x4a, 0x26, 0xc7, - 0xd2, 0xd8, 0xfe, 0xad, 0xb2, 0xee, 0x45, 0x7e, 0x76, 0x35, 0x67, 0xbe, 0x75, 0xe2, 0xcc, 0x37, - 0x27, 0xde, 0x44, 0xfe, 0x13, 0xef, 0x16, 0x94, 0x94, 0x58, 0x94, 0xca, 0xc3, 0xf3, 0xa6, 0xe7, - 0x32, 0xd3, 0x40, 0x18, 0x32, 0x63, 0xb9, 0xf0, 0x33, 0x68, 0x6c, 0x1c, 0x56, 0xe2, 0x5a, 0xa3, - 0x21, 0xef, 0xc2, 0xcc, 0x3d, 0x3f, 0xd8, 0x6f, 0xfb, 0x0e, 0xcf, 0xad, 0x0f, 0x79, 0x5c, 0x96, - 0x6b, 0x03, 0xaf, 0x08, 0x1f, 0xb9, 0x13, 0xe3, 0x47, 0x93, 0x18, 0xa9, 0xc2, 0x7c, 0xc7, 0xf5, - 0x90, 0x3a, 0x4d, 0x1d, 0x8e, 0x37, 0x29, 0xf2, 0x5a, 0x2b, 0xd5, 0x7a, 0x33, 0x09, 0xc6, 0x74, - 0x7d, 0x6e, 0xfc, 0x09, 0x12, 0xd6, 0x06, 0x99, 0xbc, 0x76, 0x6b, 0xfc, 0xc9, 0x98, 0xb4, 0x60, - 0x88, 0xf8, 0x89, 0x64, 0x39, 0xa6, 0x68, 0x93, 0x2f, 0x40, 0x29, 0x94, 0xc9, 0x05, 0xf3, 0xf1, - 0xb2, 0xd0, 0x67, 0x7b, 0x81, 0x34, 0x1e, 0x4a, 0x55, 0x82, 0x9a, 0x20, 0xd9, 0x80, 0xf3, 0xca, - 0x7c, 0x92, 0x78, 0xff, 0x6c, 0x2a, 0xce, 0x45, 0x85, 0x19, 0x70, 0xcc, 0x6c, 0xc5, 0x54, 0x39, - 0x9e, 0xd7, 0x53, 0x5c, 0x4e, 0x1a, 0xf7, 0x79, 0x7c, 0xfd, 0x35, 0x51, 0x42, 0x4f, 0x8a, 0x36, - 0x2d, 0x8d, 0x11, 0x6d, 0x5a, 0x87, 0x0b, 0x69, 0x10, 0x4f, 0x32, 0xc6, 0xf3, 0x9a, 0x19, 0x5b, - 0xe8, 0x56, 0x56, 0x25, 0xcc, 0x6e, 0x4b, 0xee, 0x40, 0x39, 0xa0, 0xfc, 0x90, 0x55, 0x55, 0x7e, - 0x5d, 0x23, 0x7b, 0xb0, 0xa2, 0x42, 0x80, 0x31, 0x2e, 0x36, 0xee, 0x4e, 0x32, 0xd3, 0xf4, 0xad, - 0x1c, 0x1f, 0xde, 0x95, 0x63, 0x3f, 0x20, 0xf9, 0x9f, 0xfd, 0xaf, 0xe7, 0xe1, 0x4c, 0xc2, 0x06, - 0x44, 0x9e, 0x87, 0x22, 0xcf, 0xba, 0xc6, 0xa5, 0x55, 0x29, 0x96, 0xa8, 0xa2, 0x73, 0x04, 0x8c, - 0xfc, 0xb2, 0x05, 0xf3, 0xdd, 0xc4, 0x9d, 0x86, 0x12, 0xe4, 0x63, 0x1a, 0x4e, 0x93, 0x17, 0x25, - 0xc6, 0x1b, 0x0d, 0x49, 0x62, 0x98, 0xa6, 0xce, 0xe4, 0x81, 0x74, 0x03, 0x6f, 0xd3, 0x80, 0xd7, - 0x96, 0x8a, 0x9e, 0x46, 0xb1, 0x9a, 0x04, 0x63, 0xba, 0x3e, 0x1b, 0x61, 0xfe, 0x75, 0xe3, 0x3c, - 0xed, 0x58, 0x55, 0x08, 0x30, 0xc6, 0x45, 0xde, 0x80, 0x39, 0x99, 0x60, 0x78, 0xcb, 0x6f, 0x5e, - 0x73, 0xc2, 0x3d, 0x79, 0xc2, 0xd1, 0x27, 0xb2, 0xd5, 0x04, 0x14, 0x53, 0xb5, 0xf9, 0xb7, 0xc5, - 0x59, 0x9c, 0x39, 0x82, 0xa9, 0xe4, 0x13, 0x16, 0xab, 0x49, 0x30, 0xa6, 0xeb, 0x93, 0x97, 0x8c, - 0x6d, 0x48, 0x38, 0x0c, 0x68, 0x69, 0x90, 0xb1, 0x15, 0x55, 0x61, 0xbe, 0xc7, 0x0f, 0x84, 0x4d, - 0x05, 0x94, 0xeb, 0x51, 0x13, 0xbc, 0x9d, 0x04, 0x63, 0xba, 0x3e, 0x79, 0x1d, 0xce, 0x04, 0x4c, - 0xd8, 0x6a, 0x04, 0xc2, 0x8b, 0x40, 0x5f, 0x12, 0xa3, 0x09, 0xc4, 0x64, 0x5d, 0xf2, 0x26, 0x9c, - 0x8d, 0xf3, 0x71, 0x2a, 0x04, 0xc2, 0xad, 0x40, 0x27, 0x87, 0xab, 0xa6, 0x2b, 0x60, 0x7f, 0x1b, - 0xf2, 0x37, 0x60, 0xc1, 0xe8, 0x89, 0x75, 0xaf, 0x49, 0xef, 0xcb, 0x9c, 0x89, 0xfc, 0x49, 0xa6, - 0xd5, 0x14, 0x0c, 0xfb, 0x6a, 0x93, 0x4f, 0xc2, 0x5c, 0xc3, 0x6f, 0xb7, 0xb9, 0x8c, 0x13, 0xcf, - 0x27, 0x88, 0xe4, 0x88, 0x22, 0x8d, 0x64, 0x02, 0x82, 0xa9, 0x9a, 0xe4, 0x3a, 0x10, 0x7f, 0x87, - 0xa9, 0x57, 0xb4, 0xf9, 0x26, 0xf5, 0xa8, 0xd4, 0x38, 0xce, 0x24, 0x83, 0x50, 0x6e, 0xf6, 0xd5, - 0xc0, 0x8c, 0x56, 0x3c, 0xb7, 0x9c, 0x11, 0xb4, 0x3b, 0x97, 0xc7, 0x33, 0x87, 0x69, 0xf3, 0xc5, - 0x43, 0x23, 0x76, 0x03, 0x98, 0x12, 0x31, 0x41, 0xf9, 0x64, 0x49, 0x34, 0x33, 0xa9, 0xc7, 0x7b, - 0x84, 0x28, 0x45, 0x49, 0x89, 0xfc, 0x02, 0x94, 0x77, 0xd4, 0xb3, 0x1a, 0x3c, 0x35, 0xe2, 0xd8, - 0xfb, 0x62, 0xea, 0x85, 0x98, 0xf8, 0x78, 0xae, 0x01, 0x18, 0x93, 0x24, 0x2f, 0xc0, 0xcc, 0xb5, - 0xad, 0xaa, 0x9e, 0x85, 0x67, 0xf9, 0xe8, 0x4f, 0xb2, 0x26, 0x68, 0x02, 0xd8, 0x0a, 0xd3, 0xea, - 0x1b, 0x49, 0xde, 0x94, 0x67, 0x68, 0x63, 0xac, 0x36, 0xbf, 0xfa, 0xc7, 0xfa, 0xe2, 0xb9, 0x54, - 0x6d, 0x59, 0x8e, 0xba, 0x06, 0x79, 0x07, 0x66, 0xe4, 0x7e, 0xc1, 0x65, 0xd3, 0xf9, 0x47, 0x0b, - 0x08, 0xc7, 0x18, 0x05, 0x9a, 0xf8, 0xf8, 0x9d, 0x2d, 0x7f, 0x6d, 0x80, 0x5e, 0xed, 0xb5, 0xdb, - 0x8b, 0x17, 0xb8, 0xdc, 0x8c, 0xef, 0x6c, 0x63, 0x10, 0x9a, 0xf5, 0xc8, 0xcb, 0xca, 0x85, 0xeb, - 0x43, 0x89, 0x4b, 0x6c, 0xed, 0xc2, 0xa5, 0x95, 0xee, 0x01, 0x31, 0x23, 0x4f, 0x3e, 0xc4, 0x77, - 0x6a, 0x07, 0x96, 0x94, 0xc6, 0xd7, 0xbf, 0x48, 0x16, 0x17, 0x13, 0xa6, 0x92, 0xa5, 0x3b, 0x03, - 0x6b, 0xe2, 0x09, 0x58, 0xc8, 0x0e, 0x14, 0x9c, 0xf6, 0xce, 0xe2, 0x53, 0x79, 0xa8, 0xae, 0xd5, - 0x8d, 0x9a, 0x9c, 0x51, 0xdc, 0xcf, 0xb3, 0xba, 0x51, 0x43, 0x86, 0x9c, 0xb8, 0x30, 0xe9, 0xb4, - 0x77, 0xc2, 0xc5, 0x25, 0xbe, 0x66, 0x73, 0x23, 0x12, 0x1b, 0x0f, 0x36, 0x6a, 0x21, 0x72, 0x12, - 0xf6, 0x97, 0x26, 0xf4, 0x45, 0x8d, 0x4e, 0x54, 0xfd, 0x9e, 0xb9, 0x80, 0xac, 0x3c, 0x9e, 0xbf, - 0xef, 0x7b, 0xe6, 0x46, 0xec, 0x7d, 0x99, 0xcb, 0xa7, 0xab, 0x45, 0x46, 0x2e, 0x59, 0xb1, 0x92, - 0x49, 0xb8, 0xc5, 0xe9, 0x39, 0x29, 0x30, 0xec, 0xef, 0x80, 0x36, 0xfa, 0xa5, 0xdc, 0x9f, 0x02, - 0x28, 0xba, 0x61, 0xe4, 0xfa, 0x39, 0xc6, 0x49, 0xa7, 0xb2, 0x57, 0xf3, 0x30, 0x0c, 0x0e, 0x40, - 0x41, 0x8a, 0xd1, 0xf4, 0x5a, 0xae, 0x77, 0x5f, 0x7e, 0xfe, 0xad, 0xdc, 0xfd, 0x9a, 0x04, 0x4d, - 0x0e, 0x40, 0x41, 0x8a, 0xdc, 0x15, 0x93, 0xba, 0x90, 0xc7, 0x58, 0x57, 0x37, 0x6a, 0x29, 0x7a, - 0xc9, 0xc9, 0x7d, 0x17, 0x0a, 0x61, 0xc7, 0x95, 0xea, 0xd2, 0x98, 0xb4, 0xea, 0x9b, 0xeb, 0x59, - 0xb4, 0xea, 0x9b, 0xeb, 0xc8, 0x88, 0x90, 0xaf, 0x58, 0x00, 0x4e, 0x67, 0xc7, 0x09, 0x43, 0xa7, - 0xa9, 0xad, 0x33, 0x63, 0xbe, 0x4a, 0x51, 0xd5, 0xf8, 0x52, 0xa4, 0xb9, 0x27, 0x6f, 0x0c, 0x45, - 0x83, 0x32, 0x79, 0x17, 0xa6, 0x1d, 0xf1, 0xec, 0x9f, 0x74, 0x4a, 0xcf, 0xe7, 0x2d, 0xcb, 0x14, - 0x07, 0xdc, 0x4c, 0x23, 0x41, 0xa8, 0x08, 0x32, 0xda, 0x51, 0xe0, 0xd0, 0x5d, 0x77, 0x5f, 0x1a, - 0x87, 0xea, 0x63, 0x3f, 0x4c, 0xc1, 0x90, 0x65, 0xd1, 0x96, 0x20, 0x54, 0x04, 0xc5, 0x33, 0xec, - 0x8e, 0xe7, 0xe8, 0x50, 0xc3, 0x7c, 0x02, 0x52, 0xcd, 0xe0, 0x45, 0xe3, 0x19, 0x76, 0x93, 0x10, - 0x26, 0xe9, 0x92, 0x03, 0x98, 0x72, 0xf8, 0x83, 0xa4, 0xf2, 0x28, 0x86, 0x79, 0x3c, 0x6e, 0x9a, - 0xea, 0x03, 0x2e, 0x5c, 0xe4, 0xb3, 0xa7, 0x92, 0x1a, 0xf9, 0x0d, 0x0b, 0xa6, 0x85, 0xbf, 0x34, - 0x53, 0x48, 0xd9, 0xb7, 0x7f, 0xee, 0x14, 0xb2, 0xe0, 0x4b, 0x5f, 0x6e, 0xe9, 0x01, 0xf4, 0x11, - 0xed, 0x0c, 0x2a, 0x4a, 0x4f, 0xf4, 0xe6, 0x56, 0xdc, 0x2d, 0x7d, 0x12, 0x66, 0x4d, 0x2c, 0x23, - 0xf9, 0x73, 0xff, 0xb0, 0x00, 0xc0, 0x3b, 0x5a, 0x24, 0x17, 0xe9, 0xf0, 0x94, 0xbd, 0x7b, 0x7e, - 0x33, 0xa7, 0xc7, 0x0b, 0x8d, 0x1c, 0x21, 0x20, 0xf3, 0xf3, 0xee, 0xf9, 0x4d, 0x94, 0x44, 0x48, - 0x0b, 0x26, 0xbb, 0x4e, 0xb4, 0x97, 0x7f, 0x42, 0x92, 0x92, 0x88, 0xb2, 0x8d, 0xf6, 0x90, 0x13, - 0x20, 0xef, 0x5b, 0xb1, 0x6b, 0x4c, 0x21, 0x1f, 0x07, 0x06, 0xd5, 0x67, 0xcb, 0xd2, 0x19, 0x26, - 0x95, 0x7c, 0x33, 0xed, 0x22, 0xb3, 0xf4, 0x81, 0x05, 0xb3, 0x66, 0xd5, 0x8c, 0x61, 0xfa, 0x79, - 0x73, 0x98, 0xf2, 0xec, 0x0f, 0x73, 0xc4, 0xff, 0x8b, 0x05, 0x10, 0x3f, 0xc5, 0x1f, 0xbb, 0xad, - 0x5b, 0x43, 0xbb, 0xad, 0x4f, 0x8c, 0xe8, 0xb6, 0x5e, 0x18, 0xc9, 0x6d, 0x7d, 0x72, 0x74, 0xb7, - 0xf5, 0xe2, 0x60, 0xb7, 0x75, 0xfb, 0x1b, 0x16, 0x9c, 0xed, 0xdb, 0x6d, 0x98, 0x1e, 0x1c, 0xf8, - 0x7e, 0x34, 0xc0, 0xe5, 0x11, 0x63, 0x10, 0x9a, 0xf5, 0xc8, 0x1a, 0x2c, 0xc8, 0x07, 0x2a, 0xea, - 0xdd, 0xb6, 0x9b, 0x99, 0x2c, 0x66, 0x3b, 0x05, 0xc7, 0xbe, 0x16, 0xf6, 0x77, 0x2c, 0x98, 0x31, - 0x42, 0xcc, 0xd9, 0x77, 0x70, 0xbf, 0x57, 0xc9, 0x46, 0xfc, 0x36, 0x07, 0xbf, 0xa8, 0x12, 0x30, - 0x71, 0x67, 0xda, 0x32, 0xd2, 0x97, 0xc7, 0x77, 0xa6, 0xac, 0x14, 0x25, 0x54, 0x24, 0xa6, 0xa6, - 0x5d, 0xde, 0xe9, 0x05, 0x33, 0x31, 0x35, 0xed, 0x22, 0x87, 0x70, 0x72, 0xec, 0x40, 0x20, 0x5d, - 0x5a, 0x8d, 0xa7, 0x40, 0x9c, 0x20, 0x42, 0x01, 0x23, 0xcf, 0x42, 0x81, 0x7a, 0x4d, 0x69, 0xbd, - 0xd0, 0x8f, 0x75, 0x5e, 0xf1, 0x9a, 0xc8, 0xca, 0xed, 0x9b, 0x30, 0x2b, 0xdc, 0x79, 0xdf, 0xa2, - 0x87, 0x43, 0xbf, 0xfe, 0xc9, 0x66, 0x7b, 0xea, 0xf5, 0x4f, 0xd6, 0x9c, 0x95, 0xdb, 0xff, 0xd4, - 0x82, 0xd4, 0x7b, 0x35, 0xc6, 0xfd, 0x89, 0x35, 0xf0, 0xfe, 0xc4, 0xb4, 0xb9, 0x4f, 0x9c, 0x68, - 0x73, 0xbf, 0x0e, 0xa4, 0xc3, 0x96, 0x42, 0xe2, 0x75, 0x26, 0x69, 0x38, 0x8a, 0x13, 0x5a, 0xf4, - 0xd5, 0xc0, 0x8c, 0x56, 0xf6, 0x3f, 0x11, 0xcc, 0x9a, 0x2f, 0xd8, 0x3c, 0xbc, 0x03, 0x7a, 0x50, - 0xe4, 0xa8, 0xa4, 0xf5, 0x6c, 0x4c, 0xcb, 0x73, 0x7f, 0x62, 0xa8, 0x78, 0x20, 0xe5, 0x92, 0xe7, - 0xd4, 0xec, 0x3f, 0x12, 0xbc, 0x1a, 0x4f, 0xdc, 0x0c, 0xc1, 0x6b, 0x27, 0xc9, 0xeb, 0xb5, 0xbc, - 0x64, 0x65, 0x36, 0x8f, 0x64, 0x19, 0xa0, 0x4b, 0x83, 0x06, 0xf5, 0x22, 0x15, 0x68, 0x53, 0x94, - 0x21, 0x9f, 0xba, 0x14, 0x8d, 0x1a, 0xf6, 0xd7, 0xd9, 0x02, 0x8a, 0xdf, 0xc5, 0x25, 0x97, 0xd2, - 0xbe, 0xa2, 0xe9, 0xc5, 0xa1, 0x5d, 0x45, 0x8d, 0xf0, 0x8b, 0x89, 0x87, 0x84, 0x5f, 0xbc, 0x08, - 0xd3, 0x81, 0xdf, 0xa6, 0xd5, 0xc0, 0x4b, 0x3b, 0xb8, 0x20, 0x2b, 0xc6, 0x1b, 0xa8, 0xe0, 0xf6, - 0xaf, 0x59, 0xb0, 0x90, 0x8e, 0x0f, 0xcb, 0xdd, 0x81, 0xd5, 0x0c, 0x62, 0x2f, 0x8c, 0x1e, 0xc4, - 0x6e, 0xbf, 0xcf, 0x98, 0x8c, 0xdc, 0xc6, 0xbe, 0xeb, 0x89, 0xb8, 0x6f, 0xd6, 0x73, 0x2f, 0xc2, - 0x34, 0x95, 0xef, 0x7b, 0x0a, 0x23, 0xb0, 0x66, 0x52, 0x3d, 0xeb, 0xa9, 0xe0, 0xa4, 0x0a, 0xf3, - 0xea, 0xea, 0x4b, 0x59, 0xee, 0x45, 0xbe, 0x0a, 0x6d, 0x29, 0x5c, 0x4b, 0x82, 0x31, 0x5d, 0xdf, - 0xfe, 0x22, 0xcc, 0x18, 0x9b, 0x12, 0x97, 0xdf, 0xf7, 0x9d, 0x46, 0x94, 0x96, 0x7b, 0x57, 0x58, - 0x21, 0x0a, 0x18, 0xbf, 0x60, 0x10, 0xe1, 0x2b, 0x29, 0xb9, 0x27, 0x83, 0x56, 0x24, 0x94, 0x21, - 0x0b, 0x68, 0x8b, 0xde, 0x57, 0xd9, 0xe5, 0x15, 0x32, 0x64, 0x85, 0x28, 0x60, 0xf6, 0x4b, 0x50, - 0x52, 0x59, 0x85, 0x78, 0x6a, 0x0e, 0x65, 0xfc, 0x36, 0x53, 0x73, 0xf8, 0x41, 0x84, 0x1c, 0x62, - 0xbf, 0x0d, 0x25, 0x95, 0xfc, 0xe8, 0xe1, 0xb5, 0x99, 0x28, 0x0a, 0x3d, 0xf7, 0x9a, 0x1f, 0x46, - 0x2a, 0x63, 0x93, 0xb8, 0x9f, 0xbb, 0xb1, 0xce, 0xcb, 0x50, 0x43, 0xed, 0x97, 0x61, 0x3e, 0x75, - 0x4f, 0x3b, 0x44, 0x1e, 0x8f, 0xdf, 0x2b, 0xc0, 0xac, 0x79, 0x5d, 0x37, 0xc4, 0x2a, 0x1e, 0x5e, - 0x38, 0x66, 0x5c, 0xb1, 0x15, 0x46, 0xbc, 0x62, 0x33, 0xef, 0x34, 0x27, 0x4f, 0xf7, 0x4e, 0xb3, - 0x98, 0xcf, 0x9d, 0xa6, 0x71, 0xf7, 0x3e, 0xf5, 0xf8, 0xee, 0xde, 0x7f, 0xa7, 0x08, 0x73, 0xc9, - 0xc4, 0x90, 0x43, 0x8c, 0xe4, 0x4b, 0x7d, 0x23, 0x39, 0xa2, 0x4d, 0xbf, 0x30, 0xae, 0x4d, 0x7f, - 0x72, 0x5c, 0x9b, 0x7e, 0xf1, 0x11, 0x6c, 0xfa, 0xfd, 0x16, 0xf9, 0xa9, 0xa1, 0x2d, 0xf2, 0x9f, - 0xd2, 0x5e, 0x79, 0xd3, 0x09, 0x37, 0x96, 0xd8, 0x2b, 0x8f, 0x24, 0x87, 0x61, 0xd5, 0x6f, 0x66, - 0x7a, 0x37, 0x96, 0x1e, 0x62, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x46, 0xbf, 0x36, 0xfc, 0xd0, 0x08, - 0x0e, 0x74, 0xaf, 0xc2, 0x8c, 0x9c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8f, 0x41, 0x68, - 0xd6, 0xe3, 0x0f, 0xa4, 0x27, 0x9f, 0xcd, 0xe7, 0x57, 0x24, 0xe6, 0x03, 0xe9, 0xa9, 0x67, 0xf6, - 0xd3, 0xf5, 0xed, 0x2f, 0xc0, 0x85, 0x4c, 0x33, 0x02, 0x37, 0xe1, 0x72, 0xed, 0x88, 0x36, 0x65, - 0x05, 0x83, 0x8d, 0xd4, 0xc3, 0x0a, 0x4b, 0x77, 0x06, 0xd6, 0xc4, 0x13, 0xb0, 0xd8, 0xdf, 0x2e, - 0xc0, 0x5c, 0xf2, 0x75, 0x4d, 0x72, 0x4f, 0x1b, 0x1d, 0x73, 0xb1, 0x77, 0x0a, 0xb4, 0x46, 0xb2, - 0xc1, 0x81, 0x97, 0x15, 0xf7, 0xf8, 0xfc, 0xda, 0xd1, 0x99, 0x0f, 0x4f, 0x8f, 0xb0, 0xbc, 0x25, - 0x90, 0xe4, 0xf8, 0x03, 0x9a, 0x71, 0x5c, 0xa2, 0x3c, 0xcd, 0xe6, 0x4e, 0x3d, 0x8e, 0xaf, 0xd3, - 0xa4, 0xd0, 0x20, 0xcb, 0xf6, 0x96, 0x03, 0x1a, 0xb8, 0xbb, 0xae, 0x7e, 0x19, 0x9c, 0x4b, 0xee, - 0xb7, 0x65, 0x19, 0x6a, 0xa8, 0xfd, 0xfe, 0x04, 0x94, 0x79, 0x1a, 0xa5, 0xab, 0x81, 0xdf, 0xe1, - 0x4f, 0xd0, 0x85, 0xc6, 0xc9, 0x41, 0x0e, 0xdb, 0xf5, 0x71, 0xdf, 0x79, 0x8c, 0x31, 0x4a, 0x8f, - 0x69, 0xa3, 0x04, 0x13, 0x14, 0x49, 0x17, 0x4a, 0xbb, 0x32, 0xed, 0xab, 0x1c, 0xbb, 0x31, 0x53, - 0x17, 0xaa, 0x24, 0xb2, 0xa2, 0x0b, 0xd4, 0x3f, 0xd4, 0x54, 0x6c, 0x07, 0xe6, 0x53, 0x79, 0x30, - 0x72, 0x4f, 0x16, 0xfb, 0xdf, 0x27, 0xa1, 0xac, 0xc3, 0x75, 0xc8, 0x27, 0x12, 0x66, 0x9c, 0x72, - 0xed, 0xc3, 0xc6, 0xfb, 0x48, 0x7b, 0x7e, 0xf3, 0xc1, 0x51, 0x65, 0x5e, 0x57, 0x4e, 0x99, 0x64, - 0x9e, 0x85, 0x42, 0x2f, 0x68, 0xa7, 0xcf, 0x69, 0xb7, 0x71, 0x03, 0x59, 0xb9, 0x19, 0x62, 0x54, - 0x78, 0xac, 0x21, 0x46, 0x6c, 0x97, 0xdc, 0xf1, 0x9b, 0x87, 0xe9, 0xf7, 0x94, 0x6a, 0x7e, 0xf3, - 0x10, 0x39, 0x84, 0xbc, 0x01, 0x73, 0x32, 0x6e, 0xca, 0x7c, 0x65, 0xbe, 0x10, 0x5f, 0xbe, 0x6f, - 0x27, 0xa0, 0x98, 0xaa, 0xcd, 0x76, 0xd9, 0xbb, 0xa1, 0xef, 0xf1, 0x14, 0xc0, 0x53, 0xc9, 0x9b, - 0xba, 0xeb, 0xf5, 0x9b, 0x37, 0xb8, 0x39, 0x49, 0xd7, 0x48, 0x84, 0x66, 0x4d, 0x3f, 0x34, 0x34, - 0x6b, 0x4d, 0xe0, 0x66, 0xdc, 0xf2, 0x1d, 0x65, 0xb6, 0x76, 0x49, 0xe1, 0x65, 0x65, 0x0f, 0x8e, - 0x4e, 0x30, 0xf4, 0xe9, 0x96, 0x59, 0x41, 0x6c, 0xe5, 0x1f, 0x5f, 0x10, 0x9b, 0x7d, 0x1b, 0xe6, - 0x53, 0xe3, 0xa7, 0x8e, 0xf9, 0x56, 0xf6, 0x31, 0x7f, 0xb8, 0x17, 0x99, 0xfe, 0x99, 0x05, 0x67, - 0xfb, 0x24, 0xd2, 0xb0, 0xd1, 0x84, 0xe9, 0xbd, 0x71, 0xe2, 0xd1, 0xf7, 0xc6, 0xc2, 0x68, 0x7b, - 0x63, 0x6d, 0xe7, 0xbb, 0x3f, 0xb8, 0xf8, 0xc4, 0xf7, 0x7e, 0x70, 0xf1, 0x89, 0x3f, 0xfe, 0xc1, - 0xc5, 0x27, 0xde, 0x3f, 0xbe, 0x68, 0x7d, 0xf7, 0xf8, 0xa2, 0xf5, 0xbd, 0xe3, 0x8b, 0xd6, 0x1f, - 0x1f, 0x5f, 0xb4, 0xfe, 0xc3, 0xf1, 0x45, 0xeb, 0x1b, 0x7f, 0x7e, 0xf1, 0x89, 0x4f, 0x7f, 0x2a, - 0x1e, 0xa9, 0x15, 0x35, 0x52, 0xfc, 0xc7, 0x47, 0xd5, 0xb8, 0xac, 0x74, 0xf7, 0x5b, 0x2b, 0x6c, - 0xa4, 0x56, 0x74, 0x89, 0x1a, 0xa9, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x24, 0xf8, 0x71, 0x9d, - 0x62, 0xa2, 0x00, 0x00, + // 8419 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x5c, 0xd9, + 0x75, 0xd8, 0x3e, 0x0e, 0x3f, 0x66, 0x0e, 0x29, 0x92, 0xba, 0x92, 0x2c, 0x2e, 0x77, 0xa5, 0x91, + 0xdf, 0xa6, 0x5b, 0x6d, 0xbc, 0x26, 0x6d, 0xed, 0x6e, 0xbb, 0xf6, 0xba, 0xdb, 0xce, 0x90, 0xd2, + 0x8a, 0x5a, 0x52, 0xa2, 0xce, 0x50, 0xab, 0xc4, 0xf6, 0x26, 0x7e, 0x9c, 0xb9, 0x1c, 0x3e, 0x71, + 0xe6, 0xbd, 0xf1, 0x7b, 0x6f, 0x28, 0x71, 0xbd, 0x88, 0xd7, 0x31, 0xd6, 0x75, 0x03, 0x1b, 0x71, + 0x9b, 0x18, 0x45, 0xd1, 0xa2, 0x70, 0x83, 0x00, 0x69, 0x9b, 0xfc, 0x32, 0x52, 0xf4, 0x4f, 0x80, + 0x1a, 0x4d, 0x93, 0xb8, 0x40, 0x53, 0x38, 0x3f, 0x5a, 0x27, 0x05, 0xc2, 0xd4, 0x4c, 0xff, 0xb4, + 0x68, 0x61, 0xb4, 0x70, 0x51, 0x44, 0x3f, 0x8a, 0xe2, 0x7e, 0xbe, 0xfb, 0xde, 0xbc, 0xa1, 0x66, + 0x34, 0x8f, 0xf2, 0xb6, 0xf5, 0xbf, 0x99, 0x7b, 0xce, 0x3d, 0xe7, 0xbc, 0xfb, 0x79, 0xee, 0xb9, + 0xe7, 0x9c, 0x0b, 0xeb, 0x4d, 0x37, 0xda, 0xed, 0x6e, 0x2f, 0xd5, 0xfd, 0xf6, 0xb2, 0x13, 0x34, + 0xfd, 0x4e, 0xe0, 0xdf, 0xe3, 0x3f, 0x3e, 0x1a, 0xf8, 0xad, 0x96, 0xdf, 0x8d, 0xc2, 0xe5, 0xce, + 0x5e, 0x73, 0xd9, 0xe9, 0xb8, 0xe1, 0xb2, 0x2e, 0xd9, 0xff, 0xb8, 0xd3, 0xea, 0xec, 0x3a, 0x1f, + 0x5f, 0x6e, 0x52, 0x8f, 0x06, 0x4e, 0x44, 0x1b, 0x4b, 0x9d, 0xc0, 0x8f, 0x7c, 0xf2, 0xa9, 0x98, + 0xda, 0x92, 0xa2, 0xc6, 0x7f, 0xfc, 0xbc, 0xaa, 0xbb, 0xd4, 0xd9, 0x6b, 0x2e, 0x31, 0x6a, 0x4b, + 0xba, 0x44, 0x51, 0x5b, 0xfc, 0xa8, 0x21, 0x4b, 0xd3, 0x6f, 0xfa, 0xcb, 0x9c, 0xe8, 0x76, 0x77, + 0x87, 0xff, 0xe3, 0x7f, 0xf8, 0x2f, 0xc1, 0x6c, 0xf1, 0xb9, 0xbd, 0x57, 0xc3, 0x25, 0xd7, 0x67, + 0xb2, 0x2d, 0x6f, 0x3b, 0x51, 0x7d, 0x77, 0x79, 0xbf, 0x47, 0xa2, 0x45, 0xdb, 0x40, 0xaa, 0xfb, + 0x01, 0xcd, 0xc2, 0x79, 0x39, 0xc6, 0x69, 0x3b, 0xf5, 0x5d, 0xd7, 0xa3, 0xc1, 0x41, 0xfc, 0xd5, + 0x6d, 0x1a, 0x39, 0x59, 0xb5, 0x96, 0xfb, 0xd5, 0x0a, 0xba, 0x5e, 0xe4, 0xb6, 0x69, 0x4f, 0x85, + 0xbf, 0xf2, 0xa8, 0x0a, 0x61, 0x7d, 0x97, 0xb6, 0x9d, 0x9e, 0x7a, 0x2f, 0xf5, 0xab, 0xd7, 0x8d, + 0xdc, 0xd6, 0xb2, 0xeb, 0x45, 0x61, 0x14, 0xa4, 0x2b, 0xd9, 0x3f, 0x2c, 0x40, 0xa9, 0xb2, 0x5e, + 0xad, 0x45, 0x4e, 0xd4, 0x0d, 0xc9, 0x57, 0x2c, 0x98, 0x69, 0xf9, 0x4e, 0xa3, 0xea, 0xb4, 0x1c, + 0xaf, 0x4e, 0x83, 0x05, 0xeb, 0x92, 0x75, 0x79, 0xfa, 0xca, 0xfa, 0xd2, 0x28, 0xfd, 0xb5, 0x54, + 0xb9, 0x1f, 0x22, 0x0d, 0xfd, 0x6e, 0x50, 0xa7, 0x48, 0x77, 0xaa, 0x67, 0xbf, 0x7b, 0x58, 0x7e, + 0xea, 0xe8, 0xb0, 0x3c, 0xb3, 0x6e, 0x70, 0xc2, 0x04, 0x5f, 0xf2, 0x4d, 0x0b, 0x4e, 0xd7, 0x1d, + 0xcf, 0x09, 0x0e, 0xb6, 0x9c, 0xa0, 0x49, 0xa3, 0x37, 0x02, 0xbf, 0xdb, 0x59, 0x18, 0x3b, 0x01, + 0x69, 0x9e, 0x96, 0xd2, 0x9c, 0x5e, 0x49, 0xb3, 0xc3, 0x5e, 0x09, 0xb8, 0x5c, 0x61, 0xe4, 0x6c, + 0xb7, 0xa8, 0x29, 0x57, 0xe1, 0x24, 0xe5, 0xaa, 0xa5, 0xd9, 0x61, 0xaf, 0x04, 0xe4, 0x05, 0x98, + 0x72, 0xbd, 0x66, 0x40, 0xc3, 0x70, 0x61, 0xfc, 0x92, 0x75, 0xb9, 0x54, 0x9d, 0x93, 0xd5, 0xa7, + 0xd6, 0x44, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xae, 0xac, 0x57, 0xb7, 0x02, 0x67, 0x67, + 0xc7, 0xad, 0xa3, 0xdf, 0x8d, 0x5c, 0xaf, 0x69, 0x12, 0xb0, 0x8e, 0x27, 0x40, 0x5e, 0x81, 0xe9, + 0x90, 0x06, 0xfb, 0x6e, 0x9d, 0x6e, 0xfa, 0x41, 0xc4, 0x3b, 0x65, 0xa2, 0x7a, 0x46, 0xa2, 0x4f, + 0xd7, 0x62, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, 0x91, 0x84, 0xf3, 0x36, 0x2b, 0xc5, 0xd5, + 0x30, 0x06, 0xa1, 0x89, 0x47, 0x56, 0x61, 0xde, 0xf1, 0x3c, 0x3f, 0x72, 0x22, 0xd7, 0xf7, 0x36, + 0x03, 0xba, 0xe3, 0x3e, 0x90, 0x9f, 0xb8, 0x20, 0xeb, 0xce, 0x57, 0x52, 0x70, 0xec, 0xa9, 0x41, + 0xbe, 0x61, 0xc1, 0x7c, 0x18, 0xb9, 0xf5, 0x3d, 0xd7, 0xa3, 0x61, 0xb8, 0xe2, 0x7b, 0x3b, 0x6e, + 0x73, 0x61, 0x82, 0x77, 0xdb, 0xcd, 0xd1, 0xba, 0xad, 0x96, 0xa2, 0x5a, 0x3d, 0xcb, 0x44, 0x4a, + 0x97, 0x62, 0x0f, 0x77, 0xf2, 0x11, 0x28, 0xc9, 0x16, 0xa5, 0xe1, 0xc2, 0xe4, 0xa5, 0xc2, 0xe5, + 0x52, 0xf5, 0xd4, 0xd1, 0x61, 0xb9, 0xb4, 0xa6, 0x0a, 0x31, 0x86, 0xdb, 0xab, 0xb0, 0x50, 0x69, + 0x6f, 0x3b, 0x61, 0xe8, 0x34, 0xfc, 0x20, 0xd5, 0x75, 0x97, 0xa1, 0xd8, 0x76, 0x3a, 0x1d, 0xd7, + 0x6b, 0xb2, 0xbe, 0x63, 0x74, 0x66, 0x8e, 0x0e, 0xcb, 0xc5, 0x0d, 0x59, 0x86, 0x1a, 0x6a, 0xff, + 0xc9, 0x18, 0x4c, 0x57, 0x3c, 0xa7, 0x75, 0x10, 0xba, 0x21, 0x76, 0x3d, 0xf2, 0x39, 0x28, 0xb2, + 0x55, 0xab, 0xe1, 0x44, 0x8e, 0x9c, 0xe9, 0x1f, 0x5b, 0x12, 0x8b, 0xc8, 0x92, 0xb9, 0x88, 0xc4, + 0x9f, 0xcf, 0xb0, 0x97, 0xf6, 0x3f, 0xbe, 0x74, 0x6b, 0xfb, 0x1e, 0xad, 0x47, 0x1b, 0x34, 0x72, + 0xaa, 0x44, 0xf6, 0x02, 0xc4, 0x65, 0xa8, 0xa9, 0x12, 0x1f, 0xc6, 0xc3, 0x0e, 0xad, 0xcb, 0x99, + 0xbb, 0x31, 0xe2, 0x0c, 0x89, 0x45, 0xaf, 0x75, 0x68, 0xbd, 0x3a, 0x23, 0x59, 0x8f, 0xb3, 0x7f, + 0xc8, 0x19, 0x91, 0xfb, 0x30, 0x19, 0xf2, 0xb5, 0x4c, 0x4e, 0xca, 0x5b, 0xf9, 0xb1, 0xe4, 0x64, + 0xab, 0xb3, 0x92, 0xe9, 0xa4, 0xf8, 0x8f, 0x92, 0x9d, 0xfd, 0x1f, 0x2c, 0x38, 0x63, 0x60, 0x57, + 0x82, 0x66, 0xb7, 0x4d, 0xbd, 0x88, 0x5c, 0x82, 0x71, 0xcf, 0x69, 0x53, 0x39, 0xab, 0xb4, 0xc8, + 0x37, 0x9d, 0x36, 0x45, 0x0e, 0x21, 0xcf, 0xc1, 0xc4, 0xbe, 0xd3, 0xea, 0x52, 0xde, 0x48, 0xa5, + 0xea, 0x29, 0x89, 0x32, 0xf1, 0x16, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x42, 0x89, 0xff, 0xb8, 0x16, + 0xf8, 0xed, 0x9c, 0x3e, 0x4d, 0x4a, 0xf8, 0x96, 0x22, 0x2b, 0x86, 0x9f, 0xfe, 0x8b, 0x31, 0x43, + 0xfb, 0xcf, 0x2c, 0x98, 0x33, 0x3e, 0x6e, 0xdd, 0x0d, 0x23, 0xf2, 0xd9, 0x9e, 0xc1, 0xb3, 0x34, + 0xd8, 0xe0, 0x61, 0xb5, 0xf9, 0xd0, 0x99, 0x97, 0x5f, 0x5a, 0x54, 0x25, 0xc6, 0xc0, 0xf1, 0x60, + 0xc2, 0x8d, 0x68, 0x3b, 0x5c, 0x18, 0xbb, 0x54, 0xb8, 0x3c, 0x7d, 0x65, 0x2d, 0xb7, 0x6e, 0x8c, + 0xdb, 0x77, 0x8d, 0xd1, 0x47, 0xc1, 0xc6, 0xfe, 0xed, 0x42, 0xa2, 0xfb, 0x36, 0x94, 0x1c, 0xef, + 0x5b, 0x30, 0xd9, 0x72, 0xb6, 0x69, 0x4b, 0xcc, 0xad, 0xe9, 0x2b, 0x6f, 0xe7, 0x26, 0x89, 0xe2, + 0xb1, 0xb4, 0xce, 0xe9, 0x5f, 0xf5, 0xa2, 0xe0, 0x20, 0x1e, 0x5e, 0xa2, 0x10, 0x25, 0x73, 0xf2, + 0xf7, 0x2c, 0x98, 0x8e, 0x57, 0x35, 0xd5, 0x2c, 0xdb, 0xf9, 0x0b, 0x13, 0x2f, 0xa6, 0x52, 0x22, + 0xbd, 0x44, 0x1b, 0x10, 0x34, 0x65, 0x59, 0xfc, 0x04, 0x4c, 0x1b, 0x9f, 0x40, 0xe6, 0xa1, 0xb0, + 0x47, 0x0f, 0xc4, 0x80, 0x47, 0xf6, 0x93, 0x9c, 0x4d, 0x8c, 0x70, 0x39, 0xa4, 0x3f, 0x39, 0xf6, + 0xaa, 0xb5, 0xf8, 0x3a, 0xcc, 0xa7, 0x19, 0x0e, 0x53, 0xdf, 0xfe, 0xf6, 0x78, 0x62, 0x60, 0xb2, + 0x85, 0x80, 0xf8, 0x30, 0xd5, 0xa6, 0x51, 0xe0, 0xd6, 0x55, 0x97, 0xad, 0x8e, 0xd6, 0x4a, 0x1b, + 0x9c, 0x58, 0xbc, 0x21, 0x8a, 0xff, 0x21, 0x2a, 0x2e, 0x64, 0x17, 0xc6, 0x9d, 0xa0, 0xa9, 0xfa, + 0xe4, 0x5a, 0x3e, 0xd3, 0x32, 0x5e, 0x2a, 0x2a, 0x41, 0x33, 0x44, 0xce, 0x81, 0x2c, 0x43, 0x29, + 0xa2, 0x41, 0xdb, 0xf5, 0x9c, 0x48, 0xec, 0xa0, 0xc5, 0xea, 0x69, 0x89, 0x56, 0xda, 0x52, 0x00, + 0x8c, 0x71, 0x48, 0x0b, 0x26, 0x1b, 0xc1, 0x01, 0x76, 0xbd, 0x85, 0xf1, 0x3c, 0x9a, 0x62, 0x95, + 0xd3, 0x8a, 0x07, 0xa9, 0xf8, 0x8f, 0x92, 0x07, 0xf9, 0x75, 0x0b, 0xce, 0xb6, 0xa9, 0x13, 0x76, + 0x03, 0xca, 0x3e, 0x01, 0x69, 0x44, 0x3d, 0xd6, 0xb1, 0x0b, 0x13, 0x9c, 0x39, 0x8e, 0xda, 0x0f, + 0xbd, 0x94, 0xab, 0xcf, 0x4a, 0x51, 0xce, 0x66, 0x41, 0x31, 0x53, 0x1a, 0xfb, 0x4f, 0xc6, 0xe1, + 0x74, 0xcf, 0xc2, 0x4e, 0x5e, 0x86, 0x89, 0xce, 0xae, 0x13, 0xaa, 0x95, 0xfa, 0xa2, 0x5a, 0x26, + 0x36, 0x59, 0xe1, 0xc3, 0xc3, 0xf2, 0x29, 0x55, 0x85, 0x17, 0xa0, 0x40, 0x66, 0x7a, 0x53, 0x9b, + 0x86, 0xa1, 0xd3, 0x54, 0xcb, 0xb7, 0x31, 0x4c, 0x78, 0x31, 0x2a, 0x38, 0xf9, 0x9b, 0x16, 0x9c, + 0x12, 0x43, 0x06, 0x69, 0xd8, 0x6d, 0x45, 0x6c, 0x8b, 0x62, 0xcd, 0x72, 0x23, 0x8f, 0xe1, 0x29, + 0x48, 0x56, 0xcf, 0x49, 0xee, 0xa7, 0xcc, 0xd2, 0x10, 0x93, 0x7c, 0xc9, 0x5d, 0x28, 0x85, 0x91, + 0x13, 0x44, 0xb4, 0x51, 0x89, 0xb8, 0x32, 0x35, 0x7d, 0xe5, 0xa7, 0x07, 0x5b, 0xbb, 0xb7, 0xdc, + 0x36, 0x15, 0xfb, 0x44, 0x4d, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x17, 0x20, 0xe8, 0x7a, 0xb5, 0x6e, + 0xbb, 0xed, 0x04, 0x07, 0x52, 0xbf, 0xba, 0x3e, 0xda, 0xe7, 0xa1, 0xa6, 0x17, 0xab, 0x1a, 0x71, + 0x19, 0x1a, 0xfc, 0xc8, 0x97, 0x2c, 0x38, 0x25, 0x46, 0xa2, 0x92, 0x60, 0x32, 0x67, 0x09, 0x4e, + 0xb3, 0xa6, 0x5d, 0x35, 0x59, 0x60, 0x92, 0xa3, 0xfd, 0xef, 0x92, 0x6a, 0x40, 0x2d, 0x62, 0x87, + 0xad, 0xe6, 0x01, 0xf9, 0x0c, 0x3c, 0x1d, 0x76, 0xeb, 0x75, 0x1a, 0x86, 0x3b, 0xdd, 0x16, 0x76, + 0xbd, 0xeb, 0x6e, 0x18, 0xf9, 0xc1, 0xc1, 0xba, 0xdb, 0x76, 0x23, 0x3e, 0xe2, 0x26, 0xaa, 0x17, + 0x8e, 0x0e, 0xcb, 0x4f, 0xd7, 0xfa, 0x21, 0x61, 0xff, 0xfa, 0xc4, 0x81, 0x67, 0xba, 0x5e, 0x7f, + 0xf2, 0x42, 0x43, 0x2f, 0x1f, 0x1d, 0x96, 0x9f, 0xb9, 0xd3, 0x1f, 0x0d, 0x8f, 0xa3, 0x61, 0xff, + 0x17, 0x8b, 0xad, 0xd4, 0xe2, 0xbb, 0xb6, 0x68, 0xbb, 0xd3, 0x62, 0xab, 0xcb, 0xc9, 0xeb, 0x8f, + 0x51, 0x42, 0x7f, 0xc4, 0x7c, 0xb6, 0x3b, 0x25, 0x7f, 0x3f, 0x25, 0xd2, 0xfe, 0xcf, 0x16, 0x9c, + 0x4d, 0x23, 0x3f, 0x01, 0x9d, 0x27, 0x4c, 0xea, 0x3c, 0x37, 0xf3, 0xfd, 0xda, 0x3e, 0x8a, 0xcf, + 0x57, 0xc6, 0x7b, 0xbf, 0xf5, 0xff, 0xf5, 0x6d, 0x34, 0xde, 0x15, 0x0b, 0x3f, 0xce, 0x5d, 0x71, + 0xfc, 0x03, 0xb5, 0x2b, 0xfe, 0xe3, 0x71, 0x98, 0xa9, 0x78, 0x91, 0x5b, 0xd9, 0xd9, 0x71, 0x3d, + 0x37, 0x3a, 0x20, 0x5f, 0x1b, 0x83, 0xe5, 0x4e, 0x40, 0x77, 0x68, 0x10, 0xd0, 0xc6, 0x6a, 0x37, + 0x70, 0xbd, 0x66, 0xad, 0xbe, 0x4b, 0x1b, 0xdd, 0x96, 0xeb, 0x35, 0xd7, 0x9a, 0x9e, 0xaf, 0x8b, + 0xaf, 0x3e, 0xa0, 0xf5, 0x2e, 0xff, 0x24, 0x31, 0x29, 0xda, 0xa3, 0x7d, 0xd2, 0xe6, 0x70, 0x4c, + 0xab, 0x2f, 0x1d, 0x1d, 0x96, 0x97, 0x87, 0xac, 0x84, 0xc3, 0x7e, 0x1a, 0xf9, 0xea, 0x18, 0x2c, + 0x05, 0xf4, 0xf3, 0x5d, 0x77, 0xf0, 0xd6, 0x10, 0xab, 0x56, 0x6b, 0xc4, 0xed, 0x67, 0x28, 0x9e, + 0xd5, 0x2b, 0x47, 0x87, 0xe5, 0x21, 0xeb, 0xe0, 0x90, 0xdf, 0x65, 0x6f, 0xc2, 0x74, 0xa5, 0xe3, + 0x86, 0xee, 0x03, 0xf4, 0xbb, 0x11, 0x1d, 0xe0, 0x88, 0x5b, 0x86, 0x89, 0xa0, 0xdb, 0xa2, 0x62, + 0x6e, 0x97, 0xaa, 0x25, 0xb6, 0x0a, 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x22, 0x5b, 0x71, 0x39, + 0xc9, 0x94, 0x71, 0xe3, 0x1e, 0x4c, 0x04, 0x8c, 0x89, 0x1c, 0x59, 0xa3, 0x9e, 0x03, 0x63, 0xa9, + 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, 0xf6, 0xef, 0x8e, 0xc1, 0xb9, 0x4a, 0xa7, 0xb3, 0x41, 0xc3, + 0xdd, 0x94, 0x14, 0xbf, 0x6c, 0xc1, 0xec, 0xbe, 0x1b, 0x44, 0x5d, 0xa7, 0xa5, 0xec, 0x57, 0x42, + 0x9e, 0xda, 0xa8, 0xf2, 0x70, 0x6e, 0x6f, 0x25, 0x48, 0x57, 0xc9, 0xd1, 0x61, 0x79, 0x36, 0x59, + 0x86, 0x29, 0xf6, 0xe4, 0xef, 0x5a, 0x30, 0x2f, 0x8b, 0x6e, 0xfa, 0x0d, 0x6a, 0xda, 0x47, 0xef, + 0xe4, 0x29, 0x93, 0x26, 0x2e, 0xec, 0x5a, 0xe9, 0x52, 0xec, 0x11, 0xc2, 0xfe, 0x6f, 0x63, 0x70, + 0xbe, 0x0f, 0x0d, 0xf2, 0x1b, 0x16, 0x9c, 0x15, 0x46, 0x55, 0x03, 0x84, 0x74, 0x47, 0xb6, 0xe6, + 0xcf, 0xe6, 0x2d, 0x39, 0xb2, 0x29, 0x4e, 0xbd, 0x3a, 0xad, 0x2e, 0xb0, 0xd5, 0x70, 0x25, 0x83, + 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, 0x66, 0xd6, 0x94, 0xa4, 0x63, 0x4f, 0x44, 0xd2, 0x5a, 0x06, + 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0xeb, 0xf0, 0xcc, 0x31, 0xe4, 0x1e, 0x3d, 0x39, 0xed, 0xb7, 0xf5, + 0xa8, 0x4f, 0x8e, 0xb9, 0x01, 0xe6, 0xb5, 0x0d, 0x93, 0x7c, 0xea, 0xa8, 0x89, 0x0d, 0x6c, 0xfb, + 0xe3, 0x73, 0x2a, 0x44, 0x09, 0xb1, 0x7f, 0xd7, 0x82, 0xe2, 0x10, 0xd6, 0xb0, 0x72, 0xd2, 0x1a, + 0x56, 0xea, 0xb1, 0x84, 0x45, 0xbd, 0x96, 0xb0, 0x37, 0x46, 0xeb, 0x8d, 0x41, 0x2c, 0x60, 0x3f, + 0xb4, 0xe0, 0x74, 0x8f, 0xc5, 0x8c, 0xec, 0xc2, 0xd9, 0x8e, 0xdf, 0x50, 0x6a, 0xd3, 0x75, 0x27, + 0xdc, 0xe5, 0x30, 0xf9, 0x79, 0x2f, 0xb3, 0x9e, 0xdc, 0xcc, 0x80, 0x3f, 0x3c, 0x2c, 0x2f, 0x68, + 0x22, 0x29, 0x04, 0xcc, 0xa4, 0x48, 0x3a, 0x50, 0xdc, 0x71, 0x69, 0xab, 0x11, 0x0f, 0xc1, 0x11, + 0x15, 0xa4, 0x6b, 0x92, 0x9a, 0x30, 0x16, 0xab, 0x7f, 0xa8, 0xb9, 0xd8, 0x3f, 0xb2, 0x60, 0xb6, + 0xd2, 0x8d, 0x76, 0x99, 0x7a, 0x50, 0xe7, 0xf6, 0x19, 0xe2, 0xc1, 0x44, 0xe8, 0x36, 0xf7, 0x5f, + 0xce, 0x67, 0x31, 0xae, 0x31, 0x52, 0xd2, 0x68, 0xae, 0x75, 0x53, 0x5e, 0x88, 0x82, 0x0d, 0x09, + 0x60, 0xd2, 0x77, 0xba, 0xd1, 0xee, 0x15, 0xf9, 0xc9, 0x23, 0x9e, 0x94, 0x6f, 0xb1, 0xcf, 0xb9, + 0x22, 0x39, 0x6a, 0x6d, 0x4d, 0x94, 0xa2, 0xe4, 0x64, 0x7f, 0x11, 0x66, 0x93, 0x37, 0x31, 0x03, + 0x8c, 0xd9, 0x0b, 0x50, 0x70, 0x02, 0x4f, 0x8e, 0xd8, 0x69, 0x89, 0x50, 0xa8, 0xe0, 0x4d, 0x64, + 0xe5, 0xe4, 0x45, 0x28, 0xee, 0x74, 0x5b, 0x2d, 0x56, 0x41, 0x5e, 0x7b, 0xe8, 0x53, 0xc0, 0x35, + 0x59, 0x8e, 0x1a, 0xc3, 0xfe, 0x8b, 0x71, 0x98, 0xab, 0xb6, 0xba, 0xf4, 0x8d, 0x80, 0x52, 0x65, + 0x9b, 0xa8, 0xc0, 0x5c, 0x27, 0xa0, 0xfb, 0x2e, 0xbd, 0x5f, 0xa3, 0x2d, 0x5a, 0x8f, 0xfc, 0x40, + 0x4a, 0x73, 0x5e, 0x12, 0x9a, 0xdb, 0x4c, 0x82, 0x31, 0x8d, 0x4f, 0x5e, 0x87, 0x59, 0xa7, 0x1e, + 0xb9, 0xfb, 0x54, 0x53, 0x10, 0xe2, 0x7e, 0x48, 0x52, 0x98, 0xad, 0x24, 0xa0, 0x98, 0xc2, 0x26, + 0x9f, 0x85, 0x85, 0xb0, 0xee, 0xb4, 0xe8, 0x9d, 0x8e, 0x64, 0xb5, 0xb2, 0x4b, 0xeb, 0x7b, 0x9b, + 0xbe, 0xeb, 0x45, 0xd2, 0x12, 0x75, 0x49, 0x52, 0x5a, 0xa8, 0xf5, 0xc1, 0xc3, 0xbe, 0x14, 0xc8, + 0xbf, 0xb0, 0xe0, 0x42, 0x27, 0xa0, 0x9b, 0x81, 0xdf, 0xf6, 0xd9, 0x50, 0xeb, 0x31, 0xcf, 0x48, + 0x33, 0xc5, 0x5b, 0x23, 0xea, 0x52, 0xa2, 0xa4, 0xd7, 0xaa, 0xff, 0xe1, 0xa3, 0xc3, 0xf2, 0x85, + 0xcd, 0xe3, 0x04, 0xc0, 0xe3, 0xe5, 0x23, 0xff, 0xd2, 0x82, 0x8b, 0x1d, 0x3f, 0x8c, 0x8e, 0xf9, + 0x84, 0x89, 0x13, 0xfd, 0x04, 0xfb, 0xe8, 0xb0, 0x7c, 0x71, 0xf3, 0x58, 0x09, 0xf0, 0x11, 0x12, + 0xda, 0x47, 0xd3, 0x70, 0xda, 0x18, 0x7b, 0xd2, 0x76, 0xf1, 0x1a, 0x9c, 0x52, 0x83, 0x21, 0xd6, + 0x7d, 0x4a, 0xb1, 0xad, 0xa9, 0x62, 0x02, 0x31, 0x89, 0xcb, 0xc6, 0x9d, 0x1e, 0x8a, 0xa2, 0x76, + 0x6a, 0xdc, 0x6d, 0x26, 0xa0, 0x98, 0xc2, 0x26, 0x6b, 0x70, 0x46, 0x96, 0x20, 0xed, 0xb4, 0xdc, + 0xba, 0xb3, 0xe2, 0x77, 0xe5, 0x90, 0x9b, 0xa8, 0x9e, 0x3f, 0x3a, 0x2c, 0x9f, 0xd9, 0xec, 0x05, + 0x63, 0x56, 0x1d, 0xb2, 0x0e, 0x67, 0x9d, 0x6e, 0xe4, 0xeb, 0xef, 0xbf, 0xea, 0xb1, 0xed, 0xb4, + 0xc1, 0x87, 0x56, 0x51, 0xec, 0xbb, 0x95, 0x0c, 0x38, 0x66, 0xd6, 0x22, 0x9b, 0x29, 0x6a, 0x35, + 0x5a, 0xf7, 0xbd, 0x86, 0xe8, 0xe5, 0x89, 0xf8, 0x04, 0x56, 0xc9, 0xc0, 0xc1, 0xcc, 0x9a, 0xa4, + 0x05, 0xb3, 0x6d, 0xe7, 0xc1, 0x1d, 0xcf, 0xd9, 0x77, 0xdc, 0x16, 0x63, 0x22, 0xed, 0x57, 0xfd, + 0x8d, 0x2a, 0xdd, 0xc8, 0x6d, 0x2d, 0x89, 0x9b, 0xfd, 0xa5, 0x35, 0x2f, 0xba, 0x15, 0xd4, 0x22, + 0xa6, 0xa9, 0x0b, 0x0d, 0x72, 0x23, 0x41, 0x0b, 0x53, 0xb4, 0xc9, 0x2d, 0x38, 0xc7, 0xa7, 0xe3, + 0xaa, 0x7f, 0xdf, 0x5b, 0xa5, 0x2d, 0xe7, 0x40, 0x7d, 0xc0, 0x14, 0xff, 0x80, 0xa7, 0x8f, 0x0e, + 0xcb, 0xe7, 0x6a, 0x59, 0x08, 0x98, 0x5d, 0x8f, 0x38, 0xf0, 0x4c, 0x12, 0x80, 0x74, 0xdf, 0x0d, + 0x5d, 0xdf, 0x13, 0x56, 0xa8, 0x62, 0x6c, 0x85, 0xaa, 0xf5, 0x47, 0xc3, 0xe3, 0x68, 0x90, 0xbf, + 0x6f, 0xc1, 0xd9, 0xac, 0x69, 0xb8, 0x50, 0xca, 0xe3, 0x7e, 0x31, 0x35, 0xb5, 0xc4, 0x88, 0xc8, + 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x59, 0x30, 0xe3, 0x18, 0x27, 0xe8, 0x05, 0xc8, 0x63, 0xd7, + 0x32, 0xcf, 0xe4, 0xd5, 0xf9, 0xa3, 0xc3, 0x72, 0xe2, 0x94, 0x8e, 0x09, 0x8e, 0xe4, 0x1f, 0x5a, + 0x70, 0x2e, 0x73, 0x8e, 0x2f, 0x4c, 0x9f, 0x44, 0x0b, 0xf1, 0x41, 0x92, 0xbd, 0xe6, 0x64, 0x8b, + 0x41, 0xbe, 0x61, 0xe9, 0xad, 0x4c, 0x5d, 0x39, 0x2d, 0xcc, 0x70, 0xd1, 0x6e, 0x8f, 0x68, 0x34, + 0x88, 0xb5, 0x26, 0x45, 0xb8, 0x7a, 0xc6, 0xd8, 0x19, 0x55, 0x21, 0xa6, 0xd9, 0x93, 0xaf, 0x5b, + 0x6a, 0x6b, 0xd4, 0x12, 0x9d, 0x3a, 0x29, 0x89, 0x48, 0xbc, 0xd3, 0x6a, 0x81, 0x52, 0xcc, 0xc9, + 0xcf, 0xc1, 0xa2, 0xb3, 0xed, 0x07, 0x51, 0xe6, 0xe4, 0x5b, 0x98, 0xe5, 0xd3, 0xe8, 0xe2, 0xd1, + 0x61, 0x79, 0xb1, 0xd2, 0x17, 0x0b, 0x8f, 0xa1, 0x60, 0xff, 0xd6, 0x04, 0xcc, 0x88, 0x93, 0x90, + 0xdc, 0xba, 0x7e, 0xc7, 0x82, 0x67, 0xeb, 0xdd, 0x20, 0xa0, 0x5e, 0x54, 0x8b, 0x68, 0xa7, 0x77, + 0xe3, 0xb2, 0x4e, 0x74, 0xe3, 0xba, 0x74, 0x74, 0x58, 0x7e, 0x76, 0xe5, 0x18, 0xfe, 0x78, 0xac, + 0x74, 0xe4, 0xdf, 0x5a, 0x60, 0x4b, 0x84, 0xaa, 0x53, 0xdf, 0x6b, 0x06, 0x7e, 0xd7, 0x6b, 0xf4, + 0x7e, 0xc4, 0xd8, 0x89, 0x7e, 0xc4, 0xf3, 0x47, 0x87, 0x65, 0x7b, 0xe5, 0x91, 0x52, 0xe0, 0x00, + 0x92, 0x92, 0x37, 0xe0, 0xb4, 0xc4, 0xba, 0xfa, 0xa0, 0x43, 0x03, 0x97, 0x9d, 0x39, 0xa4, 0xe2, + 0x18, 0x7b, 0x2b, 0xa5, 0x11, 0xb0, 0xb7, 0x0e, 0x09, 0x61, 0xea, 0x3e, 0x75, 0x9b, 0xbb, 0x91, + 0x52, 0x9f, 0x46, 0x74, 0x51, 0x92, 0x56, 0x91, 0xbb, 0x82, 0x66, 0x75, 0xfa, 0xe8, 0xb0, 0x3c, + 0x25, 0xff, 0xa0, 0xe2, 0x44, 0x6e, 0xc2, 0xac, 0x38, 0xa7, 0x6e, 0xba, 0x5e, 0x73, 0xd3, 0xf7, + 0x84, 0x9f, 0x4d, 0xa9, 0xfa, 0xbc, 0xda, 0xf0, 0x6b, 0x09, 0xe8, 0xc3, 0xc3, 0xf2, 0x8c, 0xfa, + 0xbd, 0x75, 0xd0, 0xa1, 0x98, 0xaa, 0x6d, 0xff, 0xfe, 0x24, 0x80, 0x1a, 0xae, 0xb4, 0x43, 0x3e, + 0x02, 0xa5, 0x90, 0x46, 0x82, 0xab, 0xbc, 0x38, 0x11, 0xf7, 0x51, 0xaa, 0x10, 0x63, 0x38, 0xd9, + 0x83, 0x89, 0x8e, 0xd3, 0x0d, 0x69, 0x3e, 0xe7, 0x07, 0xd9, 0xf9, 0x9b, 0x8c, 0xa2, 0x38, 0x98, + 0xf2, 0x9f, 0x28, 0x78, 0x90, 0x2f, 0x5b, 0x00, 0x34, 0xd9, 0x61, 0x23, 0x1b, 0x88, 0x24, 0xcb, + 0xb8, 0x4f, 0x59, 0x1b, 0x54, 0x67, 0x8f, 0x0e, 0xcb, 0x60, 0x74, 0xbd, 0xc1, 0x96, 0xdc, 0x87, + 0xa2, 0xa3, 0xd6, 0xfc, 0xf1, 0x93, 0x58, 0xf3, 0xf9, 0x79, 0x51, 0x0f, 0x5a, 0xcd, 0x8c, 0x7c, + 0xd5, 0x82, 0xd9, 0x90, 0x46, 0xb2, 0xab, 0xd8, 0xca, 0x23, 0x15, 0xde, 0x11, 0x07, 0x5d, 0x2d, + 0x41, 0x53, 0xac, 0xa0, 0xc9, 0x32, 0x4c, 0xf1, 0x55, 0xa2, 0x5c, 0xa7, 0x4e, 0x83, 0x06, 0xdc, + 0x1c, 0x21, 0x35, 0xa9, 0xd1, 0x45, 0x31, 0x68, 0x6a, 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0x55, 0xa2, + 0x6c, 0xb8, 0x41, 0xe0, 0x4b, 0x51, 0x8a, 0x39, 0x89, 0x62, 0xd0, 0xd4, 0xa2, 0x18, 0x65, 0x98, + 0xe2, 0x6b, 0x7f, 0xeb, 0x14, 0xcc, 0xaa, 0x89, 0x14, 0x6b, 0xf6, 0xc2, 0xfa, 0xd5, 0x47, 0xb3, + 0x5f, 0x31, 0x81, 0x98, 0xc4, 0x65, 0x95, 0xc5, 0x54, 0x4d, 0x2a, 0xf6, 0xba, 0x72, 0xcd, 0x04, + 0x62, 0x12, 0x97, 0xb4, 0x61, 0x22, 0x8c, 0x68, 0x47, 0xdd, 0x81, 0x8f, 0x78, 0x45, 0x1b, 0xaf, + 0x0f, 0x86, 0x25, 0x81, 0x91, 0x47, 0xc1, 0x85, 0x1b, 0x70, 0xa3, 0x84, 0x4d, 0x57, 0x4e, 0x8e, + 0x7c, 0xe6, 0x67, 0xd2, 0x5c, 0x2c, 0x7a, 0x23, 0x59, 0x86, 0x29, 0xf6, 0x19, 0xca, 0xfe, 0xc4, + 0x09, 0x2a, 0xfb, 0x9f, 0x86, 0x62, 0xdb, 0x79, 0x50, 0xeb, 0x06, 0xcd, 0xc7, 0x3f, 0x54, 0x48, + 0xaf, 0x42, 0x41, 0x05, 0x35, 0x3d, 0xf2, 0x25, 0xcb, 0x58, 0x72, 0xa6, 0x38, 0xf1, 0xbb, 0xf9, + 0x2e, 0x39, 0x7a, 0xaf, 0xec, 0xbb, 0xf8, 0xf4, 0xa8, 0xde, 0xc5, 0x27, 0xae, 0x7a, 0x33, 0x35, + 0x52, 0x4c, 0x10, 0xad, 0x46, 0x96, 0x4e, 0x54, 0x8d, 0x5c, 0x49, 0x30, 0xc3, 0x14, 0x73, 0x2e, + 0x8f, 0x98, 0x73, 0x5a, 0x1e, 0x38, 0x51, 0x79, 0x6a, 0x09, 0x66, 0x98, 0x62, 0xde, 0xff, 0xbc, + 0x39, 0x7d, 0x32, 0xe7, 0xcd, 0x99, 0x1c, 0xce, 0x9b, 0xc7, 0xab, 0xe2, 0xa7, 0x46, 0x55, 0xc5, + 0xc9, 0x0d, 0x20, 0x8d, 0x03, 0xcf, 0x69, 0xbb, 0x75, 0xb9, 0x58, 0xf2, 0x6d, 0x73, 0x96, 0xdb, + 0x23, 0x16, 0xe5, 0x42, 0x46, 0x56, 0x7b, 0x30, 0x30, 0xa3, 0x16, 0x89, 0xa0, 0xd8, 0x51, 0x1a, + 0xd7, 0x5c, 0x1e, 0xa3, 0x5f, 0x69, 0x60, 0xc2, 0x4d, 0x82, 0x4d, 0x3c, 0x55, 0x82, 0x9a, 0x13, + 0x59, 0x87, 0xb3, 0x6d, 0xd7, 0xdb, 0xf4, 0x1b, 0xe1, 0x26, 0x0d, 0xa4, 0xb5, 0xa5, 0x46, 0xa3, + 0x85, 0x79, 0xde, 0x36, 0xfc, 0x04, 0xbd, 0x91, 0x01, 0xc7, 0xcc, 0x5a, 0xf6, 0xff, 0xb4, 0x60, + 0x7e, 0xa5, 0xe5, 0x77, 0x1b, 0x77, 0x9d, 0xa8, 0xbe, 0x2b, 0x3c, 0x04, 0xc8, 0xeb, 0x50, 0x74, + 0xbd, 0x88, 0x06, 0xfb, 0x4e, 0x4b, 0xee, 0x4f, 0xb6, 0x32, 0x9f, 0xae, 0xc9, 0xf2, 0x87, 0x87, + 0xe5, 0xd9, 0xd5, 0x6e, 0xc0, 0xad, 0xd4, 0x62, 0xb5, 0x42, 0x5d, 0x87, 0x7c, 0xcb, 0x82, 0xd3, + 0xc2, 0xc7, 0x60, 0xd5, 0x89, 0x9c, 0xdb, 0x5d, 0x1a, 0xb8, 0x54, 0x79, 0x19, 0x8c, 0xb8, 0x50, + 0xa5, 0x65, 0x55, 0x0c, 0x0e, 0x62, 0x45, 0x7d, 0x23, 0xcd, 0x19, 0x7b, 0x85, 0xb1, 0x7f, 0xa5, + 0x00, 0x4f, 0xf7, 0xa5, 0x45, 0x16, 0x61, 0xcc, 0x6d, 0xc8, 0x4f, 0x07, 0x49, 0x77, 0x6c, 0xad, + 0x81, 0x63, 0x6e, 0x83, 0x2c, 0x71, 0x9d, 0x33, 0xa0, 0x61, 0xa8, 0x2e, 0x9c, 0x4b, 0x5a, 0x3d, + 0x94, 0xa5, 0x68, 0x60, 0x90, 0x32, 0x4c, 0x70, 0x8f, 0x52, 0x79, 0x9e, 0xe0, 0x5a, 0x2c, 0x77, + 0xde, 0x44, 0x51, 0x4e, 0x7e, 0xd1, 0x02, 0x10, 0x02, 0xb2, 0xd3, 0x88, 0xdc, 0x25, 0x31, 0xdf, + 0x66, 0x62, 0x94, 0x85, 0x94, 0xf1, 0x7f, 0x34, 0xb8, 0x92, 0x2d, 0x98, 0x64, 0x0a, 0xad, 0xdf, + 0x78, 0xec, 0x4d, 0x91, 0xdf, 0x44, 0x6d, 0x72, 0x1a, 0x28, 0x69, 0xb1, 0xb6, 0x0a, 0x68, 0xd4, + 0x0d, 0x3c, 0xd6, 0xb4, 0x7c, 0x1b, 0x2c, 0x0a, 0x29, 0x50, 0x97, 0xa2, 0x81, 0x61, 0xff, 0xf3, + 0x31, 0x38, 0x9b, 0x25, 0x3a, 0xdb, 0x6d, 0x26, 0x85, 0xb4, 0xf2, 0x68, 0xfc, 0x33, 0xf9, 0xb7, + 0x8f, 0x74, 0x97, 0xd1, 0xd7, 0x14, 0xd2, 0xa1, 0x4f, 0xf2, 0x25, 0x3f, 0xa3, 0x5b, 0x68, 0xec, + 0x31, 0x5b, 0x48, 0x53, 0x4e, 0xb5, 0xd2, 0x25, 0x18, 0x0f, 0x59, 0xcf, 0x17, 0x92, 0xd7, 0x1d, + 0xbc, 0x8f, 0x38, 0x84, 0x61, 0x74, 0x3d, 0x37, 0x92, 0x61, 0x18, 0x1a, 0xe3, 0x8e, 0xe7, 0x46, + 0xc8, 0x21, 0xf6, 0x37, 0xc7, 0x60, 0xb1, 0xff, 0x47, 0x91, 0x6f, 0x5a, 0x00, 0x0d, 0x76, 0x5c, + 0x09, 0xb9, 0x2f, 0xb3, 0x70, 0x2f, 0x72, 0x4e, 0xaa, 0x0d, 0x57, 0x15, 0xa7, 0xd8, 0xd7, 0x4c, + 0x17, 0x85, 0x68, 0x08, 0x42, 0xae, 0xa8, 0xa1, 0xcf, 0xaf, 0x6a, 0xc4, 0x64, 0xd2, 0x75, 0x36, + 0x34, 0x04, 0x0d, 0x2c, 0x76, 0x1e, 0xf5, 0x9c, 0x36, 0x0d, 0x3b, 0x8e, 0x0e, 0x6a, 0xe1, 0xe7, + 0xd1, 0x9b, 0xaa, 0x10, 0x63, 0xb8, 0xdd, 0x82, 0xe7, 0x06, 0x90, 0x33, 0xa7, 0x98, 0x01, 0xfb, + 0xbf, 0x5b, 0x70, 0x7e, 0xa5, 0xd5, 0x0d, 0x23, 0x1a, 0xfc, 0x7f, 0xe3, 0xba, 0xf7, 0xbf, 0x2c, + 0x78, 0xa6, 0xcf, 0x37, 0x3f, 0x01, 0x0f, 0xbe, 0x77, 0x92, 0x1e, 0x7c, 0x77, 0x46, 0x1d, 0xd2, + 0x99, 0xdf, 0xd1, 0xc7, 0x91, 0xef, 0x5f, 0x17, 0xe0, 0x14, 0x5b, 0xb6, 0x1a, 0x7e, 0x33, 0xa7, + 0x8d, 0xf3, 0x39, 0x98, 0xf8, 0x3c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0xe4, + 0xcb, 0x16, 0x4c, 0x7d, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xe2, 0x62, 0x98, 0xf8, 0x86, 0x25, + 0xb9, 0x43, 0x8a, 0x50, 0x04, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0xc5, 0x99, 0xbc, 0x00, 0x53, 0x3b, + 0x7e, 0xd0, 0xee, 0xb6, 0x9c, 0x74, 0xfc, 0xdb, 0x35, 0x51, 0x8c, 0x0a, 0xce, 0x26, 0xb9, 0xd3, + 0x71, 0xdf, 0xa2, 0x41, 0x28, 0x3c, 0xd3, 0x13, 0x93, 0xbc, 0xa2, 0x21, 0x68, 0x60, 0xf1, 0x3a, + 0xcd, 0x66, 0x40, 0x9b, 0x4e, 0xe4, 0x07, 0x7c, 0xe7, 0x30, 0xeb, 0x68, 0x08, 0x1a, 0x58, 0x8b, + 0x9f, 0x84, 0x19, 0x53, 0xf8, 0xa1, 0xc2, 0x1a, 0x3e, 0x05, 0xd2, 0x89, 0x30, 0xb5, 0x24, 0x59, + 0x83, 0x2c, 0x49, 0xf6, 0xbf, 0x1f, 0x03, 0xc3, 0x3a, 0xf4, 0x04, 0xa6, 0xba, 0x97, 0x98, 0xea, + 0x23, 0x5a, 0x36, 0x0c, 0x5b, 0x57, 0xbf, 0x20, 0xaf, 0xfd, 0x54, 0x90, 0xd7, 0xcd, 0xdc, 0x38, + 0x1e, 0x1f, 0xe3, 0xf5, 0x7d, 0x0b, 0x9e, 0x89, 0x91, 0x7b, 0x0d, 0xb7, 0x8f, 0x5e, 0xb7, 0x5f, + 0x81, 0x69, 0x27, 0xae, 0x26, 0x27, 0x96, 0x11, 0x61, 0xa3, 0x41, 0x68, 0xe2, 0xc5, 0xb1, 0x09, + 0x85, 0xc7, 0x8c, 0x4d, 0x18, 0x3f, 0x3e, 0x36, 0xc1, 0xfe, 0xd1, 0x18, 0x5c, 0xe8, 0xfd, 0x32, + 0xb5, 0xe2, 0x0c, 0xe6, 0x05, 0xf1, 0x2a, 0xcc, 0x44, 0xb2, 0x82, 0xb1, 0x7f, 0xea, 0x68, 0xdf, + 0x2d, 0x03, 0x86, 0x09, 0x4c, 0x56, 0xb3, 0x2e, 0xd6, 0xba, 0x5a, 0xdd, 0xef, 0xa8, 0xc8, 0x16, + 0x5d, 0x73, 0xc5, 0x80, 0x61, 0x02, 0x53, 0xfb, 0x0c, 0x8f, 0x9f, 0xb8, 0xcf, 0x70, 0x0d, 0xce, + 0x29, 0x2f, 0xc9, 0x6b, 0x7e, 0xb0, 0xe2, 0xb7, 0x3b, 0x2d, 0x1a, 0xa9, 0x15, 0xa4, 0x58, 0xbd, + 0x20, 0xab, 0x9c, 0xc3, 0x2c, 0x24, 0xcc, 0xae, 0x6b, 0x7f, 0xbf, 0x00, 0x67, 0xe2, 0x66, 0x5f, + 0xf1, 0xbd, 0x86, 0xcb, 0x1d, 0x6d, 0x5e, 0x83, 0xf1, 0xe8, 0xa0, 0xa3, 0x1a, 0xfb, 0x2f, 0x2b, + 0x71, 0xb6, 0x0e, 0x3a, 0xac, 0xb7, 0xcf, 0x67, 0x54, 0xe1, 0xa6, 0x73, 0x5e, 0x89, 0xac, 0xeb, + 0xd9, 0x21, 0x7a, 0xe0, 0xe5, 0xe4, 0x68, 0x7e, 0x78, 0x58, 0xce, 0x08, 0x76, 0x5f, 0xd2, 0x94, + 0x92, 0x63, 0x9e, 0xdc, 0x83, 0xd9, 0x96, 0x13, 0x46, 0x77, 0x3a, 0x0d, 0x27, 0xa2, 0x5b, 0xae, + 0x74, 0x61, 0x19, 0x2e, 0x60, 0x44, 0xdf, 0xf5, 0xaf, 0x27, 0x28, 0x61, 0x8a, 0x32, 0xd9, 0x07, + 0xc2, 0x4a, 0xb6, 0x02, 0xc7, 0x0b, 0xc5, 0x57, 0x31, 0x7e, 0xc3, 0x07, 0xa8, 0xe8, 0xa3, 0xf3, + 0x7a, 0x0f, 0x35, 0xcc, 0xe0, 0x40, 0x9e, 0x87, 0xc9, 0x80, 0x3a, 0xa1, 0xde, 0x0e, 0xf4, 0xfc, + 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, 0xa8, 0xc9, 0x47, 0x4c, 0xa8, 0x3f, 0xb5, 0x60, 0x36, 0xee, + 0xa6, 0x27, 0xa0, 0x7a, 0xb4, 0x93, 0xaa, 0xc7, 0xf5, 0xbc, 0x96, 0xc4, 0x3e, 0xda, 0xc6, 0x1f, + 0x4c, 0x9a, 0xdf, 0xc7, 0x03, 0x06, 0xbe, 0x00, 0x25, 0x35, 0xab, 0x95, 0x4e, 0x3f, 0xa2, 0x05, + 0x22, 0xa1, 0xed, 0x19, 0x81, 0x6e, 0x92, 0x09, 0xc6, 0xfc, 0x98, 0xae, 0xd3, 0x90, 0x7a, 0x8c, + 0x1c, 0xf6, 0x5a, 0xd7, 0x51, 0xfa, 0x4d, 0x96, 0xae, 0xa3, 0xea, 0x90, 0x3b, 0x70, 0xbe, 0x13, + 0xf8, 0x3c, 0xdc, 0x7a, 0x95, 0x3a, 0x8d, 0x96, 0xeb, 0x51, 0x65, 0xe6, 0x11, 0xae, 0x26, 0xcf, + 0x1c, 0x1d, 0x96, 0xcf, 0x6f, 0x66, 0xa3, 0x60, 0xbf, 0xba, 0xc9, 0x80, 0xbd, 0xf1, 0x01, 0x02, + 0xf6, 0xfe, 0x96, 0x36, 0xa6, 0xd2, 0x50, 0x86, 0xcd, 0x7d, 0x26, 0xaf, 0xae, 0xcc, 0x58, 0xd6, + 0xe3, 0x21, 0x55, 0x91, 0x4c, 0x51, 0xb3, 0xef, 0x6f, 0xb1, 0x9b, 0x7c, 0x4c, 0x8b, 0x5d, 0x1c, + 0x77, 0x31, 0xf5, 0xe3, 0x8c, 0xbb, 0x28, 0x7e, 0xa0, 0xe2, 0x2e, 0xde, 0x9f, 0x80, 0xf9, 0xb4, + 0x06, 0x72, 0xf2, 0xc1, 0x88, 0x7f, 0xc7, 0x82, 0x79, 0x35, 0x7b, 0x04, 0x4f, 0xad, 0xbf, 0xaf, + 0xe7, 0x34, 0x69, 0x85, 0x2e, 0xa5, 0xb3, 0x34, 0x6c, 0xa5, 0xb8, 0x61, 0x0f, 0x7f, 0xf2, 0x36, + 0x4c, 0xeb, 0x2b, 0x8b, 0xc7, 0x8a, 0x4c, 0x9c, 0xe3, 0x5a, 0x54, 0x4c, 0x02, 0x4d, 0x7a, 0xe4, + 0x7d, 0x0b, 0xa0, 0xae, 0xb6, 0x39, 0x35, 0xbb, 0x6e, 0xe7, 0x35, 0xbb, 0xf4, 0x06, 0x1a, 0x2b, + 0xcb, 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x15, 0x7e, 0x59, 0xa1, 0xb5, 0x3b, 0x91, 0xfd, 0x61, + 0x64, 0x9f, 0xf2, 0x63, 0x14, 0xd3, 0x58, 0x95, 0x32, 0x40, 0x21, 0x26, 0x84, 0xb0, 0x5f, 0x03, + 0xed, 0x05, 0xcc, 0x96, 0x2d, 0xee, 0x07, 0xbc, 0xe9, 0x44, 0xbb, 0x72, 0x08, 0xea, 0x65, 0xeb, + 0x9a, 0x02, 0x60, 0x8c, 0x63, 0x7f, 0x0e, 0x66, 0xdf, 0x08, 0x9c, 0xce, 0xae, 0xcb, 0x2f, 0x05, + 0xd8, 0xe1, 0xf3, 0x05, 0x98, 0x72, 0x1a, 0x8d, 0xac, 0x84, 0x22, 0x15, 0x51, 0x8c, 0x0a, 0x3e, + 0xd0, 0x39, 0xd3, 0xfe, 0x7d, 0x0b, 0x48, 0x7c, 0xb1, 0xea, 0x7a, 0xcd, 0x0d, 0x27, 0xaa, 0xef, + 0xb2, 0xf3, 0xd1, 0x2e, 0x2f, 0xcd, 0x3a, 0x1f, 0x5d, 0xd7, 0x10, 0x34, 0xb0, 0xc8, 0xbb, 0x30, + 0x2d, 0xfe, 0xbd, 0xa5, 0x4f, 0x5f, 0xa3, 0x3b, 0x33, 0xf3, 0x0d, 0x85, 0xcb, 0x24, 0x46, 0xe1, + 0xf5, 0x98, 0x03, 0x9a, 0xec, 0x58, 0x53, 0xad, 0x79, 0x3b, 0xad, 0xee, 0x83, 0xc6, 0x76, 0xdc, + 0x54, 0x9d, 0xc0, 0xdf, 0x71, 0x5b, 0x34, 0xdd, 0x54, 0x9b, 0xa2, 0x18, 0x15, 0x7c, 0xb0, 0xa6, + 0xfa, 0x57, 0x16, 0x9c, 0x5d, 0x0b, 0x23, 0xd7, 0x5f, 0xa5, 0x61, 0xc4, 0xb6, 0x15, 0xb6, 0xf8, + 0x74, 0x5b, 0x83, 0x38, 0xf4, 0xaf, 0xc2, 0xbc, 0xbc, 0xe4, 0xed, 0x6e, 0x87, 0x34, 0x32, 0xf4, + 0x78, 0x3d, 0x8f, 0x57, 0x52, 0x70, 0xec, 0xa9, 0xc1, 0xa8, 0xc8, 0xdb, 0xde, 0x98, 0x4a, 0x21, + 0x49, 0xa5, 0x96, 0x82, 0x63, 0x4f, 0x0d, 0xfb, 0x7b, 0x05, 0x38, 0xc3, 0x3f, 0x23, 0x15, 0x8c, + 0xf3, 0xf5, 0x7e, 0xc1, 0x38, 0x23, 0x4e, 0x65, 0xce, 0xeb, 0x31, 0x42, 0x71, 0xfe, 0xb6, 0x05, + 0x73, 0x8d, 0x64, 0x4b, 0xe7, 0x63, 0xf4, 0xca, 0xea, 0x43, 0xe1, 0xd3, 0x96, 0x2a, 0xc4, 0x34, + 0x7f, 0xf2, 0xab, 0x16, 0xcc, 0x25, 0xc5, 0x54, 0xab, 0xfb, 0x09, 0x34, 0x92, 0x76, 0x42, 0x4f, + 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xc3, 0x31, 0xd9, 0xa5, 0x27, 0x11, 0x69, 0x42, 0xee, 0x43, + 0x29, 0x6a, 0x85, 0xa2, 0x50, 0x7e, 0xed, 0x88, 0x27, 0xc2, 0xad, 0xf5, 0x9a, 0xf0, 0xaf, 0x88, + 0x95, 0x36, 0x59, 0xc2, 0x94, 0x4f, 0xc5, 0x8b, 0x33, 0xae, 0x77, 0x24, 0xe3, 0x5c, 0x8e, 0xa2, + 0x5b, 0x2b, 0x9b, 0x69, 0xc6, 0xb2, 0x84, 0x31, 0x56, 0xbc, 0xec, 0xdf, 0xb4, 0xa0, 0x74, 0xc3, + 0x57, 0xeb, 0xc8, 0xcf, 0xe5, 0x60, 0xe8, 0xd1, 0xfa, 0xa0, 0xbe, 0xc7, 0x8d, 0x8f, 0x18, 0xaf, + 0x27, 0xcc, 0x3c, 0xcf, 0x1a, 0xb4, 0x97, 0x78, 0x5e, 0x35, 0x46, 0xea, 0x86, 0xbf, 0xdd, 0xd7, + 0x36, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x4d, 0xe7, 0x80, 0x7a, 0x91, 0x33, 0xfc, 0x26, 0xf1, 0x0a, + 0x4c, 0x3b, 0x1d, 0x7e, 0x51, 0x68, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, 0x2f, + 0x68, 0x22, 0xec, 0x23, 0x6b, 0x29, 0x5a, 0x49, 0xc1, 0xb1, 0xa7, 0x06, 0xb9, 0x01, 0x44, 0x46, + 0x29, 0x57, 0xea, 0x75, 0xbf, 0xeb, 0x89, 0x25, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xa3, 0x07, + 0x03, 0x33, 0x6a, 0x91, 0xcf, 0xc2, 0x42, 0x9d, 0x53, 0x96, 0x47, 0x0f, 0x93, 0xa2, 0x38, 0x7e, + 0xea, 0x40, 0x8a, 0x95, 0x3e, 0x78, 0xd8, 0x97, 0x02, 0x93, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x52, + 0x93, 0xee, 0x64, 0x52, 0xd2, 0x5a, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x5f, 0x84, 0x52, 0xb4, 0x1b, + 0xd0, 0x70, 0xd7, 0x6f, 0x35, 0xa4, 0x63, 0xc7, 0x88, 0x96, 0x36, 0xd9, 0xfb, 0x5b, 0x8a, 0xaa, + 0x31, 0xbc, 0x55, 0x11, 0xc6, 0x3c, 0x49, 0x00, 0x93, 0x61, 0xdd, 0xef, 0xd0, 0x50, 0xaa, 0xec, + 0x37, 0x72, 0xe1, 0xce, 0x2d, 0x47, 0x86, 0x8d, 0x8f, 0x73, 0x40, 0xc9, 0xc9, 0xfe, 0xbd, 0x31, + 0x98, 0x31, 0x11, 0x07, 0x58, 0x9b, 0xbe, 0x6c, 0xc1, 0x4c, 0xdd, 0xf7, 0xa2, 0xc0, 0x6f, 0x09, + 0xfb, 0x55, 0x3e, 0x1a, 0x05, 0x23, 0xb5, 0x4a, 0x23, 0xc7, 0x6d, 0x19, 0xa6, 0x30, 0x83, 0x0d, + 0x26, 0x98, 0x92, 0xaf, 0x59, 0x30, 0x17, 0xfb, 0x01, 0xc6, 0x86, 0xb4, 0x5c, 0x05, 0xd1, 0x4b, + 0xfd, 0xd5, 0x24, 0x27, 0x4c, 0xb3, 0xb6, 0xb7, 0x61, 0x3e, 0xdd, 0xdb, 0xac, 0x29, 0x3b, 0x8e, + 0x9c, 0xeb, 0x85, 0xb8, 0x29, 0x37, 0x9d, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x42, 0xb1, 0xed, 0x04, + 0x4d, 0xd7, 0x73, 0x5a, 0xbc, 0x15, 0x0b, 0xc6, 0x82, 0x24, 0xcb, 0x51, 0x63, 0xd8, 0x1f, 0x83, + 0x99, 0x0d, 0xc7, 0x6b, 0xd2, 0x86, 0x5c, 0x87, 0x1f, 0x1d, 0xeb, 0xf8, 0xe7, 0xe3, 0x30, 0x6d, + 0x9c, 0xcd, 0x4e, 0xfe, 0x9c, 0x95, 0x48, 0xb5, 0x52, 0xc8, 0x31, 0xd5, 0xca, 0xa7, 0x01, 0x76, + 0x5c, 0xcf, 0x0d, 0x77, 0x1f, 0x33, 0x89, 0x0b, 0xbf, 0xf8, 0xbe, 0xa6, 0x29, 0xa0, 0x41, 0x2d, + 0xbe, 0x5d, 0x9c, 0x38, 0x26, 0x23, 0xd9, 0xfb, 0x96, 0xb1, 0xdd, 0x4c, 0xe6, 0xe1, 0x4d, 0x61, + 0x74, 0xcc, 0x92, 0xda, 0x7e, 0xc4, 0xc5, 0xcf, 0x71, 0xbb, 0xd2, 0x16, 0x14, 0x03, 0x1a, 0x76, + 0xdb, 0xec, 0xc4, 0x38, 0x35, 0x74, 0x33, 0x70, 0xbf, 0x16, 0x94, 0xf5, 0x51, 0x53, 0x5a, 0x7c, + 0x0d, 0x4e, 0x25, 0x44, 0x18, 0xea, 0xfa, 0xc6, 0x87, 0x4c, 0x03, 0xc0, 0xe3, 0x5c, 0xe6, 0xb0, + 0xbe, 0x68, 0x19, 0x59, 0x5c, 0x74, 0x5f, 0x08, 0xef, 0x25, 0x01, 0xb3, 0x7f, 0x34, 0x09, 0xd2, + 0x41, 0x60, 0x80, 0xe5, 0xca, 0xbc, 0x16, 0x1c, 0x7b, 0x8c, 0x6b, 0xc1, 0x1b, 0x30, 0xe3, 0x7a, + 0x6e, 0xe4, 0x3a, 0x2d, 0x6e, 0xdc, 0x91, 0xdb, 0xa9, 0x72, 0xef, 0x9e, 0x59, 0x33, 0x60, 0x19, + 0x74, 0x12, 0x75, 0xc9, 0x6d, 0x98, 0xe0, 0xfb, 0x8d, 0x1c, 0xc0, 0xc3, 0x7b, 0x31, 0x70, 0x07, + 0x16, 0x11, 0xf3, 0x25, 0x28, 0xf1, 0xc3, 0x87, 0x48, 0x63, 0xa3, 0x8f, 0xdf, 0x72, 0x1c, 0xc7, + 0x87, 0x8f, 0x14, 0x1c, 0x7b, 0x6a, 0x30, 0x2a, 0x3b, 0x8e, 0xdb, 0xea, 0x06, 0x34, 0xa6, 0x32, + 0x99, 0xa4, 0x72, 0x2d, 0x05, 0xc7, 0x9e, 0x1a, 0x64, 0x07, 0x66, 0x64, 0x99, 0xf0, 0x49, 0x9b, + 0x7a, 0xcc, 0xaf, 0xe4, 0xbe, 0x87, 0xd7, 0x0c, 0x4a, 0x98, 0xa0, 0x4b, 0xba, 0x70, 0xda, 0xf5, + 0xea, 0xbe, 0x57, 0x6f, 0x75, 0x43, 0x77, 0x9f, 0xc6, 0x01, 0x57, 0x8f, 0xc3, 0xec, 0xdc, 0xd1, + 0x61, 0xf9, 0xf4, 0x5a, 0x9a, 0x1c, 0xf6, 0x72, 0x20, 0x5f, 0xb2, 0xe0, 0x5c, 0xdd, 0xf7, 0x42, + 0x9e, 0x17, 0x62, 0x9f, 0x5e, 0x0d, 0x02, 0x3f, 0x10, 0xbc, 0x4b, 0x8f, 0xc9, 0x9b, 0xdb, 0x14, + 0x57, 0xb2, 0x48, 0x62, 0x36, 0x27, 0xf2, 0x0e, 0x14, 0x3b, 0x81, 0xbf, 0xef, 0x36, 0x68, 0x20, + 0xfd, 0x1b, 0xd7, 0xf3, 0xc8, 0x53, 0xb3, 0x29, 0x69, 0xc6, 0x4b, 0x8f, 0x2a, 0x41, 0xcd, 0xcf, + 0xfe, 0xdf, 0xd3, 0x30, 0x9b, 0x44, 0x27, 0xbf, 0x00, 0xd0, 0x09, 0xfc, 0x36, 0x8d, 0x76, 0xa9, + 0x0e, 0x9c, 0xb9, 0x39, 0x6a, 0x3a, 0x14, 0x45, 0x4f, 0xf9, 0x04, 0xb1, 0xe5, 0x22, 0x2e, 0x45, + 0x83, 0x23, 0x09, 0x60, 0x6a, 0x4f, 0x6c, 0xbb, 0x52, 0x0b, 0x79, 0x33, 0x17, 0x9d, 0x49, 0x72, + 0xe6, 0x11, 0x1f, 0xb2, 0x08, 0x15, 0x23, 0xb2, 0x0d, 0x85, 0xfb, 0x74, 0x3b, 0x9f, 0x58, 0xfc, + 0xbb, 0x54, 0x9e, 0x66, 0xaa, 0x53, 0x47, 0x87, 0xe5, 0xc2, 0x5d, 0xba, 0x8d, 0x8c, 0x38, 0xfb, + 0xae, 0x86, 0x70, 0x0c, 0x90, 0x4b, 0xc5, 0x9b, 0x39, 0x7a, 0x19, 0x88, 0xef, 0x92, 0x45, 0xa8, + 0x18, 0x91, 0x77, 0xa0, 0x74, 0xdf, 0xd9, 0xa7, 0x3b, 0x81, 0xef, 0x45, 0xd2, 0x11, 0x6d, 0xc4, + 0x58, 0x8a, 0xbb, 0x8a, 0x9c, 0xe4, 0xcb, 0xb7, 0x77, 0x5d, 0x88, 0x31, 0x3b, 0xb2, 0x0f, 0x45, + 0x8f, 0xde, 0x47, 0xda, 0x72, 0xeb, 0xf9, 0xc4, 0x2e, 0xdc, 0x94, 0xd4, 0x24, 0x67, 0xbe, 0xef, + 0xa9, 0x32, 0xd4, 0xbc, 0x58, 0x5f, 0xde, 0xf3, 0xb7, 0xe5, 0x42, 0x35, 0x62, 0x5f, 0xea, 0x93, + 0xa9, 0xe8, 0xcb, 0x1b, 0xfe, 0x36, 0x32, 0xe2, 0x6c, 0x8e, 0xd4, 0xb5, 0x17, 0x94, 0x5c, 0xa6, + 0x6e, 0xe6, 0xeb, 0xfd, 0x25, 0xe6, 0x48, 0x5c, 0x8a, 0x06, 0x47, 0xd6, 0xb6, 0x4d, 0x69, 0xac, + 0x94, 0x0b, 0xd5, 0x88, 0x6d, 0x9b, 0x34, 0x7d, 0x8a, 0xb6, 0x55, 0x65, 0xa8, 0x79, 0x31, 0xbe, + 0xae, 0xb4, 0xfc, 0xe5, 0xb3, 0x54, 0x25, 0xed, 0x88, 0x82, 0xaf, 0x2a, 0x43, 0xcd, 0x8b, 0xb5, + 0x77, 0xb8, 0x77, 0x70, 0xdf, 0x69, 0xed, 0xb9, 0x5e, 0x53, 0x06, 0x82, 0x8e, 0x9a, 0xf5, 0x78, + 0xef, 0xe0, 0xae, 0xa0, 0x67, 0xb6, 0x77, 0x5c, 0x8a, 0x06, 0x47, 0xf2, 0x0f, 0x2c, 0x98, 0xec, + 0xb4, 0xba, 0x4d, 0xd7, 0x5b, 0x98, 0xc9, 0xc3, 0x43, 0x28, 0xb9, 0xe4, 0x2e, 0x6d, 0x72, 0xd2, + 0x42, 0x51, 0xfc, 0x69, 0xed, 0xd4, 0xc8, 0x0b, 0x7f, 0xe9, 0xcf, 0xca, 0x0b, 0xd4, 0xab, 0xfb, + 0x0d, 0xd7, 0x6b, 0x2e, 0xdf, 0x0b, 0x7d, 0x6f, 0x09, 0x9d, 0xfb, 0x4a, 0x47, 0x97, 0x32, 0x2d, + 0x7e, 0x02, 0xa6, 0x0d, 0x12, 0x8f, 0x52, 0xf4, 0x66, 0x4c, 0x45, 0xef, 0x37, 0x27, 0x61, 0xc6, + 0xcc, 0xb4, 0x38, 0x80, 0xf6, 0xa5, 0x4f, 0x1c, 0x63, 0xc3, 0x9c, 0x38, 0xd8, 0x11, 0xd3, 0xb8, + 0x3d, 0x52, 0xe6, 0xad, 0xb5, 0xdc, 0x14, 0xee, 0xf8, 0x88, 0x69, 0x14, 0x86, 0x98, 0x60, 0x3a, + 0x84, 0x43, 0x09, 0x53, 0x5b, 0x85, 0x62, 0x37, 0x91, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x15, 0x80, + 0x38, 0xe3, 0xa0, 0xbc, 0x55, 0xd4, 0xfa, 0xb0, 0x91, 0x09, 0xd1, 0xc0, 0x22, 0xcf, 0xc3, 0x24, + 0x53, 0x7d, 0x68, 0x43, 0xc6, 0xa9, 0xeb, 0x73, 0xfc, 0x35, 0x5e, 0x8a, 0x12, 0x4a, 0x5e, 0x65, + 0x5a, 0x6a, 0xac, 0xb0, 0xc8, 0xf0, 0xf3, 0xb3, 0xb1, 0x96, 0x1a, 0xc3, 0x30, 0x81, 0xc9, 0x44, + 0xa7, 0x4c, 0xbf, 0xe0, 0x6b, 0x83, 0x21, 0x3a, 0x57, 0x3a, 0x50, 0xc0, 0xb8, 0x5d, 0x29, 0xa5, + 0x8f, 0xf0, 0x39, 0x3d, 0x61, 0xd8, 0x95, 0x52, 0x70, 0xec, 0xa9, 0xc1, 0x3e, 0x46, 0x5e, 0x88, + 0x4e, 0x0b, 0x6f, 0xe4, 0x3e, 0x57, 0x99, 0x5f, 0x31, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, + 0x07, 0x3f, 0x6c, 0x8d, 0x76, 0x2c, 0xfa, 0x1c, 0xcc, 0x26, 0x77, 0xa1, 0xdc, 0x6f, 0x3e, 0xbe, + 0x3a, 0x0e, 0x67, 0x6e, 0x36, 0x5d, 0x2f, 0x9d, 0x45, 0x2c, 0x2b, 0x89, 0xbc, 0x35, 0x74, 0x12, + 0x79, 0x1d, 0xf0, 0x26, 0x53, 0xb4, 0x67, 0x07, 0xbc, 0xa9, 0x7c, 0xf9, 0x49, 0x5c, 0xf2, 0xa7, + 0x16, 0x3c, 0xeb, 0x34, 0xc4, 0xb9, 0xc0, 0x69, 0xc9, 0x52, 0x23, 0xf7, 0xb1, 0x9c, 0xd1, 0xe1, + 0x88, 0xbb, 0x7c, 0xef, 0xc7, 0x2f, 0x55, 0x8e, 0xe1, 0x2a, 0x7a, 0xfc, 0xa7, 0xe4, 0x17, 0x3c, + 0x7b, 0x1c, 0x2a, 0x1e, 0x2b, 0x3e, 0xf9, 0x6b, 0x30, 0x97, 0xf8, 0x60, 0x69, 0x09, 0x2f, 0x89, + 0x0b, 0x8b, 0x5a, 0x12, 0x84, 0x69, 0xdc, 0xc5, 0x5b, 0xf0, 0xe1, 0x47, 0xca, 0x39, 0xd4, 0x60, + 0xfb, 0xae, 0x05, 0x33, 0x66, 0xc2, 0x1f, 0xf2, 0x22, 0x14, 0x23, 0x7f, 0x8f, 0x7a, 0x77, 0x02, + 0xe5, 0x0d, 0xab, 0x07, 0xfa, 0x16, 0x2f, 0xc7, 0x75, 0xd4, 0x18, 0x0c, 0xbb, 0xde, 0x72, 0xa9, + 0x17, 0xad, 0x35, 0x64, 0x37, 0x6b, 0xec, 0x15, 0x51, 0xbe, 0x8a, 0x1a, 0x43, 0x38, 0xb0, 0xb1, + 0xdf, 0x35, 0x5a, 0x0f, 0xa8, 0xf2, 0x9d, 0x37, 0x1c, 0xd8, 0x62, 0x18, 0x26, 0x30, 0x89, 0xad, + 0x4d, 0x9c, 0xe3, 0xf1, 0xbd, 0x46, 0xca, 0x24, 0xf9, 0xdb, 0x16, 0x94, 0x84, 0x89, 0x1e, 0xe9, + 0x4e, 0xca, 0x7f, 0x35, 0x65, 0x44, 0xa8, 0x6c, 0xae, 0x65, 0xf9, 0xaf, 0x5e, 0x82, 0xf1, 0x3d, + 0xd7, 0x53, 0x5f, 0xa2, 0xb7, 0xa5, 0x37, 0x5d, 0xaf, 0x81, 0x1c, 0xa2, 0x37, 0xae, 0x42, 0xdf, + 0x8d, 0x6b, 0x19, 0x4a, 0xda, 0xab, 0x43, 0x2e, 0xff, 0xda, 0x7a, 0xab, 0xbd, 0x40, 0x30, 0xc6, + 0xb1, 0x7f, 0xdd, 0x82, 0x59, 0x1e, 0x20, 0x1d, 0x9f, 0x87, 0x5f, 0xd1, 0x8e, 0x56, 0x42, 0xee, + 0x0b, 0x49, 0x47, 0xab, 0x87, 0x87, 0xe5, 0x69, 0x11, 0x52, 0x9d, 0xf4, 0xbb, 0xfa, 0x8c, 0x34, + 0xa2, 0x71, 0x77, 0xb0, 0xb1, 0xa1, 0x6d, 0x3c, 0xb1, 0x98, 0x8a, 0x08, 0xc6, 0xf4, 0xec, 0x77, + 0x61, 0xc6, 0x8c, 0x74, 0x22, 0xaf, 0xc0, 0x74, 0xc7, 0xf5, 0x9a, 0xc9, 0x88, 0x58, 0x7d, 0xd1, + 0xb0, 0x19, 0x83, 0xd0, 0xc4, 0xe3, 0xd5, 0xfc, 0xb8, 0x5a, 0xea, 0x7e, 0x62, 0xd3, 0x37, 0xab, + 0xc5, 0x7f, 0x78, 0xde, 0xf9, 0x8c, 0x88, 0xba, 0xdc, 0xf3, 0xce, 0x67, 0xf0, 0xf8, 0xf1, 0xe5, + 0x9d, 0xcf, 0x12, 0xe6, 0xff, 0xae, 0xbc, 0xf3, 0x3f, 0x0b, 0xc3, 0x26, 0x1c, 0x65, 0x7b, 0xfd, + 0x7d, 0x33, 0x6b, 0x81, 0x6e, 0x71, 0x99, 0xb6, 0x40, 0x42, 0xed, 0xef, 0x14, 0x60, 0x3e, 0x7d, + 0xe4, 0xcf, 0xdb, 0x9b, 0x82, 0x7c, 0xcd, 0x82, 0x59, 0x27, 0x91, 0xdc, 0x2d, 0xa7, 0x47, 0x6c, + 0x12, 0x34, 0x8d, 0xe4, 0x62, 0x89, 0x72, 0x4c, 0xf1, 0x26, 0x7f, 0x09, 0xa6, 0x22, 0xb7, 0x4d, + 0xfd, 0xae, 0x30, 0x04, 0x16, 0xc4, 0x81, 0x7c, 0x4b, 0x14, 0xa1, 0x82, 0xb1, 0x45, 0xd9, 0xe5, + 0x1a, 0x54, 0x40, 0xa5, 0xdb, 0xed, 0x7c, 0x6c, 0xb9, 0x14, 0xe5, 0xa8, 0x31, 0xc8, 0x03, 0x98, + 0x12, 0x7e, 0x17, 0xca, 0xc1, 0x66, 0x23, 0x27, 0xd3, 0x84, 0x70, 0xed, 0x88, 0xbb, 0x40, 0xfc, + 0x0f, 0x51, 0xb1, 0xb3, 0x3f, 0x06, 0x43, 0x66, 0x60, 0xb5, 0xaf, 0x02, 0x41, 0xbf, 0xd5, 0xda, + 0x76, 0xea, 0x7b, 0x77, 0x5d, 0xaf, 0xe1, 0xdf, 0xe7, 0x4b, 0xd1, 0x32, 0x94, 0x02, 0x19, 0x8f, + 0x1a, 0xca, 0x51, 0xa3, 0xd7, 0x32, 0x15, 0xa8, 0x1a, 0x62, 0x8c, 0x63, 0xff, 0xe1, 0x18, 0x4c, + 0xc9, 0xe0, 0xe9, 0x27, 0xe0, 0xf6, 0xbf, 0x97, 0xb8, 0x0f, 0x5e, 0xcb, 0x25, 0xe6, 0xbb, 0xaf, + 0xcf, 0x7f, 0x98, 0xf2, 0xf9, 0x7f, 0x33, 0x1f, 0x76, 0xc7, 0x3b, 0xfc, 0xff, 0xc1, 0x04, 0xcc, + 0xa5, 0x82, 0xd1, 0x99, 0x2e, 0xde, 0xe3, 0xe7, 0x7a, 0x27, 0xd7, 0x78, 0x77, 0x1d, 0xe8, 0x73, + 0xbc, 0xcb, 0x6b, 0x98, 0xc8, 0x97, 0x7d, 0x3b, 0xb7, 0xa7, 0x40, 0x7e, 0x92, 0x3a, 0x7b, 0x48, + 0x17, 0x4e, 0xf2, 0x2d, 0x0b, 0xce, 0x38, 0xbd, 0x6f, 0xa9, 0x48, 0x9b, 0xe1, 0xed, 0xdc, 0x1f, + 0x69, 0xa9, 0x3e, 0x23, 0x85, 0xcc, 0x7a, 0xb2, 0x06, 0xb3, 0x44, 0xb1, 0xff, 0x93, 0x05, 0x4f, + 0xf7, 0x4d, 0xab, 0xc0, 0xb3, 0x72, 0x05, 0x49, 0xa8, 0x5c, 0x33, 0x72, 0x4e, 0x1e, 0xa3, 0xef, + 0x8f, 0xd3, 0x89, 0x94, 0xd2, 0xec, 0xc9, 0xcb, 0x30, 0xc3, 0x75, 0x34, 0xb6, 0x7a, 0x46, 0xb4, + 0x23, 0xaf, 0xbf, 0xf8, 0x45, 0x48, 0xcd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x2d, 0x0b, 0x16, 0xfa, + 0xe5, 0x68, 0x1a, 0xc0, 0x38, 0xf3, 0x57, 0x53, 0xa1, 0x13, 0xe5, 0x9e, 0xd0, 0x89, 0x94, 0x79, + 0x46, 0x45, 0x49, 0x18, 0x96, 0x91, 0xc2, 0x23, 0x22, 0x03, 0xbe, 0x6e, 0xc1, 0xf9, 0x3e, 0x13, + 0xbe, 0x27, 0x84, 0xc6, 0x7a, 0xec, 0x10, 0x9a, 0xb1, 0x41, 0x43, 0x68, 0xec, 0x3f, 0x2a, 0xc0, + 0xbc, 0x94, 0x27, 0x56, 0xd4, 0x5f, 0x4d, 0x04, 0xa0, 0xfc, 0x54, 0x2a, 0x00, 0xe5, 0x6c, 0x1a, + 0xff, 0x27, 0xd1, 0x27, 0x1f, 0xac, 0xe8, 0x93, 0xbf, 0x18, 0x83, 0x73, 0x99, 0xa9, 0xa3, 0xc8, + 0x57, 0x33, 0x76, 0xaf, 0xbb, 0x39, 0xe7, 0xa8, 0x1a, 0x70, 0xff, 0x1a, 0x35, 0x64, 0xe3, 0x57, + 0xcd, 0x50, 0x09, 0xb1, 0x1b, 0xed, 0x9c, 0x40, 0xb6, 0xad, 0x21, 0xa3, 0x26, 0xec, 0x5f, 0x2a, + 0xc0, 0xe5, 0x41, 0x09, 0x7d, 0x40, 0xa3, 0xea, 0xc2, 0x44, 0x54, 0xdd, 0x13, 0xd2, 0x2c, 0x4e, + 0x24, 0xc0, 0xee, 0x1f, 0x8d, 0xeb, 0x6d, 0xaf, 0x77, 0x7c, 0x0e, 0xe4, 0x2b, 0x31, 0xc5, 0xb4, + 0x4f, 0x95, 0x75, 0x3b, 0x5e, 0x0a, 0xa7, 0x6a, 0xa2, 0xf8, 0xe1, 0x61, 0xf9, 0x74, 0x9c, 0xc0, + 0x44, 0x16, 0xa2, 0xaa, 0x44, 0x2e, 0x43, 0x31, 0x10, 0x50, 0x15, 0x47, 0x24, 0x1d, 0x4e, 0x44, + 0x19, 0x6a, 0x28, 0xf9, 0xa2, 0xa1, 0xae, 0x8f, 0x9f, 0x54, 0x9e, 0x9e, 0xe3, 0xfc, 0x68, 0xde, + 0x86, 0x62, 0xa8, 0x52, 0x43, 0x0b, 0xc5, 0xe5, 0xa5, 0x01, 0xc3, 0xd3, 0xd8, 0x19, 0x5c, 0xe5, + 0x89, 0x16, 0xdf, 0xa7, 0xb3, 0x48, 0x6b, 0x92, 0xc4, 0xd6, 0xc7, 0x5f, 0x61, 0xe7, 0x87, 0xde, + 0xa3, 0x2f, 0x89, 0x60, 0x4a, 0xbe, 0x18, 0x2a, 0x2f, 0x20, 0x37, 0x72, 0x0a, 0x45, 0x91, 0x8e, + 0xca, 0xfc, 0x54, 0xa9, 0xcc, 0x30, 0x8a, 0x95, 0xfd, 0x7d, 0x0b, 0xa6, 0xe5, 0x18, 0x79, 0x02, + 0x71, 0x7a, 0xf7, 0x92, 0x71, 0x7a, 0x57, 0x73, 0x59, 0xb1, 0xfa, 0x04, 0xe9, 0xdd, 0x83, 0x19, + 0x33, 0x67, 0x21, 0xf9, 0xb4, 0xb1, 0xe2, 0x5a, 0xa3, 0x64, 0x01, 0x53, 0x6b, 0x72, 0xbc, 0x1a, + 0xdb, 0xbf, 0x55, 0xd2, 0xad, 0xc8, 0xcf, 0xae, 0xe6, 0xc8, 0xb7, 0x8e, 0x1d, 0xf9, 0xe6, 0xc0, + 0x1b, 0xcb, 0x7f, 0xe0, 0xdd, 0x86, 0xa2, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0x9c, 0xe9, 0xb9, 0xcc, + 0x34, 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0x1a, 0x1b, 0x87, 0xd5, 0x72, 0xad, 0xc9, 0x90, + 0x77, 0x60, 0xfa, 0xbe, 0x1f, 0xec, 0xb5, 0x7c, 0x87, 0xe7, 0xe3, 0x87, 0x3c, 0x2e, 0xcb, 0xb5, + 0x81, 0x57, 0x84, 0x8f, 0xdc, 0x8d, 0xe9, 0xa3, 0xc9, 0x8c, 0x54, 0x60, 0xae, 0xed, 0x7a, 0x48, + 0x9d, 0x86, 0x0e, 0xc7, 0x1b, 0x17, 0xb9, 0xb0, 0x95, 0x6a, 0xbd, 0x91, 0x04, 0x63, 0x1a, 0x9f, + 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0x26, 0xbc, 0xdd, 0x1c, 0x7d, 0x30, 0x26, 0x2d, 0x18, 0x22, + 0x7e, 0x22, 0x59, 0x8e, 0x29, 0xde, 0xe4, 0x0b, 0x50, 0x0c, 0x65, 0x42, 0xc2, 0x7c, 0xbc, 0x2c, + 0xf4, 0xd9, 0x5e, 0x10, 0x8d, 0xbb, 0x52, 0x95, 0xa0, 0x66, 0x48, 0xd6, 0xe1, 0xac, 0x32, 0x9f, + 0x24, 0xde, 0x4c, 0x9b, 0x8c, 0xf3, 0x57, 0x61, 0x06, 0x1c, 0x33, 0x6b, 0x31, 0x55, 0x8e, 0xe7, + 0x02, 0x15, 0x97, 0x93, 0xc6, 0x7d, 0x1e, 0x9f, 0x7f, 0x0d, 0x94, 0xd0, 0xe3, 0xa2, 0x4d, 0x8b, + 0x23, 0x44, 0x9b, 0xd6, 0xe0, 0x5c, 0x1a, 0xc4, 0x13, 0x93, 0xf1, 0x5c, 0x68, 0xc6, 0x16, 0xba, + 0x99, 0x85, 0x84, 0xd9, 0x75, 0xc9, 0x5d, 0x28, 0x05, 0x94, 0x1f, 0xb2, 0x2a, 0xca, 0xaf, 0x6b, + 0x68, 0x0f, 0x56, 0x54, 0x04, 0x30, 0xa6, 0xc5, 0xfa, 0xdd, 0x49, 0x66, 0xa7, 0xbe, 0x9d, 0xe3, + 0x63, 0xbd, 0xb2, 0xef, 0xfb, 0x24, 0x0c, 0xb4, 0xff, 0xcd, 0x1c, 0x9c, 0x4a, 0xd8, 0x80, 0xc8, + 0x73, 0x30, 0xc1, 0x33, 0xb5, 0xf1, 0xd5, 0xaa, 0x18, 0xaf, 0xa8, 0xa2, 0x71, 0x04, 0x8c, 0xfc, + 0xb2, 0x05, 0x73, 0x9d, 0xc4, 0x9d, 0x86, 0x5a, 0xc8, 0x47, 0x34, 0x9c, 0x26, 0x2f, 0x4a, 0x8c, + 0x77, 0x1d, 0x92, 0xcc, 0x30, 0xcd, 0x9d, 0xad, 0x07, 0xd2, 0x0d, 0xbc, 0x45, 0x03, 0x8e, 0x2d, + 0x15, 0x3d, 0x4d, 0x62, 0x25, 0x09, 0xc6, 0x34, 0x3e, 0xeb, 0x61, 0xfe, 0x75, 0xa3, 0x3c, 0x07, + 0x59, 0x51, 0x04, 0x30, 0xa6, 0x45, 0x5e, 0x87, 0x59, 0x99, 0x94, 0x78, 0xd3, 0x6f, 0x5c, 0x77, + 0xc2, 0x5d, 0x79, 0xc2, 0xd1, 0x27, 0xb2, 0x95, 0x04, 0x14, 0x53, 0xd8, 0xfc, 0xdb, 0xe2, 0xcc, + 0xcf, 0x9c, 0xc0, 0x64, 0xf2, 0xd9, 0x8b, 0x95, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x45, 0x63, 0x1b, + 0x12, 0x0e, 0x03, 0x7a, 0x35, 0xc8, 0xd8, 0x8a, 0x2a, 0x30, 0xd7, 0xe5, 0x07, 0xc2, 0x86, 0x02, + 0xca, 0xf9, 0xa8, 0x19, 0xde, 0x49, 0x82, 0x31, 0x8d, 0x4f, 0x5e, 0x83, 0x53, 0x01, 0x5b, 0x6c, + 0x35, 0x01, 0xe1, 0x45, 0xa0, 0x2f, 0x89, 0xd1, 0x04, 0x62, 0x12, 0x97, 0xbc, 0x01, 0xa7, 0xe3, + 0x1c, 0x9e, 0x8a, 0x80, 0x70, 0x2b, 0xd0, 0x09, 0xe5, 0x2a, 0x69, 0x04, 0xec, 0xad, 0x43, 0xfe, + 0x06, 0xcc, 0x1b, 0x2d, 0xb1, 0xe6, 0x35, 0xe8, 0x03, 0x99, 0x67, 0x91, 0x3f, 0xe3, 0xb4, 0x92, + 0x82, 0x61, 0x0f, 0x36, 0xf9, 0x24, 0xcc, 0xd6, 0xfd, 0x56, 0x8b, 0xaf, 0x71, 0xe2, 0xc9, 0x05, + 0x91, 0x50, 0x51, 0xa4, 0x9e, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x00, 0xf1, 0xb7, 0x99, 0x7a, + 0x45, 0x1b, 0x6f, 0x50, 0x8f, 0x4a, 0x8d, 0xe3, 0x54, 0x32, 0x08, 0xe5, 0x56, 0x0f, 0x06, 0x66, + 0xd4, 0xe2, 0xf9, 0xe8, 0x8c, 0xa0, 0xdd, 0xd9, 0x3c, 0x9e, 0x46, 0x4c, 0x9b, 0x2f, 0x1e, 0x19, + 0xb1, 0x1b, 0xc0, 0xa4, 0x88, 0x09, 0xca, 0x27, 0xb3, 0xa2, 0x99, 0x7d, 0x3d, 0xde, 0x23, 0x44, + 0x29, 0x4a, 0x4e, 0xe4, 0x17, 0xa0, 0xb4, 0xad, 0x9e, 0xe2, 0xe0, 0xe9, 0x14, 0x47, 0xde, 0x17, + 0x53, 0xaf, 0xca, 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x1e, 0xa6, 0xaf, 0x6f, 0x56, + 0xf4, 0x28, 0x3c, 0xcd, 0x7b, 0x7f, 0x9c, 0x55, 0x41, 0x13, 0xc0, 0x66, 0x98, 0x56, 0xdf, 0x48, + 0xf2, 0xa6, 0x3c, 0x43, 0x1b, 0x63, 0xd8, 0xfc, 0xea, 0x1f, 0x6b, 0x0b, 0x67, 0x52, 0xd8, 0xb2, + 0x1c, 0x35, 0x06, 0x79, 0x1b, 0xa6, 0xe5, 0x7e, 0xc1, 0xd7, 0xa6, 0xb3, 0x8f, 0x17, 0x10, 0x8e, + 0x31, 0x09, 0x34, 0xe9, 0xf1, 0x3b, 0x5b, 0xfe, 0x42, 0x01, 0xbd, 0xd6, 0x6d, 0xb5, 0x16, 0xce, + 0xf1, 0x75, 0x33, 0xbe, 0xb3, 0x8d, 0x41, 0x68, 0xe2, 0x91, 0x97, 0x94, 0x0b, 0xd7, 0x87, 0x12, + 0x97, 0xd8, 0xda, 0x85, 0x4b, 0x2b, 0xdd, 0x7d, 0x62, 0x46, 0xce, 0x3f, 0xc2, 0x77, 0x6a, 0x1b, + 0x16, 0x95, 0xc6, 0xd7, 0x3b, 0x49, 0x16, 0x16, 0x12, 0xa6, 0x92, 0xc5, 0xbb, 0x7d, 0x31, 0xf1, + 0x18, 0x2a, 0x64, 0x1b, 0x0a, 0x4e, 0x6b, 0x7b, 0xe1, 0xe9, 0x3c, 0x54, 0xd7, 0xca, 0x7a, 0x55, + 0x8e, 0x28, 0xee, 0xe7, 0x59, 0x59, 0xaf, 0x22, 0x23, 0x4e, 0x5c, 0x18, 0x77, 0x5a, 0xdb, 0xe1, + 0xc2, 0x22, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0xeb, 0xd5, 0x10, 0x39, 0x0b, 0xfb, 0x4b, + 0x63, 0xfa, 0xa2, 0x46, 0x27, 0xb7, 0x7e, 0xd7, 0x9c, 0x40, 0x56, 0x1e, 0x4f, 0xe6, 0xf7, 0x3c, + 0x8d, 0x23, 0xf6, 0xbe, 0xcc, 0xe9, 0xd3, 0xd1, 0x4b, 0x46, 0x2e, 0x59, 0xb1, 0x92, 0x89, 0xbb, + 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xdf, 0x01, 0x6d, 0xf4, 0x4b, 0xb9, 0x3f, 0x05, 0x30, 0xe1, + 0x86, 0x91, 0xeb, 0xe7, 0x18, 0x27, 0x9d, 0xca, 0x78, 0xcd, 0xc3, 0x30, 0x38, 0x00, 0x05, 0x2b, + 0xc6, 0xd3, 0x6b, 0xba, 0xde, 0x03, 0xf9, 0xf9, 0xb7, 0x73, 0xf7, 0x6b, 0x12, 0x3c, 0x39, 0x00, + 0x05, 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, 0x1e, 0x7d, 0x5d, 0x59, 0xaf, 0xa6, 0xf8, 0x25, 0x07, + 0xf7, 0x3d, 0x28, 0x84, 0x6d, 0x57, 0xaa, 0x4b, 0x23, 0xf2, 0xaa, 0x6d, 0xac, 0x65, 0xf1, 0xaa, + 0x6d, 0xac, 0x21, 0x63, 0x42, 0xbe, 0x62, 0x01, 0x38, 0xed, 0x6d, 0x27, 0x0c, 0x9d, 0x86, 0xb6, + 0xce, 0x8c, 0xf8, 0x92, 0x45, 0x45, 0xd3, 0x4b, 0xb1, 0xe6, 0x9e, 0xbc, 0x31, 0x14, 0x0d, 0xce, + 0xe4, 0x1d, 0x98, 0x72, 0xc4, 0x53, 0x81, 0xd2, 0x29, 0x3d, 0x9f, 0xf7, 0x2f, 0x53, 0x12, 0x70, + 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0x77, 0xdc, 0x3d, 0x69, 0x1c, 0xaa, + 0x8d, 0xfc, 0x98, 0x05, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x4f, 0xb7, 0x3b, 0x9e, + 0xa3, 0x43, 0x0d, 0xf3, 0x09, 0x48, 0x35, 0x83, 0x17, 0x8d, 0xa7, 0xdb, 0x4d, 0x46, 0x98, 0xe4, + 0x4b, 0xf6, 0x61, 0xd2, 0xe1, 0x8f, 0x98, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x20, 0x6a, 0xaa, 0x0d, + 0xf8, 0xe2, 0x22, 0x9f, 0x4a, 0x95, 0xdc, 0xc8, 0x6f, 0x58, 0x30, 0x25, 0xfc, 0xa5, 0x99, 0x42, + 0xca, 0xbe, 0xfd, 0x73, 0x27, 0x90, 0x39, 0x5f, 0xfa, 0x72, 0x4b, 0x0f, 0xa0, 0x8f, 0x68, 0x67, + 0x50, 0x51, 0x7a, 0xac, 0x37, 0xb7, 0x92, 0x6e, 0xf1, 0x93, 0x30, 0x63, 0x52, 0x19, 0xca, 0x9f, + 0xfb, 0x87, 0x05, 0x00, 0xde, 0xd0, 0x22, 0xb9, 0x48, 0x9b, 0xa7, 0xf9, 0xdd, 0xf5, 0x1b, 0x39, + 0x3d, 0x78, 0x68, 0xe4, 0x08, 0x01, 0x99, 0xd3, 0x77, 0xd7, 0x6f, 0xa0, 0x64, 0x42, 0x9a, 0x30, + 0xde, 0x71, 0xa2, 0xdd, 0xfc, 0x13, 0x92, 0x14, 0x45, 0x94, 0x6d, 0xb4, 0x8b, 0x9c, 0x01, 0x79, + 0xcf, 0x8a, 0x5d, 0x63, 0x0a, 0xf9, 0x38, 0x30, 0xa8, 0x36, 0x5b, 0x92, 0xce, 0x30, 0xa9, 0x84, + 0x9d, 0x69, 0x17, 0x99, 0xc5, 0xf7, 0x2d, 0x98, 0x31, 0x51, 0x33, 0xba, 0xe9, 0xe7, 0xcd, 0x6e, + 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0xaf, 0x16, 0x40, 0xfc, 0x7c, 0x7f, 0xec, 0xb6, 0x6e, 0x0d, + 0xec, 0xb6, 0x3e, 0x36, 0xa4, 0xdb, 0x7a, 0x61, 0x28, 0xb7, 0xf5, 0xf1, 0xe1, 0xdd, 0xd6, 0x27, + 0xfa, 0xbb, 0xad, 0xdb, 0xdf, 0xb0, 0xe0, 0x74, 0xcf, 0x6e, 0xc3, 0xf4, 0xe0, 0xc0, 0xf7, 0xa3, + 0x3e, 0x2e, 0x8f, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0xab, 0x30, 0x2f, 0x1f, 0xb5, 0xa8, 0x75, 0x5a, + 0x6e, 0x66, 0xb2, 0x98, 0xad, 0x14, 0x1c, 0x7b, 0x6a, 0xd8, 0xdf, 0xb1, 0x60, 0xda, 0x08, 0x31, + 0x67, 0xdf, 0xc1, 0xfd, 0x5e, 0xa5, 0x18, 0xf1, 0x7b, 0x1e, 0xfc, 0xa2, 0x4a, 0xc0, 0xc4, 0x9d, + 0x69, 0xd3, 0x48, 0x79, 0x1e, 0xdf, 0x99, 0xb2, 0x52, 0x94, 0x50, 0x91, 0xcc, 0x9a, 0x76, 0x78, + 0xa3, 0x17, 0xcc, 0x64, 0xd6, 0xb4, 0x83, 0x1c, 0xc2, 0xd9, 0xb1, 0x03, 0x81, 0x74, 0x69, 0x35, + 0x9e, 0x0f, 0x71, 0x82, 0x08, 0x05, 0x8c, 0x5c, 0x80, 0x02, 0xf5, 0x1a, 0xd2, 0x7a, 0xa1, 0x1f, + 0xf8, 0xbc, 0xea, 0x35, 0x90, 0x95, 0xdb, 0xb7, 0x60, 0x46, 0xb8, 0xf3, 0xbe, 0x49, 0x0f, 0x06, + 0x7e, 0x31, 0x94, 0x8d, 0xf6, 0xd4, 0x8b, 0xa1, 0xac, 0x3a, 0x2b, 0xb7, 0xff, 0xa9, 0x05, 0xa9, + 0x37, 0x6e, 0x8c, 0xfb, 0x13, 0xab, 0xef, 0xfd, 0x89, 0x69, 0x73, 0x1f, 0x3b, 0xd6, 0xe6, 0x7e, + 0x03, 0x48, 0x9b, 0x4d, 0x85, 0xc4, 0x8b, 0x4e, 0xd2, 0x70, 0x14, 0x27, 0xb4, 0xe8, 0xc1, 0xc0, + 0x8c, 0x5a, 0xf6, 0x3f, 0x11, 0xc2, 0x9a, 0xaf, 0xde, 0x3c, 0xba, 0x01, 0xba, 0x30, 0xc1, 0x49, + 0x49, 0xeb, 0xd9, 0x88, 0x96, 0xe7, 0xde, 0xc4, 0x50, 0x71, 0x47, 0xca, 0x29, 0xcf, 0xb9, 0xd9, + 0x7f, 0x24, 0x64, 0x35, 0x9e, 0xc5, 0x19, 0x40, 0xd6, 0x76, 0x52, 0xd6, 0xeb, 0x79, 0xad, 0x95, + 0xd9, 0x32, 0x92, 0x25, 0x80, 0x0e, 0x0d, 0xea, 0xd4, 0x8b, 0x54, 0xa0, 0xcd, 0x84, 0x0c, 0xf9, + 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0x5f, 0x67, 0x13, 0x28, 0x7e, 0x4b, 0x97, 0x5c, 0x4e, 0xfb, 0x8a, + 0xa6, 0x27, 0x87, 0x76, 0x15, 0x35, 0xc2, 0x2f, 0xc6, 0x1e, 0x11, 0x7e, 0xf1, 0x02, 0x4c, 0x05, + 0x7e, 0x8b, 0x56, 0x02, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa2, 0x82, 0xdb, 0xbf, 0x66, + 0xc1, 0x7c, 0x3a, 0x3e, 0x2c, 0x77, 0x07, 0x56, 0x33, 0x88, 0xbd, 0x30, 0x7c, 0x10, 0xbb, 0xfd, + 0x1e, 0x13, 0x32, 0x72, 0xeb, 0x7b, 0xae, 0x27, 0xe2, 0xbe, 0x59, 0xcb, 0xbd, 0x00, 0x53, 0x54, + 0xbe, 0x09, 0x2a, 0x8c, 0xc0, 0x5a, 0x48, 0xf5, 0x14, 0xa8, 0x82, 0x93, 0x0a, 0xcc, 0xa9, 0xab, + 0x2f, 0x65, 0xb9, 0x17, 0xf9, 0x2a, 0xb4, 0xa5, 0x70, 0x35, 0x09, 0xc6, 0x34, 0xbe, 0xfd, 0x45, + 0x98, 0x36, 0x36, 0x25, 0xbe, 0x7e, 0x3f, 0x70, 0xea, 0x51, 0x7a, 0xdd, 0xbb, 0xca, 0x0a, 0x51, + 0xc0, 0xf8, 0x05, 0x83, 0x08, 0x5f, 0x49, 0xad, 0x7b, 0x32, 0x68, 0x45, 0x42, 0x19, 0xb1, 0x80, + 0x36, 0xe9, 0x03, 0x95, 0x91, 0x5e, 0x11, 0x43, 0x56, 0x88, 0x02, 0x66, 0xbf, 0x08, 0x45, 0x95, + 0x55, 0x88, 0xa7, 0xe6, 0x50, 0xc6, 0x6f, 0x33, 0x35, 0x87, 0x1f, 0x44, 0xc8, 0x21, 0xf6, 0x5b, + 0x50, 0x54, 0xc9, 0x8f, 0x1e, 0x8d, 0xcd, 0x96, 0xa2, 0xd0, 0x73, 0xaf, 0xfb, 0x61, 0xa4, 0x32, + 0x36, 0x89, 0xfb, 0xb9, 0x9b, 0x6b, 0xbc, 0x0c, 0x35, 0xd4, 0x7e, 0x09, 0xe6, 0x52, 0xf7, 0xb4, + 0x03, 0xe4, 0xf1, 0xf8, 0xbd, 0x02, 0xcc, 0x98, 0xd7, 0x75, 0x03, 0xcc, 0xe2, 0xc1, 0x17, 0xc7, + 0x8c, 0x2b, 0xb6, 0xc2, 0x90, 0x57, 0x6c, 0xe6, 0x9d, 0xe6, 0xf8, 0xc9, 0xde, 0x69, 0x4e, 0xe4, + 0x73, 0xa7, 0x69, 0xdc, 0xbd, 0x4f, 0x3e, 0xb9, 0xbb, 0xf7, 0xdf, 0x99, 0x80, 0xd9, 0x64, 0x62, + 0xc8, 0x01, 0x7a, 0xf2, 0xc5, 0x9e, 0x9e, 0x1c, 0xd2, 0xa6, 0x5f, 0x18, 0xd5, 0xa6, 0x3f, 0x3e, + 0xaa, 0x4d, 0x7f, 0xe2, 0x31, 0x6c, 0xfa, 0xbd, 0x16, 0xf9, 0xc9, 0x81, 0x2d, 0xf2, 0x9f, 0xd2, + 0x5e, 0x79, 0x53, 0x09, 0x37, 0x96, 0xd8, 0x2b, 0x8f, 0x24, 0xbb, 0x61, 0xc5, 0x6f, 0x64, 0x7a, + 0x37, 0x16, 0x1f, 0x61, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x86, 0xbf, 0x36, 0xfc, 0xd0, 0x10, 0x0e, + 0x74, 0xaf, 0xc0, 0xb4, 0x1c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8b, 0x41, 0x68, 0xe2, + 0xf1, 0x47, 0xd5, 0x93, 0x4f, 0xed, 0xf3, 0x2b, 0x12, 0xf3, 0x51, 0xf5, 0xd4, 0xd3, 0xfc, 0x69, + 0x7c, 0xfb, 0x0b, 0x70, 0x2e, 0xd3, 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x0d, 0x89, 0x60, + 0x88, 0x91, 0x7a, 0x8c, 0x61, 0xf1, 0x6e, 0x5f, 0x4c, 0x3c, 0x86, 0x8a, 0xfd, 0xed, 0x02, 0xcc, + 0x26, 0x5f, 0xe4, 0x24, 0xf7, 0xb5, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x20, 0x6b, 0x24, 0x1b, 0xec, + 0x7b, 0x59, 0x71, 0x9f, 0x8f, 0xaf, 0x6d, 0x9d, 0xf9, 0xf0, 0xe4, 0x18, 0xcb, 0x5b, 0x02, 0xc9, + 0x8e, 0x3f, 0xba, 0x19, 0xc7, 0x25, 0xca, 0xd3, 0x6c, 0xee, 0xdc, 0xe3, 0xf8, 0x3a, 0xcd, 0x0a, + 0x0d, 0xb6, 0x6c, 0x6f, 0xd9, 0xa7, 0x81, 0xbb, 0xe3, 0xea, 0xd7, 0xc4, 0xf9, 0xca, 0xfd, 0x96, + 0x2c, 0x43, 0x0d, 0xb5, 0xdf, 0x1b, 0x83, 0x12, 0x4f, 0xa3, 0x74, 0x2d, 0xf0, 0xdb, 0xfc, 0xd9, + 0xba, 0xd0, 0x38, 0x39, 0xc8, 0x6e, 0xbb, 0x31, 0xea, 0xdb, 0x90, 0x31, 0x45, 0xe9, 0x31, 0x6d, + 0x94, 0x60, 0x82, 0x23, 0xe9, 0x40, 0x71, 0x47, 0xa6, 0x7d, 0x95, 0x7d, 0x37, 0x62, 0xea, 0x42, + 0x95, 0x44, 0x56, 0x34, 0x81, 0xfa, 0x87, 0x9a, 0x8b, 0xed, 0xc0, 0x5c, 0x2a, 0x0f, 0x46, 0xee, + 0xc9, 0x62, 0xff, 0xc7, 0x38, 0x94, 0x74, 0xb8, 0x0e, 0xf9, 0x44, 0xc2, 0x8c, 0x53, 0xaa, 0x7e, + 0xd8, 0x78, 0x53, 0x69, 0xd7, 0x6f, 0x3c, 0x3c, 0x2c, 0xcf, 0x69, 0xe4, 0x94, 0x49, 0xe6, 0x02, + 0x14, 0xba, 0x41, 0x2b, 0x7d, 0x4e, 0xbb, 0x83, 0xeb, 0xc8, 0xca, 0xcd, 0x10, 0xa3, 0xc2, 0x13, + 0x0d, 0x31, 0x62, 0xbb, 0xe4, 0xb6, 0xdf, 0x38, 0x48, 0xbf, 0xc1, 0x54, 0xf5, 0x1b, 0x07, 0xc8, + 0x21, 0xe4, 0x75, 0x98, 0x95, 0x71, 0x53, 0xe6, 0xcb, 0xf4, 0x85, 0xf8, 0xf2, 0x7d, 0x2b, 0x01, + 0xc5, 0x14, 0x36, 0xdb, 0x65, 0xef, 0x85, 0xbe, 0xc7, 0x53, 0x00, 0x4f, 0x26, 0x6f, 0xea, 0x6e, + 0xd4, 0x6e, 0xdd, 0xe4, 0xe6, 0x24, 0x8d, 0x91, 0x08, 0xcd, 0x9a, 0x7a, 0x64, 0x68, 0xd6, 0xaa, + 0xa0, 0xcd, 0xa4, 0xe5, 0x3b, 0xca, 0x4c, 0xf5, 0xb2, 0xa2, 0xcb, 0xca, 0x1e, 0x1e, 0x1e, 0x63, + 0xe8, 0xd3, 0x35, 0xb3, 0x82, 0xd8, 0x4a, 0x3f, 0xbe, 0x20, 0x36, 0xfb, 0x0e, 0xcc, 0xa5, 0xfa, + 0x4f, 0x1d, 0xf3, 0xad, 0xec, 0x63, 0xfe, 0x60, 0xaf, 0x38, 0xfd, 0x33, 0x0b, 0x4e, 0xf7, 0xac, + 0x48, 0x83, 0x46, 0x13, 0xa6, 0xf7, 0xc6, 0xb1, 0xc7, 0xdf, 0x1b, 0x0b, 0xc3, 0xed, 0x8d, 0xd5, + 0xed, 0xef, 0xfe, 0xe0, 0xe2, 0x53, 0xdf, 0xfb, 0xc1, 0xc5, 0xa7, 0xfe, 0xf8, 0x07, 0x17, 0x9f, + 0x7a, 0xef, 0xe8, 0xa2, 0xf5, 0xdd, 0xa3, 0x8b, 0xd6, 0xf7, 0x8e, 0x2e, 0x5a, 0x7f, 0x7c, 0x74, + 0xd1, 0xfa, 0x8f, 0x47, 0x17, 0xad, 0x6f, 0xfc, 0xf9, 0xc5, 0xa7, 0x3e, 0xfd, 0xa9, 0xb8, 0xa7, + 0x96, 0x55, 0x4f, 0xf1, 0x1f, 0x1f, 0x55, 0xfd, 0xb2, 0xdc, 0xd9, 0x6b, 0x2e, 0xb3, 0x9e, 0x5a, + 0xd6, 0x25, 0xaa, 0xa7, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0x97, 0x00, 0x96, + 0xa2, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -5943,6 +5944,11 @@ func (m *DatadogMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.Aggregator) + copy(dAtA[i:], m.Aggregator) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Aggregator))) + i-- + dAtA[i] = 0x32 i -= len(m.ApiVersion) copy(dAtA[i:], m.ApiVersion) i = encodeVarintGenerated(dAtA, i, uint64(len(m.ApiVersion))) @@ -11039,6 +11045,8 @@ func (m *DatadogMetric) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.ApiVersion) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Aggregator) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -13179,6 +13187,7 @@ func (this *DatadogMetric) String() string { `Queries:` + mapStringForQueries + `,`, `Formula:` + fmt.Sprintf("%v", this.Formula) + `,`, `ApiVersion:` + fmt.Sprintf("%v", this.ApiVersion) + `,`, + `Aggregator:` + fmt.Sprintf("%v", this.Aggregator) + `,`, `}`, }, "") return s @@ -20905,6 +20914,38 @@ func (m *DatadogMetric) Unmarshal(dAtA []byte) error { } m.ApiVersion = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Aggregator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Aggregator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 1612197d8b..329a2ae483 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -632,6 +632,11 @@ message DatadogMetric { // +kubebuilder:validation:Enum=v1;v2 // +kubebuilder:default=v1 optional string apiVersion = 5; + + // +kubebuilder:default="last" + // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area + // Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2 + optional string aggregator = 6; } // DryRun defines the settings for running the analysis in Dry-Run mode. diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 122afd311e..81ac6b4a3d 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -1875,6 +1875,13 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac Format: "", }, }, + "aggregator": { + SchemaProps: spec.SchemaProps{ + Description: "Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index acbbf9418a..b6aa86dd83 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -1006,6 +1006,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetr * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric */ apiVersion?: string; + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + aggregator?: string; } /** * DryRun defines the settings for running the analysis in Dry-Run mode. From c536b87102deadf36db42e38e941313430f267e9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:58:08 -0600 Subject: [PATCH 172/264] docs: Update Changelog (#3328) update changelog Co-authored-by: zachaller --- CHANGELOG.md | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5023a1e9c1..e2d67e7b35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,242 @@ + + +## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) + +### Build + +* **deps:** always resolve momentjs version 2.29.4 ([#3182](https://github.com/argoproj/argo-rollouts/issues/3182)) + +### Fix + +* rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) + + +## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) + +### Fix + +* Revert "fix: istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126))" ([#3147](https://github.com/argoproj/argo-rollouts/issues/3147)) + + + +## [v1.6.1](https://github.com/argoproj/argo-rollouts/compare/v1.6.0...v1.6.1) (2023-11-01) + +### Chore + +* upgrade cosign ([#3139](https://github.com/argoproj/argo-rollouts/issues/3139)) +* add missing rollout fields ([#3062](https://github.com/argoproj/argo-rollouts/issues/3062)) +* change file name for readthedocs compatibility ([#2999](https://github.com/argoproj/argo-rollouts/issues/2999)) + +### Fix + +* istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126)) +* docs require build.os to be defined ([#3133](https://github.com/argoproj/argo-rollouts/issues/3133)) +* inopportune scaling events would lose some status fields ([#3060](https://github.com/argoproj/argo-rollouts/issues/3060)) +* rollback to stable with dynamicStableScale could overwhelm stable pods ([#3077](https://github.com/argoproj/argo-rollouts/issues/3077)) +* prevent hot loop when fully promoted rollout is aborted ([#3064](https://github.com/argoproj/argo-rollouts/issues/3064)) +* keep rs informer updated ([#3091](https://github.com/argoproj/argo-rollouts/issues/3091)) +* bump notification-engine to fix double send on self server notifications ([#3095](https://github.com/argoproj/argo-rollouts/issues/3095)) +* sync notification controller configmaps/secrets first ([#3075](https://github.com/argoproj/argo-rollouts/issues/3075)) +* missing notification on error ([#3076](https://github.com/argoproj/argo-rollouts/issues/3076)) + + + +## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) + +### Chore + +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 ([#2950](https://github.com/argoproj/argo-rollouts/issues/2950)) +* **deps:** bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 ([#2951](https://github.com/argoproj/argo-rollouts/issues/2951)) + +### Docs + +* update supported k8s version ([#2949](https://github.com/argoproj/argo-rollouts/issues/2949)) + +### Fix + +* analysis step should be ignored after promote ([#3016](https://github.com/argoproj/argo-rollouts/issues/3016)) +* **controller:** rollback should skip all steps to active rs within RollbackWindow ([#2953](https://github.com/argoproj/argo-rollouts/issues/2953)) +* **controller:** typo fix ("Secrete" -> "Secret") in secret informer ([#2965](https://github.com/argoproj/argo-rollouts/issues/2965)) + + + +## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) + +### Chore + +* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) +* bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) +* Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) +* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) +* add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) +* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) +* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) +* Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) +* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) +* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) +* **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) +* **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 ([#2884](https://github.com/argoproj/argo-rollouts/issues/2884)) +* **deps:** bump docker/setup-qemu-action from 2.1.0 to 2.2.0 ([#2878](https://github.com/argoproj/argo-rollouts/issues/2878)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 ([#2883](https://github.com/argoproj/argo-rollouts/issues/2883)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 ([#2880](https://github.com/argoproj/argo-rollouts/issues/2880)) +* **deps:** bump actions/setup-go from 4.0.0 to 4.0.1 ([#2881](https://github.com/argoproj/argo-rollouts/issues/2881)) +* **deps:** bump docker/setup-buildx-action from 2.5.0 to 2.9.1 ([#2879](https://github.com/argoproj/argo-rollouts/issues/2879)) +* **deps:** bump docker/login-action from 2.1.0 to 2.2.0 ([#2877](https://github.com/argoproj/argo-rollouts/issues/2877)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 ([#2886](https://github.com/argoproj/argo-rollouts/issues/2886)) +* **deps:** bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 ([#2882](https://github.com/argoproj/argo-rollouts/issues/2882)) +* **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) +* **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) +* **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) +* **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) +* **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) +* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) +* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) +* **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) +* **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) +* **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) +* **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) +* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) +* **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) +* **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) +* **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) +* **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) +* **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) +* **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) +* **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 ([#2708](https://github.com/argoproj/argo-rollouts/issues/2708)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 ([#2710](https://github.com/argoproj/argo-rollouts/issues/2710)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 ([#2705](https://github.com/argoproj/argo-rollouts/issues/2705)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 ([#2704](https://github.com/argoproj/argo-rollouts/issues/2704)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 ([#2703](https://github.com/argoproj/argo-rollouts/issues/2703)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 ([#2702](https://github.com/argoproj/argo-rollouts/issues/2702)) +* **deps:** bump peter-evans/create-pull-request from 4 to 5 ([#2697](https://github.com/argoproj/argo-rollouts/issues/2697)) +* **deps:** bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#2698](https://github.com/argoproj/argo-rollouts/issues/2698)) +* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 ([#2684](https://github.com/argoproj/argo-rollouts/issues/2684)) + +### Ci + +* generate attestations during a release ([#2785](https://github.com/argoproj/argo-rollouts/issues/2785)) +* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) + +### Docs + +* mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) +* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) +* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) +* Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) +* Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) +* support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) +* Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) +* Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) +* use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) +* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) +* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) +* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) +* Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) +* Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) +* Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) +* Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) +* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) +* Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) +* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) +* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) +* **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) +* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) +* **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) + +### Feat + +* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) +* enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) +* support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) +* Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) +* Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) +* Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) +* add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) +* retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) +* **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) +* **controller:** Add custom metadata support for AnalysisRun. Fixes [#2740](https://github.com/argoproj/argo-rollouts/issues/2740) ([#2743](https://github.com/argoproj/argo-rollouts/issues/2743)) +* **dashboard:** Refresh Rollouts dashboard UI ([#2723](https://github.com/argoproj/argo-rollouts/issues/2723)) +* **metricprovider:** allow user to define metrics.provider.job.metadata ([#2762](https://github.com/argoproj/argo-rollouts/issues/2762)) + +### Fix + +* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) +* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) +* rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) +* get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) +* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) +* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) +* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) +* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) +* add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) +* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) +* **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) +* **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) +* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) +* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) +* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) +* **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) + +### Refactor + +* change plugin naming pattern [#2720](https://github.com/argoproj/argo-rollouts/issues/2720) ([#2722](https://github.com/argoproj/argo-rollouts/issues/2722)) + +### BREAKING CHANGE + + +The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. + +Remove name label from k8s some client metrics + +The `name` label in the `controller_clientset_k8s_request_total` metric +produce an excessive amount of cardinality for `events` and `replicasets`. +This can lead to hundreds of thousands of unique metrics over a couple +weeks in a large deployment. Set the name to "N/A" for these client request +types. + + + +## [v1.6.4](https://github.com/argoproj/argo-rollouts/compare/v1.6.3...v1.6.4) (2023-12-08) + +### Fix + +* make sure we use the updated rs when we write back to informer ([#3237](https://github.com/argoproj/argo-rollouts/issues/3237)) +* conflict on updates to replicaset revision ([#3216](https://github.com/argoproj/argo-rollouts/issues/3216)) + + ## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) @@ -9,6 +248,7 @@ * rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) + ## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) @@ -227,6 +467,21 @@ weeks in a large deployment. Set the name to "N/A" for these client request types. + +## [v1.6.5](https://github.com/argoproj/argo-rollouts/compare/v1.6.4...v1.6.5) (2024-01-25) + +### Chore + +* add logging context around replicaset updates ([#3326](https://github.com/argoproj/argo-rollouts/issues/3326)) +* remove year from codegen license ([#3282](https://github.com/argoproj/argo-rollouts/issues/3282)) + +### Fix + +* log rs name when update fails ([#3318](https://github.com/argoproj/argo-rollouts/issues/3318)) +* keep rs inormer updated upon updating labels and annotations ([#3321](https://github.com/argoproj/argo-rollouts/issues/3321)) +* updates to replicas and pod template at the same time causes rollout to get stuck ([#3272](https://github.com/argoproj/argo-rollouts/issues/3272)) + + ## [v1.6.4](https://github.com/argoproj/argo-rollouts/compare/v1.6.3...v1.6.4) (2023-12-08) From 8e465d9233913047b7d2f70dd79b49ed34375d9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:58:32 -0600 Subject: [PATCH 173/264] chore(deps): bump codecov/codecov-action from 3.1.4 to 3.1.5 (#3330) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.4...v3.1.5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d8ce7bf844..09397f3a4d 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v3.1.4 + uses: codecov/codecov-action@v3.1.5 with: file: coverage.out From 7e0b4e8d34da2b05513c8801e29477d5687fe6c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:07:58 -0600 Subject: [PATCH 174/264] chore(deps): bump github.com/evanphx/json-patch/v5 from 5.8.0 to 5.8.1 (#3312) Bumps [github.com/evanphx/json-patch/v5](https://github.com/evanphx/json-patch) from 5.8.0 to 5.8.1. - [Release notes](https://github.com/evanphx/json-patch/releases) - [Commits](https://github.com/evanphx/json-patch/compare/v5.8.0...v5.8.1) --- updated-dependencies: - dependency-name: github.com/evanphx/json-patch/v5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 80001b1f8c..b30fa0f276 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 - github.com/evanphx/json-patch/v5 v5.8.0 + github.com/evanphx/json-patch/v5 v5.8.1 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index 5b4b5431ad..0fccf745fe 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.8.1 h1:iPEdwg0XayoS+E7Mth9JxwUtOgyVxnDTXHtKhZPlZxA= +github.com/evanphx/json-patch/v5 v5.8.1/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= From 723f7a9b0eeec20897791aa3d9db937911e82eb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:08:23 -0600 Subject: [PATCH 175/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.5 to 1.26.6 (#3322) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.5 to 1.26.6. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.5...config/v1.26.6) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b30fa0f276..c981fb6455 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 - github.com/aws/aws-sdk-go-v2/config v1.26.5 + github.com/aws/aws-sdk-go-v2/config v1.26.6 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible @@ -81,7 +81,7 @@ require ( github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect diff --git a/go.sum b/go.sum index 0fccf745fe..d9627b2016 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.5 h1:lodGSevz7d+kkFJodfauThRxK9mdJbyutUxGq1NNhvw= -github.com/aws/aws-sdk-go-v2/config v1.26.5/go.mod h1:DxHrz6diQJOc9EwDslVRh84VjjrE17g+pVZXUeSxaDU= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= @@ -105,8 +105,8 @@ github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/G github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2 h1:GrSw8s0Gs/5zZ0SX+gX4zQjRnRsMJDJ2sLur1gRBhEM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.2/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 h1:vQfCIHSDouEvbE4EuDrlCGKcrtABEqF3cMt61nGEV4g= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 h1:ystNRv96lPnlDFU/K3O4/erHR+kPaiDbDGi/192uXQ4= From 5e5314bb1e14ae12aae9b0cc950e05a1ff372845 Mon Sep 17 00:00:00 2001 From: Aikawa Date: Sun, 28 Jan 2024 13:16:28 +0900 Subject: [PATCH 176/264] chore: change controller's deploy strategy to RollingUpdate due to leader election (#3334) chore: change deploy strategy due to controller's leader election Signed-off-by: yu-croco --- manifests/base/argo-rollouts-deployment.yaml | 2 +- manifests/install.yaml | 2 +- manifests/namespace-install.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifests/base/argo-rollouts-deployment.yaml b/manifests/base/argo-rollouts-deployment.yaml index 57da86e50f..57f4b516a0 100644 --- a/manifests/base/argo-rollouts-deployment.yaml +++ b/manifests/base/argo-rollouts-deployment.yaml @@ -47,4 +47,4 @@ spec: securityContext: runAsNonRoot: true strategy: - type: Recreate + type: RollingUpdate diff --git a/manifests/install.yaml b/manifests/install.yaml index c1829c0f80..72ea0796e9 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -15971,7 +15971,7 @@ spec: matchLabels: app.kubernetes.io/name: argo-rollouts strategy: - type: Recreate + type: RollingUpdate template: metadata: labels: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index f75037669c..97847970ee 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -377,7 +377,7 @@ spec: matchLabels: app.kubernetes.io/name: argo-rollouts strategy: - type: Recreate + type: RollingUpdate template: metadata: labels: From c492b06ea06e071a8c7123b2558123951307b509 Mon Sep 17 00:00:00 2001 From: kevinqian-db <151585552+kevinqian-db@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:37:10 -0800 Subject: [PATCH 177/264] feat(analysis): add ttlStrategy on AnalysisRun for garbage collecting stale AnalysisRun automatically (#3324) * Add ttlStrategy on AnalysisRun Signed-off-by: Kevin Qian * Unit test coverage Signed-off-by: Kevin Qian * Unit test 2 Signed-off-by: Kevin Qian * Regen go proto def Signed-off-by: Kevin Qian * Doc available from 1.6 -> 1.7 Signed-off-by: Kevin Qian * TtlStrategy -> TTLStrategy Signed-off-by: Kevin Qian --------- Signed-off-by: Kevin Qian --- analysis/analysis.go | 49 +- analysis/analysis_test.go | 416 +++++ analysis/controller_test.go | 23 +- docs/features/analysis.md | 18 + manifests/crds/analysis-run-crd.yaml | 15 + manifests/install.yaml | 15 + pkg/apiclient/rollout/rollout.swagger.json | 29 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 15 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1396 ++++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 19 + .../rollouts/v1alpha1/openapi_generated.go | 49 +- .../v1alpha1/zz_generated.deepcopy.go | 40 + ui/src/models/rollout/generated/api.ts | 37 + 13 files changed, 1579 insertions(+), 542 deletions(-) diff --git a/analysis/analysis.go b/analysis/analysis.go index fb307e62e0..97497c4c4d 100644 --- a/analysis/analysis.go +++ b/analysis/analysis.go @@ -9,6 +9,7 @@ import ( log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/pointer" @@ -40,10 +41,15 @@ type metricTask struct { } func (c *Controller) reconcileAnalysisRun(origRun *v1alpha1.AnalysisRun) *v1alpha1.AnalysisRun { + logger := logutil.WithAnalysisRun(origRun) if origRun.Status.Phase.Completed() { + err := c.maybeGarbageCollectAnalysisRun(origRun, logger) + if err != nil { + // TODO(jessesuen): surface errors to controller so they can be retried + logger.Warnf("Failed to garbage collect analysis run: %v", err) + } return origRun } - logger := logutil.WithAnalysisRun(origRun) run := origRun.DeepCopy() if run.Status.MetricResults == nil { @@ -108,6 +114,10 @@ func (c *Controller) reconcileAnalysisRun(origRun *v1alpha1.AnalysisRun) *v1alph run.Status.Message = newMessage if newStatus.Completed() { c.recordAnalysisRunCompletionEvent(run) + if run.Status.CompletedAt == nil { + now := timeutil.MetaNow() + run.Status.CompletedAt = &now + } } } @@ -752,3 +762,40 @@ func (c *Controller) garbageCollectMeasurements(run *v1alpha1.AnalysisRun, measu } return nil } + +func (c *Controller) maybeGarbageCollectAnalysisRun(run *v1alpha1.AnalysisRun, logger *log.Entry) error { + ctx := context.TODO() + if run.DeletionTimestamp != nil || !isAnalysisRunTtlExceeded(run) { + return nil + } + logger.Infof("Trying to cleanup TTL exceeded analysis run") + err := c.argoProjClientset.ArgoprojV1alpha1().AnalysisRuns(run.Namespace).Delete(ctx, run.Name, metav1.DeleteOptions{}) + if err != nil && !k8serrors.IsNotFound(err) { + return err + } + return nil +} + +func isAnalysisRunTtlExceeded(run *v1alpha1.AnalysisRun) bool { + // TTL only counted for completed runs with TTL strategy. + if !run.Status.Phase.Completed() || run.Spec.TTLStrategy == nil { + return false + } + // Cannot determine TTL if run has no completion time. + if run.Status.CompletedAt == nil { + return false + } + secondsCompleted := timeutil.MetaNow().Sub(run.Status.CompletedAt.Time).Seconds() + var ttlSeconds *int32 + if run.Status.Phase == v1alpha1.AnalysisPhaseSuccessful && run.Spec.TTLStrategy.SecondsAfterSuccess != nil { + ttlSeconds = run.Spec.TTLStrategy.SecondsAfterSuccess + } else if run.Status.Phase == v1alpha1.AnalysisPhaseFailed && run.Spec.TTLStrategy.SecondsAfterFailure != nil { + ttlSeconds = run.Spec.TTLStrategy.SecondsAfterFailure + } else if run.Spec.TTLStrategy.SecondsAfterCompletion != nil { + ttlSeconds = run.Spec.TTLStrategy.SecondsAfterCompletion + } + if ttlSeconds == nil { + return false + } + return int32(secondsCompleted) > *ttlSeconds +} diff --git a/analysis/analysis_test.go b/analysis/analysis_test.go index cec3446b89..9e7d3fe5f8 100644 --- a/analysis/analysis_test.go +++ b/analysis/analysis_test.go @@ -3,6 +3,7 @@ package analysis import ( "bytes" "context" + "errors" "fmt" "strings" "testing" @@ -14,12 +15,18 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" corev1 "k8s.io/api/core/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + k8sschema "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/util/uuid" + k8stesting "k8s.io/client-go/testing" "k8s.io/utils/pointer" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" + logutil "github.com/argoproj/argo-rollouts/utils/log" ) func timePtr(t metav1.Time) *metav1.Time { @@ -1985,3 +1992,412 @@ func TestInvalidMeasurementsRetentionConfigThrowsError(t *testing.T) { assert.Equal(t, v1alpha1.AnalysisPhaseError, newRun.Status.Phase) assert.Equal(t, "Analysis spec invalid: measurementRetention[0]: Rule didn't match any metric name(s)", newRun.Status.Message) } + +func TestExceededTtlChecked(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + testTTLStrategy := func( + t *testing.T, + ttlStrategy *v1alpha1.TTLStrategy, + expiredStatus *v1alpha1.AnalysisRunStatus, + notExpiredStatus *v1alpha1.AnalysisRunStatus) { + testId := string(uuid.NewUUID()) + ttlExpiredRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "expired-run" + testId, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: ttlStrategy, + }, + Status: *expiredStatus, + } + _ = c.reconcileAnalysisRun(ttlExpiredRun) + if notExpiredStatus != nil { + ttlNotExpiredRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "not-expired-run" + testId, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: ttlStrategy, + }, + Status: *notExpiredStatus, + } + _ = c.reconcileAnalysisRun(ttlNotExpiredRun) + } + + pi := f.expectDeleteAnalysisRunAction(ttlExpiredRun) + assert.Equal(t, fmt.Sprintf("%s/%s", metav1.NamespaceDefault, "expired-run"+testId), f.getDeletedAnalysisRunNamespaceAndName(pi)) + // Nothing else is deleted + assert.Equal(t, 1, len(filterInformerActions(f.client.Actions()))) + // Clear actions to avoid affecting other test instances. + f.client.ClearActions() + f.actions = nil + } + + ttlNotExpiredCompletedTime := f.now.Add(-86400 * time.Second) + ttlExpiredCompletedTime := ttlNotExpiredCompletedTime.Add(-1 * time.Second) + secondsOfOneDay := int32(86400) + + // Test completed TTL. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }) + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }) + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseError, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseError, + }) + // Test successful TTL. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterSuccess: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }) + // Test failed TTL. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterFailure: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }) + + // Test success TTL does not affect failed run. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterSuccess: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }) + // Test failed TTL does not affect successful run. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterFailure: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }) + // Test success TTL overrides completed TTL. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(100000), + SecondsAfterSuccess: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }) + // Test failed TTL overrides completed TTL. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(100000), + SecondsAfterFailure: &secondsOfOneDay, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }) + // Test completed TTL still evaluated when non-matching overrides exist. + testTTLStrategy(t, &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: &secondsOfOneDay, + SecondsAfterFailure: pointer.Int32Ptr(86401), + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, &v1alpha1.AnalysisRunStatus{ + CompletedAt: timePtr(metav1.NewTime(ttlNotExpiredCompletedTime)), + Phase: v1alpha1.AnalysisPhaseFailed, + }) +} + +func TestTtlNotGCInProgressAnalysisRun(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + expectedCount := intstr.FromInt(3) + origRun := &v1alpha1.AnalysisRun{ + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: []v1alpha1.Metric{ + { + Name: "metric1", + Interval: "60s", + Count: &expectedCount, + Provider: v1alpha1.MetricProvider{ + Job: &v1alpha1.JobMetric{}, + }, + }, + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseRunning, + StartedAt: timePtr(metav1.NewTime(time.Now())), + MetricResults: []v1alpha1.MetricResult{ + { + Name: "metric1", + Phase: v1alpha1.AnalysisPhaseRunning, + Count: 1, + Measurements: []v1alpha1.Measurement{{ + Value: "1", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }}, + }, + }, + }, + } + newRun := c.reconcileAnalysisRun(origRun) + assert.Equal(t, v1alpha1.AnalysisPhaseRunning, newRun.Status.Phase) + assert.Nil(t, newRun.Status.CompletedAt) + // Nothing else is deleted + assert.Equal(t, 0, len(filterInformerActions(f.client.Actions()))) +} + +func TestCompletedTimeFilled(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + expectedCount := intstr.FromInt(1) + origRun := &v1alpha1.AnalysisRun{ + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: []v1alpha1.Metric{ + { + Name: "metric1", + Interval: "60s", + Count: &expectedCount, + Provider: v1alpha1.MetricProvider{ + Job: &v1alpha1.JobMetric{}, + }, + }, + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseRunning, + StartedAt: timePtr(metav1.NewTime(time.Now())), + MetricResults: []v1alpha1.MetricResult{ + { + Name: "metric1", + Phase: v1alpha1.AnalysisPhaseSuccessful, + Count: 1, + Measurements: []v1alpha1.Measurement{{ + Value: "1", + Phase: v1alpha1.AnalysisPhaseSuccessful, + StartedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + FinishedAt: timePtr(metav1.NewTime(time.Now().Add(-60 * time.Second))), + }}, + }, + }, + }, + } + newRun := c.reconcileAnalysisRun(origRun) + assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, newRun.Status.Phase) + assert.NotNil(t, newRun.Status.CompletedAt) + assert.Equal(t, f.now, newRun.Status.CompletedAt.Time) +} + +func TestReconcileAnalysisRunOnRunNotFound(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + buf := bytes.NewBufferString("") + log.SetOutput(buf) + + // Prepend since there is a default reaction that captures it. + f.client.Fake.PrependReactor("delete", "analysisruns", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { + return true, nil, k8serrors.NewNotFound(k8sschema.GroupResource{Resource: "analysisruns"}, "test") + }) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(1), + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseSuccessful, + CompletedAt: timePtr(metav1.NewTime(f.now.Add(-2 * time.Second))), + }, + } + _ = c.reconcileAnalysisRun(origRun) + logMessage := buf.String() + assert.Contains(t, logMessage, "Trying to cleanup TTL exceeded analysis run") + assert.NotContains(t, logMessage, "Failed to garbage collect analysis run") + // One deletion issued. + assert.Len(t, f.client.Fake.Actions(), 1) + assert.Equal(t, "delete", f.client.Fake.Actions()[0].GetVerb()) + assert.Equal(t, "analysisruns", f.client.Fake.Actions()[0].GetResource().Resource) +} + +func TestReconcileAnalysisRunOnOtherRunErrors(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + buf := bytes.NewBufferString("") + log.SetOutput(buf) + + // Prepend since there is a default reaction that captures it. + f.client.Fake.PrependReactor("delete", "analysisruns", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { + return true, nil, errors.New("some error") + }) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(1), + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseSuccessful, + CompletedAt: timePtr(metav1.NewTime(f.now.Add(-2 * time.Second))), + }, + } + _ = c.reconcileAnalysisRun(origRun) + logMessage := buf.String() + assert.Contains(t, logMessage, "Failed to garbage collect analysis run") + // One deletion issued. + assert.Len(t, f.client.Fake.Actions(), 1) + assert.Equal(t, "delete", f.client.Fake.Actions()[0].GetVerb()) + assert.Equal(t, "analysisruns", f.client.Fake.Actions()[0].GetResource().Resource) +} + +func TestMaybeGarbageCollectAnalysisRunNoGCIfNotCompleted(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseRunning, + }, + } + logger := logutil.WithAnalysisRun(origRun) + err := c.maybeGarbageCollectAnalysisRun(origRun, logger) + // No error, no deletion issued. + assert.NoError(t, err) + assert.Empty(t, f.client.Fake.Actions()) +} + +func TestMaybeGarbageCollectAnalysisRunNoGCIfNoTTLStrategy(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, + } + logger := logutil.WithAnalysisRun(origRun) + err := c.maybeGarbageCollectAnalysisRun(origRun, logger) + // No error, no deletion issued. + assert.NoError(t, err) + assert.Empty(t, f.client.Fake.Actions()) +} + +func TestMaybeGarbageCollectAnalysisRunNoGCIfWithDeletionTimestamp(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + DeletionTimestamp: timePtr(metav1.NewTime(f.now)), + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(1), + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseSuccessful, + CompletedAt: timePtr(metav1.NewTime(f.now.Add(-2 * time.Second))), + }, + } + logger := logutil.WithAnalysisRun(origRun) + err := c.maybeGarbageCollectAnalysisRun(origRun, logger) + // No error, no deletion issued. + assert.NoError(t, err) + assert.Empty(t, f.client.Fake.Actions()) +} + +func TestMaybeGarbageCollectAnalysisRunNoGCIfNoCompletedAt(t *testing.T) { + f := newFixture(t) + defer f.Close() + c, _, _ := f.newController(noResyncPeriodFunc) + + origRun := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run" + string(uuid.NewUUID()), + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisRunSpec{ + TTLStrategy: &v1alpha1.TTLStrategy{ + SecondsAfterCompletion: pointer.Int32Ptr(1), + }, + }, + Status: v1alpha1.AnalysisRunStatus{ + Phase: v1alpha1.AnalysisPhaseSuccessful, + }, + } + logger := logutil.WithAnalysisRun(origRun) + err := c.maybeGarbageCollectAnalysisRun(origRun, logger) + // No error, no deletion issued. + assert.NoError(t, err) + assert.Empty(t, f.client.Fake.Actions()) +} diff --git a/analysis/controller_test.go b/analysis/controller_test.go index 032f5cf74d..8282f09c2a 100644 --- a/analysis/controller_test.go +++ b/analysis/controller_test.go @@ -55,6 +55,9 @@ type fixture struct { unfreezeTime func() error // fake provider provider *mocks.Provider + + // Reference to frozen now + now time.Time } func newFixture(t *testing.T) *fixture { @@ -62,9 +65,9 @@ func newFixture(t *testing.T) *fixture { f.t = t f.objects = []runtime.Object{} f.enqueuedObjects = make(map[string]int) - now := time.Now() + f.now = time.Now() timeutil.Now = func() time.Time { - return now + return f.now } f.unfreezeTime = func() error { timeutil.Now = time.Now @@ -286,6 +289,22 @@ func (f *fixture) getPatchedAnalysisRun(index int) v1alpha1.AnalysisRun { //noli return ar } +func (f *fixture) expectDeleteAnalysisRunAction(analysisRun *v1alpha1.AnalysisRun) int { //nolint:unused + action := core.NewDeleteAction(schema.GroupVersionResource{Resource: "analysisrun"}, analysisRun.Namespace, analysisRun.Name) + len := len(f.actions) + f.actions = append(f.actions, action) + return len +} + +func (f *fixture) getDeletedAnalysisRunNamespaceAndName(index int) string { //nolint:unused + action := filterInformerActions(f.client.Actions())[index] + deleteAction, ok := action.(core.DeleteAction) + if !ok { + f.t.Fatalf("Expected Patch action, not %s", action.GetVerb()) + } + return fmt.Sprintf("%s/%s", deleteAction.GetNamespace(), deleteAction.GetName()) +} + func TestNoReconcileForNotFoundAnalysisRun(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/docs/features/analysis.md b/docs/features/analysis.md index a5fd6964d1..d300f0cbb0 100644 --- a/docs/features/analysis.md +++ b/docs/features/analysis.md @@ -854,6 +854,24 @@ spec: limit: 20 ``` +## Time-to-live (TTL) Strategy + +!!! important + Available since v1.7 + +`ttlStrategy` limits the lifetime of an analysis run that has finished execution depending on if it Succeeded or Failed. If this struct is set, once the run finishes, it will be deleted after the time to live expires. If this field is unset, the analysis controller will keep the completed runs, unless they are associated with rollouts using other garbage collection policies (e.g. `successfulRunHistoryLimit` and `unsuccessfulRunHistoryLimit`). + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: AnalysisRun +spec: + ... + ttlStrategy: + secondsAfterCompletion: 3600 + secondsAfterSuccess: 1800 + secondsAfterFailure: 1800 +``` + ## Inconclusive Runs Analysis runs can also be considered `Inconclusive`, which indicates the run was neither successful, diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 18af57ec8c..4885ee8360 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -3014,11 +3014,26 @@ spec: type: array terminate: type: boolean + ttlStrategy: + properties: + secondsAfterCompletion: + format: int32 + type: integer + secondsAfterFailure: + format: int32 + type: integer + secondsAfterSuccess: + format: int32 + type: integer + type: object required: - metrics type: object status: properties: + completedAt: + format: date-time + type: string dryRunSummary: properties: count: diff --git a/manifests/install.yaml b/manifests/install.yaml index 72ea0796e9..082042a0ca 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -3015,11 +3015,26 @@ spec: type: array terminate: type: boolean + ttlStrategy: + properties: + secondsAfterCompletion: + format: int32 + type: integer + secondsAfterFailure: + format: int32 + type: integer + secondsAfterSuccess: + format: int32 + type: integer + type: object required: - metrics type: object status: properties: + completedAt: + format: date-time + type: string dryRunSummary: properties: count: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 092d8798a7..b491f9d614 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -632,6 +632,10 @@ "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.MeasurementRetention" }, "title": "MeasurementRetention object contains the settings for retaining the number of measurements during the analysis\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + }, + "ttlStrategy": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TTLStrategy", + "title": "TTLStrategy object contains the strategy for the time to live depending on if the analysis succeeded or failed\n+optional" } }, "title": "AnalysisRunSpec is the spec for a AnalysisRun resource" @@ -665,6 +669,10 @@ "dryRunSummary": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RunSummary", "title": "DryRunSummary contains the final results from the metric executions in the dry-run mode" + }, + "completedAt": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.Time", + "title": "CompletedAt indicates when the analysisRun completed" } }, "title": "AnalysisRunStatus is the status for a AnalysisRun resource" @@ -2534,6 +2542,27 @@ }, "description": "TLSRoute holds the information on the virtual service's TLS/HTTPS routes that are desired to be matched for changing weights." }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TTLStrategy": { + "type": "object", + "properties": { + "secondsAfterCompletion": { + "type": "integer", + "format": "int32", + "description": "SecondsAfterCompletion is the number of seconds to live after completion." + }, + "secondsAfterFailure": { + "type": "integer", + "format": "int32", + "description": "SecondsAfterFailure is the number of seconds to live after failure." + }, + "secondsAfterSuccess": { + "type": "integer", + "format": "int32", + "description": "SecondsAfterSuccess is the number of seconds to live after success." + } + }, + "title": "TTLStrategy defines the strategy for the time to live depending on if the analysis succeeded or failed" + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TemplateService": { "type": "object", "properties": { diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 3fe7664680..f7acbdc6cf 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -134,6 +134,16 @@ type MeasurementRetention struct { Limit int32 `json:"limit" protobuf:"varint,2,opt,name=limit"` } +// TTLStrategy defines the strategy for the time to live depending on if the analysis succeeded or failed +type TTLStrategy struct { + // SecondsAfterCompletion is the number of seconds to live after completion. + SecondsAfterCompletion *int32 `json:"secondsAfterCompletion,omitempty" protobuf:"varint,1,opt,name=secondsAfterCompletion"` + // SecondsAfterFailure is the number of seconds to live after failure. + SecondsAfterFailure *int32 `json:"secondsAfterFailure,omitempty" protobuf:"varint,2,opt,name=secondsAfterFailure"` + // SecondsAfterSuccess is the number of seconds to live after success. + SecondsAfterSuccess *int32 `json:"secondsAfterSuccess,omitempty" protobuf:"varint,3,opt,name=secondsAfterSuccess"` +} + // EffectiveCount is the effective count based on whether or not count/interval is specified // If neither count or interval is specified, the effective count is 1 // If only interval is specified, metric runs indefinitely and there is no effective count (nil) @@ -378,6 +388,9 @@ type AnalysisRunSpec struct { // +patchStrategy=merge // +optional MeasurementRetention []MeasurementRetention `json:"measurementRetention,omitempty" patchStrategy:"merge" patchMergeKey:"metricName" protobuf:"bytes,5,rep,name=measurementRetention"` + // TTLStrategy object contains the strategy for the time to live depending on if the analysis succeeded or failed + // +optional + TTLStrategy *TTLStrategy `json:"ttlStrategy,omitempty" protobuf:"bytes,6,opt,name=ttlStrategy"` } // Argument is an argument to an AnalysisRun @@ -423,6 +436,8 @@ type AnalysisRunStatus struct { RunSummary RunSummary `json:"runSummary,omitempty" protobuf:"bytes,5,opt,name=runSummary"` // DryRunSummary contains the final results from the metric executions in the dry-run mode DryRunSummary *RunSummary `json:"dryRunSummary,omitempty" protobuf:"bytes,6,opt,name=dryRunSummary"` + // CompletedAt indicates when the analysisRun completed + CompletedAt *metav1.Time `json:"completedAt,omitempty" protobuf:"bytes,7,opt,name=completedAt"` } // RunSummary contains the final results from the metric executions diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 12f65842ce..d4abc7d428 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -2909,10 +2909,38 @@ func (m *TLSRoute) XXX_DiscardUnknown() { var xxx_messageInfo_TLSRoute proto.InternalMessageInfo +func (m *TTLStrategy) Reset() { *m = TTLStrategy{} } +func (*TTLStrategy) ProtoMessage() {} +func (*TTLStrategy) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{102} +} +func (m *TTLStrategy) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TTLStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *TTLStrategy) XXX_Merge(src proto.Message) { + xxx_messageInfo_TTLStrategy.Merge(m, src) +} +func (m *TTLStrategy) XXX_Size() int { + return m.Size() +} +func (m *TTLStrategy) XXX_DiscardUnknown() { + xxx_messageInfo_TTLStrategy.DiscardUnknown(m) +} + +var xxx_messageInfo_TTLStrategy proto.InternalMessageInfo + func (m *TemplateService) Reset() { *m = TemplateService{} } func (*TemplateService) ProtoMessage() {} func (*TemplateService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{102} + return fileDescriptor_e0e705f843545fab, []int{103} } func (m *TemplateService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2940,7 +2968,7 @@ var xxx_messageInfo_TemplateService proto.InternalMessageInfo func (m *TemplateSpec) Reset() { *m = TemplateSpec{} } func (*TemplateSpec) ProtoMessage() {} func (*TemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{103} + return fileDescriptor_e0e705f843545fab, []int{104} } func (m *TemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2968,7 +2996,7 @@ var xxx_messageInfo_TemplateSpec proto.InternalMessageInfo func (m *TemplateStatus) Reset() { *m = TemplateStatus{} } func (*TemplateStatus) ProtoMessage() {} func (*TemplateStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{104} + return fileDescriptor_e0e705f843545fab, []int{105} } func (m *TemplateStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2996,7 +3024,7 @@ var xxx_messageInfo_TemplateStatus proto.InternalMessageInfo func (m *TraefikTrafficRouting) Reset() { *m = TraefikTrafficRouting{} } func (*TraefikTrafficRouting) ProtoMessage() {} func (*TraefikTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{105} + return fileDescriptor_e0e705f843545fab, []int{106} } func (m *TraefikTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3024,7 +3052,7 @@ var xxx_messageInfo_TraefikTrafficRouting proto.InternalMessageInfo func (m *TrafficWeights) Reset() { *m = TrafficWeights{} } func (*TrafficWeights) ProtoMessage() {} func (*TrafficWeights) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{106} + return fileDescriptor_e0e705f843545fab, []int{107} } func (m *TrafficWeights) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3052,7 +3080,7 @@ var xxx_messageInfo_TrafficWeights proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{107} + return fileDescriptor_e0e705f843545fab, []int{108} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3080,7 +3108,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *WavefrontMetric) Reset() { *m = WavefrontMetric{} } func (*WavefrontMetric) ProtoMessage() {} func (*WavefrontMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{108} + return fileDescriptor_e0e705f843545fab, []int{109} } func (m *WavefrontMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3108,7 +3136,7 @@ var xxx_messageInfo_WavefrontMetric proto.InternalMessageInfo func (m *WebMetric) Reset() { *m = WebMetric{} } func (*WebMetric) ProtoMessage() {} func (*WebMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{109} + return fileDescriptor_e0e705f843545fab, []int{110} } func (m *WebMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3136,7 +3164,7 @@ var xxx_messageInfo_WebMetric proto.InternalMessageInfo func (m *WebMetricHeader) Reset() { *m = WebMetricHeader{} } func (*WebMetricHeader) ProtoMessage() {} func (*WebMetricHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{110} + return fileDescriptor_e0e705f843545fab, []int{111} } func (m *WebMetricHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3164,7 +3192,7 @@ var xxx_messageInfo_WebMetricHeader proto.InternalMessageInfo func (m *WeightDestination) Reset() { *m = WeightDestination{} } func (*WeightDestination) ProtoMessage() {} func (*WeightDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{111} + return fileDescriptor_e0e705f843545fab, []int{112} } func (m *WeightDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3303,6 +3331,7 @@ func init() { proto.RegisterType((*StringMatch)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.StringMatch") proto.RegisterType((*TCPRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TCPRoute") proto.RegisterType((*TLSRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TLSRoute") + proto.RegisterType((*TTLStrategy)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TTLStrategy") proto.RegisterType((*TemplateService)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TemplateService") proto.RegisterType((*TemplateSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TemplateSpec") proto.RegisterType((*TemplateStatus)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.TemplateStatus") @@ -3320,534 +3349,541 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8419 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x5c, 0xd9, - 0x75, 0xd8, 0x3e, 0x0e, 0x3f, 0x66, 0x0e, 0x29, 0x92, 0xba, 0x92, 0x2c, 0x2e, 0x77, 0xa5, 0x91, - 0xdf, 0xa6, 0x5b, 0x6d, 0xbc, 0x26, 0x6d, 0xed, 0x6e, 0xbb, 0xf6, 0xba, 0xdb, 0xce, 0x90, 0xd2, - 0x8a, 0x5a, 0x52, 0xa2, 0xce, 0x50, 0xab, 0xc4, 0xf6, 0x26, 0x7e, 0x9c, 0xb9, 0x1c, 0x3e, 0x71, - 0xe6, 0xbd, 0xf1, 0x7b, 0x6f, 0x28, 0x71, 0xbd, 0x88, 0xd7, 0x31, 0xd6, 0x75, 0x03, 0x1b, 0x71, - 0x9b, 0x18, 0x45, 0xd1, 0xa2, 0x70, 0x83, 0x00, 0x69, 0x9b, 0xfc, 0x32, 0x52, 0xf4, 0x4f, 0x80, - 0x1a, 0x4d, 0x93, 0xb8, 0x40, 0x53, 0x38, 0x3f, 0x5a, 0x27, 0x05, 0xc2, 0xd4, 0x4c, 0xff, 0xb4, - 0x68, 0x61, 0xb4, 0x70, 0x51, 0x44, 0x3f, 0x8a, 0xe2, 0x7e, 0xbe, 0xfb, 0xde, 0xbc, 0xa1, 0x66, - 0x34, 0x8f, 0xf2, 0xb6, 0xf5, 0xbf, 0x99, 0x7b, 0xce, 0x3d, 0xe7, 0xbc, 0xfb, 0x79, 0xee, 0xb9, - 0xe7, 0x9c, 0x0b, 0xeb, 0x4d, 0x37, 0xda, 0xed, 0x6e, 0x2f, 0xd5, 0xfd, 0xf6, 0xb2, 0x13, 0x34, - 0xfd, 0x4e, 0xe0, 0xdf, 0xe3, 0x3f, 0x3e, 0x1a, 0xf8, 0xad, 0x96, 0xdf, 0x8d, 0xc2, 0xe5, 0xce, - 0x5e, 0x73, 0xd9, 0xe9, 0xb8, 0xe1, 0xb2, 0x2e, 0xd9, 0xff, 0xb8, 0xd3, 0xea, 0xec, 0x3a, 0x1f, - 0x5f, 0x6e, 0x52, 0x8f, 0x06, 0x4e, 0x44, 0x1b, 0x4b, 0x9d, 0xc0, 0x8f, 0x7c, 0xf2, 0xa9, 0x98, - 0xda, 0x92, 0xa2, 0xc6, 0x7f, 0xfc, 0xbc, 0xaa, 0xbb, 0xd4, 0xd9, 0x6b, 0x2e, 0x31, 0x6a, 0x4b, - 0xba, 0x44, 0x51, 0x5b, 0xfc, 0xa8, 0x21, 0x4b, 0xd3, 0x6f, 0xfa, 0xcb, 0x9c, 0xe8, 0x76, 0x77, - 0x87, 0xff, 0xe3, 0x7f, 0xf8, 0x2f, 0xc1, 0x6c, 0xf1, 0xb9, 0xbd, 0x57, 0xc3, 0x25, 0xd7, 0x67, - 0xb2, 0x2d, 0x6f, 0x3b, 0x51, 0x7d, 0x77, 0x79, 0xbf, 0x47, 0xa2, 0x45, 0xdb, 0x40, 0xaa, 0xfb, - 0x01, 0xcd, 0xc2, 0x79, 0x39, 0xc6, 0x69, 0x3b, 0xf5, 0x5d, 0xd7, 0xa3, 0xc1, 0x41, 0xfc, 0xd5, - 0x6d, 0x1a, 0x39, 0x59, 0xb5, 0x96, 0xfb, 0xd5, 0x0a, 0xba, 0x5e, 0xe4, 0xb6, 0x69, 0x4f, 0x85, - 0xbf, 0xf2, 0xa8, 0x0a, 0x61, 0x7d, 0x97, 0xb6, 0x9d, 0x9e, 0x7a, 0x2f, 0xf5, 0xab, 0xd7, 0x8d, - 0xdc, 0xd6, 0xb2, 0xeb, 0x45, 0x61, 0x14, 0xa4, 0x2b, 0xd9, 0x3f, 0x2c, 0x40, 0xa9, 0xb2, 0x5e, - 0xad, 0x45, 0x4e, 0xd4, 0x0d, 0xc9, 0x57, 0x2c, 0x98, 0x69, 0xf9, 0x4e, 0xa3, 0xea, 0xb4, 0x1c, - 0xaf, 0x4e, 0x83, 0x05, 0xeb, 0x92, 0x75, 0x79, 0xfa, 0xca, 0xfa, 0xd2, 0x28, 0xfd, 0xb5, 0x54, - 0xb9, 0x1f, 0x22, 0x0d, 0xfd, 0x6e, 0x50, 0xa7, 0x48, 0x77, 0xaa, 0x67, 0xbf, 0x7b, 0x58, 0x7e, - 0xea, 0xe8, 0xb0, 0x3c, 0xb3, 0x6e, 0x70, 0xc2, 0x04, 0x5f, 0xf2, 0x4d, 0x0b, 0x4e, 0xd7, 0x1d, - 0xcf, 0x09, 0x0e, 0xb6, 0x9c, 0xa0, 0x49, 0xa3, 0x37, 0x02, 0xbf, 0xdb, 0x59, 0x18, 0x3b, 0x01, - 0x69, 0x9e, 0x96, 0xd2, 0x9c, 0x5e, 0x49, 0xb3, 0xc3, 0x5e, 0x09, 0xb8, 0x5c, 0x61, 0xe4, 0x6c, - 0xb7, 0xa8, 0x29, 0x57, 0xe1, 0x24, 0xe5, 0xaa, 0xa5, 0xd9, 0x61, 0xaf, 0x04, 0xe4, 0x05, 0x98, - 0x72, 0xbd, 0x66, 0x40, 0xc3, 0x70, 0x61, 0xfc, 0x92, 0x75, 0xb9, 0x54, 0x9d, 0x93, 0xd5, 0xa7, - 0xd6, 0x44, 0x31, 0x2a, 0xb8, 0xfd, 0xed, 0x02, 0x9c, 0xae, 0xac, 0x57, 0xb7, 0x02, 0x67, 0x67, - 0xc7, 0xad, 0xa3, 0xdf, 0x8d, 0x5c, 0xaf, 0x69, 0x12, 0xb0, 0x8e, 0x27, 0x40, 0x5e, 0x81, 0xe9, - 0x90, 0x06, 0xfb, 0x6e, 0x9d, 0x6e, 0xfa, 0x41, 0xc4, 0x3b, 0x65, 0xa2, 0x7a, 0x46, 0xa2, 0x4f, - 0xd7, 0x62, 0x10, 0x9a, 0x78, 0xac, 0x5a, 0xe0, 0xfb, 0x91, 0x84, 0xf3, 0x36, 0x2b, 0xc5, 0xd5, - 0x30, 0x06, 0xa1, 0x89, 0x47, 0x56, 0x61, 0xde, 0xf1, 0x3c, 0x3f, 0x72, 0x22, 0xd7, 0xf7, 0x36, - 0x03, 0xba, 0xe3, 0x3e, 0x90, 0x9f, 0xb8, 0x20, 0xeb, 0xce, 0x57, 0x52, 0x70, 0xec, 0xa9, 0x41, - 0xbe, 0x61, 0xc1, 0x7c, 0x18, 0xb9, 0xf5, 0x3d, 0xd7, 0xa3, 0x61, 0xb8, 0xe2, 0x7b, 0x3b, 0x6e, - 0x73, 0x61, 0x82, 0x77, 0xdb, 0xcd, 0xd1, 0xba, 0xad, 0x96, 0xa2, 0x5a, 0x3d, 0xcb, 0x44, 0x4a, - 0x97, 0x62, 0x0f, 0x77, 0xf2, 0x11, 0x28, 0xc9, 0x16, 0xa5, 0xe1, 0xc2, 0xe4, 0xa5, 0xc2, 0xe5, - 0x52, 0xf5, 0xd4, 0xd1, 0x61, 0xb9, 0xb4, 0xa6, 0x0a, 0x31, 0x86, 0xdb, 0xab, 0xb0, 0x50, 0x69, - 0x6f, 0x3b, 0x61, 0xe8, 0x34, 0xfc, 0x20, 0xd5, 0x75, 0x97, 0xa1, 0xd8, 0x76, 0x3a, 0x1d, 0xd7, - 0x6b, 0xb2, 0xbe, 0x63, 0x74, 0x66, 0x8e, 0x0e, 0xcb, 0xc5, 0x0d, 0x59, 0x86, 0x1a, 0x6a, 0xff, - 0xc9, 0x18, 0x4c, 0x57, 0x3c, 0xa7, 0x75, 0x10, 0xba, 0x21, 0x76, 0x3d, 0xf2, 0x39, 0x28, 0xb2, - 0x55, 0xab, 0xe1, 0x44, 0x8e, 0x9c, 0xe9, 0x1f, 0x5b, 0x12, 0x8b, 0xc8, 0x92, 0xb9, 0x88, 0xc4, - 0x9f, 0xcf, 0xb0, 0x97, 0xf6, 0x3f, 0xbe, 0x74, 0x6b, 0xfb, 0x1e, 0xad, 0x47, 0x1b, 0x34, 0x72, - 0xaa, 0x44, 0xf6, 0x02, 0xc4, 0x65, 0xa8, 0xa9, 0x12, 0x1f, 0xc6, 0xc3, 0x0e, 0xad, 0xcb, 0x99, - 0xbb, 0x31, 0xe2, 0x0c, 0x89, 0x45, 0xaf, 0x75, 0x68, 0xbd, 0x3a, 0x23, 0x59, 0x8f, 0xb3, 0x7f, - 0xc8, 0x19, 0x91, 0xfb, 0x30, 0x19, 0xf2, 0xb5, 0x4c, 0x4e, 0xca, 0x5b, 0xf9, 0xb1, 0xe4, 0x64, - 0xab, 0xb3, 0x92, 0xe9, 0xa4, 0xf8, 0x8f, 0x92, 0x9d, 0xfd, 0x1f, 0x2c, 0x38, 0x63, 0x60, 0x57, - 0x82, 0x66, 0xb7, 0x4d, 0xbd, 0x88, 0x5c, 0x82, 0x71, 0xcf, 0x69, 0x53, 0x39, 0xab, 0xb4, 0xc8, - 0x37, 0x9d, 0x36, 0x45, 0x0e, 0x21, 0xcf, 0xc1, 0xc4, 0xbe, 0xd3, 0xea, 0x52, 0xde, 0x48, 0xa5, - 0xea, 0x29, 0x89, 0x32, 0xf1, 0x16, 0x2b, 0x44, 0x01, 0x23, 0xef, 0x42, 0x89, 0xff, 0xb8, 0x16, - 0xf8, 0xed, 0x9c, 0x3e, 0x4d, 0x4a, 0xf8, 0x96, 0x22, 0x2b, 0x86, 0x9f, 0xfe, 0x8b, 0x31, 0x43, - 0xfb, 0xcf, 0x2c, 0x98, 0x33, 0x3e, 0x6e, 0xdd, 0x0d, 0x23, 0xf2, 0xd9, 0x9e, 0xc1, 0xb3, 0x34, - 0xd8, 0xe0, 0x61, 0xb5, 0xf9, 0xd0, 0x99, 0x97, 0x5f, 0x5a, 0x54, 0x25, 0xc6, 0xc0, 0xf1, 0x60, - 0xc2, 0x8d, 0x68, 0x3b, 0x5c, 0x18, 0xbb, 0x54, 0xb8, 0x3c, 0x7d, 0x65, 0x2d, 0xb7, 0x6e, 0x8c, - 0xdb, 0x77, 0x8d, 0xd1, 0x47, 0xc1, 0xc6, 0xfe, 0xed, 0x42, 0xa2, 0xfb, 0x36, 0x94, 0x1c, 0xef, - 0x5b, 0x30, 0xd9, 0x72, 0xb6, 0x69, 0x4b, 0xcc, 0xad, 0xe9, 0x2b, 0x6f, 0xe7, 0x26, 0x89, 0xe2, - 0xb1, 0xb4, 0xce, 0xe9, 0x5f, 0xf5, 0xa2, 0xe0, 0x20, 0x1e, 0x5e, 0xa2, 0x10, 0x25, 0x73, 0xf2, - 0xf7, 0x2c, 0x98, 0x8e, 0x57, 0x35, 0xd5, 0x2c, 0xdb, 0xf9, 0x0b, 0x13, 0x2f, 0xa6, 0x52, 0x22, - 0xbd, 0x44, 0x1b, 0x10, 0x34, 0x65, 0x59, 0xfc, 0x04, 0x4c, 0x1b, 0x9f, 0x40, 0xe6, 0xa1, 0xb0, - 0x47, 0x0f, 0xc4, 0x80, 0x47, 0xf6, 0x93, 0x9c, 0x4d, 0x8c, 0x70, 0x39, 0xa4, 0x3f, 0x39, 0xf6, - 0xaa, 0xb5, 0xf8, 0x3a, 0xcc, 0xa7, 0x19, 0x0e, 0x53, 0xdf, 0xfe, 0xf6, 0x78, 0x62, 0x60, 0xb2, - 0x85, 0x80, 0xf8, 0x30, 0xd5, 0xa6, 0x51, 0xe0, 0xd6, 0x55, 0x97, 0xad, 0x8e, 0xd6, 0x4a, 0x1b, - 0x9c, 0x58, 0xbc, 0x21, 0x8a, 0xff, 0x21, 0x2a, 0x2e, 0x64, 0x17, 0xc6, 0x9d, 0xa0, 0xa9, 0xfa, - 0xe4, 0x5a, 0x3e, 0xd3, 0x32, 0x5e, 0x2a, 0x2a, 0x41, 0x33, 0x44, 0xce, 0x81, 0x2c, 0x43, 0x29, - 0xa2, 0x41, 0xdb, 0xf5, 0x9c, 0x48, 0xec, 0xa0, 0xc5, 0xea, 0x69, 0x89, 0x56, 0xda, 0x52, 0x00, - 0x8c, 0x71, 0x48, 0x0b, 0x26, 0x1b, 0xc1, 0x01, 0x76, 0xbd, 0x85, 0xf1, 0x3c, 0x9a, 0x62, 0x95, - 0xd3, 0x8a, 0x07, 0xa9, 0xf8, 0x8f, 0x92, 0x07, 0xf9, 0x75, 0x0b, 0xce, 0xb6, 0xa9, 0x13, 0x76, - 0x03, 0xca, 0x3e, 0x01, 0x69, 0x44, 0x3d, 0xd6, 0xb1, 0x0b, 0x13, 0x9c, 0x39, 0x8e, 0xda, 0x0f, - 0xbd, 0x94, 0xab, 0xcf, 0x4a, 0x51, 0xce, 0x66, 0x41, 0x31, 0x53, 0x1a, 0xfb, 0x4f, 0xc6, 0xe1, - 0x74, 0xcf, 0xc2, 0x4e, 0x5e, 0x86, 0x89, 0xce, 0xae, 0x13, 0xaa, 0x95, 0xfa, 0xa2, 0x5a, 0x26, - 0x36, 0x59, 0xe1, 0xc3, 0xc3, 0xf2, 0x29, 0x55, 0x85, 0x17, 0xa0, 0x40, 0x66, 0x7a, 0x53, 0x9b, - 0x86, 0xa1, 0xd3, 0x54, 0xcb, 0xb7, 0x31, 0x4c, 0x78, 0x31, 0x2a, 0x38, 0xf9, 0x9b, 0x16, 0x9c, - 0x12, 0x43, 0x06, 0x69, 0xd8, 0x6d, 0x45, 0x6c, 0x8b, 0x62, 0xcd, 0x72, 0x23, 0x8f, 0xe1, 0x29, - 0x48, 0x56, 0xcf, 0x49, 0xee, 0xa7, 0xcc, 0xd2, 0x10, 0x93, 0x7c, 0xc9, 0x5d, 0x28, 0x85, 0x91, - 0x13, 0x44, 0xb4, 0x51, 0x89, 0xb8, 0x32, 0x35, 0x7d, 0xe5, 0xa7, 0x07, 0x5b, 0xbb, 0xb7, 0xdc, - 0x36, 0x15, 0xfb, 0x44, 0x4d, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x17, 0x20, 0xe8, 0x7a, 0xb5, 0x6e, - 0xbb, 0xed, 0x04, 0x07, 0x52, 0xbf, 0xba, 0x3e, 0xda, 0xe7, 0xa1, 0xa6, 0x17, 0xab, 0x1a, 0x71, - 0x19, 0x1a, 0xfc, 0xc8, 0x97, 0x2c, 0x38, 0x25, 0x46, 0xa2, 0x92, 0x60, 0x32, 0x67, 0x09, 0x4e, - 0xb3, 0xa6, 0x5d, 0x35, 0x59, 0x60, 0x92, 0xa3, 0xfd, 0xef, 0x92, 0x6a, 0x40, 0x2d, 0x62, 0x87, - 0xad, 0xe6, 0x01, 0xf9, 0x0c, 0x3c, 0x1d, 0x76, 0xeb, 0x75, 0x1a, 0x86, 0x3b, 0xdd, 0x16, 0x76, - 0xbd, 0xeb, 0x6e, 0x18, 0xf9, 0xc1, 0xc1, 0xba, 0xdb, 0x76, 0x23, 0x3e, 0xe2, 0x26, 0xaa, 0x17, - 0x8e, 0x0e, 0xcb, 0x4f, 0xd7, 0xfa, 0x21, 0x61, 0xff, 0xfa, 0xc4, 0x81, 0x67, 0xba, 0x5e, 0x7f, - 0xf2, 0x42, 0x43, 0x2f, 0x1f, 0x1d, 0x96, 0x9f, 0xb9, 0xd3, 0x1f, 0x0d, 0x8f, 0xa3, 0x61, 0xff, - 0x17, 0x8b, 0xad, 0xd4, 0xe2, 0xbb, 0xb6, 0x68, 0xbb, 0xd3, 0x62, 0xab, 0xcb, 0xc9, 0xeb, 0x8f, - 0x51, 0x42, 0x7f, 0xc4, 0x7c, 0xb6, 0x3b, 0x25, 0x7f, 0x3f, 0x25, 0xd2, 0xfe, 0xcf, 0x16, 0x9c, - 0x4d, 0x23, 0x3f, 0x01, 0x9d, 0x27, 0x4c, 0xea, 0x3c, 0x37, 0xf3, 0xfd, 0xda, 0x3e, 0x8a, 0xcf, - 0x57, 0xc6, 0x7b, 0xbf, 0xf5, 0xff, 0xf5, 0x6d, 0x34, 0xde, 0x15, 0x0b, 0x3f, 0xce, 0x5d, 0x71, - 0xfc, 0x03, 0xb5, 0x2b, 0xfe, 0xe3, 0x71, 0x98, 0xa9, 0x78, 0x91, 0x5b, 0xd9, 0xd9, 0x71, 0x3d, - 0x37, 0x3a, 0x20, 0x5f, 0x1b, 0x83, 0xe5, 0x4e, 0x40, 0x77, 0x68, 0x10, 0xd0, 0xc6, 0x6a, 0x37, - 0x70, 0xbd, 0x66, 0xad, 0xbe, 0x4b, 0x1b, 0xdd, 0x96, 0xeb, 0x35, 0xd7, 0x9a, 0x9e, 0xaf, 0x8b, - 0xaf, 0x3e, 0xa0, 0xf5, 0x2e, 0xff, 0x24, 0x31, 0x29, 0xda, 0xa3, 0x7d, 0xd2, 0xe6, 0x70, 0x4c, - 0xab, 0x2f, 0x1d, 0x1d, 0x96, 0x97, 0x87, 0xac, 0x84, 0xc3, 0x7e, 0x1a, 0xf9, 0xea, 0x18, 0x2c, - 0x05, 0xf4, 0xf3, 0x5d, 0x77, 0xf0, 0xd6, 0x10, 0xab, 0x56, 0x6b, 0xc4, 0xed, 0x67, 0x28, 0x9e, - 0xd5, 0x2b, 0x47, 0x87, 0xe5, 0x21, 0xeb, 0xe0, 0x90, 0xdf, 0x65, 0x6f, 0xc2, 0x74, 0xa5, 0xe3, - 0x86, 0xee, 0x03, 0xf4, 0xbb, 0x11, 0x1d, 0xe0, 0x88, 0x5b, 0x86, 0x89, 0xa0, 0xdb, 0xa2, 0x62, - 0x6e, 0x97, 0xaa, 0x25, 0xb6, 0x0a, 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x22, 0x5b, 0x71, 0x39, - 0xc9, 0x94, 0x71, 0xe3, 0x1e, 0x4c, 0x04, 0x8c, 0x89, 0x1c, 0x59, 0xa3, 0x9e, 0x03, 0x63, 0xa9, - 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, 0xf6, 0xef, 0x8e, 0xc1, 0xb9, 0x4a, 0xa7, 0xb3, 0x41, 0xc3, - 0xdd, 0x94, 0x14, 0xbf, 0x6c, 0xc1, 0xec, 0xbe, 0x1b, 0x44, 0x5d, 0xa7, 0xa5, 0xec, 0x57, 0x42, - 0x9e, 0xda, 0xa8, 0xf2, 0x70, 0x6e, 0x6f, 0x25, 0x48, 0x57, 0xc9, 0xd1, 0x61, 0x79, 0x36, 0x59, - 0x86, 0x29, 0xf6, 0xe4, 0xef, 0x5a, 0x30, 0x2f, 0x8b, 0x6e, 0xfa, 0x0d, 0x6a, 0xda, 0x47, 0xef, - 0xe4, 0x29, 0x93, 0x26, 0x2e, 0xec, 0x5a, 0xe9, 0x52, 0xec, 0x11, 0xc2, 0xfe, 0x6f, 0x63, 0x70, - 0xbe, 0x0f, 0x0d, 0xf2, 0x1b, 0x16, 0x9c, 0x15, 0x46, 0x55, 0x03, 0x84, 0x74, 0x47, 0xb6, 0xe6, - 0xcf, 0xe6, 0x2d, 0x39, 0xb2, 0x29, 0x4e, 0xbd, 0x3a, 0xad, 0x2e, 0xb0, 0xd5, 0x70, 0x25, 0x83, - 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, 0x66, 0xd6, 0x94, 0xa4, 0x63, 0x4f, 0x44, 0xd2, 0x5a, 0x06, - 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0xeb, 0xf0, 0xcc, 0x31, 0xe4, 0x1e, 0x3d, 0x39, 0xed, 0xb7, 0xf5, - 0xa8, 0x4f, 0x8e, 0xb9, 0x01, 0xe6, 0xb5, 0x0d, 0x93, 0x7c, 0xea, 0xa8, 0x89, 0x0d, 0x6c, 0xfb, - 0xe3, 0x73, 0x2a, 0x44, 0x09, 0xb1, 0x7f, 0xd7, 0x82, 0xe2, 0x10, 0xd6, 0xb0, 0x72, 0xd2, 0x1a, - 0x56, 0xea, 0xb1, 0x84, 0x45, 0xbd, 0x96, 0xb0, 0x37, 0x46, 0xeb, 0x8d, 0x41, 0x2c, 0x60, 0x3f, - 0xb4, 0xe0, 0x74, 0x8f, 0xc5, 0x8c, 0xec, 0xc2, 0xd9, 0x8e, 0xdf, 0x50, 0x6a, 0xd3, 0x75, 0x27, - 0xdc, 0xe5, 0x30, 0xf9, 0x79, 0x2f, 0xb3, 0x9e, 0xdc, 0xcc, 0x80, 0x3f, 0x3c, 0x2c, 0x2f, 0x68, - 0x22, 0x29, 0x04, 0xcc, 0xa4, 0x48, 0x3a, 0x50, 0xdc, 0x71, 0x69, 0xab, 0x11, 0x0f, 0xc1, 0x11, - 0x15, 0xa4, 0x6b, 0x92, 0x9a, 0x30, 0x16, 0xab, 0x7f, 0xa8, 0xb9, 0xd8, 0x3f, 0xb2, 0x60, 0xb6, - 0xd2, 0x8d, 0x76, 0x99, 0x7a, 0x50, 0xe7, 0xf6, 0x19, 0xe2, 0xc1, 0x44, 0xe8, 0x36, 0xf7, 0x5f, - 0xce, 0x67, 0x31, 0xae, 0x31, 0x52, 0xd2, 0x68, 0xae, 0x75, 0x53, 0x5e, 0x88, 0x82, 0x0d, 0x09, - 0x60, 0xd2, 0x77, 0xba, 0xd1, 0xee, 0x15, 0xf9, 0xc9, 0x23, 0x9e, 0x94, 0x6f, 0xb1, 0xcf, 0xb9, - 0x22, 0x39, 0x6a, 0x6d, 0x4d, 0x94, 0xa2, 0xe4, 0x64, 0x7f, 0x11, 0x66, 0x93, 0x37, 0x31, 0x03, - 0x8c, 0xd9, 0x0b, 0x50, 0x70, 0x02, 0x4f, 0x8e, 0xd8, 0x69, 0x89, 0x50, 0xa8, 0xe0, 0x4d, 0x64, - 0xe5, 0xe4, 0x45, 0x28, 0xee, 0x74, 0x5b, 0x2d, 0x56, 0x41, 0x5e, 0x7b, 0xe8, 0x53, 0xc0, 0x35, - 0x59, 0x8e, 0x1a, 0xc3, 0xfe, 0x8b, 0x71, 0x98, 0xab, 0xb6, 0xba, 0xf4, 0x8d, 0x80, 0x52, 0x65, - 0x9b, 0xa8, 0xc0, 0x5c, 0x27, 0xa0, 0xfb, 0x2e, 0xbd, 0x5f, 0xa3, 0x2d, 0x5a, 0x8f, 0xfc, 0x40, - 0x4a, 0x73, 0x5e, 0x12, 0x9a, 0xdb, 0x4c, 0x82, 0x31, 0x8d, 0x4f, 0x5e, 0x87, 0x59, 0xa7, 0x1e, - 0xb9, 0xfb, 0x54, 0x53, 0x10, 0xe2, 0x7e, 0x48, 0x52, 0x98, 0xad, 0x24, 0xa0, 0x98, 0xc2, 0x26, - 0x9f, 0x85, 0x85, 0xb0, 0xee, 0xb4, 0xe8, 0x9d, 0x8e, 0x64, 0xb5, 0xb2, 0x4b, 0xeb, 0x7b, 0x9b, - 0xbe, 0xeb, 0x45, 0xd2, 0x12, 0x75, 0x49, 0x52, 0x5a, 0xa8, 0xf5, 0xc1, 0xc3, 0xbe, 0x14, 0xc8, - 0xbf, 0xb0, 0xe0, 0x42, 0x27, 0xa0, 0x9b, 0x81, 0xdf, 0xf6, 0xd9, 0x50, 0xeb, 0x31, 0xcf, 0x48, - 0x33, 0xc5, 0x5b, 0x23, 0xea, 0x52, 0xa2, 0xa4, 0xd7, 0xaa, 0xff, 0xe1, 0xa3, 0xc3, 0xf2, 0x85, - 0xcd, 0xe3, 0x04, 0xc0, 0xe3, 0xe5, 0x23, 0xff, 0xd2, 0x82, 0x8b, 0x1d, 0x3f, 0x8c, 0x8e, 0xf9, - 0x84, 0x89, 0x13, 0xfd, 0x04, 0xfb, 0xe8, 0xb0, 0x7c, 0x71, 0xf3, 0x58, 0x09, 0xf0, 0x11, 0x12, - 0xda, 0x47, 0xd3, 0x70, 0xda, 0x18, 0x7b, 0xd2, 0x76, 0xf1, 0x1a, 0x9c, 0x52, 0x83, 0x21, 0xd6, - 0x7d, 0x4a, 0xb1, 0xad, 0xa9, 0x62, 0x02, 0x31, 0x89, 0xcb, 0xc6, 0x9d, 0x1e, 0x8a, 0xa2, 0x76, - 0x6a, 0xdc, 0x6d, 0x26, 0xa0, 0x98, 0xc2, 0x26, 0x6b, 0x70, 0x46, 0x96, 0x20, 0xed, 0xb4, 0xdc, - 0xba, 0xb3, 0xe2, 0x77, 0xe5, 0x90, 0x9b, 0xa8, 0x9e, 0x3f, 0x3a, 0x2c, 0x9f, 0xd9, 0xec, 0x05, - 0x63, 0x56, 0x1d, 0xb2, 0x0e, 0x67, 0x9d, 0x6e, 0xe4, 0xeb, 0xef, 0xbf, 0xea, 0xb1, 0xed, 0xb4, - 0xc1, 0x87, 0x56, 0x51, 0xec, 0xbb, 0x95, 0x0c, 0x38, 0x66, 0xd6, 0x22, 0x9b, 0x29, 0x6a, 0x35, - 0x5a, 0xf7, 0xbd, 0x86, 0xe8, 0xe5, 0x89, 0xf8, 0x04, 0x56, 0xc9, 0xc0, 0xc1, 0xcc, 0x9a, 0xa4, - 0x05, 0xb3, 0x6d, 0xe7, 0xc1, 0x1d, 0xcf, 0xd9, 0x77, 0xdc, 0x16, 0x63, 0x22, 0xed, 0x57, 0xfd, - 0x8d, 0x2a, 0xdd, 0xc8, 0x6d, 0x2d, 0x89, 0x9b, 0xfd, 0xa5, 0x35, 0x2f, 0xba, 0x15, 0xd4, 0x22, - 0xa6, 0xa9, 0x0b, 0x0d, 0x72, 0x23, 0x41, 0x0b, 0x53, 0xb4, 0xc9, 0x2d, 0x38, 0xc7, 0xa7, 0xe3, - 0xaa, 0x7f, 0xdf, 0x5b, 0xa5, 0x2d, 0xe7, 0x40, 0x7d, 0xc0, 0x14, 0xff, 0x80, 0xa7, 0x8f, 0x0e, - 0xcb, 0xe7, 0x6a, 0x59, 0x08, 0x98, 0x5d, 0x8f, 0x38, 0xf0, 0x4c, 0x12, 0x80, 0x74, 0xdf, 0x0d, - 0x5d, 0xdf, 0x13, 0x56, 0xa8, 0x62, 0x6c, 0x85, 0xaa, 0xf5, 0x47, 0xc3, 0xe3, 0x68, 0x90, 0xbf, - 0x6f, 0xc1, 0xd9, 0xac, 0x69, 0xb8, 0x50, 0xca, 0xe3, 0x7e, 0x31, 0x35, 0xb5, 0xc4, 0x88, 0xc8, - 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x59, 0x30, 0xe3, 0x18, 0x27, 0xe8, 0x05, 0xc8, 0x63, 0xd7, - 0x32, 0xcf, 0xe4, 0xd5, 0xf9, 0xa3, 0xc3, 0x72, 0xe2, 0x94, 0x8e, 0x09, 0x8e, 0xe4, 0x1f, 0x5a, - 0x70, 0x2e, 0x73, 0x8e, 0x2f, 0x4c, 0x9f, 0x44, 0x0b, 0xf1, 0x41, 0x92, 0xbd, 0xe6, 0x64, 0x8b, - 0x41, 0xbe, 0x61, 0xe9, 0xad, 0x4c, 0x5d, 0x39, 0x2d, 0xcc, 0x70, 0xd1, 0x6e, 0x8f, 0x68, 0x34, - 0x88, 0xb5, 0x26, 0x45, 0xb8, 0x7a, 0xc6, 0xd8, 0x19, 0x55, 0x21, 0xa6, 0xd9, 0x93, 0xaf, 0x5b, - 0x6a, 0x6b, 0xd4, 0x12, 0x9d, 0x3a, 0x29, 0x89, 0x48, 0xbc, 0xd3, 0x6a, 0x81, 0x52, 0xcc, 0xc9, - 0xcf, 0xc1, 0xa2, 0xb3, 0xed, 0x07, 0x51, 0xe6, 0xe4, 0x5b, 0x98, 0xe5, 0xd3, 0xe8, 0xe2, 0xd1, - 0x61, 0x79, 0xb1, 0xd2, 0x17, 0x0b, 0x8f, 0xa1, 0x60, 0xff, 0xd6, 0x04, 0xcc, 0x88, 0x93, 0x90, - 0xdc, 0xba, 0x7e, 0xc7, 0x82, 0x67, 0xeb, 0xdd, 0x20, 0xa0, 0x5e, 0x54, 0x8b, 0x68, 0xa7, 0x77, - 0xe3, 0xb2, 0x4e, 0x74, 0xe3, 0xba, 0x74, 0x74, 0x58, 0x7e, 0x76, 0xe5, 0x18, 0xfe, 0x78, 0xac, - 0x74, 0xe4, 0xdf, 0x5a, 0x60, 0x4b, 0x84, 0xaa, 0x53, 0xdf, 0x6b, 0x06, 0x7e, 0xd7, 0x6b, 0xf4, - 0x7e, 0xc4, 0xd8, 0x89, 0x7e, 0xc4, 0xf3, 0x47, 0x87, 0x65, 0x7b, 0xe5, 0x91, 0x52, 0xe0, 0x00, - 0x92, 0x92, 0x37, 0xe0, 0xb4, 0xc4, 0xba, 0xfa, 0xa0, 0x43, 0x03, 0x97, 0x9d, 0x39, 0xa4, 0xe2, - 0x18, 0x7b, 0x2b, 0xa5, 0x11, 0xb0, 0xb7, 0x0e, 0x09, 0x61, 0xea, 0x3e, 0x75, 0x9b, 0xbb, 0x91, - 0x52, 0x9f, 0x46, 0x74, 0x51, 0x92, 0x56, 0x91, 0xbb, 0x82, 0x66, 0x75, 0xfa, 0xe8, 0xb0, 0x3c, - 0x25, 0xff, 0xa0, 0xe2, 0x44, 0x6e, 0xc2, 0xac, 0x38, 0xa7, 0x6e, 0xba, 0x5e, 0x73, 0xd3, 0xf7, - 0x84, 0x9f, 0x4d, 0xa9, 0xfa, 0xbc, 0xda, 0xf0, 0x6b, 0x09, 0xe8, 0xc3, 0xc3, 0xf2, 0x8c, 0xfa, - 0xbd, 0x75, 0xd0, 0xa1, 0x98, 0xaa, 0x6d, 0xff, 0xfe, 0x24, 0x80, 0x1a, 0xae, 0xb4, 0x43, 0x3e, - 0x02, 0xa5, 0x90, 0x46, 0x82, 0xab, 0xbc, 0x38, 0x11, 0xf7, 0x51, 0xaa, 0x10, 0x63, 0x38, 0xd9, - 0x83, 0x89, 0x8e, 0xd3, 0x0d, 0x69, 0x3e, 0xe7, 0x07, 0xd9, 0xf9, 0x9b, 0x8c, 0xa2, 0x38, 0x98, - 0xf2, 0x9f, 0x28, 0x78, 0x90, 0x2f, 0x5b, 0x00, 0x34, 0xd9, 0x61, 0x23, 0x1b, 0x88, 0x24, 0xcb, - 0xb8, 0x4f, 0x59, 0x1b, 0x54, 0x67, 0x8f, 0x0e, 0xcb, 0x60, 0x74, 0xbd, 0xc1, 0x96, 0xdc, 0x87, - 0xa2, 0xa3, 0xd6, 0xfc, 0xf1, 0x93, 0x58, 0xf3, 0xf9, 0x79, 0x51, 0x0f, 0x5a, 0xcd, 0x8c, 0x7c, - 0xd5, 0x82, 0xd9, 0x90, 0x46, 0xb2, 0xab, 0xd8, 0xca, 0x23, 0x15, 0xde, 0x11, 0x07, 0x5d, 0x2d, - 0x41, 0x53, 0xac, 0xa0, 0xc9, 0x32, 0x4c, 0xf1, 0x55, 0xa2, 0x5c, 0xa7, 0x4e, 0x83, 0x06, 0xdc, - 0x1c, 0x21, 0x35, 0xa9, 0xd1, 0x45, 0x31, 0x68, 0x6a, 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0x55, 0xa2, - 0x6c, 0xb8, 0x41, 0xe0, 0x4b, 0x51, 0x8a, 0x39, 0x89, 0x62, 0xd0, 0xd4, 0xa2, 0x18, 0x65, 0x98, - 0xe2, 0x6b, 0x7f, 0xeb, 0x14, 0xcc, 0xaa, 0x89, 0x14, 0x6b, 0xf6, 0xc2, 0xfa, 0xd5, 0x47, 0xb3, - 0x5f, 0x31, 0x81, 0x98, 0xc4, 0x65, 0x95, 0xc5, 0x54, 0x4d, 0x2a, 0xf6, 0xba, 0x72, 0xcd, 0x04, - 0x62, 0x12, 0x97, 0xb4, 0x61, 0x22, 0x8c, 0x68, 0x47, 0xdd, 0x81, 0x8f, 0x78, 0x45, 0x1b, 0xaf, - 0x0f, 0x86, 0x25, 0x81, 0x91, 0x47, 0xc1, 0x85, 0x1b, 0x70, 0xa3, 0x84, 0x4d, 0x57, 0x4e, 0x8e, - 0x7c, 0xe6, 0x67, 0xd2, 0x5c, 0x2c, 0x7a, 0x23, 0x59, 0x86, 0x29, 0xf6, 0x19, 0xca, 0xfe, 0xc4, - 0x09, 0x2a, 0xfb, 0x9f, 0x86, 0x62, 0xdb, 0x79, 0x50, 0xeb, 0x06, 0xcd, 0xc7, 0x3f, 0x54, 0x48, - 0xaf, 0x42, 0x41, 0x05, 0x35, 0x3d, 0xf2, 0x25, 0xcb, 0x58, 0x72, 0xa6, 0x38, 0xf1, 0xbb, 0xf9, - 0x2e, 0x39, 0x7a, 0xaf, 0xec, 0xbb, 0xf8, 0xf4, 0xa8, 0xde, 0xc5, 0x27, 0xae, 0x7a, 0x33, 0x35, - 0x52, 0x4c, 0x10, 0xad, 0x46, 0x96, 0x4e, 0x54, 0x8d, 0x5c, 0x49, 0x30, 0xc3, 0x14, 0x73, 0x2e, - 0x8f, 0x98, 0x73, 0x5a, 0x1e, 0x38, 0x51, 0x79, 0x6a, 0x09, 0x66, 0x98, 0x62, 0xde, 0xff, 0xbc, - 0x39, 0x7d, 0x32, 0xe7, 0xcd, 0x99, 0x1c, 0xce, 0x9b, 0xc7, 0xab, 0xe2, 0xa7, 0x46, 0x55, 0xc5, - 0xc9, 0x0d, 0x20, 0x8d, 0x03, 0xcf, 0x69, 0xbb, 0x75, 0xb9, 0x58, 0xf2, 0x6d, 0x73, 0x96, 0xdb, - 0x23, 0x16, 0xe5, 0x42, 0x46, 0x56, 0x7b, 0x30, 0x30, 0xa3, 0x16, 0x89, 0xa0, 0xd8, 0x51, 0x1a, - 0xd7, 0x5c, 0x1e, 0xa3, 0x5f, 0x69, 0x60, 0xc2, 0x4d, 0x82, 0x4d, 0x3c, 0x55, 0x82, 0x9a, 0x13, - 0x59, 0x87, 0xb3, 0x6d, 0xd7, 0xdb, 0xf4, 0x1b, 0xe1, 0x26, 0x0d, 0xa4, 0xb5, 0xa5, 0x46, 0xa3, - 0x85, 0x79, 0xde, 0x36, 0xfc, 0x04, 0xbd, 0x91, 0x01, 0xc7, 0xcc, 0x5a, 0xf6, 0xff, 0xb4, 0x60, - 0x7e, 0xa5, 0xe5, 0x77, 0x1b, 0x77, 0x9d, 0xa8, 0xbe, 0x2b, 0x3c, 0x04, 0xc8, 0xeb, 0x50, 0x74, - 0xbd, 0x88, 0x06, 0xfb, 0x4e, 0x4b, 0xee, 0x4f, 0xb6, 0x32, 0x9f, 0xae, 0xc9, 0xf2, 0x87, 0x87, - 0xe5, 0xd9, 0xd5, 0x6e, 0xc0, 0xad, 0xd4, 0x62, 0xb5, 0x42, 0x5d, 0x87, 0x7c, 0xcb, 0x82, 0xd3, - 0xc2, 0xc7, 0x60, 0xd5, 0x89, 0x9c, 0xdb, 0x5d, 0x1a, 0xb8, 0x54, 0x79, 0x19, 0x8c, 0xb8, 0x50, - 0xa5, 0x65, 0x55, 0x0c, 0x0e, 0x62, 0x45, 0x7d, 0x23, 0xcd, 0x19, 0x7b, 0x85, 0xb1, 0x7f, 0xa5, - 0x00, 0x4f, 0xf7, 0xa5, 0x45, 0x16, 0x61, 0xcc, 0x6d, 0xc8, 0x4f, 0x07, 0x49, 0x77, 0x6c, 0xad, - 0x81, 0x63, 0x6e, 0x83, 0x2c, 0x71, 0x9d, 0x33, 0xa0, 0x61, 0xa8, 0x2e, 0x9c, 0x4b, 0x5a, 0x3d, - 0x94, 0xa5, 0x68, 0x60, 0x90, 0x32, 0x4c, 0x70, 0x8f, 0x52, 0x79, 0x9e, 0xe0, 0x5a, 0x2c, 0x77, - 0xde, 0x44, 0x51, 0x4e, 0x7e, 0xd1, 0x02, 0x10, 0x02, 0xb2, 0xd3, 0x88, 0xdc, 0x25, 0x31, 0xdf, - 0x66, 0x62, 0x94, 0x85, 0x94, 0xf1, 0x7f, 0x34, 0xb8, 0x92, 0x2d, 0x98, 0x64, 0x0a, 0xad, 0xdf, - 0x78, 0xec, 0x4d, 0x91, 0xdf, 0x44, 0x6d, 0x72, 0x1a, 0x28, 0x69, 0xb1, 0xb6, 0x0a, 0x68, 0xd4, - 0x0d, 0x3c, 0xd6, 0xb4, 0x7c, 0x1b, 0x2c, 0x0a, 0x29, 0x50, 0x97, 0xa2, 0x81, 0x61, 0xff, 0xf3, - 0x31, 0x38, 0x9b, 0x25, 0x3a, 0xdb, 0x6d, 0x26, 0x85, 0xb4, 0xf2, 0x68, 0xfc, 0x33, 0xf9, 0xb7, - 0x8f, 0x74, 0x97, 0xd1, 0xd7, 0x14, 0xd2, 0xa1, 0x4f, 0xf2, 0x25, 0x3f, 0xa3, 0x5b, 0x68, 0xec, - 0x31, 0x5b, 0x48, 0x53, 0x4e, 0xb5, 0xd2, 0x25, 0x18, 0x0f, 0x59, 0xcf, 0x17, 0x92, 0xd7, 0x1d, - 0xbc, 0x8f, 0x38, 0x84, 0x61, 0x74, 0x3d, 0x37, 0x92, 0x61, 0x18, 0x1a, 0xe3, 0x8e, 0xe7, 0x46, - 0xc8, 0x21, 0xf6, 0x37, 0xc7, 0x60, 0xb1, 0xff, 0x47, 0x91, 0x6f, 0x5a, 0x00, 0x0d, 0x76, 0x5c, - 0x09, 0xb9, 0x2f, 0xb3, 0x70, 0x2f, 0x72, 0x4e, 0xaa, 0x0d, 0x57, 0x15, 0xa7, 0xd8, 0xd7, 0x4c, - 0x17, 0x85, 0x68, 0x08, 0x42, 0xae, 0xa8, 0xa1, 0xcf, 0xaf, 0x6a, 0xc4, 0x64, 0xd2, 0x75, 0x36, - 0x34, 0x04, 0x0d, 0x2c, 0x76, 0x1e, 0xf5, 0x9c, 0x36, 0x0d, 0x3b, 0x8e, 0x0e, 0x6a, 0xe1, 0xe7, - 0xd1, 0x9b, 0xaa, 0x10, 0x63, 0xb8, 0xdd, 0x82, 0xe7, 0x06, 0x90, 0x33, 0xa7, 0x98, 0x01, 0xfb, - 0xbf, 0x5b, 0x70, 0x7e, 0xa5, 0xd5, 0x0d, 0x23, 0x1a, 0xfc, 0x7f, 0xe3, 0xba, 0xf7, 0xbf, 0x2c, - 0x78, 0xa6, 0xcf, 0x37, 0x3f, 0x01, 0x0f, 0xbe, 0x77, 0x92, 0x1e, 0x7c, 0x77, 0x46, 0x1d, 0xd2, - 0x99, 0xdf, 0xd1, 0xc7, 0x91, 0xef, 0x5f, 0x17, 0xe0, 0x14, 0x5b, 0xb6, 0x1a, 0x7e, 0x33, 0xa7, - 0x8d, 0xf3, 0x39, 0x98, 0xf8, 0x3c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0xe4, - 0xcb, 0x16, 0x4c, 0x7d, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xe2, 0x62, 0x98, 0xf8, 0x86, 0x25, - 0xb9, 0x43, 0x8a, 0x50, 0x04, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0xc5, 0x99, 0xbc, 0x00, 0x53, 0x3b, - 0x7e, 0xd0, 0xee, 0xb6, 0x9c, 0x74, 0xfc, 0xdb, 0x35, 0x51, 0x8c, 0x0a, 0xce, 0x26, 0xb9, 0xd3, - 0x71, 0xdf, 0xa2, 0x41, 0x28, 0x3c, 0xd3, 0x13, 0x93, 0xbc, 0xa2, 0x21, 0x68, 0x60, 0xf1, 0x3a, - 0xcd, 0x66, 0x40, 0x9b, 0x4e, 0xe4, 0x07, 0x7c, 0xe7, 0x30, 0xeb, 0x68, 0x08, 0x1a, 0x58, 0x8b, - 0x9f, 0x84, 0x19, 0x53, 0xf8, 0xa1, 0xc2, 0x1a, 0x3e, 0x05, 0xd2, 0x89, 0x30, 0xb5, 0x24, 0x59, - 0x83, 0x2c, 0x49, 0xf6, 0xbf, 0x1f, 0x03, 0xc3, 0x3a, 0xf4, 0x04, 0xa6, 0xba, 0x97, 0x98, 0xea, - 0x23, 0x5a, 0x36, 0x0c, 0x5b, 0x57, 0xbf, 0x20, 0xaf, 0xfd, 0x54, 0x90, 0xd7, 0xcd, 0xdc, 0x38, - 0x1e, 0x1f, 0xe3, 0xf5, 0x7d, 0x0b, 0x9e, 0x89, 0x91, 0x7b, 0x0d, 0xb7, 0x8f, 0x5e, 0xb7, 0x5f, - 0x81, 0x69, 0x27, 0xae, 0x26, 0x27, 0x96, 0x11, 0x61, 0xa3, 0x41, 0x68, 0xe2, 0xc5, 0xb1, 0x09, - 0x85, 0xc7, 0x8c, 0x4d, 0x18, 0x3f, 0x3e, 0x36, 0xc1, 0xfe, 0xd1, 0x18, 0x5c, 0xe8, 0xfd, 0x32, - 0xb5, 0xe2, 0x0c, 0xe6, 0x05, 0xf1, 0x2a, 0xcc, 0x44, 0xb2, 0x82, 0xb1, 0x7f, 0xea, 0x68, 0xdf, - 0x2d, 0x03, 0x86, 0x09, 0x4c, 0x56, 0xb3, 0x2e, 0xd6, 0xba, 0x5a, 0xdd, 0xef, 0xa8, 0xc8, 0x16, - 0x5d, 0x73, 0xc5, 0x80, 0x61, 0x02, 0x53, 0xfb, 0x0c, 0x8f, 0x9f, 0xb8, 0xcf, 0x70, 0x0d, 0xce, - 0x29, 0x2f, 0xc9, 0x6b, 0x7e, 0xb0, 0xe2, 0xb7, 0x3b, 0x2d, 0x1a, 0xa9, 0x15, 0xa4, 0x58, 0xbd, - 0x20, 0xab, 0x9c, 0xc3, 0x2c, 0x24, 0xcc, 0xae, 0x6b, 0x7f, 0xbf, 0x00, 0x67, 0xe2, 0x66, 0x5f, - 0xf1, 0xbd, 0x86, 0xcb, 0x1d, 0x6d, 0x5e, 0x83, 0xf1, 0xe8, 0xa0, 0xa3, 0x1a, 0xfb, 0x2f, 0x2b, - 0x71, 0xb6, 0x0e, 0x3a, 0xac, 0xb7, 0xcf, 0x67, 0x54, 0xe1, 0xa6, 0x73, 0x5e, 0x89, 0xac, 0xeb, - 0xd9, 0x21, 0x7a, 0xe0, 0xe5, 0xe4, 0x68, 0x7e, 0x78, 0x58, 0xce, 0x08, 0x76, 0x5f, 0xd2, 0x94, - 0x92, 0x63, 0x9e, 0xdc, 0x83, 0xd9, 0x96, 0x13, 0x46, 0x77, 0x3a, 0x0d, 0x27, 0xa2, 0x5b, 0xae, - 0x74, 0x61, 0x19, 0x2e, 0x60, 0x44, 0xdf, 0xf5, 0xaf, 0x27, 0x28, 0x61, 0x8a, 0x32, 0xd9, 0x07, - 0xc2, 0x4a, 0xb6, 0x02, 0xc7, 0x0b, 0xc5, 0x57, 0x31, 0x7e, 0xc3, 0x07, 0xa8, 0xe8, 0xa3, 0xf3, - 0x7a, 0x0f, 0x35, 0xcc, 0xe0, 0x40, 0x9e, 0x87, 0xc9, 0x80, 0x3a, 0xa1, 0xde, 0x0e, 0xf4, 0xfc, - 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, 0xa8, 0xc9, 0x47, 0x4c, 0xa8, 0x3f, 0xb5, 0x60, 0x36, 0xee, - 0xa6, 0x27, 0xa0, 0x7a, 0xb4, 0x93, 0xaa, 0xc7, 0xf5, 0xbc, 0x96, 0xc4, 0x3e, 0xda, 0xc6, 0x1f, - 0x4c, 0x9a, 0xdf, 0xc7, 0x03, 0x06, 0xbe, 0x00, 0x25, 0x35, 0xab, 0x95, 0x4e, 0x3f, 0xa2, 0x05, - 0x22, 0xa1, 0xed, 0x19, 0x81, 0x6e, 0x92, 0x09, 0xc6, 0xfc, 0x98, 0xae, 0xd3, 0x90, 0x7a, 0x8c, - 0x1c, 0xf6, 0x5a, 0xd7, 0x51, 0xfa, 0x4d, 0x96, 0xae, 0xa3, 0xea, 0x90, 0x3b, 0x70, 0xbe, 0x13, - 0xf8, 0x3c, 0xdc, 0x7a, 0x95, 0x3a, 0x8d, 0x96, 0xeb, 0x51, 0x65, 0xe6, 0x11, 0xae, 0x26, 0xcf, - 0x1c, 0x1d, 0x96, 0xcf, 0x6f, 0x66, 0xa3, 0x60, 0xbf, 0xba, 0xc9, 0x80, 0xbd, 0xf1, 0x01, 0x02, - 0xf6, 0xfe, 0x96, 0x36, 0xa6, 0xd2, 0x50, 0x86, 0xcd, 0x7d, 0x26, 0xaf, 0xae, 0xcc, 0x58, 0xd6, - 0xe3, 0x21, 0x55, 0x91, 0x4c, 0x51, 0xb3, 0xef, 0x6f, 0xb1, 0x9b, 0x7c, 0x4c, 0x8b, 0x5d, 0x1c, - 0x77, 0x31, 0xf5, 0xe3, 0x8c, 0xbb, 0x28, 0x7e, 0xa0, 0xe2, 0x2e, 0xde, 0x9f, 0x80, 0xf9, 0xb4, - 0x06, 0x72, 0xf2, 0xc1, 0x88, 0x7f, 0xc7, 0x82, 0x79, 0x35, 0x7b, 0x04, 0x4f, 0xad, 0xbf, 0xaf, - 0xe7, 0x34, 0x69, 0x85, 0x2e, 0xa5, 0xb3, 0x34, 0x6c, 0xa5, 0xb8, 0x61, 0x0f, 0x7f, 0xf2, 0x36, - 0x4c, 0xeb, 0x2b, 0x8b, 0xc7, 0x8a, 0x4c, 0x9c, 0xe3, 0x5a, 0x54, 0x4c, 0x02, 0x4d, 0x7a, 0xe4, - 0x7d, 0x0b, 0xa0, 0xae, 0xb6, 0x39, 0x35, 0xbb, 0x6e, 0xe7, 0x35, 0xbb, 0xf4, 0x06, 0x1a, 0x2b, - 0xcb, 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, 0x15, 0x7e, 0x59, 0xa1, 0xb5, 0x3b, 0x91, 0xfd, 0x61, - 0x64, 0x9f, 0xf2, 0x63, 0x14, 0xd3, 0x58, 0x95, 0x32, 0x40, 0x21, 0x26, 0x84, 0xb0, 0x5f, 0x03, - 0xed, 0x05, 0xcc, 0x96, 0x2d, 0xee, 0x07, 0xbc, 0xe9, 0x44, 0xbb, 0x72, 0x08, 0xea, 0x65, 0xeb, - 0x9a, 0x02, 0x60, 0x8c, 0x63, 0x7f, 0x0e, 0x66, 0xdf, 0x08, 0x9c, 0xce, 0xae, 0xcb, 0x2f, 0x05, - 0xd8, 0xe1, 0xf3, 0x05, 0x98, 0x72, 0x1a, 0x8d, 0xac, 0x84, 0x22, 0x15, 0x51, 0x8c, 0x0a, 0x3e, - 0xd0, 0x39, 0xd3, 0xfe, 0x7d, 0x0b, 0x48, 0x7c, 0xb1, 0xea, 0x7a, 0xcd, 0x0d, 0x27, 0xaa, 0xef, - 0xb2, 0xf3, 0xd1, 0x2e, 0x2f, 0xcd, 0x3a, 0x1f, 0x5d, 0xd7, 0x10, 0x34, 0xb0, 0xc8, 0xbb, 0x30, - 0x2d, 0xfe, 0xbd, 0xa5, 0x4f, 0x5f, 0xa3, 0x3b, 0x33, 0xf3, 0x0d, 0x85, 0xcb, 0x24, 0x46, 0xe1, - 0xf5, 0x98, 0x03, 0x9a, 0xec, 0x58, 0x53, 0xad, 0x79, 0x3b, 0xad, 0xee, 0x83, 0xc6, 0x76, 0xdc, - 0x54, 0x9d, 0xc0, 0xdf, 0x71, 0x5b, 0x34, 0xdd, 0x54, 0x9b, 0xa2, 0x18, 0x15, 0x7c, 0xb0, 0xa6, - 0xfa, 0x57, 0x16, 0x9c, 0x5d, 0x0b, 0x23, 0xd7, 0x5f, 0xa5, 0x61, 0xc4, 0xb6, 0x15, 0xb6, 0xf8, - 0x74, 0x5b, 0x83, 0x38, 0xf4, 0xaf, 0xc2, 0xbc, 0xbc, 0xe4, 0xed, 0x6e, 0x87, 0x34, 0x32, 0xf4, - 0x78, 0x3d, 0x8f, 0x57, 0x52, 0x70, 0xec, 0xa9, 0xc1, 0xa8, 0xc8, 0xdb, 0xde, 0x98, 0x4a, 0x21, - 0x49, 0xa5, 0x96, 0x82, 0x63, 0x4f, 0x0d, 0xfb, 0x7b, 0x05, 0x38, 0xc3, 0x3f, 0x23, 0x15, 0x8c, - 0xf3, 0xf5, 0x7e, 0xc1, 0x38, 0x23, 0x4e, 0x65, 0xce, 0xeb, 0x31, 0x42, 0x71, 0xfe, 0xb6, 0x05, - 0x73, 0x8d, 0x64, 0x4b, 0xe7, 0x63, 0xf4, 0xca, 0xea, 0x43, 0xe1, 0xd3, 0x96, 0x2a, 0xc4, 0x34, - 0x7f, 0xf2, 0xab, 0x16, 0xcc, 0x25, 0xc5, 0x54, 0xab, 0xfb, 0x09, 0x34, 0x92, 0x76, 0x42, 0x4f, - 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xc3, 0x31, 0xd9, 0xa5, 0x27, 0x11, 0x69, 0x42, 0xee, 0x43, - 0x29, 0x6a, 0x85, 0xa2, 0x50, 0x7e, 0xed, 0x88, 0x27, 0xc2, 0xad, 0xf5, 0x9a, 0xf0, 0xaf, 0x88, - 0x95, 0x36, 0x59, 0xc2, 0x94, 0x4f, 0xc5, 0x8b, 0x33, 0xae, 0x77, 0x24, 0xe3, 0x5c, 0x8e, 0xa2, - 0x5b, 0x2b, 0x9b, 0x69, 0xc6, 0xb2, 0x84, 0x31, 0x56, 0xbc, 0xec, 0xdf, 0xb4, 0xa0, 0x74, 0xc3, - 0x57, 0xeb, 0xc8, 0xcf, 0xe5, 0x60, 0xe8, 0xd1, 0xfa, 0xa0, 0xbe, 0xc7, 0x8d, 0x8f, 0x18, 0xaf, - 0x27, 0xcc, 0x3c, 0xcf, 0x1a, 0xb4, 0x97, 0x78, 0x5e, 0x35, 0x46, 0xea, 0x86, 0xbf, 0xdd, 0xd7, - 0x36, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x4d, 0xe7, 0x80, 0x7a, 0x91, 0x33, 0xfc, 0x26, 0xf1, 0x0a, - 0x4c, 0x3b, 0x1d, 0x7e, 0x51, 0x68, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, 0x2f, - 0x68, 0x22, 0xec, 0x23, 0x6b, 0x29, 0x5a, 0x49, 0xc1, 0xb1, 0xa7, 0x06, 0xb9, 0x01, 0x44, 0x46, - 0x29, 0x57, 0xea, 0x75, 0xbf, 0xeb, 0x89, 0x25, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xa3, 0x07, - 0x03, 0x33, 0x6a, 0x91, 0xcf, 0xc2, 0x42, 0x9d, 0x53, 0x96, 0x47, 0x0f, 0x93, 0xa2, 0x38, 0x7e, - 0xea, 0x40, 0x8a, 0x95, 0x3e, 0x78, 0xd8, 0x97, 0x02, 0x93, 0x34, 0x8c, 0xfc, 0xc0, 0x69, 0x52, - 0x93, 0xee, 0x64, 0x52, 0xd2, 0x5a, 0x0f, 0x06, 0x66, 0xd4, 0x22, 0x5f, 0x84, 0x52, 0xb4, 0x1b, - 0xd0, 0x70, 0xd7, 0x6f, 0x35, 0xa4, 0x63, 0xc7, 0x88, 0x96, 0x36, 0xd9, 0xfb, 0x5b, 0x8a, 0xaa, - 0x31, 0xbc, 0x55, 0x11, 0xc6, 0x3c, 0x49, 0x00, 0x93, 0x61, 0xdd, 0xef, 0xd0, 0x50, 0xaa, 0xec, - 0x37, 0x72, 0xe1, 0xce, 0x2d, 0x47, 0x86, 0x8d, 0x8f, 0x73, 0x40, 0xc9, 0xc9, 0xfe, 0xbd, 0x31, - 0x98, 0x31, 0x11, 0x07, 0x58, 0x9b, 0xbe, 0x6c, 0xc1, 0x4c, 0xdd, 0xf7, 0xa2, 0xc0, 0x6f, 0x09, - 0xfb, 0x55, 0x3e, 0x1a, 0x05, 0x23, 0xb5, 0x4a, 0x23, 0xc7, 0x6d, 0x19, 0xa6, 0x30, 0x83, 0x0d, - 0x26, 0x98, 0x92, 0xaf, 0x59, 0x30, 0x17, 0xfb, 0x01, 0xc6, 0x86, 0xb4, 0x5c, 0x05, 0xd1, 0x4b, - 0xfd, 0xd5, 0x24, 0x27, 0x4c, 0xb3, 0xb6, 0xb7, 0x61, 0x3e, 0xdd, 0xdb, 0xac, 0x29, 0x3b, 0x8e, - 0x9c, 0xeb, 0x85, 0xb8, 0x29, 0x37, 0x9d, 0x30, 0x44, 0x0e, 0x21, 0x2f, 0x42, 0xb1, 0xed, 0x04, - 0x4d, 0xd7, 0x73, 0x5a, 0xbc, 0x15, 0x0b, 0xc6, 0x82, 0x24, 0xcb, 0x51, 0x63, 0xd8, 0x1f, 0x83, - 0x99, 0x0d, 0xc7, 0x6b, 0xd2, 0x86, 0x5c, 0x87, 0x1f, 0x1d, 0xeb, 0xf8, 0xe7, 0xe3, 0x30, 0x6d, - 0x9c, 0xcd, 0x4e, 0xfe, 0x9c, 0x95, 0x48, 0xb5, 0x52, 0xc8, 0x31, 0xd5, 0xca, 0xa7, 0x01, 0x76, - 0x5c, 0xcf, 0x0d, 0x77, 0x1f, 0x33, 0x89, 0x0b, 0xbf, 0xf8, 0xbe, 0xa6, 0x29, 0xa0, 0x41, 0x2d, - 0xbe, 0x5d, 0x9c, 0x38, 0x26, 0x23, 0xd9, 0xfb, 0x96, 0xb1, 0xdd, 0x4c, 0xe6, 0xe1, 0x4d, 0x61, - 0x74, 0xcc, 0x92, 0xda, 0x7e, 0xc4, 0xc5, 0xcf, 0x71, 0xbb, 0xd2, 0x16, 0x14, 0x03, 0x1a, 0x76, - 0xdb, 0xec, 0xc4, 0x38, 0x35, 0x74, 0x33, 0x70, 0xbf, 0x16, 0x94, 0xf5, 0x51, 0x53, 0x5a, 0x7c, - 0x0d, 0x4e, 0x25, 0x44, 0x18, 0xea, 0xfa, 0xc6, 0x87, 0x4c, 0x03, 0xc0, 0xe3, 0x5c, 0xe6, 0xb0, - 0xbe, 0x68, 0x19, 0x59, 0x5c, 0x74, 0x5f, 0x08, 0xef, 0x25, 0x01, 0xb3, 0x7f, 0x34, 0x09, 0xd2, - 0x41, 0x60, 0x80, 0xe5, 0xca, 0xbc, 0x16, 0x1c, 0x7b, 0x8c, 0x6b, 0xc1, 0x1b, 0x30, 0xe3, 0x7a, - 0x6e, 0xe4, 0x3a, 0x2d, 0x6e, 0xdc, 0x91, 0xdb, 0xa9, 0x72, 0xef, 0x9e, 0x59, 0x33, 0x60, 0x19, - 0x74, 0x12, 0x75, 0xc9, 0x6d, 0x98, 0xe0, 0xfb, 0x8d, 0x1c, 0xc0, 0xc3, 0x7b, 0x31, 0x70, 0x07, - 0x16, 0x11, 0xf3, 0x25, 0x28, 0xf1, 0xc3, 0x87, 0x48, 0x63, 0xa3, 0x8f, 0xdf, 0x72, 0x1c, 0xc7, - 0x87, 0x8f, 0x14, 0x1c, 0x7b, 0x6a, 0x30, 0x2a, 0x3b, 0x8e, 0xdb, 0xea, 0x06, 0x34, 0xa6, 0x32, - 0x99, 0xa4, 0x72, 0x2d, 0x05, 0xc7, 0x9e, 0x1a, 0x64, 0x07, 0x66, 0x64, 0x99, 0xf0, 0x49, 0x9b, - 0x7a, 0xcc, 0xaf, 0xe4, 0xbe, 0x87, 0xd7, 0x0c, 0x4a, 0x98, 0xa0, 0x4b, 0xba, 0x70, 0xda, 0xf5, - 0xea, 0xbe, 0x57, 0x6f, 0x75, 0x43, 0x77, 0x9f, 0xc6, 0x01, 0x57, 0x8f, 0xc3, 0xec, 0xdc, 0xd1, - 0x61, 0xf9, 0xf4, 0x5a, 0x9a, 0x1c, 0xf6, 0x72, 0x20, 0x5f, 0xb2, 0xe0, 0x5c, 0xdd, 0xf7, 0x42, - 0x9e, 0x17, 0x62, 0x9f, 0x5e, 0x0d, 0x02, 0x3f, 0x10, 0xbc, 0x4b, 0x8f, 0xc9, 0x9b, 0xdb, 0x14, - 0x57, 0xb2, 0x48, 0x62, 0x36, 0x27, 0xf2, 0x0e, 0x14, 0x3b, 0x81, 0xbf, 0xef, 0x36, 0x68, 0x20, - 0xfd, 0x1b, 0xd7, 0xf3, 0xc8, 0x53, 0xb3, 0x29, 0x69, 0xc6, 0x4b, 0x8f, 0x2a, 0x41, 0xcd, 0xcf, - 0xfe, 0xdf, 0xd3, 0x30, 0x9b, 0x44, 0x27, 0xbf, 0x00, 0xd0, 0x09, 0xfc, 0x36, 0x8d, 0x76, 0xa9, - 0x0e, 0x9c, 0xb9, 0x39, 0x6a, 0x3a, 0x14, 0x45, 0x4f, 0xf9, 0x04, 0xb1, 0xe5, 0x22, 0x2e, 0x45, - 0x83, 0x23, 0x09, 0x60, 0x6a, 0x4f, 0x6c, 0xbb, 0x52, 0x0b, 0x79, 0x33, 0x17, 0x9d, 0x49, 0x72, - 0xe6, 0x11, 0x1f, 0xb2, 0x08, 0x15, 0x23, 0xb2, 0x0d, 0x85, 0xfb, 0x74, 0x3b, 0x9f, 0x58, 0xfc, - 0xbb, 0x54, 0x9e, 0x66, 0xaa, 0x53, 0x47, 0x87, 0xe5, 0xc2, 0x5d, 0xba, 0x8d, 0x8c, 0x38, 0xfb, - 0xae, 0x86, 0x70, 0x0c, 0x90, 0x4b, 0xc5, 0x9b, 0x39, 0x7a, 0x19, 0x88, 0xef, 0x92, 0x45, 0xa8, - 0x18, 0x91, 0x77, 0xa0, 0x74, 0xdf, 0xd9, 0xa7, 0x3b, 0x81, 0xef, 0x45, 0xd2, 0x11, 0x6d, 0xc4, - 0x58, 0x8a, 0xbb, 0x8a, 0x9c, 0xe4, 0xcb, 0xb7, 0x77, 0x5d, 0x88, 0x31, 0x3b, 0xb2, 0x0f, 0x45, - 0x8f, 0xde, 0x47, 0xda, 0x72, 0xeb, 0xf9, 0xc4, 0x2e, 0xdc, 0x94, 0xd4, 0x24, 0x67, 0xbe, 0xef, - 0xa9, 0x32, 0xd4, 0xbc, 0x58, 0x5f, 0xde, 0xf3, 0xb7, 0xe5, 0x42, 0x35, 0x62, 0x5f, 0xea, 0x93, - 0xa9, 0xe8, 0xcb, 0x1b, 0xfe, 0x36, 0x32, 0xe2, 0x6c, 0x8e, 0xd4, 0xb5, 0x17, 0x94, 0x5c, 0xa6, - 0x6e, 0xe6, 0xeb, 0xfd, 0x25, 0xe6, 0x48, 0x5c, 0x8a, 0x06, 0x47, 0xd6, 0xb6, 0x4d, 0x69, 0xac, - 0x94, 0x0b, 0xd5, 0x88, 0x6d, 0x9b, 0x34, 0x7d, 0x8a, 0xb6, 0x55, 0x65, 0xa8, 0x79, 0x31, 0xbe, - 0xae, 0xb4, 0xfc, 0xe5, 0xb3, 0x54, 0x25, 0xed, 0x88, 0x82, 0xaf, 0x2a, 0x43, 0xcd, 0x8b, 0xb5, - 0x77, 0xb8, 0x77, 0x70, 0xdf, 0x69, 0xed, 0xb9, 0x5e, 0x53, 0x06, 0x82, 0x8e, 0x9a, 0xf5, 0x78, - 0xef, 0xe0, 0xae, 0xa0, 0x67, 0xb6, 0x77, 0x5c, 0x8a, 0x06, 0x47, 0xf2, 0x0f, 0x2c, 0x98, 0xec, - 0xb4, 0xba, 0x4d, 0xd7, 0x5b, 0x98, 0xc9, 0xc3, 0x43, 0x28, 0xb9, 0xe4, 0x2e, 0x6d, 0x72, 0xd2, - 0x42, 0x51, 0xfc, 0x69, 0xed, 0xd4, 0xc8, 0x0b, 0x7f, 0xe9, 0xcf, 0xca, 0x0b, 0xd4, 0xab, 0xfb, - 0x0d, 0xd7, 0x6b, 0x2e, 0xdf, 0x0b, 0x7d, 0x6f, 0x09, 0x9d, 0xfb, 0x4a, 0x47, 0x97, 0x32, 0x2d, - 0x7e, 0x02, 0xa6, 0x0d, 0x12, 0x8f, 0x52, 0xf4, 0x66, 0x4c, 0x45, 0xef, 0x37, 0x27, 0x61, 0xc6, - 0xcc, 0xb4, 0x38, 0x80, 0xf6, 0xa5, 0x4f, 0x1c, 0x63, 0xc3, 0x9c, 0x38, 0xd8, 0x11, 0xd3, 0xb8, - 0x3d, 0x52, 0xe6, 0xad, 0xb5, 0xdc, 0x14, 0xee, 0xf8, 0x88, 0x69, 0x14, 0x86, 0x98, 0x60, 0x3a, - 0x84, 0x43, 0x09, 0x53, 0x5b, 0x85, 0x62, 0x37, 0x91, 0x54, 0x5b, 0x13, 0xaa, 0xda, 0x15, 0x80, - 0x38, 0xe3, 0xa0, 0xbc, 0x55, 0xd4, 0xfa, 0xb0, 0x91, 0x09, 0xd1, 0xc0, 0x22, 0xcf, 0xc3, 0x24, - 0x53, 0x7d, 0x68, 0x43, 0xc6, 0xa9, 0xeb, 0x73, 0xfc, 0x35, 0x5e, 0x8a, 0x12, 0x4a, 0x5e, 0x65, - 0x5a, 0x6a, 0xac, 0xb0, 0xc8, 0xf0, 0xf3, 0xb3, 0xb1, 0x96, 0x1a, 0xc3, 0x30, 0x81, 0xc9, 0x44, - 0xa7, 0x4c, 0xbf, 0xe0, 0x6b, 0x83, 0x21, 0x3a, 0x57, 0x3a, 0x50, 0xc0, 0xb8, 0x5d, 0x29, 0xa5, - 0x8f, 0xf0, 0x39, 0x3d, 0x61, 0xd8, 0x95, 0x52, 0x70, 0xec, 0xa9, 0xc1, 0x3e, 0x46, 0x5e, 0x88, - 0x4e, 0x0b, 0x6f, 0xe4, 0x3e, 0x57, 0x99, 0x5f, 0x31, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, - 0x07, 0x3f, 0x6c, 0x8d, 0x76, 0x2c, 0xfa, 0x1c, 0xcc, 0x26, 0x77, 0xa1, 0xdc, 0x6f, 0x3e, 0xbe, - 0x3a, 0x0e, 0x67, 0x6e, 0x36, 0x5d, 0x2f, 0x9d, 0x45, 0x2c, 0x2b, 0x89, 0xbc, 0x35, 0x74, 0x12, - 0x79, 0x1d, 0xf0, 0x26, 0x53, 0xb4, 0x67, 0x07, 0xbc, 0xa9, 0x7c, 0xf9, 0x49, 0x5c, 0xf2, 0xa7, - 0x16, 0x3c, 0xeb, 0x34, 0xc4, 0xb9, 0xc0, 0x69, 0xc9, 0x52, 0x23, 0xf7, 0xb1, 0x9c, 0xd1, 0xe1, - 0x88, 0xbb, 0x7c, 0xef, 0xc7, 0x2f, 0x55, 0x8e, 0xe1, 0x2a, 0x7a, 0xfc, 0xa7, 0xe4, 0x17, 0x3c, - 0x7b, 0x1c, 0x2a, 0x1e, 0x2b, 0x3e, 0xf9, 0x6b, 0x30, 0x97, 0xf8, 0x60, 0x69, 0x09, 0x2f, 0x89, - 0x0b, 0x8b, 0x5a, 0x12, 0x84, 0x69, 0xdc, 0xc5, 0x5b, 0xf0, 0xe1, 0x47, 0xca, 0x39, 0xd4, 0x60, - 0xfb, 0xae, 0x05, 0x33, 0x66, 0xc2, 0x1f, 0xf2, 0x22, 0x14, 0x23, 0x7f, 0x8f, 0x7a, 0x77, 0x02, - 0xe5, 0x0d, 0xab, 0x07, 0xfa, 0x16, 0x2f, 0xc7, 0x75, 0xd4, 0x18, 0x0c, 0xbb, 0xde, 0x72, 0xa9, - 0x17, 0xad, 0x35, 0x64, 0x37, 0x6b, 0xec, 0x15, 0x51, 0xbe, 0x8a, 0x1a, 0x43, 0x38, 0xb0, 0xb1, - 0xdf, 0x35, 0x5a, 0x0f, 0xa8, 0xf2, 0x9d, 0x37, 0x1c, 0xd8, 0x62, 0x18, 0x26, 0x30, 0x89, 0xad, - 0x4d, 0x9c, 0xe3, 0xf1, 0xbd, 0x46, 0xca, 0x24, 0xf9, 0xdb, 0x16, 0x94, 0x84, 0x89, 0x1e, 0xe9, - 0x4e, 0xca, 0x7f, 0x35, 0x65, 0x44, 0xa8, 0x6c, 0xae, 0x65, 0xf9, 0xaf, 0x5e, 0x82, 0xf1, 0x3d, - 0xd7, 0x53, 0x5f, 0xa2, 0xb7, 0xa5, 0x37, 0x5d, 0xaf, 0x81, 0x1c, 0xa2, 0x37, 0xae, 0x42, 0xdf, - 0x8d, 0x6b, 0x19, 0x4a, 0xda, 0xab, 0x43, 0x2e, 0xff, 0xda, 0x7a, 0xab, 0xbd, 0x40, 0x30, 0xc6, - 0xb1, 0x7f, 0xdd, 0x82, 0x59, 0x1e, 0x20, 0x1d, 0x9f, 0x87, 0x5f, 0xd1, 0x8e, 0x56, 0x42, 0xee, - 0x0b, 0x49, 0x47, 0xab, 0x87, 0x87, 0xe5, 0x69, 0x11, 0x52, 0x9d, 0xf4, 0xbb, 0xfa, 0x8c, 0x34, - 0xa2, 0x71, 0x77, 0xb0, 0xb1, 0xa1, 0x6d, 0x3c, 0xb1, 0x98, 0x8a, 0x08, 0xc6, 0xf4, 0xec, 0x77, - 0x61, 0xc6, 0x8c, 0x74, 0x22, 0xaf, 0xc0, 0x74, 0xc7, 0xf5, 0x9a, 0xc9, 0x88, 0x58, 0x7d, 0xd1, - 0xb0, 0x19, 0x83, 0xd0, 0xc4, 0xe3, 0xd5, 0xfc, 0xb8, 0x5a, 0xea, 0x7e, 0x62, 0xd3, 0x37, 0xab, - 0xc5, 0x7f, 0x78, 0xde, 0xf9, 0x8c, 0x88, 0xba, 0xdc, 0xf3, 0xce, 0x67, 0xf0, 0xf8, 0xf1, 0xe5, - 0x9d, 0xcf, 0x12, 0xe6, 0xff, 0xae, 0xbc, 0xf3, 0x3f, 0x0b, 0xc3, 0x26, 0x1c, 0x65, 0x7b, 0xfd, - 0x7d, 0x33, 0x6b, 0x81, 0x6e, 0x71, 0x99, 0xb6, 0x40, 0x42, 0xed, 0xef, 0x14, 0x60, 0x3e, 0x7d, - 0xe4, 0xcf, 0xdb, 0x9b, 0x82, 0x7c, 0xcd, 0x82, 0x59, 0x27, 0x91, 0xdc, 0x2d, 0xa7, 0x47, 0x6c, - 0x12, 0x34, 0x8d, 0xe4, 0x62, 0x89, 0x72, 0x4c, 0xf1, 0x26, 0x7f, 0x09, 0xa6, 0x22, 0xb7, 0x4d, - 0xfd, 0xae, 0x30, 0x04, 0x16, 0xc4, 0x81, 0x7c, 0x4b, 0x14, 0xa1, 0x82, 0xb1, 0x45, 0xd9, 0xe5, - 0x1a, 0x54, 0x40, 0xa5, 0xdb, 0xed, 0x7c, 0x6c, 0xb9, 0x14, 0xe5, 0xa8, 0x31, 0xc8, 0x03, 0x98, - 0x12, 0x7e, 0x17, 0xca, 0xc1, 0x66, 0x23, 0x27, 0xd3, 0x84, 0x70, 0xed, 0x88, 0xbb, 0x40, 0xfc, - 0x0f, 0x51, 0xb1, 0xb3, 0x3f, 0x06, 0x43, 0x66, 0x60, 0xb5, 0xaf, 0x02, 0x41, 0xbf, 0xd5, 0xda, - 0x76, 0xea, 0x7b, 0x77, 0x5d, 0xaf, 0xe1, 0xdf, 0xe7, 0x4b, 0xd1, 0x32, 0x94, 0x02, 0x19, 0x8f, - 0x1a, 0xca, 0x51, 0xa3, 0xd7, 0x32, 0x15, 0xa8, 0x1a, 0x62, 0x8c, 0x63, 0xff, 0xe1, 0x18, 0x4c, - 0xc9, 0xe0, 0xe9, 0x27, 0xe0, 0xf6, 0xbf, 0x97, 0xb8, 0x0f, 0x5e, 0xcb, 0x25, 0xe6, 0xbb, 0xaf, - 0xcf, 0x7f, 0x98, 0xf2, 0xf9, 0x7f, 0x33, 0x1f, 0x76, 0xc7, 0x3b, 0xfc, 0xff, 0xc1, 0x04, 0xcc, - 0xa5, 0x82, 0xd1, 0x99, 0x2e, 0xde, 0xe3, 0xe7, 0x7a, 0x27, 0xd7, 0x78, 0x77, 0x1d, 0xe8, 0x73, - 0xbc, 0xcb, 0x6b, 0x98, 0xc8, 0x97, 0x7d, 0x3b, 0xb7, 0xa7, 0x40, 0x7e, 0x92, 0x3a, 0x7b, 0x48, - 0x17, 0x4e, 0xf2, 0x2d, 0x0b, 0xce, 0x38, 0xbd, 0x6f, 0xa9, 0x48, 0x9b, 0xe1, 0xed, 0xdc, 0x1f, - 0x69, 0xa9, 0x3e, 0x23, 0x85, 0xcc, 0x7a, 0xb2, 0x06, 0xb3, 0x44, 0xb1, 0xff, 0x93, 0x05, 0x4f, - 0xf7, 0x4d, 0xab, 0xc0, 0xb3, 0x72, 0x05, 0x49, 0xa8, 0x5c, 0x33, 0x72, 0x4e, 0x1e, 0xa3, 0xef, - 0x8f, 0xd3, 0x89, 0x94, 0xd2, 0xec, 0xc9, 0xcb, 0x30, 0xc3, 0x75, 0x34, 0xb6, 0x7a, 0x46, 0xb4, - 0x23, 0xaf, 0xbf, 0xf8, 0x45, 0x48, 0xcd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x2d, 0x0b, 0x16, 0xfa, - 0xe5, 0x68, 0x1a, 0xc0, 0x38, 0xf3, 0x57, 0x53, 0xa1, 0x13, 0xe5, 0x9e, 0xd0, 0x89, 0x94, 0x79, - 0x46, 0x45, 0x49, 0x18, 0x96, 0x91, 0xc2, 0x23, 0x22, 0x03, 0xbe, 0x6e, 0xc1, 0xf9, 0x3e, 0x13, - 0xbe, 0x27, 0x84, 0xc6, 0x7a, 0xec, 0x10, 0x9a, 0xb1, 0x41, 0x43, 0x68, 0xec, 0x3f, 0x2a, 0xc0, - 0xbc, 0x94, 0x27, 0x56, 0xd4, 0x5f, 0x4d, 0x04, 0xa0, 0xfc, 0x54, 0x2a, 0x00, 0xe5, 0x6c, 0x1a, - 0xff, 0x27, 0xd1, 0x27, 0x1f, 0xac, 0xe8, 0x93, 0xbf, 0x18, 0x83, 0x73, 0x99, 0xa9, 0xa3, 0xc8, - 0x57, 0x33, 0x76, 0xaf, 0xbb, 0x39, 0xe7, 0xa8, 0x1a, 0x70, 0xff, 0x1a, 0x35, 0x64, 0xe3, 0x57, - 0xcd, 0x50, 0x09, 0xb1, 0x1b, 0xed, 0x9c, 0x40, 0xb6, 0xad, 0x21, 0xa3, 0x26, 0xec, 0x5f, 0x2a, - 0xc0, 0xe5, 0x41, 0x09, 0x7d, 0x40, 0xa3, 0xea, 0xc2, 0x44, 0x54, 0xdd, 0x13, 0xd2, 0x2c, 0x4e, - 0x24, 0xc0, 0xee, 0x1f, 0x8d, 0xeb, 0x6d, 0xaf, 0x77, 0x7c, 0x0e, 0xe4, 0x2b, 0x31, 0xc5, 0xb4, - 0x4f, 0x95, 0x75, 0x3b, 0x5e, 0x0a, 0xa7, 0x6a, 0xa2, 0xf8, 0xe1, 0x61, 0xf9, 0x74, 0x9c, 0xc0, - 0x44, 0x16, 0xa2, 0xaa, 0x44, 0x2e, 0x43, 0x31, 0x10, 0x50, 0x15, 0x47, 0x24, 0x1d, 0x4e, 0x44, - 0x19, 0x6a, 0x28, 0xf9, 0xa2, 0xa1, 0xae, 0x8f, 0x9f, 0x54, 0x9e, 0x9e, 0xe3, 0xfc, 0x68, 0xde, - 0x86, 0x62, 0xa8, 0x52, 0x43, 0x0b, 0xc5, 0xe5, 0xa5, 0x01, 0xc3, 0xd3, 0xd8, 0x19, 0x5c, 0xe5, - 0x89, 0x16, 0xdf, 0xa7, 0xb3, 0x48, 0x6b, 0x92, 0xc4, 0xd6, 0xc7, 0x5f, 0x61, 0xe7, 0x87, 0xde, - 0xa3, 0x2f, 0x89, 0x60, 0x4a, 0xbe, 0x18, 0x2a, 0x2f, 0x20, 0x37, 0x72, 0x0a, 0x45, 0x91, 0x8e, - 0xca, 0xfc, 0x54, 0xa9, 0xcc, 0x30, 0x8a, 0x95, 0xfd, 0x7d, 0x0b, 0xa6, 0xe5, 0x18, 0x79, 0x02, - 0x71, 0x7a, 0xf7, 0x92, 0x71, 0x7a, 0x57, 0x73, 0x59, 0xb1, 0xfa, 0x04, 0xe9, 0xdd, 0x83, 0x19, - 0x33, 0x67, 0x21, 0xf9, 0xb4, 0xb1, 0xe2, 0x5a, 0xa3, 0x64, 0x01, 0x53, 0x6b, 0x72, 0xbc, 0x1a, - 0xdb, 0xbf, 0x55, 0xd2, 0xad, 0xc8, 0xcf, 0xae, 0xe6, 0xc8, 0xb7, 0x8e, 0x1d, 0xf9, 0xe6, 0xc0, - 0x1b, 0xcb, 0x7f, 0xe0, 0xdd, 0x86, 0xa2, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0x9c, 0xe9, 0xb9, 0xcc, - 0x34, 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0x1a, 0x1b, 0x87, 0xd5, 0x72, 0xad, 0xc9, 0x90, - 0x77, 0x60, 0xfa, 0xbe, 0x1f, 0xec, 0xb5, 0x7c, 0x87, 0xe7, 0xe3, 0x87, 0x3c, 0x2e, 0xcb, 0xb5, - 0x81, 0x57, 0x84, 0x8f, 0xdc, 0x8d, 0xe9, 0xa3, 0xc9, 0x8c, 0x54, 0x60, 0xae, 0xed, 0x7a, 0x48, - 0x9d, 0x86, 0x0e, 0xc7, 0x1b, 0x17, 0xb9, 0xb0, 0x95, 0x6a, 0xbd, 0x91, 0x04, 0x63, 0x1a, 0x9f, - 0x1b, 0x7f, 0x82, 0x84, 0xb5, 0x41, 0x26, 0xbc, 0xdd, 0x1c, 0x7d, 0x30, 0x26, 0x2d, 0x18, 0x22, - 0x7e, 0x22, 0x59, 0x8e, 0x29, 0xde, 0xe4, 0x0b, 0x50, 0x0c, 0x65, 0x42, 0xc2, 0x7c, 0xbc, 0x2c, - 0xf4, 0xd9, 0x5e, 0x10, 0x8d, 0xbb, 0x52, 0x95, 0xa0, 0x66, 0x48, 0xd6, 0xe1, 0xac, 0x32, 0x9f, - 0x24, 0xde, 0x4c, 0x9b, 0x8c, 0xf3, 0x57, 0x61, 0x06, 0x1c, 0x33, 0x6b, 0x31, 0x55, 0x8e, 0xe7, - 0x02, 0x15, 0x97, 0x93, 0xc6, 0x7d, 0x1e, 0x9f, 0x7f, 0x0d, 0x94, 0xd0, 0xe3, 0xa2, 0x4d, 0x8b, - 0x23, 0x44, 0x9b, 0xd6, 0xe0, 0x5c, 0x1a, 0xc4, 0x13, 0x93, 0xf1, 0x5c, 0x68, 0xc6, 0x16, 0xba, - 0x99, 0x85, 0x84, 0xd9, 0x75, 0xc9, 0x5d, 0x28, 0x05, 0x94, 0x1f, 0xb2, 0x2a, 0xca, 0xaf, 0x6b, - 0x68, 0x0f, 0x56, 0x54, 0x04, 0x30, 0xa6, 0xc5, 0xfa, 0xdd, 0x49, 0x66, 0xa7, 0xbe, 0x9d, 0xe3, - 0x63, 0xbd, 0xb2, 0xef, 0xfb, 0x24, 0x0c, 0xb4, 0xff, 0xcd, 0x1c, 0x9c, 0x4a, 0xd8, 0x80, 0xc8, - 0x73, 0x30, 0xc1, 0x33, 0xb5, 0xf1, 0xd5, 0xaa, 0x18, 0xaf, 0xa8, 0xa2, 0x71, 0x04, 0x8c, 0xfc, - 0xb2, 0x05, 0x73, 0x9d, 0xc4, 0x9d, 0x86, 0x5a, 0xc8, 0x47, 0x34, 0x9c, 0x26, 0x2f, 0x4a, 0x8c, - 0x77, 0x1d, 0x92, 0xcc, 0x30, 0xcd, 0x9d, 0xad, 0x07, 0xd2, 0x0d, 0xbc, 0x45, 0x03, 0x8e, 0x2d, - 0x15, 0x3d, 0x4d, 0x62, 0x25, 0x09, 0xc6, 0x34, 0x3e, 0xeb, 0x61, 0xfe, 0x75, 0xa3, 0x3c, 0x07, - 0x59, 0x51, 0x04, 0x30, 0xa6, 0x45, 0x5e, 0x87, 0x59, 0x99, 0x94, 0x78, 0xd3, 0x6f, 0x5c, 0x77, - 0xc2, 0x5d, 0x79, 0xc2, 0xd1, 0x27, 0xb2, 0x95, 0x04, 0x14, 0x53, 0xd8, 0xfc, 0xdb, 0xe2, 0xcc, - 0xcf, 0x9c, 0xc0, 0x64, 0xf2, 0xd9, 0x8b, 0x95, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x45, 0x63, 0x1b, - 0x12, 0x0e, 0x03, 0x7a, 0x35, 0xc8, 0xd8, 0x8a, 0x2a, 0x30, 0xd7, 0xe5, 0x07, 0xc2, 0x86, 0x02, - 0xca, 0xf9, 0xa8, 0x19, 0xde, 0x49, 0x82, 0x31, 0x8d, 0x4f, 0x5e, 0x83, 0x53, 0x01, 0x5b, 0x6c, - 0x35, 0x01, 0xe1, 0x45, 0xa0, 0x2f, 0x89, 0xd1, 0x04, 0x62, 0x12, 0x97, 0xbc, 0x01, 0xa7, 0xe3, - 0x1c, 0x9e, 0x8a, 0x80, 0x70, 0x2b, 0xd0, 0x09, 0xe5, 0x2a, 0x69, 0x04, 0xec, 0xad, 0x43, 0xfe, - 0x06, 0xcc, 0x1b, 0x2d, 0xb1, 0xe6, 0x35, 0xe8, 0x03, 0x99, 0x67, 0x91, 0x3f, 0xe3, 0xb4, 0x92, - 0x82, 0x61, 0x0f, 0x36, 0xf9, 0x24, 0xcc, 0xd6, 0xfd, 0x56, 0x8b, 0xaf, 0x71, 0xe2, 0xc9, 0x05, - 0x91, 0x50, 0x51, 0xa4, 0x9e, 0x4c, 0x40, 0x30, 0x85, 0x49, 0x6e, 0x00, 0xf1, 0xb7, 0x99, 0x7a, - 0x45, 0x1b, 0x6f, 0x50, 0x8f, 0x4a, 0x8d, 0xe3, 0x54, 0x32, 0x08, 0xe5, 0x56, 0x0f, 0x06, 0x66, - 0xd4, 0xe2, 0xf9, 0xe8, 0x8c, 0xa0, 0xdd, 0xd9, 0x3c, 0x9e, 0x46, 0x4c, 0x9b, 0x2f, 0x1e, 0x19, - 0xb1, 0x1b, 0xc0, 0xa4, 0x88, 0x09, 0xca, 0x27, 0xb3, 0xa2, 0x99, 0x7d, 0x3d, 0xde, 0x23, 0x44, - 0x29, 0x4a, 0x4e, 0xe4, 0x17, 0xa0, 0xb4, 0xad, 0x9e, 0xe2, 0xe0, 0xe9, 0x14, 0x47, 0xde, 0x17, - 0x53, 0xaf, 0xca, 0xc4, 0xc7, 0x73, 0x0d, 0xc0, 0x98, 0x25, 0x79, 0x1e, 0xa6, 0xaf, 0x6f, 0x56, - 0xf4, 0x28, 0x3c, 0xcd, 0x7b, 0x7f, 0x9c, 0x55, 0x41, 0x13, 0xc0, 0x66, 0x98, 0x56, 0xdf, 0x48, - 0xf2, 0xa6, 0x3c, 0x43, 0x1b, 0x63, 0xd8, 0xfc, 0xea, 0x1f, 0x6b, 0x0b, 0x67, 0x52, 0xd8, 0xb2, - 0x1c, 0x35, 0x06, 0x79, 0x1b, 0xa6, 0xe5, 0x7e, 0xc1, 0xd7, 0xa6, 0xb3, 0x8f, 0x17, 0x10, 0x8e, - 0x31, 0x09, 0x34, 0xe9, 0xf1, 0x3b, 0x5b, 0xfe, 0x42, 0x01, 0xbd, 0xd6, 0x6d, 0xb5, 0x16, 0xce, - 0xf1, 0x75, 0x33, 0xbe, 0xb3, 0x8d, 0x41, 0x68, 0xe2, 0x91, 0x97, 0x94, 0x0b, 0xd7, 0x87, 0x12, - 0x97, 0xd8, 0xda, 0x85, 0x4b, 0x2b, 0xdd, 0x7d, 0x62, 0x46, 0xce, 0x3f, 0xc2, 0x77, 0x6a, 0x1b, - 0x16, 0x95, 0xc6, 0xd7, 0x3b, 0x49, 0x16, 0x16, 0x12, 0xa6, 0x92, 0xc5, 0xbb, 0x7d, 0x31, 0xf1, - 0x18, 0x2a, 0x64, 0x1b, 0x0a, 0x4e, 0x6b, 0x7b, 0xe1, 0xe9, 0x3c, 0x54, 0xd7, 0xca, 0x7a, 0x55, - 0x8e, 0x28, 0xee, 0xe7, 0x59, 0x59, 0xaf, 0x22, 0x23, 0x4e, 0x5c, 0x18, 0x77, 0x5a, 0xdb, 0xe1, - 0xc2, 0x22, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0xeb, 0xd5, 0x10, 0x39, 0x0b, 0xfb, 0x4b, - 0x63, 0xfa, 0xa2, 0x46, 0x27, 0xb7, 0x7e, 0xd7, 0x9c, 0x40, 0x56, 0x1e, 0x4f, 0xe6, 0xf7, 0x3c, - 0x8d, 0x23, 0xf6, 0xbe, 0xcc, 0xe9, 0xd3, 0xd1, 0x4b, 0x46, 0x2e, 0x59, 0xb1, 0x92, 0x89, 0xbb, - 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xdf, 0x01, 0x6d, 0xf4, 0x4b, 0xb9, 0x3f, 0x05, 0x30, 0xe1, - 0x86, 0x91, 0xeb, 0xe7, 0x18, 0x27, 0x9d, 0xca, 0x78, 0xcd, 0xc3, 0x30, 0x38, 0x00, 0x05, 0x2b, - 0xc6, 0xd3, 0x6b, 0xba, 0xde, 0x03, 0xf9, 0xf9, 0xb7, 0x73, 0xf7, 0x6b, 0x12, 0x3c, 0x39, 0x00, - 0x05, 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, 0x1e, 0x7d, 0x5d, 0x59, 0xaf, 0xa6, 0xf8, 0x25, 0x07, - 0xf7, 0x3d, 0x28, 0x84, 0x6d, 0x57, 0xaa, 0x4b, 0x23, 0xf2, 0xaa, 0x6d, 0xac, 0x65, 0xf1, 0xaa, - 0x6d, 0xac, 0x21, 0x63, 0x42, 0xbe, 0x62, 0x01, 0x38, 0xed, 0x6d, 0x27, 0x0c, 0x9d, 0x86, 0xb6, - 0xce, 0x8c, 0xf8, 0x92, 0x45, 0x45, 0xd3, 0x4b, 0xb1, 0xe6, 0x9e, 0xbc, 0x31, 0x14, 0x0d, 0xce, - 0xe4, 0x1d, 0x98, 0x72, 0xc4, 0x53, 0x81, 0xd2, 0x29, 0x3d, 0x9f, 0xf7, 0x2f, 0x53, 0x12, 0x70, - 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0x77, 0xdc, 0x3d, 0x69, 0x1c, 0xaa, - 0x8d, 0xfc, 0x98, 0x05, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x4f, 0xb7, 0x3b, 0x9e, - 0xa3, 0x43, 0x0d, 0xf3, 0x09, 0x48, 0x35, 0x83, 0x17, 0x8d, 0xa7, 0xdb, 0x4d, 0x46, 0x98, 0xe4, - 0x4b, 0xf6, 0x61, 0xd2, 0xe1, 0x8f, 0x98, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x20, 0x6a, 0xaa, 0x0d, - 0xf8, 0xe2, 0x22, 0x9f, 0x4a, 0x95, 0xdc, 0xc8, 0x6f, 0x58, 0x30, 0x25, 0xfc, 0xa5, 0x99, 0x42, - 0xca, 0xbe, 0xfd, 0x73, 0x27, 0x90, 0x39, 0x5f, 0xfa, 0x72, 0x4b, 0x0f, 0xa0, 0x8f, 0x68, 0x67, - 0x50, 0x51, 0x7a, 0xac, 0x37, 0xb7, 0x92, 0x6e, 0xf1, 0x93, 0x30, 0x63, 0x52, 0x19, 0xca, 0x9f, - 0xfb, 0x87, 0x05, 0x00, 0xde, 0xd0, 0x22, 0xb9, 0x48, 0x9b, 0xa7, 0xf9, 0xdd, 0xf5, 0x1b, 0x39, - 0x3d, 0x78, 0x68, 0xe4, 0x08, 0x01, 0x99, 0xd3, 0x77, 0xd7, 0x6f, 0xa0, 0x64, 0x42, 0x9a, 0x30, - 0xde, 0x71, 0xa2, 0xdd, 0xfc, 0x13, 0x92, 0x14, 0x45, 0x94, 0x6d, 0xb4, 0x8b, 0x9c, 0x01, 0x79, - 0xcf, 0x8a, 0x5d, 0x63, 0x0a, 0xf9, 0x38, 0x30, 0xa8, 0x36, 0x5b, 0x92, 0xce, 0x30, 0xa9, 0x84, - 0x9d, 0x69, 0x17, 0x99, 0xc5, 0xf7, 0x2d, 0x98, 0x31, 0x51, 0x33, 0xba, 0xe9, 0xe7, 0xcd, 0x6e, - 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0xaf, 0x16, 0x40, 0xfc, 0x7c, 0x7f, 0xec, 0xb6, 0x6e, 0x0d, - 0xec, 0xb6, 0x3e, 0x36, 0xa4, 0xdb, 0x7a, 0x61, 0x28, 0xb7, 0xf5, 0xf1, 0xe1, 0xdd, 0xd6, 0x27, - 0xfa, 0xbb, 0xad, 0xdb, 0xdf, 0xb0, 0xe0, 0x74, 0xcf, 0x6e, 0xc3, 0xf4, 0xe0, 0xc0, 0xf7, 0xa3, - 0x3e, 0x2e, 0x8f, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0xab, 0x30, 0x2f, 0x1f, 0xb5, 0xa8, 0x75, 0x5a, - 0x6e, 0x66, 0xb2, 0x98, 0xad, 0x14, 0x1c, 0x7b, 0x6a, 0xd8, 0xdf, 0xb1, 0x60, 0xda, 0x08, 0x31, - 0x67, 0xdf, 0xc1, 0xfd, 0x5e, 0xa5, 0x18, 0xf1, 0x7b, 0x1e, 0xfc, 0xa2, 0x4a, 0xc0, 0xc4, 0x9d, - 0x69, 0xd3, 0x48, 0x79, 0x1e, 0xdf, 0x99, 0xb2, 0x52, 0x94, 0x50, 0x91, 0xcc, 0x9a, 0x76, 0x78, - 0xa3, 0x17, 0xcc, 0x64, 0xd6, 0xb4, 0x83, 0x1c, 0xc2, 0xd9, 0xb1, 0x03, 0x81, 0x74, 0x69, 0x35, - 0x9e, 0x0f, 0x71, 0x82, 0x08, 0x05, 0x8c, 0x5c, 0x80, 0x02, 0xf5, 0x1a, 0xd2, 0x7a, 0xa1, 0x1f, - 0xf8, 0xbc, 0xea, 0x35, 0x90, 0x95, 0xdb, 0xb7, 0x60, 0x46, 0xb8, 0xf3, 0xbe, 0x49, 0x0f, 0x06, - 0x7e, 0x31, 0x94, 0x8d, 0xf6, 0xd4, 0x8b, 0xa1, 0xac, 0x3a, 0x2b, 0xb7, 0xff, 0xa9, 0x05, 0xa9, - 0x37, 0x6e, 0x8c, 0xfb, 0x13, 0xab, 0xef, 0xfd, 0x89, 0x69, 0x73, 0x1f, 0x3b, 0xd6, 0xe6, 0x7e, - 0x03, 0x48, 0x9b, 0x4d, 0x85, 0xc4, 0x8b, 0x4e, 0xd2, 0x70, 0x14, 0x27, 0xb4, 0xe8, 0xc1, 0xc0, - 0x8c, 0x5a, 0xf6, 0x3f, 0x11, 0xc2, 0x9a, 0xaf, 0xde, 0x3c, 0xba, 0x01, 0xba, 0x30, 0xc1, 0x49, - 0x49, 0xeb, 0xd9, 0x88, 0x96, 0xe7, 0xde, 0xc4, 0x50, 0x71, 0x47, 0xca, 0x29, 0xcf, 0xb9, 0xd9, - 0x7f, 0x24, 0x64, 0x35, 0x9e, 0xc5, 0x19, 0x40, 0xd6, 0x76, 0x52, 0xd6, 0xeb, 0x79, 0xad, 0x95, - 0xd9, 0x32, 0x92, 0x25, 0x80, 0x0e, 0x0d, 0xea, 0xd4, 0x8b, 0x54, 0xa0, 0xcd, 0x84, 0x0c, 0xf9, - 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0x5f, 0x67, 0x13, 0x28, 0x7e, 0x4b, 0x97, 0x5c, 0x4e, 0xfb, 0x8a, - 0xa6, 0x27, 0x87, 0x76, 0x15, 0x35, 0xc2, 0x2f, 0xc6, 0x1e, 0x11, 0x7e, 0xf1, 0x02, 0x4c, 0x05, - 0x7e, 0x8b, 0x56, 0x02, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa2, 0x82, 0xdb, 0xbf, 0x66, - 0xc1, 0x7c, 0x3a, 0x3e, 0x2c, 0x77, 0x07, 0x56, 0x33, 0x88, 0xbd, 0x30, 0x7c, 0x10, 0xbb, 0xfd, - 0x1e, 0x13, 0x32, 0x72, 0xeb, 0x7b, 0xae, 0x27, 0xe2, 0xbe, 0x59, 0xcb, 0xbd, 0x00, 0x53, 0x54, - 0xbe, 0x09, 0x2a, 0x8c, 0xc0, 0x5a, 0x48, 0xf5, 0x14, 0xa8, 0x82, 0x93, 0x0a, 0xcc, 0xa9, 0xab, - 0x2f, 0x65, 0xb9, 0x17, 0xf9, 0x2a, 0xb4, 0xa5, 0x70, 0x35, 0x09, 0xc6, 0x34, 0xbe, 0xfd, 0x45, - 0x98, 0x36, 0x36, 0x25, 0xbe, 0x7e, 0x3f, 0x70, 0xea, 0x51, 0x7a, 0xdd, 0xbb, 0xca, 0x0a, 0x51, - 0xc0, 0xf8, 0x05, 0x83, 0x08, 0x5f, 0x49, 0xad, 0x7b, 0x32, 0x68, 0x45, 0x42, 0x19, 0xb1, 0x80, - 0x36, 0xe9, 0x03, 0x95, 0x91, 0x5e, 0x11, 0x43, 0x56, 0x88, 0x02, 0x66, 0xbf, 0x08, 0x45, 0x95, - 0x55, 0x88, 0xa7, 0xe6, 0x50, 0xc6, 0x6f, 0x33, 0x35, 0x87, 0x1f, 0x44, 0xc8, 0x21, 0xf6, 0x5b, - 0x50, 0x54, 0xc9, 0x8f, 0x1e, 0x8d, 0xcd, 0x96, 0xa2, 0xd0, 0x73, 0xaf, 0xfb, 0x61, 0xa4, 0x32, - 0x36, 0x89, 0xfb, 0xb9, 0x9b, 0x6b, 0xbc, 0x0c, 0x35, 0xd4, 0x7e, 0x09, 0xe6, 0x52, 0xf7, 0xb4, - 0x03, 0xe4, 0xf1, 0xf8, 0xbd, 0x02, 0xcc, 0x98, 0xd7, 0x75, 0x03, 0xcc, 0xe2, 0xc1, 0x17, 0xc7, - 0x8c, 0x2b, 0xb6, 0xc2, 0x90, 0x57, 0x6c, 0xe6, 0x9d, 0xe6, 0xf8, 0xc9, 0xde, 0x69, 0x4e, 0xe4, - 0x73, 0xa7, 0x69, 0xdc, 0xbd, 0x4f, 0x3e, 0xb9, 0xbb, 0xf7, 0xdf, 0x99, 0x80, 0xd9, 0x64, 0x62, - 0xc8, 0x01, 0x7a, 0xf2, 0xc5, 0x9e, 0x9e, 0x1c, 0xd2, 0xa6, 0x5f, 0x18, 0xd5, 0xa6, 0x3f, 0x3e, - 0xaa, 0x4d, 0x7f, 0xe2, 0x31, 0x6c, 0xfa, 0xbd, 0x16, 0xf9, 0xc9, 0x81, 0x2d, 0xf2, 0x9f, 0xd2, - 0x5e, 0x79, 0x53, 0x09, 0x37, 0x96, 0xd8, 0x2b, 0x8f, 0x24, 0xbb, 0x61, 0xc5, 0x6f, 0x64, 0x7a, - 0x37, 0x16, 0x1f, 0x61, 0xbb, 0x0c, 0x32, 0x9d, 0xe8, 0x86, 0xbf, 0x36, 0xfc, 0xd0, 0x10, 0x0e, - 0x74, 0xaf, 0xc0, 0xb4, 0x1c, 0x4f, 0x5c, 0x05, 0x85, 0xa4, 0xfa, 0x5a, 0x8b, 0x41, 0x68, 0xe2, - 0xf1, 0x47, 0xd5, 0x93, 0x4f, 0xed, 0xf3, 0x2b, 0x12, 0xf3, 0x51, 0xf5, 0xd4, 0xd3, 0xfc, 0x69, - 0x7c, 0xfb, 0x0b, 0x70, 0x2e, 0xd3, 0x8c, 0xc0, 0x4d, 0xb8, 0x5c, 0x3b, 0xa2, 0x0d, 0x89, 0x60, - 0x88, 0x91, 0x7a, 0x8c, 0x61, 0xf1, 0x6e, 0x5f, 0x4c, 0x3c, 0x86, 0x8a, 0xfd, 0xed, 0x02, 0xcc, - 0x26, 0x5f, 0xe4, 0x24, 0xf7, 0xb5, 0xd1, 0x31, 0x17, 0x7b, 0xa7, 0x20, 0x6b, 0x24, 0x1b, 0xec, - 0x7b, 0x59, 0x71, 0x9f, 0x8f, 0xaf, 0x6d, 0x9d, 0xf9, 0xf0, 0xe4, 0x18, 0xcb, 0x5b, 0x02, 0xc9, - 0x8e, 0x3f, 0xba, 0x19, 0xc7, 0x25, 0xca, 0xd3, 0x6c, 0xee, 0xdc, 0xe3, 0xf8, 0x3a, 0xcd, 0x0a, - 0x0d, 0xb6, 0x6c, 0x6f, 0xd9, 0xa7, 0x81, 0xbb, 0xe3, 0xea, 0xd7, 0xc4, 0xf9, 0xca, 0xfd, 0x96, - 0x2c, 0x43, 0x0d, 0xb5, 0xdf, 0x1b, 0x83, 0x12, 0x4f, 0xa3, 0x74, 0x2d, 0xf0, 0xdb, 0xfc, 0xd9, - 0xba, 0xd0, 0x38, 0x39, 0xc8, 0x6e, 0xbb, 0x31, 0xea, 0xdb, 0x90, 0x31, 0x45, 0xe9, 0x31, 0x6d, - 0x94, 0x60, 0x82, 0x23, 0xe9, 0x40, 0x71, 0x47, 0xa6, 0x7d, 0x95, 0x7d, 0x37, 0x62, 0xea, 0x42, - 0x95, 0x44, 0x56, 0x34, 0x81, 0xfa, 0x87, 0x9a, 0x8b, 0xed, 0xc0, 0x5c, 0x2a, 0x0f, 0x46, 0xee, - 0xc9, 0x62, 0xff, 0xc7, 0x38, 0x94, 0x74, 0xb8, 0x0e, 0xf9, 0x44, 0xc2, 0x8c, 0x53, 0xaa, 0x7e, - 0xd8, 0x78, 0x53, 0x69, 0xd7, 0x6f, 0x3c, 0x3c, 0x2c, 0xcf, 0x69, 0xe4, 0x94, 0x49, 0xe6, 0x02, - 0x14, 0xba, 0x41, 0x2b, 0x7d, 0x4e, 0xbb, 0x83, 0xeb, 0xc8, 0xca, 0xcd, 0x10, 0xa3, 0xc2, 0x13, - 0x0d, 0x31, 0x62, 0xbb, 0xe4, 0xb6, 0xdf, 0x38, 0x48, 0xbf, 0xc1, 0x54, 0xf5, 0x1b, 0x07, 0xc8, - 0x21, 0xe4, 0x75, 0x98, 0x95, 0x71, 0x53, 0xe6, 0xcb, 0xf4, 0x85, 0xf8, 0xf2, 0x7d, 0x2b, 0x01, - 0xc5, 0x14, 0x36, 0xdb, 0x65, 0xef, 0x85, 0xbe, 0xc7, 0x53, 0x00, 0x4f, 0x26, 0x6f, 0xea, 0x6e, - 0xd4, 0x6e, 0xdd, 0xe4, 0xe6, 0x24, 0x8d, 0x91, 0x08, 0xcd, 0x9a, 0x7a, 0x64, 0x68, 0xd6, 0xaa, - 0xa0, 0xcd, 0xa4, 0xe5, 0x3b, 0xca, 0x4c, 0xf5, 0xb2, 0xa2, 0xcb, 0xca, 0x1e, 0x1e, 0x1e, 0x63, - 0xe8, 0xd3, 0x35, 0xb3, 0x82, 0xd8, 0x4a, 0x3f, 0xbe, 0x20, 0x36, 0xfb, 0x0e, 0xcc, 0xa5, 0xfa, - 0x4f, 0x1d, 0xf3, 0xad, 0xec, 0x63, 0xfe, 0x60, 0xaf, 0x38, 0xfd, 0x33, 0x0b, 0x4e, 0xf7, 0xac, - 0x48, 0x83, 0x46, 0x13, 0xa6, 0xf7, 0xc6, 0xb1, 0xc7, 0xdf, 0x1b, 0x0b, 0xc3, 0xed, 0x8d, 0xd5, - 0xed, 0xef, 0xfe, 0xe0, 0xe2, 0x53, 0xdf, 0xfb, 0xc1, 0xc5, 0xa7, 0xfe, 0xf8, 0x07, 0x17, 0x9f, - 0x7a, 0xef, 0xe8, 0xa2, 0xf5, 0xdd, 0xa3, 0x8b, 0xd6, 0xf7, 0x8e, 0x2e, 0x5a, 0x7f, 0x7c, 0x74, - 0xd1, 0xfa, 0x8f, 0x47, 0x17, 0xad, 0x6f, 0xfc, 0xf9, 0xc5, 0xa7, 0x3e, 0xfd, 0xa9, 0xb8, 0xa7, - 0x96, 0x55, 0x4f, 0xf1, 0x1f, 0x1f, 0x55, 0xfd, 0xb2, 0xdc, 0xd9, 0x6b, 0x2e, 0xb3, 0x9e, 0x5a, - 0xd6, 0x25, 0xaa, 0xa7, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0x97, 0x00, 0x96, - 0xa2, 0x00, 0x00, + // 8536 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, + 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x6a, 0xb8, 0x24, 0xf7, 0xed, 0xee, 0x1d, 0x8f, 0x77, 0xb7, + 0xb3, 0xea, 0x73, 0x2e, 0x7b, 0xd6, 0x89, 0x94, 0xf6, 0xee, 0x92, 0x93, 0x4e, 0xb9, 0x64, 0x86, + 0xdc, 0xbd, 0xe5, 0x1e, 0xb9, 0xcb, 0xad, 0xe1, 0xde, 0xda, 0x92, 0xce, 0x56, 0x73, 0xe6, 0x71, + 0xd8, 0xcb, 0x99, 0xee, 0x51, 0x77, 0x0f, 0x77, 0x79, 0x3a, 0x58, 0x27, 0x0b, 0xa7, 0x28, 0x86, + 0x04, 0x2b, 0xb1, 0x85, 0x20, 0x48, 0x10, 0x28, 0x86, 0x01, 0x27, 0xb1, 0x7f, 0x04, 0x86, 0x83, + 0xe4, 0x87, 0x81, 0x08, 0x71, 0x6c, 0x2b, 0x40, 0x1c, 0xc8, 0x3f, 0x12, 0x39, 0x01, 0x4c, 0x47, + 0x74, 0xfe, 0x24, 0x48, 0x20, 0x24, 0x50, 0x60, 0x78, 0x7f, 0x04, 0xc1, 0xfb, 0xec, 0xd7, 0x3d, + 0x3d, 0x5c, 0x0e, 0xa7, 0xb9, 0x52, 0x12, 0xfd, 0x9b, 0x79, 0x55, 0xaf, 0xaa, 0xfa, 0x7d, 0xd6, + 0xab, 0x57, 0x55, 0x0f, 0xd6, 0x5a, 0x6e, 0xb4, 0xd3, 0xdb, 0x5a, 0x6c, 0xf8, 0x9d, 0x25, 0x27, + 0x68, 0xf9, 0xdd, 0xc0, 0xbf, 0xc7, 0x7f, 0x7c, 0x24, 0xf0, 0xdb, 0x6d, 0xbf, 0x17, 0x85, 0x4b, + 0xdd, 0xdd, 0xd6, 0x92, 0xd3, 0x75, 0xc3, 0x25, 0x5d, 0xb2, 0xf7, 0x31, 0xa7, 0xdd, 0xdd, 0x71, + 0x3e, 0xb6, 0xd4, 0xa2, 0x1e, 0x0d, 0x9c, 0x88, 0x36, 0x17, 0xbb, 0x81, 0x1f, 0xf9, 0xe4, 0x93, + 0x31, 0xb5, 0x45, 0x45, 0x8d, 0xff, 0xf8, 0x59, 0x55, 0x77, 0xb1, 0xbb, 0xdb, 0x5a, 0x64, 0xd4, + 0x16, 0x75, 0x89, 0xa2, 0xb6, 0xf0, 0x11, 0x43, 0x96, 0x96, 0xdf, 0xf2, 0x97, 0x38, 0xd1, 0xad, + 0xde, 0x36, 0xff, 0xc7, 0xff, 0xf0, 0x5f, 0x82, 0xd9, 0xc2, 0xf3, 0xbb, 0xaf, 0x85, 0x8b, 0xae, + 0xcf, 0x64, 0x5b, 0xda, 0x72, 0xa2, 0xc6, 0xce, 0xd2, 0x5e, 0x9f, 0x44, 0x0b, 0xb6, 0x81, 0xd4, + 0xf0, 0x03, 0x9a, 0x85, 0xf3, 0x4a, 0x8c, 0xd3, 0x71, 0x1a, 0x3b, 0xae, 0x47, 0x83, 0xfd, 0xf8, + 0xab, 0x3b, 0x34, 0x72, 0xb2, 0x6a, 0x2d, 0x0d, 0xaa, 0x15, 0xf4, 0xbc, 0xc8, 0xed, 0xd0, 0xbe, + 0x0a, 0x7f, 0xe9, 0x51, 0x15, 0xc2, 0xc6, 0x0e, 0xed, 0x38, 0x7d, 0xf5, 0x5e, 0x1e, 0x54, 0xaf, + 0x17, 0xb9, 0xed, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0xbf, 0x5f, 0x80, 0x52, 0x75, + 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0x2f, 0x5b, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, + 0x3b, 0x5e, 0x83, 0x06, 0xf3, 0xd6, 0x25, 0xeb, 0x72, 0xf9, 0xca, 0xda, 0xe2, 0x28, 0xfd, 0xb5, + 0x58, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0xb7, 0x6b, 0xe7, 0xbf, 0x7d, 0x50, + 0x79, 0xe2, 0xf0, 0xa0, 0x32, 0xbd, 0x66, 0x70, 0xc2, 0x04, 0x5f, 0xf2, 0x0d, 0x0b, 0xce, 0x36, + 0x1c, 0xcf, 0x09, 0xf6, 0x37, 0x9d, 0xa0, 0x45, 0xa3, 0x37, 0x03, 0xbf, 0xd7, 0x9d, 0x1f, 0x3b, + 0x05, 0x69, 0x9e, 0x96, 0xd2, 0x9c, 0x5d, 0x4e, 0xb3, 0xc3, 0x7e, 0x09, 0xb8, 0x5c, 0x61, 0xe4, + 0x6c, 0xb5, 0xa9, 0x29, 0x57, 0xe1, 0x34, 0xe5, 0xaa, 0xa7, 0xd9, 0x61, 0xbf, 0x04, 0xe4, 0x45, + 0x98, 0x74, 0xbd, 0x56, 0x40, 0xc3, 0x70, 0x7e, 0xfc, 0x92, 0x75, 0xb9, 0x54, 0x9b, 0x95, 0xd5, + 0x27, 0x57, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0x9b, 0x05, 0x38, 0x5b, 0x5d, 0xab, 0x6d, 0x06, 0xce, + 0xf6, 0xb6, 0xdb, 0x40, 0xbf, 0x17, 0xb9, 0x5e, 0xcb, 0x24, 0x60, 0x1d, 0x4d, 0x80, 0xbc, 0x0a, + 0xe5, 0x90, 0x06, 0x7b, 0x6e, 0x83, 0x6e, 0xf8, 0x41, 0xc4, 0x3b, 0xa5, 0x58, 0x3b, 0x27, 0xd1, + 0xcb, 0xf5, 0x18, 0x84, 0x26, 0x1e, 0xab, 0x16, 0xf8, 0x7e, 0x24, 0xe1, 0xbc, 0xcd, 0x4a, 0x71, + 0x35, 0x8c, 0x41, 0x68, 0xe2, 0x91, 0x15, 0x98, 0x73, 0x3c, 0xcf, 0x8f, 0x9c, 0xc8, 0xf5, 0xbd, + 0x8d, 0x80, 0x6e, 0xbb, 0x0f, 0xe4, 0x27, 0xce, 0xcb, 0xba, 0x73, 0xd5, 0x14, 0x1c, 0xfb, 0x6a, + 0x90, 0xaf, 0x5b, 0x30, 0x17, 0x46, 0x6e, 0x63, 0xd7, 0xf5, 0x68, 0x18, 0x2e, 0xfb, 0xde, 0xb6, + 0xdb, 0x9a, 0x2f, 0xf2, 0x6e, 0xbb, 0x39, 0x5a, 0xb7, 0xd5, 0x53, 0x54, 0x6b, 0xe7, 0x99, 0x48, + 0xe9, 0x52, 0xec, 0xe3, 0x4e, 0x3e, 0x0c, 0x25, 0xd9, 0xa2, 0x34, 0x9c, 0x9f, 0xb8, 0x54, 0xb8, + 0x5c, 0xaa, 0x9d, 0x39, 0x3c, 0xa8, 0x94, 0x56, 0x55, 0x21, 0xc6, 0x70, 0x7b, 0x05, 0xe6, 0xab, + 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0x1f, 0xa4, 0xba, 0xee, 0x32, 0x4c, 0x75, 0x9c, 0x6e, 0xd7, + 0xf5, 0x5a, 0xac, 0xef, 0x18, 0x9d, 0xe9, 0xc3, 0x83, 0xca, 0xd4, 0xba, 0x2c, 0x43, 0x0d, 0xb5, + 0xff, 0xc3, 0x18, 0x94, 0xab, 0x9e, 0xd3, 0xde, 0x0f, 0xdd, 0x10, 0x7b, 0x1e, 0xf9, 0x2c, 0x4c, + 0xb1, 0x55, 0xab, 0xe9, 0x44, 0x8e, 0x9c, 0xe9, 0x1f, 0x5d, 0x14, 0x8b, 0xc8, 0xa2, 0xb9, 0x88, + 0xc4, 0x9f, 0xcf, 0xb0, 0x17, 0xf7, 0x3e, 0xb6, 0x78, 0x6b, 0xeb, 0x1e, 0x6d, 0x44, 0xeb, 0x34, + 0x72, 0x6a, 0x44, 0xf6, 0x02, 0xc4, 0x65, 0xa8, 0xa9, 0x12, 0x1f, 0xc6, 0xc3, 0x2e, 0x6d, 0xc8, + 0x99, 0xbb, 0x3e, 0xe2, 0x0c, 0x89, 0x45, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2d, 0x59, 0x8f, 0xb3, + 0x7f, 0xc8, 0x19, 0x91, 0xfb, 0x30, 0x11, 0xf2, 0xb5, 0x4c, 0x4e, 0xca, 0x5b, 0xf9, 0xb1, 0xe4, + 0x64, 0x6b, 0x33, 0x92, 0xe9, 0x84, 0xf8, 0x8f, 0x92, 0x9d, 0xfd, 0x1f, 0x2d, 0x38, 0x67, 0x60, + 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x5c, 0x82, 0x71, 0xcf, 0xe9, 0x50, 0x39, 0xab, 0xb4, + 0xc8, 0x37, 0x9d, 0x0e, 0x45, 0x0e, 0x21, 0xcf, 0x43, 0x71, 0xcf, 0x69, 0xf7, 0x28, 0x6f, 0xa4, + 0x52, 0xed, 0x8c, 0x44, 0x29, 0xbe, 0xcd, 0x0a, 0x51, 0xc0, 0xc8, 0x7b, 0x50, 0xe2, 0x3f, 0xae, + 0x05, 0x7e, 0x27, 0xa7, 0x4f, 0x93, 0x12, 0xbe, 0xad, 0xc8, 0x8a, 0xe1, 0xa7, 0xff, 0x62, 0xcc, + 0xd0, 0xfe, 0x13, 0x0b, 0x66, 0x8d, 0x8f, 0x5b, 0x73, 0xc3, 0x88, 0x7c, 0xa6, 0x6f, 0xf0, 0x2c, + 0x1e, 0x6f, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0xcc, 0xc9, 0x2f, 0x9d, 0x52, 0x25, 0xc6, 0xc0, 0xf1, + 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8f, 0x5d, 0x2a, 0x5c, 0x2e, 0x5f, 0x59, 0xcd, 0xad, 0x1b, + 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xab, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, + 0x07, 0x16, 0x4c, 0xb4, 0x9d, 0x2d, 0xda, 0x16, 0x73, 0xab, 0x7c, 0xe5, 0x9d, 0xdc, 0x24, 0x51, + 0x3c, 0x16, 0xd7, 0x38, 0xfd, 0xab, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, + 0xfe, 0x8e, 0x05, 0xe5, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x95, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, + 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0x85, 0x8f, 0x43, 0xd9, 0xf8, 0x04, 0x32, 0x07, 0x85, + 0x5d, 0xba, 0x2f, 0x06, 0x3c, 0xb2, 0x9f, 0xe4, 0x7c, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0x89, 0xb1, + 0xd7, 0xac, 0x85, 0x37, 0x60, 0x2e, 0xcd, 0x70, 0x98, 0xfa, 0xf6, 0x3f, 0x29, 0x26, 0x06, 0x26, + 0x5b, 0x08, 0x88, 0x0f, 0x93, 0x1d, 0x1a, 0x05, 0x6e, 0x43, 0x75, 0xd9, 0xca, 0x68, 0xad, 0xb4, + 0xce, 0x89, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xe2, 0x42, 0x76, 0x60, 0xdc, 0x09, 0x5a, 0xaa, + 0x4f, 0xae, 0xe5, 0x33, 0x2d, 0xe3, 0xa5, 0xa2, 0x1a, 0xb4, 0x42, 0xe4, 0x1c, 0xc8, 0x12, 0x94, + 0x22, 0x1a, 0x74, 0x5c, 0xcf, 0x89, 0xc4, 0x0e, 0x3a, 0x55, 0x3b, 0x2b, 0xd1, 0x4a, 0x9b, 0x0a, + 0x80, 0x31, 0x0e, 0x69, 0xc3, 0x44, 0x33, 0xd8, 0xc7, 0x9e, 0x37, 0x3f, 0x9e, 0x47, 0x53, 0xac, + 0x70, 0x5a, 0xf1, 0x20, 0x15, 0xff, 0x51, 0xf2, 0x20, 0xbf, 0x6a, 0xc1, 0xf9, 0x0e, 0x75, 0xc2, + 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x3a, 0x76, 0xbe, 0xc8, 0x99, 0xe3, 0xa8, 0xfd, + 0xd0, 0x4f, 0xb9, 0xf6, 0xac, 0x14, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xa5, 0x21, 0xef, 0x41, 0x39, + 0x8a, 0xda, 0xf5, 0x88, 0xe9, 0xc1, 0xad, 0xfd, 0xf9, 0x09, 0xbe, 0x78, 0x8d, 0xb8, 0xc2, 0x6c, + 0x6e, 0xae, 0x29, 0x82, 0xb5, 0x59, 0x36, 0x5b, 0x8c, 0x02, 0x34, 0xd9, 0xd9, 0xff, 0xbc, 0x08, + 0x67, 0xfb, 0xb6, 0x15, 0xf2, 0x0a, 0x14, 0xbb, 0x3b, 0x4e, 0xa8, 0xf6, 0x89, 0x8b, 0x6a, 0x91, + 0xda, 0x60, 0x85, 0x0f, 0x0f, 0x2a, 0x67, 0x54, 0x15, 0x5e, 0x80, 0x02, 0x99, 0x69, 0x6d, 0x1d, + 0x1a, 0x86, 0x4e, 0x4b, 0x6d, 0x1e, 0xc6, 0x20, 0xe5, 0xc5, 0xa8, 0xe0, 0xe4, 0xaf, 0x5b, 0x70, + 0x46, 0x0c, 0x58, 0xa4, 0x61, 0xaf, 0x1d, 0xb1, 0x0d, 0x92, 0x75, 0xca, 0x8d, 0x3c, 0x26, 0x87, + 0x20, 0x59, 0xbb, 0x20, 0xb9, 0x9f, 0x31, 0x4b, 0x43, 0x4c, 0xf2, 0x25, 0x77, 0xa1, 0x14, 0x46, + 0x4e, 0x10, 0xd1, 0x66, 0x35, 0xe2, 0xaa, 0x5c, 0xf9, 0xca, 0x4f, 0x1e, 0x6f, 0xe7, 0xd8, 0x74, + 0x3b, 0x54, 0xec, 0x52, 0x75, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x3d, 0x80, 0xa0, 0xe7, 0xd5, 0x7b, + 0x9d, 0x8e, 0x13, 0xec, 0x4b, 0xed, 0xee, 0xfa, 0x68, 0x9f, 0x87, 0x9a, 0x5e, 0xac, 0xe8, 0xc4, + 0x65, 0x68, 0xf0, 0x23, 0x5f, 0xb4, 0xe0, 0x8c, 0x98, 0x07, 0x4a, 0x82, 0x89, 0x9c, 0x25, 0x38, + 0xcb, 0x9a, 0x76, 0xc5, 0x64, 0x81, 0x49, 0x8e, 0xe4, 0x1d, 0x28, 0x37, 0xfc, 0x4e, 0xb7, 0x4d, + 0x45, 0xe3, 0x4e, 0x0e, 0xdd, 0xb8, 0x7c, 0xe8, 0x2e, 0xc7, 0x24, 0xd0, 0xa4, 0x67, 0xff, 0xbb, + 0xa4, 0x8e, 0xa3, 0x86, 0x34, 0xf9, 0x34, 0x3c, 0x1d, 0xf6, 0x1a, 0x0d, 0x1a, 0x86, 0xdb, 0xbd, + 0x36, 0xf6, 0xbc, 0xeb, 0x6e, 0x18, 0xf9, 0xc1, 0xfe, 0x9a, 0xdb, 0x71, 0x23, 0x3e, 0xa0, 0x8b, + 0xb5, 0xe7, 0x0e, 0x0f, 0x2a, 0x4f, 0xd7, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0x67, 0x7a, + 0xde, 0x60, 0xf2, 0xe2, 0xf8, 0x51, 0x39, 0x3c, 0xa8, 0x3c, 0x73, 0x67, 0x30, 0x1a, 0x1e, 0x45, + 0xc3, 0xfe, 0xaf, 0x16, 0xdb, 0x86, 0xc4, 0x77, 0x6d, 0xd2, 0x4e, 0xb7, 0xcd, 0x96, 0xce, 0xd3, + 0x57, 0x8e, 0xa3, 0x84, 0x72, 0x8c, 0xf9, 0xec, 0xe5, 0x4a, 0xfe, 0x41, 0x1a, 0xb2, 0xfd, 0x5f, + 0x2c, 0x38, 0x9f, 0x46, 0x7e, 0x0c, 0x0a, 0x5d, 0x98, 0x54, 0xe8, 0x6e, 0xe6, 0xfb, 0xb5, 0x03, + 0xb4, 0xba, 0x2f, 0x8f, 0xf7, 0x7f, 0xeb, 0xff, 0xeb, 0x3a, 0x42, 0xbc, 0xe5, 0x17, 0x7e, 0x98, + 0x5b, 0xfe, 0xf8, 0x8f, 0xd2, 0x96, 0x6f, 0xff, 0xc3, 0x71, 0x98, 0xae, 0x7a, 0x91, 0x5b, 0xdd, + 0xde, 0x76, 0x3d, 0x37, 0xda, 0x27, 0x5f, 0x1d, 0x83, 0xa5, 0x6e, 0x40, 0xb7, 0x69, 0x10, 0xd0, + 0xe6, 0x4a, 0x2f, 0x70, 0xbd, 0x56, 0xbd, 0xb1, 0x43, 0x9b, 0xbd, 0xb6, 0xeb, 0xb5, 0x56, 0x5b, + 0x9e, 0xaf, 0x8b, 0xaf, 0x3e, 0xa0, 0x8d, 0x1e, 0xff, 0x24, 0x31, 0x29, 0x3a, 0xa3, 0x7d, 0xd2, + 0xc6, 0x70, 0x4c, 0x6b, 0x2f, 0x1f, 0x1e, 0x54, 0x96, 0x86, 0xac, 0x84, 0xc3, 0x7e, 0x1a, 0xf9, + 0xca, 0x18, 0x2c, 0x06, 0xf4, 0x73, 0x3d, 0xf7, 0xf8, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, + 0xdb, 0x50, 0x3c, 0x6b, 0x57, 0x0e, 0x0f, 0x2a, 0x43, 0xd6, 0xc1, 0x21, 0xbf, 0xcb, 0xde, 0x80, + 0x72, 0xb5, 0xeb, 0x86, 0xee, 0x03, 0xf4, 0x7b, 0x11, 0x3d, 0xc6, 0xf9, 0xbd, 0x02, 0xc5, 0xa0, + 0xd7, 0xa6, 0x62, 0x6e, 0x97, 0x6a, 0x25, 0xb6, 0x0a, 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x3c, + 0x5b, 0x71, 0x39, 0xc9, 0x94, 0xe5, 0xe6, 0x1e, 0x14, 0x03, 0xc6, 0x44, 0x8e, 0xac, 0x51, 0x0f, + 0xb9, 0xb1, 0xd4, 0x52, 0x08, 0xf6, 0x13, 0x05, 0x0b, 0xfb, 0x77, 0xc6, 0xe0, 0x42, 0xb5, 0xdb, + 0x5d, 0xa7, 0xe1, 0x4e, 0x4a, 0x8a, 0x5f, 0xb4, 0x60, 0x66, 0xcf, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, + 0xc6, 0x39, 0x21, 0x4f, 0x7d, 0x54, 0x79, 0x38, 0xb7, 0xb7, 0x13, 0xa4, 0x6b, 0xe4, 0xf0, 0xa0, + 0x32, 0x93, 0x2c, 0xc3, 0x14, 0x7b, 0xf2, 0xb7, 0x2d, 0x98, 0x93, 0x45, 0x37, 0xfd, 0x26, 0x35, + 0x8d, 0xbf, 0x77, 0xf2, 0x94, 0x49, 0x13, 0x17, 0x46, 0xbb, 0x74, 0x29, 0xf6, 0x09, 0x61, 0xff, + 0xf7, 0x31, 0x78, 0x6a, 0x00, 0x0d, 0xf2, 0x6b, 0x16, 0x9c, 0x17, 0x16, 0x63, 0x03, 0x84, 0x74, + 0x5b, 0xb6, 0xe6, 0x4f, 0xe7, 0x2d, 0x39, 0xb2, 0x29, 0x4e, 0xbd, 0x06, 0xad, 0xcd, 0xb3, 0xd5, + 0x70, 0x39, 0x83, 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, 0x36, 0xe4, 0x94, 0xa4, 0x63, 0x8f, 0x45, + 0xd2, 0x7a, 0x06, 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0xab, 0xf0, 0xcc, 0x11, 0xe4, 0x1e, 0x3d, 0x39, + 0xed, 0x77, 0xf4, 0xa8, 0x4f, 0x8e, 0xb9, 0x63, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, + 0x1b, 0xd8, 0xf6, 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x8e, 0x05, 0x53, 0x43, 0x98, 0xfa, + 0x2a, 0x49, 0x53, 0x5f, 0xa9, 0xcf, 0xcc, 0x17, 0xf5, 0x9b, 0xf9, 0xde, 0x1c, 0xad, 0x37, 0x8e, + 0x63, 0xde, 0xfb, 0xbe, 0x05, 0x67, 0xfb, 0xcc, 0x81, 0x64, 0x07, 0xce, 0x77, 0xfd, 0xa6, 0x52, + 0x9b, 0xae, 0x3b, 0xe1, 0x0e, 0x87, 0xc9, 0xcf, 0x7b, 0x85, 0xf5, 0xe4, 0x46, 0x06, 0xfc, 0xe1, + 0x41, 0x65, 0x5e, 0x13, 0x49, 0x21, 0x60, 0x26, 0x45, 0xd2, 0x85, 0xa9, 0x6d, 0x97, 0xb6, 0x9b, + 0xf1, 0x10, 0x1c, 0x51, 0x41, 0xba, 0x26, 0xa9, 0x09, 0x4b, 0xb8, 0xfa, 0x87, 0x9a, 0x8b, 0xfd, + 0x03, 0x0b, 0x66, 0xaa, 0xbd, 0x68, 0x87, 0xa9, 0x07, 0x0d, 0x6e, 0x7c, 0x22, 0x1e, 0x14, 0x43, + 0xb7, 0xb5, 0xf7, 0x4a, 0x3e, 0x8b, 0x71, 0x9d, 0x91, 0x92, 0x37, 0x02, 0x5a, 0x37, 0xe5, 0x85, + 0x28, 0xd8, 0x90, 0x00, 0x26, 0x7c, 0xa7, 0x17, 0xed, 0x5c, 0x91, 0x9f, 0x3c, 0xe2, 0x41, 0xfc, + 0x16, 0xfb, 0x9c, 0x2b, 0x92, 0xa3, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4e, 0xf6, 0x17, 0x60, 0x26, + 0x79, 0xcd, 0x74, 0x8c, 0x31, 0xfb, 0x1c, 0x14, 0x9c, 0xc0, 0x93, 0x23, 0xb6, 0x2c, 0x11, 0x0a, + 0x55, 0xbc, 0x89, 0xac, 0x9c, 0xbc, 0x04, 0x53, 0xdb, 0xbd, 0x76, 0x9b, 0x55, 0x90, 0x77, 0x3a, + 0xfa, 0x14, 0x70, 0x4d, 0x96, 0xa3, 0xc6, 0xb0, 0xff, 0x7c, 0x1c, 0x66, 0x6b, 0xed, 0x1e, 0x7d, + 0x33, 0xa0, 0x54, 0x99, 0x3e, 0xaa, 0x30, 0xdb, 0x0d, 0xe8, 0x9e, 0x4b, 0xef, 0xd7, 0x69, 0x9b, + 0x36, 0x22, 0x3f, 0x90, 0xd2, 0x3c, 0x25, 0x09, 0xcd, 0x6e, 0x24, 0xc1, 0x98, 0xc6, 0x27, 0x6f, + 0xc0, 0x8c, 0xd3, 0x88, 0xdc, 0x3d, 0xaa, 0x29, 0x08, 0x71, 0x9f, 0x94, 0x14, 0x66, 0xaa, 0x09, + 0x28, 0xa6, 0xb0, 0xc9, 0x67, 0x60, 0x3e, 0x6c, 0x38, 0x6d, 0x7a, 0xa7, 0x2b, 0x59, 0x2d, 0xef, + 0xd0, 0xc6, 0xee, 0x86, 0xef, 0x7a, 0x91, 0x34, 0xb3, 0x5d, 0x92, 0x94, 0xe6, 0xeb, 0x03, 0xf0, + 0x70, 0x20, 0x05, 0xf2, 0x2f, 0x2c, 0x78, 0xae, 0x1b, 0xd0, 0x8d, 0xc0, 0xef, 0xf8, 0x6c, 0xa8, + 0xf5, 0x59, 0x7f, 0xa4, 0x15, 0xe4, 0xed, 0x11, 0x75, 0x29, 0x51, 0xd2, 0x7f, 0x65, 0xf1, 0xa1, + 0xc3, 0x83, 0xca, 0x73, 0x1b, 0x47, 0x09, 0x80, 0x47, 0xcb, 0x47, 0xfe, 0xa5, 0x05, 0x17, 0xbb, + 0x7e, 0x18, 0x1d, 0xf1, 0x09, 0xc5, 0x53, 0xfd, 0x04, 0xfb, 0xf0, 0xa0, 0x72, 0x71, 0xe3, 0x48, + 0x09, 0xf0, 0x11, 0x12, 0xda, 0x87, 0x65, 0x38, 0x6b, 0x8c, 0x3d, 0x69, 0xbb, 0x78, 0x1d, 0xce, + 0xa8, 0xc1, 0x10, 0xeb, 0x3e, 0xa5, 0xd8, 0x94, 0x55, 0x35, 0x81, 0x98, 0xc4, 0x65, 0xe3, 0x4e, + 0x0f, 0x45, 0x51, 0x3b, 0x35, 0xee, 0x36, 0x12, 0x50, 0x4c, 0x61, 0x93, 0x55, 0x38, 0x27, 0x4b, + 0x90, 0x76, 0xdb, 0x6e, 0xc3, 0x59, 0xf6, 0x7b, 0x72, 0xc8, 0x15, 0x6b, 0x4f, 0x1d, 0x1e, 0x54, + 0xce, 0x6d, 0xf4, 0x83, 0x31, 0xab, 0x0e, 0x59, 0x83, 0xf3, 0x4e, 0x2f, 0xf2, 0xf5, 0xf7, 0x5f, + 0xf5, 0xd8, 0x76, 0xda, 0xe4, 0x43, 0x6b, 0x4a, 0xec, 0xbb, 0xd5, 0x0c, 0x38, 0x66, 0xd6, 0x22, + 0x1b, 0x29, 0x6a, 0x75, 0xda, 0xf0, 0xbd, 0xa6, 0xe8, 0xe5, 0x62, 0x7c, 0x02, 0xab, 0x66, 0xe0, + 0x60, 0x66, 0x4d, 0xd2, 0x86, 0x99, 0x8e, 0xf3, 0xe0, 0x8e, 0xe7, 0xec, 0x39, 0x6e, 0x9b, 0x31, + 0x91, 0xe6, 0xb1, 0xc1, 0x46, 0x95, 0x5e, 0xe4, 0xb6, 0x17, 0x85, 0xdb, 0xc2, 0xe2, 0xaa, 0x17, + 0xdd, 0x0a, 0xea, 0x11, 0xd3, 0xd4, 0x85, 0x06, 0xb9, 0x9e, 0xa0, 0x85, 0x29, 0xda, 0xe4, 0x16, + 0x5c, 0xe0, 0xd3, 0x71, 0xc5, 0xbf, 0xef, 0xad, 0xd0, 0xb6, 0xb3, 0xaf, 0x3e, 0x60, 0x92, 0x7f, + 0xc0, 0xd3, 0x87, 0x07, 0x95, 0x0b, 0xf5, 0x2c, 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x26, 0x09, + 0x40, 0xba, 0xe7, 0x86, 0xae, 0xef, 0x09, 0x2b, 0xd4, 0x54, 0x6c, 0x85, 0xaa, 0x0f, 0x46, 0xc3, + 0xa3, 0x68, 0x90, 0xbf, 0x6b, 0xc1, 0xf9, 0xac, 0x69, 0x38, 0x5f, 0xca, 0xe3, 0xf2, 0x34, 0x35, + 0xb5, 0xc4, 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x5b, 0x30, 0xed, 0x18, 0x27, 0xe8, + 0x79, 0xc8, 0x63, 0xd7, 0x32, 0xcf, 0xe4, 0xb5, 0xb9, 0xc3, 0x83, 0x4a, 0xe2, 0x94, 0x8e, 0x09, + 0x8e, 0xe4, 0xef, 0x5b, 0x70, 0x21, 0x73, 0x8e, 0xcf, 0x97, 0x4f, 0xa3, 0x85, 0xf8, 0x20, 0xc9, + 0x5e, 0x73, 0xb2, 0xc5, 0x20, 0x5f, 0xb7, 0xf4, 0x56, 0xa6, 0xee, 0xd3, 0xe6, 0xa7, 0xb9, 0x68, + 0xb7, 0x47, 0x34, 0x1a, 0xc4, 0x5a, 0x93, 0x22, 0x5c, 0x3b, 0x67, 0xec, 0x8c, 0xaa, 0x10, 0xd3, + 0xec, 0xc9, 0xd7, 0x2c, 0xb5, 0x35, 0x6a, 0x89, 0xce, 0x9c, 0x96, 0x44, 0x24, 0xde, 0x69, 0xb5, + 0x40, 0x29, 0xe6, 0xe4, 0x67, 0x60, 0xc1, 0xd9, 0xf2, 0x83, 0x28, 0x73, 0xf2, 0xcd, 0xcf, 0xf0, + 0x69, 0x74, 0xf1, 0xf0, 0xa0, 0xb2, 0x50, 0x1d, 0x88, 0x85, 0x47, 0x50, 0xb0, 0x7f, 0xa3, 0x08, + 0xd3, 0xe2, 0x24, 0x24, 0xb7, 0xae, 0xdf, 0xb6, 0xe0, 0xd9, 0x46, 0x2f, 0x08, 0xa8, 0x17, 0xd5, + 0x23, 0xda, 0xed, 0xdf, 0xb8, 0xac, 0x53, 0xdd, 0xb8, 0x2e, 0x1d, 0x1e, 0x54, 0x9e, 0x5d, 0x3e, + 0x82, 0x3f, 0x1e, 0x29, 0x1d, 0xf9, 0xb7, 0x16, 0xd8, 0x12, 0xa1, 0xe6, 0x34, 0x76, 0x5b, 0x81, + 0xdf, 0xf3, 0x9a, 0xfd, 0x1f, 0x31, 0x76, 0xaa, 0x1f, 0xf1, 0xc2, 0xe1, 0x41, 0xc5, 0x5e, 0x7e, + 0xa4, 0x14, 0x78, 0x0c, 0x49, 0xc9, 0x9b, 0x70, 0x56, 0x62, 0x5d, 0x7d, 0xd0, 0xa5, 0x81, 0xcb, + 0xce, 0x1c, 0x52, 0x71, 0x8c, 0x5d, 0xb1, 0xd2, 0x08, 0xd8, 0x5f, 0x87, 0x84, 0x30, 0x79, 0x9f, + 0xba, 0xad, 0x9d, 0x48, 0xa9, 0x4f, 0x23, 0xfa, 0x5f, 0x49, 0xab, 0xc8, 0x5d, 0x41, 0xb3, 0x56, + 0x3e, 0x3c, 0xa8, 0x4c, 0xca, 0x3f, 0xa8, 0x38, 0x91, 0x9b, 0x30, 0x23, 0xce, 0xa9, 0x1b, 0xae, + 0xd7, 0xda, 0xf0, 0x3d, 0xe1, 0x44, 0x54, 0xaa, 0xbd, 0xa0, 0x36, 0xfc, 0x7a, 0x02, 0xfa, 0xf0, + 0xa0, 0x32, 0xad, 0x7e, 0x6f, 0xee, 0x77, 0x29, 0xa6, 0x6a, 0xdb, 0xbf, 0x37, 0x01, 0xa0, 0x86, + 0x2b, 0xed, 0x92, 0x0f, 0x43, 0x29, 0xa4, 0x91, 0xe0, 0x2a, 0x2f, 0x4e, 0xc4, 0x75, 0x97, 0x2a, + 0xc4, 0x18, 0x4e, 0x76, 0xa1, 0xd8, 0x75, 0x7a, 0x21, 0xcd, 0xe7, 0xfc, 0x20, 0x3b, 0x7f, 0x83, + 0x51, 0x14, 0x07, 0x53, 0xfe, 0x13, 0x05, 0x0f, 0xf2, 0x25, 0x0b, 0x80, 0x26, 0x3b, 0x6c, 0x64, + 0x03, 0x91, 0x64, 0x19, 0xf7, 0x29, 0x6b, 0x83, 0xda, 0xcc, 0xe1, 0x41, 0x05, 0x8c, 0xae, 0x37, + 0xd8, 0x92, 0xfb, 0x30, 0xe5, 0xa8, 0x35, 0x7f, 0xfc, 0x34, 0xd6, 0x7c, 0x7e, 0x5e, 0xd4, 0x83, + 0x56, 0x33, 0x23, 0x5f, 0xb1, 0x60, 0x26, 0xa4, 0x91, 0xec, 0x2a, 0xb6, 0xf2, 0x48, 0x85, 0x77, + 0xc4, 0x41, 0x57, 0x4f, 0xd0, 0x14, 0x2b, 0x68, 0xb2, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0xd7, 0xa9, + 0xd3, 0xa4, 0x01, 0x37, 0x47, 0x48, 0x4d, 0x6a, 0x74, 0x51, 0x0c, 0x9a, 0x5a, 0x14, 0xa3, 0x0c, + 0x53, 0x7c, 0x95, 0x28, 0xeb, 0x6e, 0x10, 0xf8, 0x52, 0x94, 0xa9, 0x9c, 0x44, 0x31, 0x68, 0x6a, + 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0xb5, 0xbf, 0x79, 0x06, 0x66, 0xd4, 0x44, 0x8a, 0x35, 0x7b, 0x61, + 0xfd, 0x1a, 0xa0, 0xd9, 0x2f, 0x9b, 0x40, 0x4c, 0xe2, 0xb2, 0xca, 0x62, 0xaa, 0x26, 0x15, 0x7b, + 0x5d, 0xb9, 0x6e, 0x02, 0x31, 0x89, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x57, 0xec, 0x23, + 0xde, 0x00, 0xc7, 0xeb, 0x83, 0x61, 0x49, 0x60, 0xe4, 0x51, 0x70, 0xe1, 0x06, 0xdc, 0x28, 0x61, + 0xd3, 0x95, 0x93, 0x23, 0x9f, 0xf9, 0x99, 0x34, 0x17, 0x8b, 0xde, 0x48, 0x96, 0x61, 0x8a, 0x7d, + 0x86, 0xb2, 0x5f, 0x3c, 0x45, 0x65, 0xff, 0x53, 0x30, 0xd5, 0x71, 0x1e, 0xd4, 0x7b, 0x41, 0xeb, + 0xe4, 0x87, 0x0a, 0xe9, 0x32, 0x29, 0xa8, 0xa0, 0xa6, 0x47, 0xbe, 0x68, 0x19, 0x4b, 0x8e, 0xb8, + 0x4f, 0xbf, 0x9b, 0xef, 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, 0xf5, 0xd8, + 0x55, 0x6f, 0xa6, 0x46, 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0xa9, 0xaa, 0x91, 0xcb, 0x09, 0x66, + 0x98, 0x62, 0xce, 0xe5, 0x11, 0x73, 0x4e, 0xcb, 0x03, 0xa7, 0x2a, 0x4f, 0x3d, 0xc1, 0x0c, 0x53, + 0xcc, 0x07, 0x9f, 0x37, 0xcb, 0xa7, 0x73, 0xde, 0x9c, 0xce, 0xe1, 0xbc, 0x79, 0xb4, 0x2a, 0x7e, + 0x66, 0x54, 0x55, 0x9c, 0xdc, 0x00, 0xd2, 0xdc, 0xf7, 0x9c, 0x8e, 0xdb, 0x90, 0x8b, 0x25, 0xdf, + 0x36, 0x67, 0xb8, 0x3d, 0x62, 0x41, 0x2e, 0x64, 0x64, 0xa5, 0x0f, 0x03, 0x33, 0x6a, 0x91, 0x08, + 0xa6, 0xba, 0x4a, 0xe3, 0x9a, 0xcd, 0x63, 0xf4, 0x2b, 0x0d, 0x4c, 0xb8, 0x49, 0xb0, 0x89, 0xa7, + 0x4a, 0x50, 0x73, 0x22, 0x6b, 0x70, 0xbe, 0xe3, 0x7a, 0x1b, 0x7e, 0x33, 0xdc, 0xa0, 0x81, 0xb4, + 0xb6, 0xd4, 0x69, 0x34, 0x3f, 0xc7, 0xdb, 0x86, 0x9f, 0xa0, 0xd7, 0x33, 0xe0, 0x98, 0x59, 0xcb, + 0xfe, 0x5f, 0x16, 0xcc, 0x2d, 0xb7, 0xfd, 0x5e, 0xf3, 0xae, 0x13, 0x35, 0x76, 0x84, 0x87, 0x00, + 0x79, 0x03, 0xa6, 0x5c, 0x2f, 0xa2, 0xc1, 0x9e, 0xd3, 0x96, 0xfb, 0x93, 0xad, 0xcc, 0xa7, 0xab, + 0xb2, 0xfc, 0xe1, 0x41, 0x65, 0x66, 0xa5, 0x17, 0x70, 0x2b, 0xb5, 0x58, 0xad, 0x50, 0xd7, 0x21, + 0xdf, 0xb4, 0xe0, 0xac, 0xf0, 0x31, 0x58, 0x71, 0x22, 0xe7, 0x76, 0x8f, 0x06, 0x2e, 0x55, 0x5e, + 0x06, 0x23, 0x2e, 0x54, 0x69, 0x59, 0x15, 0x83, 0xfd, 0x58, 0x51, 0x5f, 0x4f, 0x73, 0xc6, 0x7e, + 0x61, 0xec, 0x5f, 0x2a, 0xc0, 0xd3, 0x03, 0x69, 0x91, 0x05, 0x18, 0x73, 0x9b, 0xf2, 0xd3, 0x41, + 0xd2, 0x1d, 0x5b, 0x6d, 0xe2, 0x98, 0xdb, 0x24, 0x8b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x0b, + 0xe7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x02, 0x45, 0xee, 0x2e, 0x2b, 0xcf, 0x13, + 0x5c, 0x8b, 0xe5, 0x9e, 0xa9, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, 0x1a, 0x91, + 0xbb, 0x24, 0xe6, 0xdb, 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, 0x09, 0x13, + 0x4c, 0xa1, 0xf5, 0x9b, 0x27, 0xde, 0x14, 0xf9, 0x4d, 0xd4, 0x06, 0xa7, 0x81, 0x92, 0x16, 0x6b, + 0xab, 0x80, 0x46, 0xbd, 0xc0, 0x63, 0x4d, 0xcb, 0xb7, 0xc1, 0x29, 0x21, 0x05, 0xea, 0x52, 0x34, + 0x30, 0xec, 0x7f, 0x36, 0x06, 0xe7, 0xb3, 0x44, 0x67, 0xbb, 0xcd, 0x84, 0x90, 0x56, 0x1e, 0x8d, + 0x7f, 0x2a, 0xff, 0xf6, 0x91, 0xee, 0x32, 0xfa, 0x9a, 0x42, 0xfa, 0x0b, 0x4a, 0xbe, 0xe4, 0xa7, + 0x74, 0x0b, 0x8d, 0x9d, 0xb0, 0x85, 0x34, 0xe5, 0x54, 0x2b, 0x5d, 0x82, 0xf1, 0x90, 0xf5, 0x7c, + 0x21, 0x79, 0xdd, 0xc1, 0xfb, 0x88, 0x43, 0x18, 0x46, 0xcf, 0x73, 0x23, 0x19, 0x63, 0xa2, 0x31, + 0xee, 0x78, 0x6e, 0x84, 0x1c, 0x62, 0x7f, 0x63, 0x0c, 0x16, 0x06, 0x7f, 0x14, 0xf9, 0x86, 0x05, + 0xd0, 0x64, 0xc7, 0x95, 0x90, 0x3b, 0x6a, 0x0b, 0xf7, 0x22, 0xe7, 0xb4, 0xda, 0x70, 0x45, 0x71, + 0x8a, 0x7d, 0xcd, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, 0x8a, 0x1a, 0xfa, 0xfc, 0xaa, 0x46, 0x4c, + 0x26, 0x5d, 0x67, 0x5d, 0x43, 0xd0, 0xc0, 0x62, 0xe7, 0x51, 0xcf, 0xe9, 0xd0, 0xb0, 0xeb, 0xe8, + 0x88, 0x1d, 0x7e, 0x1e, 0xbd, 0xa9, 0x0a, 0x31, 0x86, 0xdb, 0x6d, 0x78, 0xfe, 0x18, 0x72, 0xe6, + 0x14, 0x10, 0x61, 0xff, 0x0f, 0x0b, 0x9e, 0x5a, 0x6e, 0xf7, 0xc2, 0x88, 0x06, 0xff, 0xdf, 0xb8, + 0xee, 0xfd, 0x99, 0x05, 0xcf, 0x0c, 0xf8, 0xe6, 0xc7, 0xe0, 0xc1, 0xf7, 0x6e, 0xd2, 0x83, 0xef, + 0xce, 0xa8, 0x43, 0x3a, 0xf3, 0x3b, 0x06, 0x38, 0xf2, 0xfd, 0xeb, 0x02, 0x9c, 0x61, 0xcb, 0x56, + 0xd3, 0x6f, 0xe5, 0xb4, 0x71, 0x3e, 0x0f, 0xc5, 0xcf, 0xb1, 0x0d, 0x28, 0x3d, 0xc8, 0xf8, 0xae, + 0x84, 0x02, 0x46, 0xbe, 0x64, 0xc1, 0xe4, 0xe7, 0xe4, 0x9e, 0x2a, 0xce, 0x72, 0x23, 0x2e, 0x86, + 0x89, 0x6f, 0x58, 0x94, 0x3b, 0xa4, 0x88, 0xb3, 0xd0, 0xbe, 0x83, 0x6a, 0x2b, 0x55, 0x9c, 0xc9, + 0x8b, 0x30, 0xb9, 0xed, 0x07, 0x9d, 0x5e, 0xdb, 0x49, 0x07, 0xf7, 0x5d, 0x13, 0xc5, 0xa8, 0xe0, + 0x6c, 0x92, 0x3b, 0x5d, 0xf7, 0x6d, 0x1a, 0x84, 0xc2, 0xed, 0x3e, 0x31, 0xc9, 0xab, 0x1a, 0x82, + 0x06, 0x16, 0xaf, 0xd3, 0x6a, 0x05, 0xb4, 0xe5, 0x44, 0x7e, 0xc0, 0x77, 0x0e, 0xb3, 0x8e, 0x86, + 0xa0, 0x81, 0xb5, 0xf0, 0x09, 0x98, 0x36, 0x85, 0x1f, 0x2a, 0x66, 0xe3, 0x93, 0x20, 0x9d, 0x08, + 0x53, 0x4b, 0x92, 0x75, 0x9c, 0x25, 0xc9, 0xfe, 0xf7, 0x63, 0x60, 0x58, 0x87, 0x1e, 0xc3, 0x54, + 0xf7, 0x12, 0x53, 0x7d, 0x44, 0xcb, 0x86, 0x61, 0xeb, 0x1a, 0x14, 0xc1, 0xb6, 0x97, 0x8a, 0x60, + 0xbb, 0x99, 0x1b, 0xc7, 0xa3, 0x03, 0xd8, 0xbe, 0x6b, 0xc1, 0x33, 0x31, 0x72, 0xbf, 0xe1, 0xf6, + 0xd1, 0xeb, 0xf6, 0xab, 0x50, 0x76, 0xe2, 0x6a, 0x72, 0x62, 0x19, 0xe1, 0x43, 0x1a, 0x84, 0x26, + 0x5e, 0x1c, 0xfa, 0x50, 0x38, 0x61, 0xe8, 0xc3, 0xf8, 0xd1, 0xa1, 0x0f, 0xf6, 0x0f, 0xc6, 0xe0, + 0xb9, 0xfe, 0x2f, 0x53, 0x2b, 0xce, 0xf1, 0xbc, 0x20, 0x5e, 0x83, 0xe9, 0x48, 0x56, 0x30, 0xf6, + 0x4f, 0x1d, 0xca, 0xbc, 0x69, 0xc0, 0x30, 0x81, 0xc9, 0x6a, 0x36, 0xc4, 0x5a, 0x57, 0x6f, 0xf8, + 0x5d, 0x15, 0xb6, 0xa3, 0x6b, 0x2e, 0x1b, 0x30, 0x4c, 0x60, 0x6a, 0x9f, 0xe1, 0xf1, 0x53, 0xf7, + 0x19, 0xae, 0xc3, 0x05, 0xe5, 0x25, 0x79, 0xcd, 0x0f, 0xa4, 0xff, 0xbf, 0x5a, 0x41, 0xa6, 0x6a, + 0xcf, 0xc9, 0x2a, 0x17, 0x30, 0x0b, 0x09, 0xb3, 0xeb, 0xda, 0xdf, 0x2d, 0xc0, 0xb9, 0xb8, 0xd9, + 0x97, 0x7d, 0xaf, 0xe9, 0x72, 0x47, 0x9b, 0xd7, 0x61, 0x3c, 0xda, 0xef, 0xaa, 0xc6, 0xfe, 0x8b, + 0x4a, 0x9c, 0xcd, 0xfd, 0x2e, 0xeb, 0xed, 0xa7, 0x32, 0xaa, 0x70, 0xd3, 0x39, 0xaf, 0x44, 0xd6, + 0xf4, 0xec, 0x10, 0x3d, 0xf0, 0x4a, 0x72, 0x34, 0x3f, 0x3c, 0xa8, 0x64, 0x44, 0xf2, 0x2f, 0x6a, + 0x4a, 0xc9, 0x31, 0x4f, 0xee, 0xc1, 0x4c, 0xdb, 0x09, 0xa3, 0x3b, 0xdd, 0xa6, 0x13, 0xd1, 0x4d, + 0x57, 0xba, 0xb0, 0x0c, 0x17, 0x32, 0xa1, 0xef, 0xfa, 0xd7, 0x12, 0x94, 0x30, 0x45, 0x99, 0xec, + 0x01, 0x61, 0x25, 0x9b, 0x81, 0xe3, 0x85, 0xe2, 0xab, 0x18, 0xbf, 0xe1, 0xe3, 0x5f, 0xf4, 0xd1, + 0x79, 0xad, 0x8f, 0x1a, 0x66, 0x70, 0x20, 0x2f, 0xc0, 0x44, 0x40, 0x9d, 0x50, 0x6f, 0x07, 0x7a, + 0xfe, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x27, 0xd4, 0xc4, 0x23, 0x26, 0xd4, 0x1f, 0x5b, 0x30, 0x13, + 0x77, 0xd3, 0x63, 0x50, 0x3d, 0x3a, 0x49, 0xd5, 0xe3, 0x7a, 0x5e, 0x4b, 0xe2, 0x00, 0x6d, 0xe3, + 0xf7, 0x27, 0xcc, 0xef, 0xe3, 0x01, 0x03, 0x9f, 0x87, 0x92, 0x9a, 0xd5, 0x4a, 0xa7, 0x1f, 0xd1, + 0x02, 0x91, 0xd0, 0xf6, 0x8c, 0x28, 0x3e, 0xc9, 0x04, 0x63, 0x7e, 0x4c, 0xd7, 0x69, 0x4a, 0x3d, + 0x46, 0x0e, 0x7b, 0xad, 0xeb, 0x28, 0xfd, 0x26, 0x4b, 0xd7, 0x51, 0x75, 0xc8, 0x1d, 0x78, 0xaa, + 0x1b, 0xf8, 0x3c, 0x96, 0x7c, 0x85, 0x3a, 0xcd, 0xb6, 0xeb, 0x51, 0x65, 0xe6, 0x11, 0xae, 0x26, + 0xcf, 0x1c, 0x1e, 0x54, 0x9e, 0xda, 0xc8, 0x46, 0xc1, 0x41, 0x75, 0x93, 0xd1, 0x88, 0xe3, 0xc7, + 0x88, 0x46, 0xfc, 0x1b, 0xda, 0x98, 0x4a, 0x43, 0x19, 0x13, 0xf8, 0xe9, 0xbc, 0xba, 0x32, 0x63, + 0x59, 0x8f, 0x87, 0x54, 0x55, 0x32, 0x45, 0xcd, 0x7e, 0xb0, 0xc5, 0x6e, 0xe2, 0x84, 0x16, 0xbb, + 0x38, 0xee, 0x62, 0xf2, 0x87, 0x19, 0x77, 0x31, 0xf5, 0x23, 0x15, 0x77, 0xf1, 0x41, 0x11, 0xe6, + 0xd2, 0x1a, 0xc8, 0xe9, 0xc7, 0x3a, 0xfe, 0x2d, 0x0b, 0xe6, 0xd4, 0xec, 0x11, 0x3c, 0xb5, 0xfe, + 0xbe, 0x96, 0xd3, 0xa4, 0x15, 0xba, 0x94, 0x4e, 0x41, 0xb1, 0x99, 0xe2, 0x86, 0x7d, 0xfc, 0xc9, + 0x3b, 0x50, 0xd6, 0x57, 0x16, 0x27, 0x0a, 0x7c, 0xe4, 0xb1, 0x79, 0xd5, 0x98, 0x04, 0x9a, 0xf4, + 0xc8, 0x07, 0x16, 0x40, 0x43, 0x6d, 0x73, 0x6a, 0x76, 0xdd, 0xce, 0x6b, 0x76, 0xe9, 0x0d, 0x34, + 0x56, 0x96, 0x75, 0x51, 0x88, 0x06, 0x63, 0xf2, 0x4b, 0xfc, 0xb2, 0x42, 0x6b, 0x77, 0x22, 0xb5, + 0xc5, 0xc8, 0x3e, 0xe5, 0x47, 0x28, 0xa6, 0xb1, 0x2a, 0x65, 0x80, 0x42, 0x4c, 0x08, 0x61, 0xbf, + 0x0e, 0xda, 0x0b, 0x98, 0x2d, 0x5b, 0xdc, 0x0f, 0x78, 0xc3, 0x89, 0x76, 0xe4, 0x10, 0xd4, 0xcb, + 0xd6, 0x35, 0x05, 0xc0, 0x18, 0xc7, 0xfe, 0x2c, 0xcc, 0xbc, 0x19, 0x38, 0xdd, 0x1d, 0x97, 0x5f, + 0x0a, 0xb0, 0xc3, 0xe7, 0x8b, 0x30, 0xe9, 0x34, 0x9b, 0x59, 0xd9, 0x52, 0xaa, 0xa2, 0x18, 0x15, + 0xfc, 0x58, 0xe7, 0x4c, 0xfb, 0xf7, 0x2c, 0x20, 0xf1, 0xc5, 0xaa, 0xeb, 0xb5, 0xd6, 0x9d, 0xa8, + 0xb1, 0xc3, 0xce, 0x47, 0x3b, 0xbc, 0x34, 0xeb, 0x7c, 0x74, 0x5d, 0x43, 0xd0, 0xc0, 0x22, 0xef, + 0x41, 0x59, 0xfc, 0x7b, 0x5b, 0x9f, 0xbe, 0x46, 0x77, 0x66, 0xe6, 0x1b, 0x0a, 0x97, 0x49, 0x8c, + 0xc2, 0xeb, 0x31, 0x07, 0x34, 0xd9, 0xb1, 0xa6, 0x5a, 0xf5, 0xb6, 0xdb, 0xbd, 0x07, 0xcd, 0xad, + 0xb8, 0xa9, 0xba, 0x81, 0xbf, 0xed, 0xb6, 0x69, 0xba, 0xa9, 0x36, 0x44, 0x31, 0x2a, 0xf8, 0xf1, + 0x9a, 0xea, 0x5f, 0x59, 0x70, 0x7e, 0x35, 0x8c, 0x5c, 0x7f, 0x85, 0x86, 0x11, 0xdb, 0x56, 0xd8, + 0xe2, 0xd3, 0x6b, 0x1f, 0xc7, 0xa1, 0x7f, 0x05, 0xe6, 0xe4, 0x25, 0x6f, 0x6f, 0x2b, 0xa4, 0x91, + 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x9c, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x45, 0xde, 0xf6, 0xc6, 0x54, + 0x0a, 0x49, 0x2a, 0xf5, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, 0xdf, 0x29, 0xc0, 0x39, 0xfe, 0x19, 0xa9, + 0x60, 0x9c, 0xaf, 0x0d, 0x0a, 0xc6, 0x19, 0x71, 0x2a, 0x73, 0x5e, 0x27, 0x08, 0xc5, 0xf9, 0x9b, + 0x16, 0xcc, 0x36, 0x93, 0x2d, 0x9d, 0x8f, 0xd1, 0x2b, 0xab, 0x0f, 0x85, 0x4f, 0x5b, 0xaa, 0x10, + 0xd3, 0xfc, 0xc9, 0x2f, 0x5b, 0x30, 0x9b, 0x14, 0x53, 0xad, 0xee, 0xa7, 0xd0, 0x48, 0xda, 0x09, + 0x3d, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x0f, 0xc6, 0x64, 0x97, 0x9e, 0x46, 0xa4, 0x09, 0xb9, + 0x0f, 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x23, 0x9e, 0x08, 0x37, 0xd7, 0xea, 0xc2, 0xbf, + 0x22, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2f, 0xce, 0xb8, 0xd1, 0x95, 0x8c, 0x73, 0x39, + 0x8a, 0x6e, 0x2e, 0x6f, 0xa4, 0x19, 0xcb, 0x12, 0xc6, 0x58, 0xf1, 0xb2, 0x7f, 0xdd, 0x82, 0xd2, + 0x0d, 0x5f, 0xad, 0x23, 0x3f, 0x93, 0x83, 0xa1, 0x47, 0xeb, 0x83, 0xfa, 0x1e, 0x37, 0x3e, 0x62, + 0xbc, 0x91, 0x30, 0xf3, 0x3c, 0x6b, 0xd0, 0x5e, 0xe4, 0x49, 0xe3, 0x18, 0xa9, 0x1b, 0xfe, 0xd6, + 0x40, 0xdb, 0xec, 0xaf, 0x14, 0xe1, 0xcc, 0x5b, 0xce, 0x3e, 0xf5, 0x22, 0x67, 0xf8, 0x4d, 0xe2, + 0x55, 0x28, 0x3b, 0x5d, 0x7e, 0x51, 0x68, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, + 0x2f, 0x68, 0x22, 0xec, 0x23, 0x6b, 0x29, 0x5a, 0x4e, 0xc1, 0xb1, 0xaf, 0x06, 0xb9, 0x01, 0x44, + 0x46, 0x29, 0x57, 0x1b, 0x0d, 0xbf, 0xe7, 0x89, 0x25, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xbd, + 0x0f, 0x03, 0x33, 0x6a, 0x91, 0xcf, 0xc0, 0x7c, 0x83, 0x53, 0x96, 0x47, 0x0f, 0x93, 0xa2, 0x38, + 0x7e, 0xea, 0x40, 0x8a, 0xe5, 0x01, 0x78, 0x38, 0x90, 0x02, 0x93, 0x34, 0x8c, 0xfc, 0xc0, 0x69, + 0x51, 0x93, 0xee, 0x44, 0x52, 0xd2, 0x7a, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x5f, 0x80, 0x52, 0xb4, + 0x13, 0xd0, 0x70, 0xc7, 0x6f, 0x37, 0xa5, 0x63, 0xc7, 0x88, 0x96, 0x36, 0xd9, 0xfb, 0x9b, 0x8a, + 0xaa, 0x31, 0xbc, 0x55, 0x11, 0xc6, 0x3c, 0x49, 0x00, 0x13, 0x61, 0xc3, 0xef, 0xd2, 0x50, 0xaa, + 0xec, 0x37, 0x72, 0xe1, 0xce, 0x2d, 0x47, 0x86, 0x8d, 0x8f, 0x73, 0x40, 0xc9, 0xc9, 0xfe, 0xdd, + 0x31, 0x98, 0x36, 0x11, 0x8f, 0xb1, 0x36, 0x7d, 0xc9, 0x82, 0xe9, 0x86, 0xef, 0x45, 0x81, 0xdf, + 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, 0x85, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, + 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb5, 0x60, 0x36, 0xf6, 0x03, 0x8c, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, + 0x97, 0xfa, 0xab, 0x49, 0x4e, 0x98, 0x66, 0x6d, 0x6f, 0xc1, 0x5c, 0xba, 0xb7, 0x59, 0x53, 0x76, + 0x1d, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0x6e, 0x38, 0x61, 0x88, 0x1c, 0x42, 0x5e, 0x82, 0xa9, 0x8e, + 0x13, 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x56, 0x2c, 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, + 0x14, 0xa6, 0xd7, 0x1d, 0xaf, 0x45, 0x9b, 0x72, 0x1d, 0x7e, 0x74, 0xac, 0xe3, 0x9f, 0x8e, 0x43, + 0xd9, 0x38, 0x9b, 0x9d, 0xfe, 0x39, 0x2b, 0x91, 0xc9, 0xa5, 0x90, 0x63, 0x26, 0x97, 0x4f, 0x01, + 0x6c, 0xbb, 0x9e, 0x1b, 0xee, 0x9c, 0x30, 0x47, 0x0c, 0xbf, 0xf8, 0xbe, 0xa6, 0x29, 0xa0, 0x41, + 0x2d, 0xbe, 0x5d, 0x2c, 0x1e, 0x91, 0x6e, 0xed, 0x03, 0xcb, 0xd8, 0x6e, 0x26, 0xf2, 0xf0, 0xa6, + 0x30, 0x3a, 0x66, 0x51, 0x6d, 0x3f, 0xe2, 0xe2, 0xe7, 0xa8, 0x5d, 0x69, 0x13, 0xa6, 0x02, 0x1a, + 0xf6, 0x3a, 0xf4, 0x44, 0xd9, 0x5c, 0xb8, 0x5f, 0x0b, 0xca, 0xfa, 0xa8, 0x29, 0x2d, 0xbc, 0x0e, + 0x67, 0x12, 0x22, 0x0c, 0x75, 0x7d, 0xe3, 0x43, 0xa6, 0x01, 0xe0, 0x24, 0x97, 0x39, 0xac, 0x2f, + 0xda, 0x46, 0x16, 0x17, 0xdd, 0x17, 0xc2, 0x7b, 0x49, 0xc0, 0xec, 0x1f, 0x4c, 0x80, 0x74, 0x10, + 0x38, 0xc6, 0x72, 0x65, 0x5e, 0x0b, 0x8e, 0x9d, 0xe0, 0x5a, 0xf0, 0x06, 0x4c, 0xbb, 0x9e, 0x1b, + 0xb9, 0x4e, 0x9b, 0x1b, 0x77, 0xe4, 0x76, 0xaa, 0xdc, 0xbb, 0xa7, 0x57, 0x0d, 0x58, 0x06, 0x9d, + 0x44, 0x5d, 0x72, 0x1b, 0x8a, 0x7c, 0xbf, 0x91, 0x03, 0x78, 0x78, 0x2f, 0x06, 0xee, 0xc0, 0x22, + 0x62, 0xbe, 0x04, 0x25, 0x7e, 0xf8, 0x10, 0x69, 0x6c, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, + 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, 0xdb, 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0x26, 0x92, + 0x54, 0xae, 0xa5, 0xe0, 0xd8, 0x57, 0x83, 0x6c, 0xc3, 0xb4, 0x2c, 0x13, 0x3e, 0x69, 0x93, 0x27, + 0xfc, 0x4a, 0xee, 0x7b, 0x78, 0xcd, 0xa0, 0x84, 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, + 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0xf7, 0x68, 0x1c, 0x70, 0x75, 0x12, 0x66, 0x17, 0x0e, 0x0f, 0x2a, + 0x67, 0x57, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf9, 0xa2, 0x05, 0x17, 0x1a, 0xbe, 0x17, 0xf2, 0xbc, + 0x10, 0x7b, 0xf4, 0x6a, 0x10, 0xf8, 0x81, 0xe0, 0x5d, 0x3a, 0x21, 0x6f, 0x6e, 0x53, 0x5c, 0xce, + 0x22, 0x89, 0xd9, 0x9c, 0xc8, 0xbb, 0x30, 0xd5, 0x0d, 0xfc, 0x3d, 0xb7, 0x49, 0x03, 0xe9, 0xdf, + 0xb8, 0x96, 0x47, 0x9e, 0x9a, 0x0d, 0x49, 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, + 0x2e, 0xc3, 0x4c, 0x12, 0x9d, 0xfc, 0x1c, 0x40, 0x37, 0xf0, 0x3b, 0x34, 0xda, 0xa1, 0x3a, 0x70, + 0xe6, 0xe6, 0xa8, 0xe9, 0x50, 0x14, 0x3d, 0xe5, 0x13, 0xc4, 0x96, 0x8b, 0xb8, 0x14, 0x0d, 0x8e, + 0x24, 0x80, 0xc9, 0x5d, 0xb1, 0xed, 0x4a, 0x2d, 0xe4, 0xad, 0x5c, 0x74, 0x26, 0xc9, 0x99, 0x47, + 0x7c, 0xc8, 0x22, 0x54, 0x8c, 0xc8, 0x16, 0x14, 0xee, 0xd3, 0xad, 0x7c, 0x62, 0xf1, 0xef, 0x52, + 0x79, 0x9a, 0xa9, 0x4d, 0x1e, 0x1e, 0x54, 0x0a, 0x77, 0xe9, 0x16, 0x32, 0xe2, 0xec, 0xbb, 0x9a, + 0xc2, 0x31, 0x40, 0x2e, 0x15, 0x6f, 0xe5, 0xe8, 0x65, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x62, 0x44, + 0xde, 0x85, 0xd2, 0x7d, 0x67, 0x8f, 0x6e, 0x07, 0xbe, 0x17, 0x49, 0x47, 0xb4, 0x11, 0x63, 0x29, + 0xee, 0x2a, 0x72, 0x92, 0x2f, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xec, 0xc8, 0x1e, 0x4c, 0x79, 0xf4, + 0x3e, 0xd2, 0xb6, 0xdb, 0xc8, 0x27, 0x76, 0xe1, 0xa6, 0xa4, 0x26, 0x39, 0xf3, 0x7d, 0x4f, 0x95, + 0xa1, 0xe6, 0xc5, 0xfa, 0xf2, 0x9e, 0xbf, 0x25, 0x17, 0xaa, 0x11, 0xfb, 0x52, 0x9f, 0x4c, 0x45, + 0x5f, 0xde, 0xf0, 0xb7, 0x90, 0x11, 0x67, 0x73, 0xa4, 0xa1, 0xbd, 0xa0, 0xe4, 0x32, 0x75, 0x33, + 0x5f, 0xef, 0x2f, 0x31, 0x47, 0xe2, 0x52, 0x34, 0x38, 0xb2, 0xb6, 0x6d, 0x49, 0x63, 0xa5, 0x5c, + 0xa8, 0x46, 0x6c, 0xdb, 0xa4, 0xe9, 0x53, 0xb4, 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, + 0xe5, 0x2f, 0x9f, 0xa5, 0x2a, 0x69, 0x47, 0x14, 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, + 0xdd, 0xfd, 0xfb, 0x4e, 0x7b, 0xd7, 0xf5, 0x5a, 0x32, 0x10, 0x74, 0xd4, 0x94, 0xce, 0xbb, 0xfb, + 0x77, 0x05, 0x3d, 0xb3, 0xbd, 0xe3, 0x52, 0x34, 0x38, 0x92, 0xbf, 0x67, 0xc1, 0x44, 0xb7, 0xdd, + 0x6b, 0xb9, 0xde, 0xfc, 0x74, 0x1e, 0x1e, 0x42, 0xc9, 0x25, 0x77, 0x71, 0x83, 0x93, 0x16, 0x8a, + 0xe2, 0x4f, 0x6a, 0xa7, 0x46, 0x5e, 0xf8, 0x0b, 0x7f, 0x52, 0x99, 0xa7, 0x5e, 0xc3, 0x6f, 0xba, + 0x5e, 0x6b, 0xe9, 0x5e, 0xe8, 0x7b, 0x8b, 0xe8, 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xe1, 0xe3, + 0x50, 0x36, 0x48, 0x3c, 0x4a, 0xd1, 0x9b, 0x36, 0x15, 0xbd, 0x5f, 0x9f, 0x80, 0x69, 0x33, 0x91, + 0xe3, 0x31, 0xb4, 0x2f, 0x7d, 0xe2, 0x18, 0x1b, 0xe6, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0xed, 0x91, + 0x32, 0x6f, 0xad, 0xe6, 0xa6, 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x21, 0x1c, + 0x4a, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x57, 0x00, 0xe2, 0x8c, + 0x83, 0xf2, 0x56, 0x51, 0xeb, 0xc3, 0x46, 0x26, 0x44, 0x03, 0x8b, 0xbc, 0x00, 0x13, 0x4c, 0xf5, + 0xa1, 0x4d, 0x19, 0xa7, 0xae, 0xcf, 0xf1, 0xd7, 0x78, 0x29, 0x4a, 0x28, 0x79, 0x8d, 0x69, 0xa9, + 0xb1, 0xc2, 0x22, 0xc3, 0xcf, 0xcf, 0xc7, 0x5a, 0x6a, 0x0c, 0xc3, 0x04, 0x26, 0x13, 0x9d, 0x32, + 0xfd, 0x82, 0xaf, 0x0d, 0x86, 0xe8, 0x5c, 0xe9, 0x40, 0x01, 0xe3, 0x76, 0xa5, 0x94, 0x3e, 0xc2, + 0xe7, 0x74, 0xd1, 0xb0, 0x2b, 0xa5, 0xe0, 0xd8, 0x57, 0x83, 0x7d, 0x8c, 0xbc, 0x10, 0x2d, 0x0b, + 0x6f, 0xe4, 0x01, 0x57, 0x99, 0x5f, 0x36, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, 0x8f, 0x7f, + 0xd8, 0x1a, 0xed, 0x58, 0xf4, 0x59, 0x98, 0x49, 0xee, 0x42, 0xb9, 0xdf, 0x7c, 0x7c, 0x65, 0x1c, + 0xce, 0xdd, 0x6c, 0xb9, 0x5e, 0x3a, 0x8b, 0x58, 0x56, 0x86, 0x7c, 0x6b, 0xe8, 0x0c, 0xf9, 0x3a, + 0xe0, 0x4d, 0xe6, 0x9f, 0xcf, 0x0e, 0x78, 0x53, 0x8f, 0x01, 0x24, 0x71, 0xc9, 0x1f, 0x5b, 0xf0, + 0xac, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0xc4, 0xce, 0x72, 0x46, 0x87, 0x23, 0xee, + 0xf2, 0xfd, 0x1f, 0xbf, 0x58, 0x3d, 0x82, 0xab, 0xe8, 0xf1, 0x9f, 0x90, 0x5f, 0xf0, 0xec, 0x51, + 0xa8, 0x78, 0xa4, 0xf8, 0xe4, 0xaf, 0xc0, 0x6c, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, 0x2e, 0x2c, + 0xea, 0x49, 0x10, 0xa6, 0x71, 0x17, 0x6e, 0xc1, 0x87, 0x1e, 0x29, 0xe7, 0x50, 0x83, 0xed, 0xdb, + 0x16, 0x4c, 0x9b, 0x09, 0x7f, 0xc8, 0x4b, 0x30, 0x15, 0xf9, 0xbb, 0xd4, 0xbb, 0x13, 0x28, 0x6f, + 0x58, 0x3d, 0xd0, 0x37, 0x79, 0x39, 0xae, 0xa1, 0xc6, 0x60, 0xd8, 0x8d, 0xb6, 0x4b, 0xbd, 0x68, + 0xb5, 0x29, 0xbb, 0x59, 0x63, 0x2f, 0x8b, 0xf2, 0x15, 0xd4, 0x18, 0xc2, 0x81, 0x8d, 0xfd, 0xae, + 0xd3, 0x46, 0x40, 0x95, 0xef, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x81, 0x49, 0x6c, 0x6d, 0xe2, + 0x1c, 0x8f, 0xef, 0x35, 0x52, 0x26, 0xc9, 0xdf, 0xb2, 0xa0, 0x24, 0x4c, 0xf4, 0x48, 0xb7, 0x53, + 0xfe, 0xab, 0x29, 0x23, 0x42, 0x75, 0x63, 0x35, 0xcb, 0x7f, 0xf5, 0x12, 0x8c, 0xef, 0xba, 0x9e, + 0xfa, 0x12, 0xbd, 0x2d, 0xbd, 0xe5, 0x7a, 0x4d, 0xe4, 0x10, 0xbd, 0x71, 0x15, 0x06, 0x6e, 0x5c, + 0x4b, 0x50, 0xd2, 0x5e, 0x1d, 0x72, 0xf9, 0xd7, 0xd6, 0x5b, 0xed, 0x05, 0x82, 0x31, 0x8e, 0xfd, + 0xab, 0x16, 0xcc, 0xf0, 0x00, 0xe9, 0xf8, 0x3c, 0xfc, 0xaa, 0x76, 0xb4, 0x12, 0x72, 0x3f, 0x97, + 0x74, 0xb4, 0x7a, 0x78, 0x50, 0x29, 0x8b, 0x90, 0xea, 0xa4, 0xdf, 0xd5, 0xa7, 0xa5, 0x11, 0x8d, + 0xbb, 0x83, 0x8d, 0x0d, 0x6d, 0xe3, 0x89, 0xc5, 0x54, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x07, 0xd3, + 0x66, 0xa4, 0x13, 0x79, 0x15, 0xca, 0x5d, 0xd7, 0x6b, 0x25, 0x23, 0x62, 0xf5, 0x45, 0xc3, 0x46, + 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, 0xa9, 0xfb, 0x89, 0x0d, 0xdf, 0xac, 0x16, 0xff, + 0xe1, 0x49, 0xf5, 0x33, 0x22, 0xea, 0x72, 0x4f, 0xaa, 0x9f, 0xc1, 0xe3, 0x87, 0x97, 0x54, 0x3f, + 0x4b, 0x98, 0xff, 0xbb, 0x92, 0xea, 0xff, 0x34, 0x0c, 0x9b, 0x70, 0x94, 0xed, 0xf5, 0xf7, 0xcd, + 0xac, 0x05, 0xba, 0xc5, 0x65, 0xda, 0x02, 0x09, 0xb5, 0xbf, 0x55, 0x80, 0xb9, 0xf4, 0x91, 0x3f, + 0x6f, 0x6f, 0x0a, 0xf2, 0x55, 0x0b, 0x66, 0x9c, 0x44, 0x72, 0xb7, 0x9c, 0x5e, 0xe8, 0x49, 0xd0, + 0x34, 0x92, 0x8b, 0x25, 0xca, 0x31, 0xc5, 0x9b, 0xfc, 0x05, 0x98, 0x8c, 0xdc, 0x0e, 0xf5, 0x7b, + 0xc2, 0x10, 0x58, 0x10, 0x07, 0xf2, 0x4d, 0x51, 0x84, 0x0a, 0xc6, 0x16, 0x65, 0x97, 0x6b, 0x50, + 0x01, 0x95, 0x6e, 0xb7, 0x73, 0xb1, 0xe5, 0x52, 0x94, 0xa3, 0xc6, 0x20, 0x0f, 0x60, 0x52, 0xf8, + 0x5d, 0x28, 0x07, 0x9b, 0xf5, 0x9c, 0x4c, 0x13, 0xc2, 0xb5, 0x23, 0xee, 0x02, 0xf1, 0x3f, 0x44, + 0xc5, 0xce, 0xfe, 0x28, 0x0c, 0x99, 0x81, 0xd5, 0xbe, 0x0a, 0x04, 0xfd, 0x76, 0x7b, 0xcb, 0x69, + 0xec, 0xde, 0x75, 0xbd, 0xa6, 0x7f, 0x9f, 0x2f, 0x45, 0x4b, 0x50, 0x0a, 0x64, 0x3c, 0x6a, 0x28, + 0x47, 0x8d, 0x5e, 0xcb, 0x54, 0xa0, 0x6a, 0x88, 0x31, 0x8e, 0xfd, 0x07, 0x63, 0x30, 0x29, 0x83, + 0xa7, 0x1f, 0x83, 0xdb, 0xff, 0x6e, 0xe2, 0x3e, 0x78, 0x35, 0x97, 0x98, 0xef, 0x81, 0x3e, 0xff, + 0x61, 0xca, 0xe7, 0xff, 0xad, 0x7c, 0xd8, 0x1d, 0xed, 0xf0, 0xff, 0xfb, 0x45, 0x98, 0x4d, 0x05, + 0xa3, 0x33, 0x5d, 0xbc, 0xcf, 0xcf, 0xf5, 0x4e, 0xae, 0xf1, 0xee, 0x3a, 0xd0, 0xe7, 0x68, 0x97, + 0xd7, 0x30, 0x91, 0x2f, 0xfb, 0x76, 0x6e, 0xef, 0x9c, 0xfc, 0x38, 0x75, 0xf6, 0xb0, 0xaf, 0x65, + 0x7c, 0xd3, 0x82, 0x73, 0x4e, 0xff, 0x43, 0x31, 0xd2, 0x66, 0x78, 0x3b, 0xf7, 0x17, 0x68, 0x6a, + 0xcf, 0x48, 0x21, 0xb3, 0xde, 0xe3, 0xc1, 0x2c, 0x51, 0xec, 0xff, 0x6c, 0xc1, 0xd3, 0x03, 0xd3, + 0x2a, 0xf0, 0xac, 0x5c, 0x41, 0x12, 0x2a, 0xd7, 0x8c, 0x9c, 0x93, 0xc7, 0xe8, 0xfb, 0xe3, 0x74, + 0x22, 0xa5, 0x34, 0x7b, 0xf2, 0x0a, 0x4c, 0x73, 0x1d, 0x8d, 0xad, 0x9e, 0x11, 0xed, 0xca, 0xeb, + 0x2f, 0x7e, 0x11, 0x52, 0x37, 0xca, 0x31, 0x81, 0x65, 0x7f, 0xd3, 0x82, 0xf9, 0x41, 0x39, 0x9a, + 0x8e, 0x61, 0x9c, 0xf9, 0xcb, 0xa9, 0xd0, 0x89, 0x4a, 0x5f, 0xe8, 0x44, 0xca, 0x3c, 0xa3, 0xa2, + 0x24, 0x0c, 0xcb, 0x48, 0xe1, 0x11, 0x91, 0x01, 0x5f, 0xb3, 0xe0, 0xa9, 0x01, 0x13, 0xbe, 0x2f, + 0x84, 0xc6, 0x3a, 0x71, 0x08, 0xcd, 0xd8, 0x71, 0x43, 0x68, 0xec, 0x3f, 0x2c, 0xc0, 0x9c, 0x94, + 0x27, 0x56, 0xd4, 0x5f, 0x4b, 0x04, 0xa0, 0xfc, 0x44, 0x2a, 0x00, 0xe5, 0x7c, 0x1a, 0xff, 0xc7, + 0xd1, 0x27, 0x3f, 0x5a, 0xd1, 0x27, 0x7f, 0x3e, 0x06, 0x17, 0x32, 0x53, 0x47, 0x91, 0xaf, 0x64, + 0xec, 0x5e, 0x77, 0x73, 0xce, 0x51, 0x75, 0xcc, 0xfd, 0x6b, 0xd4, 0x90, 0x8d, 0x5f, 0x36, 0x43, + 0x25, 0xc4, 0x6e, 0xb4, 0x7d, 0x0a, 0xd9, 0xb6, 0x86, 0x8c, 0x9a, 0xb0, 0x7f, 0xa1, 0x00, 0x97, + 0x8f, 0x4b, 0xe8, 0x47, 0x34, 0xaa, 0x2e, 0x4c, 0x44, 0xd5, 0x3d, 0x26, 0xcd, 0xe2, 0x54, 0x02, + 0xec, 0xfe, 0xc1, 0xb8, 0xde, 0xf6, 0xfa, 0xc7, 0xe7, 0xb1, 0x7c, 0x25, 0x26, 0x99, 0xf6, 0xa9, + 0xb2, 0x6e, 0xc7, 0x4b, 0xe1, 0x64, 0x5d, 0x14, 0x3f, 0x3c, 0xa8, 0x9c, 0x8d, 0x13, 0x98, 0xc8, + 0x42, 0x54, 0x95, 0xc8, 0x65, 0x98, 0x0a, 0x04, 0x54, 0xc5, 0x11, 0x49, 0x87, 0x13, 0x51, 0x86, + 0x1a, 0x4a, 0xbe, 0x60, 0xa8, 0xeb, 0xe3, 0xa7, 0x95, 0xa7, 0xe7, 0x28, 0x3f, 0x9a, 0x77, 0x60, + 0x2a, 0x54, 0xa9, 0xa1, 0x85, 0xe2, 0xf2, 0xf2, 0x31, 0xc3, 0xd3, 0xd8, 0x19, 0x5c, 0xe5, 0x89, + 0x16, 0xdf, 0xa7, 0xb3, 0x48, 0x6b, 0x92, 0xc4, 0xd6, 0xc7, 0x5f, 0x61, 0xe7, 0x87, 0xfe, 0xa3, + 0x2f, 0x89, 0x60, 0x52, 0x3e, 0x87, 0x2a, 0x2f, 0x20, 0xd7, 0x73, 0x0a, 0x45, 0x91, 0x8e, 0xca, + 0xfc, 0x54, 0xa9, 0xcc, 0x30, 0x8a, 0x95, 0xfd, 0x5d, 0x0b, 0xca, 0x72, 0x8c, 0x3c, 0x86, 0x38, + 0xbd, 0x7b, 0xc9, 0x38, 0xbd, 0xab, 0xb9, 0xac, 0x58, 0x03, 0x82, 0xf4, 0xee, 0xc1, 0xb4, 0x99, + 0xb3, 0x90, 0x7c, 0xca, 0x58, 0x71, 0xad, 0x51, 0xb2, 0x80, 0xa9, 0x35, 0x39, 0x5e, 0x8d, 0xed, + 0xdf, 0x28, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x47, 0x8e, 0x7c, 0x73, 0xe0, 0x8d, + 0xe5, 0x3f, 0xf0, 0x6e, 0xc3, 0x94, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xbc, 0xe9, 0xb9, 0xcc, 0x34, + 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0x1a, 0x1b, 0x87, 0xd5, 0x72, 0xad, 0xc9, 0x90, 0x77, + 0xa1, 0x7c, 0xdf, 0x0f, 0x76, 0xdb, 0xbe, 0xc3, 0xf3, 0xf1, 0x43, 0x1e, 0x97, 0xe5, 0xda, 0xc0, + 0x2b, 0xc2, 0x47, 0xee, 0xc6, 0xf4, 0xd1, 0x64, 0x46, 0xaa, 0x30, 0xdb, 0x71, 0x3d, 0xa4, 0x4e, + 0x53, 0x87, 0xe3, 0x8d, 0x8b, 0x5c, 0xd8, 0x4a, 0xb5, 0x5e, 0x4f, 0x82, 0x31, 0x8d, 0xcf, 0x8d, + 0x3f, 0x41, 0xc2, 0xda, 0x20, 0x13, 0xde, 0x6e, 0x8c, 0x3e, 0x18, 0x93, 0x16, 0x0c, 0x11, 0x3f, + 0x91, 0x2c, 0xc7, 0x14, 0x6f, 0xf2, 0x79, 0x98, 0x0a, 0xd5, 0x43, 0x83, 0xc5, 0x1c, 0x0f, 0x1d, + 0xfa, 0xb1, 0x41, 0xdd, 0x95, 0xfa, 0xb5, 0x41, 0xcd, 0x90, 0xac, 0xc1, 0x79, 0x65, 0x3e, 0x49, + 0xbc, 0x99, 0x36, 0x11, 0xe7, 0xaf, 0xc2, 0x0c, 0x38, 0x66, 0xd6, 0x62, 0xaa, 0x1c, 0xcf, 0x05, + 0x2a, 0x2e, 0x27, 0x8d, 0xfb, 0x3c, 0x3e, 0xff, 0x9a, 0x28, 0xa1, 0x47, 0x45, 0x9b, 0x4e, 0x8d, + 0x10, 0x6d, 0x5a, 0x87, 0x0b, 0x69, 0x10, 0x4f, 0x4c, 0xc6, 0x73, 0xa1, 0x19, 0x5b, 0xe8, 0x46, + 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x14, 0x50, 0x7e, 0xc8, 0xaa, 0x2a, 0xbf, 0xae, 0xa1, + 0x3d, 0x58, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, 0x9d, 0xfa, 0x76, 0x8e, 0x2f, + 0x11, 0xcb, 0xbe, 0x1f, 0x90, 0x30, 0xd0, 0xfe, 0x37, 0xb3, 0x70, 0x26, 0x61, 0x03, 0x22, 0xcf, + 0x43, 0x91, 0x67, 0x6a, 0xe3, 0xab, 0xd5, 0x54, 0xbc, 0xa2, 0x8a, 0xc6, 0x11, 0x30, 0xf2, 0x8b, + 0x16, 0xcc, 0x76, 0x13, 0x77, 0x1a, 0x6a, 0x21, 0x1f, 0xd1, 0x70, 0x9a, 0xbc, 0x28, 0x31, 0xde, + 0x75, 0x48, 0x32, 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0x37, 0xf0, 0x36, 0x0d, 0x38, 0xb6, 0x54, + 0xf4, 0x34, 0x89, 0xe5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, 0x8d, 0xf2, 0xda, 0x64, + 0x55, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x03, 0x66, 0x64, 0x52, 0xe2, 0x0d, 0xbf, 0x79, 0xdd, 0x09, + 0x77, 0xe4, 0x09, 0x47, 0x9f, 0xc8, 0x96, 0x13, 0x50, 0x4c, 0x61, 0xf3, 0x6f, 0x8b, 0x33, 0x3f, + 0x73, 0x02, 0x13, 0xc9, 0x67, 0x2f, 0x96, 0x93, 0x60, 0x4c, 0xe3, 0x93, 0x97, 0x8c, 0x6d, 0x48, + 0x38, 0x0c, 0xe8, 0xd5, 0x20, 0x63, 0x2b, 0xaa, 0xc2, 0x6c, 0x8f, 0x1f, 0x08, 0x9b, 0x0a, 0x28, + 0xe7, 0xa3, 0x66, 0x78, 0x27, 0x09, 0xc6, 0x34, 0x3e, 0x79, 0x1d, 0xce, 0x04, 0x6c, 0xb1, 0xd5, + 0x04, 0x84, 0x17, 0x81, 0xbe, 0x24, 0x46, 0x13, 0x88, 0x49, 0x5c, 0xf2, 0x26, 0x9c, 0x8d, 0x73, + 0x78, 0x2a, 0x02, 0xc2, 0xad, 0x40, 0x27, 0x94, 0xab, 0xa6, 0x11, 0xb0, 0xbf, 0x0e, 0xf9, 0x6b, + 0x30, 0x67, 0xb4, 0xc4, 0xaa, 0xd7, 0xa4, 0x0f, 0x64, 0x9e, 0x45, 0xfe, 0x8c, 0xd3, 0x72, 0x0a, + 0x86, 0x7d, 0xd8, 0xe4, 0x13, 0x30, 0xd3, 0xf0, 0xdb, 0x6d, 0xbe, 0xc6, 0x89, 0x27, 0x17, 0x44, + 0x42, 0x45, 0x91, 0x7a, 0x32, 0x01, 0xc1, 0x14, 0x26, 0xb9, 0x01, 0xc4, 0xdf, 0x62, 0xea, 0x15, + 0x6d, 0xbe, 0x49, 0x3d, 0x2a, 0x35, 0x8e, 0x33, 0xc9, 0x20, 0x94, 0x5b, 0x7d, 0x18, 0x98, 0x51, + 0x8b, 0xe7, 0xa3, 0x33, 0x82, 0x76, 0x67, 0xf2, 0x78, 0x1a, 0x31, 0x6d, 0xbe, 0x78, 0x64, 0xc4, + 0x6e, 0x00, 0x13, 0x22, 0x26, 0x28, 0x9f, 0xcc, 0x8a, 0x66, 0xf6, 0xf5, 0x78, 0x8f, 0x10, 0xa5, + 0x28, 0x39, 0x91, 0x9f, 0x83, 0xd2, 0x96, 0x7a, 0x8a, 0x83, 0xa7, 0x53, 0x1c, 0x79, 0x5f, 0x4c, + 0xbd, 0x2a, 0x13, 0x1f, 0xcf, 0x35, 0x00, 0x63, 0x96, 0xe4, 0x05, 0x28, 0x5f, 0xdf, 0xa8, 0xea, + 0x51, 0x78, 0x96, 0xf7, 0xfe, 0x38, 0xab, 0x82, 0x26, 0x80, 0xcd, 0x30, 0xad, 0xbe, 0x91, 0xe4, + 0x4d, 0x79, 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0xd5, 0x3f, 0xd6, 0xe7, 0xcf, 0xa5, 0xb0, 0x65, 0x39, + 0x6a, 0x0c, 0xf2, 0x0e, 0x94, 0xe5, 0x7e, 0xc1, 0xd7, 0xa6, 0xf3, 0x27, 0x0b, 0x08, 0xc7, 0x98, + 0x04, 0x9a, 0xf4, 0xf8, 0x9d, 0x2d, 0x7f, 0xa1, 0x80, 0x5e, 0xeb, 0xb5, 0xdb, 0xf3, 0x17, 0xf8, + 0xba, 0x19, 0xdf, 0xd9, 0xc6, 0x20, 0x34, 0xf1, 0xc8, 0xcb, 0xca, 0x85, 0xeb, 0xc9, 0xc4, 0x25, + 0xb6, 0x76, 0xe1, 0xd2, 0x4a, 0xf7, 0x80, 0x98, 0x91, 0xa7, 0x1e, 0xe1, 0x3b, 0xb5, 0x05, 0x0b, + 0x4a, 0xe3, 0xeb, 0x9f, 0x24, 0xf3, 0xf3, 0x09, 0x53, 0xc9, 0xc2, 0xdd, 0x81, 0x98, 0x78, 0x04, + 0x15, 0xb2, 0x05, 0x05, 0xa7, 0xbd, 0x35, 0xff, 0x74, 0x1e, 0xaa, 0x6b, 0x75, 0xad, 0x26, 0x47, + 0x14, 0xf7, 0xf3, 0xac, 0xae, 0xd5, 0x90, 0x11, 0x27, 0x2e, 0x8c, 0x3b, 0xed, 0xad, 0x70, 0x7e, + 0x81, 0xcf, 0xd9, 0xdc, 0x98, 0xc4, 0xc6, 0x83, 0xb5, 0x5a, 0x88, 0x9c, 0x85, 0xfd, 0xc5, 0x31, + 0x7d, 0x51, 0xa3, 0x93, 0x5b, 0xbf, 0x67, 0x4e, 0x20, 0x71, 0xdc, 0xb9, 0x95, 0xdb, 0x04, 0x92, + 0xea, 0xc5, 0x99, 0x81, 0xd3, 0xa7, 0xab, 0x97, 0x8c, 0x5c, 0xb2, 0x62, 0x25, 0x13, 0x77, 0x8b, + 0xd3, 0x73, 0x72, 0xc1, 0xb0, 0xbf, 0x05, 0xda, 0xe8, 0x97, 0x72, 0x7f, 0x0a, 0xa0, 0xe8, 0x86, + 0x91, 0xeb, 0xe7, 0x18, 0x27, 0x9d, 0xca, 0x78, 0xcd, 0xc3, 0x30, 0x38, 0x00, 0x05, 0x2b, 0xc6, + 0xd3, 0x6b, 0xb9, 0xde, 0x03, 0xf9, 0xf9, 0xb7, 0x73, 0xf7, 0x6b, 0x12, 0x3c, 0x39, 0x00, 0x05, + 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, 0x1e, 0x7d, 0x5d, 0x5d, 0xab, 0xa5, 0xf8, 0x25, 0x07, 0xf7, + 0x3d, 0x28, 0x84, 0x1d, 0x57, 0xaa, 0x4b, 0x23, 0xf2, 0xaa, 0xaf, 0xaf, 0x66, 0xf1, 0xaa, 0xaf, + 0xaf, 0x22, 0x63, 0x42, 0xbe, 0x6c, 0x01, 0x38, 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0xb6, 0xce, + 0x8c, 0xf8, 0x92, 0x45, 0x55, 0xd3, 0x4b, 0xb1, 0xe6, 0x9e, 0xbc, 0x31, 0x14, 0x0d, 0xce, 0xe4, + 0x5d, 0x98, 0x74, 0xc4, 0x53, 0x81, 0xd2, 0x29, 0x3d, 0x9f, 0xf7, 0x2f, 0x53, 0x12, 0x70, 0x33, + 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0xb7, 0xdd, 0x5d, 0x69, 0x1c, 0xaa, 0x8f, + 0xfc, 0x98, 0x05, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x2f, 0xc3, 0x3b, 0x9e, 0xa3, + 0x43, 0x0d, 0xf3, 0x09, 0x48, 0x35, 0x83, 0x17, 0x8d, 0x97, 0xe1, 0x4d, 0x46, 0x98, 0xe4, 0x4b, + 0xf6, 0x60, 0xc2, 0xe1, 0x8f, 0x98, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x20, 0x6a, 0xaa, 0x0d, 0xf8, + 0xe2, 0x22, 0x9f, 0x4a, 0x95, 0xdc, 0xc8, 0xaf, 0x59, 0x30, 0x29, 0xfc, 0xa5, 0x99, 0x42, 0xca, + 0xbe, 0xfd, 0xb3, 0xa7, 0x90, 0x39, 0x5f, 0xfa, 0x72, 0x4b, 0x0f, 0xa0, 0x0f, 0x6b, 0x67, 0x50, + 0x51, 0x7a, 0xa4, 0x37, 0xb7, 0x92, 0x6e, 0xe1, 0x13, 0x30, 0x6d, 0x52, 0x19, 0xca, 0x9f, 0xfb, + 0xfb, 0x05, 0x00, 0xde, 0xd0, 0x22, 0xb9, 0x48, 0x87, 0xa7, 0xf9, 0xdd, 0xf1, 0x9b, 0x39, 0x3d, + 0x78, 0x68, 0xe4, 0x08, 0x01, 0x99, 0xd3, 0x77, 0xc7, 0x6f, 0xa2, 0x64, 0x42, 0x5a, 0x30, 0xde, + 0x75, 0xa2, 0x9d, 0xfc, 0x13, 0x92, 0x4c, 0x89, 0x28, 0xdb, 0x68, 0x07, 0x39, 0x03, 0xf2, 0xbe, + 0x15, 0xbb, 0xc6, 0x14, 0xf2, 0x71, 0x60, 0x50, 0x6d, 0xb6, 0x28, 0x9d, 0x61, 0x52, 0x09, 0x3b, + 0xd3, 0x2e, 0x32, 0x0b, 0x1f, 0x58, 0x30, 0x6d, 0xa2, 0x66, 0x74, 0xd3, 0xcf, 0x9a, 0xdd, 0x94, + 0x67, 0x7b, 0x98, 0x3d, 0xfe, 0xdf, 0x2c, 0x00, 0xec, 0x79, 0xf5, 0x5e, 0xa7, 0xc3, 0x94, 0x6e, + 0xed, 0xb6, 0x6e, 0x1d, 0xdb, 0x6d, 0x7d, 0x6c, 0x48, 0xb7, 0xf5, 0xc2, 0x50, 0x6e, 0xeb, 0xe3, + 0xc3, 0xbb, 0xad, 0x17, 0x07, 0xbb, 0xad, 0xdb, 0x5f, 0xb7, 0xe0, 0x6c, 0xdf, 0x6e, 0xc3, 0xf4, + 0xe0, 0xc0, 0xf7, 0xa3, 0x01, 0x2e, 0x8f, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x2b, 0x30, 0x27, 0x1f, + 0xb5, 0xa8, 0x77, 0xdb, 0x6e, 0x66, 0xb2, 0x98, 0xcd, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, 0xdf, 0xb2, + 0xa0, 0x6c, 0x84, 0x98, 0xb3, 0xef, 0xe0, 0x7e, 0xaf, 0x52, 0x8c, 0xf8, 0x3d, 0x0f, 0x7e, 0x51, + 0x25, 0x60, 0xe2, 0xce, 0xb4, 0x65, 0xa4, 0x3c, 0x8f, 0xef, 0x4c, 0x59, 0x29, 0x4a, 0xa8, 0x48, + 0x66, 0x4d, 0xbb, 0xbc, 0xd1, 0x0b, 0x66, 0x32, 0x6b, 0xda, 0x45, 0x0e, 0xe1, 0xec, 0xd8, 0x81, + 0x40, 0xba, 0xb4, 0x1a, 0xcf, 0x87, 0x38, 0x41, 0x84, 0x02, 0x46, 0x9e, 0x83, 0x02, 0xf5, 0x9a, + 0xd2, 0x7a, 0xa1, 0x1f, 0xf8, 0xbc, 0xea, 0x35, 0x91, 0x95, 0xdb, 0xb7, 0x60, 0x5a, 0xb8, 0xf3, + 0xbe, 0x45, 0xf7, 0x8f, 0xfd, 0x62, 0x28, 0x1b, 0xed, 0xa9, 0x17, 0x43, 0x59, 0x75, 0x56, 0x6e, + 0xff, 0x63, 0x0b, 0x52, 0x6f, 0xdc, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, + 0x76, 0xa4, 0xcd, 0xfd, 0x06, 0x90, 0x0e, 0x9b, 0x0a, 0x89, 0x17, 0x9d, 0xa4, 0xe1, 0x28, 0x4e, + 0x68, 0xd1, 0x87, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x24, 0x84, 0x35, 0x5f, 0xbd, 0x79, 0x74, 0x03, + 0xf4, 0xa0, 0xc8, 0x49, 0x49, 0xeb, 0xd9, 0x88, 0x96, 0xe7, 0xfe, 0xc4, 0x50, 0x71, 0x47, 0xca, + 0x29, 0xcf, 0xb9, 0xd9, 0x7f, 0x28, 0x64, 0x35, 0x9e, 0xc5, 0x39, 0x86, 0xac, 0x9d, 0xa4, 0xac, + 0xd7, 0xf3, 0x5a, 0x2b, 0xb3, 0x65, 0x24, 0x8b, 0x00, 0x5d, 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0x40, + 0x9b, 0xa2, 0x0c, 0xf9, 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0x5f, 0x63, 0x13, 0x28, 0x7e, 0x4b, 0x97, + 0x5c, 0x4e, 0xfb, 0x8a, 0xa6, 0x27, 0x87, 0x76, 0x15, 0x35, 0xc2, 0x2f, 0xc6, 0x1e, 0x11, 0x7e, + 0xf1, 0x22, 0x4c, 0x06, 0x7e, 0x9b, 0x56, 0x03, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa2, + 0x82, 0xdb, 0xbf, 0x62, 0xc1, 0x5c, 0x3a, 0x3e, 0x2c, 0x77, 0x07, 0x56, 0x33, 0x88, 0xbd, 0x30, + 0x7c, 0x10, 0xbb, 0xfd, 0x3e, 0x13, 0x32, 0x72, 0x1b, 0xbb, 0xae, 0x27, 0xe2, 0xbe, 0x59, 0xcb, + 0xbd, 0x08, 0x93, 0x54, 0xbe, 0x09, 0x2a, 0x8c, 0xc0, 0x5a, 0x48, 0xf5, 0x14, 0xa8, 0x82, 0x93, + 0x2a, 0xcc, 0xaa, 0xab, 0x2f, 0x65, 0xb9, 0x17, 0xf9, 0x2a, 0xb4, 0xa5, 0x70, 0x25, 0x09, 0xc6, + 0x34, 0xbe, 0xfd, 0x05, 0x28, 0x1b, 0x9b, 0x12, 0x5f, 0xbf, 0x1f, 0x38, 0x8d, 0x28, 0xbd, 0xee, + 0x5d, 0x65, 0x85, 0x28, 0x60, 0xfc, 0x82, 0x41, 0x84, 0xaf, 0xa4, 0xd6, 0x3d, 0x19, 0xb4, 0x22, + 0xa1, 0x8c, 0x58, 0x40, 0x5b, 0xf4, 0x81, 0xca, 0x48, 0xaf, 0x88, 0x21, 0x2b, 0x44, 0x01, 0xb3, + 0x5f, 0x82, 0x29, 0x95, 0x55, 0x88, 0xa7, 0xe6, 0x50, 0xc6, 0x6f, 0x33, 0x35, 0x87, 0x1f, 0x44, + 0xc8, 0x21, 0xf6, 0xdb, 0x30, 0xa5, 0x92, 0x1f, 0x3d, 0x1a, 0x9b, 0x2d, 0x45, 0xa1, 0xe7, 0x5e, + 0xf7, 0xc3, 0x48, 0x65, 0x6c, 0x12, 0xf7, 0x73, 0x37, 0x57, 0x79, 0x19, 0x6a, 0xa8, 0xfd, 0x67, + 0x16, 0x94, 0x37, 0x37, 0xd7, 0xf4, 0xb1, 0x1d, 0xe1, 0xc9, 0x50, 0xb4, 0x50, 0x75, 0x3b, 0xa2, + 0xa6, 0x23, 0x80, 0x58, 0xf8, 0x16, 0x0e, 0x0f, 0x2a, 0x4f, 0xd6, 0x33, 0x31, 0x70, 0x40, 0x4d, + 0xb2, 0x0a, 0xe7, 0x4c, 0x88, 0x8c, 0xa4, 0x97, 0x6b, 0x24, 0x7f, 0x44, 0xb6, 0xde, 0x0f, 0xc6, + 0xac, 0x3a, 0x69, 0x52, 0x72, 0xbb, 0x37, 0xdf, 0xa3, 0xad, 0xf7, 0x83, 0x31, 0xab, 0x8e, 0xfd, + 0x32, 0xcc, 0xa6, 0x6e, 0xa8, 0x8f, 0x91, 0xc1, 0xe4, 0x77, 0x0b, 0x30, 0x6d, 0x5e, 0x54, 0x1e, + 0x63, 0xfd, 0x3a, 0xfe, 0xb6, 0x90, 0x71, 0xb9, 0x58, 0x18, 0xf2, 0x72, 0xd1, 0xbc, 0xcd, 0x1d, + 0x3f, 0xdd, 0xdb, 0xdc, 0x62, 0x3e, 0xb7, 0xb9, 0x86, 0xd7, 0xc1, 0xc4, 0xe3, 0xf3, 0x3a, 0xf8, + 0xed, 0x22, 0xcc, 0x24, 0x53, 0x62, 0x1e, 0xa3, 0x27, 0x5f, 0xea, 0xeb, 0xc9, 0x21, 0x6f, 0x33, + 0x0a, 0xa3, 0xde, 0x66, 0x8c, 0x8f, 0x7a, 0x9b, 0x51, 0x3c, 0xc1, 0x6d, 0x46, 0xff, 0x5d, 0xc4, + 0xc4, 0xb1, 0xef, 0x22, 0x3e, 0xa9, 0xfd, 0x11, 0x27, 0x13, 0x0e, 0x3c, 0xb1, 0x3f, 0x22, 0x49, + 0x76, 0xc3, 0xb2, 0xdf, 0xcc, 0xf4, 0xeb, 0x9c, 0x7a, 0x84, 0xd5, 0x36, 0xc8, 0x74, 0x1f, 0x1c, + 0xfe, 0xc2, 0xf4, 0xc9, 0x21, 0x5c, 0x07, 0x5f, 0x85, 0xb2, 0x1c, 0x4f, 0x5c, 0xf9, 0x86, 0xa4, + 0xe2, 0x5e, 0x8f, 0x41, 0x68, 0xe2, 0xf1, 0xe7, 0xe4, 0xe3, 0x09, 0xc2, 0xef, 0xd5, 0xca, 0xa9, + 0xe7, 0xe4, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x9f, 0x87, 0x0b, 0x99, 0x06, 0x14, 0x6e, 0xbc, 0xe6, + 0x7a, 0x21, 0x6d, 0x4a, 0x04, 0x43, 0x8c, 0xd4, 0x33, 0x14, 0x0b, 0x77, 0x07, 0x62, 0xe2, 0x11, + 0x54, 0xec, 0xdf, 0x2c, 0xc0, 0x4c, 0xf2, 0x2d, 0x52, 0x72, 0x5f, 0x9b, 0x5b, 0x73, 0xb1, 0xf4, + 0x0a, 0xb2, 0x46, 0x9a, 0xc5, 0x81, 0xd7, 0x34, 0xf7, 0xf9, 0xf8, 0xda, 0xd2, 0x39, 0x1f, 0x4f, + 0x8f, 0xb1, 0xbc, 0x1f, 0x91, 0xec, 0xf8, 0x73, 0xa3, 0x71, 0x44, 0xa6, 0x3c, 0xc7, 0xe7, 0xce, + 0x3d, 0x8e, 0x2c, 0xd4, 0xac, 0xd0, 0x60, 0xcb, 0xf6, 0x96, 0x3d, 0x1a, 0xb8, 0xdb, 0xae, 0x7e, + 0x47, 0x9d, 0xaf, 0xdc, 0x6f, 0xcb, 0x32, 0xd4, 0x50, 0xfb, 0xfd, 0x31, 0x28, 0xf1, 0x04, 0x52, + 0xd7, 0x02, 0xbf, 0xc3, 0x1f, 0xec, 0x0b, 0x8d, 0x33, 0x93, 0xec, 0xb6, 0x1b, 0xa3, 0xbe, 0x8a, + 0x19, 0x53, 0x94, 0xbe, 0xe2, 0x46, 0x09, 0x26, 0x38, 0x92, 0x2e, 0x4c, 0x6d, 0xcb, 0x84, 0xb7, + 0xb2, 0xef, 0x46, 0x4c, 0xda, 0xa8, 0xd2, 0xe7, 0x8a, 0x26, 0x50, 0xff, 0x50, 0x73, 0xb1, 0x1d, + 0x98, 0x4d, 0x65, 0x00, 0xc9, 0x3d, 0x4d, 0xee, 0xff, 0x1c, 0x87, 0x92, 0x0e, 0x54, 0x22, 0x1f, + 0x4f, 0x18, 0xb0, 0x4a, 0xb5, 0x0f, 0x19, 0xaf, 0x49, 0xed, 0xf8, 0xcd, 0x87, 0x07, 0x95, 0x59, + 0x8d, 0x9c, 0x32, 0x46, 0x3d, 0x07, 0x85, 0x5e, 0xd0, 0x4e, 0x9f, 0x50, 0xef, 0xe0, 0x1a, 0xb2, + 0x72, 0x33, 0xb8, 0xaa, 0xf0, 0x58, 0x83, 0xab, 0xd8, 0x2e, 0xb9, 0xe5, 0x37, 0xf7, 0xd3, 0xaf, + 0x4f, 0xd5, 0xfc, 0xe6, 0x3e, 0x72, 0x08, 0x79, 0x03, 0x66, 0x64, 0xc4, 0x98, 0xf9, 0x26, 0x7f, + 0x21, 0x76, 0x3b, 0xd8, 0x4c, 0x40, 0x31, 0x85, 0xcd, 0x76, 0xd9, 0x7b, 0xa1, 0xef, 0xf1, 0xe4, + 0xc7, 0x13, 0xc9, 0x3b, 0xca, 0x1b, 0xf5, 0x5b, 0x37, 0xb9, 0x21, 0x4d, 0x63, 0x24, 0x82, 0xd2, + 0x26, 0x1f, 0x19, 0x94, 0xb6, 0x22, 0x68, 0x33, 0x69, 0xf9, 0x8e, 0x32, 0x5d, 0xbb, 0xac, 0xe8, + 0xb2, 0xb2, 0x87, 0x07, 0x47, 0x98, 0x38, 0x75, 0xcd, 0xac, 0xf0, 0xbd, 0xd2, 0x0f, 0x2f, 0x7c, + 0xcf, 0xbe, 0x03, 0xb3, 0xa9, 0xfe, 0x53, 0x06, 0x0e, 0x2b, 0xdb, 0xc0, 0x71, 0xbc, 0xf7, 0xab, + 0xfe, 0xa9, 0x05, 0x67, 0xfb, 0x56, 0xa4, 0xe3, 0xc6, 0x51, 0xa6, 0xf7, 0xc6, 0xb1, 0x93, 0xef, + 0x8d, 0x85, 0xe1, 0xf6, 0xc6, 0xda, 0xd6, 0xb7, 0xbf, 0x77, 0xf1, 0x89, 0xef, 0x7c, 0xef, 0xe2, + 0x13, 0x7f, 0xf4, 0xbd, 0x8b, 0x4f, 0xbc, 0x7f, 0x78, 0xd1, 0xfa, 0xf6, 0xe1, 0x45, 0xeb, 0x3b, + 0x87, 0x17, 0xad, 0x3f, 0x3a, 0xbc, 0x68, 0xfd, 0xa7, 0xc3, 0x8b, 0xd6, 0xd7, 0xff, 0xf4, 0xe2, + 0x13, 0x9f, 0xfa, 0x64, 0xdc, 0x53, 0x4b, 0xaa, 0xa7, 0xf8, 0x8f, 0x8f, 0xa8, 0x7e, 0x59, 0xea, + 0xee, 0xb6, 0x96, 0x58, 0x4f, 0x2d, 0xe9, 0x12, 0xd5, 0x53, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, + 0x9b, 0x74, 0x0a, 0x77, 0x6d, 0xa4, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -4238,6 +4274,18 @@ func (m *AnalysisRunSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.TTLStrategy != nil { + { + size, err := m.TTLStrategy.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if len(m.MeasurementRetention) > 0 { for iNdEx := len(m.MeasurementRetention) - 1; iNdEx >= 0; iNdEx-- { { @@ -4325,6 +4373,18 @@ func (m *AnalysisRunStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.CompletedAt != nil { + { + size, err := m.CompletedAt.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } if m.DryRunSummary != nil { { size, err := m.DryRunSummary.MarshalToSizedBuffer(dAtA[:i]) @@ -9734,6 +9794,44 @@ func (m *TLSRoute) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TTLStrategy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TTLStrategy) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TTLStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SecondsAfterSuccess != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SecondsAfterSuccess)) + i-- + dAtA[i] = 0x18 + } + if m.SecondsAfterFailure != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SecondsAfterFailure)) + i-- + dAtA[i] = 0x10 + } + if m.SecondsAfterCompletion != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.SecondsAfterCompletion)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *TemplateService) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10412,6 +10510,10 @@ func (m *AnalysisRunSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.TTLStrategy != nil { + l = m.TTLStrategy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -10441,6 +10543,10 @@ func (m *AnalysisRunStatus) Size() (n int) { l = m.DryRunSummary.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.CompletedAt != nil { + l = m.CompletedAt.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12423,6 +12529,24 @@ func (m *TLSRoute) Size() (n int) { return n } +func (m *TTLStrategy) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SecondsAfterCompletion != nil { + n += 1 + sovGenerated(uint64(*m.SecondsAfterCompletion)) + } + if m.SecondsAfterFailure != nil { + n += 1 + sovGenerated(uint64(*m.SecondsAfterFailure)) + } + if m.SecondsAfterSuccess != nil { + n += 1 + sovGenerated(uint64(*m.SecondsAfterSuccess)) + } + return n +} + func (m *TemplateService) Size() (n int) { if m == nil { return 0 @@ -12755,6 +12879,7 @@ func (this *AnalysisRunSpec) String() string { `Terminate:` + fmt.Sprintf("%v", this.Terminate) + `,`, `DryRun:` + repeatedStringForDryRun + `,`, `MeasurementRetention:` + repeatedStringForMeasurementRetention + `,`, + `TTLStrategy:` + strings.Replace(this.TTLStrategy.String(), "TTLStrategy", "TTLStrategy", 1) + `,`, `}`, }, "") return s @@ -12775,6 +12900,7 @@ func (this *AnalysisRunStatus) String() string { `StartedAt:` + strings.Replace(fmt.Sprintf("%v", this.StartedAt), "Time", "v1.Time", 1) + `,`, `RunSummary:` + strings.Replace(strings.Replace(this.RunSummary.String(), "RunSummary", "RunSummary", 1), `&`, ``, 1) + `,`, `DryRunSummary:` + strings.Replace(this.DryRunSummary.String(), "RunSummary", "RunSummary", 1) + `,`, + `CompletedAt:` + strings.Replace(fmt.Sprintf("%v", this.CompletedAt), "Time", "v1.Time", 1) + `,`, `}`, }, "") return s @@ -14270,6 +14396,18 @@ func (this *TLSRoute) String() string { }, "") return s } +func (this *TTLStrategy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TTLStrategy{`, + `SecondsAfterCompletion:` + valueToStringGenerated(this.SecondsAfterCompletion) + `,`, + `SecondsAfterFailure:` + valueToStringGenerated(this.SecondsAfterFailure) + `,`, + `SecondsAfterSuccess:` + valueToStringGenerated(this.SecondsAfterSuccess) + `,`, + `}`, + }, "") + return s +} func (this *TemplateService) String() string { if this == nil { return "nil" @@ -15820,6 +15958,42 @@ func (m *AnalysisRunSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TTLStrategy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TTLStrategy == nil { + m.TTLStrategy = &TTLStrategy{} + } + if err := m.TTLStrategy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -16073,6 +16247,42 @@ func (m *AnalysisRunStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedAt", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CompletedAt == nil { + m.CompletedAt = &v1.Time{} + } + if err := m.CompletedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -33136,6 +33346,116 @@ func (m *TLSRoute) Unmarshal(dAtA []byte) error { } return nil } +func (m *TTLStrategy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TTLStrategy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TTLStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SecondsAfterCompletion", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SecondsAfterCompletion = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SecondsAfterFailure", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SecondsAfterFailure = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SecondsAfterSuccess", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SecondsAfterSuccess = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TemplateService) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 329a2ae483..8a9f2997f5 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -143,6 +143,10 @@ message AnalysisRunSpec { // +patchStrategy=merge // +optional repeated MeasurementRetention measurementRetention = 5; + + // TTLStrategy object contains the strategy for the time to live depending on if the analysis succeeded or failed + // +optional + optional TTLStrategy ttlStrategy = 6; } // AnalysisRunStatus is the status for a AnalysisRun resource @@ -164,6 +168,9 @@ message AnalysisRunStatus { // DryRunSummary contains the final results from the metric executions in the dry-run mode optional RunSummary dryRunSummary = 6; + + // CompletedAt indicates when the analysisRun completed + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time completedAt = 7; } // AnalysisRunStrategy configuration for the analysis runs and experiments to retain @@ -1741,6 +1748,18 @@ message TLSRoute { repeated string sniHosts = 2; } +// TTLStrategy defines the strategy for the time to live depending on if the analysis succeeded or failed +message TTLStrategy { + // SecondsAfterCompletion is the number of seconds to live after completion. + optional int32 secondsAfterCompletion = 1; + + // SecondsAfterFailure is the number of seconds to live after failure. + optional int32 secondsAfterFailure = 2; + + // SecondsAfterSuccess is the number of seconds to live after success. + optional int32 secondsAfterSuccess = 3; +} + message TemplateService { // Name of the service generated by the experiment optional string name = 1; diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 81ac6b4a3d..49dc9c1f60 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -130,6 +130,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.StringMatch": schema_pkg_apis_rollouts_v1alpha1_StringMatch(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TCPRoute": schema_pkg_apis_rollouts_v1alpha1_TCPRoute(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TLSRoute": schema_pkg_apis_rollouts_v1alpha1_TLSRoute(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TTLStrategy": schema_pkg_apis_rollouts_v1alpha1_TTLStrategy(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TemplateService": schema_pkg_apis_rollouts_v1alpha1_TemplateService(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TemplateSpec": schema_pkg_apis_rollouts_v1alpha1_TemplateSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TemplateStatus": schema_pkg_apis_rollouts_v1alpha1_TemplateStatus(ref), @@ -549,12 +550,18 @@ func schema_pkg_apis_rollouts_v1alpha1_AnalysisRunSpec(ref common.ReferenceCallb }, }, }, + "ttlStrategy": { + SchemaProps: spec.SchemaProps{ + Description: "TTLStrategy object contains the strategy for the time to live depending on if the analysis succeeded or failed", + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TTLStrategy"), + }, + }, }, Required: []string{"metrics"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Metric"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Metric", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TTLStrategy"}, } } @@ -613,6 +620,12 @@ func schema_pkg_apis_rollouts_v1alpha1_AnalysisRunStatus(ref common.ReferenceCal Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RunSummary"), }, }, + "completedAt": { + SchemaProps: spec.SchemaProps{ + Description: "CompletedAt indicates when the analysisRun completed", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, }, Required: []string{"phase"}, }, @@ -5175,6 +5188,40 @@ func schema_pkg_apis_rollouts_v1alpha1_TLSRoute(ref common.ReferenceCallback) co } } +func schema_pkg_apis_rollouts_v1alpha1_TTLStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "TTLStrategy defines the strategy for the time to live depending on if the analysis succeeded or failed", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "secondsAfterCompletion": { + SchemaProps: spec.SchemaProps{ + Description: "SecondsAfterCompletion is the number of seconds to live after completion.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "secondsAfterFailure": { + SchemaProps: spec.SchemaProps{ + Description: "SecondsAfterFailure is the number of seconds to live after failure.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "secondsAfterSuccess": { + SchemaProps: spec.SchemaProps{ + Description: "SecondsAfterSuccess is the number of seconds to live after success.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_TemplateService(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 82b7cc8cc4..0b962704f3 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -234,6 +234,11 @@ func (in *AnalysisRunSpec) DeepCopyInto(out *AnalysisRunSpec) { *out = make([]MeasurementRetention, len(*in)) copy(*out, *in) } + if in.TTLStrategy != nil { + in, out := &in.TTLStrategy, &out.TTLStrategy + *out = new(TTLStrategy) + (*in).DeepCopyInto(*out) + } return } @@ -267,6 +272,10 @@ func (in *AnalysisRunStatus) DeepCopyInto(out *AnalysisRunStatus) { *out = new(RunSummary) **out = **in } + if in.CompletedAt != nil { + in, out := &in.CompletedAt, &out.CompletedAt + *out = (*in).DeepCopy() + } return } @@ -2782,6 +2791,37 @@ func (in *TLSRoute) DeepCopy() *TLSRoute { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TTLStrategy) DeepCopyInto(out *TTLStrategy) { + *out = *in + if in.SecondsAfterCompletion != nil { + in, out := &in.SecondsAfterCompletion, &out.SecondsAfterCompletion + *out = new(int32) + **out = **in + } + if in.SecondsAfterFailure != nil { + in, out := &in.SecondsAfterFailure, &out.SecondsAfterFailure + *out = new(int32) + **out = **in + } + if in.SecondsAfterSuccess != nil { + in, out := &in.SecondsAfterSuccess, &out.SecondsAfterSuccess + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TTLStrategy. +func (in *TTLStrategy) DeepCopy() *TTLStrategy { + if in == nil { + return nil + } + out := new(TTLStrategy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TemplateService) DeepCopyInto(out *TemplateService) { *out = *in diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index b6aa86dd83..254fc390a1 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -244,6 +244,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec */ measurementRetention?: Array; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunSpec + */ + ttlStrategy?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy; } /** * @@ -287,6 +293,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus */ dryRunSummary?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RunSummary; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1Time} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunStatus + */ + completedAt?: K8sIoApimachineryPkgApisMetaV1Time; } /** * @@ -2804,6 +2816,31 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TLSRoute { */ sniHosts?: Array; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy { + /** + * SecondsAfterCompletion is the number of seconds to live after completion. + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy + */ + secondsAfterCompletion?: number; + /** + * SecondsAfterFailure is the number of seconds to live after failure. + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy + */ + secondsAfterFailure?: number; + /** + * SecondsAfterSuccess is the number of seconds to live after success. + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1TTLStrategy + */ + secondsAfterSuccess?: number; +} /** * * @export From 8405f2e75c6307ac8e2c8ed326099042e57dd3d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:38:15 -0600 Subject: [PATCH 178/264] chore(deps): bump github.com/evanphx/json-patch/v5 from 5.8.1 to 5.9.0 (#3335) Bumps [github.com/evanphx/json-patch/v5](https://github.com/evanphx/json-patch) from 5.8.1 to 5.9.0. - [Release notes](https://github.com/evanphx/json-patch/releases) - [Commits](https://github.com/evanphx/json-patch/compare/v5.8.1...v5.9.0) --- updated-dependencies: - dependency-name: github.com/evanphx/json-patch/v5 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c981fb6455..ca61247c84 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 - github.com/evanphx/json-patch/v5 v5.8.1 + github.com/evanphx/json-patch/v5 v5.9.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index d9627b2016..6861ef828d 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0 github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.1 h1:iPEdwg0XayoS+E7Mth9JxwUtOgyVxnDTXHtKhZPlZxA= -github.com/evanphx/json-patch/v5 v5.8.1/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= From a1c0801371281fc2a8835c28e8186d770e4e43ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:52:27 -0600 Subject: [PATCH 179/264] chore(deps): bump codecov/codecov-action from 3.1.5 to 4.0.1 (#3347) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.5 to 4.0.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.5...v4.0.1) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 09397f3a4d..82d346a814 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v3.1.5 + uses: codecov/codecov-action@v4.0.1 with: file: coverage.out From 7258fe7579054c30e0a646aaf81e28c2e90267ed Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar <44349253+gdsoumya@users.noreply.github.com> Date: Sun, 4 Feb 2024 00:03:17 +0530 Subject: [PATCH 180/264] feat: support ability to run only the analysis controller (#3336) * feat: allow running only analysis controller Signed-off-by: Soumya Ghosh Dastidar * refactor: resolve review comments Signed-off-by: Soumya Ghosh Dastidar --------- Signed-off-by: Soumya Ghosh Dastidar --- cmd/rollouts-controller/main.go | 113 +++++++++++++++------- controller/controller.go | 160 +++++++++++++++++++++++++------- controller/metrics/metrics.go | 8 +- utils/record/record.go | 22 +++-- 4 files changed, 225 insertions(+), 78 deletions(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index ad7190c585..99afcef49e 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -7,7 +7,6 @@ import ( "time" "github.com/argoproj/argo-rollouts/utils/record" - "github.com/argoproj/pkg/kubeclientmetrics" smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned" log "github.com/sirupsen/logrus" @@ -42,8 +41,12 @@ const ( cliName = "argo-rollouts" jsonFormat = "json" textFormat = "text" + + controllerAnalysis = "analysis" ) +var supportedControllers = map[string]bool{controllerAnalysis: true} + func newCommand() *cobra.Command { var ( clientConfig clientcmd.ClientConfig @@ -72,6 +75,7 @@ func newCommand() *cobra.Command { namespaced bool printVersion bool selfServiceNotificationEnabled bool + controllersEnabled []string ) electOpts := controller.NewLeaderElectionOptions() var command = cobra.Command{ @@ -185,41 +189,67 @@ func newCommand() *cobra.Command { ingressWrapper, err := ingressutil.NewIngressWrapper(mode, kubeClient, kubeInformerFactory) checkError(err) - cm := controller.NewManager( - namespace, - kubeClient, - argoprojClient, - dynamicClient, - smiClient, - discoveryClient, - kubeInformerFactory.Apps().V1().ReplicaSets(), - kubeInformerFactory.Core().V1().Services(), - ingressWrapper, - jobInformerFactory.Batch().V1().Jobs(), - tolerantinformer.NewTolerantRolloutInformer(dynamicInformerFactory), - tolerantinformer.NewTolerantExperimentInformer(dynamicInformerFactory), - tolerantinformer.NewTolerantAnalysisRunInformer(dynamicInformerFactory), - tolerantinformer.NewTolerantAnalysisTemplateInformer(dynamicInformerFactory), - tolerantinformer.NewTolerantClusterAnalysisTemplateInformer(clusterDynamicInformerFactory), - istioPrimaryDynamicClient, - istioDynamicInformerFactory.ForResource(istioutil.GetIstioVirtualServiceGVR()).Informer(), - istioDynamicInformerFactory.ForResource(istioutil.GetIstioDestinationRuleGVR()).Informer(), - notificationConfigMapInformerFactory, - notificationSecretInformerFactory, - resyncDuration, - instanceID, - metricsPort, - healthzPort, - k8sRequestProvider, - nginxIngressClasses, - albIngressClasses, - dynamicInformerFactory, - clusterDynamicInformerFactory, - istioDynamicInformerFactory, - namespaced, - kubeInformerFactory, - jobInformerFactory) + var cm *controller.Manager + + enabledControllers, err := getEnabledControllers(controllersEnabled) + checkError(err) + // currently only supports running analysis controller independently + if enabledControllers[controllerAnalysis] { + log.Info("Running only analysis controller") + cm = controller.NewAnalysisManager( + namespace, + kubeClient, + argoprojClient, + jobInformerFactory.Batch().V1().Jobs(), + tolerantinformer.NewTolerantAnalysisRunInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantAnalysisTemplateInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantClusterAnalysisTemplateInformer(clusterDynamicInformerFactory), + resyncDuration, + metricsPort, + healthzPort, + k8sRequestProvider, + dynamicInformerFactory, + clusterDynamicInformerFactory, + namespaced, + kubeInformerFactory, + jobInformerFactory) + } else { + cm = controller.NewManager( + namespace, + kubeClient, + argoprojClient, + dynamicClient, + smiClient, + discoveryClient, + kubeInformerFactory.Apps().V1().ReplicaSets(), + kubeInformerFactory.Core().V1().Services(), + ingressWrapper, + jobInformerFactory.Batch().V1().Jobs(), + tolerantinformer.NewTolerantRolloutInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantExperimentInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantAnalysisRunInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantAnalysisTemplateInformer(dynamicInformerFactory), + tolerantinformer.NewTolerantClusterAnalysisTemplateInformer(clusterDynamicInformerFactory), + istioPrimaryDynamicClient, + istioDynamicInformerFactory.ForResource(istioutil.GetIstioVirtualServiceGVR()).Informer(), + istioDynamicInformerFactory.ForResource(istioutil.GetIstioDestinationRuleGVR()).Informer(), + notificationConfigMapInformerFactory, + notificationSecretInformerFactory, + resyncDuration, + instanceID, + metricsPort, + healthzPort, + k8sRequestProvider, + nginxIngressClasses, + albIngressClasses, + dynamicInformerFactory, + clusterDynamicInformerFactory, + istioDynamicInformerFactory, + namespaced, + kubeInformerFactory, + jobInformerFactory) + } if err = cm.Run(ctx, rolloutThreads, serviceThreads, ingressThreads, experimentThreads, analysisThreads, electOpts); err != nil { log.Fatalf("Error running controller: %s", err.Error()) } @@ -262,6 +292,7 @@ func newCommand() *cobra.Command { command.Flags().DurationVar(&electOpts.LeaderElectionRenewDeadline, "leader-election-renew-deadline", controller.DefaultLeaderElectionRenewDeadline, "The interval between attempts by the acting master to renew a leadership slot before it stops leading. This must be less than or equal to the lease duration. This is only applicable if leader election is enabled.") command.Flags().DurationVar(&electOpts.LeaderElectionRetryPeriod, "leader-election-retry-period", controller.DefaultLeaderElectionRetryPeriod, "The duration the clients should wait between attempting acquisition and renewal of a leadership. This is only applicable if leader election is enabled.") command.Flags().BoolVar(&selfServiceNotificationEnabled, "self-service-notification-enabled", false, "Allows rollouts controller to pull notification config from the namespace that the rollout resource is in. This is useful for self-service notification.") + command.Flags().StringSliceVar(&controllersEnabled, "controllers", nil, "Explicitly specify the list of controllers to run, currently only supports 'analysis', eg. --controller=analysis. Default: all controllers are enabled") return &command } @@ -315,3 +346,15 @@ func checkError(err error) { log.Fatal(err) } } + +func getEnabledControllers(controllersEnabled []string) (map[string]bool, error) { + enabledControllers := make(map[string]bool) + for _, controller := range controllersEnabled { + if supportedControllers[controller] { + enabledControllers[controller] = true + } else { + return nil, fmt.Errorf("unsupported controller: %s", controller) + } + } + return enabledControllers, nil +} diff --git a/controller/controller.go b/controller/controller.go index afe4bc769b..9aaf8ee09f 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -163,6 +163,87 @@ type Manager struct { notificationSecretInformerFactory kubeinformers.SharedInformerFactory jobInformerFactory kubeinformers.SharedInformerFactory istioPrimaryDynamicClient dynamic.Interface + + onlyAnalysisMode bool +} + +func NewAnalysisManager( + namespace string, + kubeclientset kubernetes.Interface, + argoprojclientset clientset.Interface, + jobInformer batchinformers.JobInformer, + analysisRunInformer informers.AnalysisRunInformer, + analysisTemplateInformer informers.AnalysisTemplateInformer, + clusterAnalysisTemplateInformer informers.ClusterAnalysisTemplateInformer, + resyncPeriod time.Duration, + metricsPort int, + healthzPort int, + k8sRequestProvider *metrics.K8sRequestsCountProvider, + dynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory, + clusterDynamicInformerFactory dynamicinformer.DynamicSharedInformerFactory, + namespaced bool, + kubeInformerFactory kubeinformers.SharedInformerFactory, + jobInformerFactory kubeinformers.SharedInformerFactory, +) *Manager { + runtime.Must(rolloutscheme.AddToScheme(scheme.Scheme)) + log.Info("Creating event broadcaster") + + metricsAddr := fmt.Sprintf(listenAddr, metricsPort) + metricsServer := metrics.NewMetricsServer(metrics.ServerConfig{ + Addr: metricsAddr, + RolloutLister: nil, + AnalysisRunLister: analysisRunInformer.Lister(), + AnalysisTemplateLister: analysisTemplateInformer.Lister(), + ClusterAnalysisTemplateLister: clusterAnalysisTemplateInformer.Lister(), + ExperimentLister: nil, + K8SRequestProvider: k8sRequestProvider, + }) + + healthzServer := NewHealthzServer(fmt.Sprintf(listenAddr, healthzPort)) + analysisRunWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "AnalysisRuns") + recorder := record.NewEventRecorder(kubeclientset, metrics.MetricRolloutEventsTotal, metrics.MetricNotificationFailedTotal, metrics.MetricNotificationSuccessTotal, metrics.MetricNotificationSend, nil) + analysisController := analysis.NewController(analysis.ControllerConfig{ + KubeClientSet: kubeclientset, + ArgoProjClientset: argoprojclientset, + AnalysisRunInformer: analysisRunInformer, + JobInformer: jobInformer, + ResyncPeriod: resyncPeriod, + AnalysisRunWorkQueue: analysisRunWorkqueue, + MetricsServer: metricsServer, + Recorder: recorder, + }) + + cm := &Manager{ + wg: &sync.WaitGroup{}, + metricsServer: metricsServer, + healthzServer: healthzServer, + jobSynced: jobInformer.Informer().HasSynced, + analysisRunSynced: analysisRunInformer.Informer().HasSynced, + analysisTemplateSynced: analysisTemplateInformer.Informer().HasSynced, + clusterAnalysisTemplateSynced: clusterAnalysisTemplateInformer.Informer().HasSynced, + analysisRunWorkqueue: analysisRunWorkqueue, + analysisController: analysisController, + namespace: namespace, + kubeClientSet: kubeclientset, + dynamicInformerFactory: dynamicInformerFactory, + clusterDynamicInformerFactory: clusterDynamicInformerFactory, + namespaced: namespaced, + kubeInformerFactory: kubeInformerFactory, + jobInformerFactory: jobInformerFactory, + onlyAnalysisMode: true, + } + + _, err := rolloutsConfig.InitializeConfig(kubeclientset, defaults.DefaultRolloutsConfigMapName) + if err != nil { + log.Fatalf("Failed to init config: %v", err) + } + + err = plugin.DownloadPlugins(plugin.FileDownloaderImpl{}) + if err != nil { + log.Fatalf("Failed to download plugins: %v", err) + } + + return cm } // NewManager returns a new manager to manage all the controllers @@ -441,11 +522,13 @@ func (c *Manager) Run(ctx context.Context, rolloutThreadiness, serviceThreadines log.Info("Shutting down workers") goPlugin.CleanupClients() - c.serviceWorkqueue.ShutDownWithDrain() - c.ingressWorkqueue.ShutDownWithDrain() - c.rolloutWorkqueue.ShutDownWithDrain() - c.experimentWorkqueue.ShutDownWithDrain() - c.analysisRunWorkqueue.ShutDownWithDrain() + if !c.onlyAnalysisMode { + c.serviceWorkqueue.ShutDownWithDrain() + c.ingressWorkqueue.ShutDownWithDrain() + c.rolloutWorkqueue.ShutDownWithDrain() + c.experimentWorkqueue.ShutDownWithDrain() + } + c.analysisRunWorkqueue.ShutDownWithDrain() ctxWithTimeout, cancel := context.WithTimeout(ctx, 5*time.Second) // give max of 10 seconds for http servers to shut down @@ -463,12 +546,6 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT // Start the informer factories to begin populating the informer caches log.Info("Starting Controllers") - c.notificationConfigMapInformerFactory.Start(ctx.Done()) - c.notificationSecretInformerFactory.Start(ctx.Done()) - if ok := cache.WaitForCacheSync(ctx.Done(), c.configMapSynced, c.secretSynced); !ok { - log.Fatalf("failed to wait for configmap/secret caches to sync, exiting") - } - // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh) // Start method is non-blocking and runs all registered informers in a dedicated goroutine. c.dynamicInformerFactory.Start(ctx.Done()) @@ -479,29 +556,50 @@ func (c *Manager) startLeading(ctx context.Context, rolloutThreadiness, serviceT c.jobInformerFactory.Start(ctx.Done()) - // Check if Istio installed on cluster before starting dynamicInformerFactory - if istioutil.DoesIstioExist(c.istioPrimaryDynamicClient, c.namespace) { - c.istioDynamicInformerFactory.Start(ctx.Done()) - } + if c.onlyAnalysisMode { + log.Info("Waiting for controller's informer caches to sync") + if ok := cache.WaitForCacheSync(ctx.Done(), c.analysisRunSynced, c.analysisTemplateSynced, c.jobSynced); !ok { + log.Fatalf("failed to wait for caches to sync, exiting") + } + // only wait for cluster scoped informers to sync if we are running in cluster-wide mode + if c.namespace == metav1.NamespaceAll { + if ok := cache.WaitForCacheSync(ctx.Done(), c.clusterAnalysisTemplateSynced); !ok { + log.Fatalf("failed to wait for cluster-scoped caches to sync, exiting") + } + } + go wait.Until(func() { c.wg.Add(1); c.analysisController.Run(ctx, analysisThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + } else { - // Wait for the caches to be synced before starting workers - log.Info("Waiting for controller's informer caches to sync") - if ok := cache.WaitForCacheSync(ctx.Done(), c.serviceSynced, c.ingressSynced, c.jobSynced, c.rolloutSynced, c.experimentSynced, c.analysisRunSynced, c.analysisTemplateSynced, c.replicasSetSynced, c.configMapSynced, c.secretSynced); !ok { - log.Fatalf("failed to wait for caches to sync, exiting") - } - // only wait for cluster scoped informers to sync if we are running in cluster-wide mode - if c.namespace == metav1.NamespaceAll { - if ok := cache.WaitForCacheSync(ctx.Done(), c.clusterAnalysisTemplateSynced); !ok { - log.Fatalf("failed to wait for cluster-scoped caches to sync, exiting") + c.notificationConfigMapInformerFactory.Start(ctx.Done()) + c.notificationSecretInformerFactory.Start(ctx.Done()) + if ok := cache.WaitForCacheSync(ctx.Done(), c.configMapSynced, c.secretSynced); !ok { + log.Fatalf("failed to wait for configmap/secret caches to sync, exiting") } - } - go wait.Until(func() { c.wg.Add(1); c.rolloutController.Run(ctx, rolloutThreadiness); c.wg.Done() }, time.Second, ctx.Done()) - go wait.Until(func() { c.wg.Add(1); c.serviceController.Run(ctx, serviceThreadiness); c.wg.Done() }, time.Second, ctx.Done()) - go wait.Until(func() { c.wg.Add(1); c.ingressController.Run(ctx, ingressThreadiness); c.wg.Done() }, time.Second, ctx.Done()) - go wait.Until(func() { c.wg.Add(1); c.experimentController.Run(ctx, experimentThreadiness); c.wg.Done() }, time.Second, ctx.Done()) - go wait.Until(func() { c.wg.Add(1); c.analysisController.Run(ctx, analysisThreadiness); c.wg.Done() }, time.Second, ctx.Done()) - go wait.Until(func() { c.wg.Add(1); c.notificationsController.Run(rolloutThreadiness, ctx.Done()); c.wg.Done() }, time.Second, ctx.Done()) + // Check if Istio installed on cluster before starting dynamicInformerFactory + if istioutil.DoesIstioExist(c.istioPrimaryDynamicClient, c.namespace) { + c.istioDynamicInformerFactory.Start(ctx.Done()) + } + // Wait for the caches to be synced before starting workers + log.Info("Waiting for controller's informer caches to sync") + if ok := cache.WaitForCacheSync(ctx.Done(), c.serviceSynced, c.ingressSynced, c.jobSynced, c.rolloutSynced, c.experimentSynced, c.analysisRunSynced, c.analysisTemplateSynced, c.replicasSetSynced, c.configMapSynced, c.secretSynced); !ok { + log.Fatalf("failed to wait for caches to sync, exiting") + } + // only wait for cluster scoped informers to sync if we are running in cluster-wide mode + if c.namespace == metav1.NamespaceAll { + if ok := cache.WaitForCacheSync(ctx.Done(), c.clusterAnalysisTemplateSynced); !ok { + log.Fatalf("failed to wait for cluster-scoped caches to sync, exiting") + } + } + + go wait.Until(func() { c.wg.Add(1); c.rolloutController.Run(ctx, rolloutThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + go wait.Until(func() { c.wg.Add(1); c.serviceController.Run(ctx, serviceThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + go wait.Until(func() { c.wg.Add(1); c.ingressController.Run(ctx, ingressThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + go wait.Until(func() { c.wg.Add(1); c.experimentController.Run(ctx, experimentThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + go wait.Until(func() { c.wg.Add(1); c.analysisController.Run(ctx, analysisThreadiness); c.wg.Done() }, time.Second, ctx.Done()) + go wait.Until(func() { c.wg.Add(1); c.notificationsController.Run(rolloutThreadiness, ctx.Done()); c.wg.Done() }, time.Second, ctx.Done()) + + } log.Info("Started controller") } diff --git a/controller/metrics/metrics.go b/controller/metrics/metrics.go index bad18a1eb3..9691b73a40 100644 --- a/controller/metrics/metrics.go +++ b/controller/metrics/metrics.go @@ -55,9 +55,13 @@ func NewMetricsServer(cfg ServerConfig) *MetricsServer { reg := prometheus.NewRegistry() - reg.MustRegister(NewRolloutCollector(cfg.RolloutLister)) + if cfg.RolloutLister != nil { + reg.MustRegister(NewRolloutCollector(cfg.RolloutLister)) + } + if cfg.ExperimentLister != nil { + reg.MustRegister(NewExperimentCollector(cfg.ExperimentLister)) + } reg.MustRegister(NewAnalysisRunCollector(cfg.AnalysisRunLister, cfg.AnalysisTemplateLister, cfg.ClusterAnalysisTemplateLister)) - reg.MustRegister(NewExperimentCollector(cfg.ExperimentLister)) cfg.K8SRequestProvider.MustRegister(reg) reg.MustRegister(MetricRolloutReconcile) reg.MustRegister(MetricRolloutReconcileError) diff --git a/utils/record/record.go b/utils/record/record.go index 859b954390..9e50f3ba65 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -208,20 +208,22 @@ func (e *EventRecorderAdapter) defaultEventf(object runtime.Object, warn bool, o e.RolloutEventCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() } - apis, err := e.apiFactory.GetAPIsFromNamespace(namespace) - if err != nil { - logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) - e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() - } - - for _, api := range apis { - err := e.sendNotifications(api, object, opts) + if e.apiFactory != nil { + apis, err := e.apiFactory.GetAPIsFromNamespace(namespace) if err != nil { - logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + logCtx.Errorf("notifications failed to get apis for eventReason %s with error: %s", opts.EventReason, err) + e.NotificationFailedCounter.WithLabelValues(namespace, name, opts.EventType, opts.EventReason).Inc() + } + + for _, api := range apis { + err := e.sendNotifications(api, object, opts) + if err != nil { + logCtx.Errorf("Notifications failed to send for eventReason %s with error: %s", opts.EventReason, err) + } } } - } + } logFn := logCtx.Infof if warn { logFn = logCtx.Warnf From 6efb3cc02f8199b8f8abbbbe0a0c516c745f846e Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Sat, 3 Feb 2024 20:43:06 +0200 Subject: [PATCH 181/264] docs: Guides for popular use-cases (#3346) Signed-off-by: Kostis Kapelonis --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a630fd41d4..dc6c87d023 100644 --- a/README.md +++ b/README.md @@ -101,3 +101,6 @@ You can reach the Argo Rollouts community and developers via the following chann * [How Scalable is Argo-Rollouts: A Cloud Operator’s Perspective](https://www.youtube.com/watch?v=rCEhxJ2NSTI) * [Minimize Impact in Kubernetes Using Argo Rollouts](https://medium.com/@arielsimhon/minimize-impact-in-kubernetes-using-argo-rollouts-992fb9519969) * [Progressive Application Delivery with GitOps on Red Hat OpenShift](https://www.youtube.com/watch?v=DfeL7cdTx4c) +* [Progressive delivery for Kubernetes Config Maps using Argo Rollouts](https://codefresh.io/blog/progressive-delivery-for-kubernetes-config-maps-using-argo-rollouts/) +* [Multi-Service Progressive Delivery with Argo Rollouts](https://codefresh.io/blog/multi-service-progressive-delivery-with-argo-rollouts/) +* [Progressive Delivery for Stateful Services Using Argo Rollouts](https://codefresh.io/blog/progressive-delivery-for-stateful-services-using-argo-rollouts/) From f1657638dd8ec07cddcb5d112902d319f999d5b5 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 5 Feb 2024 13:59:33 -0600 Subject: [PATCH 182/264] fix: do not require pod readiness when switching desired service selector on abort (#3338) * do not switch service selectors back when using alb due to race between two controllers with pod readiness gates Signed-off-by: Zach Aller * update tests for alb Signed-off-by: Zach Aller * lets not check for readiness instead Signed-off-by: Zach Aller * clean up notes Signed-off-by: Zach Aller * fix / Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/trafficrouting.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index a87e31a9e8..df914e2df0 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -179,13 +179,15 @@ func (c *rolloutContext) reconcileTrafficRouting() error { desiredWeight = c.calculateDesiredWeightOnAbortOrStableRollback() if (c.rollout.Spec.Strategy.Canary.DynamicStableScale && desiredWeight == 0) || !c.rollout.Spec.Strategy.Canary.DynamicStableScale { // If we are using dynamic stable scale we need to also make sure that desiredWeight=0 aka we are completely - // done with aborting before resetting the canary service selectors back to stable - err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.stableRS, true) + // done with aborting before resetting the canary service selectors back to stable. For non-dynamic scale we do not check for availability because we are + // fully aborted and stable pods will be there, if we check for availability it causes issues with ALB readiness gates if all stable pods + // have the desired readiness gate on them during an abort we get stuck in a loop because all the stable go unready and rollouts won't be able + // to switch the desired services because there is no ready pods which causes pods to get stuck progressing forever waiting for readiness. + err = c.ensureSVCTargets(c.rollout.Spec.Strategy.Canary.CanaryService, c.stableRS, false) if err != nil { return err } } - err := reconciler.RemoveManagedRoutes() if err != nil { return err From 92ae7bd199257b662c38d917015ebe3b77106123 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 21:10:38 -0600 Subject: [PATCH 183/264] chore(deps): bump sigstore/cosign-installer from 3.3.0 to 3.4.0 (#3343) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/9614fae9e5c5eddabb09f90a270fcb487c9f7149...e1523de7571e31dbe865fd2e80c5c7c23ae71eb4) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 110f1ff159..763e9db125 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -74,7 +74,7 @@ jobs: go-version: ${{ inputs.go-version }} - name: Install cosign - uses: sigstore/cosign-installer@9614fae9e5c5eddabb09f90a270fcb487c9f7149 # v3.3.0 + uses: sigstore/cosign-installer@e1523de7571e31dbe865fd2e80c5c7c23ae71eb4 # v3.4.0 with: cosign-release: 'v2.2.0' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ed68865e82..fe46ff61ab 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -170,7 +170,7 @@ jobs: go-version: ${{ env.GOLANG_VERSION }} - name: Install cosign - uses: sigstore/cosign-installer@9614fae9e5c5eddabb09f90a270fcb487c9f7149 # v3.3.0 + uses: sigstore/cosign-installer@e1523de7571e31dbe865fd2e80c5c7c23ae71eb4 # v3.4.0 with: cosign-release: 'v2.2.0' From 6c3f065f2323dd7624d87c17de81dcb87ac4982d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 21:10:55 -0600 Subject: [PATCH 184/264] chore(deps): bump peter-evans/create-pull-request from 5 to 6 (#3342) Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5 to 6. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v5...v6) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/changelog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 6bfae53fe4..326772bb06 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -23,7 +23,7 @@ jobs: ./git-chglog --sort semver -o CHANGELOG.md v1.3.1.. rm git-chglog - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: commit-message: update changelog title: "docs: Update Changelog" From f3053426d08f837f19ad6f9b41bede6f6ea29ab1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 21:11:15 -0600 Subject: [PATCH 185/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.26.7 to 1.27.0 (#3341) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.26.7 to 1.27.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.27.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.26.7...service/s3/v1.27.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ca61247c84..51f59f85e6 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.6 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 diff --git a/go.sum b/go.sum index 6861ef828d..ab81c77daa 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKD github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 h1:vQfCIHSDouEvbE4EuDrlCGKcrtABEqF3cMt61nGEV4g= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7 h1:ystNRv96lPnlDFU/K3O4/erHR+kPaiDbDGi/192uXQ4= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.26.7/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 h1:r9eCNAMs0C4gjkod/p4dsb+ZMOQAkdjPuin9QUUcjmY= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= From e24474d07aa0351bbe8a039abd8ddb26959afa03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:03:14 -0600 Subject: [PATCH 186/264] chore(deps): bump golangci/golangci-lint-action from 3 to 4 (#3359) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3 to 4. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v3...v4) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 82d346a814..b2b68321fa 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -42,7 +42,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Run golangci-lint - uses: golangci/golangci-lint-action@v3 + uses: golangci/golangci-lint-action@v4 with: version: v1.53.3 args: --timeout 6m From bf53f08415769c13934862592f9829273d4d4a99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:03:32 -0600 Subject: [PATCH 187/264] chore(deps): bump golang.org/x/oauth2 from 0.16.0 to 0.17.0 (#3357) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/oauth2/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 51f59f85e6..00ac22ad08 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.16.0 + golang.org/x/oauth2 v0.17.0 google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 google.golang.org/grpc v1.61.0 google.golang.org/protobuf v1.32.0 @@ -173,11 +173,11 @@ require ( github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.18.0 // indirect + golang.org/x/crypto v0.19.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/net v0.21.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.0 // indirect diff --git a/go.sum b/go.sum index ab81c77daa..9860e197f5 100644 --- a/go.sum +++ b/go.sum @@ -702,8 +702,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -787,8 +787,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -796,8 +796,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= -golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -879,8 +879,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -888,8 +888,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 724d53db8b7791a6bde78d97ecc1451c3f01df0a Mon Sep 17 00:00:00 2001 From: Michael Wilkerson <62034708+wilkermichael@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:41:59 -0800 Subject: [PATCH 188/264] chore: Add exception to `requireCanaryStableServices` to disable validation when using the `hashicorp/consul` plugin (#3339) * add exception to `requireCanaryStableServices` to disable validation when using the `hashicorp/consul` plugin Co-authored-by: Ashwin Venkatesh Signed-off-by: Michael Wilkerson * added HashiCorp to USERS.md Co-authored-by: Ashwin Venkatesh Signed-off-by: Michael Wilkerson * modified requireCanaryStableServices to reverse logic - added test cases for exceptions to requiring checks for Canary/Stable services - added test cases for verifying errors when Canary/Stable services are missing Co-authored-by: Ashwin Venkatesh Signed-off-by: Michael Wilkerson * addressed comments and added more test cases Co-authored-by: Ashwin Venkatesh Signed-off-by: Michael Wilkerson * modified requireCanaryStableServices to reverse logic - added test cases for exceptions to requiring checks for Canary/Stable services - added test cases for verifying errors when Canary/Stable services are missing Co-authored-by: Ashwin Venkatesh Signed-off-by: Michael Wilkerson --------- Signed-off-by: Michael Wilkerson Co-authored-by: Ashwin Venkatesh --- USERS.md | 1 + pkg/apis/rollouts/validation/validation.go | 18 +- .../rollouts/validation/validation_test.go | 165 +++++++++++++++++- 3 files changed, 178 insertions(+), 6 deletions(-) diff --git a/USERS.md b/USERS.md index 4ad9fb29bf..e56b7e13a6 100644 --- a/USERS.md +++ b/USERS.md @@ -48,3 +48,4 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [WeLab Bank](https://www.welab.bank/) 1. [Yotpo](https://www.yotpo.com/) 1. [VGS](https://www.vgs.io) +1. [HashiCorp](https://www.hashicorp.com/) diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 066c13038a..54a7336566 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -231,10 +231,24 @@ func ValidateRolloutStrategyBlueGreen(rollout *v1alpha1.Rollout, fldPath *field. // canary.canaryService to be defined func requireCanaryStableServices(rollout *v1alpha1.Rollout) bool { canary := rollout.Spec.Strategy.Canary - if canary.TrafficRouting == nil || (canary.TrafficRouting.Istio != nil && canary.TrafficRouting.Istio.DestinationRule != nil) || (canary.PingPong != nil) { + + if canary.TrafficRouting == nil { + return false + } + + switch { + case canary.TrafficRouting.ALB != nil && canary.PingPong == nil, + canary.TrafficRouting.Istio != nil && canary.TrafficRouting.Istio.DestinationRule == nil, + canary.TrafficRouting.SMI != nil, + canary.TrafficRouting.Apisix != nil, + canary.TrafficRouting.Ambassador != nil, + canary.TrafficRouting.Nginx != nil, + canary.TrafficRouting.AppMesh != nil, + canary.TrafficRouting.Traefik != nil: + return true + default: return false } - return true } func ValidateRolloutStrategyCanary(rollout *v1alpha1.Rollout, fldPath *field.Path) field.ErrorList { diff --git a/pkg/apis/rollouts/validation/validation_test.go b/pkg/apis/rollouts/validation/validation_test.go index 58a4571ae7..28f17c6858 100644 --- a/pkg/apis/rollouts/validation/validation_test.go +++ b/pkg/apis/rollouts/validation/validation_test.go @@ -129,6 +129,102 @@ func TestValidateRolloutStrategyBlueGreen(t *testing.T) { assert.Equal(t, ScaleDownLimitLargerThanRevisionLimit, allErrs[1].Detail) } +func TestValidateRolloutStrategyCanaryMissingServiceNames(t *testing.T) { + tests := []struct { + name string + trafficRouting *v1alpha1.RolloutTrafficRouting + }{ + { + name: "ALB", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{RootService: "root-service"}, + }, + }, + { + name: "Istio", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Istio: &v1alpha1.IstioTrafficRouting{}, + }, + }, + { + name: "SMI", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + SMI: &v1alpha1.SMITrafficRouting{}, + }, + }, + { + name: "Apisix", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Apisix: &v1alpha1.ApisixTrafficRouting{}, + }, + }, + { + name: "Ambassador", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Ambassador: &v1alpha1.AmbassadorTrafficRouting{}, + }, + }, + { + name: "Nginx", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Nginx: &v1alpha1.NginxTrafficRouting{}, + }, + }, + { + name: "AppMesh", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + AppMesh: &v1alpha1.AppMeshTrafficRouting{}, + }, + }, + { + name: "Traefik", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Traefik: &v1alpha1.TraefikTrafficRouting{}, + }, + }, + { + name: "Traefik and Istio Subset Routing", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Traefik: &v1alpha1.TraefikTrafficRouting{}, + Istio: &v1alpha1.IstioTrafficRouting{DestinationRule: &v1alpha1.IstioDestinationRule{Name: "destination-rule"}}, + }, + }, + { + name: "AppMesh and external plugin(doesnt require service names)", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + AppMesh: &v1alpha1.AppMeshTrafficRouting{}, + Plugins: map[string]json.RawMessage{"some-plugin": []byte(`{"key": "value"}`)}, + }, + }, + { + name: "Apisix, Istio Subset Routing and external plugin(doesnt require service names)", + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Apisix: &v1alpha1.ApisixTrafficRouting{}, + Istio: &v1alpha1.IstioTrafficRouting{DestinationRule: &v1alpha1.IstioDestinationRule{Name: "destination-rule"}}, + Plugins: map[string]json.RawMessage{"some-plugin": []byte(`{"key": "value"}`)}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Create a table of test cases + canaryStrategy := &v1alpha1.CanaryStrategy{ + Steps: []v1alpha1.CanaryStep{{ + SetWeight: pointer.Int32(10), + }}, + } + ro := &v1alpha1.Rollout{} + ro.Spec.Strategy.Canary = canaryStrategy + + // Set the traffic route we will be testing + ro.Spec.Strategy.Canary.TrafficRouting = tt.trafficRouting + allErrs := ValidateRolloutStrategyCanary(ro, field.NewPath("")) + assert.Equal(t, InvalidTrafficRoutingMessage, allErrs[0].Detail) + }) + } +} + func TestValidateRolloutStrategyCanary(t *testing.T) { canaryStrategy := &v1alpha1.CanaryStrategy{ CanaryService: "canary", @@ -165,6 +261,68 @@ func TestValidateRolloutStrategyCanary(t *testing.T) { }, } + t.Run("valid rollout", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + + t.Run("valid plugin missing canary and stable service", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.TrafficRouting.ALB = nil + validRo.Spec.Strategy.Canary.TrafficRouting.Plugins = map[string]json.RawMessage{"some-plugin": []byte(`{"key": "value"}`)} + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + + t.Run("valid Istio missing canary and stable service", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.TrafficRouting.Istio = &v1alpha1.IstioTrafficRouting{DestinationRule: &v1alpha1.IstioDestinationRule{Name: "destination-rule"}} + validRo.Spec.Strategy.Canary.TrafficRouting.ALB = nil + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + + t.Run("valid PingPong missing canary and stable service", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.PingPong = &v1alpha1.PingPongSpec{PingService: "ping", PongService: "pong"} + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + + t.Run("valid two plugins missing canary and stable service", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.PingPong = &v1alpha1.PingPongSpec{PingService: "ping", PongService: "pong"} + validRo.Spec.Strategy.Canary.TrafficRouting.Istio = &v1alpha1.IstioTrafficRouting{DestinationRule: &v1alpha1.IstioDestinationRule{Name: "destination-rule"}} + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + + t.Run("invalid two plugins missing canary and stable service", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.TrafficRouting.ALB = nil + validRo.Spec.Strategy.Canary.TrafficRouting.Istio = &v1alpha1.IstioTrafficRouting{} + validRo.Spec.Strategy.Canary.TrafficRouting.Plugins = map[string]json.RawMessage{"some-plugin": []byte(`{"key": "value"}`)} + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Equal(t, InvalidTrafficRoutingMessage, allErrs[0].Detail) + }) + t.Run("duplicate services", func(t *testing.T) { invalidRo := ro.DeepCopy() invalidRo.Spec.Strategy.Canary.CanaryService = "stable" @@ -651,7 +809,7 @@ func TestCanaryScaleDownDelaySeconds(t *testing.T) { Canary: &v1alpha1.CanaryStrategy{ StableService: "stable", CanaryService: "canary", - ScaleDownDelaySeconds: pointer.Int32Ptr(60), + ScaleDownDelaySeconds: pointer.Int32(60), }, }, Template: corev1.PodTemplateSpec{ @@ -718,7 +876,7 @@ func TestCanaryDynamicStableScale(t *testing.T) { }) t.Run("dynamicStableScale with scaleDownDelaySeconds", func(t *testing.T) { ro := ro.DeepCopy() - ro.Spec.Strategy.Canary.ScaleDownDelaySeconds = pointer.Int32Ptr(60) + ro.Spec.Strategy.Canary.ScaleDownDelaySeconds = pointer.Int32(60) ro.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ SMI: &v1alpha1.SMITrafficRouting{}, } @@ -782,7 +940,7 @@ func TestCanaryExperimentStepWithWeight(t *testing.T) { Experiment: &v1alpha1.RolloutExperimentStep{ Templates: []v1alpha1.RolloutExperimentTemplate{{ Name: "template", - Weight: pointer.Int32Ptr(20), + Weight: pointer.Int32(20), }}, }, }}, @@ -869,5 +1027,4 @@ func TestCanaryExperimentStepWithWeight(t *testing.T) { assert.Equal(t, 1, len(allErrs)) assert.Equal(t, errTrafficRoutingWithExperimentSupport, allErrs[0].Detail) }) - } From db5e3b2a8ffd9aef8c1e2026985c906fc9eef068 Mon Sep 17 00:00:00 2001 From: AS <11219262+ashutosh16@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:46:00 -0800 Subject: [PATCH 189/264] fix: stuck rollout when 2nd deployment happens before 1st finishes (#3354) fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused fix: stuck rollout when rollout is paused Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> Co-authored-by: asingh51 --- rollout/canary.go | 2 +- test/e2e/canary_test.go | 17 ++++ .../functional/rollout-canary-with-pause.yaml | 77 +++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/e2e/functional/rollout-canary-with-pause.yaml diff --git a/rollout/canary.go b/rollout/canary.go index a003b092a3..ed27bd0a79 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -184,7 +184,7 @@ func (c *rolloutContext) scaleDownOldReplicaSetsForCanary(oldRSs []*appsv1.Repli annotationedRSs := int32(0) for _, targetRS := range oldRSs { - if c.isReplicaSetReferenced(targetRS) { + if c.rollout.Spec.Strategy.Canary.TrafficRouting != nil && c.isReplicaSetReferenced(targetRS) { // We might get here if user interrupted an an update in order to move back to stable. c.log.Infof("Skip scale down of older RS '%s': still referenced", targetRS.Name) continue diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index bc5e60b6c3..d42abb6a79 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -565,6 +565,23 @@ func (s *CanarySuite) TestCanaryScaleDownOnAbortNoTrafficRouting() { ExpectRevisionPodCount("2", 0) } +func (s *CanarySuite) TestCanaryWithPausedRollout() { + (s.Given(). + HealthyRollout(`@functional/rollout-canary-with-pause.yaml`). + When(). + ApplyManifests(). + MarkPodsReady("1", 3). // mark all 3 pods ready + WaitForRolloutStatus("Healthy"). + UpdateSpec(). // update to revision 2 + WaitForRolloutStatus("Paused"). + UpdateSpec(). // update to revision 3 + WaitForRolloutStatus("Paused"). + Then(). + ExpectRevisionPodCount("1", 3). + ExpectRevisionPodCount("2", 0). + ExpectRevisionPodCount("3", 1)) +} + func (s *CanarySuite) TestCanaryUnScaleDownOnAbort() { s.Given(). HealthyRollout(`@functional/canary-unscaledownonabort.yaml`). diff --git a/test/e2e/functional/rollout-canary-with-pause.yaml b/test/e2e/functional/rollout-canary-with-pause.yaml new file mode 100644 index 0000000000..b92ec9e1c1 --- /dev/null +++ b/test/e2e/functional/rollout-canary-with-pause.yaml @@ -0,0 +1,77 @@ +apiVersion: v1 +kind: Service +metadata: + name: rollout-canary-with-pause-root +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: rollout-canary-with-pause +--- +apiVersion: v1 +kind: Service +metadata: + name: rollout-canary-with-pause-canary +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: rollout-canary-with-pause +--- +apiVersion: v1 +kind: Service +metadata: + name: rollout-canary-with-pause-stable +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: rollout-canary-with-pause +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: rollout-canary-with-pause +spec: + replicas: 3 + revisionHistoryLimit: 3 + progressDeadlineSeconds: 5 + selector: + matchLabels: + app: rollout-canary-with-pause + template: + metadata: + labels: + app: rollout-canary-with-pause + spec: + containers: + - name: rollouts-demo + image: nginx:1.19-alpine + ports: + - containerPort: 80 + readinessProbe: + initialDelaySeconds: 10 + httpGet: + path: / + port: 80 + periodSeconds: 30 + strategy: + canary: + canaryService: rollout-canary-with-pause-canary + stableService: rollout-canary-with-pause-stable + steps: + - setWeight: 20 + - pause: {} + \ No newline at end of file From 37af08127801ee9241dcb3547aba6aff1857a1c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:15:44 -0600 Subject: [PATCH 190/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.32.2 to 1.33.0 (#3363) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.32.2 to 1.33.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.33.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.32.2...service/s3/v1.33.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 00ac22ad08..206ca37eca 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.24.1 github.com/aws/aws-sdk-go-v2/config v1.26.6 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 9860e197f5..8d6c0b9175 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2m github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2 h1:vQfCIHSDouEvbE4EuDrlCGKcrtABEqF3cMt61nGEV4g= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.32.2/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 h1:0kI/uFLCoDoDMaD1rSnXC9/DtdRZpx1mVFJ+xOL/M+k= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 h1:r9eCNAMs0C4gjkod/p4dsb+ZMOQAkdjPuin9QUUcjmY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= From cf1ab9fab4280faa9b45f92397027f84825ef05e Mon Sep 17 00:00:00 2001 From: Ilia Lazebnik Date: Tue, 13 Feb 2024 17:19:23 +0200 Subject: [PATCH 191/264] feat: allow setting traefik versions (#3348) * add setting traefik version Signed-off-by: drfaust92 * add new traefik api to manifests Signed-off-by: drfaust92 --------- Signed-off-by: drfaust92 --- cmd/rollouts-controller/main.go | 6 ++++++ manifests/install.yaml | 1 + manifests/namespace-install.yaml | 1 + manifests/role/argo-rollouts-clusterrole.yaml | 1 + rollout/trafficrouting/traefik/traefik.go | 6 +++--- utils/defaults/defaults.go | 18 ++++++++++++++++++ utils/defaults/defaults_test.go | 10 ++++++++++ 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 99afcef49e..b144defca4 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -66,6 +66,8 @@ func newCommand() *cobra.Command { ingressThreads int istioVersion string trafficSplitVersion string + traefikAPIGroup string + traefikVersion string ambassadorVersion string ingressVersion string appmeshCRDVersion string @@ -102,6 +104,8 @@ func newCommand() *cobra.Command { defaults.SetAmbassadorAPIVersion(ambassadorVersion) defaults.SetSMIAPIVersion(trafficSplitVersion) defaults.SetAppMeshCRDVersion(appmeshCRDVersion) + defaults.SetTraefikAPIGroup(traefikAPIGroup) + defaults.SetTraefikVersion(traefikVersion) config, err := clientConfig.ClientConfig() checkError(err) @@ -279,6 +283,8 @@ func newCommand() *cobra.Command { command.Flags().StringVar(&istioVersion, "istio-api-version", defaults.DefaultIstioVersion, "Set the default Istio apiVersion that controller should look when manipulating VirtualServices.") command.Flags().StringVar(&ambassadorVersion, "ambassador-api-version", defaults.DefaultAmbassadorVersion, "Set the Ambassador apiVersion that controller should look when manipulating Ambassador Mappings.") command.Flags().StringVar(&trafficSplitVersion, "traffic-split-api-version", defaults.DefaultSMITrafficSplitVersion, "Set the default TrafficSplit apiVersion that controller uses when creating TrafficSplits.") + command.Flags().StringVar(&traefikAPIGroup, "traefik-api-group", defaults.DefaultTraefikAPIGroup, "Set the default Traerfik apiGroup that controller uses.") + command.Flags().StringVar(&traefikVersion, "traefik-api-version", defaults.DefaultTraefikVersion, "Set the default Traerfik apiVersion that controller uses.") command.Flags().StringVar(&ingressVersion, "ingress-api-version", "", "Set the Ingress apiVersion that the controller should use.") command.Flags().StringVar(&appmeshCRDVersion, "appmesh-crd-version", defaults.DefaultAppMeshCRDVersion, "Set the default AppMesh CRD Version that controller uses when manipulating resources.") command.Flags().StringArrayVar(&albIngressClasses, "alb-ingress-classes", defaultALBIngressClass, "Defines all the ingress class annotations that the alb ingress controller operates on. Defaults to alb") diff --git a/manifests/install.yaml b/manifests/install.yaml index 082042a0ca..335974305f 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -15825,6 +15825,7 @@ rules: - patch - apiGroups: - traefik.containo.us + - traefik.io resources: - traefikservices verbs: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 97847970ee..08637705cb 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -217,6 +217,7 @@ rules: - patch - apiGroups: - traefik.containo.us + - traefik.io resources: - traefikservices verbs: diff --git a/manifests/role/argo-rollouts-clusterrole.yaml b/manifests/role/argo-rollouts-clusterrole.yaml index 95cc82004d..aab253e5ea 100644 --- a/manifests/role/argo-rollouts-clusterrole.yaml +++ b/manifests/role/argo-rollouts-clusterrole.yaml @@ -224,6 +224,7 @@ rules: - patch - apiGroups: - traefik.containo.us + - traefik.io resources: - traefikservices verbs: diff --git a/rollout/trafficrouting/traefik/traefik.go b/rollout/trafficrouting/traefik/traefik.go index 5840bf4a42..8b5cfb7312 100644 --- a/rollout/trafficrouting/traefik/traefik.go +++ b/rollout/trafficrouting/traefik/traefik.go @@ -25,7 +25,7 @@ const TraefikServiceUpdateError = "TraefikServiceUpdateError" var ( apiGroupToResource = map[string]string{ - defaults.DefaultTraefikAPIGroup: traefikServices, + defaults.GetTraefikAPIGroup(): traefikServices, } ) @@ -68,8 +68,8 @@ func NewDynamicClient(di dynamic.Interface, namespace string) dynamic.ResourceIn } func GetMappingGVR() schema.GroupVersionResource { - group := defaults.DefaultTraefikAPIGroup - parts := strings.Split(defaults.DefaultTraefikVersion, "/") + group := defaults.GetTraefikAPIGroup() + parts := strings.Split(defaults.GetTraefikVersion(), "/") version := parts[len(parts)-1] resourceName := apiGroupToResource[group] return schema.GroupVersionResource{ diff --git a/utils/defaults/defaults.go b/utils/defaults/defaults.go index 8c1c171219..f1c38dcef1 100644 --- a/utils/defaults/defaults.go +++ b/utils/defaults/defaults.go @@ -67,6 +67,8 @@ const ( var ( defaultVerifyTargetGroup = false + traefikAPIGroup = DefaultTraefikAPIGroup + traefikVersion = DefaultTraefikVersion istioAPIVersion = DefaultIstioVersion ambassadorAPIVersion = DefaultAmbassadorVersion smiAPIVersion = DefaultSMITrafficSplitVersion @@ -305,6 +307,22 @@ func GetSMIAPIVersion() string { return smiAPIVersion } +func SetTraefikVersion(apiVersion string) { + traefikVersion = apiVersion +} + +func GetTraefikVersion() string { + return traefikVersion +} + +func SetTraefikAPIGroup(apiGroup string) { + traefikAPIGroup = apiGroup +} + +func GetTraefikAPIGroup() string { + return traefikAPIGroup +} + func SetTargetGroupBindingAPIVersion(apiVersion string) { targetGroupBindingAPIVersion = apiVersion } diff --git a/utils/defaults/defaults_test.go b/utils/defaults/defaults_test.go index 1d981731c2..edd144d1f7 100644 --- a/utils/defaults/defaults_test.go +++ b/utils/defaults/defaults_test.go @@ -398,6 +398,16 @@ func TestSetDefaults(t *testing.T) { SetSMIAPIVersion(DefaultSMITrafficSplitVersion) assert.Equal(t, DefaultSMITrafficSplitVersion, GetSMIAPIVersion()) + SetTraefikAPIGroup("traefik.containo.us") + assert.Equal(t, "traefik.containo.us", GetTraefikAPIGroup()) + SetTraefikAPIGroup(DefaultTraefikAPIGroup) + assert.Equal(t, DefaultTraefikAPIGroup, GetTraefikAPIGroup()) + + SetTraefikVersion("traefik.containo.us/v1alpha1") + assert.Equal(t, "traefik.containo.us/v1alpha1", GetTraefikVersion()) + SetTraefikVersion(DefaultTraefikVersion) + assert.Equal(t, DefaultTraefikVersion, GetTraefikVersion()) + SetTargetGroupBindingAPIVersion("v1alpha9") assert.Equal(t, "v1alpha9", GetTargetGroupBindingAPIVersion()) SetTargetGroupBindingAPIVersion(DefaultTargetGroupBindingAPIVersion) From dced99b499bf98f0efdb0b519b2defcf3b2dd8ef Mon Sep 17 00:00:00 2001 From: Divyansh Saxena <34120560+divyansh375@users.noreply.github.com> Date: Tue, 13 Feb 2024 21:24:52 +0530 Subject: [PATCH 192/264] fix: append weighted destination only when weight is mentioned (#2734) fix: append weighted destination only when weight is mentioned in experiment template Signed-off-by: divyansh375 Co-authored-by: divyansh375 --- experiments/experiment_test.go | 1 + rollout/trafficrouting.go | 12 +++++++----- rollout/trafficrouting_test.go | 34 +++++++++++++++++++--------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/experiments/experiment_test.go b/experiments/experiment_test.go index 21fbeb530a..82db0190aa 100644 --- a/experiments/experiment_test.go +++ b/experiments/experiment_test.go @@ -529,6 +529,7 @@ func TestServiceInheritPortsFromRS(t *testing.T) { assert.NotNil(t, exCtx.templateServices["bar"]) assert.Equal(t, exCtx.templateServices["bar"].Name, "foo-bar") assert.Equal(t, exCtx.templateServices["bar"].Spec.Ports[0].Port, int32(80)) + assert.Equal(t, exCtx.templateServices["bar"].Spec.Ports[0].Name, "testport") } func TestServiceNameSet(t *testing.T) { diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index df914e2df0..fe4f145ddd 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -369,11 +369,13 @@ func (c *rolloutContext) calculateWeightDestinationsFromExperiment() []v1alpha1. } for _, templateStatus := range c.currentEx.Status.TemplateStatuses { templateWeight := getTemplateWeight(templateStatus.Name) - weightDestinations = append(weightDestinations, v1alpha1.WeightDestination{ - ServiceName: templateStatus.ServiceName, - PodTemplateHash: templateStatus.PodTemplateHash, - Weight: *templateWeight, - }) + if templateWeight != nil { + weightDestinations = append(weightDestinations, v1alpha1.WeightDestination{ + ServiceName: templateStatus.ServiceName, + PodTemplateHash: templateStatus.PodTemplateHash, + Weight: *templateWeight, + }) + } } } return weightDestinations diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index f26039a34d..f7dd459964 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -249,13 +249,21 @@ func TestRolloutWithExperimentStep(t *testing.T) { SpecRef: "canary", Replicas: pointer.Int32Ptr(1), Weight: pointer.Int32Ptr(5), - }}, + }, + { + Name: "experiment-template-without-weight", + SpecRef: "stable", + Replicas: pointer.Int32Ptr(1), + }}, }, }, } r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(1), intstr.FromInt(1), intstr.FromInt(0)) r2 := bumpVersion(r1) - r2.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{} + r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + SMI: &v1alpha1.SMITrafficRouting{}, + } + r2.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{SMI: &v1alpha1.SMITrafficRouting{}} r2.Spec.Strategy.Canary.CanaryService = "canary" r2.Spec.Strategy.Canary.StableService = "stable" @@ -273,7 +281,12 @@ func TestRolloutWithExperimentStep(t *testing.T) { Name: "experiment-template", ServiceName: "experiment-service", PodTemplateHash: rs2PodHash, - }} + }, + { + Name: "experiment-template-without-weight", + ServiceName: "experiment-service-without-weight", + PodTemplateHash: rs2PodHash, + }} r2.Status.Canary.CurrentExperiment = ex.Name f.kubeobjects = append(f.kubeobjects, rs1, rs2, canarySvc, stableSvc) @@ -293,18 +306,13 @@ func TestRolloutWithExperimentStep(t *testing.T) { // make sure SetWeight was called with correct value assert.Equal(t, int32(10), desiredWeight) assert.Equal(t, int32(5), weightDestinations[0].Weight) + assert.Len(t, weightDestinations, 1) assert.Equal(t, ex.Status.TemplateStatuses[0].ServiceName, weightDestinations[0].ServiceName) assert.Equal(t, ex.Status.TemplateStatuses[0].PodTemplateHash, weightDestinations[0].PodTemplateHash) return nil }) f.fakeTrafficRouting.On("SetHeaderRoute", mock.Anything, mock.Anything).Return(nil) - f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(func(desiredWeight int32, weightDestinations ...v1alpha1.WeightDestination) error { - assert.Equal(t, int32(10), desiredWeight) - assert.Equal(t, int32(5), weightDestinations[0].Weight) - assert.Equal(t, ex.Status.TemplateStatuses[0].ServiceName, weightDestinations[0].ServiceName) - assert.Equal(t, ex.Status.TemplateStatuses[0].PodTemplateHash, weightDestinations[0].PodTemplateHash) - return nil - }) + f.fakeTrafficRouting.On("VerifyWeight", mock.Anything, mock.Anything).Return(pointer.BoolPtr(true), nil) f.run(getKey(r2, t)) }) @@ -319,11 +327,7 @@ func TestRolloutWithExperimentStep(t *testing.T) { return nil }) f.fakeTrafficRouting.On("SetHeaderRoute", mock.Anything, mock.Anything).Return(nil) - f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(func(desiredWeight int32, weightDestinations ...v1alpha1.WeightDestination) error { - assert.Equal(t, int32(10), desiredWeight) - assert.Len(t, weightDestinations, 0) - return nil - }) + f.fakeTrafficRouting.On("VerifyWeight", mock.Anything, mock.Anything).Return(pointer.BoolPtr(true), nil) f.run(getKey(r2, t)) }) } From 47deb7a52a229b80fd408b1b067298c982a958d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 18:50:11 +0000 Subject: [PATCH 193/264] docs: Update Changelog (#3365) * update changelog * re-gen changelog Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller Co-authored-by: zachaller --- CHANGELOG.md | 601 ++++++--------------------------------------------- 1 file changed, 71 insertions(+), 530 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d67e7b35..c92e20fed3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,470 +1,11 @@ - - -## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) - -### Build - -* **deps:** always resolve momentjs version 2.29.4 ([#3182](https://github.com/argoproj/argo-rollouts/issues/3182)) - -### Fix - -* rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) - - -## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) - -### Fix - -* Revert "fix: istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126))" ([#3147](https://github.com/argoproj/argo-rollouts/issues/3147)) - - - -## [v1.6.1](https://github.com/argoproj/argo-rollouts/compare/v1.6.0...v1.6.1) (2023-11-01) - -### Chore - -* upgrade cosign ([#3139](https://github.com/argoproj/argo-rollouts/issues/3139)) -* add missing rollout fields ([#3062](https://github.com/argoproj/argo-rollouts/issues/3062)) -* change file name for readthedocs compatibility ([#2999](https://github.com/argoproj/argo-rollouts/issues/2999)) - -### Fix - -* istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126)) -* docs require build.os to be defined ([#3133](https://github.com/argoproj/argo-rollouts/issues/3133)) -* inopportune scaling events would lose some status fields ([#3060](https://github.com/argoproj/argo-rollouts/issues/3060)) -* rollback to stable with dynamicStableScale could overwhelm stable pods ([#3077](https://github.com/argoproj/argo-rollouts/issues/3077)) -* prevent hot loop when fully promoted rollout is aborted ([#3064](https://github.com/argoproj/argo-rollouts/issues/3064)) -* keep rs informer updated ([#3091](https://github.com/argoproj/argo-rollouts/issues/3091)) -* bump notification-engine to fix double send on self server notifications ([#3095](https://github.com/argoproj/argo-rollouts/issues/3095)) -* sync notification controller configmaps/secrets first ([#3075](https://github.com/argoproj/argo-rollouts/issues/3075)) -* missing notification on error ([#3076](https://github.com/argoproj/argo-rollouts/issues/3076)) - - - -## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) - -### Chore - -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 ([#2950](https://github.com/argoproj/argo-rollouts/issues/2950)) -* **deps:** bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 ([#2951](https://github.com/argoproj/argo-rollouts/issues/2951)) - -### Docs - -* update supported k8s version ([#2949](https://github.com/argoproj/argo-rollouts/issues/2949)) - -### Fix - -* analysis step should be ignored after promote ([#3016](https://github.com/argoproj/argo-rollouts/issues/3016)) -* **controller:** rollback should skip all steps to active rs within RollbackWindow ([#2953](https://github.com/argoproj/argo-rollouts/issues/2953)) -* **controller:** typo fix ("Secrete" -> "Secret") in secret informer ([#2965](https://github.com/argoproj/argo-rollouts/issues/2965)) - - - -## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) - -### Chore - -* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) -* bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) -* Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) -* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) -* add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) -* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) -* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) -* Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) -* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) -* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) -* **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) -* **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 ([#2884](https://github.com/argoproj/argo-rollouts/issues/2884)) -* **deps:** bump docker/setup-qemu-action from 2.1.0 to 2.2.0 ([#2878](https://github.com/argoproj/argo-rollouts/issues/2878)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 ([#2883](https://github.com/argoproj/argo-rollouts/issues/2883)) -* **deps:** bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 ([#2880](https://github.com/argoproj/argo-rollouts/issues/2880)) -* **deps:** bump actions/setup-go from 4.0.0 to 4.0.1 ([#2881](https://github.com/argoproj/argo-rollouts/issues/2881)) -* **deps:** bump docker/setup-buildx-action from 2.5.0 to 2.9.1 ([#2879](https://github.com/argoproj/argo-rollouts/issues/2879)) -* **deps:** bump docker/login-action from 2.1.0 to 2.2.0 ([#2877](https://github.com/argoproj/argo-rollouts/issues/2877)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 ([#2886](https://github.com/argoproj/argo-rollouts/issues/2886)) -* **deps:** bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 ([#2882](https://github.com/argoproj/argo-rollouts/issues/2882)) -* **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) -* **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) -* **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) -* **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) -* **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) -* **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) -* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) -* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) -* **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) -* **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) -* **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) -* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) -* **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) -* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) -* **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) -* **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) -* **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) -* **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) -* **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) -* **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) -* **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 ([#2708](https://github.com/argoproj/argo-rollouts/issues/2708)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 ([#2710](https://github.com/argoproj/argo-rollouts/issues/2710)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 ([#2705](https://github.com/argoproj/argo-rollouts/issues/2705)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 ([#2704](https://github.com/argoproj/argo-rollouts/issues/2704)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 ([#2703](https://github.com/argoproj/argo-rollouts/issues/2703)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 ([#2702](https://github.com/argoproj/argo-rollouts/issues/2702)) -* **deps:** bump peter-evans/create-pull-request from 4 to 5 ([#2697](https://github.com/argoproj/argo-rollouts/issues/2697)) -* **deps:** bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#2698](https://github.com/argoproj/argo-rollouts/issues/2698)) -* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 ([#2684](https://github.com/argoproj/argo-rollouts/issues/2684)) - -### Ci - -* generate attestations during a release ([#2785](https://github.com/argoproj/argo-rollouts/issues/2785)) -* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) - -### Docs - -* mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) -* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) -* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) -* Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) -* Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) -* support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) -* Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) -* Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) -* use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) -* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) -* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) -* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) -* Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) -* Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) -* Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) -* Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) -* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) -* Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) -* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) -* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) -* **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) -* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) -* **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) - -### Feat - -* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) -* enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) -* support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) -* Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) -* Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) -* Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) -* add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) -* retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) -* **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) -* **controller:** Add custom metadata support for AnalysisRun. Fixes [#2740](https://github.com/argoproj/argo-rollouts/issues/2740) ([#2743](https://github.com/argoproj/argo-rollouts/issues/2743)) -* **dashboard:** Refresh Rollouts dashboard UI ([#2723](https://github.com/argoproj/argo-rollouts/issues/2723)) -* **metricprovider:** allow user to define metrics.provider.job.metadata ([#2762](https://github.com/argoproj/argo-rollouts/issues/2762)) - -### Fix - -* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) -* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) -* rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) -* get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) -* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) -* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) -* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) -* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) -* add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) -* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) -* **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) -* **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) -* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) -* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) -* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) -* **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) - -### Refactor - -* change plugin naming pattern [#2720](https://github.com/argoproj/argo-rollouts/issues/2720) ([#2722](https://github.com/argoproj/argo-rollouts/issues/2722)) - -### BREAKING CHANGE - - -The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. - -Remove name label from k8s some client metrics - -The `name` label in the `controller_clientset_k8s_request_total` metric -produce an excessive amount of cardinality for `events` and `replicasets`. -This can lead to hundreds of thousands of unique metrics over a couple -weeks in a large deployment. Set the name to "N/A" for these client request -types. - - - -## [v1.6.4](https://github.com/argoproj/argo-rollouts/compare/v1.6.3...v1.6.4) (2023-12-08) - -### Fix - -* make sure we use the updated rs when we write back to informer ([#3237](https://github.com/argoproj/argo-rollouts/issues/3237)) -* conflict on updates to replicaset revision ([#3216](https://github.com/argoproj/argo-rollouts/issues/3216)) - - - -## [v1.6.3](https://github.com/argoproj/argo-rollouts/compare/v1.6.2...v1.6.3) (2023-12-04) - -### Build - -* **deps:** always resolve momentjs version 2.29.4 ([#3182](https://github.com/argoproj/argo-rollouts/issues/3182)) - -### Fix - -* rollouts getting stuck due to bad rs informer updates ([#3200](https://github.com/argoproj/argo-rollouts/issues/3200)) - - - -## [v1.6.2](https://github.com/argoproj/argo-rollouts/compare/v1.6.1...v1.6.2) (2023-11-02) - -### Fix - -* Revert "fix: istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126))" ([#3147](https://github.com/argoproj/argo-rollouts/issues/3147)) - - - -## [v1.6.1](https://github.com/argoproj/argo-rollouts/compare/v1.6.0...v1.6.1) (2023-11-01) - -### Chore - -* upgrade cosign ([#3139](https://github.com/argoproj/argo-rollouts/issues/3139)) -* add missing rollout fields ([#3062](https://github.com/argoproj/argo-rollouts/issues/3062)) -* change file name for readthedocs compatibility ([#2999](https://github.com/argoproj/argo-rollouts/issues/2999)) - -### Fix - -* istio destionationrule subsets enforcement ([#3126](https://github.com/argoproj/argo-rollouts/issues/3126)) -* docs require build.os to be defined ([#3133](https://github.com/argoproj/argo-rollouts/issues/3133)) -* inopportune scaling events would lose some status fields ([#3060](https://github.com/argoproj/argo-rollouts/issues/3060)) -* rollback to stable with dynamicStableScale could overwhelm stable pods ([#3077](https://github.com/argoproj/argo-rollouts/issues/3077)) -* prevent hot loop when fully promoted rollout is aborted ([#3064](https://github.com/argoproj/argo-rollouts/issues/3064)) -* keep rs informer updated ([#3091](https://github.com/argoproj/argo-rollouts/issues/3091)) -* bump notification-engine to fix double send on self server notifications ([#3095](https://github.com/argoproj/argo-rollouts/issues/3095)) -* sync notification controller configmaps/secrets first ([#3075](https://github.com/argoproj/argo-rollouts/issues/3075)) -* missing notification on error ([#3076](https://github.com/argoproj/argo-rollouts/issues/3076)) - - - -## [v1.6.0](https://github.com/argoproj/argo-rollouts/compare/v1.6.0-rc1...v1.6.0) (2023-09-05) - -### Chore - -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.2 to 1.21.0 ([#2950](https://github.com/argoproj/argo-rollouts/issues/2950)) -* **deps:** bump github.com/antonmedv/expr from 1.12.7 to 1.13.0 ([#2951](https://github.com/argoproj/argo-rollouts/issues/2951)) - -### Docs - -* update supported k8s version ([#2949](https://github.com/argoproj/argo-rollouts/issues/2949)) - -### Fix - -* analysis step should be ignored after promote ([#3016](https://github.com/argoproj/argo-rollouts/issues/3016)) -* **controller:** rollback should skip all steps to active rs within RollbackWindow ([#2953](https://github.com/argoproj/argo-rollouts/issues/2953)) -* **controller:** typo fix ("Secrete" -> "Secret") in secret informer ([#2965](https://github.com/argoproj/argo-rollouts/issues/2965)) - - - -## [v1.6.0-rc1](https://github.com/argoproj/argo-rollouts/compare/v1.5.1...v1.6.0-rc1) (2023-08-10) - -### Chore - -* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) -* bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) -* Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) -* bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) -* add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) -* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) -* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) -* Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) -* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) -* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) -* **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) -* **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.2 to 1.26.3 ([#2884](https://github.com/argoproj/argo-rollouts/issues/2884)) -* **deps:** bump docker/setup-qemu-action from 2.1.0 to 2.2.0 ([#2878](https://github.com/argoproj/argo-rollouts/issues/2878)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.28 ([#2883](https://github.com/argoproj/argo-rollouts/issues/2883)) -* **deps:** bump slsa-framework/slsa-github-generator from 1.6.0 to 1.7.0 ([#2880](https://github.com/argoproj/argo-rollouts/issues/2880)) -* **deps:** bump actions/setup-go from 4.0.0 to 4.0.1 ([#2881](https://github.com/argoproj/argo-rollouts/issues/2881)) -* **deps:** bump docker/setup-buildx-action from 2.5.0 to 2.9.1 ([#2879](https://github.com/argoproj/argo-rollouts/issues/2879)) -* **deps:** bump docker/login-action from 2.1.0 to 2.2.0 ([#2877](https://github.com/argoproj/argo-rollouts/issues/2877)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.13 to 1.19.14 ([#2886](https://github.com/argoproj/argo-rollouts/issues/2886)) -* **deps:** bump github.com/antonmedv/expr from 1.12.5 to 1.12.6 ([#2882](https://github.com/argoproj/argo-rollouts/issues/2882)) -* **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) -* **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) -* **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) -* **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) -* **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) -* **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) -* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) -* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) -* **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) -* **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) -* **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) -* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) -* **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) -* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) -* **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) -* **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) -* **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) -* **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) -* **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) -* **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) -* **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.8 to 1.19.9 ([#2708](https://github.com/argoproj/argo-rollouts/issues/2708)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.8 to 1.25.9 ([#2710](https://github.com/argoproj/argo-rollouts/issues/2710)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.19 to 1.18.20 ([#2705](https://github.com/argoproj/argo-rollouts/issues/2705)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.7 to 1.19.8 ([#2704](https://github.com/argoproj/argo-rollouts/issues/2704)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.7 to 1.17.8 ([#2703](https://github.com/argoproj/argo-rollouts/issues/2703)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.7 to 1.25.8 ([#2702](https://github.com/argoproj/argo-rollouts/issues/2702)) -* **deps:** bump peter-evans/create-pull-request from 4 to 5 ([#2697](https://github.com/argoproj/argo-rollouts/issues/2697)) -* **deps:** bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#2698](https://github.com/argoproj/argo-rollouts/issues/2698)) -* **deps:** bump github.com/influxdata/influxdb-client-go/v2 from 2.12.2 to 2.12.3 ([#2684](https://github.com/argoproj/argo-rollouts/issues/2684)) - -### Ci - -* generate attestations during a release ([#2785](https://github.com/argoproj/argo-rollouts/issues/2785)) -* use keyless signing for main and release branches ([#2783](https://github.com/argoproj/argo-rollouts/issues/2783)) - -### Docs - -* mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) -* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) -* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) -* Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) -* Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) -* support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) -* Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) -* Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) -* use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) -* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) -* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) -* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) -* Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) -* Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) -* Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) -* Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) -* copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) -* Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) -* fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) -* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) -* **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) -* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) -* **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) - -### Feat -* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) -* enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) -* support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) -* Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) -* Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) -* Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) -* add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) -* retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) -* **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) -* **controller:** Add custom metadata support for AnalysisRun. Fixes [#2740](https://github.com/argoproj/argo-rollouts/issues/2740) ([#2743](https://github.com/argoproj/argo-rollouts/issues/2743)) -* **dashboard:** Refresh Rollouts dashboard UI ([#2723](https://github.com/argoproj/argo-rollouts/issues/2723)) -* **metricprovider:** allow user to define metrics.provider.job.metadata ([#2762](https://github.com/argoproj/argo-rollouts/issues/2762)) + +## [v1.6.6](https://github.com/argoproj/argo-rollouts/compare/v1.6.5...v1.6.6) (2024-02-12) ### Fix -* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) -* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) -* rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) -* get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) -* change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) -* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) -* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) -* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) -* add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) -* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) -* **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) -* **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) -* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) -* **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) -* **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) -* **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) - -### Refactor - -* change plugin naming pattern [#2720](https://github.com/argoproj/argo-rollouts/issues/2720) ([#2722](https://github.com/argoproj/argo-rollouts/issues/2722)) - -### BREAKING CHANGE - - -The metric labels have changed on controller_clientset_k8s_request_total to not include the name of the resource for events and replicasets. These names have generated hashes in them and cause really high cardinality. - -Remove name label from k8s some client metrics - -The `name` label in the `controller_clientset_k8s_request_total` metric -produce an excessive amount of cardinality for `events` and `replicasets`. -This can lead to hundreds of thousands of unique metrics over a couple -weeks in a large deployment. Set the name to "N/A" for these client request -types. +* stuck rollout when 2nd deployment happens before 1st finishes ([#3354](https://github.com/argoproj/argo-rollouts/issues/3354)) +* do not require pod readiness when switching desired service selector on abort ([#3338](https://github.com/argoproj/argo-rollouts/issues/3338)) @@ -557,21 +98,23 @@ types. ### Chore -* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) * bump gotestsum and fix flakey test causing nil channel send ([#2934](https://github.com/argoproj/argo-rollouts/issues/2934)) +* quote golang version string to not use go 1.2.2 ([#2915](https://github.com/argoproj/argo-rollouts/issues/2915)) +* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) +* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) +* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) * Update test and related docs for plugin name standard ([#2728](https://github.com/argoproj/argo-rollouts/issues/2728)) * bump k8s deps to v0.25.8 ([#2712](https://github.com/argoproj/argo-rollouts/issues/2712)) * add zachaller as lead in owers file ([#2759](https://github.com/argoproj/argo-rollouts/issues/2759)) -* add unit test ([#2798](https://github.com/argoproj/argo-rollouts/issues/2798)) -* add make help cmd ([#2854](https://github.com/argoproj/argo-rollouts/issues/2854)) * Add tests for pause functionality in rollout package ([#2772](https://github.com/argoproj/argo-rollouts/issues/2772)) -* bump golang to 1.20 ([#2910](https://github.com/argoproj/argo-rollouts/issues/2910)) -* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.30 to 1.18.31 ([#2924](https://github.com/argoproj/argo-rollouts/issues/2924)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) +* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) +* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.29 to 1.18.30 ([#2919](https://github.com/argoproj/argo-rollouts/issues/2919)) * **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.19.0 to 1.19.1 ([#2920](https://github.com/argoproj/argo-rollouts/issues/2920)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.3 to 1.27.0 ([#2922](https://github.com/argoproj/argo-rollouts/issues/2922)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) * **deps:** bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#2908](https://github.com/argoproj/argo-rollouts/issues/2908)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.28 to 1.18.29 ([#2907](https://github.com/argoproj/argo-rollouts/issues/2907)) * **deps:** bump github.com/antonmedv/expr from 1.12.6 to 1.12.7 ([#2894](https://github.com/argoproj/argo-rollouts/issues/2894)) @@ -587,44 +130,42 @@ types. * **deps:** bump google.golang.org/grpc from 1.56.1 to 1.56.2 ([#2872](https://github.com/argoproj/argo-rollouts/issues/2872)) * **deps:** bump sigstore/cosign-installer from 3.1.0 to 3.1.1 ([#2860](https://github.com/argoproj/argo-rollouts/issues/2860)) * **deps:** bump google.golang.org/protobuf from 1.30.0 to 1.31.0 ([#2859](https://github.com/argoproj/argo-rollouts/issues/2859)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.0 to 1.27.1 ([#2927](https://github.com/argoproj/argo-rollouts/issues/2927)) +* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) * **deps:** bump google.golang.org/grpc from 1.55.0 to 1.56.1 ([#2856](https://github.com/argoproj/argo-rollouts/issues/2856)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.12 to 1.19.13 ([#2847](https://github.com/argoproj/argo-rollouts/issues/2847)) * **deps:** bump actions/setup-go from 3.5.0 to 4.0.1 ([#2849](https://github.com/argoproj/argo-rollouts/issues/2849)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.26 to 1.18.27 ([#2844](https://github.com/argoproj/argo-rollouts/issues/2844)) * **deps:** bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 ([#2846](https://github.com/argoproj/argo-rollouts/issues/2846)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.1 to 1.26.2 ([#2848](https://github.com/argoproj/argo-rollouts/issues/2848)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.11 to 1.19.12 ([#2839](https://github.com/argoproj/argo-rollouts/issues/2839)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.26.0 to 1.26.1 ([#2840](https://github.com/argoproj/argo-rollouts/issues/2840)) -* **deps:** bump sigstore/cosign-installer from 3.0.5 to 3.1.0 ([#2858](https://github.com/argoproj/argo-rollouts/issues/2858)) +* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) +* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.25 to 1.18.26 ([#2841](https://github.com/argoproj/argo-rollouts/issues/2841)) -* **deps:** bump docker/build-push-action from 4.0.0 to 4.1.0 ([#2832](https://github.com/argoproj/argo-rollouts/issues/2832)) -* **deps:** bump github.com/sirupsen/logrus from 1.9.2 to 1.9.3 ([#2821](https://github.com/argoproj/argo-rollouts/issues/2821)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.31 to 1.18.32 ([#2928](https://github.com/argoproj/argo-rollouts/issues/2928)) * **deps:** bump github.com/hashicorp/go-plugin from 1.4.9 to 1.4.10 ([#2822](https://github.com/argoproj/argo-rollouts/issues/2822)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.14 to 1.20.1 ([#2926](https://github.com/argoproj/argo-rollouts/issues/2926)) * **deps:** bump github.com/stretchr/testify from 1.8.3 to 1.8.4 ([#2817](https://github.com/argoproj/argo-rollouts/issues/2817)) * **deps:** bump github.com/sirupsen/logrus from 1.9.1 to 1.9.2 ([#2789](https://github.com/argoproj/argo-rollouts/issues/2789)) * **deps:** bump github.com/stretchr/testify from 1.8.2 to 1.8.3 ([#2796](https://github.com/argoproj/argo-rollouts/issues/2796)) -* **deps:** bump slsa-framework/slsa-github-generator from 1.7.0 to 1.8.0 ([#2936](https://github.com/argoproj/argo-rollouts/issues/2936)) * **deps:** bump sigstore/cosign-installer from 3.0.3 to 3.0.5 ([#2788](https://github.com/argoproj/argo-rollouts/issues/2788)) -* **deps:** bump docker/build-push-action from 4.1.0 to 4.1.1 ([#2837](https://github.com/argoproj/argo-rollouts/issues/2837)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) * **deps:** bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 ([#2784](https://github.com/argoproj/argo-rollouts/issues/2784)) * **deps:** bump codecov/codecov-action from 3.1.3 to 3.1.4 ([#2782](https://github.com/argoproj/argo-rollouts/issues/2782)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.24 to 1.18.25 ([#2770](https://github.com/argoproj/argo-rollouts/issues/2770)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.23 to 1.18.24 ([#2768](https://github.com/argoproj/argo-rollouts/issues/2768)) * **deps:** bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#2763](https://github.com/argoproj/argo-rollouts/issues/2763)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.22 to 1.18.23 ([#2756](https://github.com/argoproj/argo-rollouts/issues/2756)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.20.1 to 1.20.2 ([#2941](https://github.com/argoproj/argo-rollouts/issues/2941)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) * **deps:** replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` ([#2681](https://github.com/argoproj/argo-rollouts/issues/2681)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.10 to 1.26.0 ([#2755](https://github.com/argoproj/argo-rollouts/issues/2755)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.10 to 1.19.11 ([#2757](https://github.com/argoproj/argo-rollouts/issues/2757)) * **deps:** bump github.com/prometheus/client_golang from 1.15.0 to 1.15.1 ([#2754](https://github.com/argoproj/argo-rollouts/issues/2754)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.21 to 1.18.22 ([#2746](https://github.com/argoproj/argo-rollouts/issues/2746)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.25.10 ([#2745](https://github.com/argoproj/argo-rollouts/issues/2745)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.27.1 to 1.27.2 ([#2944](https://github.com/argoproj/argo-rollouts/issues/2944)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.9 to 1.19.10 ([#2747](https://github.com/argoproj/argo-rollouts/issues/2747)) * **deps:** bump codecov/codecov-action from 3.1.2 to 3.1.3 ([#2735](https://github.com/argoproj/argo-rollouts/issues/2735)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.32 to 1.18.33 ([#2943](https://github.com/argoproj/argo-rollouts/issues/2943)) +* **deps:** bump actions/setup-go from 4.0.1 to 4.1.0 ([#2947](https://github.com/argoproj/argo-rollouts/issues/2947)) * **deps:** bump github.com/prometheus/client_golang from 1.14.0 to 1.15.0 ([#2721](https://github.com/argoproj/argo-rollouts/issues/2721)) * **deps:** bump codecov/codecov-action from 3.1.1 to 3.1.2 ([#2711](https://github.com/argoproj/argo-rollouts/issues/2711)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.20 to 1.18.21 ([#2709](https://github.com/argoproj/argo-rollouts/issues/2709)) @@ -645,38 +186,38 @@ types. ### Docs +* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) +* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) * mirroring support in Traefik is not implemented yet ([#2904](https://github.com/argoproj/argo-rollouts/issues/2904)) -* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) -* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) * Update docs of Rollout spec to add active/previewMetadata ([#2833](https://github.com/argoproj/argo-rollouts/issues/2833)) * Update datadog.md - clarify formulas [#2813](https://github.com/argoproj/argo-rollouts/issues/2813) ([#2819](https://github.com/argoproj/argo-rollouts/issues/2819)) * support for Kong ingress ([#2820](https://github.com/argoproj/argo-rollouts/issues/2820)) * Fix AWS App Mesh getting started documentation to avoid connection pooling problems ([#2814](https://github.com/argoproj/argo-rollouts/issues/2814)) * Update Changelog ([#2807](https://github.com/argoproj/argo-rollouts/issues/2807)) * use correct capitalization for "Datadog" in navigation sidebar ([#2809](https://github.com/argoproj/argo-rollouts/issues/2809)) -* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) -* support for Google Cloud Load balancers ([#2803](https://github.com/argoproj/argo-rollouts/issues/2803)) -* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) * Add gateway API link, fix Contour plugin naming ([#2787](https://github.com/argoproj/argo-rollouts/issues/2787)) +* fix minor mistakes in Migrating to Deployments ([#2270](https://github.com/argoproj/argo-rollouts/issues/2270)) +* Show how plugins are loaded ([#2801](https://github.com/argoproj/argo-rollouts/issues/2801)) +* Fix typo in header routing specification docs ([#2808](https://github.com/argoproj/argo-rollouts/issues/2808)) * Add some details around running locally to make things clearer new contributors ([#2786](https://github.com/argoproj/argo-rollouts/issues/2786)) * Add docs for Amazon Managed Prometheus ([#2777](https://github.com/argoproj/argo-rollouts/issues/2777)) * Update Changelog ([#2765](https://github.com/argoproj/argo-rollouts/issues/2765)) * copy argo cd docs drop down fix ([#2731](https://github.com/argoproj/argo-rollouts/issues/2731)) * Add contour trafficrouter plugin ([#2729](https://github.com/argoproj/argo-rollouts/issues/2729)) * fix link to plugins for traffic routers ([#2719](https://github.com/argoproj/argo-rollouts/issues/2719)) -* Update Changelog ([#2683](https://github.com/argoproj/argo-rollouts/issues/2683)) +* update contributions.md to include k3d as recommended cluster, add details on e2e test setup, and update kubectl install link. Fixes [#1750](https://github.com/argoproj/argo-rollouts/issues/1750) ([#1867](https://github.com/argoproj/argo-rollouts/issues/1867)) * **analysis:** fix use stringData in the examples ([#2715](https://github.com/argoproj/argo-rollouts/issues/2715)) -* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) * **example:** interval requires count ([#2690](https://github.com/argoproj/argo-rollouts/issues/2690)) +* **example:** Add example on how to execute subset of e2e tests ([#2867](https://github.com/argoproj/argo-rollouts/issues/2867)) ### Feat -* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) * enable self service notification support ([#2930](https://github.com/argoproj/argo-rollouts/issues/2930)) * support prometheus headers ([#2937](https://github.com/argoproj/argo-rollouts/issues/2937)) * Add insecure option for Prometheus. Fixes [#2913](https://github.com/argoproj/argo-rollouts/issues/2913) ([#2914](https://github.com/argoproj/argo-rollouts/issues/2914)) * Add prometheus timeout ([#2893](https://github.com/argoproj/argo-rollouts/issues/2893)) * Support Multiple ALB Ingresses ([#2639](https://github.com/argoproj/argo-rollouts/issues/2639)) +* Send informer add k8s event ([#2834](https://github.com/argoproj/argo-rollouts/issues/2834)) * add merge key to analysis template ([#2842](https://github.com/argoproj/argo-rollouts/issues/2842)) * retain TLS configuration for canary ingresses in the nginx integration. Fixes [#1134](https://github.com/argoproj/argo-rollouts/issues/1134) ([#2679](https://github.com/argoproj/argo-rollouts/issues/2679)) * **analysis:** Adds rollout Spec.Selector.MatchLabels to AnalysisRun. Fixes [#2888](https://github.com/argoproj/argo-rollouts/issues/2888) ([#2903](https://github.com/argoproj/argo-rollouts/issues/2903)) @@ -686,20 +227,20 @@ types. ### Fix -* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) -* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) +* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) +* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) * rollout not modify the VirtualService whit setHeaderRoute step with workloadRef ([#2797](https://github.com/argoproj/argo-rollouts/issues/2797)) * get new httpRoutesI after removeRoute() to avoid duplicates. Fixes [#2769](https://github.com/argoproj/argo-rollouts/issues/2769) ([#2887](https://github.com/argoproj/argo-rollouts/issues/2887)) +* make new alb fullName field optional for backward compatability ([#2806](https://github.com/argoproj/argo-rollouts/issues/2806)) * change logic of analysis run to better handle errors ([#2695](https://github.com/argoproj/argo-rollouts/issues/2695)) -* istio dropping fields during removing of managed routes ([#2692](https://github.com/argoproj/argo-rollouts/issues/2692)) -* resolve args to metric in garbage collection function ([#2843](https://github.com/argoproj/argo-rollouts/issues/2843)) -* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) +* cloudwatch metrics provider multiple dimensions ([#2932](https://github.com/argoproj/argo-rollouts/issues/2932)) * add required ingress permission ([#2933](https://github.com/argoproj/argo-rollouts/issues/2933)) -* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) +* properly wrap Datadog API v2 request body ([#2771](https://github.com/argoproj/argo-rollouts/issues/2771)) ([#2775](https://github.com/argoproj/argo-rollouts/issues/2775)) * **analysis:** Graphite query - remove whitespaces ([#2752](https://github.com/argoproj/argo-rollouts/issues/2752)) * **analysis:** Graphite metric provider - index out of range [0] with length 0 ([#2751](https://github.com/argoproj/argo-rollouts/issues/2751)) -* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) +* **analysis:** Adding field in YAML to provide region for Sigv4 signing. ([#2794](https://github.com/argoproj/argo-rollouts/issues/2794)) * **controller:** Fix for rollouts getting stuck in loop ([#2689](https://github.com/argoproj/argo-rollouts/issues/2689)) +* **controller:** Remove name label from some k8s client metrics on events and replicasets ([#2851](https://github.com/argoproj/argo-rollouts/issues/2851)) * **controller:** Add klog logrus bridge. Fixes [#2707](https://github.com/argoproj/argo-rollouts/issues/2707). ([#2701](https://github.com/argoproj/argo-rollouts/issues/2701)) * **trafficrouting:** apply stable selectors on canary service on rollout abort [#2781](https://github.com/argoproj/argo-rollouts/issues/2781) ([#2818](https://github.com/argoproj/argo-rollouts/issues/2818)) @@ -774,8 +315,8 @@ types. * switch to distroless for cli/dashboard image ([#2596](https://github.com/argoproj/argo-rollouts/issues/2596)) * add Tuhu to users ([#2630](https://github.com/argoproj/argo-rollouts/issues/2630)) * bump deps for prisma ([#2643](https://github.com/argoproj/argo-rollouts/issues/2643)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.6 to 1.25.7 ([#2682](https://github.com/argoproj/argo-rollouts/issues/2682)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.15 to 1.18.16 ([#2652](https://github.com/argoproj/argo-rollouts/issues/2652)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.13 to 1.18.14 ([#2614](https://github.com/argoproj/argo-rollouts/issues/2614)) +* **deps:** bump github.com/antonmedv/expr from 1.12.3 to 1.12.5 ([#2670](https://github.com/argoproj/argo-rollouts/issues/2670)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.16 to 1.18.17 ([#2659](https://github.com/argoproj/argo-rollouts/issues/2659)) * **deps:** bump github.com/antonmedv/expr from 1.12.2 to 1.12.3 ([#2653](https://github.com/argoproj/argo-rollouts/issues/2653)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.5 to 1.19.6 ([#2654](https://github.com/argoproj/argo-rollouts/issues/2654)) @@ -790,20 +331,20 @@ types. * **deps:** bump google.golang.org/protobuf from 1.29.0 to 1.29.1 ([#2660](https://github.com/argoproj/argo-rollouts/issues/2660)) * **deps:** bump google.golang.org/protobuf from 1.29.1 to 1.30.0 ([#2665](https://github.com/argoproj/argo-rollouts/issues/2665)) * **deps:** bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#2627](https://github.com/argoproj/argo-rollouts/issues/2627)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.6 to 1.19.7 ([#2672](https://github.com/argoproj/argo-rollouts/issues/2672)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.14 to 1.18.15 ([#2618](https://github.com/argoproj/argo-rollouts/issues/2618)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.3 to 1.25.4 ([#2617](https://github.com/argoproj/argo-rollouts/issues/2617)) * **deps:** bump github.com/antonmedv/expr from 1.12.0 to 1.12.1 ([#2619](https://github.com/argoproj/argo-rollouts/issues/2619)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.4 to 1.19.5 ([#2616](https://github.com/argoproj/argo-rollouts/issues/2616)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.3 to 1.19.4 ([#2612](https://github.com/argoproj/argo-rollouts/issues/2612)) * **deps:** bump github.com/prometheus/common from 0.39.0 to 0.40.0 ([#2611](https://github.com/argoproj/argo-rollouts/issues/2611)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.13 to 1.18.14 ([#2614](https://github.com/argoproj/argo-rollouts/issues/2614)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.6 to 1.25.7 ([#2682](https://github.com/argoproj/argo-rollouts/issues/2682)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.2 to 1.25.3 ([#2615](https://github.com/argoproj/argo-rollouts/issues/2615)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.14 to 1.18.15 ([#2618](https://github.com/argoproj/argo-rollouts/issues/2618)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.19.6 to 1.19.7 ([#2672](https://github.com/argoproj/argo-rollouts/issues/2672)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.17 to 1.18.19 ([#2673](https://github.com/argoproj/argo-rollouts/issues/2673)) * **deps:** bump imjasonh/setup-crane from 0.2 to 0.3 ([#2600](https://github.com/argoproj/argo-rollouts/issues/2600)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.5 to 1.25.6 ([#2671](https://github.com/argoproj/argo-rollouts/issues/2671)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2593](https://github.com/argoproj/argo-rollouts/issues/2593)) -* **deps:** bump github.com/antonmedv/expr from 1.12.3 to 1.12.5 ([#2670](https://github.com/argoproj/argo-rollouts/issues/2670)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/config from 1.18.15 to 1.18.16 ([#2652](https://github.com/argoproj/argo-rollouts/issues/2652)) * **deps:** bump google.golang.org/grpc from 1.52.3 to 1.53.0 ([#2574](https://github.com/argoproj/argo-rollouts/issues/2574)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2565](https://github.com/argoproj/argo-rollouts/issues/2565)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2564](https://github.com/argoproj/argo-rollouts/issues/2564)) @@ -865,12 +406,12 @@ types. ### Fix -* update GetTargetGroupMetadata to call DescribeTags in batches ([#2570](https://github.com/argoproj/argo-rollouts/issues/2570)) * switch service selector back to stable on canary service when aborted ([#2540](https://github.com/argoproj/argo-rollouts/issues/2540)) * change log generator to only add CHANGELOG.md ([#2626](https://github.com/argoproj/argo-rollouts/issues/2626)) * Rollback change on service creation with weightless experiments ([#2624](https://github.com/argoproj/argo-rollouts/issues/2624)) * flakey TestWriteBackToInformer test ([#2621](https://github.com/argoproj/argo-rollouts/issues/2621)) * remove outdated ioutil package dependencies ([#2583](https://github.com/argoproj/argo-rollouts/issues/2583)) +* update GetTargetGroupMetadata to call DescribeTags in batches ([#2570](https://github.com/argoproj/argo-rollouts/issues/2570)) * analysis information box [#2530](https://github.com/argoproj/argo-rollouts/issues/2530) ([#2575](https://github.com/argoproj/argo-rollouts/issues/2575)) * support only tls in virtual services ([#2502](https://github.com/argoproj/argo-rollouts/issues/2502)) * **analysis:** Nil Pointer Fixes [#2458](https://github.com/argoproj/argo-rollouts/issues/2458) ([#2680](https://github.com/argoproj/argo-rollouts/issues/2680)) @@ -936,21 +477,21 @@ There was an unintentional change in behavior related to service creation with e ### Chore -* Add Yotpo to USERS.md +* add optum to users list ([#2466](https://github.com/argoproj/argo-rollouts/issues/2466)) * upgrade golang to 1.19 ([#2219](https://github.com/argoproj/argo-rollouts/issues/2219)) -* remove deprecated -i for go build ([#2047](https://github.com/argoproj/argo-rollouts/issues/2047)) -* rename the examples/trafffic-management directory to istio ([#2315](https://github.com/argoproj/argo-rollouts/issues/2315)) +* sign container images and checksum assets ([#2334](https://github.com/argoproj/argo-rollouts/issues/2334)) * update stable tag conditionally ([#2480](https://github.com/argoproj/argo-rollouts/issues/2480)) * fix checksum generation ([#2481](https://github.com/argoproj/argo-rollouts/issues/2481)) -* add optum to users list ([#2466](https://github.com/argoproj/argo-rollouts/issues/2466)) +* Add Yotpo to USERS.md * use docker login to sign images ([#2479](https://github.com/argoproj/argo-rollouts/issues/2479)) * use correct image for plugin container ([#2478](https://github.com/argoproj/argo-rollouts/issues/2478)) +* rename the examples/trafffic-management directory to istio ([#2315](https://github.com/argoproj/argo-rollouts/issues/2315)) * Add example for istio-subset-split ([#2318](https://github.com/argoproj/argo-rollouts/issues/2318)) * add deprecation notice for rollout_phase in docs ([#2377](https://github.com/argoproj/argo-rollouts/issues/2377)) ([#2378](https://github.com/argoproj/argo-rollouts/issues/2378)) -* sign container images and checksum assets ([#2334](https://github.com/argoproj/argo-rollouts/issues/2334)) +* remove deprecated -i for go build ([#2047](https://github.com/argoproj/argo-rollouts/issues/2047)) * **cli:** add darwin arm64 to build and release ([#2264](https://github.com/argoproj/argo-rollouts/issues/2264)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2487](https://github.com/argoproj/argo-rollouts/issues/2487)) -* **deps:** bump github.com/prometheus/common from 0.37.0 to 0.38.0 ([#2468](https://github.com/argoproj/argo-rollouts/issues/2468)) +* **deps:** upgrade ui deps to fix high security cve's ([#2345](https://github.com/argoproj/argo-rollouts/issues/2345)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.0 to 1.17.1 ([#2369](https://github.com/argoproj/argo-rollouts/issues/2369)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2455](https://github.com/argoproj/argo-rollouts/issues/2455)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2454](https://github.com/argoproj/argo-rollouts/issues/2454)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2452](https://github.com/argoproj/argo-rollouts/issues/2452)) @@ -966,23 +507,23 @@ There was an unintentional change in behavior related to service creation with e * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2413](https://github.com/argoproj/argo-rollouts/issues/2413)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2412](https://github.com/argoproj/argo-rollouts/issues/2412)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2409](https://github.com/argoproj/argo-rollouts/issues/2409)) -* **deps:** bump github.com/prometheus/client_golang ([#2469](https://github.com/argoproj/argo-rollouts/issues/2469)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2406](https://github.com/argoproj/argo-rollouts/issues/2406)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2404](https://github.com/argoproj/argo-rollouts/issues/2404)) -* **deps:** bump notification engine ([#2470](https://github.com/argoproj/argo-rollouts/issues/2470)) +* **deps:** bump github.com/prometheus/client_golang ([#2469](https://github.com/argoproj/argo-rollouts/issues/2469)) * **deps:** bump codecov/codecov-action from 2.1.0 to 3.1.1 ([#2251](https://github.com/argoproj/argo-rollouts/issues/2251)) +* **deps:** bump notification engine ([#2470](https://github.com/argoproj/argo-rollouts/issues/2470)) * **deps:** bump github.com/prometheus/common from 0.38.0 to 0.39.0 ([#2476](https://github.com/argoproj/argo-rollouts/issues/2476)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2477](https://github.com/argoproj/argo-rollouts/issues/2477)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.2 to 1.17.3 ([#2484](https://github.com/argoproj/argo-rollouts/issues/2484)) * **deps:** bump dependabot/fetch-metadata from 1.3.4 to 1.3.5 ([#2390](https://github.com/argoproj/argo-rollouts/issues/2390)) * **deps:** bump imjasonh/setup-crane from 0.1 to 0.2 ([#2387](https://github.com/argoproj/argo-rollouts/issues/2387)) -* **deps:** upgrade ui deps to fix high security cve's ([#2345](https://github.com/argoproj/argo-rollouts/issues/2345)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2406](https://github.com/argoproj/argo-rollouts/issues/2406)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2487](https://github.com/argoproj/argo-rollouts/issues/2487)) +* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.2 to 1.17.3 ([#2484](https://github.com/argoproj/argo-rollouts/issues/2484)) * **deps:** bump actions/upload-artifact from 2 to 3 ([#1973](https://github.com/argoproj/argo-rollouts/issues/1973)) * **deps:** bump github.com/influxdata/influxdb-client-go/v2 ([#2381](https://github.com/argoproj/argo-rollouts/issues/2381)) * **deps:** bump github.com/spf13/cobra from 1.6.0 to 1.6.1 ([#2370](https://github.com/argoproj/argo-rollouts/issues/2370)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/cloudwatch ([#2366](https://github.com/argoproj/argo-rollouts/issues/2366)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2367](https://github.com/argoproj/argo-rollouts/issues/2367)) -* **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.17.0 to 1.17.1 ([#2369](https://github.com/argoproj/argo-rollouts/issues/2369)) +* **deps:** bump github.com/prometheus/common from 0.37.0 to 0.38.0 ([#2468](https://github.com/argoproj/argo-rollouts/issues/2468)) * **deps:** bump github.com/stretchr/testify from 1.8.0 to 1.8.1 ([#2368](https://github.com/argoproj/argo-rollouts/issues/2368)) * **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2365](https://github.com/argoproj/argo-rollouts/issues/2365)) * **deps:** bump github.com/aws/aws-sdk-go-v2 from 1.16.16 to 1.17.0 ([#2364](https://github.com/argoproj/argo-rollouts/issues/2364)) @@ -1005,7 +546,7 @@ There was an unintentional change in behavior related to service creation with e * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2294](https://github.com/argoproj/argo-rollouts/issues/2294)) * **deps:** bump google.golang.org/grpc from 1.47.0 to 1.50.0 ([#2293](https://github.com/argoproj/argo-rollouts/issues/2293)) * **deps:** bump docker/metadata-action from 3 to 4 ([#2292](https://github.com/argoproj/argo-rollouts/issues/2292)) -* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2486](https://github.com/argoproj/argo-rollouts/issues/2486)) +* **deps:** bump github/codeql-action from 1 to 2 ([#2289](https://github.com/argoproj/argo-rollouts/issues/2289)) * **deps:** bump docker/login-action from 1 to 2 ([#2288](https://github.com/argoproj/argo-rollouts/issues/2288)) * **deps:** bump actions/setup-go from 2 to 3 ([#2287](https://github.com/argoproj/argo-rollouts/issues/2287)) * **deps:** bump dependabot/fetch-metadata from 1.3.3 to 1.3.4 ([#2286](https://github.com/argoproj/argo-rollouts/issues/2286)) @@ -1014,8 +555,8 @@ There was an unintentional change in behavior related to service creation with e * **deps:** bump actions/cache from 2 to 3.0.1 ([#1940](https://github.com/argoproj/argo-rollouts/issues/1940)) * **deps:** bump docker/setup-qemu-action from 1 to 2 ([#2284](https://github.com/argoproj/argo-rollouts/issues/2284)) * **deps:** bump actions/checkout from 2 to 3.1.0 ([#2283](https://github.com/argoproj/argo-rollouts/issues/2283)) +* **deps:** bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 ([#2486](https://github.com/argoproj/argo-rollouts/issues/2486)) * **deps:** bump github.com/aws/aws-sdk-go-v2/config ([#2485](https://github.com/argoproj/argo-rollouts/issues/2485)) -* **deps:** bump github/codeql-action from 1 to 2 ([#2289](https://github.com/argoproj/argo-rollouts/issues/2289)) ### Ci @@ -1034,23 +575,23 @@ There was an unintentional change in behavior related to service creation with e ### Docs -* Add traffic router support to readme ([#2444](https://github.com/argoproj/argo-rollouts/issues/2444)) -* fix typo in helm Argo rollouts ([#2442](https://github.com/argoproj/argo-rollouts/issues/2442)) +* common questions for Rollbacks ([#2027](https://github.com/argoproj/argo-rollouts/issues/2027)) * correct syntax of canary setMirrorRoute's value ([#2431](https://github.com/argoproj/argo-rollouts/issues/2431)) -* Explain upgrade process ([#2424](https://github.com/argoproj/argo-rollouts/issues/2424)) +* add artifact badge ([#2331](https://github.com/argoproj/argo-rollouts/issues/2331)) +* Use new Google Analytics 4 site tag ([#2299](https://github.com/argoproj/argo-rollouts/issues/2299)) * add progressive delivery with gitops example for openshift ([#2400](https://github.com/argoproj/argo-rollouts/issues/2400)) * fix !important block typo ([#2372](https://github.com/argoproj/argo-rollouts/issues/2372)) * mention supported versions ([#2163](https://github.com/argoproj/argo-rollouts/issues/2163)) * Added blog post for minimize impact in Kubernetes using Progressive Delivery and customer side impact ([#2355](https://github.com/argoproj/argo-rollouts/issues/2355)) -* Update docs for new openapi kustomize support ([#2216](https://github.com/argoproj/argo-rollouts/issues/2216)) -* add artifact badge ([#2331](https://github.com/argoproj/argo-rollouts/issues/2331)) -* Use new Google Analytics 4 site tag ([#2299](https://github.com/argoproj/argo-rollouts/issues/2299)) +* add Opensurvey to USERS.md ([#2195](https://github.com/argoproj/argo-rollouts/issues/2195)) +* fix typo in helm Argo rollouts ([#2442](https://github.com/argoproj/argo-rollouts/issues/2442)) +* Explain upgrade process ([#2424](https://github.com/argoproj/argo-rollouts/issues/2424)) * Fixed read the docs rendering ([#2277](https://github.com/argoproj/argo-rollouts/issues/2277)) -* common questions for Rollbacks ([#2027](https://github.com/argoproj/argo-rollouts/issues/2027)) +* Add traffic router support to readme ([#2444](https://github.com/argoproj/argo-rollouts/issues/2444)) * add OpsVerse as an official user (USERS.md) ([#2209](https://github.com/argoproj/argo-rollouts/issues/2209)) * Fix the controller annotation to enable data scrapping ([#2238](https://github.com/argoproj/argo-rollouts/issues/2238)) * Update release docs for versioned formula ([#2245](https://github.com/argoproj/argo-rollouts/issues/2245)) -* add Opensurvey to USERS.md ([#2195](https://github.com/argoproj/argo-rollouts/issues/2195)) +* Update docs for new openapi kustomize support ([#2216](https://github.com/argoproj/argo-rollouts/issues/2216)) * **trafficrouting:** fix docs warning to github style markdown ([#2342](https://github.com/argoproj/argo-rollouts/issues/2342)) ### Feat @@ -1058,30 +599,30 @@ There was an unintentional change in behavior related to service creation with e * Implement Issue [#1779](https://github.com/argoproj/argo-rollouts/issues/1779): add rollout.Spec.Strategy.Canary.MinPodsPerReplicaSet ([#2448](https://github.com/argoproj/argo-rollouts/issues/2448)) * Apache APISIX support. Fixes [#2395](https://github.com/argoproj/argo-rollouts/issues/2395) ([#2437](https://github.com/argoproj/argo-rollouts/issues/2437)) * rollback windows. Fixes [#574](https://github.com/argoproj/argo-rollouts/issues/574) ([#2394](https://github.com/argoproj/argo-rollouts/issues/2394)) -* Support TCP routes traffic splitting for Istio VirtualService ([#1659](https://github.com/argoproj/argo-rollouts/issues/1659)) * add support for getting the replicaset name via templating ([#2396](https://github.com/argoproj/argo-rollouts/issues/2396)) * Allow Traffic shaping through header based routing for ALB ([#2214](https://github.com/argoproj/argo-rollouts/issues/2214)) * Add support for spec.ingressClassName ([#2178](https://github.com/argoproj/argo-rollouts/issues/2178)) +* Support TCP routes traffic splitting for Istio VirtualService ([#1659](https://github.com/argoproj/argo-rollouts/issues/1659)) * **cli:** dynamic shell completion for main resources names (rollouts, experiments, analysisrun) ([#2379](https://github.com/argoproj/argo-rollouts/issues/2379)) * **cli:** add port flag for dashboard command ([#2383](https://github.com/argoproj/argo-rollouts/issues/2383)) * **controller:** don't hardcode experiment ports; always create service ([#2397](https://github.com/argoproj/argo-rollouts/issues/2397)) ### Fix -* set gopath in makefile ([#2398](https://github.com/argoproj/argo-rollouts/issues/2398)) * dev build can set DEV_IMAGE=true ([#2440](https://github.com/argoproj/argo-rollouts/issues/2440)) * add patch verb to deployment resource ([#2407](https://github.com/argoproj/argo-rollouts/issues/2407)) * rootPath support so that it uses the embedded files system ([#2198](https://github.com/argoproj/argo-rollouts/issues/2198)) +* set gopath in makefile ([#2398](https://github.com/argoproj/argo-rollouts/issues/2398)) * change completed condition so it only triggers on pod hash changes also adds an event for when it does changes. ([#2203](https://github.com/argoproj/argo-rollouts/issues/2203)) * enable notifications without when condition ([#2231](https://github.com/argoproj/argo-rollouts/issues/2231)) * UI not redirecting on / ([#2252](https://github.com/argoproj/argo-rollouts/issues/2252)) * nil pointer while linting with basic canary and ingresses ([#2256](https://github.com/argoproj/argo-rollouts/issues/2256)) -* **analysis:** Fix Analysis Terminal Decision For Dry-Run Metrics ([#2399](https://github.com/argoproj/argo-rollouts/issues/2399)) * **analysis:** Make AR End When Only Dry-Run Metrics Are Defined ([#2230](https://github.com/argoproj/argo-rollouts/issues/2230)) +* **analysis:** Fix Analysis Terminal Decision For Dry-Run Metrics ([#2399](https://github.com/argoproj/argo-rollouts/issues/2399)) * **analysis:** Avoid Infinite Error Message Append For Failed Dry-Run Metrics ([#2182](https://github.com/argoproj/argo-rollouts/issues/2182)) * **cli:** nil pointer while linting ([#2324](https://github.com/argoproj/argo-rollouts/issues/2324)) -* **controller:** leader election preventing two controllers running and gracefully shutting down ([#2291](https://github.com/argoproj/argo-rollouts/issues/2291)) * **controller:** Fix k8s clientset controller metrics. Fixes [#2139](https://github.com/argoproj/argo-rollouts/issues/2139) ([#2261](https://github.com/argoproj/argo-rollouts/issues/2261)) +* **controller:** leader election preventing two controllers running and gracefully shutting down ([#2291](https://github.com/argoproj/argo-rollouts/issues/2291)) * **dashboard:** correct mime type is returned. Fixes: [#2290](https://github.com/argoproj/argo-rollouts/issues/2290) ([#2303](https://github.com/argoproj/argo-rollouts/issues/2303)) * **example:** correct docs when metrics got result empty ([#2309](https://github.com/argoproj/argo-rollouts/issues/2309)) * **metricprovider:** Support jsonBody for web metric provider Fixes [#2275](https://github.com/argoproj/argo-rollouts/issues/2275) ([#2312](https://github.com/argoproj/argo-rollouts/issues/2312)) From 36c8009cfc9805837573ff58d148c06ce2c078e3 Mon Sep 17 00:00:00 2001 From: Alexandre Gaudreault Date: Thu, 15 Feb 2024 16:34:09 -0500 Subject: [PATCH 194/264] test: add unit tests for maxSurge=0, replicas=1 (#3375) * tests: add unit tests for maxSurge=0, replicas=1 Signed-off-by: Alexandre Gaudreault * update doc Signed-off-by: Alexandre Gaudreault * update test name Signed-off-by: Alexandre Gaudreault --------- Signed-off-by: Alexandre Gaudreault --- docs/features/canary.md | 6 ++-- utils/replicaset/canary.go | 9 +++--- utils/replicaset/canary_test.go | 56 ++++++++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/docs/features/canary.md b/docs/features/canary.md index 55269cbdc1..4e3dab50c8 100644 --- a/docs/features/canary.md +++ b/docs/features/canary.md @@ -1,5 +1,5 @@ # Canary Deployment Strategy -A canary rollout is a deployment strategy where the operator releases a new version of their application to a small percentage of the production traffic. +A canary rollout is a deployment strategy where the operator releases a new version of their application to a small percentage of the production traffic. ## Overview Since there is no agreed upon standard for a canary deployment, the rollouts controller allows users to outline how they want to run their canary deployment. Users can define a list of steps the controller uses to manipulate the ReplicaSets when there is a change to the `.spec.template`. Each step will be evaluated before the new ReplicaSet is promoted to the stable version, and the old version is completely scaled down. @@ -7,7 +7,7 @@ Since there is no agreed upon standard for a canary deployment, the rollouts con Each step can have one of two fields. The `setWeight` field dictates the percentage of traffic that should be sent to the canary, and the `pause` struct instructs the rollout to pause. When the controller reaches a `pause` step for a rollout, it will add a `PauseCondition` struct to the `.status.PauseConditions` field. If the `duration` field within the `pause` struct is set, the rollout will not progress to the next step until it has waited for the value of the `duration` field. Otherwise, the rollout will wait indefinitely until that Pause condition is removed. By using the `setWeight` and the `pause` fields, a user can declaratively describe how they want to progress to the new version. Below is an example of a canary strategy. !!! important - If the canary Rollout does not use [traffic management](traffic-management/index.md), the Rollout makes a best effort attempt to achieve the percentage listed in the last `setWeight` step between the new and old version. For example, if a Rollout has 10 Replicas and 10% for the first `setWeight` step, the controller will scale the new desired ReplicaSet to 1 replicas and the old stable ReplicaSet to 9. In the case where the setWeight is 15%, the Rollout attempts to get there by rounding up the calculation (i.e. the new ReplicaSet has 2 pods since 15% of 10 rounds up to 2 and the old ReplicaSet has 9 pods since 85% of 10 rounds up to 9). If a user wants to have more fine-grained control of the percentages without a large number of Replicas, that user should use the [traffic management](#trafficrouting) functionality. + If the canary Rollout does not use [traffic management](traffic-management/index.md), the Rollout makes a best effort attempt to achieve the percentage listed in the last `setWeight` step between the new and old version. For example, if a Rollout has 10 Replicas and 10% for the first `setWeight` step, the controller will scale the new desired ReplicaSet to 1 replicas and the old stable ReplicaSet to 9. In the case where the setWeight is 41%, the Rollout attempts to get there by finding the whole number with the smallest delta, rounding up the calculation if the deltas are equals (i.e. the new ReplicaSet has 4 pods since 41% of 10 is closer to 4/10 than 5/10, and the old ReplicaSet has 6 pods). If a user wants to have more fine-grained control of the percentages without a large number of Replicas, that user should use the [traffic management](#trafficrouting) functionality. ## Example ```yaml @@ -59,7 +59,7 @@ spec: - pause: {} # pause indefinitely ``` -If no `duration` is specified for a pause step, the rollout will be paused indefinitely. To unpause, use the [argo kubectl plugin](kubectl-plugin.md) `promote` command. +If no `duration` is specified for a pause step, the rollout will be paused indefinitely. To unpause, use the [argo kubectl plugin](kubectl-plugin.md) `promote` command. ```shell # promote to the next step diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index 40eadb7848..d38a5d23a7 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -56,11 +56,12 @@ func AtDesiredReplicaCountsForCanary(ro *v1alpha1.Rollout, newRS, stableRS *apps // when using the basic canary strategy. The function calculates the desired number of replicas for // the new and stable RS using the following equations: // -// newRS Replica count = spec.Replica * (setweight / 100) -// stableRS Replica count = spec.Replica * (1 - setweight / 100) +// desired newRS Replica count = spec.Replica * (setweight / 100) +// desired stableRS Replica count = spec.Replica - newRS +// +// The function for newRS finds the closest whole number of replicas based on the weight percentage +// and rounds up the desired replica count in case of a tie. // -// In both equations, the function rounds the desired replica count up if the math does not divide into whole numbers -// because the rollout guarantees at least one replica for both the stable and new RS when the setWeight is not 0 or 100. // Then, the function finds the number of replicas it can scale up using the following equation: // // scaleUpCount := (maxSurge + rollout.Spec.Replica) - sum of rollout's RSs spec.Replica diff --git a/utils/replicaset/canary_test.go b/utils/replicaset/canary_test.go index 375ca43ce4..ed4f78697a 100755 --- a/utils/replicaset/canary_test.go +++ b/utils/replicaset/canary_test.go @@ -276,7 +276,7 @@ func TestCalculateReplicaCountsForCanary(t *testing.T) { expectedCanaryReplicaCount: 10, }, { - name: "Do not scale newRS down to zero on non-zero weight", + name: "Do not scale canaryRS down to zero on non-zero weight", rolloutSpecReplicas: 1, setWeight: 20, maxSurge: intstr.FromInt(1), @@ -308,7 +308,55 @@ func TestCalculateReplicaCountsForCanary(t *testing.T) { expectedCanaryReplicaCount: 1, }, { - name: "Scale up Stable before newRS", + name: "Scale canaryRS to zero on <50 weight without surge", + rolloutSpecReplicas: 1, + setWeight: 49, + maxSurge: intstr.FromInt(0), + maxUnavailable: intstr.FromInt(1), + + stableSpecReplica: 1, + stableAvailableReplica: 1, + + canarySpecReplica: 0, + canaryAvailableReplica: 0, + + expectedStableReplicaCount: 1, + expectedCanaryReplicaCount: 0, + }, + { + name: "Scale stableRS down to zero on >=50 weight without surge", + rolloutSpecReplicas: 1, + setWeight: 51, + maxSurge: intstr.FromInt(0), + maxUnavailable: intstr.FromInt(1), + + stableSpecReplica: 1, + stableAvailableReplica: 1, + + canarySpecReplica: 0, + canaryAvailableReplica: 0, + + expectedStableReplicaCount: 0, + expectedCanaryReplicaCount: 0, + }, + { + name: "Scale canaryRS to one on >=50 weight without surge and stable replicas", + rolloutSpecReplicas: 1, + setWeight: 51, + maxSurge: intstr.FromInt(0), + maxUnavailable: intstr.FromInt(1), + + stableSpecReplica: 0, + stableAvailableReplica: 0, + + canarySpecReplica: 0, + canaryAvailableReplica: 0, + + expectedStableReplicaCount: 0, + expectedCanaryReplicaCount: 1, + }, + { + name: "Scale up Stable before canaryRS", rolloutSpecReplicas: 10, setWeight: 30, maxSurge: intstr.FromInt(1), @@ -326,7 +374,7 @@ func TestCalculateReplicaCountsForCanary(t *testing.T) { olderRS: newRS("older", 3, 3), }, { - name: "Scale down newRS and stable", + name: "Scale down canaryRS and stable", rolloutSpecReplicas: 10, setWeight: 30, maxSurge: intstr.FromInt(0), @@ -358,7 +406,7 @@ func TestCalculateReplicaCountsForCanary(t *testing.T) { expectedCanaryReplicaCount: 9, }, { - name: "Do not scale down newRS or stable when older RS count >= scaleDownCount", + name: "Do not scale down canaryRS or stable when older RS count >= scaleDownCount", rolloutSpecReplicas: 10, setWeight: 30, maxSurge: intstr.FromInt(0), From fcb88f07b8e3478c5769c69ad0967e9fc19b6195 Mon Sep 17 00:00:00 2001 From: OpenGuidou <73480729+OpenGuidou@users.noreply.github.com> Date: Fri, 16 Feb 2024 07:12:20 +0100 Subject: [PATCH 195/264] feat: Support AnalysisRunMetadata and Dryrun for experiments via Rollout (#3213) Signed-off-by: Guillaume Doussin --- experiments/analysisrun_test.go | 115 ++ experiments/experiment.go | 56 +- manifests/crds/experiment-crd.yaml | 11 + manifests/crds/rollout-crd.yaml | 20 + manifests/install.yaml | 31 + pkg/apiclient/rollout/rollout.swagger.json | 11 + pkg/apis/api-rules/violation_exceptions.list | 1 + .../rollouts/v1alpha1/experiment_types.go | 3 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1211 ++++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 14 + .../rollouts/v1alpha1/openapi_generated.go | 38 +- pkg/apis/rollouts/v1alpha1/types.go | 8 + .../v1alpha1/zz_generated.deepcopy.go | 7 + .../validation/validation_references.go | 4 +- rollout/analysis.go | 19 +- rollout/experiment.go | 2 + rollout/experiment_test.go | 74 + ui/src/models/rollout/generated/api.ts | 12 + utils/analysis/helpers.go | 7 +- utils/analysis/helpers_test.go | 43 +- 20 files changed, 1123 insertions(+), 564 deletions(-) diff --git a/experiments/analysisrun_test.go b/experiments/analysisrun_test.go index 9ed0834cfd..a50fdad861 100644 --- a/experiments/analysisrun_test.go +++ b/experiments/analysisrun_test.go @@ -734,3 +734,118 @@ func TestTerminateAnalysisRuns(t *testing.T) { patchedAr := f.getPatchedAnalysisRunAsObj(arPatchIdx) assert.True(t, patchedAr.Spec.Terminate) } + +// TestCreateAnalysisRunWithMetadataAndDryRun ensures we create the AnalysisRun with the appropriate labels, annotations, and dry-run options when provided in the experiment +func TestCreateAnalysisRunWithMetadataAndDryRun(t *testing.T) { + templates := generateTemplates("bar") + aTemplates := generateAnalysisTemplates("success-rate") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "success-rate", + TemplateName: aTemplates[0].Name, + }, + } + e.Status.Phase = v1alpha1.AnalysisPhaseRunning + e.Status.AvailableAt = now() + e.Spec.AnalysisRunMetadata = v1alpha1.AnalysisRunMetadata{ + Labels: map[string]string{ + "foo": "bar", + "foo2": "bar2", + }, + Annotations: map[string]string{ + "bar": "foo", + "bar2": "foo2", + }, + } + e.Spec.DryRun = []v1alpha1.DryRun{ + { + MetricName: "someMetric", + }, + { + MetricName: "someOtherMetric", + }, + } + rs := templateToRS(e, templates[0], 1) + ar := analysisTemplateToRun("success-rate", e, &aTemplates[0].Spec) + + f := newFixture(t, e, rs, &aTemplates[0]) + defer f.Close() + + analysisRunIdx := f.expectCreateAnalysisRunAction(ar) + patchIdx := f.expectPatchExperimentAction(e) + f.run(getKey(e, t)) + + patchedEx := f.getPatchedExperimentAsObj(patchIdx) + assert.Equal(t, v1alpha1.AnalysisPhasePending, patchedEx.Status.AnalysisRuns[0].Phase) + + analysisRun := f.getCreatedAnalysisRun(analysisRunIdx) + assert.Len(t, analysisRun.ObjectMeta.Labels, 2) + assert.Equal(t, analysisRun.ObjectMeta.Labels["foo"], "bar") + assert.Equal(t, analysisRun.ObjectMeta.Labels["foo2"], "bar2") + assert.Len(t, analysisRun.ObjectMeta.Annotations, 2) + assert.Equal(t, analysisRun.ObjectMeta.Annotations["bar"], "foo") + assert.Equal(t, analysisRun.ObjectMeta.Annotations["bar2"], "foo2") + + assert.Len(t, analysisRun.Spec.DryRun, 2) + assert.Equal(t, analysisRun.Spec.DryRun[0].MetricName, "someMetric") + assert.Equal(t, analysisRun.Spec.DryRun[1].MetricName, "someOtherMetric") +} + +// TestCreateAnalysisRunWithMetadataAndDryRunWithClusterScope tests the same thing as TestCreateAnalysisRunWithMetadataAndDryRun, with a cluster scope analysis template +func TestCreateAnalysisRunWithMetadataAndDryRunWithClusterScope(t *testing.T) { + templates := generateTemplates("bar") + aTemplates := generateClusterAnalysisTemplates("success-rate") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "success-rate", + TemplateName: aTemplates[0].Name, + ClusterScope: true, + }, + } + e.Status.Phase = v1alpha1.AnalysisPhaseRunning + e.Status.AvailableAt = now() + e.Spec.AnalysisRunMetadata = v1alpha1.AnalysisRunMetadata{ + Labels: map[string]string{ + "foo": "bar", + "foo2": "bar2", + }, + Annotations: map[string]string{ + "bar": "foo", + "bar2": "foo2", + }, + } + e.Spec.DryRun = []v1alpha1.DryRun{ + { + MetricName: "someMetric", + }, + { + MetricName: "someOtherMetric", + }, + } + rs := templateToRS(e, templates[0], 1) + ar := analysisTemplateToRun("success-rate", e, &aTemplates[0].Spec) + + f := newFixture(t, e, rs, &aTemplates[0]) + defer f.Close() + + analysisRunIdx := f.expectCreateAnalysisRunAction(ar) + patchIdx := f.expectPatchExperimentAction(e) + f.run(getKey(e, t)) + + patchedEx := f.getPatchedExperimentAsObj(patchIdx) + assert.Equal(t, v1alpha1.AnalysisPhasePending, patchedEx.Status.AnalysisRuns[0].Phase) + + analysisRun := f.getCreatedAnalysisRun(analysisRunIdx) + assert.Len(t, analysisRun.ObjectMeta.Labels, 2) + assert.Equal(t, analysisRun.ObjectMeta.Labels["foo"], "bar") + assert.Equal(t, analysisRun.ObjectMeta.Labels["foo2"], "bar2") + assert.Len(t, analysisRun.ObjectMeta.Annotations, 2) + assert.Equal(t, analysisRun.ObjectMeta.Annotations["bar"], "foo") + assert.Equal(t, analysisRun.ObjectMeta.Annotations["bar2"], "foo2") + + assert.Len(t, analysisRun.Spec.DryRun, 2) + assert.Equal(t, analysisRun.Spec.DryRun[0].MetricName, "someMetric") + assert.Equal(t, analysisRun.Spec.DryRun[1].MetricName, "someOtherMetric") +} diff --git a/experiments/experiment.go b/experiments/experiment.go index e4f0f53ede..d63f652dc7 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -101,7 +101,7 @@ func (ec *experimentContext) reconcile() *v1alpha1.ExperimentStatus { } for _, analysis := range ec.ex.Spec.Analyses { - ec.reconcileAnalysisRun(analysis, ec.ex.Spec.DryRun, ec.ex.Spec.MeasurementRetention) + ec.reconcileAnalysisRun(analysis, ec.ex.Spec.DryRun, ec.ex.Spec.MeasurementRetention, &ec.ex.Spec.AnalysisRunMetadata) } newStatus := ec.calculateStatus() @@ -390,7 +390,7 @@ func calculateEnqueueDuration(ex *v1alpha1.Experiment, newStatus *v1alpha1.Exper // reconcileAnalysisRun reconciles a single analysis run, creating or terminating it as necessary. // Updates the analysis run statuses, which may subsequently fail the experiment. -func (ec *experimentContext) reconcileAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention) { +func (ec *experimentContext) reconcileAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention, analysisRunMetadata *v1alpha1.AnalysisRunMetadata) { logCtx := ec.log.WithField("analysis", analysis.Name) logCtx.Infof("Reconciling analysis") prevStatus := experimentutil.GetAnalysisRunStatus(ec.ex.Status, analysis.Name) @@ -446,7 +446,7 @@ func (ec *experimentContext) reconcileAnalysisRun(analysis v1alpha1.ExperimentAn logCtx.Warnf("Skipping AnalysisRun creation for analysis %s: experiment is terminating", analysis.Name) return } - run, err := ec.createAnalysisRun(analysis, dryRunMetrics, measurementRetentionMetrics) + run, err := ec.createAnalysisRun(analysis, dryRunMetrics, measurementRetentionMetrics, analysisRunMetadata) if err != nil { msg := fmt.Sprintf("Failed to create AnalysisRun for analysis '%s': %v", analysis.Name, err.Error()) newStatus.Phase = v1alpha1.AnalysisPhaseError @@ -493,13 +493,13 @@ func (ec *experimentContext) reconcileAnalysisRun(analysis v1alpha1.ExperimentAn // createAnalysisRun creates the analysis run. If an existing runs exists with same name, is // semantically equal, and is not complete, returns the existing one, otherwise creates a new // run with a collision counter increase. -func (ec *experimentContext) createAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention) (*v1alpha1.AnalysisRun, error) { +func (ec *experimentContext) createAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention, analysisRunMetadata *v1alpha1.AnalysisRunMetadata) (*v1alpha1.AnalysisRun, error) { analysisRunIf := ec.argoProjClientset.ArgoprojV1alpha1().AnalysisRuns(ec.ex.Namespace) args, err := ec.ResolveAnalysisRunArgs(analysis.Args) if err != nil { return nil, err } - run, err := ec.newAnalysisRun(analysis, args, dryRunMetrics, measurementRetentionMetrics) + run, err := ec.newAnalysisRun(analysis, args, dryRunMetrics, measurementRetentionMetrics, analysisRunMetadata) if err != nil { return nil, err } @@ -635,7 +635,7 @@ func (ec *experimentContext) assessAnalysisRuns() (v1alpha1.AnalysisPhase, strin } // newAnalysisRun generates an AnalysisRun from the experiment and template -func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, args []v1alpha1.Argument, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention) (*v1alpha1.AnalysisRun, error) { +func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, args []v1alpha1.Argument, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention, analysisRunMetadata *v1alpha1.AnalysisRunMetadata) (*v1alpha1.AnalysisRun, error) { if analysis.ClusterScope { clusterTemplate, err := ec.clusterAnalysisTemplateLister.Get(analysis.TemplateName) @@ -645,14 +645,26 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis name := fmt.Sprintf("%s-%s", ec.ex.Name, analysis.Name) clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{clusterTemplate} - run, err := analysisutil.NewAnalysisRunFromTemplates(nil, clusterAnalysisTemplates, args, dryRunMetrics, measurementRetentionMetrics, name, "", ec.ex.Namespace) - if err != nil { - return nil, err - } + runLabels := map[string]string{} + runAnnotations := map[string]string{} + instanceID := analysisutil.GetInstanceID(ec.ex) if instanceID != "" { - run.Labels = map[string]string{v1alpha1.LabelKeyControllerInstanceID: ec.ex.Labels[v1alpha1.LabelKeyControllerInstanceID]} + runLabels[v1alpha1.LabelKeyControllerInstanceID] = ec.ex.Labels[v1alpha1.LabelKeyControllerInstanceID] } + if analysisRunMetadata != nil { + for k, v := range analysisRunMetadata.Labels { + runLabels[k] = v + } + for k, v := range analysisRunMetadata.Annotations { + runAnnotations[k] = v + } + } + run, err := analysisutil.NewAnalysisRunFromTemplates(nil, clusterAnalysisTemplates, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) + if err != nil { + return nil, err + } + run.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ec.ex, controllerKind)} return run, nil } else { @@ -663,14 +675,26 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis name := fmt.Sprintf("%s-%s", ec.ex.Name, analysis.Name) analysisTemplates := []*v1alpha1.AnalysisTemplate{template} - run, err := analysisutil.NewAnalysisRunFromTemplates(analysisTemplates, nil, args, dryRunMetrics, measurementRetentionMetrics, name, "", ec.ex.Namespace) - if err != nil { - return nil, err - } + runLabels := map[string]string{} + runAnnotations := map[string]string{} instanceID := analysisutil.GetInstanceID(ec.ex) if instanceID != "" { - run.Labels = map[string]string{v1alpha1.LabelKeyControllerInstanceID: ec.ex.Labels[v1alpha1.LabelKeyControllerInstanceID]} + runLabels[v1alpha1.LabelKeyControllerInstanceID] = ec.ex.Labels[v1alpha1.LabelKeyControllerInstanceID] + } + if analysisRunMetadata != nil { + for k, v := range analysisRunMetadata.Labels { + runLabels[k] = v + } + for k, v := range analysisRunMetadata.Annotations { + runAnnotations[k] = v + } } + + run, err := analysisutil.NewAnalysisRunFromTemplates(analysisTemplates, nil, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) + if err != nil { + return nil, err + } + run.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ec.ex, controllerKind)} return run, nil } diff --git a/manifests/crds/experiment-crd.yaml b/manifests/crds/experiment-crd.yaml index 319f837a05..486a608e8a 100644 --- a/manifests/crds/experiment-crd.yaml +++ b/manifests/crds/experiment-crd.yaml @@ -84,6 +84,17 @@ spec: - templateName type: object type: array + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object dryRun: items: properties: diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index f03259a9a3..65cc341158 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -571,6 +571,26 @@ spec: - templateName type: object type: array + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array duration: type: string templates: diff --git a/manifests/install.yaml b/manifests/install.yaml index 335974305f..99f2e34a3b 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -9278,6 +9278,17 @@ spec: - templateName type: object type: array + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object dryRun: items: properties: @@ -12480,6 +12491,26 @@ spec: - templateName type: object type: array + analysisRunMetadata: + properties: + annotations: + additionalProperties: + type: string + type: object + labels: + additionalProperties: + type: string + type: object + type: object + dryRun: + items: + properties: + metricName: + type: string + required: + - metricName + type: object + type: array duration: type: string templates: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index b491f9d614..db6e03206f 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1963,6 +1963,17 @@ "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutExperimentStepAnalysisTemplateRef" }, "title": "Analyses reference which analysis templates to run with the experiment\n+patchMergeKey=name\n+patchStrategy=merge" + }, + "dryRun": { + "type": "array", + "items": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.DryRun" + }, + "title": "DryRun object contains the settings for running the analysis in Dry-Run mode\n+patchMergeKey=metricName\n+patchStrategy=merge\n+optional" + }, + "analysisRunMetadata": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunMetadata", + "title": "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns\n+optional" } }, "title": "RolloutExperimentStep defines a template that is used to create a experiment for a step" diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index e947b953c9..39cdd4c776 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -36,6 +36,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,MeasurementRetention API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutAnalysis,Templates API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStep,Analyses +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStep,DryRun API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStep,Templates API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutExperimentStepAnalysisTemplateRef,Args API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,RolloutStatus,ALBs diff --git a/pkg/apis/rollouts/v1alpha1/experiment_types.go b/pkg/apis/rollouts/v1alpha1/experiment_types.go index b7183cbc45..3151b65681 100644 --- a/pkg/apis/rollouts/v1alpha1/experiment_types.go +++ b/pkg/apis/rollouts/v1alpha1/experiment_types.go @@ -65,6 +65,9 @@ type ExperimentSpec struct { // +patchStrategy=merge // +optional MeasurementRetention []MeasurementRetention `json:"measurementRetention,omitempty" patchStrategy:"merge" patchMergeKey:"metricName" protobuf:"bytes,8,rep,name=measurementRetention"` + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + AnalysisRunMetadata AnalysisRunMetadata `json:"analysisRunMetadata,omitempty" protobuf:"bytes,9,opt,name=analysisRunMetadata"` } type TemplateSpec struct { diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index d4abc7d428..773cebb542 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3349,541 +3349,542 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8536 bytes of a gzipped FileDescriptorProto + // 8550 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, - 0x71, 0xd8, 0x35, 0x87, 0x43, 0x72, 0x6a, 0xb8, 0x24, 0xf7, 0xed, 0xee, 0x1d, 0x8f, 0x77, 0xb7, - 0xb3, 0xea, 0x73, 0x2e, 0x7b, 0xd6, 0x89, 0x94, 0xf6, 0xee, 0x92, 0x93, 0x4e, 0xb9, 0x64, 0x86, - 0xdc, 0xbd, 0xe5, 0x1e, 0xb9, 0xcb, 0xad, 0xe1, 0xde, 0xda, 0x92, 0xce, 0x56, 0x73, 0xe6, 0x71, - 0xd8, 0xcb, 0x99, 0xee, 0x51, 0x77, 0x0f, 0x77, 0x79, 0x3a, 0x58, 0x27, 0x0b, 0xa7, 0x28, 0x86, - 0x04, 0x2b, 0xb1, 0x85, 0x20, 0x48, 0x10, 0x28, 0x86, 0x01, 0x27, 0xb1, 0x7f, 0x04, 0x86, 0x83, - 0xe4, 0x87, 0x81, 0x08, 0x71, 0x6c, 0x2b, 0x40, 0x1c, 0xc8, 0x3f, 0x12, 0x39, 0x01, 0x4c, 0x47, - 0x74, 0xfe, 0x24, 0x48, 0x20, 0x24, 0x50, 0x60, 0x78, 0x7f, 0x04, 0xc1, 0xfb, 0xec, 0xd7, 0x3d, - 0x3d, 0x5c, 0x0e, 0xa7, 0xb9, 0x52, 0x12, 0xfd, 0x9b, 0x79, 0x55, 0xaf, 0xaa, 0xfa, 0x7d, 0xd6, + 0x71, 0x98, 0x9a, 0xc3, 0x21, 0x39, 0x35, 0x5c, 0x92, 0xfb, 0x76, 0xf7, 0x8e, 0xc7, 0xbb, 0xdd, + 0x59, 0xf5, 0x39, 0x97, 0x3d, 0xeb, 0x44, 0x4a, 0x7b, 0x77, 0xc9, 0x49, 0xa7, 0x5c, 0x32, 0x43, + 0xee, 0xde, 0x72, 0x8f, 0xdc, 0xe5, 0xd5, 0x70, 0x6f, 0x6d, 0x49, 0x67, 0xab, 0x39, 0xf3, 0x38, + 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x85, 0x53, 0x14, 0x41, + 0x82, 0x95, 0xd8, 0x42, 0x10, 0x24, 0x08, 0x14, 0xc3, 0x80, 0x93, 0xd8, 0x3f, 0x02, 0xc3, 0x41, + 0xf2, 0xc3, 0x40, 0x84, 0x38, 0x76, 0x14, 0x20, 0x0e, 0xe4, 0x1f, 0x89, 0x9c, 0x00, 0xa6, 0x23, + 0x3a, 0x7f, 0x62, 0x24, 0x10, 0x12, 0x28, 0x30, 0xb2, 0x3f, 0x82, 0xe0, 0x7d, 0xf6, 0xeb, 0x9e, + 0x1e, 0xee, 0x90, 0xd3, 0x5c, 0x9d, 0x13, 0xff, 0x9b, 0x79, 0x55, 0xaf, 0xaa, 0xfa, 0x7d, 0xd6, 0xab, 0x57, 0x55, 0x0f, 0xd6, 0x5a, 0x6e, 0xb4, 0xd3, 0xdb, 0x5a, 0x6c, 0xf8, 0x9d, 0x25, 0x27, - 0x68, 0xf9, 0xdd, 0xc0, 0xbf, 0xc7, 0x7f, 0x7c, 0x24, 0xf0, 0xdb, 0x6d, 0xbf, 0x17, 0x85, 0x4b, - 0xdd, 0xdd, 0xd6, 0x92, 0xd3, 0x75, 0xc3, 0x25, 0x5d, 0xb2, 0xf7, 0x31, 0xa7, 0xdd, 0xdd, 0x71, - 0x3e, 0xb6, 0xd4, 0xa2, 0x1e, 0x0d, 0x9c, 0x88, 0x36, 0x17, 0xbb, 0x81, 0x1f, 0xf9, 0xe4, 0x93, + 0x68, 0xf9, 0xdd, 0xc0, 0xbf, 0xc7, 0x7f, 0x7c, 0x34, 0xf0, 0xdb, 0x6d, 0xbf, 0x17, 0x85, 0x4b, + 0xdd, 0xdd, 0xd6, 0x92, 0xd3, 0x75, 0xc3, 0x25, 0x5d, 0xb2, 0xf7, 0x71, 0xa7, 0xdd, 0xdd, 0x71, + 0x3e, 0xbe, 0xd4, 0xa2, 0x1e, 0x0d, 0x9c, 0x88, 0x36, 0x17, 0xbb, 0x81, 0x1f, 0xf9, 0xe4, 0x53, 0x31, 0xb5, 0x45, 0x45, 0x8d, 0xff, 0xf8, 0x59, 0x55, 0x77, 0xb1, 0xbb, 0xdb, 0x5a, 0x64, 0xd4, - 0x16, 0x75, 0x89, 0xa2, 0xb6, 0xf0, 0x11, 0x43, 0x96, 0x96, 0xdf, 0xf2, 0x97, 0x38, 0xd1, 0xad, - 0xde, 0x36, 0xff, 0xc7, 0xff, 0xf0, 0x5f, 0x82, 0xd9, 0xc2, 0xf3, 0xbb, 0xaf, 0x85, 0x8b, 0xae, + 0x16, 0x75, 0x89, 0xa2, 0xb6, 0xf0, 0x51, 0x43, 0x96, 0x96, 0xdf, 0xf2, 0x97, 0x38, 0xd1, 0xad, + 0xde, 0x36, 0xff, 0xc7, 0xff, 0xf0, 0x5f, 0x82, 0xd9, 0xc2, 0xb3, 0xbb, 0xaf, 0x84, 0x8b, 0xae, 0xcf, 0x64, 0x5b, 0xda, 0x72, 0xa2, 0xc6, 0xce, 0xd2, 0x5e, 0x9f, 0x44, 0x0b, 0xb6, 0x81, 0xd4, - 0xf0, 0x03, 0x9a, 0x85, 0xf3, 0x4a, 0x8c, 0xd3, 0x71, 0x1a, 0x3b, 0xae, 0x47, 0x83, 0xfd, 0xf8, + 0xf0, 0x03, 0x9a, 0x85, 0xf3, 0x52, 0x8c, 0xd3, 0x71, 0x1a, 0x3b, 0xae, 0x47, 0x83, 0xfd, 0xf8, 0xab, 0x3b, 0x34, 0x72, 0xb2, 0x6a, 0x2d, 0x0d, 0xaa, 0x15, 0xf4, 0xbc, 0xc8, 0xed, 0xd0, 0xbe, - 0x0a, 0x7f, 0xe9, 0x51, 0x15, 0xc2, 0xc6, 0x0e, 0xed, 0x38, 0x7d, 0xf5, 0x5e, 0x1e, 0x54, 0xaf, - 0x17, 0xb9, 0xed, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0xbf, 0x5f, 0x80, 0x52, 0x75, - 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0x2f, 0x5b, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, - 0x3b, 0x5e, 0x83, 0x06, 0xf3, 0xd6, 0x25, 0xeb, 0x72, 0xf9, 0xca, 0xda, 0xe2, 0x28, 0xfd, 0xb5, - 0x58, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0xb7, 0x6b, 0xe7, 0xbf, 0x7d, 0x50, - 0x79, 0xe2, 0xf0, 0xa0, 0x32, 0xbd, 0x66, 0x70, 0xc2, 0x04, 0x5f, 0xf2, 0x0d, 0x0b, 0xce, 0x36, - 0x1c, 0xcf, 0x09, 0xf6, 0x37, 0x9d, 0xa0, 0x45, 0xa3, 0x37, 0x03, 0xbf, 0xd7, 0x9d, 0x1f, 0x3b, - 0x05, 0x69, 0x9e, 0x96, 0xd2, 0x9c, 0x5d, 0x4e, 0xb3, 0xc3, 0x7e, 0x09, 0xb8, 0x5c, 0x61, 0xe4, - 0x6c, 0xb5, 0xa9, 0x29, 0x57, 0xe1, 0x34, 0xe5, 0xaa, 0xa7, 0xd9, 0x61, 0xbf, 0x04, 0xe4, 0x45, - 0x98, 0x74, 0xbd, 0x56, 0x40, 0xc3, 0x70, 0x7e, 0xfc, 0x92, 0x75, 0xb9, 0x54, 0x9b, 0x95, 0xd5, - 0x27, 0x57, 0x45, 0x31, 0x2a, 0xb8, 0xfd, 0x9b, 0x05, 0x38, 0x5b, 0x5d, 0xab, 0x6d, 0x06, 0xce, - 0xf6, 0xb6, 0xdb, 0x40, 0xbf, 0x17, 0xb9, 0x5e, 0xcb, 0x24, 0x60, 0x1d, 0x4d, 0x80, 0xbc, 0x0a, - 0xe5, 0x90, 0x06, 0x7b, 0x6e, 0x83, 0x6e, 0xf8, 0x41, 0xc4, 0x3b, 0xa5, 0x58, 0x3b, 0x27, 0xd1, - 0xcb, 0xf5, 0x18, 0x84, 0x26, 0x1e, 0xab, 0x16, 0xf8, 0x7e, 0x24, 0xe1, 0xbc, 0xcd, 0x4a, 0x71, - 0x35, 0x8c, 0x41, 0x68, 0xe2, 0x91, 0x15, 0x98, 0x73, 0x3c, 0xcf, 0x8f, 0x9c, 0xc8, 0xf5, 0xbd, - 0x8d, 0x80, 0x6e, 0xbb, 0x0f, 0xe4, 0x27, 0xce, 0xcb, 0xba, 0x73, 0xd5, 0x14, 0x1c, 0xfb, 0x6a, - 0x90, 0xaf, 0x5b, 0x30, 0x17, 0x46, 0x6e, 0x63, 0xd7, 0xf5, 0x68, 0x18, 0x2e, 0xfb, 0xde, 0xb6, - 0xdb, 0x9a, 0x2f, 0xf2, 0x6e, 0xbb, 0x39, 0x5a, 0xb7, 0xd5, 0x53, 0x54, 0x6b, 0xe7, 0x99, 0x48, - 0xe9, 0x52, 0xec, 0xe3, 0x4e, 0x3e, 0x0c, 0x25, 0xd9, 0xa2, 0x34, 0x9c, 0x9f, 0xb8, 0x54, 0xb8, - 0x5c, 0xaa, 0x9d, 0x39, 0x3c, 0xa8, 0x94, 0x56, 0x55, 0x21, 0xc6, 0x70, 0x7b, 0x05, 0xe6, 0xab, - 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0x1f, 0xa4, 0xba, 0xee, 0x32, 0x4c, 0x75, 0x9c, 0x6e, 0xd7, - 0xf5, 0x5a, 0xac, 0xef, 0x18, 0x9d, 0xe9, 0xc3, 0x83, 0xca, 0xd4, 0xba, 0x2c, 0x43, 0x0d, 0xb5, - 0xff, 0xc3, 0x18, 0x94, 0xab, 0x9e, 0xd3, 0xde, 0x0f, 0xdd, 0x10, 0x7b, 0x1e, 0xf9, 0x2c, 0x4c, - 0xb1, 0x55, 0xab, 0xe9, 0x44, 0x8e, 0x9c, 0xe9, 0x1f, 0x5d, 0x14, 0x8b, 0xc8, 0xa2, 0xb9, 0x88, - 0xc4, 0x9f, 0xcf, 0xb0, 0x17, 0xf7, 0x3e, 0xb6, 0x78, 0x6b, 0xeb, 0x1e, 0x6d, 0x44, 0xeb, 0x34, - 0x72, 0x6a, 0x44, 0xf6, 0x02, 0xc4, 0x65, 0xa8, 0xa9, 0x12, 0x1f, 0xc6, 0xc3, 0x2e, 0x6d, 0xc8, - 0x99, 0xbb, 0x3e, 0xe2, 0x0c, 0x89, 0x45, 0xaf, 0x77, 0x69, 0xa3, 0x36, 0x2d, 0x59, 0x8f, 0xb3, - 0x7f, 0xc8, 0x19, 0x91, 0xfb, 0x30, 0x11, 0xf2, 0xb5, 0x4c, 0x4e, 0xca, 0x5b, 0xf9, 0xb1, 0xe4, - 0x64, 0x6b, 0x33, 0x92, 0xe9, 0x84, 0xf8, 0x8f, 0x92, 0x9d, 0xfd, 0x1f, 0x2d, 0x38, 0x67, 0x60, - 0x57, 0x83, 0x56, 0xaf, 0x43, 0xbd, 0x88, 0x5c, 0x82, 0x71, 0xcf, 0xe9, 0x50, 0x39, 0xab, 0xb4, - 0xc8, 0x37, 0x9d, 0x0e, 0x45, 0x0e, 0x21, 0xcf, 0x43, 0x71, 0xcf, 0x69, 0xf7, 0x28, 0x6f, 0xa4, - 0x52, 0xed, 0x8c, 0x44, 0x29, 0xbe, 0xcd, 0x0a, 0x51, 0xc0, 0xc8, 0x7b, 0x50, 0xe2, 0x3f, 0xae, - 0x05, 0x7e, 0x27, 0xa7, 0x4f, 0x93, 0x12, 0xbe, 0xad, 0xc8, 0x8a, 0xe1, 0xa7, 0xff, 0x62, 0xcc, - 0xd0, 0xfe, 0x13, 0x0b, 0x66, 0x8d, 0x8f, 0x5b, 0x73, 0xc3, 0x88, 0x7c, 0xa6, 0x6f, 0xf0, 0x2c, - 0x1e, 0x6f, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0xcc, 0xc9, 0x2f, 0x9d, 0x52, 0x25, 0xc6, 0xc0, 0xf1, - 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8f, 0x5d, 0x2a, 0x5c, 0x2e, 0x5f, 0x59, 0xcd, 0xad, 0x1b, - 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xab, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, - 0x07, 0x16, 0x4c, 0xb4, 0x9d, 0x2d, 0xda, 0x16, 0x73, 0xab, 0x7c, 0xe5, 0x9d, 0xdc, 0x24, 0x51, - 0x3c, 0x16, 0xd7, 0x38, 0xfd, 0xab, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, + 0x0a, 0x7f, 0xe9, 0x51, 0x15, 0xc2, 0xc6, 0x0e, 0xed, 0x38, 0x7d, 0xf5, 0x5e, 0x1c, 0x54, 0xaf, + 0x17, 0xb9, 0xed, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0x7f, 0x58, 0x80, 0x52, 0x75, + 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0xaf, 0x58, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, + 0x3b, 0x5e, 0x83, 0x06, 0xf3, 0xd6, 0x65, 0xeb, 0x4a, 0xf9, 0xea, 0xda, 0xe2, 0x28, 0xfd, 0xb5, + 0x58, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0xb7, 0x6b, 0xe7, 0xbf, 0x7b, 0x50, + 0xf9, 0xd0, 0xe1, 0x41, 0x65, 0x7a, 0xcd, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0x5b, 0x16, 0x9c, 0x6d, + 0x38, 0x9e, 0x13, 0xec, 0x6f, 0x3a, 0x41, 0x8b, 0x46, 0xaf, 0x07, 0x7e, 0xaf, 0x3b, 0x3f, 0x76, + 0x0a, 0xd2, 0x3c, 0x25, 0xa5, 0x39, 0xbb, 0x9c, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, + 0xd9, 0x6a, 0x53, 0x53, 0xae, 0xc2, 0x69, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xc8, 0xf3, + 0x30, 0xe9, 0x7a, 0xad, 0x80, 0x86, 0xe1, 0xfc, 0xf8, 0x65, 0xeb, 0x4a, 0xa9, 0x36, 0x2b, 0xab, + 0x4f, 0xae, 0x8a, 0x62, 0x54, 0x70, 0xfb, 0x37, 0x0a, 0x70, 0xb6, 0xba, 0x56, 0xdb, 0x0c, 0x9c, + 0xed, 0x6d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x96, 0x49, 0xc0, 0x3a, 0x9a, 0x00, 0x79, 0x19, + 0xca, 0x21, 0x0d, 0xf6, 0xdc, 0x06, 0xdd, 0xf0, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x76, 0x4e, 0xa2, + 0x97, 0xeb, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, 0xe2, + 0x6a, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x2b, 0x30, 0xe7, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, + 0x1b, 0x01, 0xdd, 0x76, 0x1f, 0xc8, 0x4f, 0x9c, 0x97, 0x75, 0xe7, 0xaa, 0x29, 0x38, 0xf6, 0xd5, + 0x20, 0xdf, 0xb4, 0x60, 0x2e, 0x8c, 0xdc, 0xc6, 0xae, 0xeb, 0xd1, 0x30, 0x5c, 0xf6, 0xbd, 0x6d, + 0xb7, 0x35, 0x5f, 0xe4, 0xdd, 0x76, 0x6b, 0xb4, 0x6e, 0xab, 0xa7, 0xa8, 0xd6, 0xce, 0x33, 0x91, + 0xd2, 0xa5, 0xd8, 0xc7, 0x9d, 0x7c, 0x04, 0x4a, 0xb2, 0x45, 0x69, 0x38, 0x3f, 0x71, 0xb9, 0x70, + 0xa5, 0x54, 0x3b, 0x73, 0x78, 0x50, 0x29, 0xad, 0xaa, 0x42, 0x8c, 0xe1, 0xf6, 0x0a, 0xcc, 0x57, + 0x3b, 0x5b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x75, 0xdd, 0x15, 0x98, 0xea, 0x38, 0xdd, 0xae, + 0xeb, 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0xd3, 0x87, 0x07, 0x95, 0xa9, 0x75, 0x59, 0x86, 0x1a, 0x6a, + 0xff, 0xc7, 0x31, 0x28, 0x57, 0x3d, 0xa7, 0xbd, 0x1f, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x39, 0x98, + 0x62, 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0xb6, 0x28, 0x16, 0x91, 0x45, 0x73, 0x11, + 0x89, 0x3f, 0x9f, 0x61, 0x2f, 0xee, 0x7d, 0x7c, 0xf1, 0xf6, 0xd6, 0x3d, 0xda, 0x88, 0xd6, 0x69, + 0xe4, 0xd4, 0x88, 0xec, 0x05, 0x88, 0xcb, 0x50, 0x53, 0x25, 0x3e, 0x8c, 0x87, 0x5d, 0xda, 0x90, + 0x33, 0x77, 0x7d, 0xc4, 0x19, 0x12, 0x8b, 0x5e, 0xef, 0xd2, 0x46, 0x6d, 0x5a, 0xb2, 0x1e, 0x67, + 0xff, 0x90, 0x33, 0x22, 0xf7, 0x61, 0x22, 0xe4, 0x6b, 0x99, 0x9c, 0x94, 0xb7, 0xf3, 0x63, 0xc9, + 0xc9, 0xd6, 0x66, 0x24, 0xd3, 0x09, 0xf1, 0x1f, 0x25, 0x3b, 0xfb, 0x3f, 0x59, 0x70, 0xce, 0xc0, + 0xae, 0x06, 0xad, 0x5e, 0x87, 0x7a, 0x11, 0xb9, 0x0c, 0xe3, 0x9e, 0xd3, 0xa1, 0x72, 0x56, 0x69, + 0x91, 0x6f, 0x39, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x85, 0xe2, 0x9e, 0xd3, 0xee, 0x51, 0xde, 0x48, + 0xa5, 0xda, 0x19, 0x89, 0x52, 0x7c, 0x8b, 0x15, 0xa2, 0x80, 0x91, 0x77, 0xa1, 0xc4, 0x7f, 0x5c, + 0x0f, 0xfc, 0x4e, 0x4e, 0x9f, 0x26, 0x25, 0x7c, 0x4b, 0x91, 0x15, 0xc3, 0x4f, 0xff, 0xc5, 0x98, + 0xa1, 0xfd, 0x47, 0x16, 0xcc, 0x1a, 0x1f, 0xb7, 0xe6, 0x86, 0x11, 0xf9, 0x6c, 0xdf, 0xe0, 0x59, + 0x1c, 0x6e, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0xcc, 0xc9, 0x2f, 0x9d, 0x52, 0x25, 0xc6, 0xc0, 0xf1, + 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8f, 0x5d, 0x2e, 0x5c, 0x29, 0x5f, 0x5d, 0xcd, 0xad, 0x1b, + 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xb3, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, + 0xfb, 0x16, 0x4c, 0xb4, 0x9d, 0x2d, 0xda, 0x16, 0x73, 0xab, 0x7c, 0xf5, 0xed, 0xdc, 0x24, 0x51, + 0x3c, 0x16, 0xd7, 0x38, 0xfd, 0x6b, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, 0xfe, 0x8e, 0x05, 0xe5, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x95, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, - 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0x85, 0x8f, 0x43, 0xd9, 0xf8, 0x04, 0x32, 0x07, 0x85, - 0x5d, 0xba, 0x2f, 0x06, 0x3c, 0xb2, 0x9f, 0xe4, 0x7c, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0x89, 0xb1, - 0xd7, 0xac, 0x85, 0x37, 0x60, 0x2e, 0xcd, 0x70, 0x98, 0xfa, 0xf6, 0x3f, 0x29, 0x26, 0x06, 0x26, - 0x5b, 0x08, 0x88, 0x0f, 0x93, 0x1d, 0x1a, 0x05, 0x6e, 0x43, 0x75, 0xd9, 0xca, 0x68, 0xad, 0xb4, - 0xce, 0x89, 0xc5, 0x1b, 0xa2, 0xf8, 0x1f, 0xa2, 0xe2, 0x42, 0x76, 0x60, 0xdc, 0x09, 0x5a, 0xaa, - 0x4f, 0xae, 0xe5, 0x33, 0x2d, 0xe3, 0xa5, 0xa2, 0x1a, 0xb4, 0x42, 0xe4, 0x1c, 0xc8, 0x12, 0x94, - 0x22, 0x1a, 0x74, 0x5c, 0xcf, 0x89, 0xc4, 0x0e, 0x3a, 0x55, 0x3b, 0x2b, 0xd1, 0x4a, 0x9b, 0x0a, - 0x80, 0x31, 0x0e, 0x69, 0xc3, 0x44, 0x33, 0xd8, 0xc7, 0x9e, 0x37, 0x3f, 0x9e, 0x47, 0x53, 0xac, - 0x70, 0x5a, 0xf1, 0x20, 0x15, 0xff, 0x51, 0xf2, 0x20, 0xbf, 0x6a, 0xc1, 0xf9, 0x0e, 0x75, 0xc2, - 0x5e, 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x3a, 0x76, 0xbe, 0xc8, 0x99, 0xe3, 0xa8, 0xfd, - 0xd0, 0x4f, 0xb9, 0xf6, 0xac, 0x14, 0xe5, 0x7c, 0x16, 0x14, 0x33, 0xa5, 0x21, 0xef, 0x41, 0x39, - 0x8a, 0xda, 0xf5, 0x88, 0xe9, 0xc1, 0xad, 0xfd, 0xf9, 0x09, 0xbe, 0x78, 0x8d, 0xb8, 0xc2, 0x6c, - 0x6e, 0xae, 0x29, 0x82, 0xb5, 0x59, 0x36, 0x5b, 0x8c, 0x02, 0x34, 0xd9, 0xd9, 0xff, 0xbc, 0x08, - 0x67, 0xfb, 0xb6, 0x15, 0xf2, 0x0a, 0x14, 0xbb, 0x3b, 0x4e, 0xa8, 0xf6, 0x89, 0x8b, 0x6a, 0x91, - 0xda, 0x60, 0x85, 0x0f, 0x0f, 0x2a, 0x67, 0x54, 0x15, 0x5e, 0x80, 0x02, 0x99, 0x69, 0x6d, 0x1d, - 0x1a, 0x86, 0x4e, 0x4b, 0x6d, 0x1e, 0xc6, 0x20, 0xe5, 0xc5, 0xa8, 0xe0, 0xe4, 0xaf, 0x5b, 0x70, - 0x46, 0x0c, 0x58, 0xa4, 0x61, 0xaf, 0x1d, 0xb1, 0x0d, 0x92, 0x75, 0xca, 0x8d, 0x3c, 0x26, 0x87, - 0x20, 0x59, 0xbb, 0x20, 0xb9, 0x9f, 0x31, 0x4b, 0x43, 0x4c, 0xf2, 0x25, 0x77, 0xa1, 0x14, 0x46, - 0x4e, 0x10, 0xd1, 0x66, 0x35, 0xe2, 0xaa, 0x5c, 0xf9, 0xca, 0x4f, 0x1e, 0x6f, 0xe7, 0xd8, 0x74, - 0x3b, 0x54, 0xec, 0x52, 0x75, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x3d, 0x80, 0xa0, 0xe7, 0xd5, 0x7b, - 0x9d, 0x8e, 0x13, 0xec, 0x4b, 0xed, 0xee, 0xfa, 0x68, 0x9f, 0x87, 0x9a, 0x5e, 0xac, 0xe8, 0xc4, - 0x65, 0x68, 0xf0, 0x23, 0x5f, 0xb4, 0xe0, 0x8c, 0x98, 0x07, 0x4a, 0x82, 0x89, 0x9c, 0x25, 0x38, - 0xcb, 0x9a, 0x76, 0xc5, 0x64, 0x81, 0x49, 0x8e, 0xe4, 0x1d, 0x28, 0x37, 0xfc, 0x4e, 0xb7, 0x4d, - 0x45, 0xe3, 0x4e, 0x0e, 0xdd, 0xb8, 0x7c, 0xe8, 0x2e, 0xc7, 0x24, 0xd0, 0xa4, 0x67, 0xff, 0xbb, - 0xa4, 0x8e, 0xa3, 0x86, 0x34, 0xf9, 0x34, 0x3c, 0x1d, 0xf6, 0x1a, 0x0d, 0x1a, 0x86, 0xdb, 0xbd, - 0x36, 0xf6, 0xbc, 0xeb, 0x6e, 0x18, 0xf9, 0xc1, 0xfe, 0x9a, 0xdb, 0x71, 0x23, 0x3e, 0xa0, 0x8b, - 0xb5, 0xe7, 0x0e, 0x0f, 0x2a, 0x4f, 0xd7, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0x67, 0x7a, - 0xde, 0x60, 0xf2, 0xe2, 0xf8, 0x51, 0x39, 0x3c, 0xa8, 0x3c, 0x73, 0x67, 0x30, 0x1a, 0x1e, 0x45, - 0xc3, 0xfe, 0xaf, 0x16, 0xdb, 0x86, 0xc4, 0x77, 0x6d, 0xd2, 0x4e, 0xb7, 0xcd, 0x96, 0xce, 0xd3, - 0x57, 0x8e, 0xa3, 0x84, 0x72, 0x8c, 0xf9, 0xec, 0xe5, 0x4a, 0xfe, 0x41, 0x1a, 0xb2, 0xfd, 0x5f, - 0x2c, 0x38, 0x9f, 0x46, 0x7e, 0x0c, 0x0a, 0x5d, 0x98, 0x54, 0xe8, 0x6e, 0xe6, 0xfb, 0xb5, 0x03, - 0xb4, 0xba, 0x2f, 0x8f, 0xf7, 0x7f, 0xeb, 0xff, 0xeb, 0x3a, 0x42, 0xbc, 0xe5, 0x17, 0x7e, 0x98, - 0x5b, 0xfe, 0xf8, 0x8f, 0xd2, 0x96, 0x6f, 0xff, 0xc3, 0x71, 0x98, 0xae, 0x7a, 0x91, 0x5b, 0xdd, - 0xde, 0x76, 0x3d, 0x37, 0xda, 0x27, 0x5f, 0x1d, 0x83, 0xa5, 0x6e, 0x40, 0xb7, 0x69, 0x10, 0xd0, - 0xe6, 0x4a, 0x2f, 0x70, 0xbd, 0x56, 0xbd, 0xb1, 0x43, 0x9b, 0xbd, 0xb6, 0xeb, 0xb5, 0x56, 0x5b, - 0x9e, 0xaf, 0x8b, 0xaf, 0x3e, 0xa0, 0x8d, 0x1e, 0xff, 0x24, 0x31, 0x29, 0x3a, 0xa3, 0x7d, 0xd2, - 0xc6, 0x70, 0x4c, 0x6b, 0x2f, 0x1f, 0x1e, 0x54, 0x96, 0x86, 0xac, 0x84, 0xc3, 0x7e, 0x1a, 0xf9, - 0xca, 0x18, 0x2c, 0x06, 0xf4, 0x73, 0x3d, 0xf7, 0xf8, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, - 0xdb, 0x50, 0x3c, 0x6b, 0x57, 0x0e, 0x0f, 0x2a, 0x43, 0xd6, 0xc1, 0x21, 0xbf, 0xcb, 0xde, 0x80, - 0x72, 0xb5, 0xeb, 0x86, 0xee, 0x03, 0xf4, 0x7b, 0x11, 0x3d, 0xc6, 0xf9, 0xbd, 0x02, 0xc5, 0xa0, - 0xd7, 0xa6, 0x62, 0x6e, 0x97, 0x6a, 0x25, 0xb6, 0x0a, 0x21, 0x2b, 0x40, 0x51, 0x6e, 0xff, 0x3c, - 0x5b, 0x71, 0x39, 0xc9, 0x94, 0xe5, 0xe6, 0x1e, 0x14, 0x03, 0xc6, 0x44, 0x8e, 0xac, 0x51, 0x0f, - 0xb9, 0xb1, 0xd4, 0x52, 0x08, 0xf6, 0x13, 0x05, 0x0b, 0xfb, 0x77, 0xc6, 0xe0, 0x42, 0xb5, 0xdb, - 0x5d, 0xa7, 0xe1, 0x4e, 0x4a, 0x8a, 0x5f, 0xb4, 0x60, 0x66, 0xcf, 0x0d, 0xa2, 0x9e, 0xd3, 0x56, - 0xc6, 0x39, 0x21, 0x4f, 0x7d, 0x54, 0x79, 0x38, 0xb7, 0xb7, 0x13, 0xa4, 0x6b, 0xe4, 0xf0, 0xa0, - 0x32, 0x93, 0x2c, 0xc3, 0x14, 0x7b, 0xf2, 0xb7, 0x2d, 0x98, 0x93, 0x45, 0x37, 0xfd, 0x26, 0x35, - 0x8d, 0xbf, 0x77, 0xf2, 0x94, 0x49, 0x13, 0x17, 0x46, 0xbb, 0x74, 0x29, 0xf6, 0x09, 0x61, 0xff, - 0xf7, 0x31, 0x78, 0x6a, 0x00, 0x0d, 0xf2, 0x6b, 0x16, 0x9c, 0x17, 0x16, 0x63, 0x03, 0x84, 0x74, - 0x5b, 0xb6, 0xe6, 0x4f, 0xe7, 0x2d, 0x39, 0xb2, 0x29, 0x4e, 0xbd, 0x06, 0xad, 0xcd, 0xb3, 0xd5, - 0x70, 0x39, 0x83, 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, 0x36, 0xe4, 0x94, 0xa4, 0x63, 0x8f, 0x45, - 0xd2, 0x7a, 0x06, 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0xab, 0xf0, 0xcc, 0x11, 0xe4, 0x1e, 0x3d, 0x39, - 0xed, 0x77, 0xf4, 0xa8, 0x4f, 0x8e, 0xb9, 0x63, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, - 0x1b, 0xd8, 0xf6, 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0x8e, 0x05, 0x53, 0x43, 0x98, 0xfa, - 0x2a, 0x49, 0x53, 0x5f, 0xa9, 0xcf, 0xcc, 0x17, 0xf5, 0x9b, 0xf9, 0xde, 0x1c, 0xad, 0x37, 0x8e, - 0x63, 0xde, 0xfb, 0xbe, 0x05, 0x67, 0xfb, 0xcc, 0x81, 0x64, 0x07, 0xce, 0x77, 0xfd, 0xa6, 0x52, - 0x9b, 0xae, 0x3b, 0xe1, 0x0e, 0x87, 0xc9, 0xcf, 0x7b, 0x85, 0xf5, 0xe4, 0x46, 0x06, 0xfc, 0xe1, - 0x41, 0x65, 0x5e, 0x13, 0x49, 0x21, 0x60, 0x26, 0x45, 0xd2, 0x85, 0xa9, 0x6d, 0x97, 0xb6, 0x9b, - 0xf1, 0x10, 0x1c, 0x51, 0x41, 0xba, 0x26, 0xa9, 0x09, 0x4b, 0xb8, 0xfa, 0x87, 0x9a, 0x8b, 0xfd, - 0x03, 0x0b, 0x66, 0xaa, 0xbd, 0x68, 0x87, 0xa9, 0x07, 0x0d, 0x6e, 0x7c, 0x22, 0x1e, 0x14, 0x43, - 0xb7, 0xb5, 0xf7, 0x4a, 0x3e, 0x8b, 0x71, 0x9d, 0x91, 0x92, 0x37, 0x02, 0x5a, 0x37, 0xe5, 0x85, - 0x28, 0xd8, 0x90, 0x00, 0x26, 0x7c, 0xa7, 0x17, 0xed, 0x5c, 0x91, 0x9f, 0x3c, 0xe2, 0x41, 0xfc, - 0x16, 0xfb, 0x9c, 0x2b, 0x92, 0xa3, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4e, 0xf6, 0x17, 0x60, 0x26, - 0x79, 0xcd, 0x74, 0x8c, 0x31, 0xfb, 0x1c, 0x14, 0x9c, 0xc0, 0x93, 0x23, 0xb6, 0x2c, 0x11, 0x0a, - 0x55, 0xbc, 0x89, 0xac, 0x9c, 0xbc, 0x04, 0x53, 0xdb, 0xbd, 0x76, 0x9b, 0x55, 0x90, 0x77, 0x3a, - 0xfa, 0x14, 0x70, 0x4d, 0x96, 0xa3, 0xc6, 0xb0, 0xff, 0x7c, 0x1c, 0x66, 0x6b, 0xed, 0x1e, 0x7d, - 0x33, 0xa0, 0x54, 0x99, 0x3e, 0xaa, 0x30, 0xdb, 0x0d, 0xe8, 0x9e, 0x4b, 0xef, 0xd7, 0x69, 0x9b, - 0x36, 0x22, 0x3f, 0x90, 0xd2, 0x3c, 0x25, 0x09, 0xcd, 0x6e, 0x24, 0xc1, 0x98, 0xc6, 0x27, 0x6f, - 0xc0, 0x8c, 0xd3, 0x88, 0xdc, 0x3d, 0xaa, 0x29, 0x08, 0x71, 0x9f, 0x94, 0x14, 0x66, 0xaa, 0x09, - 0x28, 0xa6, 0xb0, 0xc9, 0x67, 0x60, 0x3e, 0x6c, 0x38, 0x6d, 0x7a, 0xa7, 0x2b, 0x59, 0x2d, 0xef, - 0xd0, 0xc6, 0xee, 0x86, 0xef, 0x7a, 0x91, 0x34, 0xb3, 0x5d, 0x92, 0x94, 0xe6, 0xeb, 0x03, 0xf0, - 0x70, 0x20, 0x05, 0xf2, 0x2f, 0x2c, 0x78, 0xae, 0x1b, 0xd0, 0x8d, 0xc0, 0xef, 0xf8, 0x6c, 0xa8, - 0xf5, 0x59, 0x7f, 0xa4, 0x15, 0xe4, 0xed, 0x11, 0x75, 0x29, 0x51, 0xd2, 0x7f, 0x65, 0xf1, 0xa1, - 0xc3, 0x83, 0xca, 0x73, 0x1b, 0x47, 0x09, 0x80, 0x47, 0xcb, 0x47, 0xfe, 0xa5, 0x05, 0x17, 0xbb, - 0x7e, 0x18, 0x1d, 0xf1, 0x09, 0xc5, 0x53, 0xfd, 0x04, 0xfb, 0xf0, 0xa0, 0x72, 0x71, 0xe3, 0x48, - 0x09, 0xf0, 0x11, 0x12, 0xda, 0x87, 0x65, 0x38, 0x6b, 0x8c, 0x3d, 0x69, 0xbb, 0x78, 0x1d, 0xce, - 0xa8, 0xc1, 0x10, 0xeb, 0x3e, 0xa5, 0xd8, 0x94, 0x55, 0x35, 0x81, 0x98, 0xc4, 0x65, 0xe3, 0x4e, - 0x0f, 0x45, 0x51, 0x3b, 0x35, 0xee, 0x36, 0x12, 0x50, 0x4c, 0x61, 0x93, 0x55, 0x38, 0x27, 0x4b, - 0x90, 0x76, 0xdb, 0x6e, 0xc3, 0x59, 0xf6, 0x7b, 0x72, 0xc8, 0x15, 0x6b, 0x4f, 0x1d, 0x1e, 0x54, - 0xce, 0x6d, 0xf4, 0x83, 0x31, 0xab, 0x0e, 0x59, 0x83, 0xf3, 0x4e, 0x2f, 0xf2, 0xf5, 0xf7, 0x5f, - 0xf5, 0xd8, 0x76, 0xda, 0xe4, 0x43, 0x6b, 0x4a, 0xec, 0xbb, 0xd5, 0x0c, 0x38, 0x66, 0xd6, 0x22, - 0x1b, 0x29, 0x6a, 0x75, 0xda, 0xf0, 0xbd, 0xa6, 0xe8, 0xe5, 0x62, 0x7c, 0x02, 0xab, 0x66, 0xe0, - 0x60, 0x66, 0x4d, 0xd2, 0x86, 0x99, 0x8e, 0xf3, 0xe0, 0x8e, 0xe7, 0xec, 0x39, 0x6e, 0x9b, 0x31, - 0x91, 0xe6, 0xb1, 0xc1, 0x46, 0x95, 0x5e, 0xe4, 0xb6, 0x17, 0x85, 0xdb, 0xc2, 0xe2, 0xaa, 0x17, - 0xdd, 0x0a, 0xea, 0x11, 0xd3, 0xd4, 0x85, 0x06, 0xb9, 0x9e, 0xa0, 0x85, 0x29, 0xda, 0xe4, 0x16, - 0x5c, 0xe0, 0xd3, 0x71, 0xc5, 0xbf, 0xef, 0xad, 0xd0, 0xb6, 0xb3, 0xaf, 0x3e, 0x60, 0x92, 0x7f, - 0xc0, 0xd3, 0x87, 0x07, 0x95, 0x0b, 0xf5, 0x2c, 0x04, 0xcc, 0xae, 0x47, 0x1c, 0x78, 0x26, 0x09, - 0x40, 0xba, 0xe7, 0x86, 0xae, 0xef, 0x09, 0x2b, 0xd4, 0x54, 0x6c, 0x85, 0xaa, 0x0f, 0x46, 0xc3, - 0xa3, 0x68, 0x90, 0xbf, 0x6b, 0xc1, 0xf9, 0xac, 0x69, 0x38, 0x5f, 0xca, 0xe3, 0xf2, 0x34, 0x35, - 0xb5, 0xc4, 0x88, 0xc8, 0x5c, 0x14, 0x32, 0x85, 0x20, 0xef, 0x5b, 0x30, 0xed, 0x18, 0x27, 0xe8, - 0x79, 0xc8, 0x63, 0xd7, 0x32, 0xcf, 0xe4, 0xb5, 0xb9, 0xc3, 0x83, 0x4a, 0xe2, 0x94, 0x8e, 0x09, - 0x8e, 0xe4, 0xef, 0x5b, 0x70, 0x21, 0x73, 0x8e, 0xcf, 0x97, 0x4f, 0xa3, 0x85, 0xf8, 0x20, 0xc9, - 0x5e, 0x73, 0xb2, 0xc5, 0x20, 0x5f, 0xb7, 0xf4, 0x56, 0xa6, 0xee, 0xd3, 0xe6, 0xa7, 0xb9, 0x68, - 0xb7, 0x47, 0x34, 0x1a, 0xc4, 0x5a, 0x93, 0x22, 0x5c, 0x3b, 0x67, 0xec, 0x8c, 0xaa, 0x10, 0xd3, - 0xec, 0xc9, 0xd7, 0x2c, 0xb5, 0x35, 0x6a, 0x89, 0xce, 0x9c, 0x96, 0x44, 0x24, 0xde, 0x69, 0xb5, - 0x40, 0x29, 0xe6, 0xe4, 0x67, 0x60, 0xc1, 0xd9, 0xf2, 0x83, 0x28, 0x73, 0xf2, 0xcd, 0xcf, 0xf0, - 0x69, 0x74, 0xf1, 0xf0, 0xa0, 0xb2, 0x50, 0x1d, 0x88, 0x85, 0x47, 0x50, 0xb0, 0x7f, 0xa3, 0x08, - 0xd3, 0xe2, 0x24, 0x24, 0xb7, 0xae, 0xdf, 0xb6, 0xe0, 0xd9, 0x46, 0x2f, 0x08, 0xa8, 0x17, 0xd5, - 0x23, 0xda, 0xed, 0xdf, 0xb8, 0xac, 0x53, 0xdd, 0xb8, 0x2e, 0x1d, 0x1e, 0x54, 0x9e, 0x5d, 0x3e, - 0x82, 0x3f, 0x1e, 0x29, 0x1d, 0xf9, 0xb7, 0x16, 0xd8, 0x12, 0xa1, 0xe6, 0x34, 0x76, 0x5b, 0x81, - 0xdf, 0xf3, 0x9a, 0xfd, 0x1f, 0x31, 0x76, 0xaa, 0x1f, 0xf1, 0xc2, 0xe1, 0x41, 0xc5, 0x5e, 0x7e, - 0xa4, 0x14, 0x78, 0x0c, 0x49, 0xc9, 0x9b, 0x70, 0x56, 0x62, 0x5d, 0x7d, 0xd0, 0xa5, 0x81, 0xcb, - 0xce, 0x1c, 0x52, 0x71, 0x8c, 0x5d, 0xb1, 0xd2, 0x08, 0xd8, 0x5f, 0x87, 0x84, 0x30, 0x79, 0x9f, - 0xba, 0xad, 0x9d, 0x48, 0xa9, 0x4f, 0x23, 0xfa, 0x5f, 0x49, 0xab, 0xc8, 0x5d, 0x41, 0xb3, 0x56, - 0x3e, 0x3c, 0xa8, 0x4c, 0xca, 0x3f, 0xa8, 0x38, 0x91, 0x9b, 0x30, 0x23, 0xce, 0xa9, 0x1b, 0xae, - 0xd7, 0xda, 0xf0, 0x3d, 0xe1, 0x44, 0x54, 0xaa, 0xbd, 0xa0, 0x36, 0xfc, 0x7a, 0x02, 0xfa, 0xf0, - 0xa0, 0x32, 0xad, 0x7e, 0x6f, 0xee, 0x77, 0x29, 0xa6, 0x6a, 0xdb, 0xbf, 0x37, 0x01, 0xa0, 0x86, - 0x2b, 0xed, 0x92, 0x0f, 0x43, 0x29, 0xa4, 0x91, 0xe0, 0x2a, 0x2f, 0x4e, 0xc4, 0x75, 0x97, 0x2a, - 0xc4, 0x18, 0x4e, 0x76, 0xa1, 0xd8, 0x75, 0x7a, 0x21, 0xcd, 0xe7, 0xfc, 0x20, 0x3b, 0x7f, 0x83, - 0x51, 0x14, 0x07, 0x53, 0xfe, 0x13, 0x05, 0x0f, 0xf2, 0x25, 0x0b, 0x80, 0x26, 0x3b, 0x6c, 0x64, - 0x03, 0x91, 0x64, 0x19, 0xf7, 0x29, 0x6b, 0x83, 0xda, 0xcc, 0xe1, 0x41, 0x05, 0x8c, 0xae, 0x37, - 0xd8, 0x92, 0xfb, 0x30, 0xe5, 0xa8, 0x35, 0x7f, 0xfc, 0x34, 0xd6, 0x7c, 0x7e, 0x5e, 0xd4, 0x83, - 0x56, 0x33, 0x23, 0x5f, 0xb1, 0x60, 0x26, 0xa4, 0x91, 0xec, 0x2a, 0xb6, 0xf2, 0x48, 0x85, 0x77, - 0xc4, 0x41, 0x57, 0x4f, 0xd0, 0x14, 0x2b, 0x68, 0xb2, 0x0c, 0x53, 0x7c, 0x95, 0x28, 0xd7, 0xa9, - 0xd3, 0xa4, 0x01, 0x37, 0x47, 0x48, 0x4d, 0x6a, 0x74, 0x51, 0x0c, 0x9a, 0x5a, 0x14, 0xa3, 0x0c, - 0x53, 0x7c, 0x95, 0x28, 0xeb, 0x6e, 0x10, 0xf8, 0x52, 0x94, 0xa9, 0x9c, 0x44, 0x31, 0x68, 0x6a, - 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0xb5, 0xbf, 0x79, 0x06, 0x66, 0xd4, 0x44, 0x8a, 0x35, 0x7b, 0x61, - 0xfd, 0x1a, 0xa0, 0xd9, 0x2f, 0x9b, 0x40, 0x4c, 0xe2, 0xb2, 0xca, 0x62, 0xaa, 0x26, 0x15, 0x7b, - 0x5d, 0xb9, 0x6e, 0x02, 0x31, 0x89, 0x4b, 0x3a, 0x50, 0x0c, 0x23, 0xda, 0x55, 0x57, 0xec, 0x23, - 0xde, 0x00, 0xc7, 0xeb, 0x83, 0x61, 0x49, 0x60, 0xe4, 0x51, 0x70, 0xe1, 0x06, 0xdc, 0x28, 0x61, - 0xd3, 0x95, 0x93, 0x23, 0x9f, 0xf9, 0x99, 0x34, 0x17, 0x8b, 0xde, 0x48, 0x96, 0x61, 0x8a, 0x7d, - 0x86, 0xb2, 0x5f, 0x3c, 0x45, 0x65, 0xff, 0x53, 0x30, 0xd5, 0x71, 0x1e, 0xd4, 0x7b, 0x41, 0xeb, - 0xe4, 0x87, 0x0a, 0xe9, 0x32, 0x29, 0xa8, 0xa0, 0xa6, 0x47, 0xbe, 0x68, 0x19, 0x4b, 0x8e, 0xb8, - 0x4f, 0xbf, 0x9b, 0xef, 0x92, 0xa3, 0xf7, 0xca, 0x81, 0x8b, 0x4f, 0x9f, 0xea, 0x3d, 0xf5, 0xd8, - 0x55, 0x6f, 0xa6, 0x46, 0x8a, 0x09, 0xa2, 0xd5, 0xc8, 0xd2, 0xa9, 0xaa, 0x91, 0xcb, 0x09, 0x66, - 0x98, 0x62, 0xce, 0xe5, 0x11, 0x73, 0x4e, 0xcb, 0x03, 0xa7, 0x2a, 0x4f, 0x3d, 0xc1, 0x0c, 0x53, - 0xcc, 0x07, 0x9f, 0x37, 0xcb, 0xa7, 0x73, 0xde, 0x9c, 0xce, 0xe1, 0xbc, 0x79, 0xb4, 0x2a, 0x7e, - 0x66, 0x54, 0x55, 0x9c, 0xdc, 0x00, 0xd2, 0xdc, 0xf7, 0x9c, 0x8e, 0xdb, 0x90, 0x8b, 0x25, 0xdf, - 0x36, 0x67, 0xb8, 0x3d, 0x62, 0x41, 0x2e, 0x64, 0x64, 0xa5, 0x0f, 0x03, 0x33, 0x6a, 0x91, 0x08, - 0xa6, 0xba, 0x4a, 0xe3, 0x9a, 0xcd, 0x63, 0xf4, 0x2b, 0x0d, 0x4c, 0xb8, 0x49, 0xb0, 0x89, 0xa7, - 0x4a, 0x50, 0x73, 0x22, 0x6b, 0x70, 0xbe, 0xe3, 0x7a, 0x1b, 0x7e, 0x33, 0xdc, 0xa0, 0x81, 0xb4, - 0xb6, 0xd4, 0x69, 0x34, 0x3f, 0xc7, 0xdb, 0x86, 0x9f, 0xa0, 0xd7, 0x33, 0xe0, 0x98, 0x59, 0xcb, - 0xfe, 0x5f, 0x16, 0xcc, 0x2d, 0xb7, 0xfd, 0x5e, 0xf3, 0xae, 0x13, 0x35, 0x76, 0x84, 0x87, 0x00, - 0x79, 0x03, 0xa6, 0x5c, 0x2f, 0xa2, 0xc1, 0x9e, 0xd3, 0x96, 0xfb, 0x93, 0xad, 0xcc, 0xa7, 0xab, - 0xb2, 0xfc, 0xe1, 0x41, 0x65, 0x66, 0xa5, 0x17, 0x70, 0x2b, 0xb5, 0x58, 0xad, 0x50, 0xd7, 0x21, - 0xdf, 0xb4, 0xe0, 0xac, 0xf0, 0x31, 0x58, 0x71, 0x22, 0xe7, 0x76, 0x8f, 0x06, 0x2e, 0x55, 0x5e, - 0x06, 0x23, 0x2e, 0x54, 0x69, 0x59, 0x15, 0x83, 0xfd, 0x58, 0x51, 0x5f, 0x4f, 0x73, 0xc6, 0x7e, - 0x61, 0xec, 0x5f, 0x2a, 0xc0, 0xd3, 0x03, 0x69, 0x91, 0x05, 0x18, 0x73, 0x9b, 0xf2, 0xd3, 0x41, - 0xd2, 0x1d, 0x5b, 0x6d, 0xe2, 0x98, 0xdb, 0x24, 0x8b, 0x5c, 0xe7, 0x0c, 0x68, 0x18, 0xaa, 0x0b, - 0xe7, 0x92, 0x56, 0x0f, 0x65, 0x29, 0x1a, 0x18, 0xa4, 0x02, 0x45, 0xee, 0x2e, 0x2b, 0xcf, 0x13, - 0x5c, 0x8b, 0xe5, 0x9e, 0xa9, 0x28, 0xca, 0xc9, 0xcf, 0x5b, 0x00, 0x42, 0x40, 0x76, 0x1a, 0x91, - 0xbb, 0x24, 0xe6, 0xdb, 0x4c, 0x8c, 0xb2, 0x90, 0x32, 0xfe, 0x8f, 0x06, 0x57, 0xb2, 0x09, 0x13, - 0x4c, 0xa1, 0xf5, 0x9b, 0x27, 0xde, 0x14, 0xf9, 0x4d, 0xd4, 0x06, 0xa7, 0x81, 0x92, 0x16, 0x6b, - 0xab, 0x80, 0x46, 0xbd, 0xc0, 0x63, 0x4d, 0xcb, 0xb7, 0xc1, 0x29, 0x21, 0x05, 0xea, 0x52, 0x34, - 0x30, 0xec, 0x7f, 0x36, 0x06, 0xe7, 0xb3, 0x44, 0x67, 0xbb, 0xcd, 0x84, 0x90, 0x56, 0x1e, 0x8d, - 0x7f, 0x2a, 0xff, 0xf6, 0x91, 0xee, 0x32, 0xfa, 0x9a, 0x42, 0xfa, 0x0b, 0x4a, 0xbe, 0xe4, 0xa7, - 0x74, 0x0b, 0x8d, 0x9d, 0xb0, 0x85, 0x34, 0xe5, 0x54, 0x2b, 0x5d, 0x82, 0xf1, 0x90, 0xf5, 0x7c, - 0x21, 0x79, 0xdd, 0xc1, 0xfb, 0x88, 0x43, 0x18, 0x46, 0xcf, 0x73, 0x23, 0x19, 0x63, 0xa2, 0x31, - 0xee, 0x78, 0x6e, 0x84, 0x1c, 0x62, 0x7f, 0x63, 0x0c, 0x16, 0x06, 0x7f, 0x14, 0xf9, 0x86, 0x05, - 0xd0, 0x64, 0xc7, 0x95, 0x90, 0x3b, 0x6a, 0x0b, 0xf7, 0x22, 0xe7, 0xb4, 0xda, 0x70, 0x45, 0x71, - 0x8a, 0x7d, 0xcd, 0x74, 0x51, 0x88, 0x86, 0x20, 0xe4, 0x8a, 0x1a, 0xfa, 0xfc, 0xaa, 0x46, 0x4c, - 0x26, 0x5d, 0x67, 0x5d, 0x43, 0xd0, 0xc0, 0x62, 0xe7, 0x51, 0xcf, 0xe9, 0xd0, 0xb0, 0xeb, 0xe8, - 0x88, 0x1d, 0x7e, 0x1e, 0xbd, 0xa9, 0x0a, 0x31, 0x86, 0xdb, 0x6d, 0x78, 0xfe, 0x18, 0x72, 0xe6, - 0x14, 0x10, 0x61, 0xff, 0x0f, 0x0b, 0x9e, 0x5a, 0x6e, 0xf7, 0xc2, 0x88, 0x06, 0xff, 0xdf, 0xb8, - 0xee, 0xfd, 0x99, 0x05, 0xcf, 0x0c, 0xf8, 0xe6, 0xc7, 0xe0, 0xc1, 0xf7, 0x6e, 0xd2, 0x83, 0xef, - 0xce, 0xa8, 0x43, 0x3a, 0xf3, 0x3b, 0x06, 0x38, 0xf2, 0xfd, 0xeb, 0x02, 0x9c, 0x61, 0xcb, 0x56, - 0xd3, 0x6f, 0xe5, 0xb4, 0x71, 0x3e, 0x0f, 0xc5, 0xcf, 0xb1, 0x0d, 0x28, 0x3d, 0xc8, 0xf8, 0xae, - 0x84, 0x02, 0x46, 0xbe, 0x64, 0xc1, 0xe4, 0xe7, 0xe4, 0x9e, 0x2a, 0xce, 0x72, 0x23, 0x2e, 0x86, - 0x89, 0x6f, 0x58, 0x94, 0x3b, 0xa4, 0x88, 0xb3, 0xd0, 0xbe, 0x83, 0x6a, 0x2b, 0x55, 0x9c, 0xc9, - 0x8b, 0x30, 0xb9, 0xed, 0x07, 0x9d, 0x5e, 0xdb, 0x49, 0x07, 0xf7, 0x5d, 0x13, 0xc5, 0xa8, 0xe0, - 0x6c, 0x92, 0x3b, 0x5d, 0xf7, 0x6d, 0x1a, 0x84, 0xc2, 0xed, 0x3e, 0x31, 0xc9, 0xab, 0x1a, 0x82, - 0x06, 0x16, 0xaf, 0xd3, 0x6a, 0x05, 0xb4, 0xe5, 0x44, 0x7e, 0xc0, 0x77, 0x0e, 0xb3, 0x8e, 0x86, - 0xa0, 0x81, 0xb5, 0xf0, 0x09, 0x98, 0x36, 0x85, 0x1f, 0x2a, 0x66, 0xe3, 0x93, 0x20, 0x9d, 0x08, - 0x53, 0x4b, 0x92, 0x75, 0x9c, 0x25, 0xc9, 0xfe, 0xf7, 0x63, 0x60, 0x58, 0x87, 0x1e, 0xc3, 0x54, - 0xf7, 0x12, 0x53, 0x7d, 0x44, 0xcb, 0x86, 0x61, 0xeb, 0x1a, 0x14, 0xc1, 0xb6, 0x97, 0x8a, 0x60, - 0xbb, 0x99, 0x1b, 0xc7, 0xa3, 0x03, 0xd8, 0xbe, 0x6b, 0xc1, 0x33, 0x31, 0x72, 0xbf, 0xe1, 0xf6, - 0xd1, 0xeb, 0xf6, 0xab, 0x50, 0x76, 0xe2, 0x6a, 0x72, 0x62, 0x19, 0xe1, 0x43, 0x1a, 0x84, 0x26, - 0x5e, 0x1c, 0xfa, 0x50, 0x38, 0x61, 0xe8, 0xc3, 0xf8, 0xd1, 0xa1, 0x0f, 0xf6, 0x0f, 0xc6, 0xe0, - 0xb9, 0xfe, 0x2f, 0x53, 0x2b, 0xce, 0xf1, 0xbc, 0x20, 0x5e, 0x83, 0xe9, 0x48, 0x56, 0x30, 0xf6, - 0x4f, 0x1d, 0xca, 0xbc, 0x69, 0xc0, 0x30, 0x81, 0xc9, 0x6a, 0x36, 0xc4, 0x5a, 0x57, 0x6f, 0xf8, - 0x5d, 0x15, 0xb6, 0xa3, 0x6b, 0x2e, 0x1b, 0x30, 0x4c, 0x60, 0x6a, 0x9f, 0xe1, 0xf1, 0x53, 0xf7, - 0x19, 0xae, 0xc3, 0x05, 0xe5, 0x25, 0x79, 0xcd, 0x0f, 0xa4, 0xff, 0xbf, 0x5a, 0x41, 0xa6, 0x6a, - 0xcf, 0xc9, 0x2a, 0x17, 0x30, 0x0b, 0x09, 0xb3, 0xeb, 0xda, 0xdf, 0x2d, 0xc0, 0xb9, 0xb8, 0xd9, - 0x97, 0x7d, 0xaf, 0xe9, 0x72, 0x47, 0x9b, 0xd7, 0x61, 0x3c, 0xda, 0xef, 0xaa, 0xc6, 0xfe, 0x8b, - 0x4a, 0x9c, 0xcd, 0xfd, 0x2e, 0xeb, 0xed, 0xa7, 0x32, 0xaa, 0x70, 0xd3, 0x39, 0xaf, 0x44, 0xd6, - 0xf4, 0xec, 0x10, 0x3d, 0xf0, 0x4a, 0x72, 0x34, 0x3f, 0x3c, 0xa8, 0x64, 0x44, 0xf2, 0x2f, 0x6a, - 0x4a, 0xc9, 0x31, 0x4f, 0xee, 0xc1, 0x4c, 0xdb, 0x09, 0xa3, 0x3b, 0xdd, 0xa6, 0x13, 0xd1, 0x4d, - 0x57, 0xba, 0xb0, 0x0c, 0x17, 0x32, 0xa1, 0xef, 0xfa, 0xd7, 0x12, 0x94, 0x30, 0x45, 0x99, 0xec, - 0x01, 0x61, 0x25, 0x9b, 0x81, 0xe3, 0x85, 0xe2, 0xab, 0x18, 0xbf, 0xe1, 0xe3, 0x5f, 0xf4, 0xd1, - 0x79, 0xad, 0x8f, 0x1a, 0x66, 0x70, 0x20, 0x2f, 0xc0, 0x44, 0x40, 0x9d, 0x50, 0x6f, 0x07, 0x7a, - 0xfe, 0x23, 0x2f, 0x45, 0x09, 0x35, 0x27, 0xd4, 0xc4, 0x23, 0x26, 0xd4, 0x1f, 0x5b, 0x30, 0x13, - 0x77, 0xd3, 0x63, 0x50, 0x3d, 0x3a, 0x49, 0xd5, 0xe3, 0x7a, 0x5e, 0x4b, 0xe2, 0x00, 0x6d, 0xe3, - 0xf7, 0x27, 0xcc, 0xef, 0xe3, 0x01, 0x03, 0x9f, 0x87, 0x92, 0x9a, 0xd5, 0x4a, 0xa7, 0x1f, 0xd1, - 0x02, 0x91, 0xd0, 0xf6, 0x8c, 0x28, 0x3e, 0xc9, 0x04, 0x63, 0x7e, 0x4c, 0xd7, 0x69, 0x4a, 0x3d, - 0x46, 0x0e, 0x7b, 0xad, 0xeb, 0x28, 0xfd, 0x26, 0x4b, 0xd7, 0x51, 0x75, 0xc8, 0x1d, 0x78, 0xaa, - 0x1b, 0xf8, 0x3c, 0x96, 0x7c, 0x85, 0x3a, 0xcd, 0xb6, 0xeb, 0x51, 0x65, 0xe6, 0x11, 0xae, 0x26, - 0xcf, 0x1c, 0x1e, 0x54, 0x9e, 0xda, 0xc8, 0x46, 0xc1, 0x41, 0x75, 0x93, 0xd1, 0x88, 0xe3, 0xc7, - 0x88, 0x46, 0xfc, 0x1b, 0xda, 0x98, 0x4a, 0x43, 0x19, 0x13, 0xf8, 0xe9, 0xbc, 0xba, 0x32, 0x63, - 0x59, 0x8f, 0x87, 0x54, 0x55, 0x32, 0x45, 0xcd, 0x7e, 0xb0, 0xc5, 0x6e, 0xe2, 0x84, 0x16, 0xbb, - 0x38, 0xee, 0x62, 0xf2, 0x87, 0x19, 0x77, 0x31, 0xf5, 0x23, 0x15, 0x77, 0xf1, 0x41, 0x11, 0xe6, - 0xd2, 0x1a, 0xc8, 0xe9, 0xc7, 0x3a, 0xfe, 0x2d, 0x0b, 0xe6, 0xd4, 0xec, 0x11, 0x3c, 0xb5, 0xfe, - 0xbe, 0x96, 0xd3, 0xa4, 0x15, 0xba, 0x94, 0x4e, 0x41, 0xb1, 0x99, 0xe2, 0x86, 0x7d, 0xfc, 0xc9, - 0x3b, 0x50, 0xd6, 0x57, 0x16, 0x27, 0x0a, 0x7c, 0xe4, 0xb1, 0x79, 0xd5, 0x98, 0x04, 0x9a, 0xf4, - 0xc8, 0x07, 0x16, 0x40, 0x43, 0x6d, 0x73, 0x6a, 0x76, 0xdd, 0xce, 0x6b, 0x76, 0xe9, 0x0d, 0x34, - 0x56, 0x96, 0x75, 0x51, 0x88, 0x06, 0x63, 0xf2, 0x4b, 0xfc, 0xb2, 0x42, 0x6b, 0x77, 0x22, 0xb5, - 0xc5, 0xc8, 0x3e, 0xe5, 0x47, 0x28, 0xa6, 0xb1, 0x2a, 0x65, 0x80, 0x42, 0x4c, 0x08, 0x61, 0xbf, - 0x0e, 0xda, 0x0b, 0x98, 0x2d, 0x5b, 0xdc, 0x0f, 0x78, 0xc3, 0x89, 0x76, 0xe4, 0x10, 0xd4, 0xcb, - 0xd6, 0x35, 0x05, 0xc0, 0x18, 0xc7, 0xfe, 0x2c, 0xcc, 0xbc, 0x19, 0x38, 0xdd, 0x1d, 0x97, 0x5f, - 0x0a, 0xb0, 0xc3, 0xe7, 0x8b, 0x30, 0xe9, 0x34, 0x9b, 0x59, 0xd9, 0x52, 0xaa, 0xa2, 0x18, 0x15, - 0xfc, 0x58, 0xe7, 0x4c, 0xfb, 0xf7, 0x2c, 0x20, 0xf1, 0xc5, 0xaa, 0xeb, 0xb5, 0xd6, 0x9d, 0xa8, - 0xb1, 0xc3, 0xce, 0x47, 0x3b, 0xbc, 0x34, 0xeb, 0x7c, 0x74, 0x5d, 0x43, 0xd0, 0xc0, 0x22, 0xef, - 0x41, 0x59, 0xfc, 0x7b, 0x5b, 0x9f, 0xbe, 0x46, 0x77, 0x66, 0xe6, 0x1b, 0x0a, 0x97, 0x49, 0x8c, - 0xc2, 0xeb, 0x31, 0x07, 0x34, 0xd9, 0xb1, 0xa6, 0x5a, 0xf5, 0xb6, 0xdb, 0xbd, 0x07, 0xcd, 0xad, - 0xb8, 0xa9, 0xba, 0x81, 0xbf, 0xed, 0xb6, 0x69, 0xba, 0xa9, 0x36, 0x44, 0x31, 0x2a, 0xf8, 0xf1, - 0x9a, 0xea, 0x5f, 0x59, 0x70, 0x7e, 0x35, 0x8c, 0x5c, 0x7f, 0x85, 0x86, 0x11, 0xdb, 0x56, 0xd8, - 0xe2, 0xd3, 0x6b, 0x1f, 0xc7, 0xa1, 0x7f, 0x05, 0xe6, 0xe4, 0x25, 0x6f, 0x6f, 0x2b, 0xa4, 0x91, - 0xa1, 0xc7, 0xeb, 0x79, 0xbc, 0x9c, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x45, 0xde, 0xf6, 0xc6, 0x54, - 0x0a, 0x49, 0x2a, 0xf5, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, 0xdf, 0x29, 0xc0, 0x39, 0xfe, 0x19, 0xa9, - 0x60, 0x9c, 0xaf, 0x0d, 0x0a, 0xc6, 0x19, 0x71, 0x2a, 0x73, 0x5e, 0x27, 0x08, 0xc5, 0xf9, 0x9b, - 0x16, 0xcc, 0x36, 0x93, 0x2d, 0x9d, 0x8f, 0xd1, 0x2b, 0xab, 0x0f, 0x85, 0x4f, 0x5b, 0xaa, 0x10, - 0xd3, 0xfc, 0xc9, 0x2f, 0x5b, 0x30, 0x9b, 0x14, 0x53, 0xad, 0xee, 0xa7, 0xd0, 0x48, 0xda, 0x09, - 0x3d, 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0x0f, 0xc6, 0x64, 0x97, 0x9e, 0x46, 0xa4, 0x09, 0xb9, - 0x0f, 0xa5, 0xa8, 0x1d, 0x8a, 0x42, 0xf9, 0xb5, 0x23, 0x9e, 0x08, 0x37, 0xd7, 0xea, 0xc2, 0xbf, - 0x22, 0x56, 0xda, 0x64, 0x09, 0x53, 0x3e, 0x15, 0x2f, 0xce, 0xb8, 0xd1, 0x95, 0x8c, 0x73, 0x39, - 0x8a, 0x6e, 0x2e, 0x6f, 0xa4, 0x19, 0xcb, 0x12, 0xc6, 0x58, 0xf1, 0xb2, 0x7f, 0xdd, 0x82, 0xd2, - 0x0d, 0x5f, 0xad, 0x23, 0x3f, 0x93, 0x83, 0xa1, 0x47, 0xeb, 0x83, 0xfa, 0x1e, 0x37, 0x3e, 0x62, - 0xbc, 0x91, 0x30, 0xf3, 0x3c, 0x6b, 0xd0, 0x5e, 0xe4, 0x49, 0xe3, 0x18, 0xa9, 0x1b, 0xfe, 0xd6, - 0x40, 0xdb, 0xec, 0xaf, 0x14, 0xe1, 0xcc, 0x5b, 0xce, 0x3e, 0xf5, 0x22, 0x67, 0xf8, 0x4d, 0xe2, - 0x55, 0x28, 0x3b, 0x5d, 0x7e, 0x51, 0x68, 0xe8, 0xf8, 0xb1, 0xe5, 0x24, 0x06, 0xa1, 0x89, 0x17, - 0x2f, 0x68, 0x22, 0xec, 0x23, 0x6b, 0x29, 0x5a, 0x4e, 0xc1, 0xb1, 0xaf, 0x06, 0xb9, 0x01, 0x44, - 0x46, 0x29, 0x57, 0x1b, 0x0d, 0xbf, 0xe7, 0x89, 0x25, 0x4d, 0x18, 0x55, 0xf4, 0x61, 0x73, 0xbd, - 0x0f, 0x03, 0x33, 0x6a, 0x91, 0xcf, 0xc0, 0x7c, 0x83, 0x53, 0x96, 0x47, 0x0f, 0x93, 0xa2, 0x38, - 0x7e, 0xea, 0x40, 0x8a, 0xe5, 0x01, 0x78, 0x38, 0x90, 0x02, 0x93, 0x34, 0x8c, 0xfc, 0xc0, 0x69, - 0x51, 0x93, 0xee, 0x44, 0x52, 0xd2, 0x7a, 0x1f, 0x06, 0x66, 0xd4, 0x22, 0x5f, 0x80, 0x52, 0xb4, - 0x13, 0xd0, 0x70, 0xc7, 0x6f, 0x37, 0xa5, 0x63, 0xc7, 0x88, 0x96, 0x36, 0xd9, 0xfb, 0x9b, 0x8a, - 0xaa, 0x31, 0xbc, 0x55, 0x11, 0xc6, 0x3c, 0x49, 0x00, 0x13, 0x61, 0xc3, 0xef, 0xd2, 0x50, 0xaa, - 0xec, 0x37, 0x72, 0xe1, 0xce, 0x2d, 0x47, 0x86, 0x8d, 0x8f, 0x73, 0x40, 0xc9, 0xc9, 0xfe, 0xdd, - 0x31, 0x98, 0x36, 0x11, 0x8f, 0xb1, 0x36, 0x7d, 0xc9, 0x82, 0xe9, 0x86, 0xef, 0x45, 0x81, 0xdf, - 0x16, 0xf6, 0xab, 0x7c, 0x34, 0x0a, 0x46, 0x6a, 0x85, 0x46, 0x8e, 0xdb, 0x36, 0x4c, 0x61, 0x06, - 0x1b, 0x4c, 0x30, 0x25, 0x5f, 0xb5, 0x60, 0x36, 0xf6, 0x03, 0x8c, 0x0d, 0x69, 0xb9, 0x0a, 0xa2, - 0x97, 0xfa, 0xab, 0x49, 0x4e, 0x98, 0x66, 0x6d, 0x6f, 0xc1, 0x5c, 0xba, 0xb7, 0x59, 0x53, 0x76, - 0x1d, 0x39, 0xd7, 0x0b, 0x71, 0x53, 0x6e, 0x38, 0x61, 0x88, 0x1c, 0x42, 0x5e, 0x82, 0xa9, 0x8e, - 0x13, 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x56, 0x2c, 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, - 0x14, 0xa6, 0xd7, 0x1d, 0xaf, 0x45, 0x9b, 0x72, 0x1d, 0x7e, 0x74, 0xac, 0xe3, 0x9f, 0x8e, 0x43, - 0xd9, 0x38, 0x9b, 0x9d, 0xfe, 0x39, 0x2b, 0x91, 0xc9, 0xa5, 0x90, 0x63, 0x26, 0x97, 0x4f, 0x01, - 0x6c, 0xbb, 0x9e, 0x1b, 0xee, 0x9c, 0x30, 0x47, 0x0c, 0xbf, 0xf8, 0xbe, 0xa6, 0x29, 0xa0, 0x41, - 0x2d, 0xbe, 0x5d, 0x2c, 0x1e, 0x91, 0x6e, 0xed, 0x03, 0xcb, 0xd8, 0x6e, 0x26, 0xf2, 0xf0, 0xa6, - 0x30, 0x3a, 0x66, 0x51, 0x6d, 0x3f, 0xe2, 0xe2, 0xe7, 0xa8, 0x5d, 0x69, 0x13, 0xa6, 0x02, 0x1a, - 0xf6, 0x3a, 0xf4, 0x44, 0xd9, 0x5c, 0xb8, 0x5f, 0x0b, 0xca, 0xfa, 0xa8, 0x29, 0x2d, 0xbc, 0x0e, - 0x67, 0x12, 0x22, 0x0c, 0x75, 0x7d, 0xe3, 0x43, 0xa6, 0x01, 0xe0, 0x24, 0x97, 0x39, 0xac, 0x2f, - 0xda, 0x46, 0x16, 0x17, 0xdd, 0x17, 0xc2, 0x7b, 0x49, 0xc0, 0xec, 0x1f, 0x4c, 0x80, 0x74, 0x10, - 0x38, 0xc6, 0x72, 0x65, 0x5e, 0x0b, 0x8e, 0x9d, 0xe0, 0x5a, 0xf0, 0x06, 0x4c, 0xbb, 0x9e, 0x1b, - 0xb9, 0x4e, 0x9b, 0x1b, 0x77, 0xe4, 0x76, 0xaa, 0xdc, 0xbb, 0xa7, 0x57, 0x0d, 0x58, 0x06, 0x9d, - 0x44, 0x5d, 0x72, 0x1b, 0x8a, 0x7c, 0xbf, 0x91, 0x03, 0x78, 0x78, 0x2f, 0x06, 0xee, 0xc0, 0x22, - 0x62, 0xbe, 0x04, 0x25, 0x7e, 0xf8, 0x10, 0x69, 0x6c, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, - 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, 0xdb, 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0x26, 0x92, - 0x54, 0xae, 0xa5, 0xe0, 0xd8, 0x57, 0x83, 0x6c, 0xc3, 0xb4, 0x2c, 0x13, 0x3e, 0x69, 0x93, 0x27, - 0xfc, 0x4a, 0xee, 0x7b, 0x78, 0xcd, 0xa0, 0x84, 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, - 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0xf7, 0x68, 0x1c, 0x70, 0x75, 0x12, 0x66, 0x17, 0x0e, 0x0f, 0x2a, - 0x67, 0x57, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf9, 0xa2, 0x05, 0x17, 0x1a, 0xbe, 0x17, 0xf2, 0xbc, - 0x10, 0x7b, 0xf4, 0x6a, 0x10, 0xf8, 0x81, 0xe0, 0x5d, 0x3a, 0x21, 0x6f, 0x6e, 0x53, 0x5c, 0xce, - 0x22, 0x89, 0xd9, 0x9c, 0xc8, 0xbb, 0x30, 0xd5, 0x0d, 0xfc, 0x3d, 0xb7, 0x49, 0x03, 0xe9, 0xdf, - 0xb8, 0x96, 0x47, 0x9e, 0x9a, 0x0d, 0x49, 0x33, 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, - 0x2e, 0xc3, 0x4c, 0x12, 0x9d, 0xfc, 0x1c, 0x40, 0x37, 0xf0, 0x3b, 0x34, 0xda, 0xa1, 0x3a, 0x70, - 0xe6, 0xe6, 0xa8, 0xe9, 0x50, 0x14, 0x3d, 0xe5, 0x13, 0xc4, 0x96, 0x8b, 0xb8, 0x14, 0x0d, 0x8e, - 0x24, 0x80, 0xc9, 0x5d, 0xb1, 0xed, 0x4a, 0x2d, 0xe4, 0xad, 0x5c, 0x74, 0x26, 0xc9, 0x99, 0x47, - 0x7c, 0xc8, 0x22, 0x54, 0x8c, 0xc8, 0x16, 0x14, 0xee, 0xd3, 0xad, 0x7c, 0x62, 0xf1, 0xef, 0x52, - 0x79, 0x9a, 0xa9, 0x4d, 0x1e, 0x1e, 0x54, 0x0a, 0x77, 0xe9, 0x16, 0x32, 0xe2, 0xec, 0xbb, 0x9a, - 0xc2, 0x31, 0x40, 0x2e, 0x15, 0x6f, 0xe5, 0xe8, 0x65, 0x20, 0xbe, 0x4b, 0x16, 0xa1, 0x62, 0x44, - 0xde, 0x85, 0xd2, 0x7d, 0x67, 0x8f, 0x6e, 0x07, 0xbe, 0x17, 0x49, 0x47, 0xb4, 0x11, 0x63, 0x29, - 0xee, 0x2a, 0x72, 0x92, 0x2f, 0xdf, 0xde, 0x75, 0x21, 0xc6, 0xec, 0xc8, 0x1e, 0x4c, 0x79, 0xf4, - 0x3e, 0xd2, 0xb6, 0xdb, 0xc8, 0x27, 0x76, 0xe1, 0xa6, 0xa4, 0x26, 0x39, 0xf3, 0x7d, 0x4f, 0x95, - 0xa1, 0xe6, 0xc5, 0xfa, 0xf2, 0x9e, 0xbf, 0x25, 0x17, 0xaa, 0x11, 0xfb, 0x52, 0x9f, 0x4c, 0x45, - 0x5f, 0xde, 0xf0, 0xb7, 0x90, 0x11, 0x67, 0x73, 0xa4, 0xa1, 0xbd, 0xa0, 0xe4, 0x32, 0x75, 0x33, - 0x5f, 0xef, 0x2f, 0x31, 0x47, 0xe2, 0x52, 0x34, 0x38, 0xb2, 0xb6, 0x6d, 0x49, 0x63, 0xa5, 0x5c, - 0xa8, 0x46, 0x6c, 0xdb, 0xa4, 0xe9, 0x53, 0xb4, 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, - 0xe5, 0x2f, 0x9f, 0xa5, 0x2a, 0x69, 0x47, 0x14, 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, - 0xdd, 0xfd, 0xfb, 0x4e, 0x7b, 0xd7, 0xf5, 0x5a, 0x32, 0x10, 0x74, 0xd4, 0x94, 0xce, 0xbb, 0xfb, - 0x77, 0x05, 0x3d, 0xb3, 0xbd, 0xe3, 0x52, 0x34, 0x38, 0x92, 0xbf, 0x67, 0xc1, 0x44, 0xb7, 0xdd, - 0x6b, 0xb9, 0xde, 0xfc, 0x74, 0x1e, 0x1e, 0x42, 0xc9, 0x25, 0x77, 0x71, 0x83, 0x93, 0x16, 0x8a, - 0xe2, 0x4f, 0x6a, 0xa7, 0x46, 0x5e, 0xf8, 0x0b, 0x7f, 0x52, 0x99, 0xa7, 0x5e, 0xc3, 0x6f, 0xba, - 0x5e, 0x6b, 0xe9, 0x5e, 0xe8, 0x7b, 0x8b, 0xe8, 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xe1, 0xe3, - 0x50, 0x36, 0x48, 0x3c, 0x4a, 0xd1, 0x9b, 0x36, 0x15, 0xbd, 0x5f, 0x9f, 0x80, 0x69, 0x33, 0x91, - 0xe3, 0x31, 0xb4, 0x2f, 0x7d, 0xe2, 0x18, 0x1b, 0xe6, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0xed, 0x91, - 0x32, 0x6f, 0xad, 0xe6, 0xa6, 0x70, 0xc7, 0x47, 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x21, 0x1c, - 0x4a, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, 0x6d, 0x4d, 0xa8, 0x6a, 0x57, 0x00, 0xe2, 0x8c, - 0x83, 0xf2, 0x56, 0x51, 0xeb, 0xc3, 0x46, 0x26, 0x44, 0x03, 0x8b, 0xbc, 0x00, 0x13, 0x4c, 0xf5, - 0xa1, 0x4d, 0x19, 0xa7, 0xae, 0xcf, 0xf1, 0xd7, 0x78, 0x29, 0x4a, 0x28, 0x79, 0x8d, 0x69, 0xa9, - 0xb1, 0xc2, 0x22, 0xc3, 0xcf, 0xcf, 0xc7, 0x5a, 0x6a, 0x0c, 0xc3, 0x04, 0x26, 0x13, 0x9d, 0x32, - 0xfd, 0x82, 0xaf, 0x0d, 0x86, 0xe8, 0x5c, 0xe9, 0x40, 0x01, 0xe3, 0x76, 0xa5, 0x94, 0x3e, 0xc2, - 0xe7, 0x74, 0xd1, 0xb0, 0x2b, 0xa5, 0xe0, 0xd8, 0x57, 0x83, 0x7d, 0x8c, 0xbc, 0x10, 0x2d, 0x0b, - 0x6f, 0xe4, 0x01, 0x57, 0x99, 0x5f, 0x36, 0xcf, 0x5a, 0x39, 0xce, 0x21, 0x31, 0x6a, 0x8f, 0x7f, - 0xd8, 0x1a, 0xed, 0x58, 0xf4, 0x59, 0x98, 0x49, 0xee, 0x42, 0xb9, 0xdf, 0x7c, 0x7c, 0x65, 0x1c, - 0xce, 0xdd, 0x6c, 0xb9, 0x5e, 0x3a, 0x8b, 0x58, 0x56, 0x86, 0x7c, 0x6b, 0xe8, 0x0c, 0xf9, 0x3a, - 0xe0, 0x4d, 0xe6, 0x9f, 0xcf, 0x0e, 0x78, 0x53, 0x8f, 0x01, 0x24, 0x71, 0xc9, 0x1f, 0x5b, 0xf0, - 0xac, 0xd3, 0x14, 0xe7, 0x02, 0xa7, 0x2d, 0x4b, 0x8d, 0xc4, 0xce, 0x72, 0x46, 0x87, 0x23, 0xee, - 0xf2, 0xfd, 0x1f, 0xbf, 0x58, 0x3d, 0x82, 0xab, 0xe8, 0xf1, 0x9f, 0x90, 0x5f, 0xf0, 0xec, 0x51, - 0xa8, 0x78, 0xa4, 0xf8, 0xe4, 0xaf, 0xc0, 0x6c, 0xe2, 0x83, 0xa5, 0x25, 0xbc, 0x24, 0x2e, 0x2c, - 0xea, 0x49, 0x10, 0xa6, 0x71, 0x17, 0x6e, 0xc1, 0x87, 0x1e, 0x29, 0xe7, 0x50, 0x83, 0xed, 0xdb, - 0x16, 0x4c, 0x9b, 0x09, 0x7f, 0xc8, 0x4b, 0x30, 0x15, 0xf9, 0xbb, 0xd4, 0xbb, 0x13, 0x28, 0x6f, - 0x58, 0x3d, 0xd0, 0x37, 0x79, 0x39, 0xae, 0xa1, 0xc6, 0x60, 0xd8, 0x8d, 0xb6, 0x4b, 0xbd, 0x68, - 0xb5, 0x29, 0xbb, 0x59, 0x63, 0x2f, 0x8b, 0xf2, 0x15, 0xd4, 0x18, 0xc2, 0x81, 0x8d, 0xfd, 0xae, - 0xd3, 0x46, 0x40, 0x95, 0xef, 0xbc, 0xe1, 0xc0, 0x16, 0xc3, 0x30, 0x81, 0x49, 0x6c, 0x6d, 0xe2, - 0x1c, 0x8f, 0xef, 0x35, 0x52, 0x26, 0xc9, 0xdf, 0xb2, 0xa0, 0x24, 0x4c, 0xf4, 0x48, 0xb7, 0x53, - 0xfe, 0xab, 0x29, 0x23, 0x42, 0x75, 0x63, 0x35, 0xcb, 0x7f, 0xf5, 0x12, 0x8c, 0xef, 0xba, 0x9e, - 0xfa, 0x12, 0xbd, 0x2d, 0xbd, 0xe5, 0x7a, 0x4d, 0xe4, 0x10, 0xbd, 0x71, 0x15, 0x06, 0x6e, 0x5c, - 0x4b, 0x50, 0xd2, 0x5e, 0x1d, 0x72, 0xf9, 0xd7, 0xd6, 0x5b, 0xed, 0x05, 0x82, 0x31, 0x8e, 0xfd, - 0xab, 0x16, 0xcc, 0xf0, 0x00, 0xe9, 0xf8, 0x3c, 0xfc, 0xaa, 0x76, 0xb4, 0x12, 0x72, 0x3f, 0x97, - 0x74, 0xb4, 0x7a, 0x78, 0x50, 0x29, 0x8b, 0x90, 0xea, 0xa4, 0xdf, 0xd5, 0xa7, 0xa5, 0x11, 0x8d, - 0xbb, 0x83, 0x8d, 0x0d, 0x6d, 0xe3, 0x89, 0xc5, 0x54, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x07, 0xd3, - 0x66, 0xa4, 0x13, 0x79, 0x15, 0xca, 0x5d, 0xd7, 0x6b, 0x25, 0x23, 0x62, 0xf5, 0x45, 0xc3, 0x46, - 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, 0xa9, 0xfb, 0x89, 0x0d, 0xdf, 0xac, 0x16, 0xff, - 0xe1, 0x49, 0xf5, 0x33, 0x22, 0xea, 0x72, 0x4f, 0xaa, 0x9f, 0xc1, 0xe3, 0x87, 0x97, 0x54, 0x3f, - 0x4b, 0x98, 0xff, 0xbb, 0x92, 0xea, 0xff, 0x34, 0x0c, 0x9b, 0x70, 0x94, 0xed, 0xf5, 0xf7, 0xcd, - 0xac, 0x05, 0xba, 0xc5, 0x65, 0xda, 0x02, 0x09, 0xb5, 0xbf, 0x55, 0x80, 0xb9, 0xf4, 0x91, 0x3f, - 0x6f, 0x6f, 0x0a, 0xf2, 0x55, 0x0b, 0x66, 0x9c, 0x44, 0x72, 0xb7, 0x9c, 0x5e, 0xe8, 0x49, 0xd0, - 0x34, 0x92, 0x8b, 0x25, 0xca, 0x31, 0xc5, 0x9b, 0xfc, 0x05, 0x98, 0x8c, 0xdc, 0x0e, 0xf5, 0x7b, - 0xc2, 0x10, 0x58, 0x10, 0x07, 0xf2, 0x4d, 0x51, 0x84, 0x0a, 0xc6, 0x16, 0x65, 0x97, 0x6b, 0x50, - 0x01, 0x95, 0x6e, 0xb7, 0x73, 0xb1, 0xe5, 0x52, 0x94, 0xa3, 0xc6, 0x20, 0x0f, 0x60, 0x52, 0xf8, - 0x5d, 0x28, 0x07, 0x9b, 0xf5, 0x9c, 0x4c, 0x13, 0xc2, 0xb5, 0x23, 0xee, 0x02, 0xf1, 0x3f, 0x44, - 0xc5, 0xce, 0xfe, 0x28, 0x0c, 0x99, 0x81, 0xd5, 0xbe, 0x0a, 0x04, 0xfd, 0x76, 0x7b, 0xcb, 0x69, - 0xec, 0xde, 0x75, 0xbd, 0xa6, 0x7f, 0x9f, 0x2f, 0x45, 0x4b, 0x50, 0x0a, 0x64, 0x3c, 0x6a, 0x28, - 0x47, 0x8d, 0x5e, 0xcb, 0x54, 0xa0, 0x6a, 0x88, 0x31, 0x8e, 0xfd, 0x07, 0x63, 0x30, 0x29, 0x83, - 0xa7, 0x1f, 0x83, 0xdb, 0xff, 0x6e, 0xe2, 0x3e, 0x78, 0x35, 0x97, 0x98, 0xef, 0x81, 0x3e, 0xff, - 0x61, 0xca, 0xe7, 0xff, 0xad, 0x7c, 0xd8, 0x1d, 0xed, 0xf0, 0xff, 0xfb, 0x45, 0x98, 0x4d, 0x05, - 0xa3, 0x33, 0x5d, 0xbc, 0xcf, 0xcf, 0xf5, 0x4e, 0xae, 0xf1, 0xee, 0x3a, 0xd0, 0xe7, 0x68, 0x97, - 0xd7, 0x30, 0x91, 0x2f, 0xfb, 0x76, 0x6e, 0xef, 0x9c, 0xfc, 0x38, 0x75, 0xf6, 0xb0, 0xaf, 0x65, - 0x7c, 0xd3, 0x82, 0x73, 0x4e, 0xff, 0x43, 0x31, 0xd2, 0x66, 0x78, 0x3b, 0xf7, 0x17, 0x68, 0x6a, - 0xcf, 0x48, 0x21, 0xb3, 0xde, 0xe3, 0xc1, 0x2c, 0x51, 0xec, 0xff, 0x6c, 0xc1, 0xd3, 0x03, 0xd3, - 0x2a, 0xf0, 0xac, 0x5c, 0x41, 0x12, 0x2a, 0xd7, 0x8c, 0x9c, 0x93, 0xc7, 0xe8, 0xfb, 0xe3, 0x74, - 0x22, 0xa5, 0x34, 0x7b, 0xf2, 0x0a, 0x4c, 0x73, 0x1d, 0x8d, 0xad, 0x9e, 0x11, 0xed, 0xca, 0xeb, - 0x2f, 0x7e, 0x11, 0x52, 0x37, 0xca, 0x31, 0x81, 0x65, 0x7f, 0xd3, 0x82, 0xf9, 0x41, 0x39, 0x9a, - 0x8e, 0x61, 0x9c, 0xf9, 0xcb, 0xa9, 0xd0, 0x89, 0x4a, 0x5f, 0xe8, 0x44, 0xca, 0x3c, 0xa3, 0xa2, - 0x24, 0x0c, 0xcb, 0x48, 0xe1, 0x11, 0x91, 0x01, 0x5f, 0xb3, 0xe0, 0xa9, 0x01, 0x13, 0xbe, 0x2f, - 0x84, 0xc6, 0x3a, 0x71, 0x08, 0xcd, 0xd8, 0x71, 0x43, 0x68, 0xec, 0x3f, 0x2c, 0xc0, 0x9c, 0x94, - 0x27, 0x56, 0xd4, 0x5f, 0x4b, 0x04, 0xa0, 0xfc, 0x44, 0x2a, 0x00, 0xe5, 0x7c, 0x1a, 0xff, 0xc7, - 0xd1, 0x27, 0x3f, 0x5a, 0xd1, 0x27, 0x7f, 0x3e, 0x06, 0x17, 0x32, 0x53, 0x47, 0x91, 0xaf, 0x64, - 0xec, 0x5e, 0x77, 0x73, 0xce, 0x51, 0x75, 0xcc, 0xfd, 0x6b, 0xd4, 0x90, 0x8d, 0x5f, 0x36, 0x43, - 0x25, 0xc4, 0x6e, 0xb4, 0x7d, 0x0a, 0xd9, 0xb6, 0x86, 0x8c, 0x9a, 0xb0, 0x7f, 0xa1, 0x00, 0x97, - 0x8f, 0x4b, 0xe8, 0x47, 0x34, 0xaa, 0x2e, 0x4c, 0x44, 0xd5, 0x3d, 0x26, 0xcd, 0xe2, 0x54, 0x02, - 0xec, 0xfe, 0xc1, 0xb8, 0xde, 0xf6, 0xfa, 0xc7, 0xe7, 0xb1, 0x7c, 0x25, 0x26, 0x99, 0xf6, 0xa9, - 0xb2, 0x6e, 0xc7, 0x4b, 0xe1, 0x64, 0x5d, 0x14, 0x3f, 0x3c, 0xa8, 0x9c, 0x8d, 0x13, 0x98, 0xc8, - 0x42, 0x54, 0x95, 0xc8, 0x65, 0x98, 0x0a, 0x04, 0x54, 0xc5, 0x11, 0x49, 0x87, 0x13, 0x51, 0x86, - 0x1a, 0x4a, 0xbe, 0x60, 0xa8, 0xeb, 0xe3, 0xa7, 0x95, 0xa7, 0xe7, 0x28, 0x3f, 0x9a, 0x77, 0x60, - 0x2a, 0x54, 0xa9, 0xa1, 0x85, 0xe2, 0xf2, 0xf2, 0x31, 0xc3, 0xd3, 0xd8, 0x19, 0x5c, 0xe5, 0x89, - 0x16, 0xdf, 0xa7, 0xb3, 0x48, 0x6b, 0x92, 0xc4, 0xd6, 0xc7, 0x5f, 0x61, 0xe7, 0x87, 0xfe, 0xa3, - 0x2f, 0x89, 0x60, 0x52, 0x3e, 0x87, 0x2a, 0x2f, 0x20, 0xd7, 0x73, 0x0a, 0x45, 0x91, 0x8e, 0xca, - 0xfc, 0x54, 0xa9, 0xcc, 0x30, 0x8a, 0x95, 0xfd, 0x5d, 0x0b, 0xca, 0x72, 0x8c, 0x3c, 0x86, 0x38, - 0xbd, 0x7b, 0xc9, 0x38, 0xbd, 0xab, 0xb9, 0xac, 0x58, 0x03, 0x82, 0xf4, 0xee, 0xc1, 0xb4, 0x99, - 0xb3, 0x90, 0x7c, 0xca, 0x58, 0x71, 0xad, 0x51, 0xb2, 0x80, 0xa9, 0x35, 0x39, 0x5e, 0x8d, 0xed, - 0xdf, 0x28, 0xe9, 0x56, 0xe4, 0x67, 0x57, 0x73, 0xe4, 0x5b, 0x47, 0x8e, 0x7c, 0x73, 0xe0, 0x8d, - 0xe5, 0x3f, 0xf0, 0x6e, 0xc3, 0x94, 0x5a, 0x16, 0xa5, 0xf2, 0xf0, 0xbc, 0xe9, 0xb9, 0xcc, 0x34, - 0x10, 0x46, 0xcc, 0x98, 0x2e, 0xfc, 0x0c, 0x1a, 0x1b, 0x87, 0xd5, 0x72, 0xad, 0xc9, 0x90, 0x77, - 0xa1, 0x7c, 0xdf, 0x0f, 0x76, 0xdb, 0xbe, 0xc3, 0xf3, 0xf1, 0x43, 0x1e, 0x97, 0xe5, 0xda, 0xc0, - 0x2b, 0xc2, 0x47, 0xee, 0xc6, 0xf4, 0xd1, 0x64, 0x46, 0xaa, 0x30, 0xdb, 0x71, 0x3d, 0xa4, 0x4e, - 0x53, 0x87, 0xe3, 0x8d, 0x8b, 0x5c, 0xd8, 0x4a, 0xb5, 0x5e, 0x4f, 0x82, 0x31, 0x8d, 0xcf, 0x8d, - 0x3f, 0x41, 0xc2, 0xda, 0x20, 0x13, 0xde, 0x6e, 0x8c, 0x3e, 0x18, 0x93, 0x16, 0x0c, 0x11, 0x3f, - 0x91, 0x2c, 0xc7, 0x14, 0x6f, 0xf2, 0x79, 0x98, 0x0a, 0xd5, 0x43, 0x83, 0xc5, 0x1c, 0x0f, 0x1d, - 0xfa, 0xb1, 0x41, 0xdd, 0x95, 0xfa, 0xb5, 0x41, 0xcd, 0x90, 0xac, 0xc1, 0x79, 0x65, 0x3e, 0x49, - 0xbc, 0x99, 0x36, 0x11, 0xe7, 0xaf, 0xc2, 0x0c, 0x38, 0x66, 0xd6, 0x62, 0xaa, 0x1c, 0xcf, 0x05, - 0x2a, 0x2e, 0x27, 0x8d, 0xfb, 0x3c, 0x3e, 0xff, 0x9a, 0x28, 0xa1, 0x47, 0x45, 0x9b, 0x4e, 0x8d, - 0x10, 0x6d, 0x5a, 0x87, 0x0b, 0x69, 0x10, 0x4f, 0x4c, 0xc6, 0x73, 0xa1, 0x19, 0x5b, 0xe8, 0x46, - 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x14, 0x50, 0x7e, 0xc8, 0xaa, 0x2a, 0xbf, 0xae, 0xa1, - 0x3d, 0x58, 0x51, 0x11, 0xc0, 0x98, 0x16, 0xeb, 0x77, 0x27, 0x99, 0x9d, 0xfa, 0x76, 0x8e, 0x2f, - 0x11, 0xcb, 0xbe, 0x1f, 0x90, 0x30, 0xd0, 0xfe, 0x37, 0xb3, 0x70, 0x26, 0x61, 0x03, 0x22, 0xcf, - 0x43, 0x91, 0x67, 0x6a, 0xe3, 0xab, 0xd5, 0x54, 0xbc, 0xa2, 0x8a, 0xc6, 0x11, 0x30, 0xf2, 0x8b, - 0x16, 0xcc, 0x76, 0x13, 0x77, 0x1a, 0x6a, 0x21, 0x1f, 0xd1, 0x70, 0x9a, 0xbc, 0x28, 0x31, 0xde, - 0x75, 0x48, 0x32, 0xc3, 0x34, 0x77, 0xb6, 0x1e, 0x48, 0x37, 0xf0, 0x36, 0x0d, 0x38, 0xb6, 0x54, - 0xf4, 0x34, 0x89, 0xe5, 0x24, 0x18, 0xd3, 0xf8, 0xac, 0x87, 0xf9, 0xd7, 0x8d, 0xf2, 0xda, 0x64, - 0x55, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x03, 0x66, 0x64, 0x52, 0xe2, 0x0d, 0xbf, 0x79, 0xdd, 0x09, - 0x77, 0xe4, 0x09, 0x47, 0x9f, 0xc8, 0x96, 0x13, 0x50, 0x4c, 0x61, 0xf3, 0x6f, 0x8b, 0x33, 0x3f, - 0x73, 0x02, 0x13, 0xc9, 0x67, 0x2f, 0x96, 0x93, 0x60, 0x4c, 0xe3, 0x93, 0x97, 0x8c, 0x6d, 0x48, - 0x38, 0x0c, 0xe8, 0xd5, 0x20, 0x63, 0x2b, 0xaa, 0xc2, 0x6c, 0x8f, 0x1f, 0x08, 0x9b, 0x0a, 0x28, - 0xe7, 0xa3, 0x66, 0x78, 0x27, 0x09, 0xc6, 0x34, 0x3e, 0x79, 0x1d, 0xce, 0x04, 0x6c, 0xb1, 0xd5, - 0x04, 0x84, 0x17, 0x81, 0xbe, 0x24, 0x46, 0x13, 0x88, 0x49, 0x5c, 0xf2, 0x26, 0x9c, 0x8d, 0x73, - 0x78, 0x2a, 0x02, 0xc2, 0xad, 0x40, 0x27, 0x94, 0xab, 0xa6, 0x11, 0xb0, 0xbf, 0x0e, 0xf9, 0x6b, - 0x30, 0x67, 0xb4, 0xc4, 0xaa, 0xd7, 0xa4, 0x0f, 0x64, 0x9e, 0x45, 0xfe, 0x8c, 0xd3, 0x72, 0x0a, - 0x86, 0x7d, 0xd8, 0xe4, 0x13, 0x30, 0xd3, 0xf0, 0xdb, 0x6d, 0xbe, 0xc6, 0x89, 0x27, 0x17, 0x44, - 0x42, 0x45, 0x91, 0x7a, 0x32, 0x01, 0xc1, 0x14, 0x26, 0xb9, 0x01, 0xc4, 0xdf, 0x62, 0xea, 0x15, - 0x6d, 0xbe, 0x49, 0x3d, 0x2a, 0x35, 0x8e, 0x33, 0xc9, 0x20, 0x94, 0x5b, 0x7d, 0x18, 0x98, 0x51, - 0x8b, 0xe7, 0xa3, 0x33, 0x82, 0x76, 0x67, 0xf2, 0x78, 0x1a, 0x31, 0x6d, 0xbe, 0x78, 0x64, 0xc4, - 0x6e, 0x00, 0x13, 0x22, 0x26, 0x28, 0x9f, 0xcc, 0x8a, 0x66, 0xf6, 0xf5, 0x78, 0x8f, 0x10, 0xa5, - 0x28, 0x39, 0x91, 0x9f, 0x83, 0xd2, 0x96, 0x7a, 0x8a, 0x83, 0xa7, 0x53, 0x1c, 0x79, 0x5f, 0x4c, - 0xbd, 0x2a, 0x13, 0x1f, 0xcf, 0x35, 0x00, 0x63, 0x96, 0xe4, 0x05, 0x28, 0x5f, 0xdf, 0xa8, 0xea, - 0x51, 0x78, 0x96, 0xf7, 0xfe, 0x38, 0xab, 0x82, 0x26, 0x80, 0xcd, 0x30, 0xad, 0xbe, 0x91, 0xe4, - 0x4d, 0x79, 0x86, 0x36, 0xc6, 0xb0, 0xf9, 0xd5, 0x3f, 0xd6, 0xe7, 0xcf, 0xa5, 0xb0, 0x65, 0x39, - 0x6a, 0x0c, 0xf2, 0x0e, 0x94, 0xe5, 0x7e, 0xc1, 0xd7, 0xa6, 0xf3, 0x27, 0x0b, 0x08, 0xc7, 0x98, - 0x04, 0x9a, 0xf4, 0xf8, 0x9d, 0x2d, 0x7f, 0xa1, 0x80, 0x5e, 0xeb, 0xb5, 0xdb, 0xf3, 0x17, 0xf8, - 0xba, 0x19, 0xdf, 0xd9, 0xc6, 0x20, 0x34, 0xf1, 0xc8, 0xcb, 0xca, 0x85, 0xeb, 0xc9, 0xc4, 0x25, - 0xb6, 0x76, 0xe1, 0xd2, 0x4a, 0xf7, 0x80, 0x98, 0x91, 0xa7, 0x1e, 0xe1, 0x3b, 0xb5, 0x05, 0x0b, - 0x4a, 0xe3, 0xeb, 0x9f, 0x24, 0xf3, 0xf3, 0x09, 0x53, 0xc9, 0xc2, 0xdd, 0x81, 0x98, 0x78, 0x04, - 0x15, 0xb2, 0x05, 0x05, 0xa7, 0xbd, 0x35, 0xff, 0x74, 0x1e, 0xaa, 0x6b, 0x75, 0xad, 0x26, 0x47, - 0x14, 0xf7, 0xf3, 0xac, 0xae, 0xd5, 0x90, 0x11, 0x27, 0x2e, 0x8c, 0x3b, 0xed, 0xad, 0x70, 0x7e, - 0x81, 0xcf, 0xd9, 0xdc, 0x98, 0xc4, 0xc6, 0x83, 0xb5, 0x5a, 0x88, 0x9c, 0x85, 0xfd, 0xc5, 0x31, - 0x7d, 0x51, 0xa3, 0x93, 0x5b, 0xbf, 0x67, 0x4e, 0x20, 0x71, 0xdc, 0xb9, 0x95, 0xdb, 0x04, 0x92, - 0xea, 0xc5, 0x99, 0x81, 0xd3, 0xa7, 0xab, 0x97, 0x8c, 0x5c, 0xb2, 0x62, 0x25, 0x13, 0x77, 0x8b, - 0xd3, 0x73, 0x72, 0xc1, 0xb0, 0xbf, 0x05, 0xda, 0xe8, 0x97, 0x72, 0x7f, 0x0a, 0xa0, 0xe8, 0x86, - 0x91, 0xeb, 0xe7, 0x18, 0x27, 0x9d, 0xca, 0x78, 0xcd, 0xc3, 0x30, 0x38, 0x00, 0x05, 0x2b, 0xc6, - 0xd3, 0x6b, 0xb9, 0xde, 0x03, 0xf9, 0xf9, 0xb7, 0x73, 0xf7, 0x6b, 0x12, 0x3c, 0x39, 0x00, 0x05, - 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, 0x1e, 0x7d, 0x5d, 0x5d, 0xab, 0xa5, 0xf8, 0x25, 0x07, 0xf7, - 0x3d, 0x28, 0x84, 0x1d, 0x57, 0xaa, 0x4b, 0x23, 0xf2, 0xaa, 0xaf, 0xaf, 0x66, 0xf1, 0xaa, 0xaf, - 0xaf, 0x22, 0x63, 0x42, 0xbe, 0x6c, 0x01, 0x38, 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0xb6, 0xce, - 0x8c, 0xf8, 0x92, 0x45, 0x55, 0xd3, 0x4b, 0xb1, 0xe6, 0x9e, 0xbc, 0x31, 0x14, 0x0d, 0xce, 0xe4, - 0x5d, 0x98, 0x74, 0xc4, 0x53, 0x81, 0xd2, 0x29, 0x3d, 0x9f, 0xf7, 0x2f, 0x53, 0x12, 0x70, 0x33, - 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, 0x47, 0x81, 0x43, 0xb7, 0xdd, 0x5d, 0x69, 0x1c, 0xaa, 0x8f, - 0xfc, 0x98, 0x05, 0x23, 0x96, 0xc5, 0x5b, 0x82, 0x50, 0x31, 0x14, 0x2f, 0xc3, 0x3b, 0x9e, 0xa3, - 0x43, 0x0d, 0xf3, 0x09, 0x48, 0x35, 0x83, 0x17, 0x8d, 0x97, 0xe1, 0x4d, 0x46, 0x98, 0xe4, 0x4b, - 0xf6, 0x60, 0xc2, 0xe1, 0x8f, 0x98, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x20, 0x6a, 0xaa, 0x0d, 0xf8, - 0xe2, 0x22, 0x9f, 0x4a, 0x95, 0xdc, 0xc8, 0xaf, 0x59, 0x30, 0x29, 0xfc, 0xa5, 0x99, 0x42, 0xca, - 0xbe, 0xfd, 0xb3, 0xa7, 0x90, 0x39, 0x5f, 0xfa, 0x72, 0x4b, 0x0f, 0xa0, 0x0f, 0x6b, 0x67, 0x50, - 0x51, 0x7a, 0xa4, 0x37, 0xb7, 0x92, 0x6e, 0xe1, 0x13, 0x30, 0x6d, 0x52, 0x19, 0xca, 0x9f, 0xfb, - 0xfb, 0x05, 0x00, 0xde, 0xd0, 0x22, 0xb9, 0x48, 0x87, 0xa7, 0xf9, 0xdd, 0xf1, 0x9b, 0x39, 0x3d, - 0x78, 0x68, 0xe4, 0x08, 0x01, 0x99, 0xd3, 0x77, 0xc7, 0x6f, 0xa2, 0x64, 0x42, 0x5a, 0x30, 0xde, - 0x75, 0xa2, 0x9d, 0xfc, 0x13, 0x92, 0x4c, 0x89, 0x28, 0xdb, 0x68, 0x07, 0x39, 0x03, 0xf2, 0xbe, - 0x15, 0xbb, 0xc6, 0x14, 0xf2, 0x71, 0x60, 0x50, 0x6d, 0xb6, 0x28, 0x9d, 0x61, 0x52, 0x09, 0x3b, - 0xd3, 0x2e, 0x32, 0x0b, 0x1f, 0x58, 0x30, 0x6d, 0xa2, 0x66, 0x74, 0xd3, 0xcf, 0x9a, 0xdd, 0x94, - 0x67, 0x7b, 0x98, 0x3d, 0xfe, 0xdf, 0x2c, 0x00, 0xec, 0x79, 0xf5, 0x5e, 0xa7, 0xc3, 0x94, 0x6e, - 0xed, 0xb6, 0x6e, 0x1d, 0xdb, 0x6d, 0x7d, 0x6c, 0x48, 0xb7, 0xf5, 0xc2, 0x50, 0x6e, 0xeb, 0xe3, - 0xc3, 0xbb, 0xad, 0x17, 0x07, 0xbb, 0xad, 0xdb, 0x5f, 0xb7, 0xe0, 0x6c, 0xdf, 0x6e, 0xc3, 0xf4, - 0xe0, 0xc0, 0xf7, 0xa3, 0x01, 0x2e, 0x8f, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x2b, 0x30, 0x27, 0x1f, - 0xb5, 0xa8, 0x77, 0xdb, 0x6e, 0x66, 0xb2, 0x98, 0xcd, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, 0xdf, 0xb2, - 0xa0, 0x6c, 0x84, 0x98, 0xb3, 0xef, 0xe0, 0x7e, 0xaf, 0x52, 0x8c, 0xf8, 0x3d, 0x0f, 0x7e, 0x51, - 0x25, 0x60, 0xe2, 0xce, 0xb4, 0x65, 0xa4, 0x3c, 0x8f, 0xef, 0x4c, 0x59, 0x29, 0x4a, 0xa8, 0x48, - 0x66, 0x4d, 0xbb, 0xbc, 0xd1, 0x0b, 0x66, 0x32, 0x6b, 0xda, 0x45, 0x0e, 0xe1, 0xec, 0xd8, 0x81, - 0x40, 0xba, 0xb4, 0x1a, 0xcf, 0x87, 0x38, 0x41, 0x84, 0x02, 0x46, 0x9e, 0x83, 0x02, 0xf5, 0x9a, - 0xd2, 0x7a, 0xa1, 0x1f, 0xf8, 0xbc, 0xea, 0x35, 0x91, 0x95, 0xdb, 0xb7, 0x60, 0x5a, 0xb8, 0xf3, - 0xbe, 0x45, 0xf7, 0x8f, 0xfd, 0x62, 0x28, 0x1b, 0xed, 0xa9, 0x17, 0x43, 0x59, 0x75, 0x56, 0x6e, - 0xff, 0x63, 0x0b, 0x52, 0x6f, 0xdc, 0x18, 0xf7, 0x27, 0xd6, 0xc0, 0xfb, 0x13, 0xd3, 0xe6, 0x3e, - 0x76, 0xa4, 0xcd, 0xfd, 0x06, 0x90, 0x0e, 0x9b, 0x0a, 0x89, 0x17, 0x9d, 0xa4, 0xe1, 0x28, 0x4e, - 0x68, 0xd1, 0x87, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x24, 0x84, 0x35, 0x5f, 0xbd, 0x79, 0x74, 0x03, - 0xf4, 0xa0, 0xc8, 0x49, 0x49, 0xeb, 0xd9, 0x88, 0x96, 0xe7, 0xfe, 0xc4, 0x50, 0x71, 0x47, 0xca, - 0x29, 0xcf, 0xb9, 0xd9, 0x7f, 0x28, 0x64, 0x35, 0x9e, 0xc5, 0x39, 0x86, 0xac, 0x9d, 0xa4, 0xac, - 0xd7, 0xf3, 0x5a, 0x2b, 0xb3, 0x65, 0x24, 0x8b, 0x00, 0x5d, 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0x40, - 0x9b, 0xa2, 0x0c, 0xf9, 0xd4, 0xa5, 0x68, 0x60, 0xd8, 0x5f, 0x63, 0x13, 0x28, 0x7e, 0x4b, 0x97, - 0x5c, 0x4e, 0xfb, 0x8a, 0xa6, 0x27, 0x87, 0x76, 0x15, 0x35, 0xc2, 0x2f, 0xc6, 0x1e, 0x11, 0x7e, - 0xf1, 0x22, 0x4c, 0x06, 0x7e, 0x9b, 0x56, 0x03, 0x2f, 0xed, 0xe0, 0x82, 0xac, 0x18, 0x6f, 0xa2, - 0x82, 0xdb, 0xbf, 0x62, 0xc1, 0x5c, 0x3a, 0x3e, 0x2c, 0x77, 0x07, 0x56, 0x33, 0x88, 0xbd, 0x30, - 0x7c, 0x10, 0xbb, 0xfd, 0x3e, 0x13, 0x32, 0x72, 0x1b, 0xbb, 0xae, 0x27, 0xe2, 0xbe, 0x59, 0xcb, - 0xbd, 0x08, 0x93, 0x54, 0xbe, 0x09, 0x2a, 0x8c, 0xc0, 0x5a, 0x48, 0xf5, 0x14, 0xa8, 0x82, 0x93, - 0x2a, 0xcc, 0xaa, 0xab, 0x2f, 0x65, 0xb9, 0x17, 0xf9, 0x2a, 0xb4, 0xa5, 0x70, 0x25, 0x09, 0xc6, - 0x34, 0xbe, 0xfd, 0x05, 0x28, 0x1b, 0x9b, 0x12, 0x5f, 0xbf, 0x1f, 0x38, 0x8d, 0x28, 0xbd, 0xee, - 0x5d, 0x65, 0x85, 0x28, 0x60, 0xfc, 0x82, 0x41, 0x84, 0xaf, 0xa4, 0xd6, 0x3d, 0x19, 0xb4, 0x22, - 0xa1, 0x8c, 0x58, 0x40, 0x5b, 0xf4, 0x81, 0xca, 0x48, 0xaf, 0x88, 0x21, 0x2b, 0x44, 0x01, 0xb3, - 0x5f, 0x82, 0x29, 0x95, 0x55, 0x88, 0xa7, 0xe6, 0x50, 0xc6, 0x6f, 0x33, 0x35, 0x87, 0x1f, 0x44, - 0xc8, 0x21, 0xf6, 0xdb, 0x30, 0xa5, 0x92, 0x1f, 0x3d, 0x1a, 0x9b, 0x2d, 0x45, 0xa1, 0xe7, 0x5e, - 0xf7, 0xc3, 0x48, 0x65, 0x6c, 0x12, 0xf7, 0x73, 0x37, 0x57, 0x79, 0x19, 0x6a, 0xa8, 0xfd, 0x67, - 0x16, 0x94, 0x37, 0x37, 0xd7, 0xf4, 0xb1, 0x1d, 0xe1, 0xc9, 0x50, 0xb4, 0x50, 0x75, 0x3b, 0xa2, - 0xa6, 0x23, 0x80, 0x58, 0xf8, 0x16, 0x0e, 0x0f, 0x2a, 0x4f, 0xd6, 0x33, 0x31, 0x70, 0x40, 0x4d, - 0xb2, 0x0a, 0xe7, 0x4c, 0x88, 0x8c, 0xa4, 0x97, 0x6b, 0x24, 0x7f, 0x44, 0xb6, 0xde, 0x0f, 0xc6, - 0xac, 0x3a, 0x69, 0x52, 0x72, 0xbb, 0x37, 0xdf, 0xa3, 0xad, 0xf7, 0x83, 0x31, 0xab, 0x8e, 0xfd, - 0x32, 0xcc, 0xa6, 0x6e, 0xa8, 0x8f, 0x91, 0xc1, 0xe4, 0x77, 0x0b, 0x30, 0x6d, 0x5e, 0x54, 0x1e, - 0x63, 0xfd, 0x3a, 0xfe, 0xb6, 0x90, 0x71, 0xb9, 0x58, 0x18, 0xf2, 0x72, 0xd1, 0xbc, 0xcd, 0x1d, - 0x3f, 0xdd, 0xdb, 0xdc, 0x62, 0x3e, 0xb7, 0xb9, 0x86, 0xd7, 0xc1, 0xc4, 0xe3, 0xf3, 0x3a, 0xf8, - 0xed, 0x22, 0xcc, 0x24, 0x53, 0x62, 0x1e, 0xa3, 0x27, 0x5f, 0xea, 0xeb, 0xc9, 0x21, 0x6f, 0x33, - 0x0a, 0xa3, 0xde, 0x66, 0x8c, 0x8f, 0x7a, 0x9b, 0x51, 0x3c, 0xc1, 0x6d, 0x46, 0xff, 0x5d, 0xc4, - 0xc4, 0xb1, 0xef, 0x22, 0x3e, 0xa9, 0xfd, 0x11, 0x27, 0x13, 0x0e, 0x3c, 0xb1, 0x3f, 0x22, 0x49, - 0x76, 0xc3, 0xb2, 0xdf, 0xcc, 0xf4, 0xeb, 0x9c, 0x7a, 0x84, 0xd5, 0x36, 0xc8, 0x74, 0x1f, 0x1c, - 0xfe, 0xc2, 0xf4, 0xc9, 0x21, 0x5c, 0x07, 0x5f, 0x85, 0xb2, 0x1c, 0x4f, 0x5c, 0xf9, 0x86, 0xa4, - 0xe2, 0x5e, 0x8f, 0x41, 0x68, 0xe2, 0xf1, 0xe7, 0xe4, 0xe3, 0x09, 0xc2, 0xef, 0xd5, 0xca, 0xa9, - 0xe7, 0xe4, 0x93, 0x60, 0x4c, 0xe3, 0xdb, 0x9f, 0x87, 0x0b, 0x99, 0x06, 0x14, 0x6e, 0xbc, 0xe6, - 0x7a, 0x21, 0x6d, 0x4a, 0x04, 0x43, 0x8c, 0xd4, 0x33, 0x14, 0x0b, 0x77, 0x07, 0x62, 0xe2, 0x11, - 0x54, 0xec, 0xdf, 0x2c, 0xc0, 0x4c, 0xf2, 0x2d, 0x52, 0x72, 0x5f, 0x9b, 0x5b, 0x73, 0xb1, 0xf4, - 0x0a, 0xb2, 0x46, 0x9a, 0xc5, 0x81, 0xd7, 0x34, 0xf7, 0xf9, 0xf8, 0xda, 0xd2, 0x39, 0x1f, 0x4f, - 0x8f, 0xb1, 0xbc, 0x1f, 0x91, 0xec, 0xf8, 0x73, 0xa3, 0x71, 0x44, 0xa6, 0x3c, 0xc7, 0xe7, 0xce, - 0x3d, 0x8e, 0x2c, 0xd4, 0xac, 0xd0, 0x60, 0xcb, 0xf6, 0x96, 0x3d, 0x1a, 0xb8, 0xdb, 0xae, 0x7e, - 0x47, 0x9d, 0xaf, 0xdc, 0x6f, 0xcb, 0x32, 0xd4, 0x50, 0xfb, 0xfd, 0x31, 0x28, 0xf1, 0x04, 0x52, - 0xd7, 0x02, 0xbf, 0xc3, 0x1f, 0xec, 0x0b, 0x8d, 0x33, 0x93, 0xec, 0xb6, 0x1b, 0xa3, 0xbe, 0x8a, - 0x19, 0x53, 0x94, 0xbe, 0xe2, 0x46, 0x09, 0x26, 0x38, 0x92, 0x2e, 0x4c, 0x6d, 0xcb, 0x84, 0xb7, - 0xb2, 0xef, 0x46, 0x4c, 0xda, 0xa8, 0xd2, 0xe7, 0x8a, 0x26, 0x50, 0xff, 0x50, 0x73, 0xb1, 0x1d, - 0x98, 0x4d, 0x65, 0x00, 0xc9, 0x3d, 0x4d, 0xee, 0xff, 0x1c, 0x87, 0x92, 0x0e, 0x54, 0x22, 0x1f, - 0x4f, 0x18, 0xb0, 0x4a, 0xb5, 0x0f, 0x19, 0xaf, 0x49, 0xed, 0xf8, 0xcd, 0x87, 0x07, 0x95, 0x59, - 0x8d, 0x9c, 0x32, 0x46, 0x3d, 0x07, 0x85, 0x5e, 0xd0, 0x4e, 0x9f, 0x50, 0xef, 0xe0, 0x1a, 0xb2, - 0x72, 0x33, 0xb8, 0xaa, 0xf0, 0x58, 0x83, 0xab, 0xd8, 0x2e, 0xb9, 0xe5, 0x37, 0xf7, 0xd3, 0xaf, - 0x4f, 0xd5, 0xfc, 0xe6, 0x3e, 0x72, 0x08, 0x79, 0x03, 0x66, 0x64, 0xc4, 0x98, 0xf9, 0x26, 0x7f, - 0x21, 0x76, 0x3b, 0xd8, 0x4c, 0x40, 0x31, 0x85, 0xcd, 0x76, 0xd9, 0x7b, 0xa1, 0xef, 0xf1, 0xe4, - 0xc7, 0x13, 0xc9, 0x3b, 0xca, 0x1b, 0xf5, 0x5b, 0x37, 0xb9, 0x21, 0x4d, 0x63, 0x24, 0x82, 0xd2, - 0x26, 0x1f, 0x19, 0x94, 0xb6, 0x22, 0x68, 0x33, 0x69, 0xf9, 0x8e, 0x32, 0x5d, 0xbb, 0xac, 0xe8, - 0xb2, 0xb2, 0x87, 0x07, 0x47, 0x98, 0x38, 0x75, 0xcd, 0xac, 0xf0, 0xbd, 0xd2, 0x0f, 0x2f, 0x7c, - 0xcf, 0xbe, 0x03, 0xb3, 0xa9, 0xfe, 0x53, 0x06, 0x0e, 0x2b, 0xdb, 0xc0, 0x71, 0xbc, 0xf7, 0xab, - 0xfe, 0xa9, 0x05, 0x67, 0xfb, 0x56, 0xa4, 0xe3, 0xc6, 0x51, 0xa6, 0xf7, 0xc6, 0xb1, 0x93, 0xef, - 0x8d, 0x85, 0xe1, 0xf6, 0xc6, 0xda, 0xd6, 0xb7, 0xbf, 0x77, 0xf1, 0x89, 0xef, 0x7c, 0xef, 0xe2, - 0x13, 0x7f, 0xf4, 0xbd, 0x8b, 0x4f, 0xbc, 0x7f, 0x78, 0xd1, 0xfa, 0xf6, 0xe1, 0x45, 0xeb, 0x3b, - 0x87, 0x17, 0xad, 0x3f, 0x3a, 0xbc, 0x68, 0xfd, 0xa7, 0xc3, 0x8b, 0xd6, 0xd7, 0xff, 0xf4, 0xe2, - 0x13, 0x9f, 0xfa, 0x64, 0xdc, 0x53, 0x4b, 0xaa, 0xa7, 0xf8, 0x8f, 0x8f, 0xa8, 0x7e, 0x59, 0xea, - 0xee, 0xb6, 0x96, 0x58, 0x4f, 0x2d, 0xe9, 0x12, 0xd5, 0x53, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, - 0x9b, 0x74, 0x0a, 0x77, 0x6d, 0xa4, 0x00, 0x00, + 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0x85, 0x4f, 0x40, 0xd9, 0xf8, 0x04, 0x32, 0x07, 0x85, + 0x5d, 0xba, 0x2f, 0x06, 0x3c, 0xb2, 0x9f, 0xe4, 0x7c, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0xc9, 0xb1, + 0x57, 0xac, 0x85, 0xd7, 0x60, 0x2e, 0xcd, 0xf0, 0x38, 0xf5, 0xed, 0x7f, 0x52, 0x4c, 0x0c, 0x4c, + 0xb6, 0x10, 0x10, 0x1f, 0x26, 0x3b, 0x34, 0x0a, 0xdc, 0x86, 0xea, 0xb2, 0x95, 0xd1, 0x5a, 0x69, + 0x9d, 0x13, 0x8b, 0x37, 0x44, 0xf1, 0x3f, 0x44, 0xc5, 0x85, 0xec, 0xc0, 0xb8, 0x13, 0xb4, 0x54, + 0x9f, 0x5c, 0xcf, 0x67, 0x5a, 0xc6, 0x4b, 0x45, 0x35, 0x68, 0x85, 0xc8, 0x39, 0x90, 0x25, 0x28, + 0x45, 0x34, 0xe8, 0xb8, 0x9e, 0x13, 0x89, 0x1d, 0x74, 0xaa, 0x76, 0x56, 0xa2, 0x95, 0x36, 0x15, + 0x00, 0x63, 0x1c, 0xd2, 0x86, 0x89, 0x66, 0xb0, 0x8f, 0x3d, 0x6f, 0x7e, 0x3c, 0x8f, 0xa6, 0x58, + 0xe1, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, 0xa3, 0xe4, 0x41, 0x7e, 0xc5, 0x82, 0xf3, 0x1d, 0xea, 0x84, + 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, 0x51, 0x8f, 0x75, 0xec, 0x7c, 0x91, 0x33, 0xc7, 0x51, 0xfb, + 0xa1, 0x9f, 0x72, 0xed, 0x19, 0x29, 0xca, 0xf9, 0x2c, 0x28, 0x66, 0x4a, 0x43, 0xde, 0x85, 0x72, + 0x14, 0xb5, 0xeb, 0x11, 0xd3, 0x83, 0x5b, 0xfb, 0xf3, 0x13, 0x7c, 0xf1, 0x1a, 0x71, 0x85, 0xd9, + 0xdc, 0x5c, 0x53, 0x04, 0x6b, 0xb3, 0x6c, 0xb6, 0x18, 0x05, 0x68, 0xb2, 0xb3, 0xff, 0x79, 0x11, + 0xce, 0xf6, 0x6d, 0x2b, 0xe4, 0x25, 0x28, 0x76, 0x77, 0x9c, 0x50, 0xed, 0x13, 0x97, 0xd4, 0x22, + 0xb5, 0xc1, 0x0a, 0x1f, 0x1e, 0x54, 0xce, 0xa8, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0xd3, 0xda, 0x3a, + 0x34, 0x0c, 0x9d, 0x96, 0xda, 0x3c, 0x8c, 0x41, 0xca, 0x8b, 0x51, 0xc1, 0xc9, 0x5f, 0xb7, 0xe0, + 0x8c, 0x18, 0xb0, 0x48, 0xc3, 0x5e, 0x3b, 0x62, 0x1b, 0x24, 0xeb, 0x94, 0x9b, 0x79, 0x4c, 0x0e, + 0x41, 0xb2, 0x76, 0x41, 0x72, 0x3f, 0x63, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x42, 0x29, 0x8c, + 0x9c, 0x20, 0xa2, 0xcd, 0x6a, 0xc4, 0x55, 0xb9, 0xf2, 0xd5, 0x9f, 0x1c, 0x6e, 0xe7, 0xd8, 0x74, + 0x3b, 0x54, 0xec, 0x52, 0x75, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x5d, 0x80, 0xa0, 0xe7, 0xd5, 0x7b, + 0x9d, 0x8e, 0x13, 0xec, 0x4b, 0xed, 0xee, 0xc6, 0x68, 0x9f, 0x87, 0x9a, 0x5e, 0xac, 0xe8, 0xc4, + 0x65, 0x68, 0xf0, 0x23, 0x5f, 0xb2, 0xe0, 0x8c, 0x98, 0x07, 0x4a, 0x82, 0x89, 0x9c, 0x25, 0x38, + 0xcb, 0x9a, 0x76, 0xc5, 0x64, 0x81, 0x49, 0x8e, 0xe4, 0x6d, 0x28, 0x37, 0xfc, 0x4e, 0xb7, 0x4d, + 0x45, 0xe3, 0x4e, 0x1e, 0xbb, 0x71, 0xf9, 0xd0, 0x5d, 0x8e, 0x49, 0xa0, 0x49, 0xcf, 0xfe, 0xf7, + 0x49, 0x1d, 0x47, 0x0d, 0x69, 0xf2, 0x19, 0x78, 0x2a, 0xec, 0x35, 0x1a, 0x34, 0x0c, 0xb7, 0x7b, + 0x6d, 0xec, 0x79, 0x37, 0xdc, 0x30, 0xf2, 0x83, 0xfd, 0x35, 0xb7, 0xe3, 0x46, 0x7c, 0x40, 0x17, + 0x6b, 0x17, 0x0f, 0x0f, 0x2a, 0x4f, 0xd5, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0xa7, 0x7b, + 0xde, 0x60, 0xf2, 0xe2, 0xf8, 0x51, 0x39, 0x3c, 0xa8, 0x3c, 0x7d, 0x67, 0x30, 0x1a, 0x1e, 0x45, + 0xc3, 0xfe, 0x13, 0x8b, 0x6d, 0x43, 0xe2, 0xbb, 0x36, 0x69, 0xa7, 0xdb, 0x66, 0x4b, 0xe7, 0xe9, + 0x2b, 0xc7, 0x51, 0x42, 0x39, 0xc6, 0x7c, 0xf6, 0x72, 0x25, 0xff, 0x20, 0x0d, 0xd9, 0xfe, 0xaf, + 0x16, 0x9c, 0x4f, 0x23, 0x3f, 0x06, 0x85, 0x2e, 0x4c, 0x2a, 0x74, 0xb7, 0xf2, 0xfd, 0xda, 0x01, + 0x5a, 0xdd, 0x57, 0xc6, 0xfb, 0xbf, 0xf5, 0xff, 0x75, 0x1d, 0x21, 0xde, 0xf2, 0x0b, 0x3f, 0xce, + 0x2d, 0x7f, 0xfc, 0x83, 0xb4, 0xe5, 0xdb, 0xff, 0x70, 0x1c, 0xa6, 0xab, 0x5e, 0xe4, 0x56, 0xb7, + 0xb7, 0x5d, 0xcf, 0x8d, 0xf6, 0xc9, 0xd7, 0xc7, 0x60, 0xa9, 0x1b, 0xd0, 0x6d, 0x1a, 0x04, 0xb4, + 0xb9, 0xd2, 0x0b, 0x5c, 0xaf, 0x55, 0x6f, 0xec, 0xd0, 0x66, 0xaf, 0xed, 0x7a, 0xad, 0xd5, 0x96, + 0xe7, 0xeb, 0xe2, 0x6b, 0x0f, 0x68, 0xa3, 0xc7, 0x3f, 0x49, 0x4c, 0x8a, 0xce, 0x68, 0x9f, 0xb4, + 0x71, 0x3c, 0xa6, 0xb5, 0x17, 0x0f, 0x0f, 0x2a, 0x4b, 0xc7, 0xac, 0x84, 0xc7, 0xfd, 0x34, 0xf2, + 0xd5, 0x31, 0x58, 0x0c, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, + 0xdb, 0xb1, 0x78, 0xd6, 0xae, 0x1e, 0x1e, 0x54, 0x8e, 0x59, 0x07, 0x8f, 0xf9, 0x5d, 0xf6, 0x06, + 0x94, 0xab, 0x5d, 0x37, 0x74, 0x1f, 0xa0, 0xdf, 0x8b, 0xe8, 0x10, 0xe7, 0xf7, 0x0a, 0x14, 0x83, + 0x5e, 0x9b, 0x8a, 0xb9, 0x5d, 0xaa, 0x95, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0xf3, + 0x6c, 0xc5, 0xe5, 0x24, 0x53, 0x96, 0x9b, 0x7b, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0x46, 0x3d, + 0xe4, 0xc6, 0x52, 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x1e, 0x83, 0x0b, 0xd5, 0x6e, + 0x77, 0x9d, 0x86, 0x3b, 0x29, 0x29, 0x7e, 0xc1, 0x82, 0x99, 0x3d, 0x37, 0x88, 0x7a, 0x4e, 0x5b, + 0x19, 0xe7, 0x84, 0x3c, 0xf5, 0x51, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x91, 0xc3, 0x83, + 0xca, 0x4c, 0xb2, 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb6, 0x60, 0x4e, 0x16, 0xdd, 0xf2, 0x9b, 0xd4, + 0x34, 0xfe, 0xde, 0xc9, 0x53, 0x26, 0x4d, 0x5c, 0x18, 0xed, 0xd2, 0xa5, 0xd8, 0x27, 0x84, 0xfd, + 0xdf, 0xc7, 0xe0, 0xc9, 0x01, 0x34, 0xc8, 0xaf, 0x5a, 0x70, 0x5e, 0x58, 0x8c, 0x0d, 0x10, 0xd2, + 0x6d, 0xd9, 0x9a, 0x3f, 0x9d, 0xb7, 0xe4, 0xc8, 0xa6, 0x38, 0xf5, 0x1a, 0xb4, 0x36, 0xcf, 0x56, + 0xc3, 0xe5, 0x0c, 0xd6, 0x98, 0x29, 0x10, 0x97, 0x54, 0xd8, 0x90, 0x53, 0x92, 0x8e, 0x3d, 0x16, + 0x49, 0xeb, 0x19, 0xac, 0x31, 0x53, 0x20, 0xfb, 0xaf, 0xc2, 0xd3, 0x47, 0x90, 0x7b, 0xf4, 0xe4, + 0xb4, 0xdf, 0xd6, 0xa3, 0x3e, 0x39, 0xe6, 0x86, 0x98, 0xd7, 0x36, 0x4c, 0xf0, 0xa9, 0xa3, 0x26, + 0x36, 0xb0, 0xed, 0x8f, 0xcf, 0xa9, 0x10, 0x25, 0xc4, 0xfe, 0x6d, 0x0b, 0xa6, 0x8e, 0x61, 0xea, + 0xab, 0x24, 0x4d, 0x7d, 0xa5, 0x3e, 0x33, 0x5f, 0xd4, 0x6f, 0xe6, 0x7b, 0x7d, 0xb4, 0xde, 0x18, + 0xc6, 0xbc, 0xf7, 0x43, 0x0b, 0xce, 0xf6, 0x99, 0x03, 0xc9, 0x0e, 0x9c, 0xef, 0xfa, 0x4d, 0xa5, + 0x36, 0xdd, 0x70, 0xc2, 0x1d, 0x0e, 0x93, 0x9f, 0xf7, 0x12, 0xeb, 0xc9, 0x8d, 0x0c, 0xf8, 0xc3, + 0x83, 0xca, 0xbc, 0x26, 0x92, 0x42, 0xc0, 0x4c, 0x8a, 0xa4, 0x0b, 0x53, 0xdb, 0x2e, 0x6d, 0x37, + 0xe3, 0x21, 0x38, 0xa2, 0x82, 0x74, 0x5d, 0x52, 0x13, 0x96, 0x70, 0xf5, 0x0f, 0x35, 0x17, 0xfb, + 0x47, 0x16, 0xcc, 0x54, 0x7b, 0xd1, 0x0e, 0x53, 0x0f, 0x1a, 0xdc, 0xf8, 0x44, 0x3c, 0x28, 0x86, + 0x6e, 0x6b, 0xef, 0xa5, 0x7c, 0x16, 0xe3, 0x3a, 0x23, 0x25, 0x6f, 0x04, 0xb4, 0x6e, 0xca, 0x0b, + 0x51, 0xb0, 0x21, 0x01, 0x4c, 0xf8, 0x4e, 0x2f, 0xda, 0xb9, 0x2a, 0x3f, 0x79, 0xc4, 0x83, 0xf8, + 0x6d, 0xf6, 0x39, 0x57, 0x25, 0x47, 0xad, 0xad, 0x89, 0x52, 0x94, 0x9c, 0xec, 0x2f, 0xc2, 0x4c, + 0xf2, 0x9a, 0x69, 0x88, 0x31, 0x7b, 0x11, 0x0a, 0x4e, 0xe0, 0xc9, 0x11, 0x5b, 0x96, 0x08, 0x85, + 0x2a, 0xde, 0x42, 0x56, 0x4e, 0x5e, 0x80, 0xa9, 0xed, 0x5e, 0xbb, 0xcd, 0x2a, 0xc8, 0x3b, 0x1d, + 0x7d, 0x0a, 0xb8, 0x2e, 0xcb, 0x51, 0x63, 0xd8, 0xff, 0x7b, 0x1c, 0x66, 0x6b, 0xed, 0x1e, 0x7d, + 0x3d, 0xa0, 0x54, 0x99, 0x3e, 0xaa, 0x30, 0xdb, 0x0d, 0xe8, 0x9e, 0x4b, 0xef, 0xd7, 0x69, 0x9b, + 0x36, 0x22, 0x3f, 0x90, 0xd2, 0x3c, 0x29, 0x09, 0xcd, 0x6e, 0x24, 0xc1, 0x98, 0xc6, 0x27, 0xaf, + 0xc1, 0x8c, 0xd3, 0x88, 0xdc, 0x3d, 0xaa, 0x29, 0x08, 0x71, 0x9f, 0x90, 0x14, 0x66, 0xaa, 0x09, + 0x28, 0xa6, 0xb0, 0xc9, 0x67, 0x61, 0x3e, 0x6c, 0x38, 0x6d, 0x7a, 0xa7, 0x2b, 0x59, 0x2d, 0xef, + 0xd0, 0xc6, 0xee, 0x86, 0xef, 0x7a, 0x91, 0x34, 0xb3, 0x5d, 0x96, 0x94, 0xe6, 0xeb, 0x03, 0xf0, + 0x70, 0x20, 0x05, 0xf2, 0x2f, 0x2c, 0xb8, 0xd8, 0x0d, 0xe8, 0x46, 0xe0, 0x77, 0x7c, 0x36, 0xd4, + 0xfa, 0xac, 0x3f, 0xd2, 0x0a, 0xf2, 0xd6, 0x88, 0xba, 0x94, 0x28, 0xe9, 0xbf, 0xb2, 0xf8, 0xf0, + 0xe1, 0x41, 0xe5, 0xe2, 0xc6, 0x51, 0x02, 0xe0, 0xd1, 0xf2, 0x91, 0x7f, 0x69, 0xc1, 0xa5, 0xae, + 0x1f, 0x46, 0x47, 0x7c, 0x42, 0xf1, 0x54, 0x3f, 0xc1, 0x3e, 0x3c, 0xa8, 0x5c, 0xda, 0x38, 0x52, + 0x02, 0x7c, 0x84, 0x84, 0xf6, 0x61, 0x19, 0xce, 0x1a, 0x63, 0x4f, 0xda, 0x2e, 0x5e, 0x85, 0x33, + 0x6a, 0x30, 0xc4, 0xba, 0x4f, 0x29, 0x36, 0x65, 0x55, 0x4d, 0x20, 0x26, 0x71, 0xd9, 0xb8, 0xd3, + 0x43, 0x51, 0xd4, 0x4e, 0x8d, 0xbb, 0x8d, 0x04, 0x14, 0x53, 0xd8, 0x64, 0x15, 0xce, 0xc9, 0x12, + 0xa4, 0xdd, 0xb6, 0xdb, 0x70, 0x96, 0xfd, 0x9e, 0x1c, 0x72, 0xc5, 0xda, 0x93, 0x87, 0x07, 0x95, + 0x73, 0x1b, 0xfd, 0x60, 0xcc, 0xaa, 0x43, 0xd6, 0xe0, 0xbc, 0xd3, 0x8b, 0x7c, 0xfd, 0xfd, 0xd7, + 0x3c, 0xb6, 0x9d, 0x36, 0xf9, 0xd0, 0x9a, 0x12, 0xfb, 0x6e, 0x35, 0x03, 0x8e, 0x99, 0xb5, 0xc8, + 0x46, 0x8a, 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x7a, 0xb9, 0x18, 0x9f, 0xc0, 0xaa, 0x19, 0x38, + 0x98, 0x59, 0x93, 0xb4, 0x61, 0xa6, 0xe3, 0x3c, 0xb8, 0xe3, 0x39, 0x7b, 0x8e, 0xdb, 0x66, 0x4c, + 0xa4, 0x79, 0x6c, 0xb0, 0x51, 0xa5, 0x17, 0xb9, 0xed, 0x45, 0xe1, 0xb6, 0xb0, 0xb8, 0xea, 0x45, + 0xb7, 0x83, 0x7a, 0xc4, 0x34, 0x75, 0xa1, 0x41, 0xae, 0x27, 0x68, 0x61, 0x8a, 0x36, 0xb9, 0x0d, + 0x17, 0xf8, 0x74, 0x5c, 0xf1, 0xef, 0x7b, 0x2b, 0xb4, 0xed, 0xec, 0xab, 0x0f, 0x98, 0xe4, 0x1f, + 0xf0, 0xd4, 0xe1, 0x41, 0xe5, 0x42, 0x3d, 0x0b, 0x01, 0xb3, 0xeb, 0x11, 0x07, 0x9e, 0x4e, 0x02, + 0x90, 0xee, 0xb9, 0xa1, 0xeb, 0x7b, 0xc2, 0x0a, 0x35, 0x15, 0x5b, 0xa1, 0xea, 0x83, 0xd1, 0xf0, + 0x28, 0x1a, 0xe4, 0xef, 0x5a, 0x70, 0x3e, 0x6b, 0x1a, 0xce, 0x97, 0xf2, 0xb8, 0x3c, 0x4d, 0x4d, + 0x2d, 0x31, 0x22, 0x32, 0x17, 0x85, 0x4c, 0x21, 0xc8, 0x7b, 0x16, 0x4c, 0x3b, 0xc6, 0x09, 0x7a, + 0x1e, 0xf2, 0xd8, 0xb5, 0xcc, 0x33, 0x79, 0x6d, 0xee, 0xf0, 0xa0, 0x92, 0x38, 0xa5, 0x63, 0x82, + 0x23, 0xf9, 0xfb, 0x16, 0x5c, 0xc8, 0x9c, 0xe3, 0xf3, 0xe5, 0xd3, 0x68, 0x21, 0x3e, 0x48, 0xb2, + 0xd7, 0x9c, 0x6c, 0x31, 0xc8, 0x37, 0x2d, 0xbd, 0x95, 0xa9, 0xfb, 0xb4, 0xf9, 0x69, 0x2e, 0xda, + 0x9b, 0x23, 0x1a, 0x0d, 0x62, 0xad, 0x49, 0x11, 0xae, 0x9d, 0x33, 0x76, 0x46, 0x55, 0x88, 0x69, + 0xf6, 0xe4, 0x1b, 0x96, 0xda, 0x1a, 0xb5, 0x44, 0x67, 0x4e, 0x4b, 0x22, 0x12, 0xef, 0xb4, 0x5a, + 0xa0, 0x14, 0x73, 0xf2, 0x33, 0xb0, 0xe0, 0x6c, 0xf9, 0x41, 0x94, 0x39, 0xf9, 0xe6, 0x67, 0xf8, + 0x34, 0xba, 0x74, 0x78, 0x50, 0x59, 0xa8, 0x0e, 0xc4, 0xc2, 0x23, 0x28, 0xd8, 0xbf, 0x5e, 0x84, + 0x69, 0x71, 0x12, 0x92, 0x5b, 0xd7, 0x6f, 0x59, 0xf0, 0x4c, 0xa3, 0x17, 0x04, 0xd4, 0x8b, 0xea, + 0x11, 0xed, 0xf6, 0x6f, 0x5c, 0xd6, 0xa9, 0x6e, 0x5c, 0x97, 0x0f, 0x0f, 0x2a, 0xcf, 0x2c, 0x1f, + 0xc1, 0x1f, 0x8f, 0x94, 0x8e, 0xfc, 0x3b, 0x0b, 0x6c, 0x89, 0x50, 0x73, 0x1a, 0xbb, 0xad, 0xc0, + 0xef, 0x79, 0xcd, 0xfe, 0x8f, 0x18, 0x3b, 0xd5, 0x8f, 0x78, 0xee, 0xf0, 0xa0, 0x62, 0x2f, 0x3f, + 0x52, 0x0a, 0x1c, 0x42, 0x52, 0xf2, 0x3a, 0x9c, 0x95, 0x58, 0xd7, 0x1e, 0x74, 0x69, 0xe0, 0xb2, + 0x33, 0x87, 0x54, 0x1c, 0x63, 0x57, 0xac, 0x34, 0x02, 0xf6, 0xd7, 0x21, 0x21, 0x4c, 0xde, 0xa7, + 0x6e, 0x6b, 0x27, 0x52, 0xea, 0xd3, 0x88, 0xfe, 0x57, 0xd2, 0x2a, 0x72, 0x57, 0xd0, 0xac, 0x95, + 0x0f, 0x0f, 0x2a, 0x93, 0xf2, 0x0f, 0x2a, 0x4e, 0xe4, 0x16, 0xcc, 0x88, 0x73, 0xea, 0x86, 0xeb, + 0xb5, 0x36, 0x7c, 0x4f, 0x38, 0x11, 0x95, 0x6a, 0xcf, 0xa9, 0x0d, 0xbf, 0x9e, 0x80, 0x3e, 0x3c, + 0xa8, 0x4c, 0xab, 0xdf, 0x9b, 0xfb, 0x5d, 0x8a, 0xa9, 0xda, 0xf6, 0xef, 0x4e, 0x00, 0xa8, 0xe1, + 0x4a, 0xbb, 0xe4, 0x23, 0x50, 0x0a, 0x69, 0x24, 0xb8, 0xca, 0x8b, 0x13, 0x71, 0xdd, 0xa5, 0x0a, + 0x31, 0x86, 0x93, 0x5d, 0x28, 0x76, 0x9d, 0x5e, 0x48, 0xf3, 0x39, 0x3f, 0xc8, 0xce, 0xdf, 0x60, + 0x14, 0xc5, 0xc1, 0x94, 0xff, 0x44, 0xc1, 0x83, 0x7c, 0xd9, 0x02, 0xa0, 0xc9, 0x0e, 0x1b, 0xd9, + 0x40, 0x24, 0x59, 0xc6, 0x7d, 0xca, 0xda, 0xa0, 0x36, 0x73, 0x78, 0x50, 0x01, 0xa3, 0xeb, 0x0d, + 0xb6, 0xe4, 0x3e, 0x4c, 0x39, 0x6a, 0xcd, 0x1f, 0x3f, 0x8d, 0x35, 0x9f, 0x9f, 0x17, 0xf5, 0xa0, + 0xd5, 0xcc, 0xc8, 0x57, 0x2d, 0x98, 0x09, 0x69, 0x24, 0xbb, 0x8a, 0xad, 0x3c, 0x52, 0xe1, 0x1d, + 0x71, 0xd0, 0xd5, 0x13, 0x34, 0xc5, 0x0a, 0x9a, 0x2c, 0xc3, 0x14, 0x5f, 0x25, 0xca, 0x0d, 0xea, + 0x34, 0x69, 0xc0, 0xcd, 0x11, 0x52, 0x93, 0x1a, 0x5d, 0x14, 0x83, 0xa6, 0x16, 0xc5, 0x28, 0xc3, + 0x14, 0x5f, 0x25, 0xca, 0xba, 0x1b, 0x04, 0xbe, 0x14, 0x65, 0x2a, 0x27, 0x51, 0x0c, 0x9a, 0x5a, + 0x14, 0xa3, 0x0c, 0x53, 0x7c, 0xed, 0x6f, 0x9f, 0x81, 0x19, 0x35, 0x91, 0x62, 0xcd, 0x5e, 0x58, + 0xbf, 0x06, 0x68, 0xf6, 0xcb, 0x26, 0x10, 0x93, 0xb8, 0xac, 0xb2, 0x98, 0xaa, 0x49, 0xc5, 0x5e, + 0x57, 0xae, 0x9b, 0x40, 0x4c, 0xe2, 0x92, 0x0e, 0x14, 0xc3, 0x88, 0x76, 0xd5, 0x15, 0xfb, 0x88, + 0x37, 0xc0, 0xf1, 0xfa, 0x60, 0x58, 0x12, 0x18, 0x79, 0x14, 0x5c, 0xb8, 0x01, 0x37, 0x4a, 0xd8, + 0x74, 0xe5, 0xe4, 0xc8, 0x67, 0x7e, 0x26, 0xcd, 0xc5, 0xa2, 0x37, 0x92, 0x65, 0x98, 0x62, 0x9f, + 0xa1, 0xec, 0x17, 0x4f, 0x51, 0xd9, 0xff, 0x34, 0x4c, 0x75, 0x9c, 0x07, 0xf5, 0x5e, 0xd0, 0x3a, + 0xf9, 0xa1, 0x42, 0xba, 0x4c, 0x0a, 0x2a, 0xa8, 0xe9, 0x91, 0x2f, 0x59, 0xc6, 0x92, 0x23, 0xee, + 0xd3, 0xef, 0xe6, 0xbb, 0xe4, 0xe8, 0xbd, 0x72, 0xe0, 0xe2, 0xd3, 0xa7, 0x7a, 0x4f, 0x3d, 0x76, + 0xd5, 0x9b, 0xa9, 0x91, 0x62, 0x82, 0x68, 0x35, 0xb2, 0x74, 0xaa, 0x6a, 0xe4, 0x72, 0x82, 0x19, + 0xa6, 0x98, 0x73, 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xa9, 0xca, 0x53, 0x4f, 0x30, 0xc3, 0x14, + 0xf3, 0xc1, 0xe7, 0xcd, 0xf2, 0xe9, 0x9c, 0x37, 0xa7, 0x73, 0x38, 0x6f, 0x1e, 0xad, 0x8a, 0x9f, + 0x19, 0x55, 0x15, 0x27, 0x37, 0x81, 0x34, 0xf7, 0x3d, 0xa7, 0xe3, 0x36, 0xe4, 0x62, 0xc9, 0xb7, + 0xcd, 0x19, 0x6e, 0x8f, 0x58, 0x90, 0x0b, 0x19, 0x59, 0xe9, 0xc3, 0xc0, 0x8c, 0x5a, 0x24, 0x82, + 0xa9, 0xae, 0xd2, 0xb8, 0x66, 0xf3, 0x18, 0xfd, 0x4a, 0x03, 0x13, 0x6e, 0x12, 0x6c, 0xe2, 0xa9, + 0x12, 0xd4, 0x9c, 0xc8, 0x1a, 0x9c, 0xef, 0xb8, 0xde, 0x86, 0xdf, 0x0c, 0x37, 0x68, 0x20, 0xad, + 0x2d, 0x75, 0x1a, 0xcd, 0xcf, 0xf1, 0xb6, 0xe1, 0x27, 0xe8, 0xf5, 0x0c, 0x38, 0x66, 0xd6, 0xb2, + 0xff, 0x97, 0x05, 0x73, 0xcb, 0x6d, 0xbf, 0xd7, 0xbc, 0xeb, 0x44, 0x8d, 0x1d, 0xe1, 0x21, 0x40, + 0x5e, 0x83, 0x29, 0xd7, 0x8b, 0x68, 0xb0, 0xe7, 0xb4, 0xe5, 0xfe, 0x64, 0x2b, 0xf3, 0xe9, 0xaa, + 0x2c, 0x7f, 0x78, 0x50, 0x99, 0x59, 0xe9, 0x05, 0xdc, 0x4a, 0x2d, 0x56, 0x2b, 0xd4, 0x75, 0xc8, + 0xb7, 0x2d, 0x38, 0x2b, 0x7c, 0x0c, 0x56, 0x9c, 0xc8, 0x79, 0xb3, 0x47, 0x03, 0x97, 0x2a, 0x2f, + 0x83, 0x11, 0x17, 0xaa, 0xb4, 0xac, 0x8a, 0xc1, 0x7e, 0xac, 0xa8, 0xaf, 0xa7, 0x39, 0x63, 0xbf, + 0x30, 0xf6, 0x2f, 0x16, 0xe0, 0xa9, 0x81, 0xb4, 0xc8, 0x02, 0x8c, 0xb9, 0x4d, 0xf9, 0xe9, 0x20, + 0xe9, 0x8e, 0xad, 0x36, 0x71, 0xcc, 0x6d, 0x92, 0x45, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0x85, + 0x73, 0x49, 0xab, 0x87, 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x81, 0x22, 0x77, 0x97, 0x95, 0xe7, 0x09, + 0xae, 0xc5, 0x72, 0xcf, 0x54, 0x14, 0xe5, 0xe4, 0xe7, 0x2d, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, + 0x5d, 0x12, 0xf3, 0x6d, 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x84, 0x09, + 0xa6, 0xd0, 0xfa, 0xcd, 0x13, 0x6f, 0x8a, 0xfc, 0x26, 0x6a, 0x83, 0xd3, 0x40, 0x49, 0x8b, 0xb5, + 0x55, 0x40, 0xa3, 0x5e, 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x94, 0x90, 0x02, 0x75, 0x29, 0x1a, + 0x18, 0xf6, 0x3f, 0x1b, 0x83, 0xf3, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x42, 0x48, 0x2b, 0x8f, 0xc6, + 0x3f, 0x95, 0x7f, 0xfb, 0x48, 0x77, 0x19, 0x7d, 0x4d, 0x21, 0xfd, 0x05, 0x25, 0x5f, 0xf2, 0x53, + 0xba, 0x85, 0xc6, 0x4e, 0xd8, 0x42, 0x9a, 0x72, 0xaa, 0x95, 0x2e, 0xc3, 0x78, 0xc8, 0x7a, 0xbe, + 0x90, 0xbc, 0xee, 0xe0, 0x7d, 0xc4, 0x21, 0x0c, 0xa3, 0xe7, 0xb9, 0x91, 0x8c, 0x31, 0xd1, 0x18, + 0x77, 0x3c, 0x37, 0x42, 0x0e, 0xb1, 0xbf, 0x35, 0x06, 0x0b, 0x83, 0x3f, 0x8a, 0x7c, 0xcb, 0x02, + 0x68, 0xb2, 0xe3, 0x4a, 0xc8, 0x1d, 0xb5, 0x85, 0x7b, 0x91, 0x73, 0x5a, 0x6d, 0xb8, 0xa2, 0x38, + 0xc5, 0xbe, 0x66, 0xba, 0x28, 0x44, 0x43, 0x10, 0x72, 0x55, 0x0d, 0x7d, 0x7e, 0x55, 0x23, 0x26, + 0x93, 0xae, 0xb3, 0xae, 0x21, 0x68, 0x60, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, + 0xc4, 0x0e, 0x3f, 0x8f, 0xde, 0x52, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3b, 0x84, 0x9c, 0x39, + 0x05, 0x44, 0xd8, 0xff, 0xc3, 0x82, 0x27, 0x97, 0xdb, 0xbd, 0x30, 0xa2, 0xc1, 0xff, 0x37, 0xae, + 0x7b, 0x7f, 0x6a, 0xc1, 0xd3, 0x03, 0xbe, 0xf9, 0x31, 0x78, 0xf0, 0xbd, 0x93, 0xf4, 0xe0, 0xbb, + 0x33, 0xea, 0x90, 0xce, 0xfc, 0x8e, 0x01, 0x8e, 0x7c, 0xff, 0xa6, 0x00, 0x67, 0xd8, 0xb2, 0xd5, + 0xf4, 0x5b, 0x39, 0x6d, 0x9c, 0xcf, 0x42, 0xf1, 0xf3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, 0xbe, 0x2b, + 0xa1, 0x80, 0x91, 0x2f, 0x5b, 0x30, 0xf9, 0x79, 0xb9, 0xa7, 0x8a, 0xb3, 0xdc, 0x88, 0x8b, 0x61, + 0xe2, 0x1b, 0x16, 0xe5, 0x0e, 0x29, 0xe2, 0x2c, 0xb4, 0xef, 0xa0, 0xda, 0x4a, 0x15, 0x67, 0xf2, + 0x3c, 0x4c, 0x6e, 0xfb, 0x41, 0xa7, 0xd7, 0x76, 0xd2, 0xc1, 0x7d, 0xd7, 0x45, 0x31, 0x2a, 0x38, + 0x9b, 0xe4, 0x4e, 0xd7, 0x7d, 0x8b, 0x06, 0xa1, 0x70, 0xbb, 0x4f, 0x4c, 0xf2, 0xaa, 0x86, 0xa0, + 0x81, 0xc5, 0xeb, 0xb4, 0x5a, 0x01, 0x6d, 0x39, 0x91, 0x1f, 0xf0, 0x9d, 0xc3, 0xac, 0xa3, 0x21, + 0x68, 0x60, 0x2d, 0x7c, 0x12, 0xa6, 0x4d, 0xe1, 0x8f, 0x15, 0xb3, 0xf1, 0x29, 0x90, 0x4e, 0x84, + 0xa9, 0x25, 0xc9, 0x1a, 0x66, 0x49, 0xb2, 0xff, 0xc3, 0x18, 0x18, 0xd6, 0xa1, 0xc7, 0x30, 0xd5, + 0xbd, 0xc4, 0x54, 0x1f, 0xd1, 0xb2, 0x61, 0xd8, 0xba, 0x06, 0x45, 0xb0, 0xed, 0xa5, 0x22, 0xd8, + 0x6e, 0xe5, 0xc6, 0xf1, 0xe8, 0x00, 0xb6, 0xef, 0x5b, 0xf0, 0x74, 0x8c, 0xdc, 0x6f, 0xb8, 0x7d, + 0xf4, 0xba, 0xfd, 0x32, 0x94, 0x9d, 0xb8, 0x9a, 0x9c, 0x58, 0x46, 0xf8, 0x90, 0x06, 0xa1, 0x89, + 0x17, 0x87, 0x3e, 0x14, 0x4e, 0x18, 0xfa, 0x30, 0x7e, 0x74, 0xe8, 0x83, 0xfd, 0xa3, 0x31, 0xb8, + 0xd8, 0xff, 0x65, 0x6a, 0xc5, 0x19, 0xce, 0x0b, 0xe2, 0x15, 0x98, 0x8e, 0x64, 0x05, 0x63, 0xff, + 0xd4, 0xa1, 0xcc, 0x9b, 0x06, 0x0c, 0x13, 0x98, 0xac, 0x66, 0x43, 0xac, 0x75, 0xf5, 0x86, 0xdf, + 0x55, 0x61, 0x3b, 0xba, 0xe6, 0xb2, 0x01, 0xc3, 0x04, 0xa6, 0xf6, 0x19, 0x1e, 0x3f, 0x75, 0x9f, + 0xe1, 0x3a, 0x5c, 0x50, 0x5e, 0x92, 0xd7, 0xfd, 0x40, 0xfa, 0xff, 0xab, 0x15, 0x64, 0xaa, 0x76, + 0x51, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, 0x5d, 0xd7, 0xfe, 0x7e, 0x01, 0xce, 0xc5, 0xcd, 0xbe, + 0xec, 0x7b, 0x4d, 0x97, 0x3b, 0xda, 0xbc, 0x0a, 0xe3, 0xd1, 0x7e, 0x57, 0x35, 0xf6, 0x5f, 0x54, + 0xe2, 0x6c, 0xee, 0x77, 0x59, 0x6f, 0x3f, 0x99, 0x51, 0x85, 0x9b, 0xce, 0x79, 0x25, 0xb2, 0xa6, + 0x67, 0x87, 0xe8, 0x81, 0x97, 0x92, 0xa3, 0xf9, 0xe1, 0x41, 0x25, 0x23, 0x92, 0x7f, 0x51, 0x53, + 0x4a, 0x8e, 0x79, 0x72, 0x0f, 0x66, 0xda, 0x4e, 0x18, 0xdd, 0xe9, 0x36, 0x9d, 0x88, 0x6e, 0xba, + 0xd2, 0x85, 0xe5, 0x78, 0x21, 0x13, 0xfa, 0xae, 0x7f, 0x2d, 0x41, 0x09, 0x53, 0x94, 0xc9, 0x1e, + 0x10, 0x56, 0xb2, 0x19, 0x38, 0x5e, 0x28, 0xbe, 0x8a, 0xf1, 0x3b, 0x7e, 0xfc, 0x8b, 0x3e, 0x3a, + 0xaf, 0xf5, 0x51, 0xc3, 0x0c, 0x0e, 0xe4, 0x39, 0x98, 0x08, 0xa8, 0x13, 0xea, 0xed, 0x40, 0xcf, + 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x78, 0xc4, 0x84, 0xfa, 0x43, 0x0b, 0x66, 0xe2, + 0x6e, 0x7a, 0x0c, 0xaa, 0x47, 0x27, 0xa9, 0x7a, 0xdc, 0xc8, 0x6b, 0x49, 0x1c, 0xa0, 0x6d, 0xfc, + 0xc9, 0xa4, 0xf9, 0x7d, 0x3c, 0x60, 0xe0, 0x0b, 0x50, 0x52, 0xb3, 0x5a, 0xe9, 0xf4, 0x23, 0x5a, + 0x20, 0x12, 0xda, 0x9e, 0x11, 0xc5, 0x27, 0x99, 0x60, 0xcc, 0x8f, 0xe9, 0x3a, 0x4d, 0xa9, 0xc7, + 0xc8, 0x61, 0xaf, 0x75, 0x1d, 0xa5, 0xdf, 0x64, 0xe9, 0x3a, 0xaa, 0x0e, 0xb9, 0x03, 0x4f, 0x76, + 0x03, 0x9f, 0xc7, 0x92, 0xaf, 0x50, 0xa7, 0xd9, 0x76, 0x3d, 0xaa, 0xcc, 0x3c, 0xc2, 0xd5, 0xe4, + 0xe9, 0xc3, 0x83, 0xca, 0x93, 0x1b, 0xd9, 0x28, 0x38, 0xa8, 0x6e, 0x32, 0x1a, 0x71, 0x7c, 0x88, + 0x68, 0xc4, 0xbf, 0xa1, 0x8d, 0xa9, 0x34, 0x94, 0x31, 0x81, 0x9f, 0xc9, 0xab, 0x2b, 0x33, 0x96, + 0xf5, 0x78, 0x48, 0x55, 0x25, 0x53, 0xd4, 0xec, 0x07, 0x5b, 0xec, 0x26, 0x4e, 0x68, 0xb1, 0x8b, + 0xe3, 0x2e, 0x26, 0x7f, 0x9c, 0x71, 0x17, 0x53, 0x1f, 0xa8, 0x50, 0xcb, 0x6f, 0x5b, 0x70, 0xce, + 0xe9, 0x8f, 0x32, 0xce, 0xc7, 0x78, 0x9c, 0x11, 0xbe, 0x5c, 0x7b, 0x5a, 0x0a, 0x99, 0x15, 0xcc, + 0x8d, 0x59, 0xa2, 0xd8, 0xef, 0x17, 0x61, 0x2e, 0xad, 0x24, 0x9d, 0x7e, 0x38, 0xe6, 0xdf, 0xb2, + 0x60, 0x4e, 0x4d, 0x70, 0xc1, 0x53, 0x1f, 0x31, 0xd6, 0x72, 0x5a, 0x57, 0x84, 0xba, 0xa7, 0xb3, + 0x64, 0x6c, 0xa6, 0xb8, 0x61, 0x1f, 0x7f, 0xf2, 0x36, 0x94, 0xf5, 0xad, 0xca, 0x89, 0x62, 0x33, + 0x79, 0xf8, 0x60, 0x35, 0x26, 0x81, 0x26, 0x3d, 0xf2, 0xbe, 0x05, 0xd0, 0x50, 0x3b, 0xb1, 0x5a, + 0x00, 0xde, 0xcc, 0x6b, 0x01, 0xd0, 0x7b, 0x7c, 0xac, 0xcf, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, + 0x17, 0xf9, 0x7d, 0x8a, 0x1e, 0x09, 0x22, 0xfb, 0xc6, 0xc8, 0x6e, 0xef, 0x47, 0xe8, 0xce, 0xb1, + 0xb6, 0x67, 0x80, 0x42, 0x4c, 0x08, 0x61, 0xbf, 0x0a, 0xda, 0x51, 0x99, 0xad, 0xac, 0xdc, 0x55, + 0x79, 0xc3, 0x89, 0x76, 0xe4, 0x10, 0xd4, 0x2b, 0xeb, 0x75, 0x05, 0xc0, 0x18, 0xc7, 0xfe, 0x1c, + 0xcc, 0xbc, 0x1e, 0x38, 0xdd, 0x1d, 0x97, 0xdf, 0x5b, 0xb0, 0xf3, 0xf1, 0xf3, 0x30, 0xe9, 0x34, + 0x9b, 0x59, 0x09, 0x5d, 0xaa, 0xa2, 0x18, 0x15, 0x7c, 0xa8, 0xa3, 0xb0, 0xfd, 0xbb, 0x16, 0x90, + 0xf8, 0xee, 0xd7, 0xf5, 0x5a, 0xeb, 0x4e, 0xd4, 0xd8, 0x61, 0x47, 0xb8, 0x1d, 0x5e, 0x9a, 0x75, + 0x84, 0xbb, 0xa1, 0x21, 0x68, 0x60, 0x91, 0x77, 0xa1, 0x2c, 0xfe, 0xbd, 0xa5, 0x0f, 0x88, 0xa3, + 0xfb, 0x5b, 0xf3, 0x3d, 0x8f, 0xcb, 0x24, 0x46, 0xe1, 0x8d, 0x98, 0x03, 0x9a, 0xec, 0x58, 0x53, + 0xad, 0x7a, 0xdb, 0xed, 0xde, 0x83, 0xe6, 0x56, 0xdc, 0x54, 0xdd, 0xc0, 0xdf, 0x76, 0xdb, 0x34, + 0xdd, 0x54, 0x1b, 0xa2, 0x18, 0x15, 0x7c, 0xb8, 0xa6, 0xfa, 0x57, 0x16, 0x9c, 0x5f, 0x0d, 0x23, + 0xd7, 0x5f, 0xa1, 0x61, 0xc4, 0x76, 0x3e, 0xb6, 0x3e, 0xf6, 0xda, 0xc3, 0xc4, 0x1c, 0xac, 0xc0, + 0x9c, 0xbc, 0x87, 0xee, 0x6d, 0x85, 0x34, 0x32, 0x8e, 0x1a, 0x7a, 0x1e, 0x2f, 0xa7, 0xe0, 0xd8, + 0x57, 0x83, 0x51, 0x91, 0x17, 0xd2, 0x31, 0x95, 0x42, 0x92, 0x4a, 0x3d, 0x05, 0xc7, 0xbe, 0x1a, + 0xf6, 0xf7, 0x0a, 0x70, 0x8e, 0x7f, 0x46, 0x2a, 0x5e, 0xe8, 0x1b, 0x83, 0xe2, 0x85, 0x46, 0x9c, + 0xca, 0x9c, 0xd7, 0x09, 0xa2, 0x85, 0xfe, 0xa6, 0x05, 0xb3, 0xcd, 0x64, 0x4b, 0xe7, 0x63, 0x97, + 0xcb, 0xea, 0x43, 0xe1, 0x76, 0x97, 0x2a, 0xc4, 0x34, 0x7f, 0xf2, 0x4b, 0x16, 0xcc, 0x26, 0xc5, + 0x54, 0xab, 0xfb, 0x29, 0x34, 0x92, 0xf6, 0x93, 0x4f, 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xbd, + 0x31, 0xd9, 0xa5, 0xa7, 0x11, 0x0c, 0x43, 0xee, 0x43, 0x29, 0x6a, 0x87, 0xa2, 0x50, 0x7e, 0xed, + 0x88, 0x87, 0xd6, 0xcd, 0xb5, 0xba, 0x70, 0x01, 0x89, 0xf5, 0x4a, 0x59, 0xc2, 0xf4, 0x63, 0xc5, + 0x8b, 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x4e, 0xcb, 0x9b, 0xcb, 0x1b, 0x69, 0xc6, 0xb2, 0x84, + 0x31, 0x56, 0xbc, 0xec, 0x5f, 0xb3, 0xa0, 0x74, 0xd3, 0x57, 0xeb, 0xc8, 0xcf, 0xe4, 0x60, 0x8b, + 0xd2, 0x2a, 0xab, 0x56, 0x5a, 0xe2, 0x53, 0xd0, 0x6b, 0x09, 0x4b, 0xd4, 0x33, 0x06, 0xed, 0x45, + 0x9e, 0xd7, 0x8e, 0x91, 0xba, 0xe9, 0x6f, 0x0d, 0x34, 0x1f, 0xff, 0x72, 0x11, 0xce, 0xbc, 0xe1, + 0xec, 0x53, 0x2f, 0x72, 0x8e, 0xbf, 0x49, 0xbc, 0x0c, 0x65, 0xa7, 0xcb, 0xef, 0x32, 0x8d, 0x63, + 0x48, 0x6c, 0xdc, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x88, 0x4c, 0xc9, 0x5a, 0x8a, 0x96, + 0x53, 0x70, 0xec, 0xab, 0x41, 0x6e, 0x02, 0x91, 0x81, 0xd4, 0xd5, 0x46, 0xc3, 0xef, 0x79, 0x62, + 0x49, 0x13, 0x76, 0x1f, 0x7d, 0x1e, 0x5e, 0xef, 0xc3, 0xc0, 0x8c, 0x5a, 0xe4, 0xb3, 0x30, 0xdf, + 0xe0, 0x94, 0xe5, 0xe9, 0xc8, 0xa4, 0x28, 0x4e, 0xc8, 0x3a, 0xd6, 0x63, 0x79, 0x00, 0x1e, 0x0e, + 0xa4, 0xc0, 0x24, 0x0d, 0x23, 0x3f, 0x70, 0x5a, 0xd4, 0xa4, 0x3b, 0x91, 0x94, 0xb4, 0xde, 0x87, + 0x81, 0x19, 0xb5, 0xc8, 0x17, 0xa1, 0x14, 0xed, 0x04, 0x34, 0xdc, 0xf1, 0xdb, 0x4d, 0xe9, 0x7b, + 0x32, 0xa2, 0x31, 0x50, 0xf6, 0xfe, 0xa6, 0xa2, 0x6a, 0x0c, 0x6f, 0x55, 0x84, 0x31, 0x4f, 0x12, + 0xc0, 0x44, 0xd8, 0xf0, 0xbb, 0x34, 0x94, 0xa7, 0x8a, 0x9b, 0xb9, 0x70, 0xe7, 0xc6, 0x2d, 0xc3, + 0x0c, 0xc9, 0x39, 0xa0, 0xe4, 0x64, 0xff, 0xce, 0x18, 0x4c, 0x9b, 0x88, 0x43, 0xac, 0x4d, 0x5f, + 0xb6, 0x60, 0xba, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0x85, 0x89, 0x2d, 0x1f, 0x8d, 0x82, 0x91, 0x5a, + 0xa1, 0x91, 0xe3, 0xb6, 0x0d, 0x6b, 0x9d, 0xc1, 0x06, 0x13, 0x4c, 0xc9, 0xd7, 0x2d, 0x98, 0x8d, + 0x5d, 0x15, 0x63, 0x5b, 0x5f, 0xae, 0x82, 0xe8, 0xa5, 0xfe, 0x5a, 0x92, 0x13, 0xa6, 0x59, 0xdb, + 0x5b, 0x30, 0x97, 0xee, 0x6d, 0xd6, 0x94, 0x5d, 0x47, 0xce, 0xf5, 0x42, 0xdc, 0x94, 0x1b, 0x4e, + 0x18, 0x22, 0x87, 0x90, 0x17, 0x60, 0xaa, 0xe3, 0x04, 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x15, 0x0b, + 0xc6, 0x82, 0x24, 0xcb, 0x51, 0x63, 0xd8, 0x1f, 0x83, 0xe9, 0x75, 0xc7, 0x6b, 0xd1, 0xa6, 0x5c, + 0x87, 0x1f, 0x1d, 0x8e, 0xf9, 0xc7, 0xe3, 0x50, 0x36, 0x8e, 0x8f, 0xa7, 0x7f, 0xce, 0x4a, 0x24, + 0x9b, 0x29, 0xe4, 0x98, 0x6c, 0xe6, 0xd3, 0x00, 0xdb, 0xae, 0xe7, 0x86, 0x3b, 0x27, 0x4c, 0x63, + 0xc3, 0xef, 0xe6, 0xaf, 0x6b, 0x0a, 0x68, 0x50, 0x8b, 0x2f, 0x40, 0x8b, 0x47, 0x64, 0x84, 0x7b, + 0xdf, 0x32, 0xb6, 0x9b, 0x89, 0x3c, 0x1c, 0x3e, 0x8c, 0x8e, 0x59, 0x54, 0xdb, 0x8f, 0xb8, 0x9b, + 0x3a, 0x6a, 0x57, 0xda, 0x84, 0xa9, 0x80, 0x86, 0xbd, 0x0e, 0x3d, 0x51, 0xc2, 0x19, 0xee, 0x7a, + 0x83, 0xb2, 0x3e, 0x6a, 0x4a, 0x0b, 0xaf, 0xc2, 0x99, 0x84, 0x08, 0xc7, 0xba, 0x61, 0xf2, 0x21, + 0xd3, 0x46, 0x71, 0x92, 0xfb, 0x26, 0xd6, 0x17, 0x6d, 0x23, 0xd1, 0x8c, 0xee, 0x0b, 0xe1, 0x60, + 0x25, 0x60, 0xf6, 0x8f, 0x26, 0x40, 0xfa, 0x30, 0x0c, 0xb1, 0x5c, 0x99, 0x37, 0x97, 0x63, 0x27, + 0xb8, 0xb9, 0xbc, 0x09, 0xd3, 0xae, 0xe7, 0x46, 0xae, 0xd3, 0xe6, 0xf6, 0x27, 0xb9, 0x9d, 0x2a, + 0x0f, 0xf4, 0xe9, 0x55, 0x03, 0x96, 0x41, 0x27, 0x51, 0x97, 0xbc, 0x09, 0x45, 0xbe, 0xdf, 0xc8, + 0x01, 0x7c, 0x7c, 0x47, 0x0b, 0xee, 0x63, 0x23, 0xc2, 0xd2, 0x04, 0x25, 0x7e, 0xf8, 0x10, 0x99, + 0x76, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, 0xdb, + 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0x26, 0x92, 0x54, 0xae, 0xa7, 0xe0, 0xd8, 0x57, 0x83, 0x6c, + 0xc3, 0xb4, 0x2c, 0x13, 0x6e, 0x73, 0x93, 0x27, 0xfc, 0x4a, 0xee, 0x1e, 0x79, 0xdd, 0xa0, 0x84, + 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0xf7, 0x68, 0x1c, + 0x13, 0x76, 0x12, 0x66, 0x17, 0x0e, 0x0f, 0x2a, 0x67, 0x57, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf9, + 0x92, 0x05, 0x17, 0x1a, 0xbe, 0x17, 0xf2, 0xd4, 0x15, 0x7b, 0xf4, 0x5a, 0x10, 0xf8, 0x81, 0xe0, + 0x5d, 0x3a, 0x21, 0x6f, 0x6e, 0xf6, 0x5c, 0xce, 0x22, 0x89, 0xd9, 0x9c, 0xc8, 0x3b, 0x30, 0xd5, + 0x0d, 0xfc, 0x3d, 0xb7, 0x49, 0x03, 0xe9, 0x82, 0xb9, 0x96, 0x47, 0x2a, 0x9d, 0x0d, 0x49, 0x33, + 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, 0x29, 0xc3, 0x4c, 0x12, 0x9d, 0xfc, 0x1c, 0x40, + 0x37, 0xf0, 0x3b, 0x34, 0xda, 0xa1, 0x3a, 0xb6, 0xe7, 0xd6, 0xa8, 0x19, 0x5b, 0x14, 0x3d, 0xe5, + 0xb6, 0xc4, 0x96, 0x8b, 0xb8, 0x14, 0x0d, 0x8e, 0x24, 0x80, 0xc9, 0x5d, 0xb1, 0xed, 0x4a, 0x2d, + 0xe4, 0x8d, 0x5c, 0x74, 0x26, 0xc9, 0x99, 0x07, 0xa5, 0xc8, 0x22, 0x54, 0x8c, 0xc8, 0x16, 0x14, + 0xee, 0xd3, 0xad, 0x7c, 0xd2, 0x05, 0xdc, 0xa5, 0xf2, 0x34, 0x53, 0x9b, 0x3c, 0x3c, 0xa8, 0x14, + 0xee, 0xd2, 0x2d, 0x64, 0xc4, 0xd9, 0x77, 0x35, 0x85, 0xef, 0x82, 0x5c, 0x2a, 0xde, 0xc8, 0xd1, + 0x11, 0x42, 0x7c, 0x97, 0x2c, 0x42, 0xc5, 0x88, 0xbc, 0x03, 0xa5, 0xfb, 0xce, 0x1e, 0xdd, 0x0e, + 0x7c, 0x2f, 0x92, 0xbe, 0x72, 0x23, 0x86, 0x7b, 0xdc, 0x55, 0xe4, 0x24, 0x5f, 0xbe, 0xbd, 0xeb, + 0x42, 0x8c, 0xd9, 0x91, 0x3d, 0x98, 0xf2, 0xe8, 0x7d, 0xa4, 0x6d, 0xb7, 0x91, 0x4f, 0x78, 0xc5, + 0x2d, 0x49, 0x4d, 0x72, 0xe6, 0xfb, 0x9e, 0x2a, 0x43, 0xcd, 0x8b, 0xf5, 0xe5, 0x3d, 0x7f, 0x4b, + 0x2e, 0x54, 0x23, 0xf6, 0xa5, 0x3e, 0x99, 0x8a, 0xbe, 0xbc, 0xe9, 0x6f, 0x21, 0x23, 0xce, 0xe6, + 0x48, 0x43, 0x3b, 0x6a, 0xc9, 0x65, 0xea, 0x56, 0xbe, 0x0e, 0x6a, 0x62, 0x8e, 0xc4, 0xa5, 0x68, + 0x70, 0x64, 0x6d, 0xdb, 0x92, 0xc6, 0x4a, 0xb9, 0x50, 0x8d, 0xd8, 0xb6, 0x49, 0xd3, 0xa7, 0x68, + 0x5b, 0x55, 0x86, 0x9a, 0x17, 0xe3, 0xeb, 0x4a, 0xcb, 0x5f, 0x3e, 0x4b, 0x55, 0xd2, 0x8e, 0x28, + 0xf8, 0xaa, 0x32, 0xd4, 0xbc, 0x58, 0x7b, 0x87, 0xbb, 0xfb, 0xf7, 0x9d, 0xf6, 0xae, 0xeb, 0xb5, + 0x64, 0xac, 0xea, 0xa8, 0x59, 0xa7, 0x77, 0xf7, 0xef, 0x0a, 0x7a, 0x66, 0x7b, 0xc7, 0xa5, 0x68, + 0x70, 0x24, 0x7f, 0xcf, 0x82, 0x89, 0x6e, 0xbb, 0xd7, 0x72, 0xbd, 0xf9, 0xe9, 0x3c, 0x9c, 0x98, + 0x92, 0x4b, 0xee, 0xe2, 0x06, 0x27, 0x2d, 0x14, 0xc5, 0x9f, 0xd4, 0x7e, 0x97, 0xbc, 0xf0, 0x6b, + 0x7f, 0x54, 0x99, 0xa7, 0x5e, 0xc3, 0x6f, 0xba, 0x5e, 0x6b, 0xe9, 0x5e, 0xe8, 0x7b, 0x8b, 0xe8, + 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xe1, 0x13, 0x50, 0x36, 0x48, 0x3c, 0x4a, 0xd1, 0x9b, 0x36, + 0x15, 0xbd, 0x5f, 0x9b, 0x80, 0x69, 0x33, 0xd7, 0xe4, 0x10, 0xda, 0x97, 0x3e, 0x71, 0x8c, 0x1d, + 0xe7, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0x05, 0x97, 0x32, 0x6f, 0xad, 0xe6, 0xa6, 0x70, 0xc7, 0x47, + 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x63, 0xf8, 0xbc, 0x30, 0xb5, 0x55, 0x28, 0x76, 0xc5, 0xa4, + 0xda, 0x9a, 0x50, 0xd5, 0xae, 0x02, 0xc4, 0x49, 0x11, 0xe5, 0xc5, 0xa7, 0xd6, 0x87, 0x8d, 0x64, + 0x8d, 0x06, 0x16, 0x79, 0x0e, 0x26, 0x98, 0xea, 0x43, 0x9b, 0x32, 0x94, 0x5e, 0x9f, 0xe3, 0xaf, + 0xf3, 0x52, 0x94, 0x50, 0xf2, 0x0a, 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0xc8, 0x9f, 0x8f, 0xb5, + 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, 0xd1, 0xb9, 0xd2, + 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, 0x4a, 0xc1, 0xb1, + 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x67, 0x5b, 0x16, 0x0e, 0xd3, 0x03, 0x6e, 0x5b, 0xbf, 0x62, 0x9e, + 0xb5, 0x72, 0x9c, 0x43, 0x62, 0xd4, 0x0e, 0x7f, 0xd8, 0x1a, 0xed, 0x58, 0xf4, 0x39, 0x98, 0x49, + 0xee, 0x42, 0xb9, 0xdf, 0x7c, 0x7c, 0x75, 0x1c, 0xce, 0xdd, 0x6a, 0xb9, 0x5e, 0x3a, 0xd1, 0x59, + 0x56, 0x12, 0x7f, 0xeb, 0xd8, 0x49, 0xfc, 0x75, 0x4c, 0x9e, 0x4c, 0x91, 0x9f, 0x1d, 0x93, 0xa7, + 0xde, 0x2b, 0x48, 0xe2, 0x92, 0x3f, 0xb4, 0xe0, 0x19, 0xa7, 0x29, 0xce, 0x05, 0x4e, 0x5b, 0x96, + 0x1a, 0xb9, 0xa7, 0xe5, 0x8c, 0x0e, 0x47, 0xdc, 0xe5, 0xfb, 0x3f, 0x7e, 0xb1, 0x7a, 0x04, 0x57, + 0xd1, 0xe3, 0x3f, 0x21, 0xbf, 0xe0, 0x99, 0xa3, 0x50, 0xf1, 0x48, 0xf1, 0xc9, 0x5f, 0x81, 0xd9, + 0xc4, 0x07, 0x4b, 0x4b, 0x78, 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xe3, 0x2e, 0xdc, 0x86, + 0x0f, 0x3f, 0x52, 0xce, 0x63, 0x0d, 0xb6, 0xef, 0x5a, 0x30, 0x6d, 0xe6, 0x24, 0x22, 0x2f, 0xc0, + 0x54, 0xe4, 0xef, 0x52, 0xef, 0x4e, 0xa0, 0x1c, 0x76, 0xf5, 0x40, 0xdf, 0xe4, 0xe5, 0xb8, 0x86, + 0x1a, 0x83, 0x61, 0x37, 0xda, 0x2e, 0xf5, 0xa2, 0xd5, 0xa6, 0xec, 0x66, 0x8d, 0xbd, 0x2c, 0xca, + 0x57, 0x50, 0x63, 0x08, 0x1f, 0x3b, 0xf6, 0xbb, 0x4e, 0x1b, 0x01, 0x55, 0xee, 0xfd, 0x86, 0x8f, + 0x5d, 0x0c, 0xc3, 0x04, 0x26, 0xb1, 0xb5, 0x89, 0x73, 0x3c, 0xbe, 0xd7, 0x48, 0x99, 0x24, 0x7f, + 0xd3, 0x82, 0x92, 0x30, 0xd1, 0x23, 0xdd, 0x4e, 0xb9, 0xd8, 0xa6, 0x8c, 0x08, 0xd5, 0x8d, 0xd5, + 0x2c, 0x17, 0xdb, 0xcb, 0x30, 0xbe, 0xeb, 0x7a, 0xea, 0x4b, 0xf4, 0xb6, 0xf4, 0x86, 0xeb, 0x35, + 0x91, 0x43, 0xf4, 0xc6, 0x55, 0x18, 0xb8, 0x71, 0x2d, 0x41, 0x49, 0x3b, 0x9e, 0xc8, 0xe5, 0x5f, + 0x5b, 0x6f, 0xb5, 0xa3, 0x0a, 0xc6, 0x38, 0xf6, 0xaf, 0x58, 0x30, 0xc3, 0x63, 0xb8, 0xe3, 0xf3, + 0xf0, 0xcb, 0xda, 0x17, 0x4c, 0xc8, 0x7d, 0x31, 0xe9, 0x0b, 0xf6, 0xf0, 0xa0, 0x52, 0x16, 0x51, + 0xdf, 0x49, 0xd7, 0xb0, 0xcf, 0x48, 0x23, 0x1a, 0xf7, 0x58, 0x1b, 0x3b, 0xb6, 0x8d, 0x27, 0x16, + 0x53, 0x11, 0xc1, 0x98, 0x9e, 0xfd, 0x2e, 0x4c, 0x9b, 0xc1, 0x58, 0xe4, 0x65, 0x28, 0x77, 0x5d, + 0xaf, 0x95, 0x0c, 0xda, 0xd5, 0x17, 0x0d, 0x1b, 0x31, 0x08, 0x4d, 0x3c, 0x5e, 0xcd, 0x8f, 0xab, + 0xa5, 0xee, 0x27, 0x36, 0x7c, 0xb3, 0x5a, 0xfc, 0x87, 0xe7, 0xfd, 0xcf, 0x08, 0xfa, 0xcb, 0x3d, + 0xef, 0x7f, 0x06, 0x8f, 0x1f, 0x5f, 0xde, 0xff, 0x2c, 0x61, 0xfe, 0x6c, 0xe5, 0xfd, 0xff, 0x69, + 0x38, 0x6e, 0x4e, 0x54, 0xb6, 0xd7, 0xdf, 0x37, 0x13, 0x2b, 0xe8, 0x16, 0x97, 0x99, 0x15, 0x24, + 0xd4, 0xfe, 0x4e, 0x01, 0xe6, 0xd2, 0x47, 0xfe, 0xbc, 0xbd, 0x29, 0xc8, 0xd7, 0x2d, 0x98, 0x71, + 0x12, 0xf9, 0xe7, 0x72, 0x7a, 0x44, 0x28, 0x41, 0xd3, 0xc8, 0x7f, 0x96, 0x28, 0xc7, 0x14, 0x6f, + 0xf2, 0x17, 0x60, 0x32, 0x72, 0x3b, 0xd4, 0xef, 0x09, 0x43, 0x60, 0x41, 0x1c, 0xc8, 0x37, 0x45, + 0x11, 0x2a, 0x18, 0x5b, 0x94, 0x5d, 0xae, 0x41, 0x05, 0x54, 0x7a, 0x06, 0xcf, 0xc5, 0x96, 0x4b, + 0x51, 0x8e, 0x1a, 0x83, 0x3c, 0x80, 0x49, 0xe1, 0x77, 0xa1, 0x1c, 0x6c, 0xd6, 0x73, 0x32, 0x4d, + 0x08, 0xd7, 0x8e, 0xb8, 0x0b, 0xc4, 0xff, 0x10, 0x15, 0x3b, 0xfb, 0x63, 0x70, 0xcc, 0x24, 0xb1, + 0xf6, 0x35, 0x20, 0xe8, 0xb7, 0xdb, 0x5b, 0x4e, 0x63, 0xf7, 0xae, 0xeb, 0x35, 0xfd, 0xfb, 0x7c, + 0x29, 0x5a, 0x82, 0x52, 0x20, 0x43, 0x66, 0x43, 0x39, 0x6a, 0xf4, 0x5a, 0xa6, 0x62, 0x69, 0x43, + 0x8c, 0x71, 0xec, 0xdf, 0x1b, 0x83, 0x49, 0x19, 0xdf, 0xfd, 0x18, 0x22, 0x13, 0x76, 0x13, 0xf7, + 0xc1, 0xab, 0xb9, 0x84, 0xa5, 0x0f, 0x0c, 0x4b, 0x08, 0x53, 0x61, 0x09, 0x6f, 0xe4, 0xc3, 0xee, + 0xe8, 0x98, 0x84, 0x7f, 0x5d, 0x84, 0xd9, 0x54, 0xbc, 0x3c, 0xd3, 0xc5, 0xfb, 0x5c, 0x71, 0xef, + 0xe4, 0x1a, 0x92, 0xaf, 0x63, 0x91, 0x8e, 0xf6, 0xca, 0x0d, 0x13, 0x29, 0xbd, 0xf3, 0xf3, 0x65, + 0xfc, 0xf3, 0xec, 0xde, 0x79, 0x79, 0x99, 0x16, 0x3f, 0x38, 0x5e, 0xa6, 0xff, 0xc5, 0x82, 0xa7, + 0x06, 0x66, 0x7e, 0xe0, 0x89, 0xc3, 0x82, 0x24, 0x54, 0xae, 0x19, 0x39, 0xe7, 0xb7, 0xd1, 0xf7, + 0xc7, 0xe9, 0x5c, 0x4f, 0x69, 0xf6, 0xe4, 0x25, 0x98, 0xe6, 0x3a, 0x1a, 0x5b, 0x3d, 0x23, 0xda, + 0x95, 0xd7, 0x5f, 0xfc, 0x22, 0xa4, 0x6e, 0x94, 0x63, 0x02, 0xcb, 0xfe, 0xb6, 0x05, 0xf3, 0x83, + 0xd2, 0x48, 0x0d, 0x61, 0x9c, 0xf9, 0xcb, 0xa9, 0xe8, 0x8e, 0x4a, 0x5f, 0x74, 0x47, 0xca, 0x3c, + 0xa3, 0x02, 0x39, 0x0c, 0xcb, 0x48, 0xe1, 0x11, 0xc1, 0x0b, 0xdf, 0xb0, 0xe0, 0xc9, 0x01, 0x13, + 0xbe, 0x2f, 0xca, 0xc7, 0x3a, 0x71, 0x94, 0xcf, 0xd8, 0xb0, 0x51, 0x3e, 0xf6, 0xef, 0x17, 0x60, + 0x4e, 0xca, 0x13, 0x2b, 0xea, 0xaf, 0x24, 0x62, 0x64, 0x7e, 0x22, 0x15, 0x23, 0x73, 0x3e, 0x8d, + 0xff, 0xe7, 0x01, 0x32, 0x1f, 0xac, 0x00, 0x99, 0xaf, 0x15, 0xe1, 0x42, 0x66, 0x76, 0x2b, 0xf2, + 0xd5, 0x8c, 0xdd, 0xeb, 0x6e, 0xce, 0x69, 0xb4, 0x86, 0xdc, 0xbf, 0x46, 0x8d, 0x2a, 0xf9, 0x25, + 0x33, 0x9a, 0x43, 0xec, 0x46, 0xdb, 0xa7, 0x90, 0x10, 0xec, 0xb8, 0x81, 0x1d, 0x8f, 0xf7, 0xc9, + 0xab, 0x3f, 0x03, 0x5b, 0xcf, 0xd7, 0x0a, 0x70, 0x65, 0xd8, 0x96, 0xfd, 0x80, 0x46, 0x42, 0x86, + 0x89, 0x48, 0xc8, 0xc7, 0xa4, 0x6a, 0x9d, 0x4a, 0x50, 0xe4, 0x3f, 0x18, 0xd7, 0x7a, 0x40, 0xff, + 0x84, 0x1d, 0xca, 0x79, 0x64, 0x92, 0xa9, 0xe3, 0x2a, 0x53, 0x7a, 0xbc, 0x37, 0x4c, 0xd6, 0x45, + 0xf1, 0xc3, 0x83, 0xca, 0xd9, 0x38, 0xe9, 0x8c, 0x2c, 0x44, 0x55, 0x89, 0x5c, 0x81, 0xa9, 0x40, + 0x40, 0x55, 0xec, 0x97, 0xf4, 0xc0, 0x11, 0x65, 0xa8, 0xa1, 0xe4, 0x8b, 0xc6, 0xf9, 0x65, 0xfc, + 0xb4, 0x72, 0x2b, 0x1d, 0xe5, 0x58, 0xf4, 0x36, 0x4c, 0x85, 0x2a, 0x9d, 0xb7, 0x98, 0x4e, 0x2f, + 0x0e, 0x19, 0x52, 0xe8, 0x6c, 0xd1, 0xb6, 0xca, 0xed, 0x2d, 0xbe, 0x4f, 0x67, 0xfe, 0xd6, 0x24, + 0x89, 0xad, 0xed, 0x01, 0xe2, 0xe2, 0x03, 0xfa, 0x6d, 0x01, 0x24, 0x82, 0x49, 0xf9, 0x84, 0xad, + 0xbc, 0x91, 0x5d, 0xcf, 0x29, 0x36, 0x47, 0x7a, 0x6e, 0xf3, 0x63, 0xb6, 0xb2, 0x4b, 0x29, 0x56, + 0xf6, 0xf7, 0x2d, 0x28, 0xcb, 0x31, 0xf2, 0x18, 0x62, 0x2b, 0xef, 0x25, 0x63, 0x2b, 0xaf, 0xe5, + 0xb2, 0x84, 0x0f, 0x08, 0xac, 0xbc, 0x07, 0xd3, 0x66, 0x9e, 0x49, 0xf2, 0x69, 0x63, 0x0b, 0xb2, + 0x46, 0xc9, 0xdc, 0xa6, 0x36, 0xa9, 0x78, 0x7b, 0xb2, 0x7f, 0xbd, 0xa4, 0x5b, 0x91, 0x1f, 0xe6, + 0xcd, 0x91, 0x6f, 0x1d, 0x39, 0xf2, 0xcd, 0x81, 0x37, 0x96, 0xff, 0xc0, 0x7b, 0x13, 0xa6, 0xd4, + 0xb2, 0x28, 0xb5, 0xa9, 0x67, 0x4d, 0x57, 0x6e, 0xa6, 0x92, 0x31, 0x62, 0xc6, 0x74, 0xe1, 0x87, + 0xf2, 0xd8, 0x5a, 0xae, 0x96, 0x6b, 0x4d, 0x86, 0xbc, 0x03, 0xe5, 0xfb, 0x7e, 0xb0, 0xdb, 0xf6, + 0x1d, 0xfe, 0x86, 0x02, 0xe4, 0xe1, 0x3d, 0xa0, 0x2d, 0xde, 0x22, 0x9e, 0xe6, 0x6e, 0x4c, 0x1f, + 0x4d, 0x66, 0xa4, 0x0a, 0xb3, 0x1d, 0xd7, 0x43, 0xea, 0x34, 0x75, 0x08, 0xe5, 0xb8, 0xc8, 0x5f, + 0xae, 0xce, 0x1a, 0xeb, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0x35, 0x2c, 0x48, 0x98, 0x5f, 0x64, 0x92, + 0xe2, 0x8d, 0xd1, 0x07, 0x63, 0xd2, 0xa4, 0x23, 0x02, 0x4a, 0x92, 0xe5, 0x98, 0xe2, 0x4d, 0xbe, + 0x00, 0x53, 0xa1, 0x7a, 0x1c, 0xb2, 0x98, 0xe3, 0x29, 0x4c, 0x3f, 0x10, 0xa9, 0xbb, 0x52, 0xbf, + 0x10, 0xa9, 0x19, 0x92, 0x35, 0x38, 0xaf, 0xec, 0x49, 0x89, 0x77, 0xee, 0x26, 0xe2, 0x9c, 0x63, + 0x98, 0x01, 0xc7, 0xcc, 0x5a, 0x4c, 0xb7, 0xe5, 0xf9, 0x5b, 0xc5, 0x6d, 0xad, 0x71, 0xc1, 0xc9, + 0xe7, 0x5f, 0x13, 0x25, 0xf4, 0xa8, 0x08, 0xe1, 0xa9, 0x11, 0x22, 0x84, 0xeb, 0x70, 0x21, 0x0d, + 0xe2, 0xc9, 0xe4, 0x78, 0xfe, 0x3a, 0x63, 0x0b, 0xdd, 0xc8, 0x42, 0xc2, 0xec, 0xba, 0xe4, 0x2e, + 0x94, 0x02, 0xca, 0x4f, 0x9d, 0x55, 0xe5, 0xe8, 0x76, 0x6c, 0x97, 0x5e, 0x54, 0x04, 0x30, 0xa6, + 0xc5, 0xfa, 0xdd, 0x49, 0x66, 0x14, 0x7f, 0x33, 0xc7, 0xd7, 0xa3, 0x65, 0xdf, 0x0f, 0x48, 0xf2, + 0x68, 0xff, 0xdb, 0x59, 0x38, 0x93, 0x30, 0x8a, 0x91, 0x67, 0xa1, 0xc8, 0xb3, 0xeb, 0xf1, 0xd5, + 0x6a, 0x2a, 0x5e, 0x51, 0x45, 0xe3, 0x08, 0x18, 0xf9, 0x05, 0x0b, 0x66, 0xbb, 0x89, 0x4b, 0x1e, + 0xb5, 0x90, 0x8f, 0x68, 0x49, 0x4e, 0xde, 0x1c, 0x19, 0x6f, 0x71, 0x24, 0x99, 0x61, 0x9a, 0x3b, + 0x5b, 0x0f, 0xa4, 0x5f, 0x7c, 0x9b, 0x06, 0x1c, 0x5b, 0x2a, 0x7a, 0x9a, 0xc4, 0x72, 0x12, 0x8c, + 0x69, 0x7c, 0xd6, 0xc3, 0xfc, 0xeb, 0x46, 0x79, 0x21, 0xb4, 0xaa, 0x08, 0x60, 0x4c, 0x8b, 0xbc, + 0x06, 0x33, 0x32, 0x91, 0xf4, 0x86, 0xdf, 0xbc, 0xe1, 0x84, 0x3b, 0xf2, 0xc8, 0xa7, 0x8f, 0xa8, + 0xcb, 0x09, 0x28, 0xa6, 0xb0, 0xf9, 0xb7, 0xc5, 0xd9, 0xba, 0x39, 0x81, 0x89, 0xe4, 0x53, 0x25, + 0xcb, 0x49, 0x30, 0xa6, 0xf1, 0xc9, 0x0b, 0xc6, 0x36, 0x24, 0x3c, 0x28, 0xf4, 0x6a, 0x90, 0xb1, + 0x15, 0x55, 0x61, 0xb6, 0xc7, 0x4f, 0xc8, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, 0xbc, 0x93, 0x04, + 0x63, 0x1a, 0x9f, 0xbc, 0x0a, 0x67, 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xc2, 0xad, 0x42, 0xdf, 0x9a, + 0xa3, 0x09, 0xc4, 0x24, 0x2e, 0x79, 0x1d, 0xce, 0xc6, 0x79, 0x57, 0x15, 0x01, 0xe1, 0x67, 0xa1, + 0x93, 0x00, 0x56, 0xd3, 0x08, 0xd8, 0x5f, 0x87, 0xfc, 0x35, 0x98, 0x33, 0x5a, 0x62, 0xd5, 0x6b, + 0xd2, 0x07, 0x32, 0x37, 0x26, 0x7f, 0x7a, 0x6b, 0x39, 0x05, 0xc3, 0x3e, 0x6c, 0xf2, 0x49, 0x98, + 0x69, 0xf8, 0xed, 0x36, 0x5f, 0xe3, 0xc4, 0x33, 0x19, 0x22, 0x09, 0xa6, 0x48, 0x17, 0x9a, 0x80, + 0x60, 0x0a, 0x93, 0xdc, 0x04, 0xe2, 0x6f, 0x31, 0xf5, 0x8a, 0x36, 0x5f, 0xa7, 0x1e, 0x95, 0x1a, + 0xc7, 0x99, 0x64, 0x54, 0xce, 0xed, 0x3e, 0x0c, 0xcc, 0xa8, 0xc5, 0x73, 0x08, 0x1a, 0x51, 0xcc, + 0x33, 0x79, 0x3c, 0x67, 0x99, 0xb6, 0xe7, 0x3c, 0x32, 0x84, 0x39, 0x80, 0x09, 0x11, 0x24, 0x95, + 0x4f, 0x36, 0x4c, 0x33, 0x63, 0x7e, 0xbc, 0x47, 0x88, 0x52, 0x94, 0x9c, 0xc8, 0xcf, 0x41, 0x69, + 0x4b, 0x3d, 0x9f, 0xc2, 0x53, 0x60, 0x8e, 0xbc, 0x2f, 0xa6, 0x5e, 0x02, 0x8a, 0xed, 0x15, 0x1a, + 0x80, 0x31, 0x4b, 0xf2, 0x1c, 0x94, 0x6f, 0x6c, 0x54, 0xf5, 0x28, 0x3c, 0xcb, 0x7b, 0x7f, 0x9c, + 0x55, 0x41, 0x13, 0xc0, 0x66, 0x98, 0x56, 0xdf, 0x48, 0xd2, 0x75, 0x20, 0x43, 0x1b, 0x63, 0xd8, + 0xdc, 0x17, 0x02, 0xeb, 0xf3, 0xe7, 0x52, 0xd8, 0xb2, 0x1c, 0x35, 0x06, 0x79, 0x1b, 0xca, 0x72, + 0xbf, 0xe0, 0x6b, 0xd3, 0xf9, 0x93, 0x45, 0xc8, 0x63, 0x4c, 0x02, 0x4d, 0x7a, 0xfc, 0x12, 0x9b, + 0xbf, 0x2a, 0x41, 0xaf, 0xf7, 0xda, 0xed, 0xf9, 0x0b, 0x7c, 0xdd, 0x8c, 0x2f, 0xb1, 0x63, 0x10, + 0x9a, 0x78, 0xe4, 0x45, 0xe5, 0xd3, 0xf6, 0x44, 0xe2, 0x56, 0x5f, 0xfb, 0xb4, 0x69, 0xa5, 0x7b, + 0x40, 0x10, 0xcd, 0x93, 0x8f, 0x70, 0x26, 0xdb, 0x82, 0x05, 0xa5, 0xf1, 0xf5, 0x4f, 0x92, 0xf9, + 0xf9, 0x84, 0xed, 0x68, 0xe1, 0xee, 0x40, 0x4c, 0x3c, 0x82, 0x0a, 0xd9, 0x82, 0x82, 0xd3, 0xde, + 0x9a, 0x7f, 0x2a, 0x0f, 0xd5, 0xb5, 0xba, 0x56, 0x93, 0x23, 0x8a, 0x3b, 0xbe, 0x56, 0xd7, 0x6a, + 0xc8, 0x88, 0x13, 0x17, 0xc6, 0x9d, 0xf6, 0x56, 0x38, 0xbf, 0xc0, 0xe7, 0x6c, 0x6e, 0x4c, 0x62, + 0xe3, 0xc1, 0x5a, 0x2d, 0x44, 0xce, 0xc2, 0xfe, 0xd2, 0x98, 0xbe, 0xb9, 0xd2, 0x09, 0xc9, 0xdf, + 0x35, 0x27, 0x90, 0x38, 0xee, 0xdc, 0xce, 0x6d, 0x02, 0x49, 0xf5, 0xe2, 0xcc, 0xc0, 0xe9, 0xd3, + 0xd5, 0x4b, 0x46, 0x2e, 0x99, 0xcc, 0x92, 0xc9, 0xd6, 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xdf, + 0x01, 0x6d, 0x05, 0x4d, 0xf9, 0x83, 0x05, 0x50, 0x74, 0xc3, 0xc8, 0xf5, 0x73, 0x0c, 0x1c, 0x4f, + 0x65, 0x29, 0xe7, 0x71, 0x29, 0x1c, 0x80, 0x82, 0x15, 0xe3, 0xe9, 0xb5, 0x5c, 0xef, 0x81, 0xfc, + 0xfc, 0x37, 0x73, 0x77, 0xf4, 0x12, 0x3c, 0x39, 0x00, 0x05, 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, + 0x1e, 0x7d, 0x5d, 0x5d, 0xab, 0xa5, 0xf8, 0x25, 0x07, 0xf7, 0x3d, 0x28, 0x84, 0x1d, 0x57, 0xaa, + 0x4b, 0x23, 0xf2, 0xaa, 0xaf, 0xaf, 0x66, 0xf1, 0xaa, 0xaf, 0xaf, 0x22, 0x63, 0x42, 0xbe, 0x62, + 0x01, 0x38, 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0xb6, 0xce, 0x8c, 0xf8, 0xfa, 0x48, 0x55, 0xd3, + 0x4b, 0xb1, 0xe6, 0xae, 0xcd, 0x31, 0x14, 0x0d, 0xce, 0xe4, 0x1d, 0x98, 0x74, 0xc4, 0xf3, 0x8e, + 0xd2, 0x4b, 0x3f, 0x9f, 0x37, 0x4b, 0x53, 0x12, 0x70, 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, + 0x47, 0x81, 0x43, 0xb7, 0xdd, 0x5d, 0x69, 0x1c, 0xaa, 0x8f, 0xfc, 0x00, 0x09, 0x23, 0x96, 0xc5, + 0x5b, 0x82, 0x50, 0x31, 0x14, 0xaf, 0xf9, 0x3b, 0x9e, 0xa3, 0x63, 0x2f, 0xf3, 0x89, 0xd0, 0x35, + 0xa3, 0x39, 0x8d, 0xd7, 0xfc, 0x4d, 0x46, 0x98, 0xe4, 0x4b, 0xf6, 0x60, 0xc2, 0xe1, 0x0f, 0xcf, + 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x88, 0x6d, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x9f, 0xb7, 0x95, 0xdc, + 0xc8, 0xaf, 0x5a, 0x30, 0x29, 0x1c, 0xc8, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x73, 0xa7, 0xf0, 0xda, + 0x81, 0x74, 0x6e, 0x97, 0x2e, 0x51, 0x1f, 0xd1, 0xde, 0xb1, 0xa2, 0xf4, 0x48, 0xf7, 0x76, 0x25, + 0xdd, 0xc2, 0x27, 0x61, 0xda, 0xa4, 0x72, 0x2c, 0x07, 0xf7, 0x1f, 0x16, 0x00, 0x78, 0x43, 0x8b, + 0x6c, 0x2b, 0x1d, 0x9e, 0x9a, 0x79, 0xc7, 0x6f, 0xe6, 0xf4, 0x48, 0xa5, 0x91, 0x34, 0x05, 0x64, + 0x1e, 0xe6, 0x1d, 0xbf, 0x89, 0x92, 0x09, 0x69, 0xc1, 0x78, 0xd7, 0x89, 0x76, 0xf2, 0xcf, 0xd0, + 0x32, 0x25, 0xc2, 0x8e, 0xa3, 0x1d, 0xe4, 0x0c, 0xc8, 0x7b, 0x56, 0xec, 0x2b, 0x54, 0xc8, 0xc7, + 0xa3, 0x43, 0xb5, 0xd9, 0xa2, 0xf4, 0x0e, 0x4a, 0x25, 0x59, 0x4d, 0xfb, 0x0c, 0x2d, 0xbc, 0x6f, + 0xc1, 0xb4, 0x89, 0x9a, 0xd1, 0x4d, 0x3f, 0x6b, 0x76, 0x53, 0x9e, 0xed, 0x61, 0xf6, 0xf8, 0x7f, + 0xb3, 0x00, 0xb0, 0xe7, 0xd5, 0x7b, 0x9d, 0x0e, 0x53, 0xba, 0xb5, 0x1f, 0xbf, 0x35, 0xb4, 0x1f, + 0xff, 0xd8, 0x31, 0xfd, 0xf8, 0x0b, 0xc7, 0xf2, 0xe3, 0x1f, 0x3f, 0xbe, 0x1f, 0x7f, 0x71, 0xb0, + 0x1f, 0xbf, 0xfd, 0x4d, 0x0b, 0xce, 0xf6, 0xed, 0x36, 0x4c, 0x0f, 0x0e, 0x7c, 0x3f, 0x1a, 0xe0, + 0x03, 0x8a, 0x31, 0x08, 0x4d, 0x3c, 0xb2, 0x02, 0x73, 0xf2, 0x21, 0x92, 0x7a, 0xb7, 0xed, 0x66, + 0x66, 0xcf, 0xd9, 0x4c, 0xc1, 0xb1, 0xaf, 0x86, 0xfd, 0x1d, 0x0b, 0xca, 0x46, 0xcc, 0x3d, 0xfb, + 0x0e, 0xee, 0x08, 0x2c, 0xc5, 0x88, 0xdf, 0x60, 0xe1, 0x17, 0x55, 0x02, 0x26, 0x2e, 0x91, 0x5b, + 0x46, 0x9a, 0xfa, 0xf8, 0x12, 0x99, 0x95, 0xa2, 0x84, 0x8a, 0x04, 0xe4, 0xb4, 0xcb, 0x1b, 0xbd, + 0x60, 0x26, 0x20, 0xa7, 0x5d, 0xe4, 0x10, 0xce, 0x8e, 0x1d, 0x08, 0xa4, 0x8f, 0xaf, 0xf1, 0xe4, + 0x8b, 0x13, 0x44, 0x28, 0x60, 0xe4, 0x22, 0x14, 0xa8, 0xd7, 0x94, 0xd6, 0x0b, 0xfd, 0x28, 0xeb, + 0x35, 0xaf, 0x89, 0xac, 0xdc, 0xbe, 0x0d, 0xd3, 0xc2, 0xbf, 0xf9, 0x0d, 0xba, 0x3f, 0xf4, 0x2b, + 0xaf, 0x6c, 0xb4, 0xa7, 0x5e, 0x79, 0x65, 0xd5, 0x59, 0xb9, 0xfd, 0x8f, 0x2d, 0x48, 0xbd, 0x4b, + 0x64, 0xdc, 0x9f, 0x58, 0x03, 0xef, 0x4f, 0x4c, 0x9b, 0xfb, 0xd8, 0x91, 0x36, 0xf7, 0x9b, 0x40, + 0x3a, 0x6c, 0x2a, 0x24, 0x5e, 0xe1, 0x92, 0x86, 0xa3, 0x38, 0xc3, 0x47, 0x1f, 0x06, 0x66, 0xd4, + 0xb2, 0xff, 0x91, 0x10, 0xd6, 0x7c, 0xa9, 0xe8, 0xd1, 0x0d, 0xd0, 0x83, 0x22, 0x27, 0x25, 0xad, + 0x67, 0x23, 0x5a, 0x9e, 0xfb, 0x33, 0x65, 0xc5, 0x1d, 0x29, 0xa7, 0x3c, 0xe7, 0x66, 0xff, 0xbe, + 0x90, 0xd5, 0x78, 0xca, 0x68, 0x08, 0x59, 0x3b, 0x49, 0x59, 0x6f, 0xe4, 0xb5, 0x56, 0x66, 0xcb, + 0x48, 0x16, 0x01, 0xba, 0x34, 0x68, 0x50, 0x2f, 0x52, 0x91, 0x47, 0x45, 0x19, 0x03, 0xab, 0x4b, + 0xd1, 0xc0, 0xb0, 0xbf, 0xc1, 0x26, 0x50, 0xfc, 0xfe, 0x31, 0xb9, 0x92, 0x76, 0x9e, 0x4d, 0x4f, + 0x0e, 0xed, 0x3b, 0x6b, 0xc4, 0xa3, 0x8c, 0x3d, 0x22, 0x1e, 0xe5, 0x79, 0x98, 0x0c, 0xfc, 0x36, + 0xad, 0x06, 0x5e, 0xda, 0xe3, 0x07, 0x59, 0x31, 0xde, 0x42, 0x05, 0xb7, 0x7f, 0xd9, 0x82, 0xb9, + 0x74, 0xc0, 0x5c, 0xee, 0x1e, 0xbd, 0x66, 0x54, 0x7f, 0xe1, 0xf8, 0x51, 0xfd, 0xf6, 0x7b, 0x4c, + 0xc8, 0xc8, 0x6d, 0xec, 0xba, 0x9e, 0x08, 0x84, 0x67, 0x2d, 0xf7, 0x3c, 0x4c, 0x52, 0xf9, 0x8e, + 0xab, 0x30, 0x02, 0x6b, 0x21, 0xd5, 0xf3, 0xad, 0x0a, 0x4e, 0xaa, 0x30, 0xab, 0xae, 0xbe, 0x94, + 0xe5, 0x5e, 0x24, 0xf0, 0xd0, 0x96, 0xc2, 0x95, 0x24, 0x18, 0xd3, 0xf8, 0xf6, 0x17, 0xa1, 0x6c, + 0x6c, 0x4a, 0x7c, 0xfd, 0x7e, 0xe0, 0x34, 0xa2, 0xf4, 0xba, 0x77, 0x8d, 0x15, 0xa2, 0x80, 0xf1, + 0x0b, 0x06, 0x11, 0xcf, 0x93, 0x5a, 0xf7, 0x64, 0x14, 0x8f, 0x84, 0x32, 0x62, 0x01, 0x6d, 0xd1, + 0x07, 0xea, 0x15, 0x01, 0x45, 0x0c, 0x59, 0x21, 0x0a, 0x98, 0xfd, 0x02, 0x4c, 0xa9, 0x34, 0x4b, + 0x3c, 0x57, 0x89, 0x32, 0x7e, 0x9b, 0xb9, 0x4a, 0xfc, 0x20, 0x42, 0x0e, 0xb1, 0xdf, 0x82, 0x29, + 0x95, 0x0d, 0xea, 0xd1, 0xd8, 0x6c, 0x29, 0x0a, 0x3d, 0xf7, 0x86, 0x1f, 0x46, 0x2a, 0x85, 0x95, + 0xb8, 0x9f, 0xbb, 0xb5, 0xca, 0xcb, 0x50, 0x43, 0xed, 0x3f, 0xb5, 0xa0, 0xbc, 0xb9, 0xb9, 0xa6, + 0x8f, 0xed, 0x08, 0x4f, 0x84, 0xa2, 0x85, 0xaa, 0xdb, 0x11, 0x35, 0x1d, 0x01, 0xc4, 0xc2, 0xb7, + 0x70, 0x78, 0x50, 0x79, 0xa2, 0x9e, 0x89, 0x81, 0x03, 0x6a, 0x92, 0x55, 0x38, 0x67, 0x42, 0x64, + 0x6a, 0x01, 0xb9, 0x46, 0xf2, 0x87, 0x7f, 0xeb, 0xfd, 0x60, 0xcc, 0xaa, 0x93, 0x26, 0x25, 0xb7, + 0x7b, 0xf3, 0x0d, 0xe1, 0x7a, 0x3f, 0x18, 0xb3, 0xea, 0xd8, 0x2f, 0xc2, 0x6c, 0xea, 0x86, 0x7a, + 0x88, 0x94, 0x2e, 0xbf, 0x53, 0x80, 0x69, 0xf3, 0xa2, 0x72, 0x88, 0xf5, 0x6b, 0xf8, 0x6d, 0x21, + 0xe3, 0x72, 0xb1, 0x70, 0xcc, 0xcb, 0x45, 0xf3, 0x36, 0x77, 0xfc, 0x74, 0x6f, 0x73, 0x8b, 0xf9, + 0xdc, 0xe6, 0x1a, 0x5e, 0x07, 0x13, 0x8f, 0xcf, 0xeb, 0xe0, 0xb7, 0x8a, 0x30, 0x93, 0xcc, 0x11, + 0x3a, 0x44, 0x4f, 0xbe, 0xd0, 0xd7, 0x93, 0xc7, 0xbc, 0xcd, 0x28, 0x8c, 0x7a, 0x9b, 0x31, 0x3e, + 0xea, 0x6d, 0x46, 0xf1, 0x04, 0xb7, 0x19, 0xfd, 0x77, 0x11, 0x13, 0x43, 0xdf, 0x45, 0x7c, 0x4a, + 0x3b, 0x68, 0x4e, 0x26, 0x1c, 0x78, 0x62, 0x07, 0x4d, 0x92, 0xec, 0x86, 0x65, 0xbf, 0x99, 0xe9, + 0xe8, 0x3a, 0xf5, 0x08, 0xab, 0x6d, 0x90, 0xe9, 0x4f, 0x79, 0xfc, 0x0b, 0xd3, 0x27, 0x8e, 0xe1, + 0x4b, 0xf9, 0x32, 0x94, 0xe5, 0x78, 0xe2, 0xca, 0x37, 0x24, 0x15, 0xf7, 0x7a, 0x0c, 0x42, 0x13, + 0x8f, 0x0d, 0x8c, 0x6e, 0x3c, 0x41, 0xf8, 0xbd, 0x5a, 0x39, 0x79, 0xaf, 0xb6, 0x91, 0x04, 0x63, + 0x1a, 0xdf, 0xfe, 0x02, 0x5c, 0xc8, 0x34, 0xa0, 0x70, 0xe3, 0x35, 0xd7, 0x0b, 0x69, 0x53, 0x22, + 0x18, 0x62, 0xa4, 0x9e, 0x0e, 0x59, 0xb8, 0x3b, 0x10, 0x13, 0x8f, 0xa0, 0x62, 0xff, 0x46, 0x01, + 0x66, 0x92, 0xef, 0xc7, 0x92, 0xfb, 0xda, 0xdc, 0x9a, 0x8b, 0xa5, 0x57, 0x90, 0x35, 0xf2, 0x4e, + 0x0e, 0xbc, 0xa6, 0xb9, 0xcf, 0xc7, 0xd7, 0x96, 0x4e, 0x82, 0x79, 0x7a, 0x8c, 0xe5, 0xfd, 0x88, + 0x64, 0xc7, 0x9f, 0x88, 0x8d, 0x43, 0x54, 0xe5, 0x39, 0x3e, 0x77, 0xee, 0x71, 0xa8, 0xa5, 0x66, + 0x85, 0x06, 0x5b, 0xb6, 0xb7, 0xec, 0xd1, 0xc0, 0xdd, 0x76, 0xf5, 0xdb, 0xf7, 0x7c, 0xe5, 0x7e, + 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x8d, 0x41, 0x89, 0x67, 0xd4, 0xba, 0x1e, 0xf8, 0x1d, 0xfe, + 0xc8, 0x62, 0x68, 0x9c, 0x99, 0x64, 0xb7, 0xdd, 0x1c, 0xf5, 0x25, 0xd3, 0x98, 0xa2, 0x74, 0x9e, + 0x37, 0x4a, 0x30, 0xc1, 0x91, 0x74, 0x61, 0x6a, 0x5b, 0x66, 0x00, 0x96, 0x7d, 0x37, 0x62, 0x16, + 0x4b, 0x95, 0x4f, 0x58, 0x34, 0x81, 0xfa, 0x87, 0x9a, 0x8b, 0xed, 0xc0, 0x6c, 0x2a, 0x25, 0x4a, + 0xee, 0x79, 0x83, 0xff, 0xe7, 0x38, 0x94, 0x74, 0xe4, 0x16, 0xf9, 0x44, 0xc2, 0x80, 0x55, 0xaa, + 0x7d, 0xd8, 0x78, 0x01, 0x6c, 0xc7, 0x6f, 0x3e, 0x3c, 0xa8, 0xcc, 0x6a, 0xe4, 0x94, 0x31, 0xea, + 0x22, 0x14, 0x7a, 0x41, 0x3b, 0x7d, 0x42, 0xbd, 0x83, 0x6b, 0xc8, 0xca, 0xcd, 0x68, 0xb3, 0xc2, + 0x63, 0x8d, 0x36, 0x63, 0xbb, 0xe4, 0x96, 0xdf, 0xdc, 0x4f, 0xbf, 0x18, 0x56, 0xf3, 0x9b, 0xfb, + 0xc8, 0x21, 0xe4, 0x35, 0x98, 0x91, 0x21, 0x74, 0x4a, 0x89, 0x29, 0x72, 0x3d, 0x55, 0xbb, 0x1d, + 0x6c, 0x26, 0xa0, 0x98, 0xc2, 0x66, 0xbb, 0xec, 0xbd, 0xd0, 0xf7, 0x78, 0x36, 0xe8, 0x89, 0xe4, + 0x1d, 0xe5, 0xcd, 0xfa, 0xed, 0x5b, 0xdc, 0x90, 0xa6, 0x31, 0x12, 0x51, 0x7a, 0x93, 0x8f, 0x8c, + 0xd2, 0x5b, 0x11, 0xb4, 0x99, 0xb4, 0x7c, 0x47, 0x99, 0xae, 0x5d, 0x51, 0x74, 0x59, 0xd9, 0xc3, + 0x83, 0x23, 0x4c, 0x9c, 0xba, 0x66, 0x56, 0x3c, 0x63, 0xe9, 0xc7, 0x17, 0xcf, 0x68, 0xdf, 0x81, + 0xd9, 0x54, 0xff, 0x29, 0x03, 0x87, 0x95, 0x6d, 0xe0, 0x18, 0xee, 0xcd, 0xb1, 0x7f, 0x6a, 0xc1, + 0xd9, 0xbe, 0x15, 0x69, 0xd8, 0xc0, 0xd2, 0xf4, 0xde, 0x38, 0x76, 0xf2, 0xbd, 0xb1, 0x70, 0xbc, + 0xbd, 0xb1, 0xb6, 0xf5, 0xdd, 0x1f, 0x5c, 0xfa, 0xd0, 0xf7, 0x7e, 0x70, 0xe9, 0x43, 0x7f, 0xf0, + 0x83, 0x4b, 0x1f, 0x7a, 0xef, 0xf0, 0x92, 0xf5, 0xdd, 0xc3, 0x4b, 0xd6, 0xf7, 0x0e, 0x2f, 0x59, + 0x7f, 0x70, 0x78, 0xc9, 0xfa, 0xcf, 0x87, 0x97, 0xac, 0x6f, 0xfe, 0xf1, 0xa5, 0x0f, 0x7d, 0xfa, + 0x53, 0x71, 0x4f, 0x2d, 0xa9, 0x9e, 0xe2, 0x3f, 0x3e, 0xaa, 0xfa, 0x65, 0xa9, 0xbb, 0xdb, 0x5a, + 0x62, 0x3d, 0xb5, 0xa4, 0x4b, 0x54, 0x4f, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x59, + 0x84, 0xec, 0x21, 0xa6, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -6373,6 +6374,16 @@ func (m *ExperimentSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.AnalysisRunMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a if len(m.MeasurementRetention) > 0 { for iNdEx := len(m.MeasurementRetention) - 1; iNdEx >= 0; iNdEx-- { { @@ -8396,6 +8407,30 @@ func (m *RolloutExperimentStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.AnalysisRunMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if len(m.DryRun) > 0 { + for iNdEx := len(m.DryRun) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.DryRun[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } if len(m.Analyses) > 0 { for iNdEx := len(m.Analyses) - 1; iNdEx >= 0; iNdEx-- { { @@ -11297,6 +11332,8 @@ func (m *ExperimentSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + l = m.AnalysisRunMetadata.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -12033,6 +12070,14 @@ func (m *RolloutExperimentStep) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.DryRun) > 0 { + for _, e := range m.DryRun { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + l = m.AnalysisRunMetadata.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -13436,6 +13481,7 @@ func (this *ExperimentSpec) String() string { `ScaleDownDelaySeconds:` + valueToStringGenerated(this.ScaleDownDelaySeconds) + `,`, `DryRun:` + repeatedStringForDryRun + `,`, `MeasurementRetention:` + repeatedStringForMeasurementRetention + `,`, + `AnalysisRunMetadata:` + strings.Replace(strings.Replace(this.AnalysisRunMetadata.String(), "AnalysisRunMetadata", "AnalysisRunMetadata", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -14025,10 +14071,17 @@ func (this *RolloutExperimentStep) String() string { repeatedStringForAnalyses += strings.Replace(strings.Replace(f.String(), "RolloutExperimentStepAnalysisTemplateRef", "RolloutExperimentStepAnalysisTemplateRef", 1), `&`, ``, 1) + "," } repeatedStringForAnalyses += "}" + repeatedStringForDryRun := "[]DryRun{" + for _, f := range this.DryRun { + repeatedStringForDryRun += strings.Replace(strings.Replace(f.String(), "DryRun", "DryRun", 1), `&`, ``, 1) + "," + } + repeatedStringForDryRun += "}" s := strings.Join([]string{`&RolloutExperimentStep{`, `Templates:` + repeatedStringForTemplates + `,`, `Duration:` + fmt.Sprintf("%v", this.Duration) + `,`, `Analyses:` + repeatedStringForAnalyses + `,`, + `DryRun:` + repeatedStringForDryRun + `,`, + `AnalysisRunMetadata:` + strings.Replace(strings.Replace(this.AnalysisRunMetadata.String(), "AnalysisRunMetadata", "AnalysisRunMetadata", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -22392,6 +22445,39 @@ func (m *ExperimentSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AnalysisRunMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AnalysisRunMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -28981,6 +29067,73 @@ func (m *RolloutExperimentStep) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DryRun = append(m.DryRun, DryRun{}) + if err := m.DryRun[len(m.DryRun)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AnalysisRunMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AnalysisRunMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 8a9f2997f5..36eaf5f892 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -777,6 +777,10 @@ message ExperimentSpec { // +patchStrategy=merge // +optional repeated MeasurementRetention measurementRetention = 8; + + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + optional AnalysisRunMetadata analysisRunMetadata = 9; } // ExperimentStatus is the status for a Experiment resource @@ -1311,6 +1315,16 @@ message RolloutExperimentStep { // +patchMergeKey=name // +patchStrategy=merge repeated RolloutExperimentStepAnalysisTemplateRef analyses = 3; + + // DryRun object contains the settings for running the analysis in Dry-Run mode + // +patchMergeKey=metricName + // +patchStrategy=merge + // +optional + repeated DryRun dryRun = 4; + + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + optional AnalysisRunMetadata analysisRunMetadata = 5; } message RolloutExperimentStepAnalysisTemplateRef { diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 49dc9c1f60..4c70c15f08 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -2306,12 +2306,19 @@ func schema_pkg_apis_rollouts_v1alpha1_ExperimentSpec(ref common.ReferenceCallba }, }, }, + "analysisRunMetadata": { + SchemaProps: spec.SchemaProps{ + Description: "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata"), + }, + }, }, Required: []string{"templates"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ExperimentAnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TemplateSpec"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ExperimentAnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.TemplateSpec"}, } } @@ -4061,12 +4068,39 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutExperimentStep(ref common.Referenc }, }, }, + "dryRun": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "metricName", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "DryRun object contains the settings for running the analysis in Dry-Run mode", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun"), + }, + }, + }, + }, + }, + "analysisRunMetadata": { + SchemaProps: spec.SchemaProps{ + Description: "AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata"), + }, + }, }, Required: []string{"templates"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentStepAnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentTemplate"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentStepAnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentTemplate"}, } } diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index e3c425cb0b..aedf8febca 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -533,6 +533,14 @@ type RolloutExperimentStep struct { // +patchMergeKey=name // +patchStrategy=merge Analyses []RolloutExperimentStepAnalysisTemplateRef `json:"analyses,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,3,rep,name=analyses"` + // DryRun object contains the settings for running the analysis in Dry-Run mode + // +patchMergeKey=metricName + // +patchStrategy=merge + // +optional + DryRun []DryRun `json:"dryRun,omitempty" patchStrategy:"merge" patchMergeKey:"metricName" protobuf:"bytes,4,rep,name=dryRun"` + // AnalysisRunMetadata labels and annotations that will be added to the AnalysisRuns + // +optional + AnalysisRunMetadata AnalysisRunMetadata `json:"analysisRunMetadata,omitempty" protobuf:"bytes,5,opt,name=analysisRunMetadata"` } type RolloutExperimentStepAnalysisTemplateRef struct { diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 0b962704f3..d8c859e20d 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1298,6 +1298,7 @@ func (in *ExperimentSpec) DeepCopyInto(out *ExperimentSpec) { *out = make([]MeasurementRetention, len(*in)) copy(*out, *in) } + in.AnalysisRunMetadata.DeepCopyInto(&out.AnalysisRunMetadata) return } @@ -2170,6 +2171,12 @@ func (in *RolloutExperimentStep) DeepCopyInto(out *RolloutExperimentStep) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.DryRun != nil { + in, out := &in.DryRun, &out.DryRun + *out = make([]DryRun, len(*in)) + copy(*out, *in) + } + in.AnalysisRunMetadata.DeepCopyInto(&out.AnalysisRunMetadata) return } diff --git a/pkg/apis/rollouts/validation/validation_references.go b/pkg/apis/rollouts/validation/validation_references.go index f546766b83..9079536c20 100644 --- a/pkg/apis/rollouts/validation/validation_references.go +++ b/pkg/apis/rollouts/validation/validation_references.go @@ -127,7 +127,7 @@ func ValidateAnalysisTemplatesWithType(rollout *v1alpha1.Rollout, templates Anal templateNames := GetAnalysisTemplateNames(templates) value := fmt.Sprintf("templateNames: %s", templateNames) - _, err := analysisutil.NewAnalysisRunFromTemplates(templates.AnalysisTemplates, templates.ClusterAnalysisTemplates, buildAnalysisArgs(templates.Args, rollout), []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, "", "", "") + _, err := analysisutil.NewAnalysisRunFromTemplates(templates.AnalysisTemplates, templates.ClusterAnalysisTemplates, buildAnalysisArgs(templates.Args, rollout), []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, make(map[string]string), make(map[string]string), "", "", "") if err != nil { allErrs = append(allErrs, field.Invalid(fldPath, value, err.Error())) return allErrs @@ -136,7 +136,7 @@ func ValidateAnalysisTemplatesWithType(rollout *v1alpha1.Rollout, templates Anal if rollout.Spec.Strategy.Canary != nil { for _, step := range rollout.Spec.Strategy.Canary.Steps { if step.Analysis != nil { - _, err := analysisutil.NewAnalysisRunFromTemplates(templates.AnalysisTemplates, templates.ClusterAnalysisTemplates, buildAnalysisArgs(templates.Args, rollout), step.Analysis.DryRun, step.Analysis.MeasurementRetention, "", "", "") + _, err := analysisutil.NewAnalysisRunFromTemplates(templates.AnalysisTemplates, templates.ClusterAnalysisTemplates, buildAnalysisArgs(templates.Args, rollout), step.Analysis.DryRun, step.Analysis.MeasurementRetention, make(map[string]string), make(map[string]string), "", "", "") if err != nil { allErrs = append(allErrs, field.Invalid(fldPath, value, err.Error())) return allErrs diff --git a/rollout/analysis.go b/rollout/analysis.go index 49583287f6..5c5c5f8aec 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -455,24 +455,25 @@ func (c *rolloutContext) newAnalysisRunFromRollout(rolloutAnalysis *v1alpha1.Rol } } - run, err = analysisutil.NewAnalysisRunFromTemplates(templates, clusterTemplates, args, rolloutAnalysis.DryRun, rolloutAnalysis.MeasurementRetention, name, "", c.rollout.Namespace) - if err != nil { - return nil, err - } - run.Labels = labels + runLabels := labels for k, v := range rolloutAnalysis.AnalysisRunMetadata.Labels { - run.Labels[k] = v + runLabels[k] = v } for k, v := range c.rollout.Spec.Selector.MatchLabels { - run.Labels[k] = v + runLabels[k] = v } - run.Annotations = map[string]string{ + runAnnotations := map[string]string{ annotations.RevisionAnnotation: revision, } for k, v := range rolloutAnalysis.AnalysisRunMetadata.Annotations { - run.Annotations[k] = v + runAnnotations[k] = v + } + run, err = analysisutil.NewAnalysisRunFromTemplates(templates, clusterTemplates, args, rolloutAnalysis.DryRun, rolloutAnalysis.MeasurementRetention, + runLabels, runAnnotations, name, "", c.rollout.Namespace) + if err != nil { + return nil, err } run.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(c.rollout, controllerKind)} return run, nil diff --git a/rollout/experiment.go b/rollout/experiment.go index 9187c73dcc..7b28cc280b 100644 --- a/rollout/experiment.go +++ b/rollout/experiment.go @@ -50,6 +50,8 @@ func GetExperimentFromTemplate(r *v1alpha1.Rollout, stableRS, newRS *appsv1.Repl Spec: v1alpha1.ExperimentSpec{ Duration: step.Duration, ProgressDeadlineSeconds: r.Spec.ProgressDeadlineSeconds, + DryRun: step.DryRun, + AnalysisRunMetadata: step.AnalysisRunMetadata, }, } diff --git a/rollout/experiment_test.go b/rollout/experiment_test.go index 233dd16ca5..f3dc2029b9 100644 --- a/rollout/experiment_test.go +++ b/rollout/experiment_test.go @@ -907,3 +907,77 @@ func TestRolloutCreateWeightlessExperimentWithService(t *testing.T) { assert.Equal(t, "canary-weightless-template", ex.Spec.Templates[1].Name) assert.Nil(t, ex.Spec.Templates[1].Service) } + +// The Dry run and metadata should be forwarded from the rollout spec to the experiment spec +func TestRolloutCreateExperimentWithDryRunAndMetadata(t *testing.T) { + f := newFixture(t) + defer f.Close() + + at := analysisTemplate("bar") + steps := []v1alpha1.CanaryStep{{ + Experiment: &v1alpha1.RolloutExperimentStep{ + Templates: []v1alpha1.RolloutExperimentTemplate{{ + Name: "stable-template", + SpecRef: v1alpha1.StableSpecRef, + Replicas: pointer.Int32(1), + }}, + Analyses: []v1alpha1.RolloutExperimentStepAnalysisTemplateRef{{ + Name: "test", + TemplateName: at.Name, + }}, + AnalysisRunMetadata: v1alpha1.AnalysisRunMetadata{ + Labels: map[string]string{ + "foo": "bar", + "foo2": "bar2", + }, + Annotations: map[string]string{ + "bar": "foo", + "bar2": "foo2", + }, + }, + DryRun: []v1alpha1.DryRun{ + { + MetricName: "someMetric", + }, + { + MetricName: "someOtherMetric", + }, + }, + }, + }} + + r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r2 := bumpVersion(r1) + + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs2 := newReplicaSetWithStatus(r2, 0, 0) + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + ex, _ := GetExperimentFromTemplate(r2, rs1, rs2) + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 1, 0, 1, false) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + createExIndex := f.expectCreateExperimentAction(ex) + f.expectPatchRolloutAction(r1) + + f.run(getKey(r2, t)) + createdEx := f.getCreatedExperiment(createExIndex) + assert.Equal(t, createdEx.Name, ex.Name) + assert.Equal(t, createdEx.Spec.Analyses[0].TemplateName, at.Name) + assert.Equal(t, createdEx.Spec.Analyses[0].Name, "test") + + assert.Len(t, createdEx.Spec.AnalysisRunMetadata.Labels, 2) + assert.Equal(t, createdEx.Spec.AnalysisRunMetadata.Labels["foo"], "bar") + assert.Equal(t, createdEx.Spec.AnalysisRunMetadata.Labels["foo2"], "bar2") + assert.Len(t, createdEx.Spec.AnalysisRunMetadata.Annotations, 2) + assert.Equal(t, createdEx.Spec.AnalysisRunMetadata.Annotations["bar"], "foo") + assert.Equal(t, createdEx.Spec.AnalysisRunMetadata.Annotations["bar2"], "foo2") + + assert.Len(t, createdEx.Spec.DryRun, 2) + assert.Equal(t, createdEx.Spec.DryRun[0].MetricName, "someMetric") + assert.Equal(t, createdEx.Spec.DryRun[1].MetricName, "someOtherMetric") +} diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 254fc390a1..cf9a9cdfc5 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -2050,6 +2050,18 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutExpe * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutExperimentStep */ analyses?: Array; + /** + * + * @type {Array} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutExperimentStep + */ + dryRun?: Array; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutExperimentStep + */ + analysisRunMetadata?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRunMetadata; } /** * diff --git a/utils/analysis/helpers.go b/utils/analysis/helpers.go index 6e95bd47fa..36fb880e98 100644 --- a/utils/analysis/helpers.go +++ b/utils/analysis/helpers.go @@ -288,7 +288,10 @@ func CreateWithCollisionCounter(logCtx *log.Entry, analysisRunIf argoprojclient. } } -func NewAnalysisRunFromTemplates(templates []*v1alpha1.AnalysisTemplate, clusterTemplates []*v1alpha1.ClusterAnalysisTemplate, args []v1alpha1.Argument, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention, name, generateName, namespace string) (*v1alpha1.AnalysisRun, error) { +func NewAnalysisRunFromTemplates(templates []*v1alpha1.AnalysisTemplate, clusterTemplates []*v1alpha1.ClusterAnalysisTemplate, args []v1alpha1.Argument, dryRunMetrics []v1alpha1.DryRun, + measurementRetentionMetrics []v1alpha1.MeasurementRetention, + labels map[string]string, annotations map[string]string, + name, generateName, namespace string) (*v1alpha1.AnalysisRun, error) { template, err := FlattenTemplates(templates, clusterTemplates) if err != nil { return nil, err @@ -310,6 +313,8 @@ func NewAnalysisRunFromTemplates(templates []*v1alpha1.AnalysisTemplate, cluster Name: name, GenerateName: generateName, Namespace: namespace, + Labels: labels, + Annotations: annotations, }, Spec: v1alpha1.AnalysisRunSpec{ Metrics: template.Spec.Metrics, diff --git a/utils/analysis/helpers_test.go b/utils/analysis/helpers_test.go index 207f5fa023..d87937c0c9 100644 --- a/utils/analysis/helpers_test.go +++ b/utils/analysis/helpers_test.go @@ -646,7 +646,10 @@ func TestNewAnalysisRunFromTemplates(t *testing.T) { } args := []v1alpha1.Argument{arg, secretArg} - run, err := NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, "foo-run", "foo-run-generate-", "my-ns") + labels := make(map[string]string) + annotations := make(map[string]string) + + run, err := NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") assert.NoError(t, err) assert.Equal(t, "foo-run", run.Name) assert.Equal(t, "foo-run-generate-", run.GenerateName) @@ -656,10 +659,36 @@ func TestNewAnalysisRunFromTemplates(t *testing.T) { assert.Contains(t, run.Spec.Args, arg) assert.Contains(t, run.Spec.Args, secretArg) + assert.Len(t, run.Labels, 0) + assert.Len(t, run.Labels, 0) + + // With additionnal labels and annotations + labels["foo"] = "bar" + labels["foo2"] = "bar2" + annotations["bar"] = "foo" + annotations["bar2"] = "foo2" + + run, err = NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") + assert.NoError(t, err) + assert.Equal(t, "foo-run", run.Name) + assert.Equal(t, "foo-run-generate-", run.GenerateName) + assert.Equal(t, "my-ns", run.Namespace) + + assert.Len(t, run.Spec.Args, 2) + assert.Contains(t, run.Spec.Args, arg) + assert.Contains(t, run.Spec.Args, secretArg) + + assert.Len(t, run.Labels, 2) + assert.Equal(t, run.Labels["foo"], "bar") + assert.Equal(t, run.Labels["foo2"], "bar2") + assert.Len(t, run.Annotations, 2) + assert.Equal(t, run.Annotations["bar"], "foo") + assert.Equal(t, run.Annotations["bar2"], "foo2") + // Fail Merge Args unresolvedArg := v1alpha1.Argument{Name: "unresolved"} templates[0].Spec.Args = append(templates[0].Spec.Args, unresolvedArg) - run, err = NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, "foo-run", "foo-run-generate-", "my-ns") + run, err = NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") assert.Nil(t, run) assert.Equal(t, fmt.Errorf("args.unresolved was not resolved"), err) // Fail flatten metric @@ -672,7 +701,7 @@ func TestNewAnalysisRunFromTemplates(t *testing.T) { } // Fail Flatten Templates templates = append(templates, matchingMetric) - run, err = NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, "foo-run", "foo-run-generate-", "my-ns") + run, err = NewAnalysisRunFromTemplates(templates, clusterTemplates, args, []v1alpha1.DryRun{}, []v1alpha1.MeasurementRetention{}, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") assert.Nil(t, run) assert.Equal(t, fmt.Errorf("two metrics have the same name 'success-rate'"), err) } @@ -852,8 +881,10 @@ func TestCompatibilityNewAnalysisRunFromTemplate(t *testing.T) { Value: pointer.StringPtr("my-val"), }, } + labels := make(map[string]string) + annotations := make(map[string]string) analysisTemplates := []*v1alpha1.AnalysisTemplate{&template} - run, err := NewAnalysisRunFromTemplates(analysisTemplates, nil, args, nil, nil, "foo-run", "foo-run-generate-", "my-ns") + run, err := NewAnalysisRunFromTemplates(analysisTemplates, nil, args, nil, nil, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") assert.NoError(t, err) assert.Equal(t, "foo-run", run.Name) assert.Equal(t, "foo-run-generate-", run.GenerateName) @@ -887,8 +918,10 @@ func TestCompatibilityNewAnalysisRunFromClusterTemplate(t *testing.T) { Value: pointer.StringPtr("my-val"), }, } + labels := make(map[string]string) + annotations := make(map[string]string) clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{&clusterTemplate} - run, err := NewAnalysisRunFromTemplates(nil, clusterAnalysisTemplates, args, nil, nil, "foo-run", "foo-run-generate-", "my-ns") + run, err := NewAnalysisRunFromTemplates(nil, clusterAnalysisTemplates, args, nil, nil, labels, annotations, "foo-run", "foo-run-generate-", "my-ns") assert.NoError(t, err) assert.Equal(t, "foo-run", run.Name) assert.Equal(t, "foo-run-generate-", run.GenerateName) From 50b2885680f2c071b58505f88e15d1b1644f3fa3 Mon Sep 17 00:00:00 2001 From: John Pitman Date: Fri, 16 Feb 2024 16:53:46 -0500 Subject: [PATCH 196/264] docs: Update shell autocompletion instructions (#3377) Update shell autocompletion instructions Signed-off-by: John Pitman --- docs/installation.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index e144459f2e..7fae1d6d61 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -81,7 +81,21 @@ kubectl argo rollouts version ## Shell auto completion -The CLI can export shell completion code for several shells. +To enable auto completion for the plugin when used with `kubectl` (version 1.26 or newer), you need to create a shell script on your PATH called `kubectl_complete-argo-rollouts` which will provide the completions. + +```shell +cat <kubectl_complete-argo-rollouts +#!/usr/bin/env sh + +# Call the __complete command passing it all arguments +kubectl argo rollouts __complete "\$@" +EOF + +chmod +x kubectl_complete-argo-rollouts +sudo mv ./kubectl_complete-argo-rollouts /usr/local/bin/ +``` + +To enable auto completion for the CLI run as a standalone binary, the CLI can export shell completion code for several shells. For bash, ensure you have bash completions installed and enabled. To access completions in your current shell, run $ `source <(kubectl-argo-rollouts completion bash)`. Alternatively, write it to a file and source in `.bash_profile`. @@ -120,4 +134,3 @@ To upgrade Argo Rollouts: If deployments are happening while you upgrade the controller, then you shouldn't have any downtime. Current Rollouts will be paused and as soon as the new controller becomes active it will resume all in-flight deployments. - From 1099f88252d57e443243a8efce1635a91596fb99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 22:25:08 -0600 Subject: [PATCH 197/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.26.6 to 1.27.0 (#3368) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.26.6 to 1.27.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.26.6...config/v1.27.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 26 +++++++++++++------------- go.sum | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/go.mod b/go.mod index 206ca37eca..45a7d3bcac 100644 --- a/go.mod +++ b/go.mod @@ -6,8 +6,8 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.24.1 - github.com/aws/aws-sdk-go-v2/config v1.26.6 + github.com/aws/aws-sdk-go-v2 v1.25.0 + github.com/aws/aws-sdk-go-v2/config v1.27.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 github.com/blang/semver v3.5.1+incompatible @@ -77,18 +77,18 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.0 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect - github.com/aws/smithy-go v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 // indirect + github.com/aws/smithy-go v1.20.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 8d6c0b9175..2be926f52e 100644 --- a/go.sum +++ b/go.sum @@ -91,41 +91,41 @@ github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4 github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= -github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= -github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= -github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= -github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2 v1.25.0 h1:sv7+1JVJxOu/dD/sz/csHX7jFqmP001TIY7aytBWDSQ= +github.com/aws/aws-sdk-go-v2 v1.25.0/go.mod h1:G104G1Aho5WqF+SR3mDIobTABQzpYV0WxMsKxlMggOA= +github.com/aws/aws-sdk-go-v2/config v1.27.0 h1:J5sdGCAHuWKIXLeXiqr8II/adSvetkx0qdZwdbXXpb0= +github.com/aws/aws-sdk-go-v2/config v1.27.0/go.mod h1:cfh8v69nuSUohNFMbIISP2fhmblGmYEOKs5V53HiHnk= +github.com/aws/aws-sdk-go-v2/credentials v1.17.0 h1:lMW2x6sKBsiAJrpi1doOXqWFyEPoE886DTb1X0wb7So= +github.com/aws/aws-sdk-go-v2/credentials v1.17.0/go.mod h1:uT41FIH8cCIxOdUYIL0PYyHlL1NoneDuDSCwg5VE/5o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 h1:xWCwjjvVz2ojYTP4kBKUuUh9ZrXfcAXpflhOUUeXg1k= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0/go.mod h1:j3fACuqXg4oMTQOR2yY7m0NmJY0yBK4L4sLsRXq1Ins= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 h1:NPs/EqVO+ajwOoq56EfcGKa3L3ruWuazkIw1BqxwOPw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0/go.mod h1:D+duLy2ylgatV+yTlQ8JTuLfDD0BnFvnQRc+o6tbZ4M= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= -github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 h1:ks7KGMVUMoDzcxNWUlEdI+/lokMFD136EL6DWmUOV80= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0/go.mod h1:hL6BWM/d/qz113fVitZjbXR0E+RCTU1+x+1Idyn5NgE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 h1:0kI/uFLCoDoDMaD1rSnXC9/DtdRZpx1mVFJ+xOL/M+k= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 h1:r9eCNAMs0C4gjkod/p4dsb+ZMOQAkdjPuin9QUUcjmY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFlO0KsveiP90IUJh8Xr/cx9US2PqkSroaLc+o8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0/go.mod h1:SxIkWpByiGbhbHYTo9CMTUnx2G4p4ZQMrDPcRRy//1c= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 h1:SHN/umDLTmFTmYfI+gkanz6da3vK8Kvj/5wkqnTHbuA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0/go.mod h1:l8gPU5RYGOFHJqWEpPMoRTP0VoaWQSkJdKo+hwWnnDA= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= -github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= -github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 h1:u6OkVDxtBPnxPkZ9/63ynEe+8kHbtS5IfaC4PzVxzWM= +github.com/aws/aws-sdk-go-v2/service/sso v1.19.0/go.mod h1:YqbU3RS/pkDVu+v+Nwxvn0i1WB0HkNWEePWbmODEbbs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 h1:6DL0qu5+315wbsAEEmzK+P9leRwNbkp+lGjPC+CEvb8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0/go.mod h1:olUAyg+FaoFaL/zFaeQQONjOZ9HXoxgvI/c7mQTYz7M= +github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 h1:cjTRjh700H36MQ8M0LnDn33W3JmwC77mdxIIyPWCdpM= +github.com/aws/aws-sdk-go-v2/service/sts v1.27.0/go.mod h1:nXfOBMWPokIbOY+Gi7a1psWMSvskUCemZzI+SMB7Akc= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= -github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.20.0 h1:6+kZsCXZwKxZS9RfISnPc4EXlHoyAkm2hPuM8X2BrrQ= +github.com/aws/smithy-go v1.20.0/go.mod h1:uo5RKksAl4PzhqaAbjd4rLgFoq5koTsQKYuGe7dklGc= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From d06cc34679641f6896bf6201e3fb405beac1a347 Mon Sep 17 00:00:00 2001 From: Andre Marcelo-Tanner Date: Tue, 27 Feb 2024 12:35:58 -0500 Subject: [PATCH 198/264] chore: Update notifications engine to 7a06976 (#3384) * Run: go get github.com/argoproj/notifications-engine@7a069766e95476e1074eeed6145085160e2fec63 Updating and fetch latest notifications-engine dependencies Signed-off-by: Andre Marcelo-Tanner * Run: go get github.com/argoproj/notifications-engine/pkg/services@v0.4.1-0.20240219110818-7a069766e954 Signed-off-by: Andre Marcelo-Tanner * Replace telegram-bot-api and run go mod tidy - Update go.mod: github.com/go-telegram-bot-api/telegram-bot-api/v5 => github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf - Ref: https://github.com/argoproj/notifications-engine/pull/265 - Could also be done via go replace --edit - go mod tidy also ran Signed-off-by: Andre Marcelo-Tanner * Add strReplaceDocFiles to update strings from default docs Signed-off-by: Andre Marcelo-Tanner * Run: make docs Signed-off-by: Andre Marcelo-Tanner * replace with argo-rollouts-notification-configmap and also replace secret with argocd-notifications-secret Signed-off-by: Andre Marcelo-Tanner * add Ada company to USERS.md Signed-off-by: Andre Marcelo-Tanner * chore: update contributing docs with notifications engine section Signed-off-by: Andre Marcelo-Tanner --------- Signed-off-by: Andre Marcelo-Tanner --- USERS.md | 3 +- docs/CONTRIBUTING.md | 17 +++++++ .../notification-services/alertmanager.md | 10 ++-- .../generated/notification-services/awssqs.md | 23 +++++++-- docs/generated/notification-services/email.md | 6 +-- .../generated/notification-services/github.md | 7 +-- .../notification-services/googlechat.md | 4 +- .../notification-services/grafana.md | 4 +- .../notification-services/mattermost.md | 6 +-- .../notification-services/newrelic.md | 4 +- .../notification-services/opsgenie.md | 48 ++++++++++++++++--- .../notification-services/overview.md | 4 +- .../notification-services/pagerduty.md | 4 +- .../notification-services/pagerduty_v2.md | 4 +- .../notification-services/pushover.md | 4 +- .../notification-services/rocketchat.md | 2 +- docs/generated/notification-services/slack.md | 7 +-- docs/generated/notification-services/teams.md | 4 +- .../notification-services/telegram.md | 13 ++++- docs/generated/notification-services/webex.md | 4 +- .../notification-services/webhook.md | 16 +++---- go.mod | 5 +- go.sum | 16 +++---- hack/gen-docs/main.go | 22 +++++++++ 24 files changed, 167 insertions(+), 70 deletions(-) diff --git a/USERS.md b/USERS.md index e56b7e13a6..12a504f4cb 100644 --- a/USERS.md +++ b/USERS.md @@ -1,6 +1,7 @@ ## Who uses Argo Rollouts? Organizations below are **officially** using Argo Rollouts. Please send a PR with your organization name if you are using Argo Rollouts. +1. [Ada](https://www.ada.cx) 1. [ADP](https://www.adp.com) 1. [Akuity](https://akuity.io/) 1. [Alibaba Group](https://www.alibabagroup.com/) @@ -19,6 +20,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [Flipkart](https://flipkart.com) 1. [GetYourGuide](https://www.getyourguide.com) 1. [Gllue](https://gllue.com) +1. [HashiCorp](https://www.hashicorp.com/) 1. [Ibotta](https://home.ibotta.com/) 1. [Intuit](https://www.intuit.com/) 1. [New Relic](https://newrelic.com/) @@ -48,4 +50,3 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [WeLab Bank](https://www.welab.bank/) 1. [Yotpo](https://www.yotpo.com/) 1. [VGS](https://www.vgs.io) -1. [HashiCorp](https://www.hashicorp.com/) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 8eb4a5b96f..f727834d8b 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -247,6 +247,23 @@ pushed into the other kubernetes repositories yet. In order to import the kubern associated repos have to pinned to the correct version specified by the kubernetes/kubernetes release. The `./hack/update-k8s-dependencies.sh` updates all the dependencies to the those correct versions. +## Upgrading Notifications Engine +Argo Rollouts has a dependency on the [argoproj/notifications-engines](https://github.com/argoproj/notifications-engine) repo +for the notifications functionality and related documentation. + +This is updated by upgrading the Go library in `go.mod` by running the commands: + +```shell +go get github.com/argoproj/notifications-engine@LATEST_COMMIT_HASH +go mod tidy +``` + +Next the latest notifications documentation can be imported by running: + +```shell +make docs +``` + ## Documentation Changes Modify contents in `docs/` directory. diff --git a/docs/generated/notification-services/alertmanager.md b/docs/generated/notification-services/alertmanager.md index e0f9d7e4e7..556bd749d2 100755 --- a/docs/generated/notification-services/alertmanager.md +++ b/docs/generated/notification-services/alertmanager.md @@ -43,7 +43,7 @@ You should turn off "send_resolved" or you will receive unnecessary recovery not apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.alertmanager: | targets: @@ -58,7 +58,7 @@ If your alertmanager has changed the default api, you can customize "apiPath". apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.alertmanager: | targets: @@ -70,7 +70,7 @@ data: ### Send high availability alertmanager with auth -Store auth token in `argocd-notifications-secret` Secret and use configure in `argocd-notifications-cm` ConfigMap. +Store auth token in `argo-rollouts-notification-secret` Secret and use configure in `argo-rollouts-notification-configmap` ConfigMap. ```yaml apiVersion: v1 @@ -89,7 +89,7 @@ stringData: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.alertmanager: | targets: @@ -110,7 +110,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.alertmanager: | targets: diff --git a/docs/generated/notification-services/awssqs.md b/docs/generated/notification-services/awssqs.md index 6b744f4744..dbfbd708ff 100755 --- a/docs/generated/notification-services/awssqs.md +++ b/docs/generated/notification-services/awssqs.md @@ -1,8 +1,8 @@ -# AWS SQS +# AWS SQS ## Parameters -This notification service is capable of sending simple messages to AWS SQS queue. +This notification service is capable of sending simple messages to AWS SQS queue. * `queue` - name of the queue you are intending to send messages to. Can be overridden with target destination annotation. * `region` - region of the sqs queue can be provided via env variable AWS_DEFAULT_REGION @@ -30,7 +30,7 @@ metadata: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.awssqs: | region: "us-east-2" @@ -63,7 +63,7 @@ stringData: ### Minimal configuration using AWS Env variables -Ensure following list of environment variables are injected via OIDC, or other method. And assuming SQS is local to the account. +Ensure the following list of environment variables are injected via OIDC, or another method. And assuming SQS is local to the account. You may skip usage of secret for sensitive data and omit other parameters. (Setting parameters via ConfigMap takes precedent.) Variables: @@ -89,7 +89,7 @@ metadata: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.awssqs: | queue: "myqueue" @@ -104,3 +104,16 @@ data: - oncePer: obj.metadata.annotations["generation"] ``` + +## FIFO SQS Queues + +FIFO queues require a [MessageGroupId](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#SQS-SendMessage-request-MessageGroupId) to be sent along with every message, every message with a matching MessageGroupId will be processed one by one in order. + +To send to a FIFO SQS Queue you must include a `messageGroupId` in the template such as in the example below: + +```yaml +template.deployment-ready: | + message: | + Deployment {{.obj.metadata.name}} is ready! + messageGroupId: {{.obj.metadata.name}}-deployment +``` diff --git a/docs/generated/notification-services/email.md b/docs/generated/notification-services/email.md index b81ab6cde8..f3eca407a2 100755 --- a/docs/generated/notification-services/email.md +++ b/docs/generated/notification-services/email.md @@ -20,7 +20,7 @@ The following snippet contains sample Gmail service configuration: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.email.gmail: | username: $email-username @@ -36,7 +36,7 @@ Without authentication: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.email.example: | host: smtp.example.com @@ -52,7 +52,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: template.app-sync-succeeded: | email: diff --git a/docs/generated/notification-services/github.md b/docs/generated/notification-services/github.md index be76ab150d..dd55c88ddd 100755 --- a/docs/generated/notification-services/github.md +++ b/docs/generated/notification-services/github.md @@ -17,14 +17,14 @@ The GitHub notification service changes commit status using [GitHub Apps](https: 3. Generate a private key, and download it automatically ![3](https://user-images.githubusercontent.com/18019529/108397926-d4a36300-725b-11eb-83fe-74795c8c3e03.png) 4. Install app to account -5. Store privateKey in `argocd-notifications-secret` Secret and configure GitHub integration -in `argocd-notifications-cm` ConfigMap +5. Store privateKey in `argo-rollouts-notification-secret` Secret and configure GitHub integration +in `argo-rollouts-notification-configmap` ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.github: | appID: @@ -76,6 +76,7 @@ template.app-deployed: | logURL: "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true" requiredContexts: [] autoMerge: true + transientEnvironment: false pullRequestComment: content: | Application {{.app.metadata.name}} is now running new version of deployments manifests. diff --git a/docs/generated/notification-services/googlechat.md b/docs/generated/notification-services/googlechat.md index 885ce685a4..c8cdf036e3 100755 --- a/docs/generated/notification-services/googlechat.md +++ b/docs/generated/notification-services/googlechat.md @@ -13,13 +13,13 @@ The Google Chat notification service send message notifications to a google chat 3. Under **Incoming Webhooks**, click **Add Webhook** 4. Give a name to the webhook, optionally add an image and click **Save** 5. Copy the URL next to your webhook -6. Store the URL in `argocd-notification-secret` and declare it in `argocd-notifications-cm` +6. Store the URL in `argocd-notification-secret` and declare it in `argo-rollouts-notification-configmap` ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.googlechat: | webhooks: diff --git a/docs/generated/notification-services/grafana.md b/docs/generated/notification-services/grafana.md index a36672d0fa..7415ca5636 100755 --- a/docs/generated/notification-services/grafana.md +++ b/docs/generated/notification-services/grafana.md @@ -15,13 +15,13 @@ Available parameters : 3. Click "Add API Key" 4. Fill the Key with name `ArgoCD Notification`, role `Editor` and Time to Live `10y` (for example) 5. Click on Add button -6. Store apiKey in `argocd-notifications-secret` Secret and Copy your API Key and define it in `argocd-notifications-cm` ConfigMap +6. Store apiKey in `argo-rollouts-notification-secret` Secret and Copy your API Key and define it in `argo-rollouts-notification-configmap` ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.grafana: | apiUrl: https://grafana.example.com/api diff --git a/docs/generated/notification-services/mattermost.md b/docs/generated/notification-services/mattermost.md index 98e0d0fd7b..69a17a28f6 100755 --- a/docs/generated/notification-services/mattermost.md +++ b/docs/generated/notification-services/mattermost.md @@ -12,14 +12,14 @@ ![1](https://user-images.githubusercontent.com/18019529/111499520-62ed0500-8786-11eb-88b0-d0aade61fed4.png) 2. Invite team ![2](https://user-images.githubusercontent.com/18019529/111500197-1229dc00-8787-11eb-98e5-587ee36c94a9.png) -3. Store token in `argocd-notifications-secret` Secret and configure Mattermost integration -in `argocd-notifications-cm` ConfigMap +3. Store token in `argo-rollouts-notification-secret` Secret and configure Mattermost integration +in `argo-rollouts-notification-configmap` ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.mattermost: | apiURL: diff --git a/docs/generated/notification-services/newrelic.md b/docs/generated/notification-services/newrelic.md index d98288a846..49739c16ea 100755 --- a/docs/generated/notification-services/newrelic.md +++ b/docs/generated/notification-services/newrelic.md @@ -8,13 +8,13 @@ ## Configuration 1. Create a NewRelic [Api Key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#user-api-key) -2. Store apiKey in `argocd-notifications-secret` Secret and configure NewRelic integration in `argocd-notifications-cm` ConfigMap +2. Store apiKey in `argo-rollouts-notification-secret` Secret and configure NewRelic integration in `argo-rollouts-notification-configmap` ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.newrelic: | apiURL: diff --git a/docs/generated/notification-services/opsgenie.md b/docs/generated/notification-services/opsgenie.md index c590a4ac97..ec03c40f41 100755 --- a/docs/generated/notification-services/opsgenie.md +++ b/docs/generated/notification-services/opsgenie.md @@ -7,22 +7,58 @@ To be able to send notifications with argocd-notifications you have to create an 3. Click "Teams" in the Menu on the left 4. Select the team that you want to notify 5. In the teams configuration menu select "Integrations" -6. click "Add Integration" in the top right corner +6. Click "Add Integration" in the top right corner 7. Select "API" integration 8. Give your integration a name, copy the "API key" and safe it somewhere for later -9. Make sure the checkboxes for "Create and Update Access" and "enable" are selected, disable the other checkboxes to remove unnecessary permissions -10. Click "Safe Integration" at the bottom -11. Check your browser for the correct server apiURL. If it is "app.opsgenie.com" then use the US/international api url `api.opsgenie.com` in the next step, otherwise use `api.eu.opsgenie.com` (European API). -12. You are finished with configuring opsgenie. Now you need to configure argocd-notifications. Use the apiUrl, the team name and the apiKey to configure the Opsgenie integration in the `argocd-notifications-secret` secret. +9. Click "Edit" in the integration settings +10. Make sure the checkbox for "Create and Update Access" is selected, disable the other checkboxes to remove unnecessary permissions +11. Click "Save" at the bottom +12. Click "Turn on integration" in the top right corner +13. Check your browser for the correct server apiURL. If it is "app.opsgenie.com" then use the US/international api url `api.opsgenie.com` in the next step, otherwise use `api.eu.opsgenie.com` (European API). +14. You are finished with configuring Opsgenie. Now you need to configure argocd-notifications. Use the apiUrl, the team name and the apiKey to configure the Opsgenie integration in the `argo-rollouts-notification-secret` secret. +15. You can find the example `argo-rollouts-notification-configmap` configuration at the below. + +| **Option** | **Required** | **Type** | **Description** | **Example** | +| ------------- | ------------ | -------- | -------------------------------------------------------------------------------------------------------- | -------------------------------- | +| `description` | True | `string` | Description field of the alert that is generally used to provide a detailed information about the alert. | `Hello from Argo CD!` | +| `priority` | False | `string` | Priority level of the alert. Possible values are P1, P2, P3, P4 and P5. Default value is P3. | `P1` | +| `alias` | False | `string` | Client-defined identifier of the alert, that is also the key element of Alert De-Duplication. | `Life is too short for no alias` | +| `note` | False | `string` | Additional note that will be added while creating the alert. | `Error from Argo CD!` | ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.opsgenie: | apiUrl: apiKeys: : + template.opsgenie: | + message: | + [Argo CD] Application {{.app.metadata.name}} has a problem. + opsgenie: + description: | + Application: {{.app.metadata.name}} + Health Status: {{.app.status.health.status}} + Operation State Phase: {{.app.status.operationState.phase}} + Sync Status: {{.app.status.sync.status}} + priority: P1 + alias: {{.app.metadata.name}} + note: Error from Argo CD! + trigger.on-a-problem: | + - description: Application has a problem. + send: + - opsgenie + when: app.status.health.status == 'Degraded' or app.status.operationState.phase in ['Error', 'Failed'] or app.status.sync.status == 'Unknown' +``` + +16. Add annotation in application yaml file to enable notifications for specific Argo CD app. +```yaml + apiVersion: argoproj.io/v1alpha1 + kind: Application + metadata: + annotations: + notifications.argoproj.io/subscribe.on-a-problem.opsgenie: ``` \ No newline at end of file diff --git a/docs/generated/notification-services/overview.md b/docs/generated/notification-services/overview.md index 265e575755..a042d942b1 100755 --- a/docs/generated/notification-services/overview.md +++ b/docs/generated/notification-services/overview.md @@ -1,5 +1,5 @@ -The notification services represent integration with services such as slack, email or custom webhook. Services are configured in `argocd-notifications-cm` ConfigMap -using `service..()` keys and might reference sensitive data from `argocd-notifications-secret` Secret. Following example demonstrates slack +The notification services represent integration with services such as slack, email or custom webhook. Services are configured in `argo-rollouts-notification-configmap` ConfigMap +using `service..()` keys and might reference sensitive data from `argo-rollouts-notification-secret` Secret. Following example demonstrates slack service configuration: ```yaml diff --git a/docs/generated/notification-services/pagerduty.md b/docs/generated/notification-services/pagerduty.md index 3b507e7fdb..8ac83bacce 100755 --- a/docs/generated/notification-services/pagerduty.md +++ b/docs/generated/notification-services/pagerduty.md @@ -26,7 +26,7 @@ stringData: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.pagerduty: | token: $pagerdutyToken @@ -41,7 +41,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: template.rollout-aborted: | message: Rollout {{.rollout.metadata.name}} is aborted. diff --git a/docs/generated/notification-services/pagerduty_v2.md b/docs/generated/notification-services/pagerduty_v2.md index 01eee28fc0..36b91783b3 100755 --- a/docs/generated/notification-services/pagerduty_v2.md +++ b/docs/generated/notification-services/pagerduty_v2.md @@ -28,7 +28,7 @@ stringData: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.pagerdutyv2: | serviceKeys: @@ -43,7 +43,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: template.rollout-aborted: | message: Rollout {{.rollout.metadata.name}} is aborted. diff --git a/docs/generated/notification-services/pushover.md b/docs/generated/notification-services/pushover.md index 37cb20b277..bdcf1b48b4 100755 --- a/docs/generated/notification-services/pushover.md +++ b/docs/generated/notification-services/pushover.md @@ -1,13 +1,13 @@ # Pushover 1. Create an app at [pushover.net](https://pushover.net/apps/build). -2. Store the API key in `` Secret and define the secret name in `` ConfigMap: +2. Store the API key in `` Secret and define the secret name in `argo-rollouts-notification-configmap` ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.pushover: | token: $pushover-token diff --git a/docs/generated/notification-services/rocketchat.md b/docs/generated/notification-services/rocketchat.md index f115705013..a283d84fa6 100755 --- a/docs/generated/notification-services/rocketchat.md +++ b/docs/generated/notification-services/rocketchat.md @@ -43,7 +43,7 @@ stringData: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.rocketchat: | email: $rocketchat-email diff --git a/docs/generated/notification-services/slack.md b/docs/generated/notification-services/slack.md index 0f3fdf1739..625199525d 100755 --- a/docs/generated/notification-services/slack.md +++ b/docs/generated/notification-services/slack.md @@ -15,6 +15,7 @@ The Slack notification service configuration includes following settings: | `signingSecret` | False | `string` | | `8f742231b10e8888abcd99yyyzzz85a5` | | `token` | **True** | `string` | The app's OAuth access token. | `xoxb-1234567890-1234567890123-5n38u5ed63fgzqlvuyxvxcx6` | | `username` | False | `string` | The app username. | `argocd` | +| `disableUnfurl` | False | `bool` | Disable slack unfurling links in messages | `true` | ## Configuration @@ -31,7 +32,7 @@ The Slack notification service configuration includes following settings: 1. Create a public or private channel, for this example `my_channel` 1. Invite your slack bot to this channel **otherwise slack bot won't be able to deliver notifications to this channel** -1. Store Oauth access token in `argocd-notifications-secret` secret +1. Store Oauth access token in `argo-rollouts-notification-secret` secret ```yaml apiVersion: v1 @@ -42,13 +43,13 @@ The Slack notification service configuration includes following settings: slack-token: ``` -1. Define service type slack in data section of `argocd-notifications-cm` configmap: +1. Define service type slack in data section of `argo-rollouts-notification-configmap` configmap: ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.slack: | token: $slack-token diff --git a/docs/generated/notification-services/teams.md b/docs/generated/notification-services/teams.md index 8b8c6b819c..d04a644c60 100755 --- a/docs/generated/notification-services/teams.md +++ b/docs/generated/notification-services/teams.md @@ -12,13 +12,13 @@ The Teams notification service send message notifications using Teams bot and re 2. Find `Incoming Webhook` microsoft app and click on it 3. Press `Add to a team` -> select team and channel -> press `Set up a connector` 4. Enter webhook name and upload image (optional) -5. Press `Create` then copy webhook url and store it in `argocd-notifications-secret` and define it in `argocd-notifications-cm` +5. Press `Create` then copy webhook url and store it in `argo-rollouts-notification-secret` and define it in `argo-rollouts-notification-configmap` ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.teams: | recipientUrls: diff --git a/docs/generated/notification-services/telegram.md b/docs/generated/notification-services/telegram.md index 953c2a9fca..bdec349a57 100755 --- a/docs/generated/notification-services/telegram.md +++ b/docs/generated/notification-services/telegram.md @@ -2,13 +2,13 @@ 1. Get an API token using [@Botfather](https://t.me/Botfather). 2. Store token in `` Secret and configure telegram integration -in `` ConfigMap: +in `argo-rollouts-notification-configmap` ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.telegram: | token: $telegram-token @@ -33,3 +33,12 @@ metadata: annotations: notifications.argoproj.io/subscribe.on-sync-succeeded.telegram: -1000000000000 ``` + +If your private chat contains threads, you can optionally specify a thread id by seperating it with a `|`: +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + notifications.argoproj.io/subscribe.on-sync-succeeded.telegram: -1000000000000|2 +``` diff --git a/docs/generated/notification-services/webex.md b/docs/generated/notification-services/webex.md index 440ed1ddc7..01706d1474 100755 --- a/docs/generated/notification-services/webex.md +++ b/docs/generated/notification-services/webex.md @@ -9,7 +9,7 @@ The Webex Teams notification service configuration includes following settings: ## Configuration 1. Create a Webex [Bot](https://developer.webex.com/docs/bots) -1. Copy the bot access [token](https://developer.webex.com/my-apps) and store it in the `argocd-notifications-secret` Secret and configure Webex Teams integration in `argocd-notifications-cm` ConfigMap +1. Copy the bot access [token](https://developer.webex.com/my-apps) and store it in the `argo-rollouts-notification-secret` Secret and configure Webex Teams integration in `argo-rollouts-notification-configmap` ConfigMap ``` yaml apiVersion: v1 @@ -24,7 +24,7 @@ The Webex Teams notification service configuration includes following settings: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webex: | token: $webex-token diff --git a/docs/generated/notification-services/webhook.md b/docs/generated/notification-services/webhook.md index 9650984022..f1c88c2d13 100755 --- a/docs/generated/notification-services/webhook.md +++ b/docs/generated/notification-services/webhook.md @@ -25,13 +25,13 @@ The wait time between retries is between `retryWaitMin` and `retryWaitMax`. If a Use the following steps to configure webhook: -1 Register webhook in `argocd-notifications-cm` ConfigMap: +1 Register webhook in `argo-rollouts-notification-configmap` ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.: | url: https:/// @@ -50,7 +50,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: template.github-commit-status: | webhook: @@ -82,7 +82,7 @@ metadata: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.github: | url: https://api.github.com @@ -97,7 +97,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.github: | url: https://api.github.com @@ -128,7 +128,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.jenkins: | url: http:///job//build?token= @@ -145,7 +145,7 @@ type: Opaque apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.form: | url: https://form.example.com @@ -166,7 +166,7 @@ data: apiVersion: v1 kind: ConfigMap metadata: - name: + name: argo-rollouts-notification-configmap data: service.webhook.slack_webhook: | url: https://hooks.slack.com/services/xxxxx diff --git a/go.mod b/go.mod index 45a7d3bcac..ced9f72fcd 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/antonmedv/expr v1.15.5 - github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 + github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.25.0 github.com/aws/aws-sdk-go-v2/config v1.27.0 @@ -84,7 +84,7 @@ require ( github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 // indirect @@ -202,6 +202,7 @@ require ( replace ( github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 + github.com/go-telegram-bot-api/telegram-bot-api/v5 => github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf k8s.io/api v0.0.0 => k8s.io/api v0.26.11 k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.26.11 k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.26.11 diff --git a/go.sum b/go.sum index 2be926f52e..096897718e 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,8 @@ github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf h1:a7VKhbjKYPO8twGy/1AxMpM2Fp0qT7bf25fmCVMVu4s= +github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/PagerDuty/go-pagerduty v1.7.0 h1:S1NcMKECxT5hJwV4VT+QzeSsSiv4oWl1s2821dUqG/8= github.com/PagerDuty/go-pagerduty v1.7.0/go.mod h1:PuFyJKRz1liIAH4h5KVXVD18Obpp1ZXRdxHvmGXooro= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= @@ -81,8 +83,8 @@ github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4J github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE= -github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1 h1:MYlXNoATpyNCYXlh0iMs1xd2Q+VWzNbl8Zg6G/lQjKQ= -github.com/argoproj/notifications-engine v0.4.1-0.20231213155711-c02dc5fdb5e1/go.mod h1:E/vv4+by868m0mmflaRfGBmKBtAupoF+mmyfekP8QCk= +github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 h1:4jbSTsw6/9pulz2eVoLnKtn75FYIeaLCNBOA1LjG1fA= +github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954/go.mod h1:E4gOYnn452S8c10UucTztrZx/cTGU+jgMZiqfH9HUck= github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -90,7 +92,6 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.25.0 h1:sv7+1JVJxOu/dD/sz/csHX7jFqmP001TIY7aytBWDSQ= github.com/aws/aws-sdk-go-v2 v1.25.0/go.mod h1:G104G1Aho5WqF+SR3mDIobTABQzpYV0WxMsKxlMggOA= github.com/aws/aws-sdk-go-v2/config v1.27.0 h1:J5sdGCAHuWKIXLeXiqr8II/adSvetkx0qdZwdbXXpb0= @@ -99,10 +100,8 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.0 h1:lMW2x6sKBsiAJrpi1doOXqWFyEPo github.com/aws/aws-sdk-go-v2/credentials v1.17.0/go.mod h1:uT41FIH8cCIxOdUYIL0PYyHlL1NoneDuDSCwg5VE/5o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 h1:xWCwjjvVz2ojYTP4kBKUuUh9ZrXfcAXpflhOUUeXg1k= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0/go.mod h1:j3fACuqXg4oMTQOR2yY7m0NmJY0yBK4L4sLsRXq1Ins= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 h1:NPs/EqVO+ajwOoq56EfcGKa3L3ruWuazkIw1BqxwOPw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0/go.mod h1:D+duLy2ylgatV+yTlQ8JTuLfDD0BnFvnQRc+o6tbZ4M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 h1:ks7KGMVUMoDzcxNWUlEdI+/lokMFD136EL6DWmUOV80= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0/go.mod h1:hL6BWM/d/qz113fVitZjbXR0E+RCTU1+x+1Idyn5NgE= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= @@ -115,15 +114,14 @@ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFl github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0/go.mod h1:SxIkWpByiGbhbHYTo9CMTUnx2G4p4ZQMrDPcRRy//1c= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 h1:SHN/umDLTmFTmYfI+gkanz6da3vK8Kvj/5wkqnTHbuA= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0/go.mod h1:l8gPU5RYGOFHJqWEpPMoRTP0VoaWQSkJdKo+hwWnnDA= -github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0 h1:tQoMg8i4nFAB70cJ4wiAYEiZRYo2P6uDmU2D6ys/igo= -github.com/aws/aws-sdk-go-v2/service/sqs v1.20.0/go.mod h1:jQhN5f4p3PALMNlUtfb/0wGIFlV7vGtJlPDVfxfNfPY= +github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= +github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 h1:u6OkVDxtBPnxPkZ9/63ynEe+8kHbtS5IfaC4PzVxzWM= github.com/aws/aws-sdk-go-v2/service/sso v1.19.0/go.mod h1:YqbU3RS/pkDVu+v+Nwxvn0i1WB0HkNWEePWbmODEbbs= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 h1:6DL0qu5+315wbsAEEmzK+P9leRwNbkp+lGjPC+CEvb8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0/go.mod h1:olUAyg+FaoFaL/zFaeQQONjOZ9HXoxgvI/c7mQTYz7M= github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 h1:cjTRjh700H36MQ8M0LnDn33W3JmwC77mdxIIyPWCdpM= github.com/aws/aws-sdk-go-v2/service/sts v1.27.0/go.mod h1:nXfOBMWPokIbOY+Gi7a1psWMSvskUCemZzI+SMB7Akc= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.20.0 h1:6+kZsCXZwKxZS9RfISnPc4EXlHoyAkm2hPuM8X2BrrQ= github.com/aws/smithy-go v1.20.0/go.mod h1:uo5RKksAl4PzhqaAbjd4rLgFoq5koTsQKYuGe7dklGc= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= @@ -251,8 +249,6 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= diff --git a/hack/gen-docs/main.go b/hack/gen-docs/main.go index b00f7988e2..8ad71587e8 100644 --- a/hack/gen-docs/main.go +++ b/hack/gen-docs/main.go @@ -36,6 +36,12 @@ func generateNotificationsDocs() { if e := updateMkDocsNav("Notifications", "Services", files); e != nil { log.Fatal(e) } + if e := strReplaceDocFiles("argocd-notifications-cm", "argo-rollouts-notification-configmap", files); e != nil { + log.Fatal(e) + } + if e := strReplaceDocFiles("argocd-notifications-secret", "argo-rollouts-notification-secret", files); e != nil { + log.Fatal(e) + } } } @@ -264,6 +270,22 @@ func commandName(cmd string) string { return strings.Replace(cmd, "kubectl-argo-", "", 1) } +// strReplaceDocFiles replaces old string with new string in list of document files +func strReplaceDocFiles(old string, new string, files []string) error { + baseDir := "./docs/" + for _, file := range files { + data, err := os.ReadFile(baseDir + file) + if err != nil { + return err + } + newdata := strings.ReplaceAll(string(data), old, new) + if err := os.WriteFile(baseDir+file, []byte(newdata), 0644); err != nil { + return err + } + } + return nil +} + type byName []*cobra.Command func (s byName) Len() int { return len(s) } From e547e57df30d10938df4e2f7161fa596888c7fbd Mon Sep 17 00:00:00 2001 From: Chetan Banavikalmutt Date: Tue, 27 Feb 2024 23:09:08 +0530 Subject: [PATCH 199/264] fix: include the correct response error in the plugin init error message (#3388) fix: include the response error in the plugin init error message Signed-off-by: Chetan Banavikalmutt --- rollout/trafficrouting/plugin/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollout/trafficrouting/plugin/client/client.go b/rollout/trafficrouting/plugin/client/client.go index 7493d1ca67..a9a8b0b713 100644 --- a/rollout/trafficrouting/plugin/client/client.go +++ b/rollout/trafficrouting/plugin/client/client.go @@ -83,7 +83,7 @@ func (t *trafficPlugin) startPlugin(pluginName string) (rpc.TrafficRouterPlugin, resp := t.plugin[pluginName].InitPlugin() if resp.HasError() { - return nil, fmt.Errorf("unable to initialize plugin via rpc (%s): %w", pluginName, err) + return nil, fmt.Errorf("unable to initialize plugin via rpc (%s): %w", pluginName, resp) } } From f89b3d415b33c551c6b15586c7035b96206f8bef Mon Sep 17 00:00:00 2001 From: Michael Wilkerson <62034708+wilkermichael@users.noreply.github.com> Date: Tue, 27 Feb 2024 09:43:36 -0800 Subject: [PATCH 200/264] docs: added Consul plugin support to website (#3362) * added Consul plugin support to website Signed-off-by: Michael Wilkerson * addressed comments Signed-off-by: Michael Wilkerson --------- Signed-off-by: Michael Wilkerson --- docs/features/traffic-management/plugins.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/features/traffic-management/plugins.md b/docs/features/traffic-management/plugins.md index a6747f14fa..7f8d8e1b11 100644 --- a/docs/features/traffic-management/plugins.md +++ b/docs/features/traffic-management/plugins.md @@ -73,6 +73,9 @@ responsibility of the Argo Rollouts administrator to define the plugin installat * This is just a sample plugin that can be used as a starting point for creating your own plugin. It is not meant to be used in production. It is based on the built-in prometheus provider. +#### [Consul](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-consul) +* This is a plugin that allows argo-rollouts to work with Consul's service mesh for traffic shaping patterns. + #### [Contour](https://github.com/argoproj-labs/rollouts-plugin-trafficrouter-contour) * This is a plugin that allows argo-rollouts to work with contour's resource: HTTPProxy. It enables traffic shaping patterns such as canary releases and more. From 5843fe34aaa2034c35f27d3ac3e4f82d10f4c207 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:44:41 +0000 Subject: [PATCH 201/264] chore(deps): bump codecov/codecov-action from 4.0.1 to 4.1.0 (#3403) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.0.1 to 4.1.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.0.1...v4.1.0) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index b2b68321fa..6ef64e0c82 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v4.0.1 + uses: codecov/codecov-action@v4.1.0 with: file: coverage.out From 1c2f80d9e5c278eaf85d76d0d917f6be02073914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 18:10:26 +0000 Subject: [PATCH 202/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.33.0 to 1.36.1 (#3400) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.33.0 to 1.36.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.33.0...service/ec2/v1.36.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index ced9f72fcd..17f9ec223f 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.25.0 + github.com/aws/aws-sdk-go-v2 v1.25.2 github.com/aws/aws-sdk-go-v2/config v1.27.0 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 @@ -79,8 +79,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.0 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 // indirect @@ -88,7 +88,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 // indirect - github.com/aws/smithy-go v1.20.0 // indirect + github.com/aws/smithy-go v1.20.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 096897718e..1d4b39b497 100644 --- a/go.sum +++ b/go.sum @@ -92,22 +92,22 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.25.0 h1:sv7+1JVJxOu/dD/sz/csHX7jFqmP001TIY7aytBWDSQ= -github.com/aws/aws-sdk-go-v2 v1.25.0/go.mod h1:G104G1Aho5WqF+SR3mDIobTABQzpYV0WxMsKxlMggOA= +github.com/aws/aws-sdk-go-v2 v1.25.2 h1:/uiG1avJRgLGiQM9X3qJM8+Qa6KRGK5rRPuXE0HUM+w= +github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= github.com/aws/aws-sdk-go-v2/config v1.27.0 h1:J5sdGCAHuWKIXLeXiqr8II/adSvetkx0qdZwdbXXpb0= github.com/aws/aws-sdk-go-v2/config v1.27.0/go.mod h1:cfh8v69nuSUohNFMbIISP2fhmblGmYEOKs5V53HiHnk= github.com/aws/aws-sdk-go-v2/credentials v1.17.0 h1:lMW2x6sKBsiAJrpi1doOXqWFyEPoE886DTb1X0wb7So= github.com/aws/aws-sdk-go-v2/credentials v1.17.0/go.mod h1:uT41FIH8cCIxOdUYIL0PYyHlL1NoneDuDSCwg5VE/5o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 h1:xWCwjjvVz2ojYTP4kBKUuUh9ZrXfcAXpflhOUUeXg1k= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0/go.mod h1:j3fACuqXg4oMTQOR2yY7m0NmJY0yBK4L4sLsRXq1Ins= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0 h1:NPs/EqVO+ajwOoq56EfcGKa3L3ruWuazkIw1BqxwOPw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.0/go.mod h1:D+duLy2ylgatV+yTlQ8JTuLfDD0BnFvnQRc+o6tbZ4M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0 h1:ks7KGMVUMoDzcxNWUlEdI+/lokMFD136EL6DWmUOV80= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.0/go.mod h1:hL6BWM/d/qz113fVitZjbXR0E+RCTU1+x+1Idyn5NgE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 h1:bNo4LagzUKbjdxE0tIcR9pMzLR2U/Tgie1Hq1HQ3iH8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 h1:EtOU5jsPdIQNP+6Q2C5e3d65NKT1PeCiQk+9OdzO12Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0 h1:0kI/uFLCoDoDMaD1rSnXC9/DtdRZpx1mVFJ+xOL/M+k= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.33.0/go.mod h1:3ToKMEhVj+Q+HzZ8Hqin6LdAKtsi3zVXVNUPpQMd+Xk= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 h1:mQySuI87thHtcbZvEDjwUROGWikU6fqgpHklCBXpJU4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1/go.mod h1:Z1ThUUTuCO9PArtiQsTmBGBv+38NGj+795Zl0n1jgiM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 h1:r9eCNAMs0C4gjkod/p4dsb+ZMOQAkdjPuin9QUUcjmY= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFlO0KsveiP90IUJh8Xr/cx9US2PqkSroaLc+o8= @@ -122,8 +122,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 h1:6DL0qu5+315wbsAEEmzK+P9l github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0/go.mod h1:olUAyg+FaoFaL/zFaeQQONjOZ9HXoxgvI/c7mQTYz7M= github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 h1:cjTRjh700H36MQ8M0LnDn33W3JmwC77mdxIIyPWCdpM= github.com/aws/aws-sdk-go-v2/service/sts v1.27.0/go.mod h1:nXfOBMWPokIbOY+Gi7a1psWMSvskUCemZzI+SMB7Akc= -github.com/aws/smithy-go v1.20.0 h1:6+kZsCXZwKxZS9RfISnPc4EXlHoyAkm2hPuM8X2BrrQ= -github.com/aws/smithy-go v1.20.0/go.mod h1:uo5RKksAl4PzhqaAbjd4rLgFoq5koTsQKYuGe7dklGc= +github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From dc6da7dc63a86128292717599504038a1cc0da73 Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar <44349253+gdsoumya@users.noreply.github.com> Date: Wed, 28 Feb 2024 12:50:43 +0530 Subject: [PATCH 203/264] feat: allow analysis run to use separate kubeconfig for jobs (#3350) * feat: allows analysis run to use separate kubeconfig for jobs Signed-off-by: Soumya Ghosh Dastidar * fix: tests Signed-off-by: Soumya Ghosh Dastidar * refactor: rename env var names Signed-off-by: Soumya Ghosh Dastidar --------- Signed-off-by: Soumya Ghosh Dastidar --- analysis/controller.go | 25 ++++++-- cmd/rollouts-controller/main.go | 13 +++- metricproviders/job/job.go | 60 +++++++++++++------ metricproviders/job/job_test.go | 4 +- metricproviders/metricproviders.go | 44 +++++++++++++- .../info/analysisrun_info.go | 7 ++- utils/controller/controller.go | 7 ++- 7 files changed, 131 insertions(+), 29 deletions(-) diff --git a/analysis/controller.go b/analysis/controller.go index b3519619ae..e8dcb8601a 100644 --- a/analysis/controller.go +++ b/analysis/controller.go @@ -6,6 +6,7 @@ import ( "time" "github.com/argoproj/argo-rollouts/metric" + jobProvider "github.com/argoproj/argo-rollouts/metricproviders/job" unstructuredutil "github.com/argoproj/argo-rollouts/utils/unstructured" @@ -106,13 +107,13 @@ func NewController(cfg ControllerConfig) *Controller { cfg.JobInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj any) { - controller.enqueueIfCompleted(obj) + controller.enqueueJobIfCompleted(obj) }, UpdateFunc: func(oldObj, newObj any) { - controller.enqueueIfCompleted(newObj) + controller.enqueueJobIfCompleted(newObj) }, DeleteFunc: func(obj any) { - controller.enqueueIfCompleted(obj) + controller.enqueueJobIfCompleted(obj) }, }) @@ -186,7 +187,21 @@ func (c *Controller) syncHandler(ctx context.Context, key string) error { return c.persistAnalysisRunStatus(run, newRun.Status) } -func (c *Controller) enqueueIfCompleted(obj any) { +func (c *Controller) jobParentNamespace(obj any) string { + job, ok := obj.(*batchv1.Job) + if !ok { + return "" + } + ns := job.GetNamespace() + if job.Annotations != nil { + if job.Annotations[jobProvider.AnalysisRunNamespaceAnnotationKey] != "" { + ns = job.Annotations[jobProvider.AnalysisRunNamespaceAnnotationKey] + } + } + return ns +} + +func (c *Controller) enqueueJobIfCompleted(obj any) { job, ok := obj.(*batchv1.Job) if !ok { return @@ -194,7 +209,7 @@ func (c *Controller) enqueueIfCompleted(obj any) { for _, condition := range job.Status.Conditions { switch condition.Type { case batchv1.JobFailed, batchv1.JobComplete: - controllerutil.EnqueueParentObject(job, register.AnalysisRunKind, c.enqueueAnalysis) + controllerutil.EnqueueParentObject(job, register.AnalysisRunKind, c.enqueueAnalysis, c.jobParentNamespace) return } } diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index b144defca4..d198db3c31 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/argoproj/argo-rollouts/metricproviders" "github.com/argoproj/argo-rollouts/utils/record" "github.com/argoproj/pkg/kubeclientmetrics" smiclientset "github.com/servicemeshinterface/smi-sdk-go/pkg/gen/client/split/clientset/versioned" @@ -131,6 +132,7 @@ func newCommand() *cobra.Command { discoveryClient, err := discovery.NewDiscoveryClientForConfig(config) checkError(err) smiClient, err := smiclientset.NewForConfig(config) + checkError(err) resyncDuration := time.Duration(rolloutResyncPeriod) * time.Second kubeInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( kubeClient, @@ -140,10 +142,17 @@ func newCommand() *cobra.Command { instanceIDTweakListFunc := func(options *metav1.ListOptions) { options.LabelSelector = instanceIDSelector.String() } + jobKubeClient, err := metricproviders.GetAnalysisJobClientset(kubeClient) + checkError(err) + jobNs := metricproviders.GetAnalysisJobNamespace() + if jobNs == "" { + // if not set explicitly use the configured ns + jobNs = namespace + } jobInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions( - kubeClient, + jobKubeClient, resyncDuration, - kubeinformers.WithNamespace(namespace), + kubeinformers.WithNamespace(jobNs), kubeinformers.WithTweakListOptions(func(options *metav1.ListOptions) { options.LabelSelector = jobprovider.AnalysisRunUIDLabelKey })) diff --git a/metricproviders/job/job.go b/metricproviders/job/job.go index 6a6d866a4c..8d76302149 100644 --- a/metricproviders/job/job.go +++ b/metricproviders/job/job.go @@ -11,6 +11,7 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" batchlisters "k8s.io/client-go/listers/batch/v1" @@ -24,8 +25,12 @@ const ( ProviderType = "Job" // JobNameKey is the measurement's metadata key holding the job name associated with the measurement JobNameKey = "job-name" + // JobNamespaceKey is the measurement's metadata key holding the job namespace associated with the measurement + JobNamespaceKey = "job-namespace" // AnalysisRunNameAnnotationKey is the job's annotation key containing the name of the controller AnalysisRun AnalysisRunNameAnnotationKey = "analysisrun.argoproj.io/name" + // AnalysisRunNamespaceAnnotationKey is the job's annotation key containing the namespace of the controller AnalysisRun + AnalysisRunNamespaceAnnotationKey = "analysisrun.argoproj.io/namespace" // AnalysisRunMetricLabelKey is the job's annotation key containing the name of the associated AnalysisRun metric AnalysisRunMetricAnnotationKey = "analysisrun.argoproj.io/metric-name" // AnalysisRunUIDLabelKey is the job's label key containing the uid of the associated AnalysisRun @@ -41,13 +46,15 @@ type JobProvider struct { kubeclientset kubernetes.Interface jobLister batchlisters.JobLister logCtx log.Entry + jobNamespace string } -func NewJobProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, jobLister batchlisters.JobLister) *JobProvider { +func NewJobProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, jobLister batchlisters.JobLister, jobNS string) *JobProvider { return &JobProvider{ kubeclientset: kubeclientset, logCtx: logCtx, jobLister: jobLister, + jobNamespace: jobNS, } } @@ -78,7 +85,11 @@ func getJobIDSuffix(run *v1alpha1.AnalysisRun, metricName string) int { return int(res.Count + res.Error + 1) } -func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) (*batchv1.Job, error) { +func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, jobNS string) (*batchv1.Job, error) { + ns := run.Namespace + if jobNS != "" { + ns = jobNS + } jobAnnotations := metric.Provider.Job.Metadata.GetAnnotations() jobLabels := metric.Provider.Job.Metadata.GetLabels() if jobAnnotations == nil { @@ -89,11 +100,12 @@ func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) (*batchv1.J } jobLabels[AnalysisRunUIDLabelKey] = string(run.UID) jobAnnotations[AnalysisRunNameAnnotationKey] = run.Name + jobAnnotations[AnalysisRunNamespaceAnnotationKey] = run.Namespace jobAnnotations[AnalysisRunMetricAnnotationKey] = metric.Name job := batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Name: newJobName(run, metric), - Namespace: run.Namespace, + Namespace: ns, OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(run, analysisRunGVK)}, Annotations: jobAnnotations, Labels: jobLabels, @@ -110,12 +122,12 @@ func (p *JobProvider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1a StartedAt: &now, Phase: v1alpha1.AnalysisPhaseRunning, } - job, err := newMetricJob(run, metric) + job, err := newMetricJob(run, metric, p.jobNamespace) if err != nil { p.logCtx.Errorf("job initialization failed: %v", err) return metricutil.MarkMeasurementError(measurement, err) } - jobIf := p.kubeclientset.BatchV1().Jobs(run.Namespace) + jobIf := p.kubeclientset.BatchV1().Jobs(job.Namespace) createdJob, createErr := jobIf.Create(ctx, job, metav1.CreateOptions{}) if createErr != nil { if !k8serrors.IsAlreadyExists(createErr) { @@ -137,19 +149,20 @@ func (p *JobProvider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1a createdJob = existingJob } measurement.Metadata = map[string]string{ - JobNameKey: createdJob.Name, + JobNameKey: createdJob.Name, + JobNamespaceKey: createdJob.Namespace, } p.logCtx.Infof("job %s/%s created", createdJob.Namespace, createdJob.Name) return measurement } func (p *JobProvider) Resume(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, measurement v1alpha1.Measurement) v1alpha1.Measurement { - jobName, err := getJobName(measurement) + jobName, err := getJobNamespacedName(measurement, run.Namespace) now := timeutil.MetaNow() if err != nil { return metricutil.MarkMeasurementError(measurement, err) } - job, err := p.jobLister.Jobs(run.Namespace).Get(jobName) + job, err := p.jobLister.Jobs(jobName.Namespace).Get(jobName.Name) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } @@ -170,26 +183,39 @@ func (p *JobProvider) Resume(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, } func (p *JobProvider) Terminate(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, measurement v1alpha1.Measurement) v1alpha1.Measurement { - jobName, err := getJobName(measurement) + jobName, err := getJobNamespacedName(measurement, run.Namespace) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } - err = p.deleteJob(run.Namespace, jobName) + err = p.deleteJob(jobName.Namespace, jobName.Name) if err != nil { return metricutil.MarkMeasurementError(measurement, err) } now := timeutil.MetaNow() measurement.FinishedAt = &now measurement.Phase = v1alpha1.AnalysisPhaseSuccessful - p.logCtx.Infof("job %s/%s terminated", run.Namespace, jobName) + p.logCtx.Infof("job %s/%s terminated", jobName.Namespace, jobName.Name) return measurement } -func getJobName(measurement v1alpha1.Measurement) (string, error) { - if measurement.Metadata != nil && measurement.Metadata[JobNameKey] != "" { - return measurement.Metadata[JobNameKey], nil +func getJobNamespacedName(measurement v1alpha1.Measurement, defaultNS string) (types.NamespacedName, error) { + name := types.NamespacedName{ + Namespace: defaultNS, + Name: "", + } + if measurement.Metadata != nil { + if measurement.Metadata[JobNameKey] != "" { + name.Name = measurement.Metadata[JobNameKey] + } else { + return name, errors.New("job metadata reference missing") + } + if measurement.Metadata[JobNamespaceKey] != "" { + name.Namespace = measurement.Metadata[JobNamespaceKey] + } + } else { + return name, errors.New("job metadata reference missing") } - return "", errors.New("job metadata reference missing") + return name, nil } func (p *JobProvider) deleteJob(namespace, jobName string) error { @@ -220,11 +246,11 @@ func (p *JobProvider) GarbageCollect(run *v1alpha1.AnalysisRun, metric v1alpha1. totalJobs := len(jobs) if totalJobs > limit { for i := 0; i < totalJobs-limit; i++ { - err = p.deleteJob(run.Namespace, jobs[i].Name) + err = p.deleteJob(jobs[i].Namespace, jobs[i].Name) if err != nil { return err } - p.logCtx.Infof("job %s/%s garbage collected", run.Namespace, jobs[i].Name) + p.logCtx.Infof("job %s/%s garbage collected", jobs[i].Namespace, jobs[i].Name) } } return nil diff --git a/metricproviders/job/job_test.go b/metricproviders/job/job_test.go index fd278afec8..c8ef2af3a0 100644 --- a/metricproviders/job/job_test.go +++ b/metricproviders/job/job_test.go @@ -36,7 +36,7 @@ func newTestJobProvider(objects ...runtime.Object) *JobProvider { cancel() jobLister := k8sI.Batch().V1().Jobs().Lister() - return NewJobProvider(*logCtx, kubeclient, jobLister) + return NewJobProvider(*logCtx, kubeclient, jobLister, "") } func newRunWithJobMetric() *v1alpha1.AnalysisRun { @@ -193,7 +193,7 @@ func TestRunCreateCollision(t *testing.T) { p := newTestJobProvider() run := newRunWithJobMetric() - existingJob, err := newMetricJob(run, run.Spec.Metrics[0]) + existingJob, err := newMetricJob(run, run.Spec.Metrics[0], p.jobNamespace) assert.NoError(t, err) fakeClient := p.kubeclientset.(*k8sfake.Clientset) fakeClient.Tracker().Add(existingJob) diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index d8e6c09881..db135b82ca 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -2,10 +2,13 @@ package metricproviders import ( "fmt" + "os" "github.com/argoproj/argo-rollouts/metric" "github.com/argoproj/argo-rollouts/metricproviders/influxdb" "github.com/argoproj/argo-rollouts/metricproviders/skywalking" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" "github.com/argoproj/argo-rollouts/metricproviders/cloudwatch" "github.com/argoproj/argo-rollouts/metricproviders/datadog" @@ -26,6 +29,12 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" ) +const ( + InclusterKubeconfig = "in-cluster" + AnalysisJobKubeconfigEnv = "ARGO_ROLLOUTS_ANALYSIS_JOB_KUBECONFIG" + AnalysisJobNamespaceEnv = "ARGO_ROLLOUTS_ANALYSIS_JOB_NAMESPACE" +) + type ProviderFactory struct { KubeClient kubernetes.Interface JobLister batchlisters.JobLister @@ -43,7 +52,12 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) } return prometheus.NewPrometheusProvider(api, logCtx, metric) case job.ProviderType: - return job.NewJobProvider(logCtx, f.KubeClient, f.JobLister), nil + kubeClient, err := GetAnalysisJobClientset(f.KubeClient) + if err != nil { + return nil, err + } + + return job.NewJobProvider(logCtx, kubeClient, f.JobLister, GetAnalysisJobNamespace()), nil case kayenta.ProviderType: c := kayenta.NewHttpClient() return kayenta.NewKayentaProvider(logCtx, c), nil @@ -135,3 +149,31 @@ func Type(metric v1alpha1.Metric) string { return "Unknown Provider" } + +// GetAnalysisJobClientset returns kubernetes clientset for executing the analysis job metric, +// if the AnalysisJobKubeconfigEnv is set to InclusterKubeconfig, it will return the incluster client +// else if it's set to a kubeconfig file it will return the clientset corresponding to the kubeconfig file. +// If empty it returns the provided defaultClientset +func GetAnalysisJobClientset(defaultClientset kubernetes.Interface) (kubernetes.Interface, error) { + customJobKubeconfig := os.Getenv(AnalysisJobKubeconfigEnv) + if customJobKubeconfig != "" { + var ( + cfg *rest.Config + err error + ) + if customJobKubeconfig == InclusterKubeconfig { + cfg, err = rest.InClusterConfig() + } else { + cfg, err = clientcmd.BuildConfigFromFlags("", customJobKubeconfig) + } + if err != nil { + return nil, err + } + return kubernetes.NewForConfig(cfg) + } + return defaultClientset, nil +} + +func GetAnalysisJobNamespace() string { + return os.Getenv(AnalysisJobNamespaceEnv) +} diff --git a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go index abf19b1273..8f7049a3e5 100644 --- a/pkg/kubectl-argo-rollouts/info/analysisrun_info.go +++ b/pkg/kubectl-argo-rollouts/info/analysisrun_info.go @@ -70,9 +70,14 @@ func getAnalysisRunInfo(ownerUID types.UID, allAnalysisRuns []*v1alpha1.Analysis for _, measurement := range analysisutil.ArrayMeasurement(run, mr.Name) { if measurement.Metadata != nil { if jobName, ok := measurement.Metadata[job.JobNameKey]; ok { + ns := run.Namespace + if jobNamespace, ok := measurement.Metadata[job.JobNamespaceKey]; ok { + ns = jobNamespace + } jobInfo := rollout.JobInfo{ ObjectMeta: &v1.ObjectMeta{ - Name: jobName, + Name: jobName, + Namespace: ns, }, Icon: analysisIcon(measurement.Phase), Status: string(measurement.Phase), diff --git a/utils/controller/controller.go b/utils/controller/controller.go index 36ebfa9088..9c4b05cf26 100644 --- a/utils/controller/controller.go +++ b/utils/controller/controller.go @@ -222,7 +222,7 @@ func EnqueueRateLimited(obj any, q workqueue.RateLimitingInterface) { // It then enqueues that ownerType resource to be processed. If the object does not // have an appropriate OwnerReference, it will simply be skipped. // This function assumes parent object is in the same namespace as the child -func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any)) { +func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any), parentNamespaceGetter ...func(any) string) { var object metav1.Object var ok bool if object, ok = obj.(metav1.Object); !ok { @@ -245,6 +245,11 @@ func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any)) { return } namespace := object.GetNamespace() + if len(parentNamespaceGetter) > 0 { + // If the parentNamespaceGetter is provided, use it to get the parent namespace + // only uses the first parentNamespaceGetter func + namespace = parentNamespaceGetter[0](obj) + } parent := cache.ExplicitKey(namespace + "/" + ownerRef.Name) log.Infof("Enqueueing parent of %s/%s: %s %s", namespace, object.GetName(), ownerRef.Kind, parent) enqueue(parent) From 57097b14f88ca642fda5ef81c7a375b209573667 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:15:23 -0600 Subject: [PATCH 204/264] chore(deps): bump docker/setup-buildx-action from 3.0.0 to 3.1.0 (#3406) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/f95db51fddba0c2d1ec667646a06c2ce06100226...0d103c3126aa41d772a8362f6aa67afac040f80c) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 763e9db125..17d77e86d5 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -79,7 +79,7 @@ jobs: cosign-release: 'v2.2.0' - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + - uses: docker/setup-buildx-action@0d103c3126aa41d772a8362f6aa67afac040f80c # v3.1.0 - name: Setup tags for container image as a CSV type run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fe46ff61ab..53810510d3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -99,7 +99,7 @@ jobs: uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + uses: docker/setup-buildx-action@0d103c3126aa41d772a8362f6aa67afac040f80c # v3.1.0 - name: Generate release artifacts run: | From 4a114cec9884bc32fce9e51a13a27ed8e5459590 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:15:49 -0600 Subject: [PATCH 205/264] chore(deps): bump google.golang.org/grpc from 1.61.0 to 1.62.0 (#3404) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.61.0 to 1.62.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.61.0...v1.62.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 17f9ec223f..263dcf5406 100644 --- a/go.mod +++ b/go.mod @@ -37,8 +37,8 @@ require ( github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.17.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 - google.golang.org/grpc v1.61.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 + google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 @@ -108,7 +108,7 @@ require ( github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.21.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/glog v1.1.2 // indirect + github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect github.com/google/gnostic v0.6.9 // indirect @@ -118,7 +118,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -185,8 +185,8 @@ require ( gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index 1d4b39b497..a14e6f705f 100644 --- a/go.sum +++ b/go.sum @@ -260,8 +260,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -347,8 +347,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -807,7 +807,7 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1028,12 +1028,12 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1050,8 +1050,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 04ff63b370575e1b242a168b21707f3b2b185f72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 16:48:19 +0000 Subject: [PATCH 206/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.27.0 to 1.30.1 (#3399) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.27.0 to 1.30.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.27.0...service/s3/v1.30.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 263dcf5406..21cde62403 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.25.2 github.com/aws/aws-sdk-go-v2/config v1.27.0 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 diff --git a/go.sum b/go.sum index a14e6f705f..348a1a2b3d 100644 --- a/go.sum +++ b/go.sum @@ -108,8 +108,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 h1:mQySuI87thHtcbZvEDjwUROGWikU6fqgpHklCBXpJU4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1/go.mod h1:Z1ThUUTuCO9PArtiQsTmBGBv+38NGj+795Zl0n1jgiM= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0 h1:r9eCNAMs0C4gjkod/p4dsb+ZMOQAkdjPuin9QUUcjmY= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.27.0/go.mod h1:7iQ5nRkEdgQWWOmaA+BBbe1pKX8/sceSO6NSNqVx/vk= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 h1:eDD7nyDlMxlkGhWu0n92LYkuSQIIEwN5CffwiMDohh0= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1/go.mod h1:DGUI2cbxu24m0rNOm7DDmrCtTzR0U0FqE3XpBkR8+r8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFlO0KsveiP90IUJh8Xr/cx9US2PqkSroaLc+o8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0/go.mod h1:SxIkWpByiGbhbHYTo9CMTUnx2G4p4ZQMrDPcRRy//1c= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 h1:SHN/umDLTmFTmYfI+gkanz6da3vK8Kvj/5wkqnTHbuA= From 2e00cd52302b22df91a79e1214f278eac7995f35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 09:33:19 -0600 Subject: [PATCH 207/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.0 to 1.27.4 (#3410) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.27.0 to 1.27.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.27.0...config/v1.27.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 21cde62403..fb5c11aea3 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.25.2 - github.com/aws/aws-sdk-go-v2/config v1.27.0 + github.com/aws/aws-sdk-go-v2/config v1.27.4 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 github.com/blang/semver v3.5.1+incompatible @@ -77,17 +77,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.0 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.4 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 // indirect github.com/aws/smithy-go v1.20.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 348a1a2b3d..6c496a890d 100644 --- a/go.sum +++ b/go.sum @@ -94,12 +94,12 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.25.2 h1:/uiG1avJRgLGiQM9X3qJM8+Qa6KRGK5rRPuXE0HUM+w= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= -github.com/aws/aws-sdk-go-v2/config v1.27.0 h1:J5sdGCAHuWKIXLeXiqr8II/adSvetkx0qdZwdbXXpb0= -github.com/aws/aws-sdk-go-v2/config v1.27.0/go.mod h1:cfh8v69nuSUohNFMbIISP2fhmblGmYEOKs5V53HiHnk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.0 h1:lMW2x6sKBsiAJrpi1doOXqWFyEPoE886DTb1X0wb7So= -github.com/aws/aws-sdk-go-v2/credentials v1.17.0/go.mod h1:uT41FIH8cCIxOdUYIL0PYyHlL1NoneDuDSCwg5VE/5o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 h1:xWCwjjvVz2ojYTP4kBKUuUh9ZrXfcAXpflhOUUeXg1k= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0/go.mod h1:j3fACuqXg4oMTQOR2yY7m0NmJY0yBK4L4sLsRXq1Ins= +github.com/aws/aws-sdk-go-v2/config v1.27.4 h1:AhfWb5ZwimdsYTgP7Od8E9L1u4sKmDW2ZVeLcf2O42M= +github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= +github.com/aws/aws-sdk-go-v2/credentials v1.17.4 h1:h5Vztbd8qLppiPwX+y0Q6WiwMZgpd9keKe2EAENgAuI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 h1:bNo4LagzUKbjdxE0tIcR9pMzLR2U/Tgie1Hq1HQ3iH8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 h1:EtOU5jsPdIQNP+6Q2C5e3d65NKT1PeCiQk+9OdzO12Q= @@ -110,18 +110,18 @@ github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 h1:mQySuI87thHtcbZvEDjwU github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1/go.mod h1:Z1ThUUTuCO9PArtiQsTmBGBv+38NGj+795Zl0n1jgiM= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 h1:eDD7nyDlMxlkGhWu0n92LYkuSQIIEwN5CffwiMDohh0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1/go.mod h1:DGUI2cbxu24m0rNOm7DDmrCtTzR0U0FqE3XpBkR8+r8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0 h1:a33HuFlO0KsveiP90IUJh8Xr/cx9US2PqkSroaLc+o8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.0/go.mod h1:SxIkWpByiGbhbHYTo9CMTUnx2G4p4ZQMrDPcRRy//1c= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0 h1:SHN/umDLTmFTmYfI+gkanz6da3vK8Kvj/5wkqnTHbuA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.0/go.mod h1:l8gPU5RYGOFHJqWEpPMoRTP0VoaWQSkJdKo+hwWnnDA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 h1:5ffmXjPtwRExp1zc7gENLgCPyHFbhEPwVTkTiH9niSk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.19.0 h1:u6OkVDxtBPnxPkZ9/63ynEe+8kHbtS5IfaC4PzVxzWM= -github.com/aws/aws-sdk-go-v2/service/sso v1.19.0/go.mod h1:YqbU3RS/pkDVu+v+Nwxvn0i1WB0HkNWEePWbmODEbbs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 h1:6DL0qu5+315wbsAEEmzK+P9leRwNbkp+lGjPC+CEvb8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0/go.mod h1:olUAyg+FaoFaL/zFaeQQONjOZ9HXoxgvI/c7mQTYz7M= -github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 h1:cjTRjh700H36MQ8M0LnDn33W3JmwC77mdxIIyPWCdpM= -github.com/aws/aws-sdk-go-v2/service/sts v1.27.0/go.mod h1:nXfOBMWPokIbOY+Gi7a1psWMSvskUCemZzI+SMB7Akc= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 h1:utEGkfdQ4L6YW/ietH7111ZYglLJvS+sLriHJ1NBJEQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 h1:9/GylMS45hGGFCcMrUZDVayQE1jYSIN6da9jo7RAYIw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 h1:3I2cBEYgKhrWlwyZgfpSO2BpaMY1LHPqXYk/QGlu2ew= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From fd4079625b0ba8a0f8c39cfb52bd25813ef2740d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 16:18:21 -0600 Subject: [PATCH 208/264] chore(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 (#3419) Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.8.4 to 1.9.0. - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.8.4...v1.9.0) --- updated-dependencies: - dependency-name: github.com/stretchr/testify dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index fb5c11aea3..c99dd4d9a7 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/soheilhy/cmux v0.1.5 github.com/spaceapegames/go-wavefront v1.8.1 github.com/spf13/cobra v1.8.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.17.0 @@ -165,7 +165,7 @@ require ( github.com/slack-go/slack v0.12.2 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fastjson v1.6.3 // indirect diff --git a/go.sum b/go.sum index 6c496a890d..7f0eb9e6a1 100644 --- a/go.sum +++ b/go.sum @@ -634,8 +634,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -646,8 +647,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= From 9de465f094f0bc76134f072d063b94957a5b3dc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 08:27:27 -0600 Subject: [PATCH 209/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.4 to 1.27.5 (#3421) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.27.4 to 1.27.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.27.4...config/v1.27.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index c99dd4d9a7..a46a4430a6 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.25.2 - github.com/aws/aws-sdk-go-v2/config v1.27.4 + github.com/aws/aws-sdk-go-v2/config v1.27.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 github.com/blang/semver v3.5.1+incompatible @@ -77,17 +77,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.4 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.5 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.2 // indirect github.com/aws/smithy-go v1.20.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/go.sum b/go.sum index 7f0eb9e6a1..e40bc67c4f 100644 --- a/go.sum +++ b/go.sum @@ -94,10 +94,10 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.25.2 h1:/uiG1avJRgLGiQM9X3qJM8+Qa6KRGK5rRPuXE0HUM+w= github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= -github.com/aws/aws-sdk-go-v2/config v1.27.4 h1:AhfWb5ZwimdsYTgP7Od8E9L1u4sKmDW2ZVeLcf2O42M= -github.com/aws/aws-sdk-go-v2/config v1.27.4/go.mod h1:zq2FFXK3A416kiukwpsd+rD4ny6JC7QSkp4QdN1Mp2g= -github.com/aws/aws-sdk-go-v2/credentials v1.17.4 h1:h5Vztbd8qLppiPwX+y0Q6WiwMZgpd9keKe2EAENgAuI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.4/go.mod h1:+30tpwrkOgvkJL1rUZuRLoxcJwtI/OkeBLYnHxJtVe0= +github.com/aws/aws-sdk-go-v2/config v1.27.5 h1:brBPsyRFQn97M1ZhQ9tLXkO7Zytiar0NS06FGmEJBdg= +github.com/aws/aws-sdk-go-v2/config v1.27.5/go.mod h1:I53uvsfddRRTG5YcC4n5Z3aOD1BU8hYCoIG7iEJG4wM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.5 h1:yn3zSvIKC2NZIs40cY3kckcy9Zma96PrRR07N54PCvY= +github.com/aws/aws-sdk-go-v2/credentials v1.17.5/go.mod h1:8JcKPAGZVnDWuR5lusAwmrSDtZnDIAnpQWaDC9RFt2g= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 h1:bNo4LagzUKbjdxE0tIcR9pMzLR2U/Tgie1Hq1HQ3iH8= @@ -112,16 +112,16 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 h1:eDD7nyDlM github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1/go.mod h1:DGUI2cbxu24m0rNOm7DDmrCtTzR0U0FqE3XpBkR8+r8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2 h1:5ffmXjPtwRExp1zc7gENLgCPyHFbhEPwVTkTiH9niSk= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.2/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 h1:x0N5ftQzgcfRpCpTiyZC40pvNUJYhzf4UgCsAyO6/P8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 h1:utEGkfdQ4L6YW/ietH7111ZYglLJvS+sLriHJ1NBJEQ= github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 h1:9/GylMS45hGGFCcMrUZDVayQE1jYSIN6da9jo7RAYIw= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.1 h1:3I2cBEYgKhrWlwyZgfpSO2BpaMY1LHPqXYk/QGlu2ew= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.1/go.mod h1:uQ7YYKZt3adCRrdCBREm1CD3efFLOUNH77MrUCvx5oA= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.2 h1:0YjXuWdYHvsm0HnT4vO8XpwG1D+i2roxSCBoN6deJ7M= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.2/go.mod h1:jI+FWmYkSMn+4APWmZiZTgt0oM0TrvymD51FMqCnWgA= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 017537b2193937df97991ee810af8f44a1a3419c Mon Sep 17 00:00:00 2001 From: Liming Liu Date: Wed, 6 Mar 2024 10:21:48 +0800 Subject: [PATCH 210/264] feat: add the max traffic weight support for the traffic routing (nginx/plugins). (#3215) * add support for the traffic weight > 100. Signed-off-by: Liming Liu * unit test for the max weight ingress. Signed-off-by: Liming Liu * unit test for the max weight in canary rollout. Signed-off-by: Liming Liu * add docs Signed-off-by: Zach Aller * add docs Signed-off-by: Zach Aller --------- Signed-off-by: Liming Liu Signed-off-by: Zach Aller Co-authored-by: Zach Aller --- docs/features/specification.md | 3 + manifests/crds/rollout-crd.yaml | 3 + manifests/install.yaml | 3 + pkg/apiclient/rollout/rollout.swagger.json | 5 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 926 +++++++++--------- pkg/apis/rollouts/v1alpha1/generated.proto | 3 + .../rollouts/v1alpha1/openapi_generated.go | 7 + pkg/apis/rollouts/v1alpha1/types.go | 4 + .../v1alpha1/zz_generated.deepcopy.go | 5 + pkg/apis/rollouts/validation/validation.go | 20 +- .../rollouts/validation/validation_test.go | 54 +- .../info/rollout_info.go | 5 +- rollout/canary_test.go | 87 ++ rollout/trafficrouting.go | 10 +- rollout/trafficrouting/nginx/nginx.go | 8 + rollout/trafficrouting/nginx/nginx_test.go | 46 + ui/src/models/rollout/generated/api.ts | 6 + utils/replicaset/canary.go | 48 +- utils/replicaset/canary_test.go | 149 +-- utils/weightutil/weight.go | 13 + 20 files changed, 850 insertions(+), 555 deletions(-) create mode 100644 utils/weightutil/weight.go diff --git a/docs/features/specification.md b/docs/features/specification.md index 85b18f28f6..607367c0c8 100644 --- a/docs/features/specification.md +++ b/docs/features/specification.md @@ -386,6 +386,9 @@ spec: # will achieve traffic split via a weighted replica counts between # the canary and stable ReplicaSet. trafficRouting: + # Supports nginx and plugins only: This lets you control the denominator or total weight of traffic. + # The total weight of traffic. If unspecified, it defaults to 100 + maxTrafficWeight: 1000 # This is a list of routes that Argo Rollouts has the rights to manage it is currently only required for # setMirrorRoute and setHeaderRoute. The order of managedRoutes array also sets the precedence of the route # in the traffic router. Argo Rollouts will place these routes in the order specified above any routes already diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 65cc341158..9f17209eeb 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -923,6 +923,9 @@ spec: - name type: object type: array + maxTrafficWeight: + format: int32 + type: integer nginx: properties: additionalIngressAnnotations: diff --git a/manifests/install.yaml b/manifests/install.yaml index 99f2e34a3b..76d66f32d5 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -12843,6 +12843,9 @@ spec: - name type: object type: array + maxTrafficWeight: + format: int32 + type: integer nginx: properties: additionalIngressAnnotations: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index db6e03206f..014b6345b8 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -2303,6 +2303,11 @@ "format": "byte" }, "title": "+kubebuilder:validation:Schemaless\n+kubebuilder:pruning:PreserveUnknownFields\n+kubebuilder:validation:Type=object\nPlugins holds specific configuration that traffic router plugins can use for routing traffic" + }, + "maxTrafficWeight": { + "type": "integer", + "format": "int32", + "title": "MaxTrafficWeight The total weight of traffic. If unspecified, it defaults to 100" } }, "title": "RolloutTrafficRouting hosts all the different configuration for supported service meshes to enable more fine-grained traffic routing" diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 773cebb542..f1b6428971 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -3349,14 +3349,14 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8550 bytes of a gzipped FileDescriptorProto + // 8566 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, 0x71, 0x98, 0x9a, 0xc3, 0x21, 0x39, 0x35, 0x5c, 0x92, 0xfb, 0x76, 0xf7, 0x8e, 0xc7, 0xbb, 0xdd, 0x59, 0xf5, 0x39, 0x97, 0x3d, 0xeb, 0x44, 0x4a, 0x7b, 0x77, 0xc9, 0x49, 0xa7, 0x5c, 0x32, 0x43, 0xee, 0xde, 0x72, 0x8f, 0xdc, 0xe5, 0xd5, 0x70, 0x6f, 0x6d, 0x49, 0x67, 0xab, 0x39, 0xf3, 0x38, - 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x85, 0x53, 0x14, 0x41, + 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x84, 0x53, 0x14, 0x41, 0x82, 0x95, 0xd8, 0x42, 0x10, 0x24, 0x08, 0x14, 0xc3, 0x80, 0x93, 0xd8, 0x3f, 0x02, 0xc3, 0x41, - 0xf2, 0xc3, 0x40, 0x84, 0x38, 0x76, 0x14, 0x20, 0x0e, 0xe4, 0x1f, 0x89, 0x9c, 0x00, 0xa6, 0x23, + 0xf2, 0xc3, 0x40, 0x8c, 0x38, 0x76, 0x14, 0x20, 0x0e, 0xe4, 0x1f, 0x89, 0x9c, 0x00, 0xa6, 0x23, 0x3a, 0x7f, 0x62, 0x24, 0x10, 0x12, 0x28, 0x30, 0xb2, 0x3f, 0x82, 0xe0, 0x7d, 0xf6, 0xeb, 0x9e, 0x1e, 0xee, 0x90, 0xd3, 0x5c, 0x9d, 0x13, 0xff, 0x9b, 0x79, 0x55, 0xaf, 0xaa, 0xfa, 0x7d, 0xd6, 0xab, 0x57, 0x55, 0x0f, 0xd6, 0x5a, 0x6e, 0xb4, 0xd3, 0xdb, 0x5a, 0x6c, 0xf8, 0x9d, 0x25, 0x27, @@ -3371,21 +3371,21 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xab, 0x3b, 0x34, 0x72, 0xb2, 0x6a, 0x2d, 0x0d, 0xaa, 0x15, 0xf4, 0xbc, 0xc8, 0xed, 0xd0, 0xbe, 0x0a, 0x7f, 0xe9, 0x51, 0x15, 0xc2, 0xc6, 0x0e, 0xed, 0x38, 0x7d, 0xf5, 0x5e, 0x1c, 0x54, 0xaf, 0x17, 0xb9, 0xed, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0x7f, 0x58, 0x80, 0x52, 0x75, - 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0xaf, 0x58, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, + 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0xaf, 0x5a, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, 0x3b, 0x5e, 0x83, 0x06, 0xf3, 0xd6, 0x65, 0xeb, 0x4a, 0xf9, 0xea, 0xda, 0xe2, 0x28, 0xfd, 0xb5, 0x58, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0xb7, 0x6b, 0xe7, 0xbf, 0x7b, 0x50, - 0xf9, 0xd0, 0xe1, 0x41, 0x65, 0x7a, 0xcd, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0x5b, 0x16, 0x9c, 0x6d, + 0xf9, 0xd0, 0xe1, 0x41, 0x65, 0x7a, 0xcd, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0xdb, 0x16, 0x9c, 0x6d, 0x38, 0x9e, 0x13, 0xec, 0x6f, 0x3a, 0x41, 0x8b, 0x46, 0xaf, 0x07, 0x7e, 0xaf, 0x3b, 0x3f, 0x76, 0x0a, 0xd2, 0x3c, 0x25, 0xa5, 0x39, 0xbb, 0x9c, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, 0xd9, 0x6a, 0x53, 0x53, 0xae, 0xc2, 0x69, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xc8, 0xf3, 0x30, 0xe9, 0x7a, 0xad, 0x80, 0x86, 0xe1, 0xfc, 0xf8, 0x65, 0xeb, 0x4a, 0xa9, 0x36, 0x2b, 0xab, - 0x4f, 0xae, 0x8a, 0x62, 0x54, 0x70, 0xfb, 0x37, 0x0a, 0x70, 0xb6, 0xba, 0x56, 0xdb, 0x0c, 0x9c, + 0x4f, 0xae, 0x8a, 0x62, 0x54, 0x70, 0xfb, 0xd7, 0x0b, 0x70, 0xb6, 0xba, 0x56, 0xdb, 0x0c, 0x9c, 0xed, 0x6d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x96, 0x49, 0xc0, 0x3a, 0x9a, 0x00, 0x79, 0x19, 0xca, 0x21, 0x0d, 0xf6, 0xdc, 0x06, 0xdd, 0xf0, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x76, 0x4e, 0xa2, 0x97, 0xeb, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, 0xe2, 0x6a, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x2b, 0x30, 0xe7, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, 0x1b, 0x01, 0xdd, 0x76, 0x1f, 0xc8, 0x4f, 0x9c, 0x97, 0x75, 0xe7, 0xaa, 0x29, 0x38, 0xf6, 0xd5, - 0x20, 0xdf, 0xb4, 0x60, 0x2e, 0x8c, 0xdc, 0xc6, 0xae, 0xeb, 0xd1, 0x30, 0x5c, 0xf6, 0xbd, 0x6d, + 0x20, 0xdf, 0xb2, 0x60, 0x2e, 0x8c, 0xdc, 0xc6, 0xae, 0xeb, 0xd1, 0x30, 0x5c, 0xf6, 0xbd, 0x6d, 0xb7, 0x35, 0x5f, 0xe4, 0xdd, 0x76, 0x6b, 0xb4, 0x6e, 0xab, 0xa7, 0xa8, 0xd6, 0xce, 0x33, 0x91, 0xd2, 0xa5, 0xd8, 0xc7, 0x9d, 0x7c, 0x04, 0x4a, 0xb2, 0x45, 0x69, 0x38, 0x3f, 0x71, 0xb9, 0x70, 0xa5, 0x54, 0x3b, 0x73, 0x78, 0x50, 0x29, 0xad, 0xaa, 0x42, 0x8c, 0xe1, 0xf6, 0x0a, 0xcc, 0x57, @@ -3405,7 +3405,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xa1, 0xfd, 0x47, 0x16, 0xcc, 0x1a, 0x1f, 0xb7, 0xe6, 0x86, 0x11, 0xf9, 0x6c, 0xdf, 0xe0, 0x59, 0x1c, 0x6e, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0xcc, 0xc9, 0x2f, 0x9d, 0x52, 0x25, 0xc6, 0xc0, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8f, 0x5d, 0x2e, 0x5c, 0x29, 0x5f, 0x5d, 0xcd, 0xad, 0x1b, - 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xb3, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, + 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xa3, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, 0xfb, 0x16, 0x4c, 0xb4, 0x9d, 0x2d, 0xda, 0x16, 0x73, 0xab, 0x7c, 0xf5, 0xed, 0xdc, 0x24, 0x51, 0x3c, 0x16, 0xd7, 0x38, 0xfd, 0x6b, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, 0xfe, 0x8e, 0x05, 0xe5, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x95, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, @@ -3417,7 +3417,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x9f, 0x5c, 0xcf, 0x67, 0x5a, 0xc6, 0x4b, 0x45, 0x35, 0x68, 0x85, 0xc8, 0x39, 0x90, 0x25, 0x28, 0x45, 0x34, 0xe8, 0xb8, 0x9e, 0x13, 0x89, 0x1d, 0x74, 0xaa, 0x76, 0x56, 0xa2, 0x95, 0x36, 0x15, 0x00, 0x63, 0x1c, 0xd2, 0x86, 0x89, 0x66, 0xb0, 0x8f, 0x3d, 0x6f, 0x7e, 0x3c, 0x8f, 0xa6, 0x58, - 0xe1, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, 0xa3, 0xe4, 0x41, 0x7e, 0xc5, 0x82, 0xf3, 0x1d, 0xea, 0x84, + 0xe1, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, 0xa3, 0xe4, 0x41, 0x7e, 0xd9, 0x82, 0xf3, 0x1d, 0xea, 0x84, 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, 0x51, 0x8f, 0x75, 0xec, 0x7c, 0x91, 0x33, 0xc7, 0x51, 0xfb, 0xa1, 0x9f, 0x72, 0xed, 0x19, 0x29, 0xca, 0xf9, 0x2c, 0x28, 0x66, 0x4a, 0x43, 0xde, 0x85, 0x72, 0x14, 0xb5, 0xeb, 0x11, 0xd3, 0x83, 0x5b, 0xfb, 0xf3, 0x13, 0x7c, 0xf1, 0x1a, 0x71, 0x85, 0xd9, @@ -3440,451 +3440,452 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xc3, 0xfe, 0x13, 0x8b, 0x6d, 0x43, 0xe2, 0xbb, 0x36, 0x69, 0xa7, 0xdb, 0x66, 0x4b, 0xe7, 0xe9, 0x2b, 0xc7, 0x51, 0x42, 0x39, 0xc6, 0x7c, 0xf6, 0x72, 0x25, 0xff, 0x20, 0x0d, 0xd9, 0xfe, 0xaf, 0x16, 0x9c, 0x4f, 0x23, 0x3f, 0x06, 0x85, 0x2e, 0x4c, 0x2a, 0x74, 0xb7, 0xf2, 0xfd, 0xda, 0x01, - 0x5a, 0xdd, 0x57, 0xc6, 0xfb, 0xbf, 0xf5, 0xff, 0x75, 0x1d, 0x21, 0xde, 0xf2, 0x0b, 0x3f, 0xce, + 0x5a, 0xdd, 0x57, 0xc7, 0xfb, 0xbf, 0xf5, 0xff, 0x75, 0x1d, 0x21, 0xde, 0xf2, 0x0b, 0x3f, 0xce, 0x2d, 0x7f, 0xfc, 0x83, 0xb4, 0xe5, 0xdb, 0xff, 0x70, 0x1c, 0xa6, 0xab, 0x5e, 0xe4, 0x56, 0xb7, - 0xb7, 0x5d, 0xcf, 0x8d, 0xf6, 0xc9, 0xd7, 0xc7, 0x60, 0xa9, 0x1b, 0xd0, 0x6d, 0x1a, 0x04, 0xb4, + 0xb7, 0x5d, 0xcf, 0x8d, 0xf6, 0xc9, 0x37, 0xc6, 0x60, 0xa9, 0x1b, 0xd0, 0x6d, 0x1a, 0x04, 0xb4, 0xb9, 0xd2, 0x0b, 0x5c, 0xaf, 0x55, 0x6f, 0xec, 0xd0, 0x66, 0xaf, 0xed, 0x7a, 0xad, 0xd5, 0x96, 0xe7, 0xeb, 0xe2, 0x6b, 0x0f, 0x68, 0xa3, 0xc7, 0x3f, 0x49, 0x4c, 0x8a, 0xce, 0x68, 0x9f, 0xb4, 0x71, 0x3c, 0xa6, 0xb5, 0x17, 0x0f, 0x0f, 0x2a, 0x4b, 0xc7, 0xac, 0x84, 0xc7, 0xfd, 0x34, 0xf2, - 0xd5, 0x31, 0x58, 0x0c, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, + 0xb5, 0x31, 0x58, 0x0c, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, 0xdb, 0xb1, 0x78, 0xd6, 0xae, 0x1e, 0x1e, 0x54, 0x8e, 0x59, 0x07, 0x8f, 0xf9, 0x5d, 0xf6, 0x06, 0x94, 0xab, 0x5d, 0x37, 0x74, 0x1f, 0xa0, 0xdf, 0x8b, 0xe8, 0x10, 0xe7, 0xf7, 0x0a, 0x14, 0x83, - 0x5e, 0x9b, 0x8a, 0xb9, 0x5d, 0xaa, 0x95, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0xf3, - 0x6c, 0xc5, 0xe5, 0x24, 0x53, 0x96, 0x9b, 0x7b, 0x50, 0x0c, 0x18, 0x13, 0x39, 0xb2, 0x46, 0x3d, - 0xe4, 0xc6, 0x52, 0x4b, 0x21, 0xd8, 0x4f, 0x14, 0x2c, 0xec, 0xdf, 0x1e, 0x83, 0x0b, 0xd5, 0x6e, - 0x77, 0x9d, 0x86, 0x3b, 0x29, 0x29, 0x7e, 0xc1, 0x82, 0x99, 0x3d, 0x37, 0x88, 0x7a, 0x4e, 0x5b, - 0x19, 0xe7, 0x84, 0x3c, 0xf5, 0x51, 0xe5, 0xe1, 0xdc, 0xde, 0x4a, 0x90, 0xae, 0x91, 0xc3, 0x83, - 0xca, 0x4c, 0xb2, 0x0c, 0x53, 0xec, 0xc9, 0xdf, 0xb6, 0x60, 0x4e, 0x16, 0xdd, 0xf2, 0x9b, 0xd4, - 0x34, 0xfe, 0xde, 0xc9, 0x53, 0x26, 0x4d, 0x5c, 0x18, 0xed, 0xd2, 0xa5, 0xd8, 0x27, 0x84, 0xfd, - 0xdf, 0xc7, 0xe0, 0xc9, 0x01, 0x34, 0xc8, 0xaf, 0x5a, 0x70, 0x5e, 0x58, 0x8c, 0x0d, 0x10, 0xd2, - 0x6d, 0xd9, 0x9a, 0x3f, 0x9d, 0xb7, 0xe4, 0xc8, 0xa6, 0x38, 0xf5, 0x1a, 0xb4, 0x36, 0xcf, 0x56, - 0xc3, 0xe5, 0x0c, 0xd6, 0x98, 0x29, 0x10, 0x97, 0x54, 0xd8, 0x90, 0x53, 0x92, 0x8e, 0x3d, 0x16, - 0x49, 0xeb, 0x19, 0xac, 0x31, 0x53, 0x20, 0xfb, 0xaf, 0xc2, 0xd3, 0x47, 0x90, 0x7b, 0xf4, 0xe4, - 0xb4, 0xdf, 0xd6, 0xa3, 0x3e, 0x39, 0xe6, 0x86, 0x98, 0xd7, 0x36, 0x4c, 0xf0, 0xa9, 0xa3, 0x26, - 0x36, 0xb0, 0xed, 0x8f, 0xcf, 0xa9, 0x10, 0x25, 0xc4, 0xfe, 0x6d, 0x0b, 0xa6, 0x8e, 0x61, 0xea, - 0xab, 0x24, 0x4d, 0x7d, 0xa5, 0x3e, 0x33, 0x5f, 0xd4, 0x6f, 0xe6, 0x7b, 0x7d, 0xb4, 0xde, 0x18, - 0xc6, 0xbc, 0xf7, 0x43, 0x0b, 0xce, 0xf6, 0x99, 0x03, 0xc9, 0x0e, 0x9c, 0xef, 0xfa, 0x4d, 0xa5, - 0x36, 0xdd, 0x70, 0xc2, 0x1d, 0x0e, 0x93, 0x9f, 0xf7, 0x12, 0xeb, 0xc9, 0x8d, 0x0c, 0xf8, 0xc3, - 0x83, 0xca, 0xbc, 0x26, 0x92, 0x42, 0xc0, 0x4c, 0x8a, 0xa4, 0x0b, 0x53, 0xdb, 0x2e, 0x6d, 0x37, - 0xe3, 0x21, 0x38, 0xa2, 0x82, 0x74, 0x5d, 0x52, 0x13, 0x96, 0x70, 0xf5, 0x0f, 0x35, 0x17, 0xfb, - 0x47, 0x16, 0xcc, 0x54, 0x7b, 0xd1, 0x0e, 0x53, 0x0f, 0x1a, 0xdc, 0xf8, 0x44, 0x3c, 0x28, 0x86, - 0x6e, 0x6b, 0xef, 0xa5, 0x7c, 0x16, 0xe3, 0x3a, 0x23, 0x25, 0x6f, 0x04, 0xb4, 0x6e, 0xca, 0x0b, - 0x51, 0xb0, 0x21, 0x01, 0x4c, 0xf8, 0x4e, 0x2f, 0xda, 0xb9, 0x2a, 0x3f, 0x79, 0xc4, 0x83, 0xf8, - 0x6d, 0xf6, 0x39, 0x57, 0x25, 0x47, 0xad, 0xad, 0x89, 0x52, 0x94, 0x9c, 0xec, 0x2f, 0xc2, 0x4c, - 0xf2, 0x9a, 0x69, 0x88, 0x31, 0x7b, 0x11, 0x0a, 0x4e, 0xe0, 0xc9, 0x11, 0x5b, 0x96, 0x08, 0x85, - 0x2a, 0xde, 0x42, 0x56, 0x4e, 0x5e, 0x80, 0xa9, 0xed, 0x5e, 0xbb, 0xcd, 0x2a, 0xc8, 0x3b, 0x1d, - 0x7d, 0x0a, 0xb8, 0x2e, 0xcb, 0x51, 0x63, 0xd8, 0xff, 0x7b, 0x1c, 0x66, 0x6b, 0xed, 0x1e, 0x7d, - 0x3d, 0xa0, 0x54, 0x99, 0x3e, 0xaa, 0x30, 0xdb, 0x0d, 0xe8, 0x9e, 0x4b, 0xef, 0xd7, 0x69, 0x9b, - 0x36, 0x22, 0x3f, 0x90, 0xd2, 0x3c, 0x29, 0x09, 0xcd, 0x6e, 0x24, 0xc1, 0x98, 0xc6, 0x27, 0xaf, - 0xc1, 0x8c, 0xd3, 0x88, 0xdc, 0x3d, 0xaa, 0x29, 0x08, 0x71, 0x9f, 0x90, 0x14, 0x66, 0xaa, 0x09, - 0x28, 0xa6, 0xb0, 0xc9, 0x67, 0x61, 0x3e, 0x6c, 0x38, 0x6d, 0x7a, 0xa7, 0x2b, 0x59, 0x2d, 0xef, - 0xd0, 0xc6, 0xee, 0x86, 0xef, 0x7a, 0x91, 0x34, 0xb3, 0x5d, 0x96, 0x94, 0xe6, 0xeb, 0x03, 0xf0, - 0x70, 0x20, 0x05, 0xf2, 0x2f, 0x2c, 0xb8, 0xd8, 0x0d, 0xe8, 0x46, 0xe0, 0x77, 0x7c, 0x36, 0xd4, - 0xfa, 0xac, 0x3f, 0xd2, 0x0a, 0xf2, 0xd6, 0x88, 0xba, 0x94, 0x28, 0xe9, 0xbf, 0xb2, 0xf8, 0xf0, - 0xe1, 0x41, 0xe5, 0xe2, 0xc6, 0x51, 0x02, 0xe0, 0xd1, 0xf2, 0x91, 0x7f, 0x69, 0xc1, 0xa5, 0xae, - 0x1f, 0x46, 0x47, 0x7c, 0x42, 0xf1, 0x54, 0x3f, 0xc1, 0x3e, 0x3c, 0xa8, 0x5c, 0xda, 0x38, 0x52, - 0x02, 0x7c, 0x84, 0x84, 0xf6, 0x61, 0x19, 0xce, 0x1a, 0x63, 0x4f, 0xda, 0x2e, 0x5e, 0x85, 0x33, - 0x6a, 0x30, 0xc4, 0xba, 0x4f, 0x29, 0x36, 0x65, 0x55, 0x4d, 0x20, 0x26, 0x71, 0xd9, 0xb8, 0xd3, - 0x43, 0x51, 0xd4, 0x4e, 0x8d, 0xbb, 0x8d, 0x04, 0x14, 0x53, 0xd8, 0x64, 0x15, 0xce, 0xc9, 0x12, - 0xa4, 0xdd, 0xb6, 0xdb, 0x70, 0x96, 0xfd, 0x9e, 0x1c, 0x72, 0xc5, 0xda, 0x93, 0x87, 0x07, 0x95, - 0x73, 0x1b, 0xfd, 0x60, 0xcc, 0xaa, 0x43, 0xd6, 0xe0, 0xbc, 0xd3, 0x8b, 0x7c, 0xfd, 0xfd, 0xd7, - 0x3c, 0xb6, 0x9d, 0x36, 0xf9, 0xd0, 0x9a, 0x12, 0xfb, 0x6e, 0x35, 0x03, 0x8e, 0x99, 0xb5, 0xc8, - 0x46, 0x8a, 0x5a, 0x9d, 0x36, 0x7c, 0xaf, 0x29, 0x7a, 0xb9, 0x18, 0x9f, 0xc0, 0xaa, 0x19, 0x38, - 0x98, 0x59, 0x93, 0xb4, 0x61, 0xa6, 0xe3, 0x3c, 0xb8, 0xe3, 0x39, 0x7b, 0x8e, 0xdb, 0x66, 0x4c, - 0xa4, 0x79, 0x6c, 0xb0, 0x51, 0xa5, 0x17, 0xb9, 0xed, 0x45, 0xe1, 0xb6, 0xb0, 0xb8, 0xea, 0x45, - 0xb7, 0x83, 0x7a, 0xc4, 0x34, 0x75, 0xa1, 0x41, 0xae, 0x27, 0x68, 0x61, 0x8a, 0x36, 0xb9, 0x0d, - 0x17, 0xf8, 0x74, 0x5c, 0xf1, 0xef, 0x7b, 0x2b, 0xb4, 0xed, 0xec, 0xab, 0x0f, 0x98, 0xe4, 0x1f, - 0xf0, 0xd4, 0xe1, 0x41, 0xe5, 0x42, 0x3d, 0x0b, 0x01, 0xb3, 0xeb, 0x11, 0x07, 0x9e, 0x4e, 0x02, - 0x90, 0xee, 0xb9, 0xa1, 0xeb, 0x7b, 0xc2, 0x0a, 0x35, 0x15, 0x5b, 0xa1, 0xea, 0x83, 0xd1, 0xf0, - 0x28, 0x1a, 0xe4, 0xef, 0x5a, 0x70, 0x3e, 0x6b, 0x1a, 0xce, 0x97, 0xf2, 0xb8, 0x3c, 0x4d, 0x4d, - 0x2d, 0x31, 0x22, 0x32, 0x17, 0x85, 0x4c, 0x21, 0xc8, 0x7b, 0x16, 0x4c, 0x3b, 0xc6, 0x09, 0x7a, - 0x1e, 0xf2, 0xd8, 0xb5, 0xcc, 0x33, 0x79, 0x6d, 0xee, 0xf0, 0xa0, 0x92, 0x38, 0xa5, 0x63, 0x82, - 0x23, 0xf9, 0xfb, 0x16, 0x5c, 0xc8, 0x9c, 0xe3, 0xf3, 0xe5, 0xd3, 0x68, 0x21, 0x3e, 0x48, 0xb2, - 0xd7, 0x9c, 0x6c, 0x31, 0xc8, 0x37, 0x2d, 0xbd, 0x95, 0xa9, 0xfb, 0xb4, 0xf9, 0x69, 0x2e, 0xda, - 0x9b, 0x23, 0x1a, 0x0d, 0x62, 0xad, 0x49, 0x11, 0xae, 0x9d, 0x33, 0x76, 0x46, 0x55, 0x88, 0x69, - 0xf6, 0xe4, 0x1b, 0x96, 0xda, 0x1a, 0xb5, 0x44, 0x67, 0x4e, 0x4b, 0x22, 0x12, 0xef, 0xb4, 0x5a, - 0xa0, 0x14, 0x73, 0xf2, 0x33, 0xb0, 0xe0, 0x6c, 0xf9, 0x41, 0x94, 0x39, 0xf9, 0xe6, 0x67, 0xf8, - 0x34, 0xba, 0x74, 0x78, 0x50, 0x59, 0xa8, 0x0e, 0xc4, 0xc2, 0x23, 0x28, 0xd8, 0xbf, 0x5e, 0x84, - 0x69, 0x71, 0x12, 0x92, 0x5b, 0xd7, 0x6f, 0x59, 0xf0, 0x4c, 0xa3, 0x17, 0x04, 0xd4, 0x8b, 0xea, - 0x11, 0xed, 0xf6, 0x6f, 0x5c, 0xd6, 0xa9, 0x6e, 0x5c, 0x97, 0x0f, 0x0f, 0x2a, 0xcf, 0x2c, 0x1f, - 0xc1, 0x1f, 0x8f, 0x94, 0x8e, 0xfc, 0x3b, 0x0b, 0x6c, 0x89, 0x50, 0x73, 0x1a, 0xbb, 0xad, 0xc0, - 0xef, 0x79, 0xcd, 0xfe, 0x8f, 0x18, 0x3b, 0xd5, 0x8f, 0x78, 0xee, 0xf0, 0xa0, 0x62, 0x2f, 0x3f, - 0x52, 0x0a, 0x1c, 0x42, 0x52, 0xf2, 0x3a, 0x9c, 0x95, 0x58, 0xd7, 0x1e, 0x74, 0x69, 0xe0, 0xb2, - 0x33, 0x87, 0x54, 0x1c, 0x63, 0x57, 0xac, 0x34, 0x02, 0xf6, 0xd7, 0x21, 0x21, 0x4c, 0xde, 0xa7, - 0x6e, 0x6b, 0x27, 0x52, 0xea, 0xd3, 0x88, 0xfe, 0x57, 0xd2, 0x2a, 0x72, 0x57, 0xd0, 0xac, 0x95, - 0x0f, 0x0f, 0x2a, 0x93, 0xf2, 0x0f, 0x2a, 0x4e, 0xe4, 0x16, 0xcc, 0x88, 0x73, 0xea, 0x86, 0xeb, - 0xb5, 0x36, 0x7c, 0x4f, 0x38, 0x11, 0x95, 0x6a, 0xcf, 0xa9, 0x0d, 0xbf, 0x9e, 0x80, 0x3e, 0x3c, - 0xa8, 0x4c, 0xab, 0xdf, 0x9b, 0xfb, 0x5d, 0x8a, 0xa9, 0xda, 0xf6, 0xef, 0x4e, 0x00, 0xa8, 0xe1, - 0x4a, 0xbb, 0xe4, 0x23, 0x50, 0x0a, 0x69, 0x24, 0xb8, 0xca, 0x8b, 0x13, 0x71, 0xdd, 0xa5, 0x0a, - 0x31, 0x86, 0x93, 0x5d, 0x28, 0x76, 0x9d, 0x5e, 0x48, 0xf3, 0x39, 0x3f, 0xc8, 0xce, 0xdf, 0x60, - 0x14, 0xc5, 0xc1, 0x94, 0xff, 0x44, 0xc1, 0x83, 0x7c, 0xd9, 0x02, 0xa0, 0xc9, 0x0e, 0x1b, 0xd9, - 0x40, 0x24, 0x59, 0xc6, 0x7d, 0xca, 0xda, 0xa0, 0x36, 0x73, 0x78, 0x50, 0x01, 0xa3, 0xeb, 0x0d, - 0xb6, 0xe4, 0x3e, 0x4c, 0x39, 0x6a, 0xcd, 0x1f, 0x3f, 0x8d, 0x35, 0x9f, 0x9f, 0x17, 0xf5, 0xa0, - 0xd5, 0xcc, 0xc8, 0x57, 0x2d, 0x98, 0x09, 0x69, 0x24, 0xbb, 0x8a, 0xad, 0x3c, 0x52, 0xe1, 0x1d, - 0x71, 0xd0, 0xd5, 0x13, 0x34, 0xc5, 0x0a, 0x9a, 0x2c, 0xc3, 0x14, 0x5f, 0x25, 0xca, 0x0d, 0xea, - 0x34, 0x69, 0xc0, 0xcd, 0x11, 0x52, 0x93, 0x1a, 0x5d, 0x14, 0x83, 0xa6, 0x16, 0xc5, 0x28, 0xc3, - 0x14, 0x5f, 0x25, 0xca, 0xba, 0x1b, 0x04, 0xbe, 0x14, 0x65, 0x2a, 0x27, 0x51, 0x0c, 0x9a, 0x5a, - 0x14, 0xa3, 0x0c, 0x53, 0x7c, 0xed, 0x6f, 0x9f, 0x81, 0x19, 0x35, 0x91, 0x62, 0xcd, 0x5e, 0x58, - 0xbf, 0x06, 0x68, 0xf6, 0xcb, 0x26, 0x10, 0x93, 0xb8, 0xac, 0xb2, 0x98, 0xaa, 0x49, 0xc5, 0x5e, - 0x57, 0xae, 0x9b, 0x40, 0x4c, 0xe2, 0x92, 0x0e, 0x14, 0xc3, 0x88, 0x76, 0xd5, 0x15, 0xfb, 0x88, - 0x37, 0xc0, 0xf1, 0xfa, 0x60, 0x58, 0x12, 0x18, 0x79, 0x14, 0x5c, 0xb8, 0x01, 0x37, 0x4a, 0xd8, - 0x74, 0xe5, 0xe4, 0xc8, 0x67, 0x7e, 0x26, 0xcd, 0xc5, 0xa2, 0x37, 0x92, 0x65, 0x98, 0x62, 0x9f, - 0xa1, 0xec, 0x17, 0x4f, 0x51, 0xd9, 0xff, 0x34, 0x4c, 0x75, 0x9c, 0x07, 0xf5, 0x5e, 0xd0, 0x3a, - 0xf9, 0xa1, 0x42, 0xba, 0x4c, 0x0a, 0x2a, 0xa8, 0xe9, 0x91, 0x2f, 0x59, 0xc6, 0x92, 0x23, 0xee, - 0xd3, 0xef, 0xe6, 0xbb, 0xe4, 0xe8, 0xbd, 0x72, 0xe0, 0xe2, 0xd3, 0xa7, 0x7a, 0x4f, 0x3d, 0x76, - 0xd5, 0x9b, 0xa9, 0x91, 0x62, 0x82, 0x68, 0x35, 0xb2, 0x74, 0xaa, 0x6a, 0xe4, 0x72, 0x82, 0x19, - 0xa6, 0x98, 0x73, 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xa9, 0xca, 0x53, 0x4f, 0x30, 0xc3, 0x14, - 0xf3, 0xc1, 0xe7, 0xcd, 0xf2, 0xe9, 0x9c, 0x37, 0xa7, 0x73, 0x38, 0x6f, 0x1e, 0xad, 0x8a, 0x9f, - 0x19, 0x55, 0x15, 0x27, 0x37, 0x81, 0x34, 0xf7, 0x3d, 0xa7, 0xe3, 0x36, 0xe4, 0x62, 0xc9, 0xb7, - 0xcd, 0x19, 0x6e, 0x8f, 0x58, 0x90, 0x0b, 0x19, 0x59, 0xe9, 0xc3, 0xc0, 0x8c, 0x5a, 0x24, 0x82, - 0xa9, 0xae, 0xd2, 0xb8, 0x66, 0xf3, 0x18, 0xfd, 0x4a, 0x03, 0x13, 0x6e, 0x12, 0x6c, 0xe2, 0xa9, - 0x12, 0xd4, 0x9c, 0xc8, 0x1a, 0x9c, 0xef, 0xb8, 0xde, 0x86, 0xdf, 0x0c, 0x37, 0x68, 0x20, 0xad, - 0x2d, 0x75, 0x1a, 0xcd, 0xcf, 0xf1, 0xb6, 0xe1, 0x27, 0xe8, 0xf5, 0x0c, 0x38, 0x66, 0xd6, 0xb2, - 0xff, 0x97, 0x05, 0x73, 0xcb, 0x6d, 0xbf, 0xd7, 0xbc, 0xeb, 0x44, 0x8d, 0x1d, 0xe1, 0x21, 0x40, - 0x5e, 0x83, 0x29, 0xd7, 0x8b, 0x68, 0xb0, 0xe7, 0xb4, 0xe5, 0xfe, 0x64, 0x2b, 0xf3, 0xe9, 0xaa, - 0x2c, 0x7f, 0x78, 0x50, 0x99, 0x59, 0xe9, 0x05, 0xdc, 0x4a, 0x2d, 0x56, 0x2b, 0xd4, 0x75, 0xc8, - 0xb7, 0x2d, 0x38, 0x2b, 0x7c, 0x0c, 0x56, 0x9c, 0xc8, 0x79, 0xb3, 0x47, 0x03, 0x97, 0x2a, 0x2f, - 0x83, 0x11, 0x17, 0xaa, 0xb4, 0xac, 0x8a, 0xc1, 0x7e, 0xac, 0xa8, 0xaf, 0xa7, 0x39, 0x63, 0xbf, - 0x30, 0xf6, 0x2f, 0x16, 0xe0, 0xa9, 0x81, 0xb4, 0xc8, 0x02, 0x8c, 0xb9, 0x4d, 0xf9, 0xe9, 0x20, - 0xe9, 0x8e, 0xad, 0x36, 0x71, 0xcc, 0x6d, 0x92, 0x45, 0xae, 0x73, 0x06, 0x34, 0x0c, 0xd5, 0x85, - 0x73, 0x49, 0xab, 0x87, 0xb2, 0x14, 0x0d, 0x0c, 0x52, 0x81, 0x22, 0x77, 0x97, 0x95, 0xe7, 0x09, - 0xae, 0xc5, 0x72, 0xcf, 0x54, 0x14, 0xe5, 0xe4, 0xe7, 0x2d, 0x00, 0x21, 0x20, 0x3b, 0x8d, 0xc8, - 0x5d, 0x12, 0xf3, 0x6d, 0x26, 0x46, 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0xd9, 0x84, 0x09, - 0xa6, 0xd0, 0xfa, 0xcd, 0x13, 0x6f, 0x8a, 0xfc, 0x26, 0x6a, 0x83, 0xd3, 0x40, 0x49, 0x8b, 0xb5, - 0x55, 0x40, 0xa3, 0x5e, 0xe0, 0xb1, 0xa6, 0xe5, 0xdb, 0xe0, 0x94, 0x90, 0x02, 0x75, 0x29, 0x1a, - 0x18, 0xf6, 0x3f, 0x1b, 0x83, 0xf3, 0x59, 0xa2, 0xb3, 0xdd, 0x66, 0x42, 0x48, 0x2b, 0x8f, 0xc6, - 0x3f, 0x95, 0x7f, 0xfb, 0x48, 0x77, 0x19, 0x7d, 0x4d, 0x21, 0xfd, 0x05, 0x25, 0x5f, 0xf2, 0x53, - 0xba, 0x85, 0xc6, 0x4e, 0xd8, 0x42, 0x9a, 0x72, 0xaa, 0x95, 0x2e, 0xc3, 0x78, 0xc8, 0x7a, 0xbe, - 0x90, 0xbc, 0xee, 0xe0, 0x7d, 0xc4, 0x21, 0x0c, 0xa3, 0xe7, 0xb9, 0x91, 0x8c, 0x31, 0xd1, 0x18, - 0x77, 0x3c, 0x37, 0x42, 0x0e, 0xb1, 0xbf, 0x35, 0x06, 0x0b, 0x83, 0x3f, 0x8a, 0x7c, 0xcb, 0x02, - 0x68, 0xb2, 0xe3, 0x4a, 0xc8, 0x1d, 0xb5, 0x85, 0x7b, 0x91, 0x73, 0x5a, 0x6d, 0xb8, 0xa2, 0x38, - 0xc5, 0xbe, 0x66, 0xba, 0x28, 0x44, 0x43, 0x10, 0x72, 0x55, 0x0d, 0x7d, 0x7e, 0x55, 0x23, 0x26, - 0x93, 0xae, 0xb3, 0xae, 0x21, 0x68, 0x60, 0xb1, 0xf3, 0xa8, 0xe7, 0x74, 0x68, 0xd8, 0x75, 0x74, - 0xc4, 0x0e, 0x3f, 0x8f, 0xde, 0x52, 0x85, 0x18, 0xc3, 0xed, 0x36, 0x3c, 0x3b, 0x84, 0x9c, 0x39, - 0x05, 0x44, 0xd8, 0xff, 0xc3, 0x82, 0x27, 0x97, 0xdb, 0xbd, 0x30, 0xa2, 0xc1, 0xff, 0x37, 0xae, - 0x7b, 0x7f, 0x6a, 0xc1, 0xd3, 0x03, 0xbe, 0xf9, 0x31, 0x78, 0xf0, 0xbd, 0x93, 0xf4, 0xe0, 0xbb, - 0x33, 0xea, 0x90, 0xce, 0xfc, 0x8e, 0x01, 0x8e, 0x7c, 0xff, 0xa6, 0x00, 0x67, 0xd8, 0xb2, 0xd5, - 0xf4, 0x5b, 0x39, 0x6d, 0x9c, 0xcf, 0x42, 0xf1, 0xf3, 0x6c, 0x03, 0x4a, 0x0f, 0x32, 0xbe, 0x2b, - 0xa1, 0x80, 0x91, 0x2f, 0x5b, 0x30, 0xf9, 0x79, 0xb9, 0xa7, 0x8a, 0xb3, 0xdc, 0x88, 0x8b, 0x61, - 0xe2, 0x1b, 0x16, 0xe5, 0x0e, 0x29, 0xe2, 0x2c, 0xb4, 0xef, 0xa0, 0xda, 0x4a, 0x15, 0x67, 0xf2, - 0x3c, 0x4c, 0x6e, 0xfb, 0x41, 0xa7, 0xd7, 0x76, 0xd2, 0xc1, 0x7d, 0xd7, 0x45, 0x31, 0x2a, 0x38, - 0x9b, 0xe4, 0x4e, 0xd7, 0x7d, 0x8b, 0x06, 0xa1, 0x70, 0xbb, 0x4f, 0x4c, 0xf2, 0xaa, 0x86, 0xa0, - 0x81, 0xc5, 0xeb, 0xb4, 0x5a, 0x01, 0x6d, 0x39, 0x91, 0x1f, 0xf0, 0x9d, 0xc3, 0xac, 0xa3, 0x21, - 0x68, 0x60, 0x2d, 0x7c, 0x12, 0xa6, 0x4d, 0xe1, 0x8f, 0x15, 0xb3, 0xf1, 0x29, 0x90, 0x4e, 0x84, - 0xa9, 0x25, 0xc9, 0x1a, 0x66, 0x49, 0xb2, 0xff, 0xc3, 0x18, 0x18, 0xd6, 0xa1, 0xc7, 0x30, 0xd5, - 0xbd, 0xc4, 0x54, 0x1f, 0xd1, 0xb2, 0x61, 0xd8, 0xba, 0x06, 0x45, 0xb0, 0xed, 0xa5, 0x22, 0xd8, - 0x6e, 0xe5, 0xc6, 0xf1, 0xe8, 0x00, 0xb6, 0xef, 0x5b, 0xf0, 0x74, 0x8c, 0xdc, 0x6f, 0xb8, 0x7d, - 0xf4, 0xba, 0xfd, 0x32, 0x94, 0x9d, 0xb8, 0x9a, 0x9c, 0x58, 0x46, 0xf8, 0x90, 0x06, 0xa1, 0x89, - 0x17, 0x87, 0x3e, 0x14, 0x4e, 0x18, 0xfa, 0x30, 0x7e, 0x74, 0xe8, 0x83, 0xfd, 0xa3, 0x31, 0xb8, - 0xd8, 0xff, 0x65, 0x6a, 0xc5, 0x19, 0xce, 0x0b, 0xe2, 0x15, 0x98, 0x8e, 0x64, 0x05, 0x63, 0xff, - 0xd4, 0xa1, 0xcc, 0x9b, 0x06, 0x0c, 0x13, 0x98, 0xac, 0x66, 0x43, 0xac, 0x75, 0xf5, 0x86, 0xdf, - 0x55, 0x61, 0x3b, 0xba, 0xe6, 0xb2, 0x01, 0xc3, 0x04, 0xa6, 0xf6, 0x19, 0x1e, 0x3f, 0x75, 0x9f, - 0xe1, 0x3a, 0x5c, 0x50, 0x5e, 0x92, 0xd7, 0xfd, 0x40, 0xfa, 0xff, 0xab, 0x15, 0x64, 0xaa, 0x76, - 0x51, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, 0x5d, 0xd7, 0xfe, 0x7e, 0x01, 0xce, 0xc5, 0xcd, 0xbe, - 0xec, 0x7b, 0x4d, 0x97, 0x3b, 0xda, 0xbc, 0x0a, 0xe3, 0xd1, 0x7e, 0x57, 0x35, 0xf6, 0x5f, 0x54, - 0xe2, 0x6c, 0xee, 0x77, 0x59, 0x6f, 0x3f, 0x99, 0x51, 0x85, 0x9b, 0xce, 0x79, 0x25, 0xb2, 0xa6, - 0x67, 0x87, 0xe8, 0x81, 0x97, 0x92, 0xa3, 0xf9, 0xe1, 0x41, 0x25, 0x23, 0x92, 0x7f, 0x51, 0x53, - 0x4a, 0x8e, 0x79, 0x72, 0x0f, 0x66, 0xda, 0x4e, 0x18, 0xdd, 0xe9, 0x36, 0x9d, 0x88, 0x6e, 0xba, - 0xd2, 0x85, 0xe5, 0x78, 0x21, 0x13, 0xfa, 0xae, 0x7f, 0x2d, 0x41, 0x09, 0x53, 0x94, 0xc9, 0x1e, - 0x10, 0x56, 0xb2, 0x19, 0x38, 0x5e, 0x28, 0xbe, 0x8a, 0xf1, 0x3b, 0x7e, 0xfc, 0x8b, 0x3e, 0x3a, - 0xaf, 0xf5, 0x51, 0xc3, 0x0c, 0x0e, 0xe4, 0x39, 0x98, 0x08, 0xa8, 0x13, 0xea, 0xed, 0x40, 0xcf, - 0x7f, 0xe4, 0xa5, 0x28, 0xa1, 0xe6, 0x84, 0x9a, 0x78, 0xc4, 0x84, 0xfa, 0x43, 0x0b, 0x66, 0xe2, - 0x6e, 0x7a, 0x0c, 0xaa, 0x47, 0x27, 0xa9, 0x7a, 0xdc, 0xc8, 0x6b, 0x49, 0x1c, 0xa0, 0x6d, 0xfc, - 0xc9, 0xa4, 0xf9, 0x7d, 0x3c, 0x60, 0xe0, 0x0b, 0x50, 0x52, 0xb3, 0x5a, 0xe9, 0xf4, 0x23, 0x5a, - 0x20, 0x12, 0xda, 0x9e, 0x11, 0xc5, 0x27, 0x99, 0x60, 0xcc, 0x8f, 0xe9, 0x3a, 0x4d, 0xa9, 0xc7, - 0xc8, 0x61, 0xaf, 0x75, 0x1d, 0xa5, 0xdf, 0x64, 0xe9, 0x3a, 0xaa, 0x0e, 0xb9, 0x03, 0x4f, 0x76, - 0x03, 0x9f, 0xc7, 0x92, 0xaf, 0x50, 0xa7, 0xd9, 0x76, 0x3d, 0xaa, 0xcc, 0x3c, 0xc2, 0xd5, 0xe4, - 0xe9, 0xc3, 0x83, 0xca, 0x93, 0x1b, 0xd9, 0x28, 0x38, 0xa8, 0x6e, 0x32, 0x1a, 0x71, 0x7c, 0x88, - 0x68, 0xc4, 0xbf, 0xa1, 0x8d, 0xa9, 0x34, 0x94, 0x31, 0x81, 0x9f, 0xc9, 0xab, 0x2b, 0x33, 0x96, - 0xf5, 0x78, 0x48, 0x55, 0x25, 0x53, 0xd4, 0xec, 0x07, 0x5b, 0xec, 0x26, 0x4e, 0x68, 0xb1, 0x8b, - 0xe3, 0x2e, 0x26, 0x7f, 0x9c, 0x71, 0x17, 0x53, 0x1f, 0xa8, 0x50, 0xcb, 0x6f, 0x5b, 0x70, 0xce, - 0xe9, 0x8f, 0x32, 0xce, 0xc7, 0x78, 0x9c, 0x11, 0xbe, 0x5c, 0x7b, 0x5a, 0x0a, 0x99, 0x15, 0xcc, - 0x8d, 0x59, 0xa2, 0xd8, 0xef, 0x17, 0x61, 0x2e, 0xad, 0x24, 0x9d, 0x7e, 0x38, 0xe6, 0xdf, 0xb2, - 0x60, 0x4e, 0x4d, 0x70, 0xc1, 0x53, 0x1f, 0x31, 0xd6, 0x72, 0x5a, 0x57, 0x84, 0xba, 0xa7, 0xb3, - 0x64, 0x6c, 0xa6, 0xb8, 0x61, 0x1f, 0x7f, 0xf2, 0x36, 0x94, 0xf5, 0xad, 0xca, 0x89, 0x62, 0x33, - 0x79, 0xf8, 0x60, 0x35, 0x26, 0x81, 0x26, 0x3d, 0xf2, 0xbe, 0x05, 0xd0, 0x50, 0x3b, 0xb1, 0x5a, - 0x00, 0xde, 0xcc, 0x6b, 0x01, 0xd0, 0x7b, 0x7c, 0xac, 0xcf, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, - 0x17, 0xf9, 0x7d, 0x8a, 0x1e, 0x09, 0x22, 0xfb, 0xc6, 0xc8, 0x6e, 0xef, 0x47, 0xe8, 0xce, 0xb1, - 0xb6, 0x67, 0x80, 0x42, 0x4c, 0x08, 0x61, 0xbf, 0x0a, 0xda, 0x51, 0x99, 0xad, 0xac, 0xdc, 0x55, - 0x79, 0xc3, 0x89, 0x76, 0xe4, 0x10, 0xd4, 0x2b, 0xeb, 0x75, 0x05, 0xc0, 0x18, 0xc7, 0xfe, 0x1c, - 0xcc, 0xbc, 0x1e, 0x38, 0xdd, 0x1d, 0x97, 0xdf, 0x5b, 0xb0, 0xf3, 0xf1, 0xf3, 0x30, 0xe9, 0x34, - 0x9b, 0x59, 0x09, 0x5d, 0xaa, 0xa2, 0x18, 0x15, 0x7c, 0xa8, 0xa3, 0xb0, 0xfd, 0xbb, 0x16, 0x90, - 0xf8, 0xee, 0xd7, 0xf5, 0x5a, 0xeb, 0x4e, 0xd4, 0xd8, 0x61, 0x47, 0xb8, 0x1d, 0x5e, 0x9a, 0x75, - 0x84, 0xbb, 0xa1, 0x21, 0x68, 0x60, 0x91, 0x77, 0xa1, 0x2c, 0xfe, 0xbd, 0xa5, 0x0f, 0x88, 0xa3, - 0xfb, 0x5b, 0xf3, 0x3d, 0x8f, 0xcb, 0x24, 0x46, 0xe1, 0x8d, 0x98, 0x03, 0x9a, 0xec, 0x58, 0x53, - 0xad, 0x7a, 0xdb, 0xed, 0xde, 0x83, 0xe6, 0x56, 0xdc, 0x54, 0xdd, 0xc0, 0xdf, 0x76, 0xdb, 0x34, - 0xdd, 0x54, 0x1b, 0xa2, 0x18, 0x15, 0x7c, 0xb8, 0xa6, 0xfa, 0x57, 0x16, 0x9c, 0x5f, 0x0d, 0x23, - 0xd7, 0x5f, 0xa1, 0x61, 0xc4, 0x76, 0x3e, 0xb6, 0x3e, 0xf6, 0xda, 0xc3, 0xc4, 0x1c, 0xac, 0xc0, - 0x9c, 0xbc, 0x87, 0xee, 0x6d, 0x85, 0x34, 0x32, 0x8e, 0x1a, 0x7a, 0x1e, 0x2f, 0xa7, 0xe0, 0xd8, - 0x57, 0x83, 0x51, 0x91, 0x17, 0xd2, 0x31, 0x95, 0x42, 0x92, 0x4a, 0x3d, 0x05, 0xc7, 0xbe, 0x1a, - 0xf6, 0xf7, 0x0a, 0x70, 0x8e, 0x7f, 0x46, 0x2a, 0x5e, 0xe8, 0x1b, 0x83, 0xe2, 0x85, 0x46, 0x9c, - 0xca, 0x9c, 0xd7, 0x09, 0xa2, 0x85, 0xfe, 0xa6, 0x05, 0xb3, 0xcd, 0x64, 0x4b, 0xe7, 0x63, 0x97, - 0xcb, 0xea, 0x43, 0xe1, 0x76, 0x97, 0x2a, 0xc4, 0x34, 0x7f, 0xf2, 0x4b, 0x16, 0xcc, 0x26, 0xc5, - 0x54, 0xab, 0xfb, 0x29, 0x34, 0x92, 0xf6, 0x93, 0x4f, 0x96, 0x87, 0x98, 0x16, 0xc1, 0xfe, 0xbd, - 0x31, 0xd9, 0xa5, 0xa7, 0x11, 0x0c, 0x43, 0xee, 0x43, 0x29, 0x6a, 0x87, 0xa2, 0x50, 0x7e, 0xed, - 0x88, 0x87, 0xd6, 0xcd, 0xb5, 0xba, 0x70, 0x01, 0x89, 0xf5, 0x4a, 0x59, 0xc2, 0xf4, 0x63, 0xc5, - 0x8b, 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x4e, 0xcb, 0x9b, 0xcb, 0x1b, 0x69, 0xc6, 0xb2, 0x84, - 0x31, 0x56, 0xbc, 0xec, 0x5f, 0xb3, 0xa0, 0x74, 0xd3, 0x57, 0xeb, 0xc8, 0xcf, 0xe4, 0x60, 0x8b, - 0xd2, 0x2a, 0xab, 0x56, 0x5a, 0xe2, 0x53, 0xd0, 0x6b, 0x09, 0x4b, 0xd4, 0x33, 0x06, 0xed, 0x45, - 0x9e, 0xd7, 0x8e, 0x91, 0xba, 0xe9, 0x6f, 0x0d, 0x34, 0x1f, 0xff, 0x72, 0x11, 0xce, 0xbc, 0xe1, - 0xec, 0x53, 0x2f, 0x72, 0x8e, 0xbf, 0x49, 0xbc, 0x0c, 0x65, 0xa7, 0xcb, 0xef, 0x32, 0x8d, 0x63, - 0x48, 0x6c, 0xdc, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x88, 0x4c, 0xc9, 0x5a, 0x8a, 0x96, - 0x53, 0x70, 0xec, 0xab, 0x41, 0x6e, 0x02, 0x91, 0x81, 0xd4, 0xd5, 0x46, 0xc3, 0xef, 0x79, 0x62, - 0x49, 0x13, 0x76, 0x1f, 0x7d, 0x1e, 0x5e, 0xef, 0xc3, 0xc0, 0x8c, 0x5a, 0xe4, 0xb3, 0x30, 0xdf, - 0xe0, 0x94, 0xe5, 0xe9, 0xc8, 0xa4, 0x28, 0x4e, 0xc8, 0x3a, 0xd6, 0x63, 0x79, 0x00, 0x1e, 0x0e, - 0xa4, 0xc0, 0x24, 0x0d, 0x23, 0x3f, 0x70, 0x5a, 0xd4, 0xa4, 0x3b, 0x91, 0x94, 0xb4, 0xde, 0x87, - 0x81, 0x19, 0xb5, 0xc8, 0x17, 0xa1, 0x14, 0xed, 0x04, 0x34, 0xdc, 0xf1, 0xdb, 0x4d, 0xe9, 0x7b, - 0x32, 0xa2, 0x31, 0x50, 0xf6, 0xfe, 0xa6, 0xa2, 0x6a, 0x0c, 0x6f, 0x55, 0x84, 0x31, 0x4f, 0x12, - 0xc0, 0x44, 0xd8, 0xf0, 0xbb, 0x34, 0x94, 0xa7, 0x8a, 0x9b, 0xb9, 0x70, 0xe7, 0xc6, 0x2d, 0xc3, - 0x0c, 0xc9, 0x39, 0xa0, 0xe4, 0x64, 0xff, 0xce, 0x18, 0x4c, 0x9b, 0x88, 0x43, 0xac, 0x4d, 0x5f, - 0xb6, 0x60, 0xba, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0x85, 0x89, 0x2d, 0x1f, 0x8d, 0x82, 0x91, 0x5a, - 0xa1, 0x91, 0xe3, 0xb6, 0x0d, 0x6b, 0x9d, 0xc1, 0x06, 0x13, 0x4c, 0xc9, 0xd7, 0x2d, 0x98, 0x8d, - 0x5d, 0x15, 0x63, 0x5b, 0x5f, 0xae, 0x82, 0xe8, 0xa5, 0xfe, 0x5a, 0x92, 0x13, 0xa6, 0x59, 0xdb, - 0x5b, 0x30, 0x97, 0xee, 0x6d, 0xd6, 0x94, 0x5d, 0x47, 0xce, 0xf5, 0x42, 0xdc, 0x94, 0x1b, 0x4e, - 0x18, 0x22, 0x87, 0x90, 0x17, 0x60, 0xaa, 0xe3, 0x04, 0x2d, 0xd7, 0x73, 0xda, 0xbc, 0x15, 0x0b, - 0xc6, 0x82, 0x24, 0xcb, 0x51, 0x63, 0xd8, 0x1f, 0x83, 0xe9, 0x75, 0xc7, 0x6b, 0xd1, 0xa6, 0x5c, - 0x87, 0x1f, 0x1d, 0x8e, 0xf9, 0xc7, 0xe3, 0x50, 0x36, 0x8e, 0x8f, 0xa7, 0x7f, 0xce, 0x4a, 0x24, - 0x9b, 0x29, 0xe4, 0x98, 0x6c, 0xe6, 0xd3, 0x00, 0xdb, 0xae, 0xe7, 0x86, 0x3b, 0x27, 0x4c, 0x63, - 0xc3, 0xef, 0xe6, 0xaf, 0x6b, 0x0a, 0x68, 0x50, 0x8b, 0x2f, 0x40, 0x8b, 0x47, 0x64, 0x84, 0x7b, - 0xdf, 0x32, 0xb6, 0x9b, 0x89, 0x3c, 0x1c, 0x3e, 0x8c, 0x8e, 0x59, 0x54, 0xdb, 0x8f, 0xb8, 0x9b, - 0x3a, 0x6a, 0x57, 0xda, 0x84, 0xa9, 0x80, 0x86, 0xbd, 0x0e, 0x3d, 0x51, 0xc2, 0x19, 0xee, 0x7a, - 0x83, 0xb2, 0x3e, 0x6a, 0x4a, 0x0b, 0xaf, 0xc2, 0x99, 0x84, 0x08, 0xc7, 0xba, 0x61, 0xf2, 0x21, - 0xd3, 0x46, 0x71, 0x92, 0xfb, 0x26, 0xd6, 0x17, 0x6d, 0x23, 0xd1, 0x8c, 0xee, 0x0b, 0xe1, 0x60, - 0x25, 0x60, 0xf6, 0x8f, 0x26, 0x40, 0xfa, 0x30, 0x0c, 0xb1, 0x5c, 0x99, 0x37, 0x97, 0x63, 0x27, - 0xb8, 0xb9, 0xbc, 0x09, 0xd3, 0xae, 0xe7, 0x46, 0xae, 0xd3, 0xe6, 0xf6, 0x27, 0xb9, 0x9d, 0x2a, - 0x0f, 0xf4, 0xe9, 0x55, 0x03, 0x96, 0x41, 0x27, 0x51, 0x97, 0xbc, 0x09, 0x45, 0xbe, 0xdf, 0xc8, - 0x01, 0x7c, 0x7c, 0x47, 0x0b, 0xee, 0x63, 0x23, 0xc2, 0xd2, 0x04, 0x25, 0x7e, 0xf8, 0x10, 0x99, - 0x76, 0xf4, 0xf1, 0x5b, 0x8e, 0xe3, 0xf8, 0xf0, 0x91, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x65, 0xdb, - 0x71, 0xdb, 0xbd, 0x80, 0xc6, 0x54, 0x26, 0x92, 0x54, 0xae, 0xa7, 0xe0, 0xd8, 0x57, 0x83, 0x6c, - 0xc3, 0xb4, 0x2c, 0x13, 0x6e, 0x73, 0x93, 0x27, 0xfc, 0x4a, 0xee, 0x1e, 0x79, 0xdd, 0xa0, 0x84, - 0x09, 0xba, 0xa4, 0x07, 0x67, 0x5d, 0xaf, 0xe1, 0x7b, 0x8d, 0x76, 0x2f, 0x74, 0xf7, 0x68, 0x1c, - 0x13, 0x76, 0x12, 0x66, 0x17, 0x0e, 0x0f, 0x2a, 0x67, 0x57, 0xd3, 0xe4, 0xb0, 0x9f, 0x03, 0xf9, - 0x92, 0x05, 0x17, 0x1a, 0xbe, 0x17, 0xf2, 0xd4, 0x15, 0x7b, 0xf4, 0x5a, 0x10, 0xf8, 0x81, 0xe0, - 0x5d, 0x3a, 0x21, 0x6f, 0x6e, 0xf6, 0x5c, 0xce, 0x22, 0x89, 0xd9, 0x9c, 0xc8, 0x3b, 0x30, 0xd5, - 0x0d, 0xfc, 0x3d, 0xb7, 0x49, 0x03, 0xe9, 0x82, 0xb9, 0x96, 0x47, 0x2a, 0x9d, 0x0d, 0x49, 0x33, - 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, 0x29, 0xc3, 0x4c, 0x12, 0x9d, 0xfc, 0x1c, 0x40, - 0x37, 0xf0, 0x3b, 0x34, 0xda, 0xa1, 0x3a, 0xb6, 0xe7, 0xd6, 0xa8, 0x19, 0x5b, 0x14, 0x3d, 0xe5, - 0xb6, 0xc4, 0x96, 0x8b, 0xb8, 0x14, 0x0d, 0x8e, 0x24, 0x80, 0xc9, 0x5d, 0xb1, 0xed, 0x4a, 0x2d, - 0xe4, 0x8d, 0x5c, 0x74, 0x26, 0xc9, 0x99, 0x07, 0xa5, 0xc8, 0x22, 0x54, 0x8c, 0xc8, 0x16, 0x14, - 0xee, 0xd3, 0xad, 0x7c, 0xd2, 0x05, 0xdc, 0xa5, 0xf2, 0x34, 0x53, 0x9b, 0x3c, 0x3c, 0xa8, 0x14, - 0xee, 0xd2, 0x2d, 0x64, 0xc4, 0xd9, 0x77, 0x35, 0x85, 0xef, 0x82, 0x5c, 0x2a, 0xde, 0xc8, 0xd1, - 0x11, 0x42, 0x7c, 0x97, 0x2c, 0x42, 0xc5, 0x88, 0xbc, 0x03, 0xa5, 0xfb, 0xce, 0x1e, 0xdd, 0x0e, - 0x7c, 0x2f, 0x92, 0xbe, 0x72, 0x23, 0x86, 0x7b, 0xdc, 0x55, 0xe4, 0x24, 0x5f, 0xbe, 0xbd, 0xeb, - 0x42, 0x8c, 0xd9, 0x91, 0x3d, 0x98, 0xf2, 0xe8, 0x7d, 0xa4, 0x6d, 0xb7, 0x91, 0x4f, 0x78, 0xc5, - 0x2d, 0x49, 0x4d, 0x72, 0xe6, 0xfb, 0x9e, 0x2a, 0x43, 0xcd, 0x8b, 0xf5, 0xe5, 0x3d, 0x7f, 0x4b, - 0x2e, 0x54, 0x23, 0xf6, 0xa5, 0x3e, 0x99, 0x8a, 0xbe, 0xbc, 0xe9, 0x6f, 0x21, 0x23, 0xce, 0xe6, - 0x48, 0x43, 0x3b, 0x6a, 0xc9, 0x65, 0xea, 0x56, 0xbe, 0x0e, 0x6a, 0x62, 0x8e, 0xc4, 0xa5, 0x68, - 0x70, 0x64, 0x6d, 0xdb, 0x92, 0xc6, 0x4a, 0xb9, 0x50, 0x8d, 0xd8, 0xb6, 0x49, 0xd3, 0xa7, 0x68, - 0x5b, 0x55, 0x86, 0x9a, 0x17, 0xe3, 0xeb, 0x4a, 0xcb, 0x5f, 0x3e, 0x4b, 0x55, 0xd2, 0x8e, 0x28, - 0xf8, 0xaa, 0x32, 0xd4, 0xbc, 0x58, 0x7b, 0x87, 0xbb, 0xfb, 0xf7, 0x9d, 0xf6, 0xae, 0xeb, 0xb5, - 0x64, 0xac, 0xea, 0xa8, 0x59, 0xa7, 0x77, 0xf7, 0xef, 0x0a, 0x7a, 0x66, 0x7b, 0xc7, 0xa5, 0x68, - 0x70, 0x24, 0x7f, 0xcf, 0x82, 0x89, 0x6e, 0xbb, 0xd7, 0x72, 0xbd, 0xf9, 0xe9, 0x3c, 0x9c, 0x98, - 0x92, 0x4b, 0xee, 0xe2, 0x06, 0x27, 0x2d, 0x14, 0xc5, 0x9f, 0xd4, 0x7e, 0x97, 0xbc, 0xf0, 0x6b, - 0x7f, 0x54, 0x99, 0xa7, 0x5e, 0xc3, 0x6f, 0xba, 0x5e, 0x6b, 0xe9, 0x5e, 0xe8, 0x7b, 0x8b, 0xe8, - 0xdc, 0x57, 0x3a, 0xba, 0x94, 0x69, 0xe1, 0x13, 0x50, 0x36, 0x48, 0x3c, 0x4a, 0xd1, 0x9b, 0x36, - 0x15, 0xbd, 0x5f, 0x9b, 0x80, 0x69, 0x33, 0xd7, 0xe4, 0x10, 0xda, 0x97, 0x3e, 0x71, 0x8c, 0x1d, - 0xe7, 0xc4, 0xc1, 0x8e, 0x98, 0xc6, 0x05, 0x97, 0x32, 0x6f, 0xad, 0xe6, 0xa6, 0x70, 0xc7, 0x47, - 0x4c, 0xa3, 0x30, 0xc4, 0x04, 0xd3, 0x63, 0xf8, 0xbc, 0x30, 0xb5, 0x55, 0x28, 0x76, 0xc5, 0xa4, - 0xda, 0x9a, 0x50, 0xd5, 0xae, 0x02, 0xc4, 0x49, 0x11, 0xe5, 0xc5, 0xa7, 0xd6, 0x87, 0x8d, 0x64, - 0x8d, 0x06, 0x16, 0x79, 0x0e, 0x26, 0x98, 0xea, 0x43, 0x9b, 0x32, 0x94, 0x5e, 0x9f, 0xe3, 0xaf, - 0xf3, 0x52, 0x94, 0x50, 0xf2, 0x0a, 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0xc8, 0x9f, 0x8f, 0xb5, - 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, 0xd1, 0xb9, 0xd2, - 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, 0x4a, 0xc1, 0xb1, - 0xaf, 0x06, 0xfb, 0x18, 0x79, 0x67, 0x5b, 0x16, 0x0e, 0xd3, 0x03, 0x6e, 0x5b, 0xbf, 0x62, 0x9e, - 0xb5, 0x72, 0x9c, 0x43, 0x62, 0xd4, 0x0e, 0x7f, 0xd8, 0x1a, 0xed, 0x58, 0xf4, 0x39, 0x98, 0x49, - 0xee, 0x42, 0xb9, 0xdf, 0x7c, 0x7c, 0x75, 0x1c, 0xce, 0xdd, 0x6a, 0xb9, 0x5e, 0x3a, 0xd1, 0x59, - 0x56, 0x12, 0x7f, 0xeb, 0xd8, 0x49, 0xfc, 0x75, 0x4c, 0x9e, 0x4c, 0x91, 0x9f, 0x1d, 0x93, 0xa7, - 0xde, 0x2b, 0x48, 0xe2, 0x92, 0x3f, 0xb4, 0xe0, 0x19, 0xa7, 0x29, 0xce, 0x05, 0x4e, 0x5b, 0x96, - 0x1a, 0xb9, 0xa7, 0xe5, 0x8c, 0x0e, 0x47, 0xdc, 0xe5, 0xfb, 0x3f, 0x7e, 0xb1, 0x7a, 0x04, 0x57, - 0xd1, 0xe3, 0x3f, 0x21, 0xbf, 0xe0, 0x99, 0xa3, 0x50, 0xf1, 0x48, 0xf1, 0xc9, 0x5f, 0x81, 0xd9, - 0xc4, 0x07, 0x4b, 0x4b, 0x78, 0x49, 0x5c, 0x58, 0xd4, 0x93, 0x20, 0x4c, 0xe3, 0x2e, 0xdc, 0x86, - 0x0f, 0x3f, 0x52, 0xce, 0x63, 0x0d, 0xb6, 0xef, 0x5a, 0x30, 0x6d, 0xe6, 0x24, 0x22, 0x2f, 0xc0, - 0x54, 0xe4, 0xef, 0x52, 0xef, 0x4e, 0xa0, 0x1c, 0x76, 0xf5, 0x40, 0xdf, 0xe4, 0xe5, 0xb8, 0x86, - 0x1a, 0x83, 0x61, 0x37, 0xda, 0x2e, 0xf5, 0xa2, 0xd5, 0xa6, 0xec, 0x66, 0x8d, 0xbd, 0x2c, 0xca, - 0x57, 0x50, 0x63, 0x08, 0x1f, 0x3b, 0xf6, 0xbb, 0x4e, 0x1b, 0x01, 0x55, 0xee, 0xfd, 0x86, 0x8f, - 0x5d, 0x0c, 0xc3, 0x04, 0x26, 0xb1, 0xb5, 0x89, 0x73, 0x3c, 0xbe, 0xd7, 0x48, 0x99, 0x24, 0x7f, - 0xd3, 0x82, 0x92, 0x30, 0xd1, 0x23, 0xdd, 0x4e, 0xb9, 0xd8, 0xa6, 0x8c, 0x08, 0xd5, 0x8d, 0xd5, - 0x2c, 0x17, 0xdb, 0xcb, 0x30, 0xbe, 0xeb, 0x7a, 0xea, 0x4b, 0xf4, 0xb6, 0xf4, 0x86, 0xeb, 0x35, - 0x91, 0x43, 0xf4, 0xc6, 0x55, 0x18, 0xb8, 0x71, 0x2d, 0x41, 0x49, 0x3b, 0x9e, 0xc8, 0xe5, 0x5f, - 0x5b, 0x6f, 0xb5, 0xa3, 0x0a, 0xc6, 0x38, 0xf6, 0xaf, 0x58, 0x30, 0xc3, 0x63, 0xb8, 0xe3, 0xf3, - 0xf0, 0xcb, 0xda, 0x17, 0x4c, 0xc8, 0x7d, 0x31, 0xe9, 0x0b, 0xf6, 0xf0, 0xa0, 0x52, 0x16, 0x51, - 0xdf, 0x49, 0xd7, 0xb0, 0xcf, 0x48, 0x23, 0x1a, 0xf7, 0x58, 0x1b, 0x3b, 0xb6, 0x8d, 0x27, 0x16, - 0x53, 0x11, 0xc1, 0x98, 0x9e, 0xfd, 0x2e, 0x4c, 0x9b, 0xc1, 0x58, 0xe4, 0x65, 0x28, 0x77, 0x5d, - 0xaf, 0x95, 0x0c, 0xda, 0xd5, 0x17, 0x0d, 0x1b, 0x31, 0x08, 0x4d, 0x3c, 0x5e, 0xcd, 0x8f, 0xab, - 0xa5, 0xee, 0x27, 0x36, 0x7c, 0xb3, 0x5a, 0xfc, 0x87, 0xe7, 0xfd, 0xcf, 0x08, 0xfa, 0xcb, 0x3d, - 0xef, 0x7f, 0x06, 0x8f, 0x1f, 0x5f, 0xde, 0xff, 0x2c, 0x61, 0xfe, 0x6c, 0xe5, 0xfd, 0xff, 0x69, - 0x38, 0x6e, 0x4e, 0x54, 0xb6, 0xd7, 0xdf, 0x37, 0x13, 0x2b, 0xe8, 0x16, 0x97, 0x99, 0x15, 0x24, - 0xd4, 0xfe, 0x4e, 0x01, 0xe6, 0xd2, 0x47, 0xfe, 0xbc, 0xbd, 0x29, 0xc8, 0xd7, 0x2d, 0x98, 0x71, - 0x12, 0xf9, 0xe7, 0x72, 0x7a, 0x44, 0x28, 0x41, 0xd3, 0xc8, 0x7f, 0x96, 0x28, 0xc7, 0x14, 0x6f, - 0xf2, 0x17, 0x60, 0x32, 0x72, 0x3b, 0xd4, 0xef, 0x09, 0x43, 0x60, 0x41, 0x1c, 0xc8, 0x37, 0x45, - 0x11, 0x2a, 0x18, 0x5b, 0x94, 0x5d, 0xae, 0x41, 0x05, 0x54, 0x7a, 0x06, 0xcf, 0xc5, 0x96, 0x4b, - 0x51, 0x8e, 0x1a, 0x83, 0x3c, 0x80, 0x49, 0xe1, 0x77, 0xa1, 0x1c, 0x6c, 0xd6, 0x73, 0x32, 0x4d, - 0x08, 0xd7, 0x8e, 0xb8, 0x0b, 0xc4, 0xff, 0x10, 0x15, 0x3b, 0xfb, 0x63, 0x70, 0xcc, 0x24, 0xb1, - 0xf6, 0x35, 0x20, 0xe8, 0xb7, 0xdb, 0x5b, 0x4e, 0x63, 0xf7, 0xae, 0xeb, 0x35, 0xfd, 0xfb, 0x7c, - 0x29, 0x5a, 0x82, 0x52, 0x20, 0x43, 0x66, 0x43, 0x39, 0x6a, 0xf4, 0x5a, 0xa6, 0x62, 0x69, 0x43, - 0x8c, 0x71, 0xec, 0xdf, 0x1b, 0x83, 0x49, 0x19, 0xdf, 0xfd, 0x18, 0x22, 0x13, 0x76, 0x13, 0xf7, - 0xc1, 0xab, 0xb9, 0x84, 0xa5, 0x0f, 0x0c, 0x4b, 0x08, 0x53, 0x61, 0x09, 0x6f, 0xe4, 0xc3, 0xee, - 0xe8, 0x98, 0x84, 0x7f, 0x5d, 0x84, 0xd9, 0x54, 0xbc, 0x3c, 0xd3, 0xc5, 0xfb, 0x5c, 0x71, 0xef, - 0xe4, 0x1a, 0x92, 0xaf, 0x63, 0x91, 0x8e, 0xf6, 0xca, 0x0d, 0x13, 0x29, 0xbd, 0xf3, 0xf3, 0x65, - 0xfc, 0xf3, 0xec, 0xde, 0x79, 0x79, 0x99, 0x16, 0x3f, 0x38, 0x5e, 0xa6, 0xff, 0xc5, 0x82, 0xa7, - 0x06, 0x66, 0x7e, 0xe0, 0x89, 0xc3, 0x82, 0x24, 0x54, 0xae, 0x19, 0x39, 0xe7, 0xb7, 0xd1, 0xf7, - 0xc7, 0xe9, 0x5c, 0x4f, 0x69, 0xf6, 0xe4, 0x25, 0x98, 0xe6, 0x3a, 0x1a, 0x5b, 0x3d, 0x23, 0xda, - 0x95, 0xd7, 0x5f, 0xfc, 0x22, 0xa4, 0x6e, 0x94, 0x63, 0x02, 0xcb, 0xfe, 0xb6, 0x05, 0xf3, 0x83, - 0xd2, 0x48, 0x0d, 0x61, 0x9c, 0xf9, 0xcb, 0xa9, 0xe8, 0x8e, 0x4a, 0x5f, 0x74, 0x47, 0xca, 0x3c, - 0xa3, 0x02, 0x39, 0x0c, 0xcb, 0x48, 0xe1, 0x11, 0xc1, 0x0b, 0xdf, 0xb0, 0xe0, 0xc9, 0x01, 0x13, - 0xbe, 0x2f, 0xca, 0xc7, 0x3a, 0x71, 0x94, 0xcf, 0xd8, 0xb0, 0x51, 0x3e, 0xf6, 0xef, 0x17, 0x60, - 0x4e, 0xca, 0x13, 0x2b, 0xea, 0xaf, 0x24, 0x62, 0x64, 0x7e, 0x22, 0x15, 0x23, 0x73, 0x3e, 0x8d, - 0xff, 0xe7, 0x01, 0x32, 0x1f, 0xac, 0x00, 0x99, 0xaf, 0x15, 0xe1, 0x42, 0x66, 0x76, 0x2b, 0xf2, - 0xd5, 0x8c, 0xdd, 0xeb, 0x6e, 0xce, 0x69, 0xb4, 0x86, 0xdc, 0xbf, 0x46, 0x8d, 0x2a, 0xf9, 0x25, - 0x33, 0x9a, 0x43, 0xec, 0x46, 0xdb, 0xa7, 0x90, 0x10, 0xec, 0xb8, 0x81, 0x1d, 0x8f, 0xf7, 0xc9, - 0xab, 0x3f, 0x03, 0x5b, 0xcf, 0xd7, 0x0a, 0x70, 0x65, 0xd8, 0x96, 0xfd, 0x80, 0x46, 0x42, 0x86, - 0x89, 0x48, 0xc8, 0xc7, 0xa4, 0x6a, 0x9d, 0x4a, 0x50, 0xe4, 0x3f, 0x18, 0xd7, 0x7a, 0x40, 0xff, - 0x84, 0x1d, 0xca, 0x79, 0x64, 0x92, 0xa9, 0xe3, 0x2a, 0x53, 0x7a, 0xbc, 0x37, 0x4c, 0xd6, 0x45, - 0xf1, 0xc3, 0x83, 0xca, 0xd9, 0x38, 0xe9, 0x8c, 0x2c, 0x44, 0x55, 0x89, 0x5c, 0x81, 0xa9, 0x40, - 0x40, 0x55, 0xec, 0x97, 0xf4, 0xc0, 0x11, 0x65, 0xa8, 0xa1, 0xe4, 0x8b, 0xc6, 0xf9, 0x65, 0xfc, - 0xb4, 0x72, 0x2b, 0x1d, 0xe5, 0x58, 0xf4, 0x36, 0x4c, 0x85, 0x2a, 0x9d, 0xb7, 0x98, 0x4e, 0x2f, - 0x0e, 0x19, 0x52, 0xe8, 0x6c, 0xd1, 0xb6, 0xca, 0xed, 0x2d, 0xbe, 0x4f, 0x67, 0xfe, 0xd6, 0x24, - 0x89, 0xad, 0xed, 0x01, 0xe2, 0xe2, 0x03, 0xfa, 0x6d, 0x01, 0x24, 0x82, 0x49, 0xf9, 0x84, 0xad, - 0xbc, 0x91, 0x5d, 0xcf, 0x29, 0x36, 0x47, 0x7a, 0x6e, 0xf3, 0x63, 0xb6, 0xb2, 0x4b, 0x29, 0x56, - 0xf6, 0xf7, 0x2d, 0x28, 0xcb, 0x31, 0xf2, 0x18, 0x62, 0x2b, 0xef, 0x25, 0x63, 0x2b, 0xaf, 0xe5, - 0xb2, 0x84, 0x0f, 0x08, 0xac, 0xbc, 0x07, 0xd3, 0x66, 0x9e, 0x49, 0xf2, 0x69, 0x63, 0x0b, 0xb2, - 0x46, 0xc9, 0xdc, 0xa6, 0x36, 0xa9, 0x78, 0x7b, 0xb2, 0x7f, 0xbd, 0xa4, 0x5b, 0x91, 0x1f, 0xe6, - 0xcd, 0x91, 0x6f, 0x1d, 0x39, 0xf2, 0xcd, 0x81, 0x37, 0x96, 0xff, 0xc0, 0x7b, 0x13, 0xa6, 0xd4, - 0xb2, 0x28, 0xb5, 0xa9, 0x67, 0x4d, 0x57, 0x6e, 0xa6, 0x92, 0x31, 0x62, 0xc6, 0x74, 0xe1, 0x87, - 0xf2, 0xd8, 0x5a, 0xae, 0x96, 0x6b, 0x4d, 0x86, 0xbc, 0x03, 0xe5, 0xfb, 0x7e, 0xb0, 0xdb, 0xf6, - 0x1d, 0xfe, 0x86, 0x02, 0xe4, 0xe1, 0x3d, 0xa0, 0x2d, 0xde, 0x22, 0x9e, 0xe6, 0x6e, 0x4c, 0x1f, - 0x4d, 0x66, 0xa4, 0x0a, 0xb3, 0x1d, 0xd7, 0x43, 0xea, 0x34, 0x75, 0x08, 0xe5, 0xb8, 0xc8, 0x5f, - 0xae, 0xce, 0x1a, 0xeb, 0x49, 0x30, 0xa6, 0xf1, 0xb9, 0x35, 0x2c, 0x48, 0x98, 0x5f, 0x64, 0x92, - 0xe2, 0x8d, 0xd1, 0x07, 0x63, 0xd2, 0xa4, 0x23, 0x02, 0x4a, 0x92, 0xe5, 0x98, 0xe2, 0x4d, 0xbe, - 0x00, 0x53, 0xa1, 0x7a, 0x1c, 0xb2, 0x98, 0xe3, 0x29, 0x4c, 0x3f, 0x10, 0xa9, 0xbb, 0x52, 0xbf, - 0x10, 0xa9, 0x19, 0x92, 0x35, 0x38, 0xaf, 0xec, 0x49, 0x89, 0x77, 0xee, 0x26, 0xe2, 0x9c, 0x63, - 0x98, 0x01, 0xc7, 0xcc, 0x5a, 0x4c, 0xb7, 0xe5, 0xf9, 0x5b, 0xc5, 0x6d, 0xad, 0x71, 0xc1, 0xc9, - 0xe7, 0x5f, 0x13, 0x25, 0xf4, 0xa8, 0x08, 0xe1, 0xa9, 0x11, 0x22, 0x84, 0xeb, 0x70, 0x21, 0x0d, - 0xe2, 0xc9, 0xe4, 0x78, 0xfe, 0x3a, 0x63, 0x0b, 0xdd, 0xc8, 0x42, 0xc2, 0xec, 0xba, 0xe4, 0x2e, - 0x94, 0x02, 0xca, 0x4f, 0x9d, 0x55, 0xe5, 0xe8, 0x76, 0x6c, 0x97, 0x5e, 0x54, 0x04, 0x30, 0xa6, - 0xc5, 0xfa, 0xdd, 0x49, 0x66, 0x14, 0x7f, 0x33, 0xc7, 0xd7, 0xa3, 0x65, 0xdf, 0x0f, 0x48, 0xf2, - 0x68, 0xff, 0xdb, 0x59, 0x38, 0x93, 0x30, 0x8a, 0x91, 0x67, 0xa1, 0xc8, 0xb3, 0xeb, 0xf1, 0xd5, - 0x6a, 0x2a, 0x5e, 0x51, 0x45, 0xe3, 0x08, 0x18, 0xf9, 0x05, 0x0b, 0x66, 0xbb, 0x89, 0x4b, 0x1e, - 0xb5, 0x90, 0x8f, 0x68, 0x49, 0x4e, 0xde, 0x1c, 0x19, 0x6f, 0x71, 0x24, 0x99, 0x61, 0x9a, 0x3b, - 0x5b, 0x0f, 0xa4, 0x5f, 0x7c, 0x9b, 0x06, 0x1c, 0x5b, 0x2a, 0x7a, 0x9a, 0xc4, 0x72, 0x12, 0x8c, - 0x69, 0x7c, 0xd6, 0xc3, 0xfc, 0xeb, 0x46, 0x79, 0x21, 0xb4, 0xaa, 0x08, 0x60, 0x4c, 0x8b, 0xbc, - 0x06, 0x33, 0x32, 0x91, 0xf4, 0x86, 0xdf, 0xbc, 0xe1, 0x84, 0x3b, 0xf2, 0xc8, 0xa7, 0x8f, 0xa8, - 0xcb, 0x09, 0x28, 0xa6, 0xb0, 0xf9, 0xb7, 0xc5, 0xd9, 0xba, 0x39, 0x81, 0x89, 0xe4, 0x53, 0x25, - 0xcb, 0x49, 0x30, 0xa6, 0xf1, 0xc9, 0x0b, 0xc6, 0x36, 0x24, 0x3c, 0x28, 0xf4, 0x6a, 0x90, 0xb1, - 0x15, 0x55, 0x61, 0xb6, 0xc7, 0x4f, 0xc8, 0x4d, 0x05, 0x94, 0xf3, 0x51, 0x33, 0xbc, 0x93, 0x04, - 0x63, 0x1a, 0x9f, 0xbc, 0x0a, 0x67, 0x02, 0xb6, 0xd8, 0x6a, 0x02, 0xc2, 0xad, 0x42, 0xdf, 0x9a, - 0xa3, 0x09, 0xc4, 0x24, 0x2e, 0x79, 0x1d, 0xce, 0xc6, 0x79, 0x57, 0x15, 0x01, 0xe1, 0x67, 0xa1, - 0x93, 0x00, 0x56, 0xd3, 0x08, 0xd8, 0x5f, 0x87, 0xfc, 0x35, 0x98, 0x33, 0x5a, 0x62, 0xd5, 0x6b, - 0xd2, 0x07, 0x32, 0x37, 0x26, 0x7f, 0x7a, 0x6b, 0x39, 0x05, 0xc3, 0x3e, 0x6c, 0xf2, 0x49, 0x98, - 0x69, 0xf8, 0xed, 0x36, 0x5f, 0xe3, 0xc4, 0x33, 0x19, 0x22, 0x09, 0xa6, 0x48, 0x17, 0x9a, 0x80, - 0x60, 0x0a, 0x93, 0xdc, 0x04, 0xe2, 0x6f, 0x31, 0xf5, 0x8a, 0x36, 0x5f, 0xa7, 0x1e, 0x95, 0x1a, - 0xc7, 0x99, 0x64, 0x54, 0xce, 0xed, 0x3e, 0x0c, 0xcc, 0xa8, 0xc5, 0x73, 0x08, 0x1a, 0x51, 0xcc, - 0x33, 0x79, 0x3c, 0x67, 0x99, 0xb6, 0xe7, 0x3c, 0x32, 0x84, 0x39, 0x80, 0x09, 0x11, 0x24, 0x95, - 0x4f, 0x36, 0x4c, 0x33, 0x63, 0x7e, 0xbc, 0x47, 0x88, 0x52, 0x94, 0x9c, 0xc8, 0xcf, 0x41, 0x69, - 0x4b, 0x3d, 0x9f, 0xc2, 0x53, 0x60, 0x8e, 0xbc, 0x2f, 0xa6, 0x5e, 0x02, 0x8a, 0xed, 0x15, 0x1a, - 0x80, 0x31, 0x4b, 0xf2, 0x1c, 0x94, 0x6f, 0x6c, 0x54, 0xf5, 0x28, 0x3c, 0xcb, 0x7b, 0x7f, 0x9c, - 0x55, 0x41, 0x13, 0xc0, 0x66, 0x98, 0x56, 0xdf, 0x48, 0xd2, 0x75, 0x20, 0x43, 0x1b, 0x63, 0xd8, - 0xdc, 0x17, 0x02, 0xeb, 0xf3, 0xe7, 0x52, 0xd8, 0xb2, 0x1c, 0x35, 0x06, 0x79, 0x1b, 0xca, 0x72, - 0xbf, 0xe0, 0x6b, 0xd3, 0xf9, 0x93, 0x45, 0xc8, 0x63, 0x4c, 0x02, 0x4d, 0x7a, 0xfc, 0x12, 0x9b, - 0xbf, 0x2a, 0x41, 0xaf, 0xf7, 0xda, 0xed, 0xf9, 0x0b, 0x7c, 0xdd, 0x8c, 0x2f, 0xb1, 0x63, 0x10, - 0x9a, 0x78, 0xe4, 0x45, 0xe5, 0xd3, 0xf6, 0x44, 0xe2, 0x56, 0x5f, 0xfb, 0xb4, 0x69, 0xa5, 0x7b, - 0x40, 0x10, 0xcd, 0x93, 0x8f, 0x70, 0x26, 0xdb, 0x82, 0x05, 0xa5, 0xf1, 0xf5, 0x4f, 0x92, 0xf9, - 0xf9, 0x84, 0xed, 0x68, 0xe1, 0xee, 0x40, 0x4c, 0x3c, 0x82, 0x0a, 0xd9, 0x82, 0x82, 0xd3, 0xde, - 0x9a, 0x7f, 0x2a, 0x0f, 0xd5, 0xb5, 0xba, 0x56, 0x93, 0x23, 0x8a, 0x3b, 0xbe, 0x56, 0xd7, 0x6a, - 0xc8, 0x88, 0x13, 0x17, 0xc6, 0x9d, 0xf6, 0x56, 0x38, 0xbf, 0xc0, 0xe7, 0x6c, 0x6e, 0x4c, 0x62, - 0xe3, 0xc1, 0x5a, 0x2d, 0x44, 0xce, 0xc2, 0xfe, 0xd2, 0x98, 0xbe, 0xb9, 0xd2, 0x09, 0xc9, 0xdf, - 0x35, 0x27, 0x90, 0x38, 0xee, 0xdc, 0xce, 0x6d, 0x02, 0x49, 0xf5, 0xe2, 0xcc, 0xc0, 0xe9, 0xd3, - 0xd5, 0x4b, 0x46, 0x2e, 0x99, 0xcc, 0x92, 0xc9, 0xd6, 0xc5, 0xe9, 0x39, 0xb9, 0x60, 0xd8, 0xdf, - 0x01, 0x6d, 0x05, 0x4d, 0xf9, 0x83, 0x05, 0x50, 0x74, 0xc3, 0xc8, 0xf5, 0x73, 0x0c, 0x1c, 0x4f, - 0x65, 0x29, 0xe7, 0x71, 0x29, 0x1c, 0x80, 0x82, 0x15, 0xe3, 0xe9, 0xb5, 0x5c, 0xef, 0x81, 0xfc, - 0xfc, 0x37, 0x73, 0x77, 0xf4, 0x12, 0x3c, 0x39, 0x00, 0x05, 0x2b, 0x72, 0x4f, 0x0c, 0xea, 0x42, - 0x1e, 0x7d, 0x5d, 0x5d, 0xab, 0xa5, 0xf8, 0x25, 0x07, 0xf7, 0x3d, 0x28, 0x84, 0x1d, 0x57, 0xaa, - 0x4b, 0x23, 0xf2, 0xaa, 0xaf, 0xaf, 0x66, 0xf1, 0xaa, 0xaf, 0xaf, 0x22, 0x63, 0x42, 0xbe, 0x62, - 0x01, 0x38, 0x9d, 0x2d, 0x27, 0x0c, 0x9d, 0xa6, 0xb6, 0xce, 0x8c, 0xf8, 0xfa, 0x48, 0x55, 0xd3, - 0x4b, 0xb1, 0xe6, 0xae, 0xcd, 0x31, 0x14, 0x0d, 0xce, 0xe4, 0x1d, 0x98, 0x74, 0xc4, 0xf3, 0x8e, - 0xd2, 0x4b, 0x3f, 0x9f, 0x37, 0x4b, 0x53, 0x12, 0x70, 0x33, 0x8d, 0x04, 0xa1, 0x62, 0xc8, 0x78, - 0x47, 0x81, 0x43, 0xb7, 0xdd, 0x5d, 0x69, 0x1c, 0xaa, 0x8f, 0xfc, 0x00, 0x09, 0x23, 0x96, 0xc5, - 0x5b, 0x82, 0x50, 0x31, 0x14, 0xaf, 0xf9, 0x3b, 0x9e, 0xa3, 0x63, 0x2f, 0xf3, 0x89, 0xd0, 0x35, - 0xa3, 0x39, 0x8d, 0xd7, 0xfc, 0x4d, 0x46, 0x98, 0xe4, 0x4b, 0xf6, 0x60, 0xc2, 0xe1, 0x0f, 0xcf, - 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x88, 0x6d, 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x9f, 0xb7, 0x95, 0xdc, - 0xc8, 0xaf, 0x5a, 0x30, 0x29, 0x1c, 0xc8, 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x73, 0xa7, 0xf0, 0xda, - 0x81, 0x74, 0x6e, 0x97, 0x2e, 0x51, 0x1f, 0xd1, 0xde, 0xb1, 0xa2, 0xf4, 0x48, 0xf7, 0x76, 0x25, - 0xdd, 0xc2, 0x27, 0x61, 0xda, 0xa4, 0x72, 0x2c, 0x07, 0xf7, 0x1f, 0x16, 0x00, 0x78, 0x43, 0x8b, - 0x6c, 0x2b, 0x1d, 0x9e, 0x9a, 0x79, 0xc7, 0x6f, 0xe6, 0xf4, 0x48, 0xa5, 0x91, 0x34, 0x05, 0x64, - 0x1e, 0xe6, 0x1d, 0xbf, 0x89, 0x92, 0x09, 0x69, 0xc1, 0x78, 0xd7, 0x89, 0x76, 0xf2, 0xcf, 0xd0, - 0x32, 0x25, 0xc2, 0x8e, 0xa3, 0x1d, 0xe4, 0x0c, 0xc8, 0x7b, 0x56, 0xec, 0x2b, 0x54, 0xc8, 0xc7, - 0xa3, 0x43, 0xb5, 0xd9, 0xa2, 0xf4, 0x0e, 0x4a, 0x25, 0x59, 0x4d, 0xfb, 0x0c, 0x2d, 0xbc, 0x6f, - 0xc1, 0xb4, 0x89, 0x9a, 0xd1, 0x4d, 0x3f, 0x6b, 0x76, 0x53, 0x9e, 0xed, 0x61, 0xf6, 0xf8, 0x7f, - 0xb3, 0x00, 0xb0, 0xe7, 0xd5, 0x7b, 0x9d, 0x0e, 0x53, 0xba, 0xb5, 0x1f, 0xbf, 0x35, 0xb4, 0x1f, - 0xff, 0xd8, 0x31, 0xfd, 0xf8, 0x0b, 0xc7, 0xf2, 0xe3, 0x1f, 0x3f, 0xbe, 0x1f, 0x7f, 0x71, 0xb0, - 0x1f, 0xbf, 0xfd, 0x4d, 0x0b, 0xce, 0xf6, 0xed, 0x36, 0x4c, 0x0f, 0x0e, 0x7c, 0x3f, 0x1a, 0xe0, - 0x03, 0x8a, 0x31, 0x08, 0x4d, 0x3c, 0xb2, 0x02, 0x73, 0xf2, 0x21, 0x92, 0x7a, 0xb7, 0xed, 0x66, - 0x66, 0xcf, 0xd9, 0x4c, 0xc1, 0xb1, 0xaf, 0x86, 0xfd, 0x1d, 0x0b, 0xca, 0x46, 0xcc, 0x3d, 0xfb, - 0x0e, 0xee, 0x08, 0x2c, 0xc5, 0x88, 0xdf, 0x60, 0xe1, 0x17, 0x55, 0x02, 0x26, 0x2e, 0x91, 0x5b, - 0x46, 0x9a, 0xfa, 0xf8, 0x12, 0x99, 0x95, 0xa2, 0x84, 0x8a, 0x04, 0xe4, 0xb4, 0xcb, 0x1b, 0xbd, - 0x60, 0x26, 0x20, 0xa7, 0x5d, 0xe4, 0x10, 0xce, 0x8e, 0x1d, 0x08, 0xa4, 0x8f, 0xaf, 0xf1, 0xe4, - 0x8b, 0x13, 0x44, 0x28, 0x60, 0xe4, 0x22, 0x14, 0xa8, 0xd7, 0x94, 0xd6, 0x0b, 0xfd, 0x28, 0xeb, - 0x35, 0xaf, 0x89, 0xac, 0xdc, 0xbe, 0x0d, 0xd3, 0xc2, 0xbf, 0xf9, 0x0d, 0xba, 0x3f, 0xf4, 0x2b, - 0xaf, 0x6c, 0xb4, 0xa7, 0x5e, 0x79, 0x65, 0xd5, 0x59, 0xb9, 0xfd, 0x8f, 0x2d, 0x48, 0xbd, 0x4b, - 0x64, 0xdc, 0x9f, 0x58, 0x03, 0xef, 0x4f, 0x4c, 0x9b, 0xfb, 0xd8, 0x91, 0x36, 0xf7, 0x9b, 0x40, - 0x3a, 0x6c, 0x2a, 0x24, 0x5e, 0xe1, 0x92, 0x86, 0xa3, 0x38, 0xc3, 0x47, 0x1f, 0x06, 0x66, 0xd4, - 0xb2, 0xff, 0x91, 0x10, 0xd6, 0x7c, 0xa9, 0xe8, 0xd1, 0x0d, 0xd0, 0x83, 0x22, 0x27, 0x25, 0xad, - 0x67, 0x23, 0x5a, 0x9e, 0xfb, 0x33, 0x65, 0xc5, 0x1d, 0x29, 0xa7, 0x3c, 0xe7, 0x66, 0xff, 0xbe, - 0x90, 0xd5, 0x78, 0xca, 0x68, 0x08, 0x59, 0x3b, 0x49, 0x59, 0x6f, 0xe4, 0xb5, 0x56, 0x66, 0xcb, - 0x48, 0x16, 0x01, 0xba, 0x34, 0x68, 0x50, 0x2f, 0x52, 0x91, 0x47, 0x45, 0x19, 0x03, 0xab, 0x4b, - 0xd1, 0xc0, 0xb0, 0xbf, 0xc1, 0x26, 0x50, 0xfc, 0xfe, 0x31, 0xb9, 0x92, 0x76, 0x9e, 0x4d, 0x4f, - 0x0e, 0xed, 0x3b, 0x6b, 0xc4, 0xa3, 0x8c, 0x3d, 0x22, 0x1e, 0xe5, 0x79, 0x98, 0x0c, 0xfc, 0x36, - 0xad, 0x06, 0x5e, 0xda, 0xe3, 0x07, 0x59, 0x31, 0xde, 0x42, 0x05, 0xb7, 0x7f, 0xd9, 0x82, 0xb9, - 0x74, 0xc0, 0x5c, 0xee, 0x1e, 0xbd, 0x66, 0x54, 0x7f, 0xe1, 0xf8, 0x51, 0xfd, 0xf6, 0x7b, 0x4c, - 0xc8, 0xc8, 0x6d, 0xec, 0xba, 0x9e, 0x08, 0x84, 0x67, 0x2d, 0xf7, 0x3c, 0x4c, 0x52, 0xf9, 0x8e, - 0xab, 0x30, 0x02, 0x6b, 0x21, 0xd5, 0xf3, 0xad, 0x0a, 0x4e, 0xaa, 0x30, 0xab, 0xae, 0xbe, 0x94, - 0xe5, 0x5e, 0x24, 0xf0, 0xd0, 0x96, 0xc2, 0x95, 0x24, 0x18, 0xd3, 0xf8, 0xf6, 0x17, 0xa1, 0x6c, - 0x6c, 0x4a, 0x7c, 0xfd, 0x7e, 0xe0, 0x34, 0xa2, 0xf4, 0xba, 0x77, 0x8d, 0x15, 0xa2, 0x80, 0xf1, - 0x0b, 0x06, 0x11, 0xcf, 0x93, 0x5a, 0xf7, 0x64, 0x14, 0x8f, 0x84, 0x32, 0x62, 0x01, 0x6d, 0xd1, - 0x07, 0xea, 0x15, 0x01, 0x45, 0x0c, 0x59, 0x21, 0x0a, 0x98, 0xfd, 0x02, 0x4c, 0xa9, 0x34, 0x4b, - 0x3c, 0x57, 0x89, 0x32, 0x7e, 0x9b, 0xb9, 0x4a, 0xfc, 0x20, 0x42, 0x0e, 0xb1, 0xdf, 0x82, 0x29, - 0x95, 0x0d, 0xea, 0xd1, 0xd8, 0x6c, 0x29, 0x0a, 0x3d, 0xf7, 0x86, 0x1f, 0x46, 0x2a, 0x85, 0x95, - 0xb8, 0x9f, 0xbb, 0xb5, 0xca, 0xcb, 0x50, 0x43, 0xed, 0x3f, 0xb5, 0xa0, 0xbc, 0xb9, 0xb9, 0xa6, - 0x8f, 0xed, 0x08, 0x4f, 0x84, 0xa2, 0x85, 0xaa, 0xdb, 0x11, 0x35, 0x1d, 0x01, 0xc4, 0xc2, 0xb7, - 0x70, 0x78, 0x50, 0x79, 0xa2, 0x9e, 0x89, 0x81, 0x03, 0x6a, 0x92, 0x55, 0x38, 0x67, 0x42, 0x64, - 0x6a, 0x01, 0xb9, 0x46, 0xf2, 0x87, 0x7f, 0xeb, 0xfd, 0x60, 0xcc, 0xaa, 0x93, 0x26, 0x25, 0xb7, - 0x7b, 0xf3, 0x0d, 0xe1, 0x7a, 0x3f, 0x18, 0xb3, 0xea, 0xd8, 0x2f, 0xc2, 0x6c, 0xea, 0x86, 0x7a, - 0x88, 0x94, 0x2e, 0xbf, 0x53, 0x80, 0x69, 0xf3, 0xa2, 0x72, 0x88, 0xf5, 0x6b, 0xf8, 0x6d, 0x21, - 0xe3, 0x72, 0xb1, 0x70, 0xcc, 0xcb, 0x45, 0xf3, 0x36, 0x77, 0xfc, 0x74, 0x6f, 0x73, 0x8b, 0xf9, - 0xdc, 0xe6, 0x1a, 0x5e, 0x07, 0x13, 0x8f, 0xcf, 0xeb, 0xe0, 0xb7, 0x8a, 0x30, 0x93, 0xcc, 0x11, - 0x3a, 0x44, 0x4f, 0xbe, 0xd0, 0xd7, 0x93, 0xc7, 0xbc, 0xcd, 0x28, 0x8c, 0x7a, 0x9b, 0x31, 0x3e, - 0xea, 0x6d, 0x46, 0xf1, 0x04, 0xb7, 0x19, 0xfd, 0x77, 0x11, 0x13, 0x43, 0xdf, 0x45, 0x7c, 0x4a, - 0x3b, 0x68, 0x4e, 0x26, 0x1c, 0x78, 0x62, 0x07, 0x4d, 0x92, 0xec, 0x86, 0x65, 0xbf, 0x99, 0xe9, - 0xe8, 0x3a, 0xf5, 0x08, 0xab, 0x6d, 0x90, 0xe9, 0x4f, 0x79, 0xfc, 0x0b, 0xd3, 0x27, 0x8e, 0xe1, - 0x4b, 0xf9, 0x32, 0x94, 0xe5, 0x78, 0xe2, 0xca, 0x37, 0x24, 0x15, 0xf7, 0x7a, 0x0c, 0x42, 0x13, - 0x8f, 0x0d, 0x8c, 0x6e, 0x3c, 0x41, 0xf8, 0xbd, 0x5a, 0x39, 0x79, 0xaf, 0xb6, 0x91, 0x04, 0x63, - 0x1a, 0xdf, 0xfe, 0x02, 0x5c, 0xc8, 0x34, 0xa0, 0x70, 0xe3, 0x35, 0xd7, 0x0b, 0x69, 0x53, 0x22, - 0x18, 0x62, 0xa4, 0x9e, 0x0e, 0x59, 0xb8, 0x3b, 0x10, 0x13, 0x8f, 0xa0, 0x62, 0xff, 0x46, 0x01, - 0x66, 0x92, 0xef, 0xc7, 0x92, 0xfb, 0xda, 0xdc, 0x9a, 0x8b, 0xa5, 0x57, 0x90, 0x35, 0xf2, 0x4e, - 0x0e, 0xbc, 0xa6, 0xb9, 0xcf, 0xc7, 0xd7, 0x96, 0x4e, 0x82, 0x79, 0x7a, 0x8c, 0xe5, 0xfd, 0x88, - 0x64, 0xc7, 0x9f, 0x88, 0x8d, 0x43, 0x54, 0xe5, 0x39, 0x3e, 0x77, 0xee, 0x71, 0xa8, 0xa5, 0x66, - 0x85, 0x06, 0x5b, 0xb6, 0xb7, 0xec, 0xd1, 0xc0, 0xdd, 0x76, 0xf5, 0xdb, 0xf7, 0x7c, 0xe5, 0x7e, - 0x4b, 0x96, 0xa1, 0x86, 0xda, 0xef, 0x8d, 0x41, 0x89, 0x67, 0xd4, 0xba, 0x1e, 0xf8, 0x1d, 0xfe, - 0xc8, 0x62, 0x68, 0x9c, 0x99, 0x64, 0xb7, 0xdd, 0x1c, 0xf5, 0x25, 0xd3, 0x98, 0xa2, 0x74, 0x9e, - 0x37, 0x4a, 0x30, 0xc1, 0x91, 0x74, 0x61, 0x6a, 0x5b, 0x66, 0x00, 0x96, 0x7d, 0x37, 0x62, 0x16, - 0x4b, 0x95, 0x4f, 0x58, 0x34, 0x81, 0xfa, 0x87, 0x9a, 0x8b, 0xed, 0xc0, 0x6c, 0x2a, 0x25, 0x4a, - 0xee, 0x79, 0x83, 0xff, 0xe7, 0x38, 0x94, 0x74, 0xe4, 0x16, 0xf9, 0x44, 0xc2, 0x80, 0x55, 0xaa, - 0x7d, 0xd8, 0x78, 0x01, 0x6c, 0xc7, 0x6f, 0x3e, 0x3c, 0xa8, 0xcc, 0x6a, 0xe4, 0x94, 0x31, 0xea, - 0x22, 0x14, 0x7a, 0x41, 0x3b, 0x7d, 0x42, 0xbd, 0x83, 0x6b, 0xc8, 0xca, 0xcd, 0x68, 0xb3, 0xc2, - 0x63, 0x8d, 0x36, 0x63, 0xbb, 0xe4, 0x96, 0xdf, 0xdc, 0x4f, 0xbf, 0x18, 0x56, 0xf3, 0x9b, 0xfb, - 0xc8, 0x21, 0xe4, 0x35, 0x98, 0x91, 0x21, 0x74, 0x4a, 0x89, 0x29, 0x72, 0x3d, 0x55, 0xbb, 0x1d, - 0x6c, 0x26, 0xa0, 0x98, 0xc2, 0x66, 0xbb, 0xec, 0xbd, 0xd0, 0xf7, 0x78, 0x36, 0xe8, 0x89, 0xe4, - 0x1d, 0xe5, 0xcd, 0xfa, 0xed, 0x5b, 0xdc, 0x90, 0xa6, 0x31, 0x12, 0x51, 0x7a, 0x93, 0x8f, 0x8c, - 0xd2, 0x5b, 0x11, 0xb4, 0x99, 0xb4, 0x7c, 0x47, 0x99, 0xae, 0x5d, 0x51, 0x74, 0x59, 0xd9, 0xc3, - 0x83, 0x23, 0x4c, 0x9c, 0xba, 0x66, 0x56, 0x3c, 0x63, 0xe9, 0xc7, 0x17, 0xcf, 0x68, 0xdf, 0x81, - 0xd9, 0x54, 0xff, 0x29, 0x03, 0x87, 0x95, 0x6d, 0xe0, 0x18, 0xee, 0xcd, 0xb1, 0x7f, 0x6a, 0xc1, - 0xd9, 0xbe, 0x15, 0x69, 0xd8, 0xc0, 0xd2, 0xf4, 0xde, 0x38, 0x76, 0xf2, 0xbd, 0xb1, 0x70, 0xbc, - 0xbd, 0xb1, 0xb6, 0xf5, 0xdd, 0x1f, 0x5c, 0xfa, 0xd0, 0xf7, 0x7e, 0x70, 0xe9, 0x43, 0x7f, 0xf0, - 0x83, 0x4b, 0x1f, 0x7a, 0xef, 0xf0, 0x92, 0xf5, 0xdd, 0xc3, 0x4b, 0xd6, 0xf7, 0x0e, 0x2f, 0x59, - 0x7f, 0x70, 0x78, 0xc9, 0xfa, 0xcf, 0x87, 0x97, 0xac, 0x6f, 0xfe, 0xf1, 0xa5, 0x0f, 0x7d, 0xfa, - 0x53, 0x71, 0x4f, 0x2d, 0xa9, 0x9e, 0xe2, 0x3f, 0x3e, 0xaa, 0xfa, 0x65, 0xa9, 0xbb, 0xdb, 0x5a, - 0x62, 0x3d, 0xb5, 0xa4, 0x4b, 0x54, 0x4f, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x59, - 0x84, 0xec, 0x21, 0xa6, 0x00, 0x00, + 0x5e, 0x9b, 0x8a, 0xb9, 0x5d, 0xaa, 0x95, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x65, + 0xb6, 0xe2, 0x72, 0x92, 0x29, 0xcb, 0xcd, 0x3d, 0x28, 0x06, 0x8c, 0x89, 0x1c, 0x59, 0xa3, 0x1e, + 0x72, 0x63, 0xa9, 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, 0xf6, 0x6f, 0x8f, 0xc1, 0x85, 0x6a, 0xb7, + 0xbb, 0x4e, 0xc3, 0x9d, 0x94, 0x14, 0x3f, 0x6f, 0xc1, 0xcc, 0x9e, 0x1b, 0x44, 0x3d, 0xa7, 0xad, + 0x8c, 0x73, 0x42, 0x9e, 0xfa, 0xa8, 0xf2, 0x70, 0x6e, 0x6f, 0x25, 0x48, 0xd7, 0xc8, 0xe1, 0x41, + 0x65, 0x26, 0x59, 0x86, 0x29, 0xf6, 0xe4, 0x6f, 0x5b, 0x30, 0x27, 0x8b, 0x6e, 0xf9, 0x4d, 0x6a, + 0x1a, 0x7f, 0xef, 0xe4, 0x29, 0x93, 0x26, 0x2e, 0x8c, 0x76, 0xe9, 0x52, 0xec, 0x13, 0xc2, 0xfe, + 0xef, 0x63, 0xf0, 0xe4, 0x00, 0x1a, 0xe4, 0x57, 0x2c, 0x38, 0x2f, 0x2c, 0xc6, 0x06, 0x08, 0xe9, + 0xb6, 0x6c, 0xcd, 0x9f, 0xce, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x9b, 0x67, 0xab, + 0xe1, 0x72, 0x06, 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0x6c, 0xc8, 0x29, 0x49, 0xc7, 0x1e, 0x8b, + 0xa4, 0xf5, 0x0c, 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x57, 0xe1, 0xe9, 0x23, 0xc8, 0x3d, 0x7a, 0x72, + 0xda, 0x6f, 0xeb, 0x51, 0x9f, 0x1c, 0x73, 0x43, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, + 0x1b, 0xd8, 0xf6, 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0xb6, 0x05, 0x53, 0xc7, 0x30, 0xf5, + 0x55, 0x92, 0xa6, 0xbe, 0x52, 0x9f, 0x99, 0x2f, 0xea, 0x37, 0xf3, 0xbd, 0x3e, 0x5a, 0x6f, 0x0c, + 0x63, 0xde, 0xfb, 0xa1, 0x05, 0x67, 0xfb, 0xcc, 0x81, 0x64, 0x07, 0xce, 0x77, 0xfd, 0xa6, 0x52, + 0x9b, 0x6e, 0x38, 0xe1, 0x0e, 0x87, 0xc9, 0xcf, 0x7b, 0x89, 0xf5, 0xe4, 0x46, 0x06, 0xfc, 0xe1, + 0x41, 0x65, 0x5e, 0x13, 0x49, 0x21, 0x60, 0x26, 0x45, 0xd2, 0x85, 0xa9, 0x6d, 0x97, 0xb6, 0x9b, + 0xf1, 0x10, 0x1c, 0x51, 0x41, 0xba, 0x2e, 0xa9, 0x09, 0x4b, 0xb8, 0xfa, 0x87, 0x9a, 0x8b, 0xfd, + 0x23, 0x0b, 0x66, 0xaa, 0xbd, 0x68, 0x87, 0xa9, 0x07, 0x0d, 0x6e, 0x7c, 0x22, 0x1e, 0x14, 0x43, + 0xb7, 0xb5, 0xf7, 0x52, 0x3e, 0x8b, 0x71, 0x9d, 0x91, 0x92, 0x37, 0x02, 0x5a, 0x37, 0xe5, 0x85, + 0x28, 0xd8, 0x90, 0x00, 0x26, 0x7c, 0xa7, 0x17, 0xed, 0x5c, 0x95, 0x9f, 0x3c, 0xe2, 0x41, 0xfc, + 0x36, 0xfb, 0x9c, 0xab, 0x92, 0xa3, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4e, 0xf6, 0x17, 0x61, 0x26, + 0x79, 0xcd, 0x34, 0xc4, 0x98, 0xbd, 0x08, 0x05, 0x27, 0xf0, 0xe4, 0x88, 0x2d, 0x4b, 0x84, 0x42, + 0x15, 0x6f, 0x21, 0x2b, 0x27, 0x2f, 0xc0, 0xd4, 0x76, 0xaf, 0xdd, 0x66, 0x15, 0xe4, 0x9d, 0x8e, + 0x3e, 0x05, 0x5c, 0x97, 0xe5, 0xa8, 0x31, 0xec, 0xff, 0x3d, 0x0e, 0xb3, 0xb5, 0x76, 0x8f, 0xbe, + 0x1e, 0x50, 0xaa, 0x4c, 0x1f, 0x55, 0x98, 0xed, 0x06, 0x74, 0xcf, 0xa5, 0xf7, 0xeb, 0xb4, 0x4d, + 0x1b, 0x91, 0x1f, 0x48, 0x69, 0x9e, 0x94, 0x84, 0x66, 0x37, 0x92, 0x60, 0x4c, 0xe3, 0x93, 0xd7, + 0x60, 0xc6, 0x69, 0x44, 0xee, 0x1e, 0xd5, 0x14, 0x84, 0xb8, 0x4f, 0x48, 0x0a, 0x33, 0xd5, 0x04, + 0x14, 0x53, 0xd8, 0xe4, 0xb3, 0x30, 0x1f, 0x36, 0x9c, 0x36, 0xbd, 0xd3, 0x95, 0xac, 0x96, 0x77, + 0x68, 0x63, 0x77, 0xc3, 0x77, 0xbd, 0x48, 0x9a, 0xd9, 0x2e, 0x4b, 0x4a, 0xf3, 0xf5, 0x01, 0x78, + 0x38, 0x90, 0x02, 0xf9, 0x17, 0x16, 0x5c, 0xec, 0x06, 0x74, 0x23, 0xf0, 0x3b, 0x3e, 0x1b, 0x6a, + 0x7d, 0xd6, 0x1f, 0x69, 0x05, 0x79, 0x6b, 0x44, 0x5d, 0x4a, 0x94, 0xf4, 0x5f, 0x59, 0x7c, 0xf8, + 0xf0, 0xa0, 0x72, 0x71, 0xe3, 0x28, 0x01, 0xf0, 0x68, 0xf9, 0xc8, 0xbf, 0xb4, 0xe0, 0x52, 0xd7, + 0x0f, 0xa3, 0x23, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1e, 0x54, 0x2e, 0x6d, 0x1c, 0x29, + 0x01, 0x3e, 0x42, 0x42, 0xfb, 0xb0, 0x0c, 0x67, 0x8d, 0xb1, 0x27, 0x6d, 0x17, 0xaf, 0xc2, 0x19, + 0x35, 0x18, 0x62, 0xdd, 0xa7, 0x14, 0x9b, 0xb2, 0xaa, 0x26, 0x10, 0x93, 0xb8, 0x6c, 0xdc, 0xe9, + 0xa1, 0x28, 0x6a, 0xa7, 0xc6, 0xdd, 0x46, 0x02, 0x8a, 0x29, 0x6c, 0xb2, 0x0a, 0xe7, 0x64, 0x09, + 0xd2, 0x6e, 0xdb, 0x6d, 0x38, 0xcb, 0x7e, 0x4f, 0x0e, 0xb9, 0x62, 0xed, 0xc9, 0xc3, 0x83, 0xca, + 0xb9, 0x8d, 0x7e, 0x30, 0x66, 0xd5, 0x21, 0x6b, 0x70, 0xde, 0xe9, 0x45, 0xbe, 0xfe, 0xfe, 0x6b, + 0x1e, 0xdb, 0x4e, 0x9b, 0x7c, 0x68, 0x4d, 0x89, 0x7d, 0xb7, 0x9a, 0x01, 0xc7, 0xcc, 0x5a, 0x64, + 0x23, 0x45, 0xad, 0x4e, 0x1b, 0xbe, 0xd7, 0x14, 0xbd, 0x5c, 0x8c, 0x4f, 0x60, 0xd5, 0x0c, 0x1c, + 0xcc, 0xac, 0x49, 0xda, 0x30, 0xd3, 0x71, 0x1e, 0xdc, 0xf1, 0x9c, 0x3d, 0xc7, 0x6d, 0x33, 0x26, + 0xd2, 0x3c, 0x36, 0xd8, 0xa8, 0xd2, 0x8b, 0xdc, 0xf6, 0xa2, 0x70, 0x5b, 0x58, 0x5c, 0xf5, 0xa2, + 0xdb, 0x41, 0x3d, 0x62, 0x9a, 0xba, 0xd0, 0x20, 0xd7, 0x13, 0xb4, 0x30, 0x45, 0x9b, 0xdc, 0x86, + 0x0b, 0x7c, 0x3a, 0xae, 0xf8, 0xf7, 0xbd, 0x15, 0xda, 0x76, 0xf6, 0xd5, 0x07, 0x4c, 0xf2, 0x0f, + 0x78, 0xea, 0xf0, 0xa0, 0x72, 0xa1, 0x9e, 0x85, 0x80, 0xd9, 0xf5, 0x88, 0x03, 0x4f, 0x27, 0x01, + 0x48, 0xf7, 0xdc, 0xd0, 0xf5, 0x3d, 0x61, 0x85, 0x9a, 0x8a, 0xad, 0x50, 0xf5, 0xc1, 0x68, 0x78, + 0x14, 0x0d, 0xf2, 0x77, 0x2d, 0x38, 0x9f, 0x35, 0x0d, 0xe7, 0x4b, 0x79, 0x5c, 0x9e, 0xa6, 0xa6, + 0x96, 0x18, 0x11, 0x99, 0x8b, 0x42, 0xa6, 0x10, 0xe4, 0x3d, 0x0b, 0xa6, 0x1d, 0xe3, 0x04, 0x3d, + 0x0f, 0x79, 0xec, 0x5a, 0xe6, 0x99, 0xbc, 0x36, 0x77, 0x78, 0x50, 0x49, 0x9c, 0xd2, 0x31, 0xc1, + 0x91, 0xfc, 0x7d, 0x0b, 0x2e, 0x64, 0xce, 0xf1, 0xf9, 0xf2, 0x69, 0xb4, 0x10, 0x1f, 0x24, 0xd9, + 0x6b, 0x4e, 0xb6, 0x18, 0xe4, 0x5b, 0x96, 0xde, 0xca, 0xd4, 0x7d, 0xda, 0xfc, 0x34, 0x17, 0xed, + 0xcd, 0x11, 0x8d, 0x06, 0xb1, 0xd6, 0xa4, 0x08, 0xd7, 0xce, 0x19, 0x3b, 0xa3, 0x2a, 0xc4, 0x34, + 0x7b, 0xf2, 0x4d, 0x4b, 0x6d, 0x8d, 0x5a, 0xa2, 0x33, 0xa7, 0x25, 0x11, 0x89, 0x77, 0x5a, 0x2d, + 0x50, 0x8a, 0x39, 0xf9, 0x19, 0x58, 0x70, 0xb6, 0xfc, 0x20, 0xca, 0x9c, 0x7c, 0xf3, 0x33, 0x7c, + 0x1a, 0x5d, 0x3a, 0x3c, 0xa8, 0x2c, 0x54, 0x07, 0x62, 0xe1, 0x11, 0x14, 0xec, 0x5f, 0x2b, 0xc2, + 0xb4, 0x38, 0x09, 0xc9, 0xad, 0xeb, 0x37, 0x2d, 0x78, 0xa6, 0xd1, 0x0b, 0x02, 0xea, 0x45, 0xf5, + 0x88, 0x76, 0xfb, 0x37, 0x2e, 0xeb, 0x54, 0x37, 0xae, 0xcb, 0x87, 0x07, 0x95, 0x67, 0x96, 0x8f, + 0xe0, 0x8f, 0x47, 0x4a, 0x47, 0xfe, 0x9d, 0x05, 0xb6, 0x44, 0xa8, 0x39, 0x8d, 0xdd, 0x56, 0xe0, + 0xf7, 0xbc, 0x66, 0xff, 0x47, 0x8c, 0x9d, 0xea, 0x47, 0x3c, 0x77, 0x78, 0x50, 0xb1, 0x97, 0x1f, + 0x29, 0x05, 0x0e, 0x21, 0x29, 0x79, 0x1d, 0xce, 0x4a, 0xac, 0x6b, 0x0f, 0xba, 0x34, 0x70, 0xd9, + 0x99, 0x43, 0x2a, 0x8e, 0xb1, 0x2b, 0x56, 0x1a, 0x01, 0xfb, 0xeb, 0x90, 0x10, 0x26, 0xef, 0x53, + 0xb7, 0xb5, 0x13, 0x29, 0xf5, 0x69, 0x44, 0xff, 0x2b, 0x69, 0x15, 0xb9, 0x2b, 0x68, 0xd6, 0xca, + 0x87, 0x07, 0x95, 0x49, 0xf9, 0x07, 0x15, 0x27, 0x72, 0x0b, 0x66, 0xc4, 0x39, 0x75, 0xc3, 0xf5, + 0x5a, 0x1b, 0xbe, 0x27, 0x9c, 0x88, 0x4a, 0xb5, 0xe7, 0xd4, 0x86, 0x5f, 0x4f, 0x40, 0x1f, 0x1e, + 0x54, 0xa6, 0xd5, 0xef, 0xcd, 0xfd, 0x2e, 0xc5, 0x54, 0x6d, 0xfb, 0x77, 0x27, 0x00, 0xd4, 0x70, + 0xa5, 0x5d, 0xf2, 0x11, 0x28, 0x85, 0x34, 0x12, 0x5c, 0xe5, 0xc5, 0x89, 0xb8, 0xee, 0x52, 0x85, + 0x18, 0xc3, 0xc9, 0x2e, 0x14, 0xbb, 0x4e, 0x2f, 0xa4, 0xf9, 0x9c, 0x1f, 0x64, 0xe7, 0x6f, 0x30, + 0x8a, 0xe2, 0x60, 0xca, 0x7f, 0xa2, 0xe0, 0x41, 0xbe, 0x62, 0x01, 0xd0, 0x64, 0x87, 0x8d, 0x6c, + 0x20, 0x92, 0x2c, 0xe3, 0x3e, 0x65, 0x6d, 0x50, 0x9b, 0x39, 0x3c, 0xa8, 0x80, 0xd1, 0xf5, 0x06, + 0x5b, 0x72, 0x1f, 0xa6, 0x1c, 0xb5, 0xe6, 0x8f, 0x9f, 0xc6, 0x9a, 0xcf, 0xcf, 0x8b, 0x7a, 0xd0, + 0x6a, 0x66, 0xe4, 0x6b, 0x16, 0xcc, 0x84, 0x34, 0x92, 0x5d, 0xc5, 0x56, 0x1e, 0xa9, 0xf0, 0x8e, + 0x38, 0xe8, 0xea, 0x09, 0x9a, 0x62, 0x05, 0x4d, 0x96, 0x61, 0x8a, 0xaf, 0x12, 0xe5, 0x06, 0x75, + 0x9a, 0x34, 0xe0, 0xe6, 0x08, 0xa9, 0x49, 0x8d, 0x2e, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, + 0x8a, 0xaf, 0x12, 0x65, 0xdd, 0x0d, 0x02, 0x5f, 0x8a, 0x32, 0x95, 0x93, 0x28, 0x06, 0x4d, 0x2d, + 0x8a, 0x51, 0x86, 0x29, 0xbe, 0xf6, 0x77, 0xce, 0xc0, 0x8c, 0x9a, 0x48, 0xb1, 0x66, 0x2f, 0xac, + 0x5f, 0x03, 0x34, 0xfb, 0x65, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0x4c, 0xd5, 0xa4, 0x62, 0xaf, + 0x2b, 0xd7, 0x4d, 0x20, 0x26, 0x71, 0x49, 0x07, 0x8a, 0x61, 0x44, 0xbb, 0xea, 0x8a, 0x7d, 0xc4, + 0x1b, 0xe0, 0x78, 0x7d, 0x30, 0x2c, 0x09, 0x8c, 0x3c, 0x0a, 0x2e, 0xdc, 0x80, 0x1b, 0x25, 0x6c, + 0xba, 0x72, 0x72, 0xe4, 0x33, 0x3f, 0x93, 0xe6, 0x62, 0xd1, 0x1b, 0xc9, 0x32, 0x4c, 0xb1, 0xcf, + 0x50, 0xf6, 0x8b, 0xa7, 0xa8, 0xec, 0x7f, 0x1a, 0xa6, 0x3a, 0xce, 0x83, 0x7a, 0x2f, 0x68, 0x9d, + 0xfc, 0x50, 0x21, 0x5d, 0x26, 0x05, 0x15, 0xd4, 0xf4, 0xc8, 0x97, 0x2c, 0x63, 0xc9, 0x11, 0xf7, + 0xe9, 0x77, 0xf3, 0x5d, 0x72, 0xf4, 0x5e, 0x39, 0x70, 0xf1, 0xe9, 0x53, 0xbd, 0xa7, 0x1e, 0xbb, + 0xea, 0xcd, 0xd4, 0x48, 0x31, 0x41, 0xb4, 0x1a, 0x59, 0x3a, 0x55, 0x35, 0x72, 0x39, 0xc1, 0x0c, + 0x53, 0xcc, 0xb9, 0x3c, 0x62, 0xce, 0x69, 0x79, 0xe0, 0x54, 0xe5, 0xa9, 0x27, 0x98, 0x61, 0x8a, + 0xf9, 0xe0, 0xf3, 0x66, 0xf9, 0x74, 0xce, 0x9b, 0xd3, 0x39, 0x9c, 0x37, 0x8f, 0x56, 0xc5, 0xcf, + 0x8c, 0xaa, 0x8a, 0x93, 0x9b, 0x40, 0x9a, 0xfb, 0x9e, 0xd3, 0x71, 0x1b, 0x72, 0xb1, 0xe4, 0xdb, + 0xe6, 0x0c, 0xb7, 0x47, 0x2c, 0xc8, 0x85, 0x8c, 0xac, 0xf4, 0x61, 0x60, 0x46, 0x2d, 0x12, 0xc1, + 0x54, 0x57, 0x69, 0x5c, 0xb3, 0x79, 0x8c, 0x7e, 0xa5, 0x81, 0x09, 0x37, 0x09, 0x36, 0xf1, 0x54, + 0x09, 0x6a, 0x4e, 0x64, 0x0d, 0xce, 0x77, 0x5c, 0x6f, 0xc3, 0x6f, 0x86, 0x1b, 0x34, 0x90, 0xd6, + 0x96, 0x3a, 0x8d, 0xe6, 0xe7, 0x78, 0xdb, 0xf0, 0x13, 0xf4, 0x7a, 0x06, 0x1c, 0x33, 0x6b, 0xd9, + 0xff, 0xcb, 0x82, 0xb9, 0xe5, 0xb6, 0xdf, 0x6b, 0xde, 0x75, 0xa2, 0xc6, 0x8e, 0xf0, 0x10, 0x20, + 0xaf, 0xc1, 0x94, 0xeb, 0x45, 0x34, 0xd8, 0x73, 0xda, 0x72, 0x7f, 0xb2, 0x95, 0xf9, 0x74, 0x55, + 0x96, 0x3f, 0x3c, 0xa8, 0xcc, 0xac, 0xf4, 0x02, 0x6e, 0xa5, 0x16, 0xab, 0x15, 0xea, 0x3a, 0xe4, + 0x3b, 0x16, 0x9c, 0x15, 0x3e, 0x06, 0x2b, 0x4e, 0xe4, 0xbc, 0xd9, 0xa3, 0x81, 0x4b, 0x95, 0x97, + 0xc1, 0x88, 0x0b, 0x55, 0x5a, 0x56, 0xc5, 0x60, 0x3f, 0x56, 0xd4, 0xd7, 0xd3, 0x9c, 0xb1, 0x5f, + 0x18, 0xfb, 0x17, 0x0a, 0xf0, 0xd4, 0x40, 0x5a, 0x64, 0x01, 0xc6, 0xdc, 0xa6, 0xfc, 0x74, 0x90, + 0x74, 0xc7, 0x56, 0x9b, 0x38, 0xe6, 0x36, 0xc9, 0x22, 0xd7, 0x39, 0x03, 0x1a, 0x86, 0xea, 0xc2, + 0xb9, 0xa4, 0xd5, 0x43, 0x59, 0x8a, 0x06, 0x06, 0xa9, 0x40, 0x91, 0xbb, 0xcb, 0xca, 0xf3, 0x04, + 0xd7, 0x62, 0xb9, 0x67, 0x2a, 0x8a, 0x72, 0xf2, 0x65, 0x0b, 0x40, 0x08, 0xc8, 0x4e, 0x23, 0x72, + 0x97, 0xc4, 0x7c, 0x9b, 0x89, 0x51, 0x16, 0x52, 0xc6, 0xff, 0xd1, 0xe0, 0x4a, 0x36, 0x61, 0x82, + 0x29, 0xb4, 0x7e, 0xf3, 0xc4, 0x9b, 0x22, 0xbf, 0x89, 0xda, 0xe0, 0x34, 0x50, 0xd2, 0x62, 0x6d, + 0x15, 0xd0, 0xa8, 0x17, 0x78, 0xac, 0x69, 0xf9, 0x36, 0x38, 0x25, 0xa4, 0x40, 0x5d, 0x8a, 0x06, + 0x86, 0xfd, 0xcf, 0xc6, 0xe0, 0x7c, 0x96, 0xe8, 0x6c, 0xb7, 0x99, 0x10, 0xd2, 0xca, 0xa3, 0xf1, + 0x4f, 0xe5, 0xdf, 0x3e, 0xd2, 0x5d, 0x46, 0x5f, 0x53, 0x48, 0x7f, 0x41, 0xc9, 0x97, 0xfc, 0x94, + 0x6e, 0xa1, 0xb1, 0x13, 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0xcb, 0x30, 0x1e, 0xb2, 0x9e, 0x2f, + 0x24, 0xaf, 0x3b, 0x78, 0x1f, 0x71, 0x08, 0xc3, 0xe8, 0x79, 0x6e, 0x24, 0x63, 0x4c, 0x34, 0xc6, + 0x1d, 0xcf, 0x8d, 0x90, 0x43, 0xec, 0x6f, 0x8f, 0xc1, 0xc2, 0xe0, 0x8f, 0x22, 0xdf, 0xb6, 0x00, + 0x9a, 0xec, 0xb8, 0x12, 0x72, 0x47, 0x6d, 0xe1, 0x5e, 0xe4, 0x9c, 0x56, 0x1b, 0xae, 0x28, 0x4e, + 0xb1, 0xaf, 0x99, 0x2e, 0x0a, 0xd1, 0x10, 0x84, 0x5c, 0x55, 0x43, 0x9f, 0x5f, 0xd5, 0x88, 0xc9, + 0xa4, 0xeb, 0xac, 0x6b, 0x08, 0x1a, 0x58, 0xec, 0x3c, 0xea, 0x39, 0x1d, 0x1a, 0x76, 0x1d, 0x1d, + 0xb1, 0xc3, 0xcf, 0xa3, 0xb7, 0x54, 0x21, 0xc6, 0x70, 0xbb, 0x0d, 0xcf, 0x0e, 0x21, 0x67, 0x4e, + 0x01, 0x11, 0xf6, 0xff, 0xb0, 0xe0, 0xc9, 0xe5, 0x76, 0x2f, 0x8c, 0x68, 0xf0, 0xff, 0x8d, 0xeb, + 0xde, 0x9f, 0x5a, 0xf0, 0xf4, 0x80, 0x6f, 0x7e, 0x0c, 0x1e, 0x7c, 0xef, 0x24, 0x3d, 0xf8, 0xee, + 0x8c, 0x3a, 0xa4, 0x33, 0xbf, 0x63, 0x80, 0x23, 0xdf, 0xbf, 0x29, 0xc0, 0x19, 0xb6, 0x6c, 0x35, + 0xfd, 0x56, 0x4e, 0x1b, 0xe7, 0xb3, 0x50, 0xfc, 0x3c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, + 0x28, 0x60, 0xe4, 0x2b, 0x16, 0x4c, 0x7e, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xe2, 0x62, 0x98, + 0xf8, 0x86, 0x45, 0xb9, 0x43, 0x8a, 0x38, 0x0b, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0xc5, 0x99, 0x3c, + 0x0f, 0x93, 0xdb, 0x7e, 0xd0, 0xe9, 0xb5, 0x9d, 0x74, 0x70, 0xdf, 0x75, 0x51, 0x8c, 0x0a, 0xce, + 0x26, 0xb9, 0xd3, 0x75, 0xdf, 0xa2, 0x41, 0x28, 0xdc, 0xee, 0x13, 0x93, 0xbc, 0xaa, 0x21, 0x68, + 0x60, 0xf1, 0x3a, 0xad, 0x56, 0x40, 0x5b, 0x4e, 0xe4, 0x07, 0x7c, 0xe7, 0x30, 0xeb, 0x68, 0x08, + 0x1a, 0x58, 0x0b, 0x9f, 0x84, 0x69, 0x53, 0xf8, 0x63, 0xc5, 0x6c, 0x7c, 0x0a, 0xa4, 0x13, 0x61, + 0x6a, 0x49, 0xb2, 0x86, 0x59, 0x92, 0xec, 0xff, 0x30, 0x06, 0x86, 0x75, 0xe8, 0x31, 0x4c, 0x75, + 0x2f, 0x31, 0xd5, 0x47, 0xb4, 0x6c, 0x18, 0xb6, 0xae, 0x41, 0x11, 0x6c, 0x7b, 0xa9, 0x08, 0xb6, + 0x5b, 0xb9, 0x71, 0x3c, 0x3a, 0x80, 0xed, 0xfb, 0x16, 0x3c, 0x1d, 0x23, 0xf7, 0x1b, 0x6e, 0x1f, + 0xbd, 0x6e, 0xbf, 0x0c, 0x65, 0x27, 0xae, 0x26, 0x27, 0x96, 0x11, 0x3e, 0xa4, 0x41, 0x68, 0xe2, + 0xc5, 0xa1, 0x0f, 0x85, 0x13, 0x86, 0x3e, 0x8c, 0x1f, 0x1d, 0xfa, 0x60, 0xff, 0x68, 0x0c, 0x2e, + 0xf6, 0x7f, 0x99, 0x5a, 0x71, 0x86, 0xf3, 0x82, 0x78, 0x05, 0xa6, 0x23, 0x59, 0xc1, 0xd8, 0x3f, + 0x75, 0x28, 0xf3, 0xa6, 0x01, 0xc3, 0x04, 0x26, 0xab, 0xd9, 0x10, 0x6b, 0x5d, 0xbd, 0xe1, 0x77, + 0x55, 0xd8, 0x8e, 0xae, 0xb9, 0x6c, 0xc0, 0x30, 0x81, 0xa9, 0x7d, 0x86, 0xc7, 0x4f, 0xdd, 0x67, + 0xb8, 0x0e, 0x17, 0x94, 0x97, 0xe4, 0x75, 0x3f, 0x90, 0xfe, 0xff, 0x6a, 0x05, 0x99, 0xaa, 0x5d, + 0x94, 0x55, 0x2e, 0x60, 0x16, 0x12, 0x66, 0xd7, 0xb5, 0xbf, 0x5f, 0x80, 0x73, 0x71, 0xb3, 0x2f, + 0xfb, 0x5e, 0xd3, 0xe5, 0x8e, 0x36, 0xaf, 0xc2, 0x78, 0xb4, 0xdf, 0x55, 0x8d, 0xfd, 0x17, 0x95, + 0x38, 0x9b, 0xfb, 0x5d, 0xd6, 0xdb, 0x4f, 0x66, 0x54, 0xe1, 0xa6, 0x73, 0x5e, 0x89, 0xac, 0xe9, + 0xd9, 0x21, 0x7a, 0xe0, 0xa5, 0xe4, 0x68, 0x7e, 0x78, 0x50, 0xc9, 0x88, 0xe4, 0x5f, 0xd4, 0x94, + 0x92, 0x63, 0x9e, 0xdc, 0x83, 0x99, 0xb6, 0x13, 0x46, 0x77, 0xba, 0x4d, 0x27, 0xa2, 0x9b, 0xae, + 0x74, 0x61, 0x39, 0x5e, 0xc8, 0x84, 0xbe, 0xeb, 0x5f, 0x4b, 0x50, 0xc2, 0x14, 0x65, 0xb2, 0x07, + 0x84, 0x95, 0x6c, 0x06, 0x8e, 0x17, 0x8a, 0xaf, 0x62, 0xfc, 0x8e, 0x1f, 0xff, 0xa2, 0x8f, 0xce, + 0x6b, 0x7d, 0xd4, 0x30, 0x83, 0x03, 0x79, 0x0e, 0x26, 0x02, 0xea, 0x84, 0x7a, 0x3b, 0xd0, 0xf3, + 0x1f, 0x79, 0x29, 0x4a, 0xa8, 0x39, 0xa1, 0x26, 0x1e, 0x31, 0xa1, 0xfe, 0xd0, 0x82, 0x99, 0xb8, + 0x9b, 0x1e, 0x83, 0xea, 0xd1, 0x49, 0xaa, 0x1e, 0x37, 0xf2, 0x5a, 0x12, 0x07, 0x68, 0x1b, 0x7f, + 0x32, 0x69, 0x7e, 0x1f, 0x0f, 0x18, 0xf8, 0x02, 0x94, 0xd4, 0xac, 0x56, 0x3a, 0xfd, 0x88, 0x16, + 0x88, 0x84, 0xb6, 0x67, 0x44, 0xf1, 0x49, 0x26, 0x18, 0xf3, 0x63, 0xba, 0x4e, 0x53, 0xea, 0x31, + 0x72, 0xd8, 0x6b, 0x5d, 0x47, 0xe9, 0x37, 0x59, 0xba, 0x8e, 0xaa, 0x43, 0xee, 0xc0, 0x93, 0xdd, + 0xc0, 0xe7, 0xb1, 0xe4, 0x2b, 0xd4, 0x69, 0xb6, 0x5d, 0x8f, 0x2a, 0x33, 0x8f, 0x70, 0x35, 0x79, + 0xfa, 0xf0, 0xa0, 0xf2, 0xe4, 0x46, 0x36, 0x0a, 0x0e, 0xaa, 0x9b, 0x8c, 0x46, 0x1c, 0x1f, 0x22, + 0x1a, 0xf1, 0x6f, 0x68, 0x63, 0x2a, 0x0d, 0x65, 0x4c, 0xe0, 0x67, 0xf2, 0xea, 0xca, 0x8c, 0x65, + 0x3d, 0x1e, 0x52, 0x55, 0xc9, 0x14, 0x35, 0xfb, 0xc1, 0x16, 0xbb, 0x89, 0x13, 0x5a, 0xec, 0xe2, + 0xb8, 0x8b, 0xc9, 0x1f, 0x67, 0xdc, 0xc5, 0xd4, 0x07, 0x2a, 0xd4, 0xf2, 0x3b, 0x16, 0x9c, 0x73, + 0xfa, 0xa3, 0x8c, 0xf3, 0x31, 0x1e, 0x67, 0x84, 0x2f, 0xd7, 0x9e, 0x96, 0x42, 0x66, 0x05, 0x73, + 0x63, 0x96, 0x28, 0xf6, 0xfb, 0x45, 0x98, 0x4b, 0x2b, 0x49, 0xa7, 0x1f, 0x8e, 0xf9, 0xb7, 0x2c, + 0x98, 0x53, 0x13, 0x5c, 0xf0, 0xd4, 0x47, 0x8c, 0xb5, 0x9c, 0xd6, 0x15, 0xa1, 0xee, 0xe9, 0x2c, + 0x19, 0x9b, 0x29, 0x6e, 0xd8, 0xc7, 0x9f, 0xbc, 0x0d, 0x65, 0x7d, 0xab, 0x72, 0xa2, 0xd8, 0x4c, + 0x1e, 0x3e, 0x58, 0x8d, 0x49, 0xa0, 0x49, 0x8f, 0xbc, 0x6f, 0x01, 0x34, 0xd4, 0x4e, 0xac, 0x16, + 0x80, 0x37, 0xf3, 0x5a, 0x00, 0xf4, 0x1e, 0x1f, 0xeb, 0xf3, 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, + 0x05, 0x7e, 0x9f, 0xa2, 0x47, 0x82, 0xc8, 0xbe, 0x31, 0xb2, 0xdb, 0xfb, 0x11, 0xba, 0x73, 0xac, + 0xed, 0x19, 0xa0, 0x10, 0x13, 0x42, 0xd8, 0xaf, 0x82, 0x76, 0x54, 0x66, 0x2b, 0x2b, 0x77, 0x55, + 0xde, 0x70, 0xa2, 0x1d, 0x39, 0x04, 0xf5, 0xca, 0x7a, 0x5d, 0x01, 0x30, 0xc6, 0xb1, 0x3f, 0x07, + 0x33, 0xaf, 0x07, 0x4e, 0x77, 0xc7, 0xe5, 0xf7, 0x16, 0xec, 0x7c, 0xfc, 0x3c, 0x4c, 0x3a, 0xcd, + 0x66, 0x56, 0x42, 0x97, 0xaa, 0x28, 0x46, 0x05, 0x1f, 0xea, 0x28, 0x6c, 0xff, 0xae, 0x05, 0x24, + 0xbe, 0xfb, 0x75, 0xbd, 0xd6, 0xba, 0x13, 0x35, 0x76, 0xd8, 0x11, 0x6e, 0x87, 0x97, 0x66, 0x1d, + 0xe1, 0x6e, 0x68, 0x08, 0x1a, 0x58, 0xe4, 0x5d, 0x28, 0x8b, 0x7f, 0x6f, 0xe9, 0x03, 0xe2, 0xe8, + 0xfe, 0xd6, 0x7c, 0xcf, 0xe3, 0x32, 0x89, 0x51, 0x78, 0x23, 0xe6, 0x80, 0x26, 0x3b, 0xd6, 0x54, + 0xab, 0xde, 0x76, 0xbb, 0xf7, 0xa0, 0xb9, 0x15, 0x37, 0x55, 0x37, 0xf0, 0xb7, 0xdd, 0x36, 0x4d, + 0x37, 0xd5, 0x86, 0x28, 0x46, 0x05, 0x1f, 0xae, 0xa9, 0xfe, 0x95, 0x05, 0xe7, 0x57, 0xc3, 0xc8, + 0xf5, 0x57, 0x68, 0x18, 0xb1, 0x9d, 0x8f, 0xad, 0x8f, 0xbd, 0xf6, 0x30, 0x31, 0x07, 0x2b, 0x30, + 0x27, 0xef, 0xa1, 0x7b, 0x5b, 0x21, 0x8d, 0x8c, 0xa3, 0x86, 0x9e, 0xc7, 0xcb, 0x29, 0x38, 0xf6, + 0xd5, 0x60, 0x54, 0xe4, 0x85, 0x74, 0x4c, 0xa5, 0x90, 0xa4, 0x52, 0x4f, 0xc1, 0xb1, 0xaf, 0x86, + 0xfd, 0xbd, 0x02, 0x9c, 0xe3, 0x9f, 0x91, 0x8a, 0x17, 0xfa, 0xe6, 0xa0, 0x78, 0xa1, 0x11, 0xa7, + 0x32, 0xe7, 0x75, 0x82, 0x68, 0xa1, 0xbf, 0x69, 0xc1, 0x6c, 0x33, 0xd9, 0xd2, 0xf9, 0xd8, 0xe5, + 0xb2, 0xfa, 0x50, 0xb8, 0xdd, 0xa5, 0x0a, 0x31, 0xcd, 0x9f, 0xfc, 0xa2, 0x05, 0xb3, 0x49, 0x31, + 0xd5, 0xea, 0x7e, 0x0a, 0x8d, 0xa4, 0xfd, 0xe4, 0x93, 0xe5, 0x21, 0xa6, 0x45, 0xb0, 0x7f, 0x6f, + 0x4c, 0x76, 0xe9, 0x69, 0x04, 0xc3, 0x90, 0xfb, 0x50, 0x8a, 0xda, 0xa1, 0x28, 0x94, 0x5f, 0x3b, + 0xe2, 0xa1, 0x75, 0x73, 0xad, 0x2e, 0x5c, 0x40, 0x62, 0xbd, 0x52, 0x96, 0x30, 0xfd, 0x58, 0xf1, + 0xe2, 0x8c, 0x1b, 0x5d, 0xc9, 0x38, 0x97, 0xd3, 0xf2, 0xe6, 0xf2, 0x46, 0x9a, 0xb1, 0x2c, 0x61, + 0x8c, 0x15, 0x2f, 0xfb, 0x57, 0x2d, 0x28, 0xdd, 0xf4, 0xd5, 0x3a, 0xf2, 0x33, 0x39, 0xd8, 0xa2, + 0xb4, 0xca, 0xaa, 0x95, 0x96, 0xf8, 0x14, 0xf4, 0x5a, 0xc2, 0x12, 0xf5, 0x8c, 0x41, 0x7b, 0x91, + 0xe7, 0xb5, 0x63, 0xa4, 0x6e, 0xfa, 0x5b, 0x03, 0xcd, 0xc7, 0xbf, 0x54, 0x84, 0x33, 0x6f, 0x38, + 0xfb, 0xd4, 0x8b, 0x9c, 0xe3, 0x6f, 0x12, 0x2f, 0x43, 0xd9, 0xe9, 0xf2, 0xbb, 0x4c, 0xe3, 0x18, + 0x12, 0x1b, 0x77, 0x62, 0x10, 0x9a, 0x78, 0xf1, 0x82, 0x26, 0x22, 0x53, 0xb2, 0x96, 0xa2, 0xe5, + 0x14, 0x1c, 0xfb, 0x6a, 0x90, 0x9b, 0x40, 0x64, 0x20, 0x75, 0xb5, 0xd1, 0xf0, 0x7b, 0x9e, 0x58, + 0xd2, 0x84, 0xdd, 0x47, 0x9f, 0x87, 0xd7, 0xfb, 0x30, 0x30, 0xa3, 0x16, 0xf9, 0x2c, 0xcc, 0x37, + 0x38, 0x65, 0x79, 0x3a, 0x32, 0x29, 0x8a, 0x13, 0xb2, 0x8e, 0xf5, 0x58, 0x1e, 0x80, 0x87, 0x03, + 0x29, 0x30, 0x49, 0xc3, 0xc8, 0x0f, 0x9c, 0x16, 0x35, 0xe9, 0x4e, 0x24, 0x25, 0xad, 0xf7, 0x61, + 0x60, 0x46, 0x2d, 0xf2, 0x45, 0x28, 0x45, 0x3b, 0x01, 0x0d, 0x77, 0xfc, 0x76, 0x53, 0xfa, 0x9e, + 0x8c, 0x68, 0x0c, 0x94, 0xbd, 0xbf, 0xa9, 0xa8, 0x1a, 0xc3, 0x5b, 0x15, 0x61, 0xcc, 0x93, 0x04, + 0x30, 0x11, 0x36, 0xfc, 0x2e, 0x0d, 0xe5, 0xa9, 0xe2, 0x66, 0x2e, 0xdc, 0xb9, 0x71, 0xcb, 0x30, + 0x43, 0x72, 0x0e, 0x28, 0x39, 0xd9, 0xbf, 0x33, 0x06, 0xd3, 0x26, 0xe2, 0x10, 0x6b, 0xd3, 0x57, + 0x2c, 0x98, 0x6e, 0xf8, 0x5e, 0x14, 0xf8, 0x6d, 0x61, 0x62, 0xcb, 0x47, 0xa3, 0x60, 0xa4, 0x56, + 0x68, 0xe4, 0xb8, 0x6d, 0xc3, 0x5a, 0x67, 0xb0, 0xc1, 0x04, 0x53, 0xf2, 0x0d, 0x0b, 0x66, 0x63, + 0x57, 0xc5, 0xd8, 0xd6, 0x97, 0xab, 0x20, 0x7a, 0xa9, 0xbf, 0x96, 0xe4, 0x84, 0x69, 0xd6, 0xf6, + 0x16, 0xcc, 0xa5, 0x7b, 0x9b, 0x35, 0x65, 0xd7, 0x91, 0x73, 0xbd, 0x10, 0x37, 0xe5, 0x86, 0x13, + 0x86, 0xc8, 0x21, 0xe4, 0x05, 0x98, 0xea, 0x38, 0x41, 0xcb, 0xf5, 0x9c, 0x36, 0x6f, 0xc5, 0x82, + 0xb1, 0x20, 0xc9, 0x72, 0xd4, 0x18, 0xf6, 0xc7, 0x60, 0x7a, 0xdd, 0xf1, 0x5a, 0xb4, 0x29, 0xd7, + 0xe1, 0x47, 0x87, 0x63, 0xfe, 0xf1, 0x38, 0x94, 0x8d, 0xe3, 0xe3, 0xe9, 0x9f, 0xb3, 0x12, 0xc9, + 0x66, 0x0a, 0x39, 0x26, 0x9b, 0xf9, 0x34, 0xc0, 0xb6, 0xeb, 0xb9, 0xe1, 0xce, 0x09, 0xd3, 0xd8, + 0xf0, 0xbb, 0xf9, 0xeb, 0x9a, 0x02, 0x1a, 0xd4, 0xe2, 0x0b, 0xd0, 0xe2, 0x11, 0x19, 0xe1, 0xde, + 0xb7, 0x8c, 0xed, 0x66, 0x22, 0x0f, 0x87, 0x0f, 0xa3, 0x63, 0x16, 0xd5, 0xf6, 0x23, 0xee, 0xa6, + 0x8e, 0xda, 0x95, 0x36, 0x61, 0x2a, 0xa0, 0x61, 0xaf, 0x43, 0x4f, 0x94, 0x70, 0x86, 0xbb, 0xde, + 0xa0, 0xac, 0x8f, 0x9a, 0xd2, 0xc2, 0xab, 0x70, 0x26, 0x21, 0xc2, 0xb1, 0x6e, 0x98, 0x7c, 0xc8, + 0xb4, 0x51, 0x9c, 0xe4, 0xbe, 0x89, 0xf5, 0x45, 0xdb, 0x48, 0x34, 0xa3, 0xfb, 0x42, 0x38, 0x58, + 0x09, 0x98, 0xfd, 0xa3, 0x09, 0x90, 0x3e, 0x0c, 0x43, 0x2c, 0x57, 0xe6, 0xcd, 0xe5, 0xd8, 0x09, + 0x6e, 0x2e, 0x6f, 0xc2, 0xb4, 0xeb, 0xb9, 0x91, 0xeb, 0xb4, 0xb9, 0xfd, 0x49, 0x6e, 0xa7, 0xca, + 0x03, 0x7d, 0x7a, 0xd5, 0x80, 0x65, 0xd0, 0x49, 0xd4, 0x25, 0x6f, 0x42, 0x91, 0xef, 0x37, 0x72, + 0x00, 0x1f, 0xdf, 0xd1, 0x82, 0xfb, 0xd8, 0x88, 0xb0, 0x34, 0x41, 0x89, 0x1f, 0x3e, 0x44, 0xa6, + 0x1d, 0x7d, 0xfc, 0x96, 0xe3, 0x38, 0x3e, 0x7c, 0xa4, 0xe0, 0xd8, 0x57, 0x83, 0x51, 0xd9, 0x76, + 0xdc, 0x76, 0x2f, 0xa0, 0x31, 0x95, 0x89, 0x24, 0x95, 0xeb, 0x29, 0x38, 0xf6, 0xd5, 0x20, 0xdb, + 0x30, 0x2d, 0xcb, 0x84, 0xdb, 0xdc, 0xe4, 0x09, 0xbf, 0x92, 0xbb, 0x47, 0x5e, 0x37, 0x28, 0x61, + 0x82, 0x2e, 0xe9, 0xc1, 0x59, 0xd7, 0x6b, 0xf8, 0x5e, 0xa3, 0xdd, 0x0b, 0xdd, 0x3d, 0x1a, 0xc7, + 0x84, 0x9d, 0x84, 0xd9, 0x85, 0xc3, 0x83, 0xca, 0xd9, 0xd5, 0x34, 0x39, 0xec, 0xe7, 0x40, 0xbe, + 0x64, 0xc1, 0x85, 0x86, 0xef, 0x85, 0x3c, 0x75, 0xc5, 0x1e, 0xbd, 0x16, 0x04, 0x7e, 0x20, 0x78, + 0x97, 0x4e, 0xc8, 0x9b, 0x9b, 0x3d, 0x97, 0xb3, 0x48, 0x62, 0x36, 0x27, 0xf2, 0x0e, 0x4c, 0x75, + 0x03, 0x7f, 0xcf, 0x6d, 0xd2, 0x40, 0xba, 0x60, 0xae, 0xe5, 0x91, 0x4a, 0x67, 0x43, 0xd2, 0x8c, + 0x97, 0x1e, 0x55, 0x82, 0x9a, 0x9f, 0xfd, 0x7f, 0xca, 0x30, 0x93, 0x44, 0x27, 0x3f, 0x07, 0xd0, + 0x0d, 0xfc, 0x0e, 0x8d, 0x76, 0xa8, 0x8e, 0xed, 0xb9, 0x35, 0x6a, 0xc6, 0x16, 0x45, 0x4f, 0xb9, + 0x2d, 0xb1, 0xe5, 0x22, 0x2e, 0x45, 0x83, 0x23, 0x09, 0x60, 0x72, 0x57, 0x6c, 0xbb, 0x52, 0x0b, + 0x79, 0x23, 0x17, 0x9d, 0x49, 0x72, 0xe6, 0x41, 0x29, 0xb2, 0x08, 0x15, 0x23, 0xb2, 0x05, 0x85, + 0xfb, 0x74, 0x2b, 0x9f, 0x74, 0x01, 0x77, 0xa9, 0x3c, 0xcd, 0xd4, 0x26, 0x0f, 0x0f, 0x2a, 0x85, + 0xbb, 0x74, 0x0b, 0x19, 0x71, 0xf6, 0x5d, 0x4d, 0xe1, 0xbb, 0x20, 0x97, 0x8a, 0x37, 0x72, 0x74, + 0x84, 0x10, 0xdf, 0x25, 0x8b, 0x50, 0x31, 0x22, 0xef, 0x40, 0xe9, 0xbe, 0xb3, 0x47, 0xb7, 0x03, + 0xdf, 0x8b, 0xa4, 0xaf, 0xdc, 0x88, 0xe1, 0x1e, 0x77, 0x15, 0x39, 0xc9, 0x97, 0x6f, 0xef, 0xba, + 0x10, 0x63, 0x76, 0x64, 0x0f, 0xa6, 0x3c, 0x7a, 0x1f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x5e, 0x71, + 0x4b, 0x52, 0x93, 0x9c, 0xf9, 0xbe, 0xa7, 0xca, 0x50, 0xf3, 0x62, 0x7d, 0x79, 0xcf, 0xdf, 0x92, + 0x0b, 0xd5, 0x88, 0x7d, 0xa9, 0x4f, 0xa6, 0xa2, 0x2f, 0x6f, 0xfa, 0x5b, 0xc8, 0x88, 0xb3, 0x39, + 0xd2, 0xd0, 0x8e, 0x5a, 0x72, 0x99, 0xba, 0x95, 0xaf, 0x83, 0x9a, 0x98, 0x23, 0x71, 0x29, 0x1a, + 0x1c, 0x59, 0xdb, 0xb6, 0xa4, 0xb1, 0x52, 0x2e, 0x54, 0x23, 0xb6, 0x6d, 0xd2, 0xf4, 0x29, 0xda, + 0x56, 0x95, 0xa1, 0xe6, 0xc5, 0xf8, 0xba, 0xd2, 0xf2, 0x97, 0xcf, 0x52, 0x95, 0xb4, 0x23, 0x0a, + 0xbe, 0xaa, 0x0c, 0x35, 0x2f, 0xd6, 0xde, 0xe1, 0xee, 0xfe, 0x7d, 0xa7, 0xbd, 0xeb, 0x7a, 0x2d, + 0x19, 0xab, 0x3a, 0x6a, 0xd6, 0xe9, 0xdd, 0xfd, 0xbb, 0x82, 0x9e, 0xd9, 0xde, 0x71, 0x29, 0x1a, + 0x1c, 0xc9, 0xdf, 0xb3, 0x60, 0xa2, 0xdb, 0xee, 0xb5, 0x5c, 0x6f, 0x7e, 0x3a, 0x0f, 0x27, 0xa6, + 0xe4, 0x92, 0xbb, 0xb8, 0xc1, 0x49, 0x0b, 0x45, 0xf1, 0x27, 0xb5, 0xdf, 0x25, 0x2f, 0xfc, 0xfa, + 0x1f, 0x55, 0xe6, 0xa9, 0xd7, 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xba, 0x17, 0xfa, 0xde, 0x22, 0x3a, + 0xf7, 0x95, 0x8e, 0x2e, 0x65, 0x5a, 0xf8, 0x04, 0x94, 0x0d, 0x12, 0x8f, 0x52, 0xf4, 0xa6, 0x4d, + 0x45, 0xef, 0x57, 0x27, 0x60, 0xda, 0xcc, 0x35, 0x39, 0x84, 0xf6, 0xa5, 0x4f, 0x1c, 0x63, 0xc7, + 0x39, 0x71, 0xb0, 0x23, 0xa6, 0x71, 0xc1, 0xa5, 0xcc, 0x5b, 0xab, 0xb9, 0x29, 0xdc, 0xf1, 0x11, + 0xd3, 0x28, 0x0c, 0x31, 0xc1, 0xf4, 0x18, 0x3e, 0x2f, 0x4c, 0x6d, 0x15, 0x8a, 0x5d, 0x31, 0xa9, + 0xb6, 0x26, 0x54, 0xb5, 0xab, 0x00, 0x71, 0x52, 0x44, 0x79, 0xf1, 0xa9, 0xf5, 0x61, 0x23, 0x59, + 0xa3, 0x81, 0x45, 0x9e, 0x83, 0x09, 0xa6, 0xfa, 0xd0, 0xa6, 0x0c, 0xa5, 0xd7, 0xe7, 0xf8, 0xeb, + 0xbc, 0x14, 0x25, 0x94, 0xbc, 0xc2, 0xb4, 0xd4, 0x58, 0x61, 0x91, 0x11, 0xf2, 0xe7, 0x63, 0x2d, + 0x35, 0x86, 0x61, 0x02, 0x93, 0x89, 0x4e, 0x99, 0x7e, 0xc1, 0xd7, 0x06, 0x43, 0x74, 0xae, 0x74, + 0xa0, 0x80, 0x71, 0xbb, 0x52, 0x4a, 0x1f, 0xe1, 0x73, 0xba, 0x68, 0xd8, 0x95, 0x52, 0x70, 0xec, + 0xab, 0xc1, 0x3e, 0x46, 0xde, 0xd9, 0x96, 0x85, 0xc3, 0xf4, 0x80, 0xdb, 0xd6, 0xaf, 0x9a, 0x67, + 0xad, 0x1c, 0xe7, 0x90, 0x18, 0xb5, 0xc3, 0x1f, 0xb6, 0x46, 0x3b, 0x16, 0x7d, 0x0e, 0x66, 0x92, + 0xbb, 0x50, 0xee, 0x37, 0x1f, 0x5f, 0x1b, 0x87, 0x73, 0xb7, 0x5a, 0xae, 0x97, 0x4e, 0x74, 0x96, + 0x95, 0xc4, 0xdf, 0x3a, 0x76, 0x12, 0x7f, 0x1d, 0x93, 0x27, 0x53, 0xe4, 0x67, 0xc7, 0xe4, 0xa9, + 0xf7, 0x0a, 0x92, 0xb8, 0xe4, 0x0f, 0x2d, 0x78, 0xc6, 0x69, 0x8a, 0x73, 0x81, 0xd3, 0x96, 0xa5, + 0x46, 0xee, 0x69, 0x39, 0xa3, 0xc3, 0x11, 0x77, 0xf9, 0xfe, 0x8f, 0x5f, 0xac, 0x1e, 0xc1, 0x55, + 0xf4, 0xf8, 0x4f, 0xc8, 0x2f, 0x78, 0xe6, 0x28, 0x54, 0x3c, 0x52, 0x7c, 0xf2, 0x57, 0x60, 0x36, + 0xf1, 0xc1, 0xd2, 0x12, 0x5e, 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0xb8, 0x0b, 0xb7, 0xe1, + 0xc3, 0x8f, 0x94, 0xf3, 0x58, 0x83, 0xed, 0xbb, 0x16, 0x4c, 0x9b, 0x39, 0x89, 0xc8, 0x0b, 0x30, + 0x15, 0xf9, 0xbb, 0xd4, 0xbb, 0x13, 0x28, 0x87, 0x5d, 0x3d, 0xd0, 0x37, 0x79, 0x39, 0xae, 0xa1, + 0xc6, 0x60, 0xd8, 0x8d, 0xb6, 0x4b, 0xbd, 0x68, 0xb5, 0x29, 0xbb, 0x59, 0x63, 0x2f, 0x8b, 0xf2, + 0x15, 0xd4, 0x18, 0xc2, 0xc7, 0x8e, 0xfd, 0xae, 0xd3, 0x46, 0x40, 0x95, 0x7b, 0xbf, 0xe1, 0x63, + 0x17, 0xc3, 0x30, 0x81, 0x49, 0x6c, 0x6d, 0xe2, 0x1c, 0x8f, 0xef, 0x35, 0x52, 0x26, 0xc9, 0xdf, + 0xb0, 0xa0, 0x24, 0x4c, 0xf4, 0x48, 0xb7, 0x53, 0x2e, 0xb6, 0x29, 0x23, 0x42, 0x75, 0x63, 0x35, + 0xcb, 0xc5, 0xf6, 0x32, 0x8c, 0xef, 0xba, 0x9e, 0xfa, 0x12, 0xbd, 0x2d, 0xbd, 0xe1, 0x7a, 0x4d, + 0xe4, 0x10, 0xbd, 0x71, 0x15, 0x06, 0x6e, 0x5c, 0x4b, 0x50, 0xd2, 0x8e, 0x27, 0x72, 0xf9, 0xd7, + 0xd6, 0x5b, 0xed, 0xa8, 0x82, 0x31, 0x8e, 0xfd, 0xcb, 0x16, 0xcc, 0xf0, 0x18, 0xee, 0xf8, 0x3c, + 0xfc, 0xb2, 0xf6, 0x05, 0x13, 0x72, 0x5f, 0x4c, 0xfa, 0x82, 0x3d, 0x3c, 0xa8, 0x94, 0x45, 0xd4, + 0x77, 0xd2, 0x35, 0xec, 0x33, 0xd2, 0x88, 0xc6, 0x3d, 0xd6, 0xc6, 0x8e, 0x6d, 0xe3, 0x89, 0xc5, + 0x54, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x0b, 0xd3, 0x66, 0x30, 0x16, 0x79, 0x19, 0xca, 0x5d, 0xd7, + 0x6b, 0x25, 0x83, 0x76, 0xf5, 0x45, 0xc3, 0x46, 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, + 0xa9, 0xfb, 0x89, 0x0d, 0xdf, 0xac, 0x16, 0xff, 0xe1, 0x79, 0xff, 0x33, 0x82, 0xfe, 0x72, 0xcf, + 0xfb, 0x9f, 0xc1, 0xe3, 0xc7, 0x97, 0xf7, 0x3f, 0x4b, 0x98, 0x3f, 0x5b, 0x79, 0xff, 0x7f, 0x1a, + 0x8e, 0x9b, 0x13, 0x95, 0xed, 0xf5, 0xf7, 0xcd, 0xc4, 0x0a, 0xba, 0xc5, 0x65, 0x66, 0x05, 0x09, + 0xb5, 0x7f, 0xab, 0x00, 0x73, 0xe9, 0x23, 0x7f, 0xde, 0xde, 0x14, 0xe4, 0x1b, 0x16, 0xcc, 0x38, + 0x89, 0xfc, 0x73, 0x39, 0x3d, 0x22, 0x94, 0xa0, 0x69, 0xe4, 0x3f, 0x4b, 0x94, 0x63, 0x8a, 0x37, + 0xf9, 0x0b, 0x30, 0x19, 0xb9, 0x1d, 0xea, 0xf7, 0x84, 0x21, 0xb0, 0x20, 0x0e, 0xe4, 0x9b, 0xa2, + 0x08, 0x15, 0x8c, 0x2d, 0xca, 0x2e, 0xd7, 0xa0, 0x02, 0x2a, 0x3d, 0x83, 0xe7, 0x62, 0xcb, 0xa5, + 0x28, 0x47, 0x8d, 0x41, 0x1e, 0xc0, 0xa4, 0xf0, 0xbb, 0x50, 0x0e, 0x36, 0xeb, 0x39, 0x99, 0x26, + 0x84, 0x6b, 0x47, 0xdc, 0x05, 0xe2, 0x7f, 0x88, 0x8a, 0x9d, 0xfd, 0x31, 0x38, 0x66, 0x92, 0x58, + 0xfb, 0x1a, 0x10, 0xf4, 0xdb, 0xed, 0x2d, 0xa7, 0xb1, 0x7b, 0xd7, 0xf5, 0x9a, 0xfe, 0x7d, 0xbe, + 0x14, 0x2d, 0x41, 0x29, 0x90, 0x21, 0xb3, 0xa1, 0x1c, 0x35, 0x7a, 0x2d, 0x53, 0xb1, 0xb4, 0x21, + 0xc6, 0x38, 0xf6, 0xef, 0x8d, 0xc1, 0xa4, 0x8c, 0xef, 0x7e, 0x0c, 0x91, 0x09, 0xbb, 0x89, 0xfb, + 0xe0, 0xd5, 0x5c, 0xc2, 0xd2, 0x07, 0x86, 0x25, 0x84, 0xa9, 0xb0, 0x84, 0x37, 0xf2, 0x61, 0x77, + 0x74, 0x4c, 0xc2, 0xbf, 0x2e, 0xc2, 0x6c, 0x2a, 0x5e, 0x9e, 0xe9, 0xe2, 0x7d, 0xae, 0xb8, 0x77, + 0x72, 0x0d, 0xc9, 0xd7, 0xb1, 0x48, 0x47, 0x7b, 0xe5, 0x86, 0x89, 0x94, 0xde, 0xf9, 0xf9, 0x32, + 0xfe, 0x79, 0x76, 0xef, 0xbc, 0xbc, 0x4c, 0x8b, 0x1f, 0x1c, 0x2f, 0xd3, 0xff, 0x62, 0xc1, 0x53, + 0x03, 0x33, 0x3f, 0xf0, 0xc4, 0x61, 0x41, 0x12, 0x2a, 0xd7, 0x8c, 0x9c, 0xf3, 0xdb, 0xe8, 0xfb, + 0xe3, 0x74, 0xae, 0xa7, 0x34, 0x7b, 0xf2, 0x12, 0x4c, 0x73, 0x1d, 0x8d, 0xad, 0x9e, 0x11, 0xed, + 0xca, 0xeb, 0x2f, 0x7e, 0x11, 0x52, 0x37, 0xca, 0x31, 0x81, 0x65, 0x7f, 0xc7, 0x82, 0xf9, 0x41, + 0x69, 0xa4, 0x86, 0x30, 0xce, 0xfc, 0xe5, 0x54, 0x74, 0x47, 0xa5, 0x2f, 0xba, 0x23, 0x65, 0x9e, + 0x51, 0x81, 0x1c, 0x86, 0x65, 0xa4, 0xf0, 0x88, 0xe0, 0x85, 0x6f, 0x5a, 0xf0, 0xe4, 0x80, 0x09, + 0xdf, 0x17, 0xe5, 0x63, 0x9d, 0x38, 0xca, 0x67, 0x6c, 0xd8, 0x28, 0x1f, 0xfb, 0xf7, 0x0b, 0x30, + 0x27, 0xe5, 0x89, 0x15, 0xf5, 0x57, 0x12, 0x31, 0x32, 0x3f, 0x91, 0x8a, 0x91, 0x39, 0x9f, 0xc6, + 0xff, 0xf3, 0x00, 0x99, 0x0f, 0x56, 0x80, 0xcc, 0xd7, 0x8b, 0x70, 0x21, 0x33, 0xbb, 0x15, 0xf9, + 0x5a, 0xc6, 0xee, 0x75, 0x37, 0xe7, 0x34, 0x5a, 0x43, 0xee, 0x5f, 0xa3, 0x46, 0x95, 0xfc, 0xa2, + 0x19, 0xcd, 0x21, 0x76, 0xa3, 0xed, 0x53, 0x48, 0x08, 0x76, 0xdc, 0xc0, 0x8e, 0xc7, 0xfb, 0xe4, + 0xd5, 0x9f, 0x81, 0xad, 0xe7, 0xeb, 0x05, 0xb8, 0x32, 0x6c, 0xcb, 0x7e, 0x40, 0x23, 0x21, 0xc3, + 0x44, 0x24, 0xe4, 0x63, 0x52, 0xb5, 0x4e, 0x25, 0x28, 0xf2, 0x1f, 0x8c, 0x6b, 0x3d, 0xa0, 0x7f, + 0xc2, 0x0e, 0xe5, 0x3c, 0x32, 0xc9, 0xd4, 0x71, 0x95, 0x29, 0x3d, 0xde, 0x1b, 0x26, 0xeb, 0xa2, + 0xf8, 0xe1, 0x41, 0xe5, 0x6c, 0x9c, 0x74, 0x46, 0x16, 0xa2, 0xaa, 0x44, 0xae, 0xc0, 0x54, 0x20, + 0xa0, 0x2a, 0xf6, 0x4b, 0x7a, 0xe0, 0x88, 0x32, 0xd4, 0x50, 0xf2, 0x45, 0xe3, 0xfc, 0x32, 0x7e, + 0x5a, 0xb9, 0x95, 0x8e, 0x72, 0x2c, 0x7a, 0x1b, 0xa6, 0x42, 0x95, 0xce, 0x5b, 0x4c, 0xa7, 0x17, + 0x87, 0x0c, 0x29, 0x74, 0xb6, 0x68, 0x5b, 0xe5, 0xf6, 0x16, 0xdf, 0xa7, 0x33, 0x7f, 0x6b, 0x92, + 0xc4, 0xd6, 0xf6, 0x00, 0x71, 0xf1, 0x01, 0xfd, 0xb6, 0x00, 0x12, 0xc1, 0xa4, 0x7c, 0xc2, 0x56, + 0xde, 0xc8, 0xae, 0xe7, 0x14, 0x9b, 0x23, 0x3d, 0xb7, 0xf9, 0x31, 0x5b, 0xd9, 0xa5, 0x14, 0x2b, + 0xfb, 0xfb, 0x16, 0x94, 0xe5, 0x18, 0x79, 0x0c, 0xb1, 0x95, 0xf7, 0x92, 0xb1, 0x95, 0xd7, 0x72, + 0x59, 0xc2, 0x07, 0x04, 0x56, 0xde, 0x83, 0x69, 0x33, 0xcf, 0x24, 0xf9, 0xb4, 0xb1, 0x05, 0x59, + 0xa3, 0x64, 0x6e, 0x53, 0x9b, 0x54, 0xbc, 0x3d, 0xd9, 0xbf, 0x56, 0xd2, 0xad, 0xc8, 0x0f, 0xf3, + 0xe6, 0xc8, 0xb7, 0x8e, 0x1c, 0xf9, 0xe6, 0xc0, 0x1b, 0xcb, 0x7f, 0xe0, 0xbd, 0x09, 0x53, 0x6a, + 0x59, 0x94, 0xda, 0xd4, 0xb3, 0xa6, 0x2b, 0x37, 0x53, 0xc9, 0x18, 0x31, 0x63, 0xba, 0xf0, 0x43, + 0x79, 0x6c, 0x2d, 0x57, 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x81, 0xf2, 0x7d, 0x3f, 0xd8, 0x6d, 0xfb, + 0x0e, 0x7f, 0x43, 0x01, 0xf2, 0xf0, 0x1e, 0xd0, 0x16, 0x6f, 0x11, 0x4f, 0x73, 0x37, 0xa6, 0x8f, + 0x26, 0x33, 0x52, 0x85, 0xd9, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0x84, 0x72, 0x5c, 0xe4, 0x2f, + 0x57, 0x67, 0x8d, 0xf5, 0x24, 0x18, 0xd3, 0xf8, 0xdc, 0x1a, 0x16, 0x24, 0xcc, 0x2f, 0x32, 0x49, + 0xf1, 0xc6, 0xe8, 0x83, 0x31, 0x69, 0xd2, 0x11, 0x01, 0x25, 0xc9, 0x72, 0x4c, 0xf1, 0x26, 0x5f, + 0x80, 0xa9, 0x50, 0x3d, 0x0e, 0x59, 0xcc, 0xf1, 0x14, 0xa6, 0x1f, 0x88, 0xd4, 0x5d, 0xa9, 0x5f, + 0x88, 0xd4, 0x0c, 0xc9, 0x1a, 0x9c, 0x57, 0xf6, 0xa4, 0xc4, 0x3b, 0x77, 0x13, 0x71, 0xce, 0x31, + 0xcc, 0x80, 0x63, 0x66, 0x2d, 0xa6, 0xdb, 0xf2, 0xfc, 0xad, 0xe2, 0xb6, 0xd6, 0xb8, 0xe0, 0xe4, + 0xf3, 0xaf, 0x89, 0x12, 0x7a, 0x54, 0x84, 0xf0, 0xd4, 0x08, 0x11, 0xc2, 0x75, 0xb8, 0x90, 0x06, + 0xf1, 0x64, 0x72, 0x3c, 0x7f, 0x9d, 0xb1, 0x85, 0x6e, 0x64, 0x21, 0x61, 0x76, 0x5d, 0x72, 0x17, + 0x4a, 0x01, 0xe5, 0xa7, 0xce, 0xaa, 0x72, 0x74, 0x3b, 0xb6, 0x4b, 0x2f, 0x2a, 0x02, 0x18, 0xd3, + 0x62, 0xfd, 0xee, 0x24, 0x33, 0x8a, 0xbf, 0x99, 0xe3, 0xeb, 0xd1, 0xb2, 0xef, 0x07, 0x24, 0x79, + 0xb4, 0xff, 0xed, 0x2c, 0x9c, 0x49, 0x18, 0xc5, 0xc8, 0xb3, 0x50, 0xe4, 0xd9, 0xf5, 0xf8, 0x6a, + 0x35, 0x15, 0xaf, 0xa8, 0xa2, 0x71, 0x04, 0x8c, 0xfc, 0xbc, 0x05, 0xb3, 0xdd, 0xc4, 0x25, 0x8f, + 0x5a, 0xc8, 0x47, 0xb4, 0x24, 0x27, 0x6f, 0x8e, 0x8c, 0xb7, 0x38, 0x92, 0xcc, 0x30, 0xcd, 0x9d, + 0xad, 0x07, 0xd2, 0x2f, 0xbe, 0x4d, 0x03, 0x8e, 0x2d, 0x15, 0x3d, 0x4d, 0x62, 0x39, 0x09, 0xc6, + 0x34, 0x3e, 0xeb, 0x61, 0xfe, 0x75, 0xa3, 0xbc, 0x10, 0x5a, 0x55, 0x04, 0x30, 0xa6, 0x45, 0x5e, + 0x83, 0x19, 0x99, 0x48, 0x7a, 0xc3, 0x6f, 0xde, 0x70, 0xc2, 0x1d, 0x79, 0xe4, 0xd3, 0x47, 0xd4, + 0xe5, 0x04, 0x14, 0x53, 0xd8, 0xfc, 0xdb, 0xe2, 0x6c, 0xdd, 0x9c, 0xc0, 0x44, 0xf2, 0xa9, 0x92, + 0xe5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x05, 0x63, 0x1b, 0x12, 0x1e, 0x14, 0x7a, 0x35, 0xc8, 0xd8, + 0x8a, 0xaa, 0x30, 0xdb, 0xe3, 0x27, 0xe4, 0xa6, 0x02, 0xca, 0xf9, 0xa8, 0x19, 0xde, 0x49, 0x82, + 0x31, 0x8d, 0x4f, 0x5e, 0x85, 0x33, 0x01, 0x5b, 0x6c, 0x35, 0x01, 0xe1, 0x56, 0xa1, 0x6f, 0xcd, + 0xd1, 0x04, 0x62, 0x12, 0x97, 0xbc, 0x0e, 0x67, 0xe3, 0xbc, 0xab, 0x8a, 0x80, 0xf0, 0xb3, 0xd0, + 0x49, 0x00, 0xab, 0x69, 0x04, 0xec, 0xaf, 0x43, 0xfe, 0x1a, 0xcc, 0x19, 0x2d, 0xb1, 0xea, 0x35, + 0xe9, 0x03, 0x99, 0x1b, 0x93, 0x3f, 0xbd, 0xb5, 0x9c, 0x82, 0x61, 0x1f, 0x36, 0xf9, 0x24, 0xcc, + 0x34, 0xfc, 0x76, 0x9b, 0xaf, 0x71, 0xe2, 0x99, 0x0c, 0x91, 0x04, 0x53, 0xa4, 0x0b, 0x4d, 0x40, + 0x30, 0x85, 0x49, 0x6e, 0x02, 0xf1, 0xb7, 0x98, 0x7a, 0x45, 0x9b, 0xaf, 0x53, 0x8f, 0x4a, 0x8d, + 0xe3, 0x4c, 0x32, 0x2a, 0xe7, 0x76, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x39, 0x04, 0x8d, 0x28, 0xe6, + 0x99, 0x3c, 0x9e, 0xb3, 0x4c, 0xdb, 0x73, 0x1e, 0x19, 0xc2, 0x1c, 0xc0, 0x84, 0x08, 0x92, 0xca, + 0x27, 0x1b, 0xa6, 0x99, 0x31, 0x3f, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, 0xe4, 0xe7, 0xa0, 0xb4, + 0xa5, 0x9e, 0x4f, 0xe1, 0x29, 0x30, 0x47, 0xde, 0x17, 0x53, 0x2f, 0x01, 0xc5, 0xf6, 0x0a, 0x0d, + 0xc0, 0x98, 0x25, 0x79, 0x0e, 0xca, 0x37, 0x36, 0xaa, 0x7a, 0x14, 0x9e, 0xe5, 0xbd, 0x3f, 0xce, + 0xaa, 0xa0, 0x09, 0x60, 0x33, 0x4c, 0xab, 0x6f, 0x24, 0xe9, 0x3a, 0x90, 0xa1, 0x8d, 0x31, 0x6c, + 0xee, 0x0b, 0x81, 0xf5, 0xf9, 0x73, 0x29, 0x6c, 0x59, 0x8e, 0x1a, 0x83, 0xbc, 0x0d, 0x65, 0xb9, + 0x5f, 0xf0, 0xb5, 0xe9, 0xfc, 0xc9, 0x22, 0xe4, 0x31, 0x26, 0x81, 0x26, 0x3d, 0x7e, 0x89, 0xcd, + 0x5f, 0x95, 0xa0, 0xd7, 0x7b, 0xed, 0xf6, 0xfc, 0x05, 0xbe, 0x6e, 0xc6, 0x97, 0xd8, 0x31, 0x08, + 0x4d, 0x3c, 0xf2, 0xa2, 0xf2, 0x69, 0x7b, 0x22, 0x71, 0xab, 0xaf, 0x7d, 0xda, 0xb4, 0xd2, 0x3d, + 0x20, 0x88, 0xe6, 0xc9, 0x47, 0x38, 0x93, 0x6d, 0xc1, 0x82, 0xd2, 0xf8, 0xfa, 0x27, 0xc9, 0xfc, + 0x7c, 0xc2, 0x76, 0xb4, 0x70, 0x77, 0x20, 0x26, 0x1e, 0x41, 0x85, 0x6c, 0x41, 0xc1, 0x69, 0x6f, + 0xcd, 0x3f, 0x95, 0x87, 0xea, 0x5a, 0x5d, 0xab, 0xc9, 0x11, 0xc5, 0x1d, 0x5f, 0xab, 0x6b, 0x35, + 0x64, 0xc4, 0x89, 0x0b, 0xe3, 0x4e, 0x7b, 0x2b, 0x9c, 0x5f, 0xe0, 0x73, 0x36, 0x37, 0x26, 0xb1, + 0xf1, 0x60, 0xad, 0x16, 0x22, 0x67, 0x61, 0x7f, 0x69, 0x4c, 0xdf, 0x5c, 0xe9, 0x84, 0xe4, 0xef, + 0x9a, 0x13, 0x48, 0x1c, 0x77, 0x6e, 0xe7, 0x36, 0x81, 0xa4, 0x7a, 0x71, 0x66, 0xe0, 0xf4, 0xe9, + 0xea, 0x25, 0x23, 0x97, 0x4c, 0x66, 0xc9, 0x64, 0xeb, 0xe2, 0xf4, 0x9c, 0x5c, 0x30, 0xec, 0x2f, + 0x97, 0xb5, 0x15, 0x34, 0xe5, 0x0f, 0x16, 0x40, 0xd1, 0x0d, 0x23, 0xd7, 0xcf, 0x31, 0x70, 0x3c, + 0x95, 0xa5, 0x9c, 0xc7, 0xa5, 0x70, 0x00, 0x0a, 0x56, 0x8c, 0xa7, 0xd7, 0x72, 0xbd, 0x07, 0xf2, + 0xf3, 0xdf, 0xcc, 0xdd, 0xd1, 0x4b, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, 0x3d, 0x31, 0xa8, 0x0b, + 0x79, 0xf4, 0x75, 0x75, 0xad, 0x96, 0xe2, 0x97, 0x1c, 0xdc, 0xf7, 0xa0, 0x10, 0x76, 0x5c, 0xa9, + 0x2e, 0x8d, 0xc8, 0xab, 0xbe, 0xbe, 0x9a, 0xc5, 0xab, 0xbe, 0xbe, 0x8a, 0x8c, 0x09, 0xf9, 0xaa, + 0x05, 0xe0, 0x74, 0xb6, 0x9c, 0x30, 0x74, 0x9a, 0xda, 0x3a, 0x33, 0xe2, 0xeb, 0x23, 0x55, 0x4d, + 0x2f, 0xc5, 0x9a, 0xbb, 0x36, 0xc7, 0x50, 0x34, 0x38, 0x93, 0x77, 0x60, 0xd2, 0x11, 0xcf, 0x3b, + 0x4a, 0x2f, 0xfd, 0x7c, 0xde, 0x2c, 0x4d, 0x49, 0xc0, 0xcd, 0x34, 0x12, 0x84, 0x8a, 0x21, 0xe3, + 0x1d, 0x05, 0x0e, 0xdd, 0x76, 0x77, 0xa5, 0x71, 0xa8, 0x3e, 0xf2, 0x03, 0x24, 0x8c, 0x58, 0x16, + 0x6f, 0x09, 0x42, 0xc5, 0x50, 0xbc, 0xe6, 0xef, 0x78, 0x8e, 0x8e, 0xbd, 0xcc, 0x27, 0x42, 0xd7, + 0x8c, 0xe6, 0x34, 0x5e, 0xf3, 0x37, 0x19, 0x61, 0x92, 0x2f, 0xd9, 0x83, 0x09, 0x87, 0x3f, 0x3c, + 0x2b, 0x8f, 0x62, 0x98, 0xc7, 0x23, 0xb6, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, 0xde, 0x56, 0x72, + 0x23, 0xbf, 0x62, 0xc1, 0xa4, 0x70, 0x20, 0x67, 0x0a, 0x29, 0xfb, 0xf6, 0xcf, 0x9d, 0xc2, 0x6b, + 0x07, 0xd2, 0xb9, 0x5d, 0xba, 0x44, 0x7d, 0x44, 0x7b, 0xc7, 0x8a, 0xd2, 0x23, 0xdd, 0xdb, 0x95, + 0x74, 0x4c, 0xf5, 0xed, 0x38, 0x0f, 0x12, 0xcf, 0xcb, 0x98, 0xaa, 0xef, 0x7a, 0x0a, 0x86, 0x7d, + 0xd8, 0x0b, 0x9f, 0x84, 0x69, 0x53, 0x8e, 0x63, 0xb9, 0xc8, 0xff, 0xb0, 0x00, 0xc0, 0xbb, 0x4a, + 0xe4, 0x6b, 0xe9, 0xf0, 0xe4, 0xce, 0x3b, 0x7e, 0x33, 0xa7, 0x67, 0x2e, 0x8d, 0xb4, 0x2b, 0x20, + 0x33, 0x39, 0xef, 0xf8, 0x4d, 0x94, 0x4c, 0x48, 0x0b, 0xc6, 0xbb, 0x4e, 0xb4, 0x93, 0x7f, 0x8e, + 0x97, 0x29, 0x11, 0xb8, 0x1c, 0xed, 0x20, 0x67, 0x40, 0xde, 0xb3, 0x62, 0x6f, 0xa3, 0x42, 0x3e, + 0x3e, 0x21, 0xaa, 0xcd, 0x16, 0xa5, 0x7f, 0x51, 0x2a, 0x4d, 0x6b, 0xda, 0xeb, 0x68, 0xe1, 0x7d, + 0x0b, 0xa6, 0x4d, 0xd4, 0x8c, 0x6e, 0xfa, 0x59, 0xb3, 0x9b, 0xf2, 0x6c, 0x0f, 0xb3, 0xc7, 0xff, + 0x9b, 0x05, 0x80, 0x3d, 0xaf, 0xde, 0xeb, 0x74, 0x98, 0xda, 0xae, 0x23, 0x01, 0xac, 0xa1, 0x23, + 0x01, 0xc6, 0x8e, 0x19, 0x09, 0x50, 0x38, 0x56, 0x24, 0xc0, 0xf8, 0xf1, 0x23, 0x01, 0x8a, 0x83, + 0x23, 0x01, 0xec, 0x6f, 0x59, 0x70, 0xb6, 0x6f, 0xbf, 0x62, 0x9a, 0x74, 0xe0, 0xfb, 0xd1, 0x00, + 0x2f, 0x52, 0x8c, 0x41, 0x68, 0xe2, 0x91, 0x15, 0x98, 0x93, 0x4f, 0x99, 0xd4, 0xbb, 0x6d, 0x37, + 0x33, 0xff, 0xce, 0x66, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb2, 0xa0, 0x6c, 0x44, 0xed, 0xb3, + 0xef, 0xe0, 0xae, 0xc4, 0x52, 0x8c, 0xf8, 0x15, 0x17, 0x7e, 0xd5, 0x25, 0x60, 0xe2, 0x1a, 0xba, + 0x65, 0x24, 0xba, 0x8f, 0xaf, 0xa1, 0x59, 0x29, 0x4a, 0xa8, 0x48, 0x61, 0x4e, 0xbb, 0xbc, 0xd1, + 0x0b, 0x66, 0x0a, 0x73, 0xda, 0x45, 0x0e, 0xe1, 0xec, 0xd8, 0x91, 0x42, 0x7a, 0x09, 0x1b, 0x8f, + 0xc6, 0x38, 0x41, 0x84, 0x02, 0x46, 0x2e, 0x42, 0x81, 0x7a, 0x4d, 0x69, 0xff, 0xd0, 0xcf, 0xba, + 0x5e, 0xf3, 0x9a, 0xc8, 0xca, 0xed, 0xdb, 0x30, 0x2d, 0x3c, 0xa4, 0xdf, 0xa0, 0xfb, 0x43, 0xbf, + 0x13, 0xcb, 0x46, 0x7b, 0xea, 0x9d, 0x58, 0x56, 0x9d, 0x95, 0xdb, 0xff, 0xd8, 0x82, 0xd4, 0xcb, + 0x46, 0xc6, 0x0d, 0x8c, 0x35, 0xf0, 0x06, 0xc6, 0xb4, 0xda, 0x8f, 0x1d, 0x69, 0xb5, 0xbf, 0x09, + 0xa4, 0xc3, 0xa6, 0x42, 0x72, 0xa1, 0x2d, 0x24, 0x9f, 0x9b, 0x58, 0xef, 0xc3, 0xc0, 0x8c, 0x5a, + 0xf6, 0x3f, 0x12, 0xc2, 0x9a, 0x6f, 0x1d, 0x3d, 0xba, 0x01, 0x7a, 0x50, 0xe4, 0xa4, 0xa4, 0xfd, + 0x6d, 0x44, 0xdb, 0x75, 0x7f, 0xae, 0xad, 0xb8, 0x23, 0xe5, 0x94, 0xe7, 0xdc, 0xec, 0xdf, 0x17, + 0xb2, 0x1a, 0x8f, 0x21, 0x0d, 0x21, 0x6b, 0x27, 0x29, 0xeb, 0x8d, 0xbc, 0xd6, 0xca, 0x6c, 0x19, + 0xc9, 0x22, 0x40, 0x97, 0x06, 0x0d, 0xea, 0x45, 0x2a, 0x76, 0xa9, 0x28, 0xa3, 0x68, 0x75, 0x29, + 0x1a, 0x18, 0xf6, 0x37, 0xd9, 0x04, 0x8a, 0x5f, 0x50, 0x26, 0x57, 0xd2, 0xee, 0xb7, 0xe9, 0xc9, + 0xa1, 0xbd, 0x6f, 0x8d, 0x88, 0x96, 0xb1, 0x47, 0x44, 0xb4, 0x3c, 0x0f, 0x93, 0x81, 0xdf, 0xa6, + 0xd5, 0xc0, 0x4b, 0xfb, 0x0c, 0x21, 0x2b, 0xc6, 0x5b, 0xa8, 0xe0, 0xf6, 0x2f, 0x59, 0x30, 0x97, + 0x0e, 0xb9, 0xcb, 0xdd, 0x27, 0xd8, 0xcc, 0x0b, 0x50, 0x38, 0x7e, 0x5e, 0x00, 0xfb, 0x3d, 0x26, + 0x64, 0xe4, 0x36, 0x76, 0x5d, 0x4f, 0x84, 0xd2, 0xb3, 0x96, 0x7b, 0x1e, 0x26, 0xa9, 0x7c, 0x09, + 0x56, 0x98, 0x91, 0xb5, 0x90, 0xea, 0x01, 0x58, 0x05, 0x27, 0x55, 0x98, 0x55, 0x97, 0x67, 0xca, + 0xf6, 0x2f, 0x52, 0x80, 0x68, 0x5b, 0xe3, 0x4a, 0x12, 0x8c, 0x69, 0x7c, 0xfb, 0x8b, 0x50, 0x36, + 0x36, 0x25, 0xbe, 0x7e, 0x3f, 0x70, 0x1a, 0x51, 0x7a, 0xdd, 0xbb, 0xc6, 0x0a, 0x51, 0xc0, 0xf8, + 0x15, 0x85, 0x88, 0x08, 0x4a, 0xad, 0x7b, 0x32, 0x0e, 0x48, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, + 0x03, 0xf5, 0x0e, 0x81, 0x22, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x01, 0xa6, 0x54, 0xa2, 0x26, + 0x9e, 0xed, 0x44, 0x99, 0xcf, 0xcd, 0x6c, 0x27, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, 0xc1, 0x94, + 0xca, 0x27, 0xf5, 0x68, 0x6c, 0xb6, 0x14, 0x85, 0x9e, 0x7b, 0xc3, 0x0f, 0x23, 0x95, 0x04, 0x4b, + 0xdc, 0xf0, 0xdd, 0x5a, 0xe5, 0x65, 0xa8, 0xa1, 0xf6, 0x9f, 0x5a, 0x50, 0xde, 0xdc, 0x5c, 0xd3, + 0x07, 0x7f, 0x84, 0x27, 0x42, 0xd1, 0x42, 0xd5, 0xed, 0x88, 0x9a, 0xae, 0x04, 0x62, 0xe1, 0x5b, + 0x38, 0x3c, 0xa8, 0x3c, 0x51, 0xcf, 0xc4, 0xc0, 0x01, 0x35, 0xc9, 0x2a, 0x9c, 0x33, 0x21, 0x32, + 0x39, 0x81, 0x5c, 0x23, 0xf9, 0xd3, 0xc1, 0xf5, 0x7e, 0x30, 0x66, 0xd5, 0x49, 0x93, 0x92, 0xdb, + 0xbd, 0xf9, 0x0a, 0x71, 0xbd, 0x1f, 0x8c, 0x59, 0x75, 0xec, 0x17, 0x61, 0x36, 0x75, 0xc7, 0x3d, + 0x44, 0x52, 0x98, 0xdf, 0x29, 0xc0, 0xb4, 0x79, 0xd5, 0x39, 0xc4, 0xfa, 0x35, 0xfc, 0xb6, 0x90, + 0x71, 0x3d, 0x59, 0x38, 0xe6, 0xf5, 0xa4, 0x79, 0x1f, 0x3c, 0x7e, 0xba, 0xf7, 0xc1, 0xc5, 0x7c, + 0xee, 0x83, 0x0d, 0xbf, 0x85, 0x89, 0xc7, 0xe7, 0xb7, 0xf0, 0x9b, 0x45, 0x98, 0x49, 0x66, 0x19, + 0x1d, 0xa2, 0x27, 0x5f, 0xe8, 0xeb, 0xc9, 0x63, 0xde, 0x87, 0x14, 0x46, 0xbd, 0x0f, 0x19, 0x1f, + 0xf5, 0x3e, 0xa4, 0x78, 0x82, 0xfb, 0x90, 0xfe, 0xdb, 0x8c, 0x89, 0xa1, 0x6f, 0x33, 0x3e, 0xa5, + 0x5d, 0x3c, 0x27, 0x13, 0x2e, 0x40, 0xb1, 0x8b, 0x27, 0x49, 0x76, 0xc3, 0xb2, 0xdf, 0xcc, 0x74, + 0x95, 0x9d, 0x7a, 0x84, 0xdd, 0x37, 0xc8, 0xf4, 0xc8, 0x3c, 0xfe, 0x95, 0xeb, 0x13, 0xc7, 0xf0, + 0xc6, 0x7c, 0x19, 0xca, 0x72, 0x3c, 0x71, 0xe5, 0x1b, 0x92, 0x8a, 0x7b, 0x3d, 0x06, 0xa1, 0x89, + 0xc7, 0x06, 0x46, 0x37, 0x9e, 0x20, 0xfc, 0x66, 0xae, 0x9c, 0xbc, 0x99, 0xdb, 0x48, 0x82, 0x31, + 0x8d, 0x6f, 0x7f, 0x01, 0x2e, 0x64, 0x9a, 0x60, 0xb8, 0xf9, 0x9b, 0xeb, 0x85, 0xb4, 0x29, 0x11, + 0x0c, 0x31, 0x52, 0x8f, 0x8f, 0x2c, 0xdc, 0x1d, 0x88, 0x89, 0x47, 0x50, 0xb1, 0x7f, 0xbd, 0x00, + 0x33, 0xc9, 0x17, 0x68, 0xc9, 0x7d, 0x6d, 0xb0, 0xcd, 0xc5, 0x56, 0x2c, 0xc8, 0x1a, 0x99, 0x2b, + 0x07, 0x5e, 0xf4, 0xdc, 0xe7, 0xe3, 0x6b, 0x4b, 0xa7, 0xd1, 0x3c, 0x3d, 0xc6, 0xf2, 0x86, 0x45, + 0xb2, 0xe3, 0x8f, 0xcc, 0xc6, 0x41, 0xae, 0xf2, 0x1c, 0x9f, 0x3b, 0xf7, 0x38, 0x58, 0x53, 0xb3, + 0x42, 0x83, 0x2d, 0xdb, 0x5b, 0xf6, 0x68, 0xe0, 0x6e, 0xbb, 0xfa, 0xf5, 0x7c, 0xbe, 0x72, 0xbf, + 0x25, 0xcb, 0x50, 0x43, 0xed, 0xf7, 0xc6, 0xa0, 0xc4, 0x73, 0x72, 0x5d, 0x0f, 0xfc, 0x0e, 0x7f, + 0xa6, 0x31, 0x34, 0xce, 0x4c, 0xb2, 0xdb, 0x6e, 0x8e, 0xfa, 0x16, 0x6a, 0x4c, 0x51, 0xba, 0xdf, + 0x1b, 0x25, 0x98, 0xe0, 0x48, 0xba, 0x30, 0xb5, 0x2d, 0x73, 0x08, 0xcb, 0xbe, 0x1b, 0x31, 0x0f, + 0xa6, 0xca, 0x48, 0x2c, 0x9a, 0x40, 0xfd, 0x43, 0xcd, 0xc5, 0x76, 0x60, 0x36, 0x95, 0x54, 0x25, + 0xf7, 0xcc, 0xc3, 0xff, 0x73, 0x1c, 0x4a, 0x3a, 0xf6, 0x8b, 0x7c, 0x22, 0x61, 0xc0, 0x2a, 0xd5, + 0x3e, 0x6c, 0xbc, 0x21, 0xb6, 0xe3, 0x37, 0x1f, 0x1e, 0x54, 0x66, 0x35, 0x72, 0xca, 0x18, 0x75, + 0x11, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa1, 0xde, 0xc1, 0x35, 0x64, 0xe5, 0x66, 0xbc, 0x5a, 0xe1, + 0xb1, 0xc6, 0xab, 0xb1, 0x5d, 0x72, 0xcb, 0x6f, 0xee, 0xa7, 0xdf, 0x1c, 0xab, 0xf9, 0xcd, 0x7d, + 0xe4, 0x10, 0xf2, 0x1a, 0xcc, 0xc8, 0x20, 0x3c, 0xa5, 0xc4, 0x14, 0xb9, 0x9e, 0xaa, 0x1d, 0x17, + 0x36, 0x13, 0x50, 0x4c, 0x61, 0xb3, 0x5d, 0xf6, 0x5e, 0xe8, 0x7b, 0x3c, 0x9f, 0xf4, 0x44, 0xf2, + 0x96, 0xf3, 0x66, 0xfd, 0xf6, 0x2d, 0x6e, 0x48, 0xd3, 0x18, 0x89, 0x38, 0xbf, 0xc9, 0x47, 0xc6, + 0xf9, 0xad, 0x08, 0xda, 0x4c, 0x5a, 0xbe, 0xa3, 0x4c, 0xd7, 0xae, 0x28, 0xba, 0xac, 0xec, 0xe1, + 0xc1, 0x11, 0x46, 0x52, 0x5d, 0x33, 0x2b, 0x22, 0xb2, 0xf4, 0xe3, 0x8b, 0x88, 0xb4, 0xef, 0xc0, + 0x6c, 0xaa, 0xff, 0x94, 0x81, 0xc3, 0xca, 0x36, 0x70, 0x0c, 0xf7, 0x6a, 0xd9, 0x3f, 0xb5, 0xe0, + 0x6c, 0xdf, 0x8a, 0x34, 0x6c, 0x68, 0x6a, 0x7a, 0x6f, 0x1c, 0x3b, 0xf9, 0xde, 0x58, 0x38, 0xde, + 0xde, 0x58, 0xdb, 0xfa, 0xee, 0x0f, 0x2e, 0x7d, 0xe8, 0x7b, 0x3f, 0xb8, 0xf4, 0xa1, 0x3f, 0xf8, + 0xc1, 0xa5, 0x0f, 0xbd, 0x77, 0x78, 0xc9, 0xfa, 0xee, 0xe1, 0x25, 0xeb, 0x7b, 0x87, 0x97, 0xac, + 0x3f, 0x38, 0xbc, 0x64, 0xfd, 0xe7, 0xc3, 0x4b, 0xd6, 0xb7, 0xfe, 0xf8, 0xd2, 0x87, 0x3e, 0xfd, + 0xa9, 0xb8, 0xa7, 0x96, 0x54, 0x4f, 0xf1, 0x1f, 0x1f, 0x55, 0xfd, 0xb2, 0xd4, 0xdd, 0x6d, 0x2d, + 0xb1, 0x9e, 0x5a, 0xd2, 0x25, 0xaa, 0xa7, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0xcd, + 0x1f, 0xc0, 0x63, 0xa6, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -9125,6 +9126,11 @@ func (m *RolloutTrafficRouting) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.MaxTrafficWeight != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.MaxTrafficWeight)) + i-- + dAtA[i] = 0x58 + } if len(m.Plugins) > 0 { keysForPlugins := make([]string, 0, len(m.Plugins)) for k := range m.Plugins { @@ -12352,6 +12358,9 @@ func (m *RolloutTrafficRouting) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if m.MaxTrafficWeight != nil { + n += 1 + sovGenerated(uint64(*m.MaxTrafficWeight)) + } return n } @@ -14260,6 +14269,7 @@ func (this *RolloutTrafficRouting) String() string { `ManagedRoutes:` + repeatedStringForManagedRoutes + `,`, `Apisix:` + strings.Replace(this.Apisix.String(), "ApisixTrafficRouting", "ApisixTrafficRouting", 1) + `,`, `Plugins:` + mapStringForPlugins + `,`, + `MaxTrafficWeight:` + valueToStringGenerated(this.MaxTrafficWeight) + `,`, `}`, }, "") return s @@ -31598,6 +31608,26 @@ func (m *RolloutTrafficRouting) Unmarshal(dAtA []byte) error { } m.Plugins[mapkey] = ((encoding_json.RawMessage)(mapvalue)) iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxTrafficWeight", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxTrafficWeight = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 36eaf5f892..6e225848b9 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -1606,6 +1606,9 @@ message RolloutTrafficRouting { // +kubebuilder:validation:Type=object // Plugins holds specific configuration that traffic router plugins can use for routing traffic map plugins = 10; + + // MaxTrafficWeight The total weight of traffic. If unspecified, it defaults to 100 + optional int32 maxTrafficWeight = 11; } message RouteMatch { diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 4c70c15f08..1ccc09140f 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -4729,6 +4729,13 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutTrafficRouting(ref common.Referenc }, }, }, + "maxTrafficWeight": { + SchemaProps: spec.SchemaProps{ + Description: "MaxTrafficWeight The total weight of traffic. If unspecified, it defaults to 100", + Type: []string{"integer"}, + Format: "int32", + }, + }, }, }, }, diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index aedf8febca..32b8441689 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -379,11 +379,15 @@ type RolloutTrafficRouting struct { ManagedRoutes []MangedRoutes `json:"managedRoutes,omitempty" protobuf:"bytes,8,rep,name=managedRoutes"` // Apisix holds specific configuration to use Apisix to route traffic Apisix *ApisixTrafficRouting `json:"apisix,omitempty" protobuf:"bytes,9,opt,name=apisix"` + // +kubebuilder:validation:Schemaless // +kubebuilder:pruning:PreserveUnknownFields // +kubebuilder:validation:Type=object // Plugins holds specific configuration that traffic router plugins can use for routing traffic Plugins map[string]json.RawMessage `json:"plugins,omitempty" protobuf:"bytes,10,opt,name=plugins"` + + // MaxTrafficWeight The total weight of traffic. If unspecified, it defaults to 100 + MaxTrafficWeight *int32 `json:"maxTrafficWeight,omitempty" protobuf:"varint,11,opt,name=maxTrafficWeight"` } type MangedRoutes struct { diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index d8c859e20d..58d85887f3 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -2510,6 +2510,11 @@ func (in *RolloutTrafficRouting) DeepCopyInto(out *RolloutTrafficRouting) { (*out)[key] = outVal } } + if in.MaxTrafficWeight != nil { + in, out := &in.MaxTrafficWeight, &out.MaxTrafficWeight + *out = new(int32) + **out = **in + } return } diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 54a7336566..76ab8d6c66 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -20,6 +20,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" + "github.com/argoproj/argo-rollouts/utils/weightutil" ) const ( @@ -27,8 +28,8 @@ const ( // MissingFieldMessage the message to indicate rollout is missing a field MissingFieldMessage = "Rollout has missing field '%s'" - // InvalidSetWeightMessage indicates the setweight value needs to be between 0 and 100 - InvalidSetWeightMessage = "SetWeight needs to be between 0 and 100" + // InvalidSetWeightMessage indicates the setweight value needs to be between 0 and max weight + InvalidSetWeightMessage = "SetWeight needs to be between 0 and %d" // InvalidCanaryExperimentTemplateWeightWithoutTrafficRouting indicates experiment weight cannot be set without trafficRouting InvalidCanaryExperimentTemplateWeightWithoutTrafficRouting = "Experiment template weight cannot be set unless TrafficRouting is enabled" // InvalidSetCanaryScaleTrafficPolicy indicates that TrafficRouting, required for SetCanaryScale, is missing @@ -72,6 +73,8 @@ const ( InvalidCanaryDynamicStableScale = "Canary dynamicStableScale can only be used with traffic routing" // InvalidCanaryDynamicStableScaleWithScaleDownDelay indicates that canary.dynamicStableScale cannot be used with scaleDownDelaySeconds InvalidCanaryDynamicStableScaleWithScaleDownDelay = "Canary dynamicStableScale cannot be used with scaleDownDelaySeconds" + // InvalidCanaryMaxWeightOnlySupportInNginxAndPlugins indicates that canary.maxTrafficWeight cannot be used + InvalidCanaryMaxWeightOnlySupportInNginxAndPlugins = "Canary maxTrafficWeight in traffic routing only supported in Nginx and Plugins" // InvalidPingPongProvidedMessage indicates that both ping and pong service must be set to use Ping-Pong feature InvalidPingPongProvidedMessage = "Ping service and Pong service must to be set to use Ping-Pong feature" // DuplicatedPingPongServicesMessage indicates that the rollout uses the same service for the ping and pong services @@ -295,6 +298,12 @@ func ValidateRolloutStrategyCanary(rollout *v1alpha1.Rollout, fldPath *field.Pat if canary.ScaleDownDelaySeconds != nil && canary.DynamicStableScale { allErrs = append(allErrs, field.Invalid(fldPath.Child("dynamicStableScale"), canary.DynamicStableScale, InvalidCanaryDynamicStableScaleWithScaleDownDelay)) } + // only the nginx and plugin have this support for now + if canary.TrafficRouting.MaxTrafficWeight != nil { + if canary.TrafficRouting.Nginx == nil && len(canary.TrafficRouting.Plugins) == 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("trafficRouting").Child("maxTrafficWeight"), canary.TrafficRouting.MaxTrafficWeight, InvalidCanaryMaxWeightOnlySupportInNginxAndPlugins)) + } + } } for i, step := range canary.Steps { @@ -306,8 +315,11 @@ func ValidateRolloutStrategyCanary(rollout *v1alpha1.Rollout, fldPath *field.Pat step.Experiment == nil, step.Pause == nil, step.SetWeight == nil, step.Analysis == nil, step.SetCanaryScale == nil, step.SetHeaderRoute == nil, step.SetMirrorRoute == nil) allErrs = append(allErrs, field.Invalid(stepFldPath, errVal, InvalidStepMessage)) } - if step.SetWeight != nil && (*step.SetWeight < 0 || *step.SetWeight > 100) { - allErrs = append(allErrs, field.Invalid(stepFldPath.Child("setWeight"), *canary.Steps[i].SetWeight, InvalidSetWeightMessage)) + + maxTrafficWeight := weightutil.MaxTrafficWeight(rollout) + + if step.SetWeight != nil && (*step.SetWeight < 0 || *step.SetWeight > maxTrafficWeight) { + allErrs = append(allErrs, field.Invalid(stepFldPath.Child("setWeight"), *canary.Steps[i].SetWeight, fmt.Sprintf(InvalidSetWeightMessage, maxTrafficWeight))) } if step.Pause != nil && step.Pause.DurationSeconds() < 0 { allErrs = append(allErrs, field.Invalid(stepFldPath.Child("pause").Child("duration"), step.Pause.DurationSeconds(), InvalidDurationMessage)) diff --git a/pkg/apis/rollouts/validation/validation_test.go b/pkg/apis/rollouts/validation/validation_test.go index 28f17c6858..5d5c19be5e 100644 --- a/pkg/apis/rollouts/validation/validation_test.go +++ b/pkg/apis/rollouts/validation/validation_test.go @@ -397,7 +397,59 @@ func TestValidateRolloutStrategyCanary(t *testing.T) { invalidRo := ro.DeepCopy() invalidRo.Spec.Strategy.Canary.Steps[0].SetWeight = &setWeight allErrs := ValidateRolloutStrategyCanary(invalidRo, field.NewPath("")) - assert.Equal(t, InvalidSetWeightMessage, allErrs[0].Detail) + assert.Equal(t, fmt.Sprintf(InvalidSetWeightMessage, 100), allErrs[0].Detail) + }) + + t.Run("only nginx/plugins support max weight value", func(t *testing.T) { + anyWeight := int32(1) + + type testCases struct { + trafficRouting *v1alpha1.RolloutTrafficRouting + expectError bool + expectedError string + } + + testCasesList := []testCases{ + { + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{RootService: "root-service"}, + MaxTrafficWeight: &anyWeight, + }, + expectError: true, + expectedError: InvalidCanaryMaxWeightOnlySupportInNginxAndPlugins, + }, + { + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Nginx: &v1alpha1.NginxTrafficRouting{ + StableIngress: "stable-ingress", + }, + MaxTrafficWeight: &anyWeight, + }, + expectError: false, + }, + { + trafficRouting: &v1alpha1.RolloutTrafficRouting{ + Plugins: map[string]json.RawMessage{ + "anyplugin": []byte(`{"key": "value"}`), + }, + MaxTrafficWeight: &anyWeight, + }, + expectError: false, + }, + } + + for _, testCase := range testCasesList { + invalidRo := ro.DeepCopy() + invalidRo.Spec.Strategy.Canary.Steps[0].SetWeight = &anyWeight + invalidRo.Spec.Strategy.Canary.TrafficRouting = testCase.trafficRouting + allErrs := ValidateRolloutStrategyCanary(invalidRo, field.NewPath("")) + if !testCase.expectError { + assert.Empty(t, allErrs) + continue + } + + assert.Equal(t, testCase.expectedError, allErrs[0].Detail) + } }) t.Run("invalid duration set in paused step", func(t *testing.T) { diff --git a/pkg/kubectl-argo-rollouts/info/rollout_info.go b/pkg/kubectl-argo-rollouts/info/rollout_info.go index 8afc8cf02f..5732972852 100644 --- a/pkg/kubectl-argo-rollouts/info/rollout_info.go +++ b/pkg/kubectl-argo-rollouts/info/rollout_info.go @@ -14,6 +14,7 @@ import ( "github.com/argoproj/argo-rollouts/utils/defaults" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" + "github.com/argoproj/argo-rollouts/utils/weightutil" ) func NewRolloutInfo( @@ -58,12 +59,12 @@ func NewRolloutInfo( currentStep, _ := replicasetutil.GetCurrentCanaryStep(ro) if currentStep == nil { - roInfo.ActualWeight = "100" + roInfo.ActualWeight = fmt.Sprintf("%d", weightutil.MaxTrafficWeight(ro)) } else if ro.Status.AvailableReplicas > 0 { if ro.Spec.Strategy.Canary.TrafficRouting == nil { for _, rs := range roInfo.ReplicaSets { if rs.Canary { - roInfo.ActualWeight = fmt.Sprintf("%d", (rs.Available*100)/ro.Status.AvailableReplicas) + roInfo.ActualWeight = fmt.Sprintf("%d", (rs.Available*weightutil.MaxTrafficWeight(ro))/ro.Status.AvailableReplicas) } } } else { diff --git a/rollout/canary_test.go b/rollout/canary_test.go index d92cfd2c17..f89f47494f 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -24,6 +24,7 @@ import ( "github.com/argoproj/argo-rollouts/utils/annotations" "github.com/argoproj/argo-rollouts/utils/conditions" "github.com/argoproj/argo-rollouts/utils/hash" + ingressutil "github.com/argoproj/argo-rollouts/utils/ingress" logutil "github.com/argoproj/argo-rollouts/utils/log" "github.com/argoproj/argo-rollouts/utils/record" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" @@ -550,6 +551,92 @@ func TestCanaryRolloutCreateFirstReplicasetWithSteps(t *testing.T) { assert.JSONEq(t, calculatePatch(r, expectedPatch), patch) } +func TestCanaryRolloutWithMaxWeightInTrafficRouting(t *testing.T) { + testCases := []struct { + name string + maxWeight *int32 + setWeight int32 + expectedCreatedReplicas int32 + expectedUpdatedReplicas int32 + }{ + { + name: "max weight 100", + maxWeight: int32Ptr(100), + setWeight: 10, + expectedCreatedReplicas: 0, + expectedUpdatedReplicas: 1, + }, + { + name: "max weight 1000", + maxWeight: int32Ptr(1000), + setWeight: 200, + expectedCreatedReplicas: 0, + expectedUpdatedReplicas: 2, + }, + } + + for _, tc := range testCases { + f := newFixture(t) + defer f.Close() + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(tc.setWeight), + }} + r1 := newCanaryRollout("foo", 10, nil, steps, int32Ptr(0), intstr.FromInt(1), intstr.FromInt(0)) + + canarySVCName := "canary" + stableSVCName := "stable" + + ingressName := "ingress" + r1.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{ + MaxTrafficWeight: tc.maxWeight, + Nginx: &v1alpha1.NginxTrafficRouting{ + StableIngress: ingressName, + }, + } + r1.Spec.Strategy.Canary.StableService = stableSVCName + r1.Spec.Strategy.Canary.CanaryService = canarySVCName + r1.Status.StableRS = "895c6c4f9" + r2 := bumpVersion(r1) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + rs1 := newReplicaSetWithStatus(r1, 10, 10) + rs2 := newReplicaSetWithStatus(r2, 1, 0) + + stableSvc := newService(stableSVCName, 80, + map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]}, r1) + + canarySvc := newService(canarySVCName, 80, + map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]}, r1) + f.replicaSetLister = append(f.replicaSetLister, rs1) + + ing := newIngress(ingressName, canarySvc, stableSvc) + ing.Spec.Rules[0].HTTP.Paths[0].Backend.ServiceName = stableSVCName + f.kubeobjects = append(f.kubeobjects, rs1, canarySvc, stableSvc, ing) + f.serviceLister = append(f.serviceLister, canarySvc, stableSvc) + f.ingressLister = append(f.ingressLister, ingressutil.NewLegacyIngress(ing)) + + createdRSIndex := f.expectCreateReplicaSetAction(rs2) + updatedRSIndex := f.expectUpdateReplicaSetAction(rs2) + updatedRolloutIndex := f.expectUpdateRolloutStatusAction(r2) + f.expectPatchRolloutAction(r2) + f.run(getKey(r2, t)) + + createdRS := f.getCreatedReplicaSet(createdRSIndex) + assert.Equal(t, tc.expectedCreatedReplicas, *createdRS.Spec.Replicas) + updatedRS := f.getUpdatedReplicaSet(updatedRSIndex) + assert.Equal(t, tc.expectedUpdatedReplicas, *updatedRS.Spec.Replicas) + + updatedRollout := f.getUpdatedRollout(updatedRolloutIndex) + progressingCondition := conditions.GetRolloutCondition(updatedRollout.Status, v1alpha1.RolloutProgressing) + assert.NotNil(t, progressingCondition) + assert.Equal(t, conditions.NewReplicaSetReason, progressingCondition.Reason) + assert.Equal(t, corev1.ConditionTrue, progressingCondition.Status) + assert.Equal(t, fmt.Sprintf(conditions.NewReplicaSetMessage, createdRS.Name), progressingCondition.Message) + } + +} func TestCanaryRolloutCreateNewReplicaWithCorrectWeight(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index fe4f145ddd..55121ecc7f 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -26,6 +26,7 @@ import ( "github.com/argoproj/argo-rollouts/utils/record" replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" rolloututil "github.com/argoproj/argo-rollouts/utils/rollout" + "github.com/argoproj/argo-rollouts/utils/weightutil" ) // NewTrafficRoutingReconciler identifies return the TrafficRouting Plugin that the rollout wants to modify @@ -132,6 +133,7 @@ func (c *Controller) NewTrafficRoutingReconciler(roCtx *rolloutContext) ([]traff return nil, nil } +// this currently only be used in the canary strategy func (c *rolloutContext) reconcileTrafficRouting() error { reconcilers, err := c.newTrafficRoutingReconciler(c) // a return here does ensure that all trafficReconcilers are healthy @@ -201,7 +203,7 @@ func (c *rolloutContext) reconcileTrafficRouting() error { // But we can only increase canary weight according to available replica counts of the canary. // we will need to set the desiredWeight to 0 when the newRS is not available. if c.rollout.Spec.Strategy.Canary.DynamicStableScale { - desiredWeight = (100 * c.newRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas + desiredWeight = (weightutil.MaxTrafficWeight(c.rollout) * c.newRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas } else if c.rollout.Status.Canary.Weights != nil { desiredWeight = c.rollout.Status.Canary.Weights.Canary.Weight } @@ -229,7 +231,7 @@ func (c *rolloutContext) reconcileTrafficRouting() error { desiredWeight = replicasetutil.GetCurrentSetWeight(c.rollout) weightDestinations = append(weightDestinations, c.calculateWeightDestinationsFromExperiment()...) } else { - desiredWeight = 100 + desiredWeight = weightutil.MaxTrafficWeight(c.rollout) } } // We need to check for revision > 1 because when we first install the rollout we run step 0 this prevents that. @@ -303,7 +305,7 @@ func (c *rolloutContext) calculateDesiredWeightOnAbortOrStableRollback() int32 { } // When using dynamic stable scaling, we must dynamically decreasing the weight to the canary // according to the availability of the stable (whatever it can support). - desiredWeight := 100 - ((100 * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) + desiredWeight := weightutil.MaxTrafficWeight(c.rollout) - ((weightutil.MaxTrafficWeight(c.rollout) * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) if c.rollout.Status.Canary.Weights != nil { // This ensures that if we are already at a lower weight, then we will not // increase the weight because stable availability is flapping (e.g. pod restarts) @@ -336,7 +338,7 @@ func calculateWeightStatus(ro *v1alpha1.Rollout, canaryHash, stableHash string, ServiceName: ro.Spec.Strategy.Canary.CanaryService, }, } - stableWeight := 100 - desiredWeight + stableWeight := weightutil.MaxTrafficWeight(ro) - desiredWeight for _, weightDest := range weightDestinations { weights.Additional = append(weights.Additional, weightDest) stableWeight -= weightDest.Weight diff --git a/rollout/trafficrouting/nginx/nginx.go b/rollout/trafficrouting/nginx/nginx.go index 3d56c55f6a..649931c258 100644 --- a/rollout/trafficrouting/nginx/nginx.go +++ b/rollout/trafficrouting/nginx/nginx.go @@ -133,6 +133,10 @@ func (r *Reconciler) buildCanaryIngress(stableIngress *networkingv1.Ingress, nam desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary", annotationPrefix)] = "true" desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary-weight", annotationPrefix)] = fmt.Sprintf("%d", desiredWeight) + if r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight != nil { + weightTotal := *r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight + desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary-weight-total", annotationPrefix)] = fmt.Sprintf("%d", weightTotal) + } return ingressutil.NewIngress(desiredCanaryIngress), nil } @@ -209,6 +213,10 @@ func (r *Reconciler) buildLegacyCanaryIngress(stableIngress *extensionsv1beta1.I desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary", annotationPrefix)] = "true" desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary-weight", annotationPrefix)] = fmt.Sprintf("%d", desiredWeight) + if r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight != nil { + weightTotal := *r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight + desiredCanaryIngress.Annotations[fmt.Sprintf("%s/canary-weight-total", annotationPrefix)] = fmt.Sprintf("%d", weightTotal) + } return ingressutil.NewLegacyIngress(desiredCanaryIngress), nil } diff --git a/rollout/trafficrouting/nginx/nginx_test.go b/rollout/trafficrouting/nginx/nginx_test.go index 2be80fa23a..c3b4ce357a 100644 --- a/rollout/trafficrouting/nginx/nginx_test.go +++ b/rollout/trafficrouting/nginx/nginx_test.go @@ -574,6 +574,52 @@ func TestCanaryIngressAdditionalAnnotations(t *testing.T) { } } +func TestCanaryIngressMaxWeightInTrafficRouting(t *testing.T) { + maxWeights := []*int32{nil, pointer.Int32(1000)} + for _, maxWeight := range maxWeights { + tests := generateMultiIngressTestData() + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + r := Reconciler{ + cfg: ReconcilerConfig{ + Rollout: fakeRollout(stableService, canaryService, test.singleIngress, test.multiIngress), + }, + } + r.cfg.Rollout.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight = maxWeight + for _, ing := range test.ingresses { + stable := extensionsIngress(ing, 80, stableService) + canary := extensionsIngress("canary-ingress", 80, canaryService) + canary.SetAnnotations(map[string]string{ + "nginx.ingress.kubernetes.io/canary": "true", + "nginx.ingress.kubernetes.io/canary-weight": "10", + }) + stableIngress := ingressutil.NewLegacyIngress(stable) + canaryIngress := ingressutil.NewLegacyIngress(canary) + + desiredCanaryIngress, err := r.canaryIngress(stableIngress, ingressutil.GetCanaryIngressName(r.cfg.Rollout.GetName(), ing), 15) + assert.Nil(t, err, "No error returned when calling canaryIngress") + + checkBackendService(t, desiredCanaryIngress, canaryService) + + patch, modified, err := ingressutil.BuildIngressPatch(canaryIngress.Mode(), canaryIngress, desiredCanaryIngress, + ingressutil.WithAnnotations(), ingressutil.WithLabels(), ingressutil.WithSpec()) + assert.Nil(t, err, "compareCanaryIngresses returns no error") + assert.True(t, modified, "compareCanaryIngresses returns modified=true") + if maxWeight == nil { + assert.Equal(t, + "{\"metadata\":{\"annotations\":{\"nginx.ingress.kubernetes.io/canary-weight\":\"15\"}}}", string(patch), "compareCanaryIngresses returns expected patch") + } else { + assert.Equal(t, + fmt.Sprintf("{\"metadata\":{\"annotations\":{\"nginx.ingress.kubernetes.io/canary-weight\":\"15\",\"nginx.ingress.kubernetes.io/canary-weight-total\":\"%d\"}}}", *maxWeight), + string(patch), "compareCanaryIngresses returns expected patch") + } + } + }) + } + } + +} + func TestReconciler_canaryIngress(t *testing.T) { tests := generateMultiIngressTestData() for _, test := range tests { diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index cf9a9cdfc5..2e657d455e 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -2495,6 +2495,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutTraf * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutTrafficRouting */ plugins?: { [key: string]: string; }; + /** + * + * @type {number} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutTrafficRouting + */ + maxTrafficWeight?: number; } /** * diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index d38a5d23a7..89ba648cf2 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -10,6 +10,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" + "github.com/argoproj/argo-rollouts/utils/weightutil" ) const ( @@ -56,7 +57,7 @@ func AtDesiredReplicaCountsForCanary(ro *v1alpha1.Rollout, newRS, stableRS *apps // when using the basic canary strategy. The function calculates the desired number of replicas for // the new and stable RS using the following equations: // -// desired newRS Replica count = spec.Replica * (setweight / 100) +// desired newRS Replica count = spec.Replica * (setweight / maxweight) // desired stableRS Replica count = spec.Replica - newRS // // The function for newRS finds the closest whole number of replicas based on the weight percentage @@ -92,8 +93,9 @@ func CalculateReplicaCountsForBasicCanary(rollout *v1alpha1.Rollout, newRS *apps rolloutSpecReplica := defaults.GetReplicasOrDefault(rollout.Spec.Replicas) _, desiredWeight := GetCanaryReplicasOrWeight(rollout) maxSurge := MaxSurge(rollout) + maxWeight := weightutil.MaxTrafficWeight(rollout) - desiredNewRSReplicaCount, desiredStableRSReplicaCount := approximateWeightedCanaryStableReplicaCounts(rolloutSpecReplica, desiredWeight, maxSurge) + desiredNewRSReplicaCount, desiredStableRSReplicaCount := approximateWeightedCanaryStableReplicaCounts(rolloutSpecReplica, desiredWeight, maxWeight, maxSurge) stableRSReplicaCount := int32(0) newRSReplicaCount := int32(0) @@ -181,7 +183,7 @@ func CalculateReplicaCountsForBasicCanary(rollout *v1alpha1.Rollout, newRS *apps // canary/stable replica counts might sum to either spec.replicas or spec.replicas + 1 but will not // exceed spec.replicas if maxSurge is 0. If the canary weight is between 1-99, and spec.replicas is > 1, // we will always return a minimum of 1 for stable and canary as to not return 0. -func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, maxSurge int32) (int32, int32) { +func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, maxWeight, maxSurge int32) (int32, int32) { if specReplicas == 0 { return 0, 0 } @@ -193,14 +195,14 @@ func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, m } var options []canaryOption - ceilWeightedCanaryCount := int32(math.Ceil(float64(specReplicas*desiredWeight) / 100.0)) - floorWeightedCanaryCount := int32(math.Floor(float64(specReplicas*desiredWeight) / 100.0)) + ceilWeightedCanaryCount := int32(math.Ceil(float64(specReplicas*desiredWeight) / float64(maxWeight))) + floorWeightedCanaryCount := int32(math.Floor(float64(specReplicas*desiredWeight) / float64(maxWeight))) - tied := floorCeilingTied(desiredWeight, specReplicas) + tied := floorCeilingTied(desiredWeight, maxWeight, specReplicas) // zeroAllowed indicates if are allowed to return the floored value if it is zero. We don't allow // the value to be zero if when user has a weight from 1-99, and they run 2+ replicas (surge included) - zeroAllowed := desiredWeight == 100 || desiredWeight == 0 || (specReplicas == 1 && maxSurge == 0) + zeroAllowed := desiredWeight == (maxWeight) || desiredWeight == 0 || (specReplicas == 1 && maxSurge == 0) if ceilWeightedCanaryCount < specReplicas || zeroAllowed { options = append(options, canaryOption{ceilWeightedCanaryCount, specReplicas}) @@ -214,7 +216,7 @@ func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, m // in order to achieve a closer canary weight if maxSurge > 0 { options = append(options, canaryOption{ceilWeightedCanaryCount, specReplicas + 1}) - surgeIsTied := floorCeilingTied(desiredWeight, specReplicas+1) + surgeIsTied := floorCeilingTied(desiredWeight, maxWeight, specReplicas+1) if !surgeIsTied && (floorWeightedCanaryCount != 0 || zeroAllowed) { options = append(options, canaryOption{floorWeightedCanaryCount, specReplicas + 1}) } @@ -226,10 +228,10 @@ func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, m } bestOption := options[0] - bestDelta := weightDelta(desiredWeight, bestOption.canary, bestOption.total) + bestDelta := weightDelta(desiredWeight, maxWeight, bestOption.canary, bestOption.total) for i := 1; i < len(options); i++ { currOption := options[i] - currDelta := weightDelta(desiredWeight, currOption.canary, currOption.total) + currDelta := weightDelta(desiredWeight, maxWeight, currOption.canary, currOption.total) if currDelta < bestDelta { bestOption = currOption bestDelta = currDelta @@ -242,15 +244,15 @@ func approximateWeightedCanaryStableReplicaCounts(specReplicas, desiredWeight, m // For example: replicas: 3, desiredWeight: 50% // A canary count of 1 (33.33%) or 2 (66.66%) are both equidistant from desired weight of 50%. // When this happens, we will pick the larger canary count -func floorCeilingTied(desiredWeight, totalReplicas int32) bool { - _, frac := math.Modf(float64(totalReplicas) * (float64(desiredWeight) / 100)) +func floorCeilingTied(desiredWeight, maxWeight, totalReplicas int32) bool { + _, frac := math.Modf(float64(totalReplicas) * (float64(desiredWeight) / float64(maxWeight))) return frac == 0.5 } // weightDelta calculates the difference that the canary replicas will be from the desired weight // This is used to pick the closest approximation of canary counts. -func weightDelta(desiredWeight, canaryReplicas, totalReplicas int32) float64 { - actualWeight := float64(canaryReplicas*100) / float64(totalReplicas) +func weightDelta(desiredWeight, maxWeight, canaryReplicas, totalReplicas int32) float64 { + actualWeight := float64(canaryReplicas*maxWeight) / float64(totalReplicas) return math.Abs(actualWeight - float64(desiredWeight)) } @@ -338,11 +340,12 @@ func CalculateReplicaCountsForTrafficRoutedCanary(rollout *v1alpha1.Rollout, wei var canaryCount, stableCount int32 rolloutSpecReplica := defaults.GetReplicasOrDefault(rollout.Spec.Replicas) setCanaryScaleReplicas, desiredWeight := GetCanaryReplicasOrWeight(rollout) + maxWeight := weightutil.MaxTrafficWeight(rollout) if setCanaryScaleReplicas != nil { // a canary count was explicitly set canaryCount = *setCanaryScaleReplicas } else { - canaryCount = CheckMinPodsPerReplicaSet(rollout, trafficWeightToReplicas(rolloutSpecReplica, desiredWeight)) + canaryCount = CheckMinPodsPerReplicaSet(rollout, trafficWeightToReplicas(rolloutSpecReplica, desiredWeight, maxWeight)) } if !rollout.Spec.Strategy.Canary.DynamicStableScale { @@ -358,9 +361,10 @@ func CalculateReplicaCountsForTrafficRoutedCanary(rollout *v1alpha1.Rollout, wei // high, until we reduce traffic to it. // Case 2 occurs when we are going from high to low canary weight. In this scenario, // we need to increase the stable scale in preparation for increase of traffic to stable. - stableCount = trafficWeightToReplicas(rolloutSpecReplica, 100-desiredWeight) + // TODO calculate the replica set count from the max traffic weight. + stableCount = trafficWeightToReplicas(rolloutSpecReplica, maxWeight-desiredWeight, maxWeight) if weights != nil { - actualStableWeightReplicaCount := trafficWeightToReplicas(rolloutSpecReplica, weights.Stable.Weight) + actualStableWeightReplicaCount := trafficWeightToReplicas(rolloutSpecReplica, weights.Stable.Weight, maxWeight) stableCount = max(stableCount, actualStableWeightReplicaCount) if rollout.Status.Abort { @@ -369,7 +373,7 @@ func CalculateReplicaCountsForTrafficRoutedCanary(rollout *v1alpha1.Rollout, wei // 1. actual canary traffic weight // 2. desired canary traffic weight // This if block makes sure we don't scale down the canary prematurely - trafficWeightReplicaCount := trafficWeightToReplicas(rolloutSpecReplica, weights.Canary.Weight) + trafficWeightReplicaCount := trafficWeightToReplicas(rolloutSpecReplica, weights.Canary.Weight, maxWeight) canaryCount = max(trafficWeightReplicaCount, canaryCount) } } @@ -378,8 +382,8 @@ func CalculateReplicaCountsForTrafficRoutedCanary(rollout *v1alpha1.Rollout, wei // trafficWeightToReplicas returns the appropriate replicas given the full spec.replicas and a weight // Rounds up if not evenly divisible. -func trafficWeightToReplicas(replicas, weight int32) int32 { - return int32(math.Ceil(float64(weight*replicas) / 100)) +func trafficWeightToReplicas(replicas, weight, maxWeight int32) int32 { + return int32(math.Ceil(float64(weight*replicas) / float64(maxWeight))) } func max(left, right int32) int32 { @@ -460,7 +464,7 @@ func GetCurrentCanaryStep(rollout *v1alpha1.Rollout) (*v1alpha1.CanaryStep, *int // GetCanaryReplicasOrWeight either returns a static set of replicas or a weight percentage func GetCanaryReplicasOrWeight(rollout *v1alpha1.Rollout) (*int32, int32) { if rollout.Status.PromoteFull || rollout.Status.StableRS == "" || rollout.Status.CurrentPodHash == rollout.Status.StableRS { - return nil, 100 + return nil, weightutil.MaxTrafficWeight(rollout) } if scs := UseSetCanaryScale(rollout); scs != nil { if scs.Replicas != nil { @@ -481,7 +485,7 @@ func GetCurrentSetWeight(rollout *v1alpha1.Rollout) int32 { } currentStep, currentStepIndex := GetCurrentCanaryStep(rollout) if currentStep == nil { - return 100 + return weightutil.MaxTrafficWeight(rollout) } for i := *currentStepIndex; i >= 0; i-- { diff --git a/utils/replicaset/canary_test.go b/utils/replicaset/canary_test.go index ed4f78697a..d1d49072e8 100755 --- a/utils/replicaset/canary_test.go +++ b/utils/replicaset/canary_test.go @@ -769,82 +769,83 @@ func TestApproximateWeightedNewStableReplicaCounts(t *testing.T) { tests := []struct { replicas int32 weight int32 + maxWeight int32 maxSurge int32 expCanary int32 expStable int32 }{ - {replicas: 0, weight: 0, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% - {replicas: 0, weight: 50, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% - {replicas: 0, weight: 100, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% - - {replicas: 0, weight: 0, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% - {replicas: 0, weight: 50, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% - {replicas: 0, weight: 100, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% - - {replicas: 1, weight: 0, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% - {replicas: 1, weight: 1, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% - {replicas: 1, weight: 49, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% - {replicas: 1, weight: 50, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% - {replicas: 1, weight: 99, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% - {replicas: 1, weight: 100, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% - - {replicas: 1, weight: 0, maxSurge: 1, expCanary: 0, expStable: 1}, // 0% - {replicas: 1, weight: 1, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% - {replicas: 1, weight: 49, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% - {replicas: 1, weight: 50, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% - {replicas: 1, weight: 99, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% - {replicas: 1, weight: 100, maxSurge: 1, expCanary: 1, expStable: 0}, // 100% - - {replicas: 2, weight: 0, maxSurge: 0, expCanary: 0, expStable: 2}, // 0% - {replicas: 2, weight: 1, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% - {replicas: 2, weight: 50, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% - {replicas: 2, weight: 99, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% - {replicas: 2, weight: 100, maxSurge: 0, expCanary: 2, expStable: 0}, // 100% - - {replicas: 2, weight: 0, maxSurge: 1, expCanary: 0, expStable: 2}, // 0% - {replicas: 2, weight: 1, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 2, weight: 50, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% - {replicas: 2, weight: 99, maxSurge: 1, expCanary: 2, expStable: 1}, // 66.6% - {replicas: 2, weight: 100, maxSurge: 1, expCanary: 2, expStable: 0}, // 100% - - {replicas: 3, weight: 10, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 25, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 33, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 34, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 49, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 50, maxSurge: 0, expCanary: 2, expStable: 1}, // 66.6% - - {replicas: 3, weight: 10, maxSurge: 1, expCanary: 1, expStable: 3}, // 25% - {replicas: 3, weight: 25, maxSurge: 1, expCanary: 1, expStable: 3}, // 25% - {replicas: 3, weight: 33, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 34, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% - {replicas: 3, weight: 49, maxSurge: 1, expCanary: 2, expStable: 2}, // 50% - {replicas: 3, weight: 50, maxSurge: 1, expCanary: 2, expStable: 2}, // 50% - - {replicas: 10, weight: 0, maxSurge: 1, expCanary: 0, expStable: 10}, // 0% - {replicas: 10, weight: 1, maxSurge: 0, expCanary: 1, expStable: 9}, // 10% - {replicas: 10, weight: 14, maxSurge: 0, expCanary: 1, expStable: 9}, // 10% - {replicas: 10, weight: 15, maxSurge: 0, expCanary: 2, expStable: 8}, // 20% - {replicas: 10, weight: 16, maxSurge: 0, expCanary: 2, expStable: 8}, // 20% - {replicas: 10, weight: 99, maxSurge: 0, expCanary: 9, expStable: 1}, // 90% - {replicas: 10, weight: 100, maxSurge: 1, expCanary: 10, expStable: 0}, // 100% - - {replicas: 10, weight: 0, maxSurge: 1, expCanary: 0, expStable: 10}, // 0% - {replicas: 10, weight: 1, maxSurge: 1, expCanary: 1, expStable: 10}, // 9.1% - {replicas: 10, weight: 18, maxSurge: 1, expCanary: 2, expStable: 9}, // 18.1% - {replicas: 10, weight: 19, maxSurge: 1, expCanary: 2, expStable: 9}, // 18.1% - {replicas: 10, weight: 20, maxSurge: 1, expCanary: 2, expStable: 8}, // 20% - {replicas: 10, weight: 23, maxSurge: 1, expCanary: 2, expStable: 8}, // 20% - {replicas: 10, weight: 24, maxSurge: 1, expCanary: 3, expStable: 8}, // 27.2% - {replicas: 10, weight: 25, maxSurge: 1, expCanary: 3, expStable: 8}, // 27.2% - {replicas: 10, weight: 99, maxSurge: 1, expCanary: 10, expStable: 1}, // 90.9% - {replicas: 10, weight: 100, maxSurge: 1, expCanary: 10, expStable: 0}, // 100% + {replicas: 0, weight: 0, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% + {replicas: 0, weight: 50, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% + {replicas: 0, weight: 100, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 0}, // 0% + + {replicas: 0, weight: 0, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% + {replicas: 0, weight: 50, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% + {replicas: 0, weight: 100, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 0}, // 0% + + {replicas: 1, weight: 0, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% + {replicas: 1, weight: 1, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% + {replicas: 1, weight: 49, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 1}, // 0% + {replicas: 1, weight: 50, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% + {replicas: 1, weight: 99, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% + {replicas: 1, weight: 100, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 0}, // 100% + + {replicas: 1, weight: 0, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 1}, // 0% + {replicas: 1, weight: 1, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% + {replicas: 1, weight: 49, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% + {replicas: 1, weight: 50, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% + {replicas: 1, weight: 99, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% + {replicas: 1, weight: 100, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 0}, // 100% + + {replicas: 2, weight: 0, maxWeight: 100, maxSurge: 0, expCanary: 0, expStable: 2}, // 0% + {replicas: 2, weight: 1, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% + {replicas: 2, weight: 50, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% + {replicas: 2, weight: 99, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 1}, // 50% + {replicas: 2, weight: 100, maxWeight: 100, maxSurge: 0, expCanary: 2, expStable: 0}, // 100% + + {replicas: 2, weight: 0, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 2}, // 0% + {replicas: 2, weight: 1, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 2, weight: 50, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 1}, // 50% + {replicas: 2, weight: 99, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 1}, // 66.6% + {replicas: 2, weight: 100, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 0}, // 100% + + {replicas: 3, weight: 10, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 25, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 33, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 34, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 49, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 50, maxWeight: 100, maxSurge: 0, expCanary: 2, expStable: 1}, // 66.6% + + {replicas: 3, weight: 10, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 3}, // 25% + {replicas: 3, weight: 25, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 3}, // 25% + {replicas: 3, weight: 33, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 34, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 2}, // 33.3% + {replicas: 3, weight: 49, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 2}, // 50% + {replicas: 3, weight: 50, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 2}, // 50% + + {replicas: 10, weight: 0, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 10}, // 0% + {replicas: 10, weight: 1, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 9}, // 10% + {replicas: 10, weight: 14, maxWeight: 100, maxSurge: 0, expCanary: 1, expStable: 9}, // 10% + {replicas: 10, weight: 15, maxWeight: 100, maxSurge: 0, expCanary: 2, expStable: 8}, // 20% + {replicas: 10, weight: 16, maxWeight: 100, maxSurge: 0, expCanary: 2, expStable: 8}, // 20% + {replicas: 10, weight: 99, maxWeight: 100, maxSurge: 0, expCanary: 9, expStable: 1}, // 90% + {replicas: 10, weight: 100, maxWeight: 100, maxSurge: 1, expCanary: 10, expStable: 0}, // 100% + + {replicas: 10, weight: 0, maxWeight: 100, maxSurge: 1, expCanary: 0, expStable: 10}, // 0% + {replicas: 10, weight: 1, maxWeight: 100, maxSurge: 1, expCanary: 1, expStable: 10}, // 9.1% + {replicas: 10, weight: 18, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 9}, // 18.1% + {replicas: 10, weight: 19, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 9}, // 18.1% + {replicas: 10, weight: 20, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 8}, // 20% + {replicas: 10, weight: 23, maxWeight: 100, maxSurge: 1, expCanary: 2, expStable: 8}, // 20% + {replicas: 10, weight: 24, maxWeight: 100, maxSurge: 1, expCanary: 3, expStable: 8}, // 27.2% + {replicas: 10, weight: 25, maxWeight: 100, maxSurge: 1, expCanary: 3, expStable: 8}, // 27.2% + {replicas: 10, weight: 99, maxWeight: 100, maxSurge: 1, expCanary: 10, expStable: 1}, // 90.9% + {replicas: 10, weight: 100, maxWeight: 100, maxSurge: 1, expCanary: 10, expStable: 0}, // 100% } for i := range tests { test := tests[i] - t.Run(fmt.Sprintf("%s_replicas:%d_weight:%d_surge:%d", t.Name(), test.replicas, test.weight, test.maxSurge), func(t *testing.T) { - newRSReplicaCount, stableRSReplicaCount := approximateWeightedCanaryStableReplicaCounts(test.replicas, test.weight, test.maxSurge) + t.Run(fmt.Sprintf("%s_replicas:%d_weight:%d_maxweight:%d_surge:%d", t.Name(), test.replicas, test.weight, test.maxWeight, test.maxSurge), func(t *testing.T) { + newRSReplicaCount, stableRSReplicaCount := approximateWeightedCanaryStableReplicaCounts(test.replicas, test.weight, test.maxWeight, test.maxSurge) assert.Equal(t, test.expCanary, newRSReplicaCount, "check canary replica count") assert.Equal(t, test.expStable, stableRSReplicaCount, "check stable replica count") }) @@ -953,12 +954,12 @@ func TestCalculateReplicaCountsForCanaryStableRSdEdgeCases(t *testing.T) { } func TestTrafficWeightToReplicas(t *testing.T) { - assert.Equal(t, int32(0), trafficWeightToReplicas(10, 0)) - assert.Equal(t, int32(2), trafficWeightToReplicas(10, 20)) - assert.Equal(t, int32(3), trafficWeightToReplicas(10, 25)) - assert.Equal(t, int32(4), trafficWeightToReplicas(10, 33)) - assert.Equal(t, int32(10), trafficWeightToReplicas(10, 99)) - assert.Equal(t, int32(10), trafficWeightToReplicas(10, 100)) + assert.Equal(t, int32(0), trafficWeightToReplicas(10, 0, 100)) + assert.Equal(t, int32(2), trafficWeightToReplicas(10, 20, 100)) + assert.Equal(t, int32(3), trafficWeightToReplicas(10, 25, 100)) + assert.Equal(t, int32(4), trafficWeightToReplicas(10, 33, 100)) + assert.Equal(t, int32(10), trafficWeightToReplicas(10, 99, 100)) + assert.Equal(t, int32(10), trafficWeightToReplicas(10, 100, 100)) } func TestGetOtherRSs(t *testing.T) { diff --git a/utils/weightutil/weight.go b/utils/weightutil/weight.go new file mode 100644 index 0000000000..357a5fdcd3 --- /dev/null +++ b/utils/weightutil/weight.go @@ -0,0 +1,13 @@ +package weightutil + +import ( + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" +) + +func MaxTrafficWeight(ro *v1alpha1.Rollout) int32 { + maxWeight := int32(100) + if ro.Spec.Strategy.Canary != nil && ro.Spec.Strategy.Canary.TrafficRouting != nil && ro.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight != nil { + maxWeight = *ro.Spec.Strategy.Canary.TrafficRouting.MaxTrafficWeight + } + return maxWeight +} From 305ad13909cfc72c30e0e9646aed8b9f7442f05a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 08:54:00 -0600 Subject: [PATCH 211/264] chore(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 (#3426) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.62.0 to 1.62.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.62.0...v1.62.1) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a46a4430a6..2a2575d20f 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/valyala/fasttemplate v1.2.2 golang.org/x/oauth2 v0.17.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 - google.golang.org/grpc v1.62.0 + google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 diff --git a/go.sum b/go.sum index e40bc67c4f..1ce6a216b4 100644 --- a/go.sum +++ b/go.sum @@ -1051,8 +1051,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= -google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From ad0b7fe6ee1119a4304348a4286f5958ec5907bb Mon Sep 17 00:00:00 2001 From: Craig Newton Date: Wed, 6 Mar 2024 15:56:06 +0100 Subject: [PATCH 212/264] chore: fix PodSecurity warning (#3424) Signed-off-by: Craig Newton --- manifests/base/argo-rollouts-deployment.yaml | 8 ++++++++ manifests/install.yaml | 8 ++++++++ manifests/namespace-install.yaml | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/manifests/base/argo-rollouts-deployment.yaml b/manifests/base/argo-rollouts-deployment.yaml index 57f4b516a0..046a1a0bba 100644 --- a/manifests/base/argo-rollouts-deployment.yaml +++ b/manifests/base/argo-rollouts-deployment.yaml @@ -44,6 +44,14 @@ spec: failureThreshold: 3 successThreshold: 1 timeoutSeconds: 4 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault securityContext: runAsNonRoot: true strategy: diff --git a/manifests/install.yaml b/manifests/install.yaml index 76d66f32d5..289428bffd 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -16054,6 +16054,14 @@ spec: periodSeconds: 5 successThreshold: 1 timeoutSeconds: 4 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault securityContext: runAsNonRoot: true serviceAccountName: argo-rollouts diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 08637705cb..0a7adf80ed 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -413,6 +413,14 @@ spec: periodSeconds: 5 successThreshold: 1 timeoutSeconds: 4 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + seccompProfile: + type: RuntimeDefault securityContext: runAsNonRoot: true serviceAccountName: argo-rollouts From e18495782e24acef064dd725506edca99a2e3f6b Mon Sep 17 00:00:00 2001 From: Yohan Belval Date: Wed, 6 Mar 2024 10:01:12 -0500 Subject: [PATCH 213/264] fix(controller): don't timeout rollout when still waiting for scale down delay (#3417) Signed-off-by: Yohan Belval --- rollout/sync.go | 16 +++++++++++++++- test/e2e/canary_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/rollout/sync.go b/rollout/sync.go index 167430a702..875949ee55 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -578,6 +578,19 @@ func isIndefiniteStep(r *v1alpha1.Rollout) bool { return false } +// isWaitingForReplicaSetScaleDown returns whether or not the rollout still has other replica sets with a scale down deadline annotation +func isWaitingForReplicaSetScaleDown(r *v1alpha1.Rollout, newRS, stableRS *appsv1.ReplicaSet, allRSs []*appsv1.ReplicaSet) bool { + otherRSs := replicasetutil.GetOtherRSs(r, newRS, stableRS, allRSs) + + for _, rs := range otherRSs { + if replicasetutil.HasScaleDownDeadline(rs) { + return true + } + } + + return false +} + func (c *rolloutContext) calculateRolloutConditions(newStatus v1alpha1.RolloutStatus) v1alpha1.RolloutStatus { isPaused := len(c.rollout.Status.PauseConditions) > 0 || c.rollout.Spec.Paused isAborted := c.pauseContext.IsAborted() @@ -663,7 +676,8 @@ func (c *rolloutContext) calculateRolloutConditions(newStatus v1alpha1.RolloutSt conditions.RemoveRolloutCondition(&newStatus, v1alpha1.RolloutProgressing) } conditions.SetRolloutCondition(&newStatus, *condition) - case !isIndefiniteStep(c.rollout) && conditions.RolloutTimedOut(c.rollout, &newStatus): + case !isIndefiniteStep(c.rollout) && !isWaitingForReplicaSetScaleDown(c.rollout, c.newRS, c.stableRS, c.allRSs) && conditions.RolloutTimedOut(c.rollout, &newStatus): + // Update the rollout with a timeout condition. If the condition already exists, // we ignore this update. msg := fmt.Sprintf(conditions.RolloutTimeOutMessage, c.rollout.Name) diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index d42abb6a79..2c68ec8bd7 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -465,6 +465,31 @@ spec: WaitForRolloutStatus("Healthy") } +// TestCanaryScaleDownDelayWithProgressDeadline verifies that a rollout with a pending scale down doesn't trigger a ProgressDeadlineExceeded event and renders the rollout degraded +func (s *CanarySuite) TestCanaryScaleDownDelayWithProgressDeadline() { + s.Given(). + HealthyRollout(`@functional/canary-scaledowndelay.yaml`). + When(). + UpdateSpec(` +spec: + progressDeadlineSeconds: 5`). + Then(). + When(). + UpdateSpec(` +spec: + template: + metadata: + annotations: + rev: two`). // update to revision 2 + WaitForRolloutStatus("Healthy"). + Sleep(10 * time.Second). // sleep > progressDeadlineSeconds + Then(). + Assert(func(t *fixtures.Then) { + status := string(t.GetRollout().Status.Phase) + assert.Equal(s.T(), "Healthy", status) + }) +} + // TestCanaryScaleDownDelay verifies canary uses a scaleDownDelay when traffic routing is used, // and verifies the annotation is properly managed func (s *CanarySuite) TestCanaryScaleDownDelay() { From a9a519221aecfd0e1b19708f0ece2bed8380240e Mon Sep 17 00:00:00 2001 From: Carlos Sanchez Date: Fri, 8 Mar 2024 20:04:54 +0000 Subject: [PATCH 214/264] docs: minor readability on migration (#3427) the ordered list was 1-2-3-1 fixed the indentation Signed-off-by: Carlos Sanchez --- docs/migrating.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/migrating.md b/docs/migrating.md index 3e1f85c461..524b67444d 100644 --- a/docs/migrating.md +++ b/docs/migrating.md @@ -55,10 +55,11 @@ Instead of removing Deployment you can scale it down to zero and reference it fr 1. Create a Rollout resource. 1. Reference an existing Deployment using `workloadRef` field. 1. In the `workloadRef` field set the `scaleDown` attribute, which specifies how the Deployment should be scaled down. There are three options available: -* "never": the Deployment is not scaled down -* "onsuccess": the Deployment is scaled down after the Rollout becomes healthy -* "progressively": as the Rollout is scaled up the Deployment is scaled down. -Alternatively, manually scale down an existing Deployment by changing replicas field of an existing Deployment to zero. + * `never`: the Deployment is not scaled down + * `onsuccess`: the Deployment is scaled down after the Rollout becomes healthy + * `progressively`: as the Rollout is scaled up the Deployment is scaled down. + + Alternatively, manually scale down an existing Deployment by changing replicas field of an existing Deployment to zero. 1. To perform an update, the change should be made to the Pod template field of the Deployment. Below is an example of a Rollout resource referencing a Deployment. From 0cfdf342ddea524d12f525d0dc91271207066a24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:00:02 -0500 Subject: [PATCH 215/264] chore(deps): bump docker/build-push-action from 5.1.0 to 5.2.0 (#3439) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/4a13e500e55cf31b7a5d59a38ab2040ab0f42f56...af5a7ed5ba88268d5278f7203fb52cd833f66d6e) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 17d77e86d5..197c0aa346 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 #v5.1.0 + uses: docker/build-push-action@af5a7ed5ba88268d5278f7203fb52cd833f66d6e #v5.2.0 with: context: . platforms: ${{ inputs.platforms }} From c6ba82cca216c7c9713c7cd69dae1ebe25ba33a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 17:14:47 -0500 Subject: [PATCH 216/264] chore(deps): bump softprops/action-gh-release from 1 to 2 (#3438) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/de2c0eb89ae2a093876385947365aca7b0e5f844...d99959edae48b5ffffd7b00da66dcdb0a33a52ee) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 53810510d3..562274096d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -108,7 +108,7 @@ jobs: make manifests IMAGE_TAG=${{ github.ref_name }} - name: Draft release - uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15 + uses: softprops/action-gh-release@d99959edae48b5ffffd7b00da66dcdb0a33a52ee # v0.1.15 with: tag_name: ${{ github.event.inputs.tag }} draft: true @@ -214,7 +214,7 @@ jobs: /tmp/sbom.tar.gz - name: Upload SBOM and signature assets - uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15 + uses: softprops/action-gh-release@d99959edae48b5ffffd7b00da66dcdb0a33a52ee # v0.1.15 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 46f14278eef6735498c33835e795b0315f33f948 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:29:35 -0500 Subject: [PATCH 217/264] chore(deps): bump softprops/action-gh-release from 2.0.2 to 2.0.3 (#3440) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/d99959edae48b5ffffd7b00da66dcdb0a33a52ee...3198ee18f814cdf787321b4a32a26ddbf37acc52) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 562274096d..38e7c73e0f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -108,7 +108,7 @@ jobs: make manifests IMAGE_TAG=${{ github.ref_name }} - name: Draft release - uses: softprops/action-gh-release@d99959edae48b5ffffd7b00da66dcdb0a33a52ee # v0.1.15 + uses: softprops/action-gh-release@3198ee18f814cdf787321b4a32a26ddbf37acc52 # v0.1.15 with: tag_name: ${{ github.event.inputs.tag }} draft: true @@ -214,7 +214,7 @@ jobs: /tmp/sbom.tar.gz - name: Upload SBOM and signature assets - uses: softprops/action-gh-release@d99959edae48b5ffffd7b00da66dcdb0a33a52ee # v0.1.15 + uses: softprops/action-gh-release@3198ee18f814cdf787321b4a32a26ddbf37acc52 # v0.1.15 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 7012ed7d31885fcc2f7dc3978a9b6474ad1a6aa6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 09:15:08 -0500 Subject: [PATCH 218/264] chore(deps): bump softprops/action-gh-release from 2.0.3 to 2.0.4 (#3442) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/3198ee18f814cdf787321b4a32a26ddbf37acc52...9d7c94cfd0a1f3ed45544c887983e9fa900f0564) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 38e7c73e0f..58ad372eda 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -108,7 +108,7 @@ jobs: make manifests IMAGE_TAG=${{ github.ref_name }} - name: Draft release - uses: softprops/action-gh-release@3198ee18f814cdf787321b4a32a26ddbf37acc52 # v0.1.15 + uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 # v0.1.15 with: tag_name: ${{ github.event.inputs.tag }} draft: true @@ -214,7 +214,7 @@ jobs: /tmp/sbom.tar.gz - name: Upload SBOM and signature assets - uses: softprops/action-gh-release@3198ee18f814cdf787321b4a32a26ddbf37acc52 # v0.1.15 + uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 # v0.1.15 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From d510545bf5b7015f6c6897ef390c7dc552c1927b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 17:28:22 -0500 Subject: [PATCH 219/264] chore(deps): bump golang.org/x/oauth2 from 0.17.0 to 0.18.0 (#3422) Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.17.0 to 0.18.0. - [Commits](https://github.com/golang/oauth2/compare/v0.17.0...v0.18.0) --- updated-dependencies: - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 2a2575d20f..e719a2fdc9 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stretchr/testify v1.9.0 github.com/tj/assert v0.0.3 github.com/valyala/fasttemplate v1.2.2 - golang.org/x/oauth2 v0.17.0 + golang.org/x/oauth2 v0.18.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 @@ -173,11 +173,11 @@ require ( github.com/xlab/treeprint v1.1.0 // indirect go.opencensus.io v0.24.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/crypto v0.19.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.21.0 // indirect - golang.org/x/sys v0.17.0 // indirect - golang.org/x/term v0.17.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.12.0 // indirect diff --git a/go.sum b/go.sum index 1ce6a216b4..59643ebf01 100644 --- a/go.sum +++ b/go.sum @@ -699,8 +699,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -784,8 +784,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -793,8 +793,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -876,8 +876,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -885,8 +885,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 5f6142c1907ec02f7f352b23211868981f36bbc4 Mon Sep 17 00:00:00 2001 From: kevinqian-db <151585552+kevinqian-db@users.noreply.github.com> Date: Fri, 15 Mar 2024 06:32:32 -0700 Subject: [PATCH 220/264] fix(controller): treat spec.canary.analysis.template empty list as spec.canary.analysis not set (#3446) Treat spec.canary.analysis.template empty list as spec.canary.analysis not set Signed-off-by: Kevin Qian --- rollout/analysis.go | 2 +- rollout/analysis_test.go | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/rollout/analysis.go b/rollout/analysis.go index 5c5c5f8aec..26205235a1 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -313,7 +313,7 @@ func (c *rolloutContext) reconcilePostPromotionAnalysisRun() (*v1alpha1.Analysis func (c *rolloutContext) reconcileBackgroundAnalysisRun() (*v1alpha1.AnalysisRun, error) { currentAr := c.currentArs.CanaryBackground - if c.rollout.Spec.Strategy.Canary.Analysis == nil { + if c.rollout.Spec.Strategy.Canary.Analysis == nil || len(c.rollout.Spec.Strategy.Canary.Analysis.Templates) == 0 { err := c.cancelAnalysisRuns([]*v1alpha1.AnalysisRun{currentAr}) return nil, err } diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index 624134fbb6..4b5d5d72d7 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -2468,3 +2468,45 @@ func TestCreateAnalysisRunWithCustomAnalysisRunMetadataAndROCopyLabels(t *testin assert.Equal(t, "testLabelValue", createdAr.Labels["testLabelKey"]) assert.Equal(t, "1234", createdAr.Labels["my-label"]) } + +func TestCancelBackgroundAnalysisRunWhenRolloutAnalysisHasNoTemplate(t *testing.T) { + f := newFixture(t) + defer f.Close() + + at := analysisTemplate("bar") + steps := []v1alpha1.CanaryStep{ + {SetWeight: pointer.Int32Ptr(10)}, + } + + r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32Ptr(1), intstr.FromInt(0), intstr.FromInt(1)) + rs1 := newReplicaSetWithStatus(r1, 1, 1) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + r1 = updateCanaryRolloutStatus(r1, rs1PodHash, 1, 1, 1, false) + ar := analysisRun(at, v1alpha1.RolloutTypeStepLabel, r1) + r1.Status.Canary.CurrentBackgroundAnalysisRunStatus = &v1alpha1.RolloutAnalysisRunStatus{ + Name: ar.Name, + Status: v1alpha1.AnalysisPhaseRunning, + } + + r2 := bumpVersion(r1) + r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ + RolloutAnalysis: v1alpha1.RolloutAnalysis{}, // No templates provided. + } + rs2 := newReplicaSetWithStatus(r2, 0, 0) + + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + f.rolloutLister = append(f.rolloutLister, r2) + f.analysisTemplateLister = append(f.analysisTemplateLister, at) + f.analysisRunLister = append(f.analysisRunLister, ar) + f.objects = append(f.objects, r2, at, ar) + + _ = f.expectPatchAnalysisRunAction(ar) + patchIndex := f.expectPatchRolloutAction(r2) + _ = f.expectUpdateReplicaSetAction(rs1) + f.run(getKey(r2, t)) + + patch := f.getPatchedRollout(patchIndex) + + assert.Contains(t, patch, `"currentBackgroundAnalysisRunStatus":null`) +} From be8487f0bf4cd335b61f5236ed162bd49c76dbf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 08:32:55 -0500 Subject: [PATCH 221/264] chore(deps): bump docker/setup-buildx-action from 3.1.0 to 3.2.0 (#3449) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/0d103c3126aa41d772a8362f6aa67afac040f80c...2b51285047da1547ffb1b2203d8be4c0af6b1f20) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 197c0aa346..0939529053 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -79,7 +79,7 @@ jobs: cosign-release: 'v2.2.0' - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - uses: docker/setup-buildx-action@0d103c3126aa41d772a8362f6aa67afac040f80c # v3.1.0 + - uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - name: Setup tags for container image as a CSV type run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 58ad372eda..d76724b1d7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -99,7 +99,7 @@ jobs: uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@0d103c3126aa41d772a8362f6aa67afac040f80c # v3.1.0 + uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3.2.0 - name: Generate release artifacts run: | From eede5df165cd33d4bf196db5af902911f0a4d05b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 08:33:56 -0500 Subject: [PATCH 222/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.30.1 to 1.30.3 (#3447) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.30.1 to 1.30.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.1...service/s3/v1.30.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index e719a2fdc9..836c7c447f 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.25.2 + github.com/aws/aws-sdk-go-v2 v1.25.3 github.com/aws/aws-sdk-go-v2/config v1.27.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 @@ -79,8 +79,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.5 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 // indirect diff --git a/go.sum b/go.sum index 59643ebf01..94a8e016bc 100644 --- a/go.sum +++ b/go.sum @@ -92,24 +92,24 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.25.2 h1:/uiG1avJRgLGiQM9X3qJM8+Qa6KRGK5rRPuXE0HUM+w= -github.com/aws/aws-sdk-go-v2 v1.25.2/go.mod h1:Evoc5AsmtveRt1komDwIsjHFyrP5tDuF1D1U+6z6pNo= +github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0= +github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2/config v1.27.5 h1:brBPsyRFQn97M1ZhQ9tLXkO7Zytiar0NS06FGmEJBdg= github.com/aws/aws-sdk-go-v2/config v1.27.5/go.mod h1:I53uvsfddRRTG5YcC4n5Z3aOD1BU8hYCoIG7iEJG4wM= github.com/aws/aws-sdk-go-v2/credentials v1.17.5 h1:yn3zSvIKC2NZIs40cY3kckcy9Zma96PrRR07N54PCvY= github.com/aws/aws-sdk-go-v2/credentials v1.17.5/go.mod h1:8JcKPAGZVnDWuR5lusAwmrSDtZnDIAnpQWaDC9RFt2g= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2 h1:bNo4LagzUKbjdxE0tIcR9pMzLR2U/Tgie1Hq1HQ3iH8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.2/go.mod h1:wRQv0nN6v9wDXuWThpovGQjqF1HFdcgWjporw14lS8k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2 h1:EtOU5jsPdIQNP+6Q2C5e3d65NKT1PeCiQk+9OdzO12Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.2/go.mod h1:tyF5sKccmDz0Bv4NrstEr+/9YkSPJHrcO7UsUKf7pWM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 h1:ifbIbHZyGl1alsAhPIYsHOg5MuApgqOvVeI8wIugXfs= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 h1:Qvodo9gHG9F3E8SfYOspPeBt0bjSbsevK8WhRAUHcoY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 h1:mQySuI87thHtcbZvEDjwUROGWikU6fqgpHklCBXpJU4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1/go.mod h1:Z1ThUUTuCO9PArtiQsTmBGBv+38NGj+795Zl0n1jgiM= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1 h1:eDD7nyDlMxlkGhWu0n92LYkuSQIIEwN5CffwiMDohh0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.1/go.mod h1:DGUI2cbxu24m0rNOm7DDmrCtTzR0U0FqE3XpBkR8+r8= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 h1:RdYkpKdapqc29UYKw7mGrDLpLRPJPERFO/ugLEMIhr8= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3/go.mod h1:e0zaDIcMOQ48klOQQRw6xJJyi3F2zwmOUer8gHEFSbo= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 h1:x0N5ftQzgcfRpCpTiyZC40pvNUJYhzf4UgCsAyO6/P8= From 8191ad86e724c638c860eab44ffae31cff78e67d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 08:34:15 -0500 Subject: [PATCH 223/264] chore(deps): bump docker/login-action from 3.0.0 to 3.1.0 (#3443) Bumps [docker/login-action](https://github.com/docker/login-action) from 3.0.0 to 3.1.0. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/343f7c4344506bcbf9b4de18042ae17996df046d...e92390c5fb421da1463c202d546fed0ec5c39f20) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index 0939529053..b937a163e9 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -106,7 +106,7 @@ jobs: echo 'EOF' >> $GITHUB_ENV - name: Login to Quay.io - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: registry: quay.io username: ${{ secrets.quay_username }} @@ -114,7 +114,7 @@ jobs: if: ${{ inputs.quay_image_name && inputs.push }} - name: Login to GitHub Container Registry - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: registry: ghcr.io username: ${{ secrets.ghcr_username }} @@ -122,7 +122,7 @@ jobs: if: ${{ inputs.ghcr_image_name && inputs.push }} - name: Login to dockerhub Container Registry - uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3.1.0 with: username: ${{ secrets.docker_username }} password: ${{ secrets.docker_password }} From 5018705fde564c0718f094a29ff5a26b01e4e10d Mon Sep 17 00:00:00 2001 From: AS <11219262+ashutosh16@users.noreply.github.com> Date: Fri, 15 Mar 2024 06:40:06 -0700 Subject: [PATCH 224/264] feat: add Analysis run to rollout notifications (#3296) * add analysisRun to the rollout notification Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * add analysisRun to the rollout notification Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * add analysisRun to the rollout notification Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * add analysisRun to the rollout notification Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> * small changes Signed-off-by: Zach Aller --------- Signed-off-by: ashutosh16 <11219262+ashutosh16@users.noreply.github.com> Signed-off-by: Zach Aller Co-authored-by: Zach Aller --- controller/controller.go | 2 +- controller/controller_test.go | 2 +- pkg/kubectl-argo-rollouts/cmd/cmd.go | 3 +- utils/annotations/annotations.go | 24 +++- utils/annotations/annotations_test.go | 12 ++ utils/record/record.go | 79 ++++++++++- utils/record/record_test.go | 184 ++++++++++++++++++++++++-- 7 files changed, 285 insertions(+), 21 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 9aaf8ee09f..e9509cd78e 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -304,7 +304,7 @@ func NewManager( ingressWorkqueue := workqueue.NewNamedRateLimitingQueue(queue.DefaultArgoRolloutsRateLimiter(), "Ingresses") refResolver := rollout.NewInformerBasedWorkloadRefResolver(namespace, dynamicclientset, discoveryClient, argoprojclientset, rolloutsInformer.Informer()) - apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), defaults.Namespace(), notificationSecretInformerFactory.Core().V1().Secrets().Informer(), notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer()) + apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(analysisRunInformer), defaults.Namespace(), notificationSecretInformerFactory.Core().V1().Secrets().Informer(), notificationConfigMapInformerFactory.Core().V1().ConfigMaps().Informer()) recorder := record.NewEventRecorder(kubeclientset, metrics.MetricRolloutEventsTotal, metrics.MetricNotificationFailedTotal, metrics.MetricNotificationSuccessTotal, metrics.MetricNotificationSend, apiFactory) notificationsController := notificationcontroller.NewControllerWithNamespaceSupport(dynamicclientset.Resource(v1alpha1.RolloutGVR), rolloutsInformer.Informer(), apiFactory, notificationcontroller.WithToUnstructured(func(obj metav1.Object) (*unstructured.Unstructured, error) { diff --git a/controller/controller_test.go b/controller/controller_test.go index f724ef0712..0f94131c96 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -205,7 +205,7 @@ func (f *fixture) newManager(t *testing.T) *Manager { Recorder: record.NewFakeEventRecorder(), }) - apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(), "default", k8sI.Core().V1().Secrets().Informer(), k8sI.Core().V1().ConfigMaps().Informer()) + apiFactory := notificationapi.NewFactory(record.NewAPIFactorySettings(i.Argoproj().V1alpha1().AnalysisRuns()), "default", k8sI.Core().V1().Secrets().Informer(), k8sI.Core().V1().ConfigMaps().Informer()) // rolloutsInformer := rolloutinformers.NewRolloutInformer(f.client, "", time.Minute, cache.Indexers{}) cm.notificationsController = notificationcontroller.NewController(dynamicClient.Resource(v1alpha1.RolloutGVR), i.Argoproj().V1alpha1().Rollouts().Informer(), apiFactory, notificationcontroller.WithToUnstructured(func(obj metav1.Object) (*unstructured.Unstructured, error) { diff --git a/pkg/kubectl-argo-rollouts/cmd/cmd.go b/pkg/kubectl-argo-rollouts/cmd/cmd.go index 53adf27b5d..372f8c434d 100644 --- a/pkg/kubectl-argo-rollouts/cmd/cmd.go +++ b/pkg/kubectl-argo-rollouts/cmd/cmd.go @@ -56,6 +56,7 @@ func NewCmdArgoRollouts(o *options.ArgoRolloutsOptions) *cobra.Command { return o.UsageErr(c) }, } + o.AddKubectlFlags(cmd) cmd.AddCommand(create.NewCmdCreate(o)) cmd.AddCommand(get.NewCmdGet(o)) @@ -72,7 +73,7 @@ func NewCmdArgoRollouts(o *options.ArgoRolloutsOptions) *cobra.Command { cmd.AddCommand(undo.NewCmdUndo(o)) cmd.AddCommand(dashboard.NewCmdDashboard(o)) cmd.AddCommand(status.NewCmdStatus(o)) - cmd.AddCommand(notificationcmd.NewToolsCommand("notifications", "kubectl argo rollouts notifications", v1alpha1.RolloutGVR, record.NewAPIFactorySettings())) + cmd.AddCommand(notificationcmd.NewToolsCommand("notifications", "kubectl argo rollouts notifications", v1alpha1.RolloutGVR, record.NewAPIFactorySettings(nil))) cmd.AddCommand(completion.NewCmdCompletion(o)) return cmd diff --git a/utils/annotations/annotations.go b/utils/annotations/annotations.go index 80cec5ce2a..121c6c0803 100644 --- a/utils/annotations/annotations.go +++ b/utils/annotations/annotations.go @@ -8,6 +8,7 @@ import ( log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" @@ -52,17 +53,30 @@ func GetWorkloadGenerationAnnotation(ro *v1alpha1.Rollout) (int32, bool) { } // GetRevisionAnnotation returns revision of rollout -func GetRevisionAnnotation(ro *v1alpha1.Rollout) (int32, bool) { - if ro == nil { +func GetRevisionAnnotation(anyObj metav1.Object) (int32, bool) { + + if anyObj == nil { + return 0, false + } + var obj interface{} + switch anyObj.(type) { + case *v1alpha1.Rollout: + obj = anyObj.(*v1alpha1.Rollout) + case *v1alpha1.AnalysisRun: + obj = anyObj.(*v1alpha1.AnalysisRun) + default: + log.Warnf("object not supported type: %T", anyObj) return 0, false } - annotationValue, ok := ro.Annotations[RevisionAnnotation] + + annotationValue, ok := obj.(metav1.Object).GetAnnotations()[RevisionAnnotation] if !ok { - return int32(0), false + return 0, false } + intValue, err := strconv.ParseInt(annotationValue, 10, 32) if err != nil { - log.Warnf("Cannot convert the value %q with annotation key %q for the replica set %q", annotationValue, RevisionAnnotation, ro.Name) + log.Warnf("Cannot convert the value %q with annotation key %q for the object %q", annotationValue, RevisionAnnotation, anyObj.GetName()) return int32(0), false } return int32(intValue), true diff --git a/utils/annotations/annotations_test.go b/utils/annotations/annotations_test.go index 3ad136fd7e..239ab83fd3 100644 --- a/utils/annotations/annotations_test.go +++ b/utils/annotations/annotations_test.go @@ -483,4 +483,16 @@ func TestGetRevisionAnnotation(t *testing.T) { }) assert.False(t, found) assert.Equal(t, int32(0), rev) + + revAR, found := GetRevisionAnnotation(&v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: metav1.NamespaceDefault, + Annotations: map[string]string{ + RevisionAnnotation: "1", + }, + }, + }) + assert.True(t, found) + assert.Equal(t, int32(1), revAR) } diff --git a/utils/record/record.go b/utils/record/record.go index 9e50f3ba65..801db089b6 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -7,11 +7,12 @@ import ( "encoding/json" "fmt" "regexp" + "sort" "strings" "time" + argoinformers "github.com/argoproj/argo-rollouts/pkg/client/informers/externalversions/rollouts/v1alpha1" timeutil "github.com/argoproj/argo-rollouts/utils/time" - "github.com/argoproj/notifications-engine/pkg/api" "github.com/argoproj/notifications-engine/pkg/services" "github.com/argoproj/notifications-engine/pkg/subscriptions" @@ -20,6 +21,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" k8sinformers "k8s.io/client-go/informers" @@ -32,6 +34,7 @@ import ( "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" rolloutscheme "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/scheme" + "github.com/argoproj/argo-rollouts/utils/annotations" logutil "github.com/argoproj/argo-rollouts/utils/log" ) @@ -235,13 +238,83 @@ func (e *EventRecorderAdapter) K8sRecorder() record.EventRecorder { return e.Recorder } -func NewAPIFactorySettings() api.Settings { +func getAnalysisRunsFilterWithLabels(ro v1alpha1.Rollout, arInformer argoinformers.AnalysisRunInformer) (any, error) { + + set := labels.Set(map[string]string{ + v1alpha1.DefaultRolloutUniqueLabelKey: ro.Status.CurrentPodHash, + }) + + revision, _ := annotations.GetRevisionAnnotation(&ro) + ars, err := arInformer.Lister().AnalysisRuns(ro.Namespace).List(labels.SelectorFromSet(set)) + if err != nil { + return nil, fmt.Errorf("error getting analysisruns from informer for namespace: %s error: %w", ro.Namespace, err) + } + if len(ars) == 0 { + return nil, nil + } + + filteredArs := make([]*v1alpha1.AnalysisRun, 0, len(ars)) + for _, ar := range ars { + arRevision, _ := annotations.GetRevisionAnnotation(ar) + if arRevision == revision { + filteredArs = append(filteredArs, ar) + } + } + + sort.Slice(filteredArs, func(i, j int) bool { + ts1 := filteredArs[i].ObjectMeta.CreationTimestamp.Time + ts2 := filteredArs[j].ObjectMeta.CreationTimestamp.Time + return ts1.After(ts2) + }) + + var arsObj any + arBytes, err := json.Marshal(filteredArs) + + if err != nil { + return nil, fmt.Errorf("Failed to marshal analysisRuns for rollout revision: %s, err: %w", string(revision), err) + } + + err = json.Unmarshal(arBytes, &arsObj) + if err != nil { + return nil, fmt.Errorf("Failed to unmarshal analysisRuns for rollout revision: %s, err: %w", string(revision), err) + } + + return arsObj, nil +} + +func NewAPIFactorySettings(arInformer argoinformers.AnalysisRunInformer) api.Settings { return api.Settings{ SecretName: NotificationSecret, ConfigMapName: NotificationConfigMap, InitGetVars: func(cfg *api.Config, configMap *corev1.ConfigMap, secret *corev1.Secret) (api.GetVars, error) { return func(obj map[string]any, dest services.Destination) map[string]any { - return map[string]any{"rollout": obj, "time": timeExprs} + + var vars = map[string]any{"rollout": obj, "time": timeExprs} + + if arInformer == nil { + log.Infof("Notification is not set for analysisRun Informer: %s", dest) + return vars + } + + var ro v1alpha1.Rollout + err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj, &ro) + + if err != nil { + log.Errorf("unable to send notification: bad rollout object: %v", err) + return vars + } + + arsObj, err := getAnalysisRunsFilterWithLabels(ro, arInformer) + + if err != nil { + log.Errorf("Error calling getAnalysisRunsFilterWithLabels for namespace: %s", + ro.Namespace) + return vars + + } + + vars = map[string]any{"rollout": obj, "analysisRuns": arsObj, "time": timeExprs} + return vars }, nil }, } diff --git a/utils/record/record_test.go b/utils/record/record_test.go index 97f4452441..2cc7afd12c 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -2,6 +2,7 @@ package record import ( "bytes" + "encoding/json" "errors" "fmt" "strings" @@ -9,7 +10,11 @@ import ( "time" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + argofake "github.com/argoproj/argo-rollouts/pkg/client/clientset/versioned/fake" + argoinformersfactory "github.com/argoproj/argo-rollouts/pkg/client/informers/externalversions" + argoinformers "github.com/argoproj/argo-rollouts/pkg/client/informers/externalversions/rollouts/v1alpha1" "github.com/argoproj/argo-rollouts/utils/defaults" + timeutil "github.com/argoproj/argo-rollouts/utils/time" "github.com/argoproj/notifications-engine/pkg/api" notificationapi "github.com/argoproj/notifications-engine/pkg/api" "github.com/argoproj/notifications-engine/pkg/mocks" @@ -21,13 +26,19 @@ import ( dto "github.com/prometheus/client_model/go" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" ) +var ( + noResyncPeriodFunc = func() time.Duration { return 0 } +) + func TestRecordLog(t *testing.T) { prevOutput := log.StandardLogger().Out defer func() { @@ -178,13 +189,18 @@ func TestSendNotificationsWhenConditionTime(t *testing.T) { k8sClient := fake.NewSimpleClientset() sharedInformers := informers.NewSharedInformerFactory(k8sClient, 0) + + f := argofake.NewSimpleClientset() + rolloutsI := argoinformersfactory.NewSharedInformerFactory(f, noResyncPeriodFunc()) + arInformer := rolloutsI.Argoproj().V1alpha1().AnalysisRuns() + cmInformer := sharedInformers.Core().V1().ConfigMaps().Informer() secretInformer := sharedInformers.Core().V1().Secrets().Informer() secretInformer.GetIndexer().Add(secret) cmInformer.GetIndexer().Add(cm) - apiFactory := notificationapi.NewFactory(NewAPIFactorySettings(), defaults.Namespace(), secretInformer, cmInformer) + apiFactory := notificationapi.NewFactory(NewAPIFactorySettings(arInformer), defaults.Namespace(), secretInformer, cmInformer) api, err := apiFactory.GetAPI() assert.NoError(t, err) @@ -224,8 +240,11 @@ func TestSendNotificationsWhenConditionTime(t *testing.T) { secretInformer.GetIndexer().Add(secret) cmInformer.GetIndexer().Add(cm) + f := argofake.NewSimpleClientset() + rolloutsI := argoinformersfactory.NewSharedInformerFactory(f, noResyncPeriodFunc()) + arInformer := rolloutsI.Argoproj().V1alpha1().AnalysisRuns() - apiFactory := notificationapi.NewFactory(NewAPIFactorySettings(), defaults.Namespace(), secretInformer, cmInformer) + apiFactory := notificationapi.NewFactory(NewAPIFactorySettings(arInformer), defaults.Namespace(), secretInformer, cmInformer) api, err := apiFactory.GetAPI() assert.NoError(t, err) @@ -422,17 +441,162 @@ func TestSendNotificationsNoTrigger(t *testing.T) { assert.Len(t, err, 1) } +func createAnalysisRunInformer(ars []*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer { + f := argofake.NewSimpleClientset() + rolloutsI := argoinformersfactory.NewSharedInformerFactory(f, noResyncPeriodFunc()) + arInformer := rolloutsI.Argoproj().V1alpha1().AnalysisRuns() + for _, ar := range ars { + _ = arInformer.Informer().GetStore().Add(ar) + } + return arInformer +} + func TestNewAPIFactorySettings(t *testing.T) { - settings := NewAPIFactorySettings() - assert.Equal(t, NotificationConfigMap, settings.ConfigMapName) - assert.Equal(t, NotificationSecret, settings.SecretName) - getVars, err := settings.InitGetVars(nil, nil, nil) - assert.NoError(t, err) - rollout := map[string]any{"name": "hello"} - vars := getVars(rollout, services.Destination{}) + ars := []*v1alpha1.AnalysisRun{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "analysis-run-1", + CreationTimestamp: metav1.NewTime(timeutil.Now().Add(-1 * time.Hour)), + Namespace: "default", + Labels: map[string]string{"rollouts-pod-template-hash": "85659df978"}, + Annotations: map[string]string{"rollout.argoproj.io/revision": "1"}, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Name: "analysis-run-2", + CreationTimestamp: metav1.NewTime(timeutil.Now().Add(-2 * time.Hour)), + Namespace: "default", + Labels: map[string]string{"rollouts-pod-template-hash": "85659df978"}, + Annotations: map[string]string{"rollout.argoproj.io/revision": "1"}, + }, + }, + } + ro := v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "rollout", + Namespace: "default", + Annotations: map[string]string{"rollout.argoproj.io/revision": "1"}, + }, + Status: v1alpha1.RolloutStatus{ + CurrentPodHash: "85659df978", + }, + } + + type expectedFunc func(obj map[string]interface{}, ar any) map[string]interface{} + type arInformerFunc func([]*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer + + testcase := []struct { + name string + arInformer arInformerFunc + rollout v1alpha1.Rollout + ars []*v1alpha1.AnalysisRun + expected expectedFunc + }{ + { + name: "Send notification with rollout and analysisRun", + arInformer: func(ars []*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer { + return createAnalysisRunInformer(ars) + }, + rollout: ro, + ars: ars, + expected: func(obj map[string]interface{}, ar any) map[string]interface{} { + return map[string]interface{}{ + "rollout": obj, + "analysisRuns": ar, + "time": timeExprs, + } + }, + }, + { + name: "Send notification rollout when revision and label doesn't match", + arInformer: func(ars []*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer { + return createAnalysisRunInformer(ars) + }, + rollout: ro, + ars: []*v1alpha1.AnalysisRun{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "analysis-run-3", + CreationTimestamp: metav1.NewTime(timeutil.Now().Add(-2 * time.Hour)), + Namespace: "default", + Labels: map[string]string{"rollouts-pod-template-hash": "1234"}, + Annotations: map[string]string{"rollout.argoproj.io/revision": "2"}, + }, + }, + }, + expected: func(obj map[string]interface{}, ar any) map[string]interface{} { + return map[string]interface{}{ + "rollout": obj, + "analysisRuns": nil, + "time": timeExprs, + } + }, + }, + { + name: "arInformer is nil", + arInformer: func(ars []*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer { + return nil + }, + rollout: ro, + ars: nil, + expected: func(obj map[string]interface{}, ar any) map[string]interface{} { + return map[string]interface{}{ + "rollout": obj, + "time": timeExprs, + } + }, + }, + { + name: "analysisRuns nil for no matching namespace", + arInformer: func(ars []*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer { + return createAnalysisRunInformer(ars) + }, + rollout: ro, + ars: []*v1alpha1.AnalysisRun{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "analysis-run-1", + CreationTimestamp: metav1.NewTime(timeutil.Now().Add(-2 * time.Hour)), + Namespace: "default-1", + Labels: map[string]string{"rollouts-pod-template-hash": "1234"}, + Annotations: map[string]string{"rollout.argoproj.io/revision": "2"}, + }, + }, + }, + expected: func(obj map[string]interface{}, ar any) map[string]interface{} { + return map[string]interface{}{ + "rollout": obj, + "analysisRuns": nil, + "time": timeExprs, + } + }, + }, + } - assert.Equal(t, map[string]any{"rollout": rollout, "time": timeExprs}, vars) + for _, test := range testcase { + t.Run(test.name, func(t *testing.T) { + + settings := NewAPIFactorySettings(test.arInformer(test.ars)) + getVars, err := settings.InitGetVars(nil, nil, nil) + require.NoError(t, err) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + obj, _ := runtime.DefaultUnstructuredConverter.ToUnstructured(&test.rollout) + + arBytes, err := json.Marshal(test.ars) + var arsObj any + _ = json.Unmarshal(arBytes, &arsObj) + vars := getVars(obj, services.Destination{}) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + assert.Equal(t, test.expected(obj, arsObj), vars) + }) + } } func TestWorkloadRefObjectMap(t *testing.T) { From 383f719e6d411d5163a7e832f02f39146789adf2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:41:50 +0000 Subject: [PATCH 225/264] chore(deps): bump docker/build-push-action from 5.2.0 to 5.3.0 (#3448) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5.2.0 to 5.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/af5a7ed5ba88268d5278f7203fb52cd833f66d6e...2cdde995de11925a030ce8070c3d77a52ffcf1c0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/image-reuse.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image-reuse.yaml b/.github/workflows/image-reuse.yaml index b937a163e9..970080e845 100644 --- a/.github/workflows/image-reuse.yaml +++ b/.github/workflows/image-reuse.yaml @@ -130,7 +130,7 @@ jobs: - name: Build and push container image id: image - uses: docker/build-push-action@af5a7ed5ba88268d5278f7203fb52cd833f66d6e #v5.2.0 + uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 #v5.3.0 with: context: . platforms: ${{ inputs.platforms }} From 0f52c932e46b12f63546e6ebe8a91281fb6c46a6 Mon Sep 17 00:00:00 2001 From: Soumya Ghosh Dastidar <44349253+gdsoumya@users.noreply.github.com> Date: Fri, 15 Mar 2024 20:35:02 +0530 Subject: [PATCH 226/264] fix: job metrics owner ref when using custom job kubeconfig/ns (#3425) * fix: job metrcis owner ref when using custom job kubeconfig/ns Signed-off-by: Soumya Ghosh Dastidar * fix: job metrcis owner ref when using custom job kubeconfig/ns Signed-off-by: Soumya Ghosh Dastidar * revert: go mod change Signed-off-by: Soumya Ghosh Dastidar --------- Signed-off-by: Soumya Ghosh Dastidar Signed-off-by: Zach Aller Co-authored-by: Zach Aller --- analysis/controller.go | 29 ++++++++++++++++--- cmd/rollouts-controller/main.go | 2 +- go.mod | 2 +- metricproviders/job/job.go | 45 ++++++++++++++++++++---------- metricproviders/job/job_test.go | 4 +-- metricproviders/metricproviders.go | 13 +++++---- utils/controller/controller.go | 23 ++++++++++----- 7 files changed, 83 insertions(+), 35 deletions(-) diff --git a/analysis/controller.go b/analysis/controller.go index e8dcb8601a..1afa6ab556 100644 --- a/analysis/controller.go +++ b/analysis/controller.go @@ -7,6 +7,9 @@ import ( "github.com/argoproj/argo-rollouts/metric" jobProvider "github.com/argoproj/argo-rollouts/metricproviders/job" + "github.com/aws/smithy-go/ptr" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" unstructuredutil "github.com/argoproj/argo-rollouts/utils/unstructured" @@ -32,6 +35,10 @@ import ( timeutil "github.com/argoproj/argo-rollouts/utils/time" ) +var ( + analysisRunGVK = v1alpha1.SchemeGroupVersion.WithKind("AnalysisRun") +) + // Controller is the controller implementation for Analysis resources type Controller struct { // kubeclientset is a standard kubernetes clientset @@ -187,10 +194,24 @@ func (c *Controller) syncHandler(ctx context.Context, key string) error { return c.persistAnalysisRunStatus(run, newRun.Status) } -func (c *Controller) jobParentNamespace(obj any) string { +func (c *Controller) jobParentReference(obj any) (*v1.OwnerReference, string) { job, ok := obj.(*batchv1.Job) if !ok { - return "" + return nil, "" + } + // if it has owner reference, return it as is + ownerRef := v1.GetControllerOf(job) + // else if it's missing owner reference check if analysis run uid is set and + // if it is there use labels/annotations to create owner reference + if ownerRef == nil && job.Labels[jobProvider.AnalysisRunUIDLabelKey] != "" { + ownerRef = &v1.OwnerReference{ + APIVersion: analysisRunGVK.GroupVersion().String(), + Kind: analysisRunGVK.Kind, + Name: job.Annotations[jobProvider.AnalysisRunNameAnnotationKey], + UID: types.UID(job.Labels[jobProvider.AnalysisRunUIDLabelKey]), + BlockOwnerDeletion: ptr.Bool(true), + Controller: ptr.Bool(true), + } } ns := job.GetNamespace() if job.Annotations != nil { @@ -198,7 +219,7 @@ func (c *Controller) jobParentNamespace(obj any) string { ns = job.Annotations[jobProvider.AnalysisRunNamespaceAnnotationKey] } } - return ns + return ownerRef, ns } func (c *Controller) enqueueJobIfCompleted(obj any) { @@ -209,7 +230,7 @@ func (c *Controller) enqueueJobIfCompleted(obj any) { for _, condition := range job.Status.Conditions { switch condition.Type { case batchv1.JobFailed, batchv1.JobComplete: - controllerutil.EnqueueParentObject(job, register.AnalysisRunKind, c.enqueueAnalysis, c.jobParentNamespace) + controllerutil.EnqueueParentObject(job, register.AnalysisRunKind, c.enqueueAnalysis, c.jobParentReference) return } } diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index d198db3c31..4b058b09a7 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -142,7 +142,7 @@ func newCommand() *cobra.Command { instanceIDTweakListFunc := func(options *metav1.ListOptions) { options.LabelSelector = instanceIDSelector.String() } - jobKubeClient, err := metricproviders.GetAnalysisJobClientset(kubeClient) + jobKubeClient, _, err := metricproviders.GetAnalysisJobClientset(kubeClient) checkError(err) jobNs := metricproviders.GetAnalysisJobNamespace() if jobNs == "" { diff --git a/go.mod b/go.mod index 836c7c447f..b27a612a96 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.27.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 + github.com/aws/smithy-go v1.20.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 @@ -88,7 +89,6 @@ require ( github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.28.2 // indirect - github.com/aws/smithy-go v1.20.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/metricproviders/job/job.go b/metricproviders/job/job.go index 8d76302149..5a85c5c71e 100644 --- a/metricproviders/job/job.go +++ b/metricproviders/job/job.go @@ -43,18 +43,20 @@ var ( ) type JobProvider struct { - kubeclientset kubernetes.Interface - jobLister batchlisters.JobLister - logCtx log.Entry - jobNamespace string + kubeclientset kubernetes.Interface + jobLister batchlisters.JobLister + logCtx log.Entry + jobNamespace string + customJobKubeconfig bool } -func NewJobProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, jobLister batchlisters.JobLister, jobNS string) *JobProvider { +func NewJobProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, jobLister batchlisters.JobLister, jobNS string, customJobKubeconfig bool) *JobProvider { return &JobProvider{ - kubeclientset: kubeclientset, - logCtx: logCtx, - jobLister: jobLister, - jobNamespace: jobNS, + kubeclientset: kubeclientset, + logCtx: logCtx, + jobLister: jobLister, + jobNamespace: jobNS, + customJobKubeconfig: customJobKubeconfig, } } @@ -85,7 +87,7 @@ func getJobIDSuffix(run *v1alpha1.AnalysisRun, metricName string) int { return int(res.Count + res.Error + 1) } -func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, jobNS string) (*batchv1.Job, error) { +func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, jobNS string, customJobKubeconfig bool) (*batchv1.Job, error) { ns := run.Namespace if jobNS != "" { ns = jobNS @@ -102,11 +104,17 @@ func newMetricJob(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric, jobNS strin jobAnnotations[AnalysisRunNameAnnotationKey] = run.Name jobAnnotations[AnalysisRunNamespaceAnnotationKey] = run.Namespace jobAnnotations[AnalysisRunMetricAnnotationKey] = metric.Name + + ownerRef := []metav1.OwnerReference{*metav1.NewControllerRef(run, analysisRunGVK)} + + if ns != run.Namespace || customJobKubeconfig { + ownerRef = nil + } job := batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ Name: newJobName(run, metric), Namespace: ns, - OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(run, analysisRunGVK)}, + OwnerReferences: ownerRef, Annotations: jobAnnotations, Labels: jobLabels, }, @@ -122,7 +130,7 @@ func (p *JobProvider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1a StartedAt: &now, Phase: v1alpha1.AnalysisPhaseRunning, } - job, err := newMetricJob(run, metric, p.jobNamespace) + job, err := newMetricJob(run, metric, p.jobNamespace, p.customJobKubeconfig) if err != nil { p.logCtx.Errorf("job initialization failed: %v", err) return metricutil.MarkMeasurementError(measurement, err) @@ -139,8 +147,17 @@ func (p *JobProvider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1a p.logCtx.Errorf("job create (verify) %s failed: %v", job.Name, createErr) return metricutil.MarkMeasurementError(measurement, createErr) } - controllerRef := metav1.GetControllerOf(existingJob) - if run.UID != controllerRef.UID { + ownerUID := "" + // if custom kubeconfig or different namespace is used owner ref is absent, + // use run uid label to get owner analysis run uid + if p.customJobKubeconfig || job.Namespace != run.Namespace { + ownerUID = job.Labels[AnalysisRunUIDLabelKey] + } else { + controllerRef := metav1.GetControllerOf(existingJob) + ownerUID = string(controllerRef.UID) + } + + if string(run.UID) != ownerUID { // NOTE: we don't bother to check for semantic equality. UID is good enough p.logCtx.Errorf("job create (uid check) %s failed: %v", job.Name, createErr) return metricutil.MarkMeasurementError(measurement, createErr) diff --git a/metricproviders/job/job_test.go b/metricproviders/job/job_test.go index c8ef2af3a0..80fdb28342 100644 --- a/metricproviders/job/job_test.go +++ b/metricproviders/job/job_test.go @@ -36,7 +36,7 @@ func newTestJobProvider(objects ...runtime.Object) *JobProvider { cancel() jobLister := k8sI.Batch().V1().Jobs().Lister() - return NewJobProvider(*logCtx, kubeclient, jobLister, "") + return NewJobProvider(*logCtx, kubeclient, jobLister, "", false) } func newRunWithJobMetric() *v1alpha1.AnalysisRun { @@ -193,7 +193,7 @@ func TestRunCreateCollision(t *testing.T) { p := newTestJobProvider() run := newRunWithJobMetric() - existingJob, err := newMetricJob(run, run.Spec.Metrics[0], p.jobNamespace) + existingJob, err := newMetricJob(run, run.Spec.Metrics[0], p.jobNamespace, p.customJobKubeconfig) assert.NoError(t, err) fakeClient := p.kubeclientset.(*k8sfake.Clientset) fakeClient.Tracker().Add(existingJob) diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index db135b82ca..916fc85aa2 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -52,12 +52,12 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) } return prometheus.NewPrometheusProvider(api, logCtx, metric) case job.ProviderType: - kubeClient, err := GetAnalysisJobClientset(f.KubeClient) + kubeClient, customKubeconfig, err := GetAnalysisJobClientset(f.KubeClient) if err != nil { return nil, err } - return job.NewJobProvider(logCtx, kubeClient, f.JobLister, GetAnalysisJobNamespace()), nil + return job.NewJobProvider(logCtx, kubeClient, f.JobLister, GetAnalysisJobNamespace(), customKubeconfig), nil case kayenta.ProviderType: c := kayenta.NewHttpClient() return kayenta.NewKayentaProvider(logCtx, c), nil @@ -154,7 +154,7 @@ func Type(metric v1alpha1.Metric) string { // if the AnalysisJobKubeconfigEnv is set to InclusterKubeconfig, it will return the incluster client // else if it's set to a kubeconfig file it will return the clientset corresponding to the kubeconfig file. // If empty it returns the provided defaultClientset -func GetAnalysisJobClientset(defaultClientset kubernetes.Interface) (kubernetes.Interface, error) { +func GetAnalysisJobClientset(defaultClientset kubernetes.Interface) (kubernetes.Interface, bool, error) { customJobKubeconfig := os.Getenv(AnalysisJobKubeconfigEnv) if customJobKubeconfig != "" { var ( @@ -167,11 +167,12 @@ func GetAnalysisJobClientset(defaultClientset kubernetes.Interface) (kubernetes. cfg, err = clientcmd.BuildConfigFromFlags("", customJobKubeconfig) } if err != nil { - return nil, err + return nil, true, err } - return kubernetes.NewForConfig(cfg) + clientSet, err := kubernetes.NewForConfig(cfg) + return clientSet, true, err } - return defaultClientset, nil + return defaultClientset, false, nil } func GetAnalysisJobNamespace() string { diff --git a/utils/controller/controller.go b/utils/controller/controller.go index 9c4b05cf26..2530e1d5fa 100644 --- a/utils/controller/controller.go +++ b/utils/controller/controller.go @@ -222,7 +222,7 @@ func EnqueueRateLimited(obj any, q workqueue.RateLimitingInterface) { // It then enqueues that ownerType resource to be processed. If the object does not // have an appropriate OwnerReference, it will simply be skipped. // This function assumes parent object is in the same namespace as the child -func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any), parentNamespaceGetter ...func(any) string) { +func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any), parentGetter ...func(any) (*metav1.OwnerReference, string)) { var object metav1.Object var ok bool if object, ok = obj.(metav1.Object); !ok { @@ -239,16 +239,25 @@ func EnqueueParentObject(obj any, ownerType string, enqueue func(obj any), paren log.Infof("Recovered deleted object '%s' from tombstone", object.GetName()) } - if ownerRef := metav1.GetControllerOf(object); ownerRef != nil { + var ( + ownerRef *metav1.OwnerReference + namespace string + ) + + if len(parentGetter) > 0 { + ownerRef, namespace = parentGetter[0](obj) + } else { + ownerRef = metav1.GetControllerOf(object) + } + + if ownerRef != nil { // If this object is not owned by the ownerType, we should not do anything more with it. if ownerRef.Kind != ownerType { return } - namespace := object.GetNamespace() - if len(parentNamespaceGetter) > 0 { - // If the parentNamespaceGetter is provided, use it to get the parent namespace - // only uses the first parentNamespaceGetter func - namespace = parentNamespaceGetter[0](obj) + // if namespace not set by parentGetter use object namespace + if namespace == "" { + namespace = object.GetNamespace() } parent := cache.ExplicitKey(namespace + "/" + ownerRef.Name) log.Infof("Enqueueing parent of %s/%s: %s %s", namespace, object.GetName(), ownerRef.Kind, parent) From 6c641beec586fd785b227d5922bf958235cbf530 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 04:08:40 +0100 Subject: [PATCH 227/264] chore(deps): bump slsa-framework/slsa-github-generator from 1.9.0 to 1.9.1 (#3456) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.9.0 to 1.9.1. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.9.0...v1.9.1) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d76724b1d7..2c9b481ae2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.1 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.1 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} @@ -141,7 +141,7 @@ jobs: id-token: write # Needed for provenance signing and ID contents: write # Needed for release uploads # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.9.0 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.9.1 with: base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" provenance-name: "argo-rollouts.intoto.jsonl" From 29ff10a728792768a2960411a6c9e3bb67a2d2ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 03:54:50 -0500 Subject: [PATCH 228/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.36.1 to 1.36.3 (#3452) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.36.1 to 1.36.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.36.1...service/ssm/v1.36.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index b27a612a96..da00a0467e 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.25.3 + github.com/aws/aws-sdk-go-v2 v1.26.0 github.com/aws/aws-sdk-go-v2/config v1.27.5 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 github.com/aws/smithy-go v1.20.1 github.com/blang/semver v3.5.1+incompatible @@ -80,8 +80,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.5 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 // indirect diff --git a/go.sum b/go.sum index 94a8e016bc..0a90e0dc9d 100644 --- a/go.sum +++ b/go.sum @@ -92,22 +92,22 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0= -github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= +github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= +github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= github.com/aws/aws-sdk-go-v2/config v1.27.5 h1:brBPsyRFQn97M1ZhQ9tLXkO7Zytiar0NS06FGmEJBdg= github.com/aws/aws-sdk-go-v2/config v1.27.5/go.mod h1:I53uvsfddRRTG5YcC4n5Z3aOD1BU8hYCoIG7iEJG4wM= github.com/aws/aws-sdk-go-v2/credentials v1.17.5 h1:yn3zSvIKC2NZIs40cY3kckcy9Zma96PrRR07N54PCvY= github.com/aws/aws-sdk-go-v2/credentials v1.17.5/go.mod h1:8JcKPAGZVnDWuR5lusAwmrSDtZnDIAnpQWaDC9RFt2g= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3 h1:ifbIbHZyGl1alsAhPIYsHOg5MuApgqOvVeI8wIugXfs= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3 h1:Qvodo9gHG9F3E8SfYOspPeBt0bjSbsevK8WhRAUHcoY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1 h1:mQySuI87thHtcbZvEDjwUROGWikU6fqgpHklCBXpJU4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.1/go.mod h1:Z1ThUUTuCO9PArtiQsTmBGBv+38NGj+795Zl0n1jgiM= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 h1:l3vM7tnmYWZBdyN1d2Q4gTCnDNbwKNtns4oCFt0zfQk= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3/go.mod h1:xeAHc7vhdOYwpG2t4uXdnGhOvOIpJ8n+A5AHnCkk8iw= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 h1:RdYkpKdapqc29UYKw7mGrDLpLRPJPERFO/ugLEMIhr8= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3/go.mod h1:e0zaDIcMOQ48klOQQRw6xJJyi3F2zwmOUer8gHEFSbo= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= From d8fecb507deb934792dc7acac54271d00bf0532e Mon Sep 17 00:00:00 2001 From: Thanapat Chotipun <66824385+PatrickChoDev@users.noreply.github.com> Date: Sat, 23 Mar 2024 02:13:47 +0700 Subject: [PATCH 229/264] docs: typo in BlueGreen (#3463) --- docs/features/bluegreen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/bluegreen.md b/docs/features/bluegreen.md index 1cded0d86a..cc3e819adf 100644 --- a/docs/features/bluegreen.md +++ b/docs/features/bluegreen.md @@ -75,7 +75,7 @@ The following describes the sequence of events that happen during a blue-green u 1. Beginning at a fully promoted, steady-state, a revision 1 ReplicaSet is pointed to by both the `activeService` and `previewService`. 1. A user initiates an update by modifying the pod template (`spec.template.spec`). 1. The revision 2 ReplicaSet is created with size 0. -1. The preview service is modified to point to the revision 2 ReplicaSet. The `activeService` remains pointing to revision 1. +1. The `previewService` is modified to point to the revision 2 ReplicaSet. The `activeService` remains pointing to revision 1. 1. The revision 2 ReplicaSet is scaled to either `spec.replicas` or `previewReplicaCount` if set. 1. Once revision 2 ReplicaSet Pods are fully available, `prePromotionAnalysis` begins. 1. Upon success of `prePromotionAnalysis`, the blue/green pauses if `autoPromotionEnabled` is false, or `autoPromotionSeconds` is non-zero. From 31036b84cb51b7a5aced53497cc11ad3d156718b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 20:14:07 +0100 Subject: [PATCH 230/264] chore(deps): bump slsa-framework/slsa-github-generator from 1.9.1 to 1.10.0 (#3462) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.9.1 to 1.10.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.9.1...v1.10.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2c9b481ae2..78ae2c52bf 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -51,7 +51,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.1 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.10.0 with: image: quay.io/argoproj/argo-rollouts digest: ${{ needs.controller-image.outputs.image-digest }} @@ -67,7 +67,7 @@ jobs: id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.1 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.10.0 with: image: quay.io/argoproj/kubectl-argo-rollouts digest: ${{ needs.plugin-image.outputs.image-digest }} @@ -141,7 +141,7 @@ jobs: id-token: write # Needed for provenance signing and ID contents: write # Needed for release uploads # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator - uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.9.1 + uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.10.0 with: base64-subjects: "${{ needs.release-artifacts.outputs.hashes }}" provenance-name: "argo-rollouts.intoto.jsonl" From 3bd955a95439afcf2f32c6070e7b1d144d71b8d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Mar 2024 00:41:49 +0100 Subject: [PATCH 231/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.30.3 to 1.30.4 (#3461) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.30.3 to 1.30.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.3...service/s3/v1.30.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index da00a0467e..5e423a2e93 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.26.0 github.com/aws/aws-sdk-go-v2/config v1.27.5 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 github.com/aws/smithy-go v1.20.1 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 0a90e0dc9d..5c5c9f6e16 100644 --- a/go.sum +++ b/go.sum @@ -108,8 +108,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 h1:l3vM7tnmYWZBdyN1d2Q4gTCnDNbwKNtns4oCFt0zfQk= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3/go.mod h1:xeAHc7vhdOYwpG2t4uXdnGhOvOIpJ8n+A5AHnCkk8iw= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3 h1:RdYkpKdapqc29UYKw7mGrDLpLRPJPERFO/ugLEMIhr8= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.3/go.mod h1:e0zaDIcMOQ48klOQQRw6xJJyi3F2zwmOUer8gHEFSbo= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 h1:Lq2q/AWzFv5jHVoGJ2Hz1PkxwHYNdGzAB3lbw2g7IEU= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4/go.mod h1:SNhjWOsnsHSveL4fDQL0sDiAIMVnKrvJTp9Z/MNspx0= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 h1:x0N5ftQzgcfRpCpTiyZC40pvNUJYhzf4UgCsAyO6/P8= From 4b1cc3b579843c6f76bd23f8633fe747053e4548 Mon Sep 17 00:00:00 2001 From: shubhajyoti-bagchi-groww <114666956+shubhajyoti-bagchi-groww@users.noreply.github.com> Date: Tue, 26 Mar 2024 19:32:52 +0530 Subject: [PATCH 232/264] fix(controller): prevent negative vsvc weights on a replica scaledown following a canary abort for istio trafficrouting (#3467) * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.36.1 to 1.36.3 (#3452) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.36.1 to 1.36.3. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.36.1...service/ssm/v1.36.3) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: shubhajyoti-bagchi-groww * controller: Fixed negative canary weight bug for istio trafficrouting Signed-off-by: shubhajyoti-bagchi-groww * Added e2e test to validate the fix Signed-off-by: shubhajyoti-bagchi-groww * Removed local changes Signed-off-by: shubhajyoti-bagchi-groww * linted as per golangci-lint run Signed-off-by: shubhajyoti-bagchi-groww * docs: typo in BlueGreen (#3463) Signed-off-by: shubhajyoti-bagchi-groww * chore(deps): bump slsa-framework/slsa-github-generator from 1.9.1 to 1.10.0 (#3462) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.9.1 to 1.10.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.9.1...v1.10.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: shubhajyoti-bagchi-groww * chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.30.3 to 1.30.4 (#3461) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.30.3 to 1.30.4. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.3...service/s3/v1.30.4) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: shubhajyoti-bagchi-groww * Removed sleep and waited for 1 replicas Signed-off-by: shubhajyoti-bagchi-groww * Moved up canary weight test to match PR title Signed-off-by: shubhajyoti-bagchi-groww --------- Signed-off-by: dependabot[bot] Signed-off-by: shubhajyoti-bagchi-groww Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Thanapat Chotipun <66824385+PatrickChoDev@users.noreply.github.com> --- rollout/trafficrouting.go | 2 +- ...n-stable-downscale-after-canary-abort.yaml | 101 ++++++++++++++++++ test/e2e/istio_test.go | 26 +++++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 test/e2e/istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index 55121ecc7f..f8b01951a4 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -305,7 +305,7 @@ func (c *rolloutContext) calculateDesiredWeightOnAbortOrStableRollback() int32 { } // When using dynamic stable scaling, we must dynamically decreasing the weight to the canary // according to the availability of the stable (whatever it can support). - desiredWeight := weightutil.MaxTrafficWeight(c.rollout) - ((weightutil.MaxTrafficWeight(c.rollout) * c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas) + desiredWeight := maxInt(0, weightutil.MaxTrafficWeight(c.rollout)-((weightutil.MaxTrafficWeight(c.rollout)*c.stableRS.Status.AvailableReplicas) / *c.rollout.Spec.Replicas)) if c.rollout.Status.Canary.Weights != nil { // This ensures that if we are already at a lower weight, then we will not // increase the weight because stable availability is flapping (e.g. pod restarts) diff --git a/test/e2e/istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml b/test/e2e/istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml new file mode 100644 index 0000000000..2a67c5b5a9 --- /dev/null +++ b/test/e2e/istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml @@ -0,0 +1,101 @@ +apiVersion: v1 +kind: Service +metadata: + name: istio-subset-split-in-stable-downscale-after-canary-abort +spec: + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: istio-subset-split-in-stable-downscale-after-canary-abort + +--- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: istio-subset-split-in-stable-downscale-after-canary-abort-vsvc +spec: + hosts: + - istio-subset-split-in-stable-downscale-after-canary-abort + http: + - route: + - destination: + host: istio-subset-split-in-stable-downscale-after-canary-abort + subset: stable + weight: 100 + - destination: + host: istio-subset-split-in-stable-downscale-after-canary-abort + subset: canary + weight: 0 + +--- +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: istio-subset-split-in-stable-downscale-after-canary-abort-destrule +spec: + host: istio-subset-split-in-stable-downscale-after-canary-abort + subsets: + - name: stable + labels: + app: istio-subset-split-in-stable-downscale-after-canary-abort + - name: canary + labels: + app: istio-subset-split-in-stable-downscale-after-canary-abort + +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: istio-subset-split-in-stable-downscale-after-canary-abort +spec: + replicas: 4 + strategy: + canary: + dynamicStableScale: true + trafficRouting: + istio: + virtualService: + name: istio-subset-split-in-stable-downscale-after-canary-abort-vsvc + destinationRule: + name: istio-subset-split-in-stable-downscale-after-canary-abort-destrule + canarySubsetName: canary + stableSubsetName: stable + canaryMetadata: + labels: + role: canary + stableMetadata: + labels: + role: stable + maxSurge: "25%" + maxUnavailable: "20%" + steps: + - setWeight: 10 + - pause: {} + - setWeight: 20 + - pause: {} + - setWeight: 30 + - pause: {} + - setWeight: 50 + - pause: {} + selector: + matchLabels: + app: istio-subset-split-in-stable-downscale-after-canary-abort + template: + metadata: + labels: + app: istio-subset-split-in-stable-downscale-after-canary-abort + spec: + containers: + - name: istio-subset-split-in-stable-downscale-after-canary-abort + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m diff --git a/test/e2e/istio_test.go b/test/e2e/istio_test.go index 7ecbd66fdf..610feab03f 100644 --- a/test/e2e/istio_test.go +++ b/test/e2e/istio_test.go @@ -492,3 +492,29 @@ func (s *IstioSuite) TestIstioSubsetSplitExperimentStep() { s.TearDownSuite() } + +func (s *IstioSuite) TestIstioSubsetSplitInStableDownscaleAfterCanaryAbort() { + s.Given(). + RolloutObjects("@istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml"). + When(). + ApplyManifests(). + WaitForRolloutStatus("Healthy"). + PromoteRolloutFull(). + UpdateSpec(). + WaitForRolloutStatus("Paused"). + AbortRollout(). + WaitForRolloutStatus("Degraded"). + ScaleRollout(1). + WaitForRolloutReplicas(1). + Then(). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + stableWeight := vsvc.Spec.HTTP[0].Route[0].Weight + canaryWeight := vsvc.Spec.HTTP[0].Route[1].Weight + + assert.Equal(s.T(), int64(0), canaryWeight) + assert.Equal(s.T(), int64(100), stableWeight) + }) + + s.TearDownSuite() +} From b42741572b54cbb49f7aa98f3197a3086cc64e27 Mon Sep 17 00:00:00 2001 From: Liming Liu Date: Tue, 26 Mar 2024 23:38:41 +0800 Subject: [PATCH 233/264] fix: fix the issue that when max weight is 100000000, and the replicas> 20, the trafficWeightToReplicas will return negative value. (#3474) fix: when max weight is 100000000, the replicas can be negative. Signed-off-by: Liming Liu --- utils/replicaset/canary.go | 2 +- utils/replicaset/canary_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go index 89ba648cf2..cf41e6baa5 100755 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -383,7 +383,7 @@ func CalculateReplicaCountsForTrafficRoutedCanary(rollout *v1alpha1.Rollout, wei // trafficWeightToReplicas returns the appropriate replicas given the full spec.replicas and a weight // Rounds up if not evenly divisible. func trafficWeightToReplicas(replicas, weight, maxWeight int32) int32 { - return int32(math.Ceil(float64(weight*replicas) / float64(maxWeight))) + return int32(math.Ceil(float64(weight) * float64(replicas) / float64(maxWeight))) } func max(left, right int32) int32 { diff --git a/utils/replicaset/canary_test.go b/utils/replicaset/canary_test.go index d1d49072e8..dbe4ce5a03 100755 --- a/utils/replicaset/canary_test.go +++ b/utils/replicaset/canary_test.go @@ -960,6 +960,7 @@ func TestTrafficWeightToReplicas(t *testing.T) { assert.Equal(t, int32(4), trafficWeightToReplicas(10, 33, 100)) assert.Equal(t, int32(10), trafficWeightToReplicas(10, 99, 100)) assert.Equal(t, int32(10), trafficWeightToReplicas(10, 100, 100)) + assert.Equal(t, int32(23), trafficWeightToReplicas(23, 100000000, 100000000)) } func TestGetOtherRSs(t *testing.T) { From 2ff3c8ff8b826e7c7ccdadb9bc690d566725cd5f Mon Sep 17 00:00:00 2001 From: Chetan Banavikalmutt Date: Tue, 26 Mar 2024 21:34:57 +0530 Subject: [PATCH 234/264] feat: display init container images on the rollout dashboard (#3473) Signed-off-by: Chetan Banavikalmutt --- pkg/apiclient/rollout/rollout.pb.go | 353 ++++++++++++------ pkg/apiclient/rollout/rollout.proto | 3 + pkg/apiclient/rollout/rollout.swagger.json | 12 + .../info/replicaset_info.go | 5 + .../info/rollout_info.go | 7 + ui/src/app/components/rollout/containers.tsx | 5 +- ui/src/app/components/rollout/revision.tsx | 6 +- ui/src/app/components/rollout/rollout.tsx | 96 +++-- ui/src/models/rollout/generated/api.ts | 12 + 9 files changed, 352 insertions(+), 147 deletions(-) diff --git a/pkg/apiclient/rollout/rollout.pb.go b/pkg/apiclient/rollout/rollout.pb.go index 54e4c099a2..f25c43ced0 100644 --- a/pkg/apiclient/rollout/rollout.pb.go +++ b/pkg/apiclient/rollout/rollout.pb.go @@ -727,6 +727,7 @@ type RolloutInfo struct { AnalysisRuns []*AnalysisRunInfo `protobuf:"bytes,18,rep,name=analysisRuns,proto3" json:"analysisRuns,omitempty"` Containers []*ContainerInfo `protobuf:"bytes,19,rep,name=containers,proto3" json:"containers,omitempty"` Steps []*v1alpha1.CanaryStep `protobuf:"bytes,20,rep,name=steps,proto3" json:"steps,omitempty"` + InitContainers []*ContainerInfo `protobuf:"bytes,21,rep,name=initContainers,proto3" json:"initContainers,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -905,6 +906,13 @@ func (m *RolloutInfo) GetSteps() []*v1alpha1.CanaryStep { return nil } +func (m *RolloutInfo) GetInitContainers() []*ContainerInfo { + if m != nil { + return m.InitContainers + } + return nil +} + type ExperimentInfo struct { ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` Icon string `protobuf:"bytes,2,opt,name=icon,proto3" json:"icon,omitempty"` @@ -1017,6 +1025,7 @@ type ReplicaSetInfo struct { Pods []*PodInfo `protobuf:"bytes,14,rep,name=pods,proto3" json:"pods,omitempty"` Ping bool `protobuf:"varint,15,opt,name=ping,proto3" json:"ping,omitempty"` Pong bool `protobuf:"varint,16,opt,name=pong,proto3" json:"pong,omitempty"` + InitContainerImages []string `protobuf:"bytes,17,rep,name=initContainerImages,proto3" json:"initContainerImages,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1167,6 +1176,13 @@ func (m *ReplicaSetInfo) GetPong() bool { return false } +func (m *ReplicaSetInfo) GetInitContainerImages() []string { + if m != nil { + return m.InitContainerImages + } + return nil +} + type PodInfo struct { ObjectMeta *v1.ObjectMeta `protobuf:"bytes,1,opt,name=objectMeta,proto3" json:"objectMeta,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` @@ -1753,121 +1769,123 @@ func init() { } var fileDescriptor_99101d942e8912a7 = []byte{ - // 1821 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4f, 0x6f, 0x1c, 0x49, - 0x15, 0x57, 0x7b, 0x3c, 0xf6, 0xf8, 0x8d, 0xff, 0x96, 0xb3, 0xd9, 0xde, 0xd9, 0x60, 0x79, 0x7b, - 0x91, 0x70, 0x0c, 0x74, 0x3b, 0xde, 0x28, 0xcb, 0xf2, 0xe7, 0x60, 0x12, 0xcb, 0x1b, 0x94, 0xec, - 0x86, 0x36, 0xb0, 0x02, 0x09, 0xa2, 0x72, 0x4f, 0x79, 0xdc, 0x49, 0x4f, 0x57, 0xd3, 0x55, 0x3d, - 0x61, 0x64, 0xcd, 0x01, 0xbe, 0x00, 0x07, 0xbe, 0x02, 0x12, 0xe2, 0x84, 0x90, 0xb8, 0x70, 0xe0, - 0x8a, 0x38, 0x22, 0xf1, 0x05, 0x50, 0x84, 0x90, 0x38, 0x70, 0xe0, 0xc2, 0x19, 0xd5, 0xeb, 0xea, - 0xea, 0x3f, 0x1e, 0x27, 0x8e, 0x6c, 0x36, 0x39, 0x4d, 0xbf, 0xf7, 0xea, 0xbd, 0xf7, 0xab, 0xaa, - 0xf7, 0x5e, 0x55, 0xbd, 0x81, 0xf7, 0x93, 0xa7, 0x03, 0x8f, 0x26, 0x61, 0x10, 0x85, 0x2c, 0x96, - 0x5e, 0xca, 0xa3, 0x88, 0x67, 0xe6, 0xd7, 0x4d, 0x52, 0x2e, 0x39, 0x99, 0xd7, 0x64, 0xef, 0xc6, - 0x80, 0xf3, 0x41, 0xc4, 0x94, 0x82, 0x47, 0xe3, 0x98, 0x4b, 0x2a, 0x43, 0x1e, 0x8b, 0x7c, 0x58, - 0xef, 0xc1, 0x20, 0x94, 0x27, 0xd9, 0x91, 0x1b, 0xf0, 0xa1, 0x47, 0xd3, 0x01, 0x4f, 0x52, 0xfe, - 0x04, 0x3f, 0xbe, 0xaa, 0xf5, 0x85, 0xa7, 0xbd, 0x09, 0xcf, 0x70, 0x46, 0xb7, 0x68, 0x94, 0x9c, - 0xd0, 0x5b, 0xde, 0x80, 0xc5, 0x2c, 0xa5, 0x92, 0xf5, 0xb5, 0xb5, 0xdb, 0x4f, 0xbf, 0x26, 0xdc, - 0x90, 0xab, 0xe1, 0x43, 0x1a, 0x9c, 0x84, 0x31, 0x4b, 0xc7, 0xa5, 0xfe, 0x90, 0x49, 0xea, 0x8d, - 0xce, 0x6a, 0xbd, 0xab, 0x11, 0x22, 0x75, 0x94, 0x1d, 0x7b, 0x6c, 0x98, 0xc8, 0x71, 0x2e, 0x74, - 0xee, 0xc1, 0xaa, 0x9f, 0xfb, 0xbd, 0x1f, 0x1f, 0xf3, 0xef, 0x66, 0x2c, 0x1d, 0x13, 0x02, 0xb3, - 0x31, 0x1d, 0x32, 0xdb, 0xda, 0xb4, 0xb6, 0x16, 0x7c, 0xfc, 0x26, 0x37, 0x60, 0x41, 0xfd, 0x8a, - 0x84, 0x06, 0xcc, 0x9e, 0x41, 0x41, 0xc9, 0x70, 0x6e, 0xc3, 0xb5, 0x8a, 0x95, 0x07, 0xa1, 0x90, - 0xb9, 0xa5, 0x9a, 0x96, 0xd5, 0xd4, 0xfa, 0xa5, 0x05, 0x2b, 0x87, 0x4c, 0xde, 0x1f, 0xd2, 0x01, - 0xf3, 0xd9, 0x4f, 0x33, 0x26, 0x24, 0xb1, 0xa1, 0x58, 0x59, 0x3d, 0xbe, 0x20, 0x95, 0xad, 0x80, - 0xc7, 0x92, 0xaa, 0x59, 0x17, 0x08, 0x0c, 0x83, 0x5c, 0x83, 0x76, 0xa8, 0xec, 0xd8, 0x2d, 0x94, - 0xe4, 0x04, 0x59, 0x85, 0x96, 0xa4, 0x03, 0x7b, 0x16, 0x79, 0xea, 0xb3, 0x8e, 0xa8, 0xdd, 0x44, - 0x74, 0x02, 0xe4, 0xfb, 0x71, 0x9f, 0xeb, 0xb9, 0xbc, 0x1c, 0x53, 0x0f, 0x3a, 0x29, 0x1b, 0x85, - 0x22, 0xe4, 0x31, 0x42, 0x6a, 0xf9, 0x86, 0xae, 0x7b, 0x6a, 0x35, 0x3d, 0xdd, 0x87, 0xb7, 0x7c, - 0x26, 0x24, 0x4d, 0x65, 0xc3, 0xd9, 0xab, 0x2f, 0xfe, 0x8f, 0xe1, 0xad, 0x47, 0x29, 0x1f, 0x72, - 0xc9, 0x2e, 0x6b, 0x4a, 0x69, 0x1c, 0x67, 0x51, 0x84, 0x70, 0x3b, 0x3e, 0x7e, 0x3b, 0x07, 0xb0, - 0xbe, 0x77, 0xc4, 0xaf, 0x00, 0xe7, 0x01, 0xac, 0xfb, 0x4c, 0xa6, 0xe3, 0x4b, 0x1b, 0x7a, 0x0c, - 0x6b, 0xda, 0xc6, 0x67, 0x54, 0x06, 0x27, 0xfb, 0x23, 0x16, 0xa3, 0x19, 0x39, 0x4e, 0x8c, 0x19, - 0xf5, 0x4d, 0xee, 0x40, 0x37, 0x2d, 0xc3, 0x12, 0x0d, 0x75, 0x77, 0xaf, 0xb9, 0x45, 0x26, 0x57, - 0x42, 0xd6, 0xaf, 0x0e, 0x74, 0x1e, 0xc3, 0xd2, 0x27, 0x85, 0x37, 0xc5, 0x78, 0x71, 0x1c, 0x93, - 0x1d, 0x58, 0xa7, 0x23, 0x1a, 0x46, 0xf4, 0x28, 0x62, 0x46, 0x4f, 0xd8, 0x33, 0x9b, 0xad, 0xad, - 0x05, 0x7f, 0x9a, 0xc8, 0xb9, 0x0b, 0x2b, 0x8d, 0x7c, 0x21, 0x3b, 0xd0, 0x29, 0x0a, 0x80, 0x6d, - 0x6d, 0xb6, 0xce, 0x05, 0x6a, 0x46, 0x39, 0x1f, 0x42, 0xf7, 0x07, 0x2c, 0x55, 0xb1, 0x86, 0x18, - 0xb7, 0x60, 0xa5, 0x10, 0x69, 0xb6, 0x46, 0xda, 0x64, 0x3b, 0xbf, 0x99, 0x83, 0x6e, 0xc5, 0x24, - 0x79, 0x04, 0xc0, 0x8f, 0x9e, 0xb0, 0x40, 0x3e, 0x64, 0x92, 0xa2, 0x52, 0x77, 0x77, 0xc7, 0xcd, - 0x6b, 0x8d, 0x5b, 0xad, 0x35, 0x6e, 0xf2, 0x74, 0xa0, 0x18, 0xc2, 0x55, 0xb5, 0xc6, 0x1d, 0xdd, - 0x72, 0x3f, 0x35, 0x7a, 0x7e, 0xc5, 0x06, 0xb9, 0x0e, 0x73, 0x42, 0x52, 0x99, 0x09, 0xbd, 0x79, - 0x9a, 0x52, 0x99, 0x34, 0x64, 0x42, 0x94, 0x79, 0x5a, 0x90, 0x6a, 0xfb, 0xc2, 0x80, 0xc7, 0x3a, - 0x55, 0xf1, 0x5b, 0x65, 0x97, 0x90, 0xaa, 0x92, 0x0d, 0xc6, 0x3a, 0x55, 0x0d, 0xad, 0xc6, 0x0b, - 0xc9, 0x12, 0x7b, 0x2e, 0x1f, 0xaf, 0xbe, 0xd5, 0x2e, 0x09, 0x26, 0x3f, 0x63, 0xe1, 0xe0, 0x44, - 0xda, 0xf3, 0xf9, 0x2e, 0x19, 0x06, 0x71, 0x60, 0x91, 0x06, 0x32, 0xa3, 0x91, 0x1e, 0xd0, 0xc1, - 0x01, 0x35, 0x9e, 0xaa, 0x22, 0x29, 0xa3, 0xfd, 0xb1, 0xbd, 0xb0, 0x69, 0x6d, 0xb5, 0xfd, 0x9c, - 0x50, 0xa8, 0x83, 0x2c, 0x4d, 0x59, 0x2c, 0x6d, 0x40, 0x7e, 0x41, 0x2a, 0x49, 0x9f, 0x89, 0x30, - 0x65, 0x7d, 0xbb, 0x9b, 0x4b, 0x34, 0xa9, 0x24, 0x59, 0xd2, 0x57, 0x55, 0xd8, 0x5e, 0xcc, 0x25, - 0x9a, 0x54, 0x28, 0x4d, 0x48, 0xd8, 0x4b, 0x28, 0x2b, 0x19, 0x64, 0x13, 0xba, 0x69, 0x5e, 0x17, - 0x58, 0x7f, 0x4f, 0xda, 0xcb, 0x08, 0xb2, 0xca, 0x22, 0x1b, 0x00, 0xba, 0xc2, 0xab, 0x2d, 0x5e, - 0xc1, 0x01, 0x15, 0x0e, 0xf9, 0x48, 0x59, 0x48, 0xa2, 0x30, 0xa0, 0x87, 0x4c, 0x0a, 0x7b, 0x15, - 0x63, 0xe9, 0xed, 0x32, 0x96, 0x8c, 0x4c, 0xc7, 0x7d, 0x39, 0x56, 0xa9, 0xb2, 0x9f, 0x25, 0x2c, - 0x0d, 0x87, 0x2c, 0x96, 0xc2, 0x5e, 0x6b, 0xa8, 0xee, 0x1b, 0x59, 0xae, 0x5a, 0x19, 0x4b, 0xbe, - 0x09, 0x8b, 0x34, 0xa6, 0xd1, 0x58, 0x84, 0xc2, 0xcf, 0x62, 0x61, 0x13, 0xd4, 0xb5, 0x8d, 0xee, - 0x5e, 0x29, 0x44, 0xe5, 0xda, 0x68, 0x72, 0x07, 0xc0, 0x94, 0x72, 0x61, 0xaf, 0xa3, 0xee, 0x75, - 0xa3, 0x7b, 0xb7, 0x10, 0xa1, 0x66, 0x65, 0x24, 0xf9, 0x09, 0xb4, 0xd5, 0xce, 0x0b, 0xfb, 0x1a, - 0xaa, 0x7c, 0xec, 0x96, 0xc7, 0xad, 0x5b, 0x1c, 0xb7, 0xf8, 0xf1, 0xb8, 0xc8, 0x81, 0x32, 0x84, - 0x0d, 0xa7, 0x38, 0x6e, 0xdd, 0xbb, 0x34, 0xa6, 0xe9, 0xf8, 0x50, 0xb2, 0xc4, 0xcf, 0xcd, 0x3a, - 0x7f, 0x9a, 0x81, 0xe5, 0xfa, 0xac, 0xff, 0x0f, 0xc9, 0x52, 0x84, 0xfe, 0x4c, 0x3d, 0xf4, 0xcd, - 0xc1, 0xd2, 0x6a, 0x1c, 0x2c, 0x65, 0x72, 0xcd, 0x9e, 0x97, 0x5c, 0xed, 0x7a, 0x72, 0x35, 0x42, - 0x62, 0xee, 0x15, 0x42, 0xa2, 0xb9, 0xaf, 0xf3, 0xaf, 0xb2, 0xaf, 0xce, 0x7f, 0x5b, 0xb0, 0x5c, - 0xb7, 0xfe, 0x39, 0x16, 0x9b, 0x62, 0x5d, 0x5b, 0xe7, 0xac, 0xeb, 0xec, 0xd4, 0x75, 0x55, 0x59, - 0xd9, 0xc6, 0xe3, 0x4f, 0x53, 0x8a, 0x1f, 0x60, 0x64, 0x60, 0xb1, 0xe9, 0xf8, 0x9a, 0x52, 0x7c, - 0x1a, 0xc8, 0x70, 0xc4, 0xb0, 0xd6, 0x74, 0x7c, 0x4d, 0xa9, 0x7d, 0x48, 0x94, 0x51, 0xf6, 0x0c, - 0x6b, 0x4c, 0xc7, 0x2f, 0xc8, 0xdc, 0x3b, 0xae, 0x86, 0xd0, 0x15, 0xc6, 0xd0, 0xf5, 0xb2, 0x00, - 0xcd, 0xb2, 0xd0, 0x83, 0x8e, 0x64, 0xc3, 0x24, 0xa2, 0x92, 0x61, 0xa5, 0x59, 0xf0, 0x0d, 0x4d, - 0xbe, 0x02, 0x6b, 0x22, 0xa0, 0x11, 0xbb, 0xc7, 0x9f, 0xc5, 0xf7, 0x18, 0xed, 0x47, 0x61, 0xcc, - 0xb0, 0xe8, 0x2c, 0xf8, 0x67, 0x05, 0x0a, 0x35, 0xde, 0x8d, 0x84, 0xbd, 0x84, 0xe7, 0x93, 0xa6, - 0xc8, 0x17, 0x61, 0x36, 0xe1, 0x7d, 0x61, 0x2f, 0xe3, 0x06, 0xaf, 0x9a, 0x0d, 0x7e, 0xc4, 0xfb, - 0xb8, 0xb1, 0x28, 0x55, 0x6b, 0x9a, 0x84, 0xf1, 0x00, 0xcb, 0x4e, 0xc7, 0xc7, 0x6f, 0xe4, 0xf1, - 0x78, 0x60, 0xaf, 0x6a, 0x1e, 0x8f, 0x07, 0xce, 0x1f, 0x2d, 0x98, 0xd7, 0x9a, 0xaf, 0x79, 0xc7, - 0x4d, 0x49, 0xcf, 0x93, 0x45, 0x97, 0x74, 0xdc, 0x09, 0xac, 0xa9, 0x02, 0x77, 0x1b, 0x77, 0x22, - 0xa7, 0x9d, 0x8f, 0x60, 0xa9, 0x56, 0x71, 0xa6, 0xde, 0x50, 0xcc, 0x7d, 0x73, 0xa6, 0x72, 0xdf, - 0x74, 0xfe, 0x63, 0xc1, 0xfc, 0x77, 0xf8, 0xd1, 0x1b, 0x30, 0xed, 0x0d, 0x80, 0x21, 0x93, 0x69, - 0x18, 0xa8, 0x5b, 0x87, 0x9e, 0x7b, 0x85, 0x43, 0x3e, 0x86, 0x85, 0xf2, 0x94, 0x69, 0x23, 0xb8, - 0xed, 0x8b, 0x81, 0xfb, 0x5e, 0x38, 0x64, 0x7e, 0xa9, 0xec, 0xfc, 0xd3, 0x02, 0xbb, 0x52, 0x05, - 0x0e, 0x13, 0x16, 0xec, 0xc5, 0xfd, 0xc3, 0x1c, 0x1a, 0x85, 0x59, 0x91, 0xb0, 0x40, 0x4f, 0xff, - 0xe1, 0xe5, 0xea, 0x73, 0xc3, 0x8b, 0x8f, 0xa6, 0xc9, 0xa0, 0xb6, 0x2a, 0xdd, 0xdd, 0x4f, 0xaf, - 0xce, 0x09, 0x9a, 0x2d, 0x96, 0xd9, 0xf9, 0x77, 0x0b, 0x56, 0x1a, 0xe5, 0xee, 0x0d, 0x3e, 0x0d, - 0x36, 0x00, 0x44, 0x16, 0x04, 0x4c, 0x88, 0xe3, 0x2c, 0xd2, 0x31, 0x5e, 0xe1, 0x28, 0xbd, 0x63, - 0x1a, 0x46, 0xac, 0x8f, 0x55, 0xad, 0xed, 0x6b, 0x4a, 0x5d, 0x93, 0xc2, 0x38, 0xe0, 0x71, 0x10, - 0x65, 0xa2, 0xa8, 0x6d, 0x6d, 0xbf, 0xc6, 0x53, 0xc1, 0xcf, 0xd2, 0x94, 0xa7, 0x58, 0xdf, 0xda, - 0x7e, 0x4e, 0xa8, 0x0a, 0xf2, 0x84, 0x1f, 0xa9, 0xca, 0x56, 0xaf, 0x20, 0x3a, 0x21, 0x7c, 0x94, - 0x92, 0x0f, 0x00, 0x62, 0x1e, 0x6b, 0x9e, 0x0d, 0x38, 0x76, 0xdd, 0x8c, 0xfd, 0xc4, 0x88, 0xfc, - 0xca, 0x30, 0xb2, 0xad, 0x8e, 0x36, 0x15, 0xbb, 0xc2, 0xee, 0x36, 0xac, 0x3f, 0xcc, 0xf9, 0x7e, - 0x31, 0x80, 0x1c, 0xc0, 0x92, 0xa8, 0xc6, 0x20, 0x96, 0xc2, 0xee, 0xee, 0x7b, 0xd3, 0x8e, 0xac, - 0x5a, 0xb0, 0xfa, 0x75, 0x3d, 0xe7, 0xd7, 0x16, 0x40, 0x89, 0x47, 0x4d, 0x7a, 0x44, 0xa3, 0xac, - 0x28, 0x03, 0x39, 0x71, 0x6e, 0x4e, 0xd6, 0xf3, 0xaf, 0xf5, 0xe2, 0xfc, 0x9b, 0xbd, 0x4c, 0xfe, - 0xfd, 0xde, 0x82, 0x79, 0xbd, 0x08, 0x53, 0x2b, 0xd5, 0x36, 0xac, 0xea, 0x6d, 0xbf, 0xcb, 0xe3, - 0x7e, 0x28, 0x43, 0x13, 0x5c, 0x67, 0xf8, 0x6a, 0x8e, 0x01, 0xcf, 0x62, 0x89, 0x80, 0xdb, 0x7e, - 0x4e, 0xa8, 0x03, 0xa6, 0xba, 0xfd, 0x0f, 0xc2, 0x61, 0x98, 0x63, 0x6e, 0xfb, 0x67, 0x05, 0x2a, - 0x80, 0x54, 0x28, 0x65, 0xa9, 0x1e, 0x98, 0x87, 0x5e, 0x8d, 0xb7, 0xfb, 0xaf, 0x25, 0x58, 0xd6, - 0x2f, 0x90, 0x43, 0x96, 0x8e, 0xc2, 0x80, 0x11, 0x01, 0xcb, 0x07, 0x4c, 0x56, 0x9f, 0x25, 0xef, - 0x4c, 0x7b, 0xff, 0x60, 0x5f, 0xa1, 0x37, 0xf5, 0x69, 0xe4, 0xec, 0xfc, 0xe2, 0x6f, 0xff, 0xf8, - 0xd5, 0xcc, 0x36, 0xd9, 0xc2, 0x66, 0xcc, 0xe8, 0x56, 0xd9, 0x51, 0x39, 0x35, 0x8f, 0xb5, 0x49, - 0xfe, 0x3d, 0xf1, 0x42, 0xe5, 0x62, 0x02, 0xab, 0xf8, 0x84, 0xbc, 0x94, 0xdb, 0x3b, 0xe8, 0x76, - 0x87, 0xb8, 0x17, 0x75, 0xeb, 0x3d, 0x53, 0x3e, 0x77, 0x2c, 0x32, 0x82, 0x55, 0xf5, 0xf6, 0xab, - 0x18, 0x13, 0xe4, 0x0b, 0xd3, 0x7c, 0x98, 0x8e, 0x4a, 0xcf, 0x3e, 0x4f, 0xec, 0xdc, 0x44, 0x18, - 0xef, 0x93, 0xf7, 0x5e, 0x08, 0x03, 0xa7, 0xfd, 0x73, 0x0b, 0xd6, 0x9a, 0xf3, 0x7e, 0xa9, 0xe7, - 0x5e, 0x53, 0x5c, 0x3e, 0xbe, 0x1d, 0x0f, 0x7d, 0xdf, 0x24, 0x5f, 0x7a, 0xa9, 0x6f, 0x33, 0xf7, - 0x1f, 0xc2, 0xe2, 0x01, 0x93, 0xe6, 0x4d, 0x4c, 0xae, 0xbb, 0x79, 0x9b, 0xca, 0x2d, 0xda, 0x54, - 0xee, 0xfe, 0x30, 0x91, 0xe3, 0x5e, 0xf9, 0x0c, 0xa8, 0x3d, 0xc9, 0x9d, 0x77, 0xd0, 0xe5, 0x3a, - 0x59, 0x2b, 0x5c, 0x96, 0xef, 0xf1, 0xdf, 0x59, 0xea, 0xd6, 0x59, 0x6d, 0xae, 0x90, 0x8d, 0xca, - 0x65, 0x77, 0x4a, 0xd7, 0xa5, 0xb7, 0x7f, 0xb9, 0x43, 0x43, 0x5b, 0x2b, 0x42, 0xa1, 0xf7, 0xe5, - 0x8b, 0x84, 0x82, 0xbe, 0x70, 0x7c, 0xdd, 0xda, 0x46, 0xc4, 0xf5, 0x1e, 0x4e, 0x05, 0xf1, 0xd4, - 0xe6, 0xce, 0x6b, 0x41, 0x9c, 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x5a, 0xb0, 0x58, 0x6d, 0x0b, 0x91, - 0x1b, 0x65, 0x7d, 0x3d, 0xdb, 0x2d, 0xba, 0x2a, 0xb4, 0xb7, 0x11, 0xad, 0xdb, 0xbb, 0x79, 0x11, - 0xb4, 0x54, 0xe1, 0x50, 0x58, 0xff, 0x9c, 0xf7, 0x19, 0x8b, 0xa8, 0xc6, 0xce, 0x60, 0x99, 0x47, - 0x8d, 0x0e, 0xe4, 0x55, 0x41, 0xf5, 0x11, 0xea, 0x83, 0xde, 0xc1, 0x8b, 0xa1, 0x6a, 0xee, 0xc4, - 0x13, 0x4c, 0x7a, 0xa7, 0xe6, 0x69, 0x3b, 0xf1, 0x4e, 0xf1, 0x46, 0xf9, 0xad, 0xed, 0xed, 0x89, - 0x77, 0x2a, 0xe9, 0x60, 0xa2, 0x26, 0xf2, 0x07, 0x0b, 0xba, 0x95, 0xfe, 0x24, 0x79, 0xd7, 0x4c, - 0xe2, 0x6c, 0xd7, 0xf2, 0xaa, 0xe6, 0xb1, 0x87, 0xf3, 0xf8, 0x46, 0xef, 0xce, 0x05, 0xe7, 0x91, - 0xc5, 0x7d, 0xee, 0x9d, 0x16, 0xd7, 0x93, 0x49, 0x11, 0x2b, 0xd5, 0xce, 0x5f, 0x25, 0x56, 0xa6, - 0x34, 0x04, 0x5f, 0x4b, 0xac, 0xa4, 0x0a, 0x87, 0xc2, 0xfa, 0x08, 0xe6, 0x75, 0x9b, 0xec, 0xdc, - 0x8a, 0x54, 0x9e, 0x02, 0x95, 0xf6, 0x9b, 0xf3, 0x36, 0xba, 0x5b, 0x23, 0x2b, 0x85, 0xbb, 0x51, - 0x2e, 0xfc, 0xf6, 0xfe, 0x5f, 0x9e, 0x6f, 0x58, 0x7f, 0x7d, 0xbe, 0x61, 0xfd, 0xfd, 0xf9, 0x86, - 0xf5, 0xa3, 0x0f, 0x2f, 0xfc, 0x87, 0x40, 0xfd, 0xef, 0x87, 0xa3, 0x39, 0x44, 0xf1, 0xc1, 0xff, - 0x02, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x35, 0xff, 0xe4, 0x9e, 0x18, 0x00, 0x00, + // 1848 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x5f, 0x6f, 0x1c, 0x49, + 0x11, 0xd7, 0x78, 0xbd, 0xf6, 0xba, 0xd6, 0x7f, 0xdb, 0x49, 0x6e, 0x6e, 0x2f, 0x58, 0xbe, 0x39, + 0x24, 0x1c, 0x03, 0x33, 0x8e, 0x2f, 0xca, 0x71, 0xfc, 0x93, 0x8c, 0x63, 0xf9, 0x82, 0x92, 0xbb, + 0x30, 0x06, 0x4e, 0x20, 0x41, 0xd4, 0x9e, 0x6d, 0xaf, 0x27, 0x99, 0x9d, 0x1e, 0xa6, 0x7b, 0x36, + 0xac, 0x2c, 0x3f, 0xc0, 0x17, 0xe0, 0x81, 0xaf, 0xc0, 0x03, 0x3c, 0x21, 0x24, 0x5e, 0x78, 0xe0, + 0x15, 0xf1, 0x88, 0xc4, 0x17, 0x40, 0x11, 0x02, 0xf1, 0xc0, 0x03, 0xdf, 0x00, 0x75, 0x4d, 0x4f, + 0xcf, 0x1f, 0xaf, 0x1d, 0x47, 0x36, 0xe4, 0x9e, 0x76, 0xaa, 0xaa, 0xab, 0xea, 0xd7, 0xdd, 0x55, + 0xd5, 0xdd, 0xb5, 0xf0, 0x5e, 0xf2, 0x7c, 0xe0, 0xd1, 0x24, 0x0c, 0xa2, 0x90, 0xc5, 0xd2, 0x4b, + 0x79, 0x14, 0xf1, 0xcc, 0xfc, 0xba, 0x49, 0xca, 0x25, 0x27, 0xb3, 0x9a, 0xec, 0xdd, 0x1e, 0x70, + 0x3e, 0x88, 0x98, 0x52, 0xf0, 0x68, 0x1c, 0x73, 0x49, 0x65, 0xc8, 0x63, 0x91, 0x0f, 0xeb, 0x3d, + 0x1a, 0x84, 0xf2, 0x38, 0x3b, 0x74, 0x03, 0x3e, 0xf4, 0x68, 0x3a, 0xe0, 0x49, 0xca, 0x9f, 0xe1, + 0xc7, 0x97, 0xb5, 0xbe, 0xf0, 0xb4, 0x37, 0xe1, 0x19, 0xce, 0xe8, 0x2e, 0x8d, 0x92, 0x63, 0x7a, + 0xd7, 0x1b, 0xb0, 0x98, 0xa5, 0x54, 0xb2, 0xbe, 0xb6, 0x76, 0xef, 0xf9, 0x57, 0x84, 0x1b, 0x72, + 0x35, 0x7c, 0x48, 0x83, 0xe3, 0x30, 0x66, 0xe9, 0xb8, 0xd4, 0x1f, 0x32, 0x49, 0xbd, 0xd1, 0x59, + 0xad, 0x77, 0x34, 0x42, 0xa4, 0x0e, 0xb3, 0x23, 0x8f, 0x0d, 0x13, 0x39, 0xce, 0x85, 0xce, 0x03, + 0x58, 0xf6, 0x73, 0xbf, 0x0f, 0xe3, 0x23, 0xfe, 0x9d, 0x8c, 0xa5, 0x63, 0x42, 0x60, 0x3a, 0xa6, + 0x43, 0x66, 0x5b, 0xeb, 0xd6, 0xc6, 0x9c, 0x8f, 0xdf, 0xe4, 0x36, 0xcc, 0xa9, 0x5f, 0x91, 0xd0, + 0x80, 0xd9, 0x53, 0x28, 0x28, 0x19, 0xce, 0x3d, 0xb8, 0x51, 0xb1, 0xf2, 0x28, 0x14, 0x32, 0xb7, + 0x54, 0xd3, 0xb2, 0x9a, 0x5a, 0xbf, 0xb0, 0x60, 0xe9, 0x80, 0xc9, 0x87, 0x43, 0x3a, 0x60, 0x3e, + 0xfb, 0x49, 0xc6, 0x84, 0x24, 0x36, 0x14, 0x2b, 0xab, 0xc7, 0x17, 0xa4, 0xb2, 0x15, 0xf0, 0x58, + 0x52, 0x35, 0xeb, 0x02, 0x81, 0x61, 0x90, 0x1b, 0xd0, 0x0e, 0x95, 0x1d, 0xbb, 0x85, 0x92, 0x9c, + 0x20, 0xcb, 0xd0, 0x92, 0x74, 0x60, 0x4f, 0x23, 0x4f, 0x7d, 0xd6, 0x11, 0xb5, 0x9b, 0x88, 0x8e, + 0x81, 0x7c, 0x2f, 0xee, 0x73, 0x3d, 0x97, 0x57, 0x63, 0xea, 0x41, 0x27, 0x65, 0xa3, 0x50, 0x84, + 0x3c, 0x46, 0x48, 0x2d, 0xdf, 0xd0, 0x75, 0x4f, 0xad, 0xa6, 0xa7, 0x87, 0x70, 0xd3, 0x67, 0x42, + 0xd2, 0x54, 0x36, 0x9c, 0xbd, 0xfe, 0xe2, 0xff, 0x08, 0x6e, 0x3e, 0x49, 0xf9, 0x90, 0x4b, 0x76, + 0x55, 0x53, 0x4a, 0xe3, 0x28, 0x8b, 0x22, 0x84, 0xdb, 0xf1, 0xf1, 0xdb, 0xd9, 0x87, 0xd5, 0x9d, + 0x43, 0x7e, 0x0d, 0x38, 0xf7, 0x61, 0xd5, 0x67, 0x32, 0x1d, 0x5f, 0xd9, 0xd0, 0x53, 0x58, 0xd1, + 0x36, 0x3e, 0xa5, 0x32, 0x38, 0xde, 0x1b, 0xb1, 0x18, 0xcd, 0xc8, 0x71, 0x62, 0xcc, 0xa8, 0x6f, + 0x72, 0x1f, 0xba, 0x69, 0x19, 0x96, 0x68, 0xa8, 0xbb, 0x7d, 0xc3, 0x2d, 0x32, 0xb9, 0x12, 0xb2, + 0x7e, 0x75, 0xa0, 0xf3, 0x14, 0x16, 0x3e, 0x2e, 0xbc, 0x29, 0xc6, 0xc5, 0x71, 0x4c, 0xb6, 0x60, + 0x95, 0x8e, 0x68, 0x18, 0xd1, 0xc3, 0x88, 0x19, 0x3d, 0x61, 0x4f, 0xad, 0xb7, 0x36, 0xe6, 0xfc, + 0x49, 0x22, 0x67, 0x17, 0x96, 0x1a, 0xf9, 0x42, 0xb6, 0xa0, 0x53, 0x14, 0x00, 0xdb, 0x5a, 0x6f, + 0x9d, 0x0b, 0xd4, 0x8c, 0x72, 0x3e, 0x80, 0xee, 0xf7, 0x59, 0xaa, 0x62, 0x0d, 0x31, 0x6e, 0xc0, + 0x52, 0x21, 0xd2, 0x6c, 0x8d, 0xb4, 0xc9, 0x76, 0xfe, 0x39, 0x03, 0xdd, 0x8a, 0x49, 0xf2, 0x04, + 0x80, 0x1f, 0x3e, 0x63, 0x81, 0x7c, 0xcc, 0x24, 0x45, 0xa5, 0xee, 0xf6, 0x96, 0x9b, 0xd7, 0x1a, + 0xb7, 0x5a, 0x6b, 0xdc, 0xe4, 0xf9, 0x40, 0x31, 0x84, 0xab, 0x6a, 0x8d, 0x3b, 0xba, 0xeb, 0x7e, + 0x62, 0xf4, 0xfc, 0x8a, 0x0d, 0x72, 0x0b, 0x66, 0x84, 0xa4, 0x32, 0x13, 0x7a, 0xf3, 0x34, 0xa5, + 0x32, 0x69, 0xc8, 0x84, 0x28, 0xf3, 0xb4, 0x20, 0xd5, 0xf6, 0x85, 0x01, 0x8f, 0x75, 0xaa, 0xe2, + 0xb7, 0xca, 0x2e, 0x21, 0x55, 0x25, 0x1b, 0x8c, 0x75, 0xaa, 0x1a, 0x5a, 0x8d, 0x17, 0x92, 0x25, + 0xf6, 0x4c, 0x3e, 0x5e, 0x7d, 0xab, 0x5d, 0x12, 0x4c, 0x7e, 0xca, 0xc2, 0xc1, 0xb1, 0xb4, 0x67, + 0xf3, 0x5d, 0x32, 0x0c, 0xe2, 0xc0, 0x3c, 0x0d, 0x64, 0x46, 0x23, 0x3d, 0xa0, 0x83, 0x03, 0x6a, + 0x3c, 0x55, 0x45, 0x52, 0x46, 0xfb, 0x63, 0x7b, 0x6e, 0xdd, 0xda, 0x68, 0xfb, 0x39, 0xa1, 0x50, + 0x07, 0x59, 0x9a, 0xb2, 0x58, 0xda, 0x80, 0xfc, 0x82, 0x54, 0x92, 0x3e, 0x13, 0x61, 0xca, 0xfa, + 0x76, 0x37, 0x97, 0x68, 0x52, 0x49, 0xb2, 0xa4, 0xaf, 0xaa, 0xb0, 0x3d, 0x9f, 0x4b, 0x34, 0xa9, + 0x50, 0x9a, 0x90, 0xb0, 0x17, 0x50, 0x56, 0x32, 0xc8, 0x3a, 0x74, 0xd3, 0xbc, 0x2e, 0xb0, 0xfe, + 0x8e, 0xb4, 0x17, 0x11, 0x64, 0x95, 0x45, 0xd6, 0x00, 0x74, 0x85, 0x57, 0x5b, 0xbc, 0x84, 0x03, + 0x2a, 0x1c, 0xf2, 0xa1, 0xb2, 0x90, 0x44, 0x61, 0x40, 0x0f, 0x98, 0x14, 0xf6, 0x32, 0xc6, 0xd2, + 0x5b, 0x65, 0x2c, 0x19, 0x99, 0x8e, 0xfb, 0x72, 0xac, 0x52, 0x65, 0x3f, 0x4d, 0x58, 0x1a, 0x0e, + 0x59, 0x2c, 0x85, 0xbd, 0xd2, 0x50, 0xdd, 0x33, 0xb2, 0x5c, 0xb5, 0x32, 0x96, 0x7c, 0x1d, 0xe6, + 0x69, 0x4c, 0xa3, 0xb1, 0x08, 0x85, 0x9f, 0xc5, 0xc2, 0x26, 0xa8, 0x6b, 0x1b, 0xdd, 0x9d, 0x52, + 0x88, 0xca, 0xb5, 0xd1, 0xe4, 0x3e, 0x80, 0x29, 0xe5, 0xc2, 0x5e, 0x45, 0xdd, 0x5b, 0x46, 0x77, + 0xb7, 0x10, 0xa1, 0x66, 0x65, 0x24, 0xf9, 0x31, 0xb4, 0xd5, 0xce, 0x0b, 0xfb, 0x06, 0xaa, 0x7c, + 0xe4, 0x96, 0xc7, 0xad, 0x5b, 0x1c, 0xb7, 0xf8, 0xf1, 0xb4, 0xc8, 0x81, 0x32, 0x84, 0x0d, 0xa7, + 0x38, 0x6e, 0xdd, 0x5d, 0x1a, 0xd3, 0x74, 0x7c, 0x20, 0x59, 0xe2, 0xe7, 0x66, 0xc9, 0x37, 0x61, + 0x31, 0x8c, 0x43, 0xb9, 0x5b, 0x62, 0xbb, 0x79, 0x21, 0xb6, 0xc6, 0x68, 0xe7, 0x8f, 0x53, 0xb0, + 0x58, 0x5f, 0xb5, 0xff, 0x41, 0xb2, 0x15, 0xa9, 0x33, 0x55, 0x4f, 0x1d, 0x73, 0x30, 0xb5, 0x1a, + 0x07, 0x53, 0x99, 0x9c, 0xd3, 0xe7, 0x25, 0x67, 0xbb, 0x9e, 0x9c, 0x8d, 0x90, 0x9a, 0x79, 0x8d, + 0x90, 0x6a, 0xc6, 0xc5, 0xec, 0xeb, 0xc4, 0x85, 0xf3, 0xeb, 0x69, 0x58, 0xac, 0x5b, 0xff, 0x3f, + 0x16, 0xab, 0x62, 0x5d, 0x5b, 0xe7, 0xac, 0xeb, 0xf4, 0xc4, 0x75, 0x55, 0x59, 0xdd, 0xc6, 0xe3, + 0x53, 0x53, 0x8a, 0x1f, 0x60, 0x64, 0x61, 0xb1, 0xea, 0xf8, 0x9a, 0x52, 0x7c, 0x1a, 0xc8, 0x70, + 0xc4, 0xb0, 0x56, 0x75, 0x7c, 0x4d, 0xa9, 0x7d, 0x48, 0x94, 0x51, 0xf6, 0x02, 0x6b, 0x54, 0xc7, + 0x2f, 0xc8, 0xdc, 0x3b, 0xae, 0x86, 0xd0, 0x15, 0xca, 0xd0, 0xf5, 0xb2, 0x02, 0xcd, 0xb2, 0xd2, + 0x83, 0x8e, 0x64, 0xc3, 0x24, 0xa2, 0x92, 0x61, 0xa5, 0x9a, 0xf3, 0x0d, 0x4d, 0xbe, 0x04, 0x2b, + 0x22, 0xa0, 0x11, 0x7b, 0xc0, 0x5f, 0xc4, 0x0f, 0x18, 0xed, 0x47, 0x61, 0xcc, 0xb0, 0x68, 0xcd, + 0xf9, 0x67, 0x05, 0x0a, 0x35, 0xde, 0xad, 0x84, 0xbd, 0x80, 0xe7, 0x9b, 0xa6, 0xc8, 0xe7, 0x61, + 0x3a, 0xe1, 0x7d, 0x61, 0x2f, 0xe2, 0x06, 0x2f, 0x9b, 0x0d, 0x7e, 0xc2, 0xfb, 0xb8, 0xb1, 0x28, + 0x55, 0x6b, 0x9a, 0x84, 0xf1, 0x00, 0xcb, 0x56, 0xc7, 0xc7, 0x6f, 0xe4, 0xf1, 0x78, 0x60, 0x2f, + 0x6b, 0x1e, 0x8f, 0x07, 0xea, 0x48, 0xad, 0xa5, 0xd2, 0xc3, 0xdc, 0xe5, 0x4a, 0x7e, 0xa4, 0x4e, + 0x10, 0x39, 0x7f, 0xb0, 0x60, 0x56, 0xfb, 0x7a, 0xc3, 0x31, 0x62, 0x0e, 0x91, 0x3c, 0xbd, 0xf4, + 0x21, 0x82, 0x7b, 0x87, 0x55, 0x5c, 0x60, 0x7c, 0xe0, 0xde, 0xe5, 0xb4, 0xf3, 0x21, 0x2c, 0xd4, + 0xea, 0xc8, 0xc4, 0x3b, 0x91, 0xb9, 0xe1, 0x4e, 0x55, 0x6e, 0xb8, 0xce, 0x7f, 0x2c, 0x98, 0xfd, + 0x36, 0x3f, 0xfc, 0x0c, 0x4c, 0x7b, 0x0d, 0x60, 0xc8, 0x64, 0x1a, 0x06, 0xea, 0x9e, 0xa3, 0xe7, + 0x5e, 0xe1, 0x90, 0x8f, 0x60, 0xae, 0x3c, 0xd7, 0xda, 0x08, 0x6e, 0xf3, 0x72, 0xe0, 0xbe, 0x1b, + 0x0e, 0x99, 0x5f, 0x2a, 0x3b, 0xff, 0xb0, 0xc0, 0xae, 0xd4, 0x8d, 0x83, 0x84, 0x05, 0x3b, 0x71, + 0xff, 0x20, 0x87, 0x46, 0x61, 0x5a, 0x24, 0x2c, 0xd0, 0xd3, 0x7f, 0x7c, 0xb5, 0x13, 0xa1, 0xe1, + 0xc5, 0x47, 0xd3, 0x64, 0x50, 0x5b, 0x95, 0xee, 0xf6, 0x27, 0xd7, 0xe7, 0x04, 0xcd, 0x16, 0xcb, + 0xec, 0xfc, 0xbb, 0x05, 0x4b, 0x8d, 0x02, 0xf9, 0x19, 0x3e, 0x3f, 0xd6, 0x00, 0x44, 0x16, 0x04, + 0x4c, 0x88, 0xa3, 0x2c, 0xd2, 0x31, 0x5e, 0xe1, 0x28, 0xbd, 0x23, 0x1a, 0x46, 0xac, 0x8f, 0x75, + 0xb0, 0xed, 0x6b, 0x4a, 0x5d, 0xcc, 0xc2, 0x38, 0xe0, 0x71, 0x10, 0x65, 0xa2, 0xa8, 0x86, 0x6d, + 0xbf, 0xc6, 0x53, 0xc1, 0xcf, 0xd2, 0x94, 0xa7, 0x58, 0x11, 0xdb, 0x7e, 0x4e, 0xa8, 0x9a, 0xf3, + 0x8c, 0x1f, 0xaa, 0x5a, 0x58, 0xaf, 0x39, 0x3a, 0x21, 0x7c, 0x94, 0x92, 0xf7, 0x01, 0x62, 0x1e, + 0x6b, 0x9e, 0x0d, 0x38, 0x76, 0xd5, 0x8c, 0xfd, 0xd8, 0x88, 0xfc, 0xca, 0x30, 0xb2, 0xa9, 0x0e, + 0x43, 0x15, 0xbb, 0xc2, 0xee, 0x36, 0xac, 0x3f, 0xce, 0xf9, 0x7e, 0x31, 0x80, 0xec, 0xc3, 0x82, + 0xa8, 0xc6, 0x20, 0x16, 0xcf, 0xee, 0xf6, 0xbb, 0x93, 0x0e, 0xb9, 0x5a, 0xb0, 0xfa, 0x75, 0x3d, + 0xe7, 0x57, 0x16, 0x40, 0x89, 0x47, 0x4d, 0x7a, 0x44, 0xa3, 0xac, 0x28, 0x03, 0x39, 0x71, 0x6e, + 0x4e, 0xd6, 0xf3, 0xaf, 0x75, 0x71, 0xfe, 0x4d, 0x5f, 0x25, 0xff, 0x7e, 0x67, 0xc1, 0xac, 0x5e, + 0x84, 0x89, 0x95, 0x6a, 0x13, 0x96, 0xf5, 0xb6, 0xef, 0xf2, 0xb8, 0x1f, 0xca, 0xd0, 0x04, 0xd7, + 0x19, 0xbe, 0x9a, 0x63, 0xc0, 0xb3, 0x58, 0x22, 0xe0, 0xb6, 0x9f, 0x13, 0xea, 0x48, 0xaa, 0x6e, + 0xff, 0xa3, 0x70, 0x18, 0xe6, 0x98, 0xdb, 0xfe, 0x59, 0x81, 0x0a, 0x20, 0x15, 0x4a, 0x59, 0xaa, + 0x07, 0xe6, 0xa1, 0x57, 0xe3, 0x6d, 0xff, 0x6b, 0x01, 0x16, 0xf5, 0x9b, 0xe7, 0x80, 0xa5, 0xa3, + 0x30, 0x60, 0x44, 0xc0, 0xe2, 0x3e, 0x93, 0xd5, 0x87, 0xd0, 0xdb, 0x93, 0x5e, 0x5c, 0xd8, 0xc9, + 0xe8, 0x4d, 0x7c, 0x8c, 0x39, 0x5b, 0x3f, 0xff, 0xeb, 0xdf, 0x7f, 0x39, 0xb5, 0x49, 0x36, 0xb0, + 0xfd, 0x33, 0xba, 0x5b, 0xf6, 0x70, 0x4e, 0xcc, 0xf3, 0xf0, 0x34, 0xff, 0x3e, 0xf5, 0x42, 0xe5, + 0xe2, 0x14, 0x96, 0xf1, 0xd1, 0x7a, 0x25, 0xb7, 0xf7, 0xd1, 0xed, 0x16, 0x71, 0x2f, 0xeb, 0xd6, + 0x7b, 0xa1, 0x7c, 0x6e, 0x59, 0x64, 0x04, 0xcb, 0xea, 0xb5, 0x59, 0x31, 0x26, 0xc8, 0xe7, 0x26, + 0xf9, 0x30, 0x3d, 0x9c, 0x9e, 0x7d, 0x9e, 0xd8, 0xb9, 0x83, 0x30, 0xde, 0x23, 0xef, 0x5e, 0x08, + 0x03, 0xa7, 0xfd, 0x33, 0x0b, 0x56, 0x9a, 0xf3, 0x7e, 0xa5, 0xe7, 0x5e, 0x53, 0x5c, 0x3e, 0xf7, + 0x1d, 0x0f, 0x7d, 0xdf, 0x21, 0x5f, 0x78, 0xa5, 0x6f, 0x33, 0xf7, 0x1f, 0xc0, 0xfc, 0x3e, 0x93, + 0xe6, 0x15, 0x4e, 0x6e, 0xb9, 0x79, 0x63, 0xcc, 0x2d, 0x1a, 0x63, 0xee, 0xde, 0x30, 0x91, 0xe3, + 0x5e, 0x79, 0xb9, 0xaf, 0x35, 0x01, 0x9c, 0xb7, 0xd1, 0xe5, 0x2a, 0x59, 0x29, 0x5c, 0x96, 0x1d, + 0x80, 0xdf, 0x5a, 0xea, 0x9e, 0x5a, 0x6d, 0xe7, 0x90, 0xb5, 0xca, 0xf5, 0x78, 0x42, 0x9f, 0xa7, + 0xb7, 0x77, 0xb5, 0x43, 0x43, 0x5b, 0x2b, 0x42, 0xa1, 0xf7, 0xc5, 0xcb, 0x84, 0x82, 0xbe, 0x70, + 0x7c, 0xd5, 0xda, 0x44, 0xc4, 0xf5, 0xae, 0x51, 0x05, 0xf1, 0xc4, 0x76, 0xd2, 0x1b, 0x41, 0x9c, + 0xe4, 0x48, 0x14, 0xe2, 0xdf, 0x58, 0x30, 0x5f, 0x6d, 0x44, 0x91, 0xdb, 0x65, 0x7d, 0x3d, 0xdb, + 0x9f, 0xba, 0x2e, 0xb4, 0xf7, 0x10, 0xad, 0xdb, 0xbb, 0x73, 0x19, 0xb4, 0x54, 0xe1, 0x50, 0x58, + 0xff, 0x94, 0x77, 0x36, 0x8b, 0xa8, 0xc6, 0x5e, 0x64, 0x99, 0x47, 0x8d, 0x9e, 0xe7, 0x75, 0x41, + 0xf5, 0x11, 0xea, 0xa3, 0xde, 0xfe, 0xc5, 0x50, 0x35, 0xf7, 0xd4, 0x13, 0x4c, 0x7a, 0x27, 0xe6, + 0x31, 0x7d, 0xea, 0x9d, 0xe0, 0x8d, 0xf2, 0x1b, 0x9b, 0x9b, 0xa7, 0xde, 0x89, 0xa4, 0x83, 0x53, + 0x35, 0x91, 0xdf, 0x5b, 0xd0, 0xad, 0x74, 0x44, 0xc9, 0x3b, 0x66, 0x12, 0x67, 0xfb, 0xa4, 0xd7, + 0x35, 0x8f, 0x1d, 0x9c, 0xc7, 0xd7, 0x7a, 0xf7, 0x2f, 0x39, 0x8f, 0x2c, 0xee, 0x73, 0xef, 0xa4, + 0xb8, 0x9e, 0x9c, 0x16, 0xb1, 0x52, 0xed, 0x35, 0x56, 0x62, 0x65, 0x42, 0x0b, 0xf2, 0x8d, 0xc4, + 0x4a, 0xaa, 0x70, 0x28, 0xac, 0x4f, 0x60, 0x56, 0x37, 0xe6, 0xce, 0xad, 0x48, 0xe5, 0x29, 0x50, + 0x69, 0xf8, 0x39, 0x6f, 0xa1, 0xbb, 0x15, 0xb2, 0x54, 0xb8, 0x1b, 0xe5, 0xc2, 0x6f, 0xed, 0xfd, + 0xf9, 0xe5, 0x9a, 0xf5, 0x97, 0x97, 0x6b, 0xd6, 0xdf, 0x5e, 0xae, 0x59, 0x3f, 0xfc, 0xe0, 0xd2, + 0x7f, 0x41, 0xd4, 0xff, 0xf0, 0x38, 0x9c, 0x41, 0x14, 0xef, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x6c, 0x69, 0x4c, 0x07, 0x10, 0x19, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2946,6 +2964,22 @@ func (m *RolloutInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.InitContainers) > 0 { + for iNdEx := len(m.InitContainers) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InitContainers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRollout(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xaa + } + } if len(m.Steps) > 0 { for iNdEx := len(m.Steps) - 1; iNdEx >= 0; iNdEx-- { { @@ -3246,6 +3280,17 @@ func (m *ReplicaSetInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.InitContainerImages) > 0 { + for iNdEx := len(m.InitContainerImages) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.InitContainerImages[iNdEx]) + copy(dAtA[i:], m.InitContainerImages[iNdEx]) + i = encodeVarintRollout(dAtA, i, uint64(len(m.InitContainerImages[iNdEx]))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x8a + } + } if m.Pong { i-- if m.Pong { @@ -4218,6 +4263,12 @@ func (m *RolloutInfo) Size() (n int) { n += 2 + l + sovRollout(uint64(l)) } } + if len(m.InitContainers) > 0 { + for _, e := range m.InitContainers { + l = e.Size() + n += 2 + l + sovRollout(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -4332,6 +4383,12 @@ func (m *ReplicaSetInfo) Size() (n int) { if m.Pong { n += 3 } + if len(m.InitContainerImages) > 0 { + for _, s := range m.InitContainerImages { + l = len(s) + n += 2 + l + sovRollout(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -6608,6 +6665,40 @@ func (m *RolloutInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitContainers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InitContainers = append(m.InitContainers, &ContainerInfo{}) + if err := m.InitContainers[len(m.InitContainers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRollout(dAtA[iNdEx:]) @@ -7336,6 +7427,38 @@ func (m *ReplicaSetInfo) Unmarshal(dAtA []byte) error { } } m.Pong = bool(v != 0) + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitContainerImages", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRollout + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRollout + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRollout + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InitContainerImages = append(m.InitContainerImages, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRollout(dAtA[iNdEx:]) diff --git a/pkg/apiclient/rollout/rollout.proto b/pkg/apiclient/rollout/rollout.proto index 7949baddd4..53cfbc8ab2 100644 --- a/pkg/apiclient/rollout/rollout.proto +++ b/pkg/apiclient/rollout/rollout.proto @@ -96,6 +96,8 @@ message RolloutInfo { repeated ContainerInfo containers = 19; repeated github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CanaryStep steps = 20; + + repeated ContainerInfo initContainers = 21; } message ExperimentInfo { @@ -125,6 +127,7 @@ message ReplicaSetInfo { repeated PodInfo pods = 14; bool ping = 15; bool pong = 16; + repeated string initContainerImages = 17; } message PodInfo { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 014b6345b8..7279aea5e3 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -5990,6 +5990,12 @@ }, "pong": { "type": "boolean" + }, + "initContainerImages": { + "type": "array", + "items": { + "type": "string" + } } } }, @@ -6097,6 +6103,12 @@ "items": { "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.CanaryStep" } + }, + "initContainers": { + "type": "array", + "items": { + "$ref": "#/definitions/rollout.ContainerInfo" + } } } }, diff --git a/pkg/kubectl-argo-rollouts/info/replicaset_info.go b/pkg/kubectl-argo-rollouts/info/replicaset_info.go index 362261daef..4c1a3a1866 100644 --- a/pkg/kubectl-argo-rollouts/info/replicaset_info.go +++ b/pkg/kubectl-argo-rollouts/info/replicaset_info.go @@ -73,6 +73,11 @@ func GetReplicaSetInfo(ownerUID types.UID, ro *v1alpha1.Rollout, allReplicaSets for _, ctr := range rs.Spec.Template.Spec.Containers { rsInfo.Images = append(rsInfo.Images, ctr.Image) } + + for _, ctr := range rs.Spec.Template.Spec.InitContainers { + rsInfo.InitContainerImages = append(rsInfo.InitContainerImages, ctr.Image) + } + rsInfos = append(rsInfos, rsInfo) } sort.Slice(rsInfos[:], func(i, j int) bool { diff --git a/pkg/kubectl-argo-rollouts/info/rollout_info.go b/pkg/kubectl-argo-rollouts/info/rollout_info.go index 5732972852..37604aa03b 100644 --- a/pkg/kubectl-argo-rollouts/info/rollout_info.go +++ b/pkg/kubectl-argo-rollouts/info/rollout_info.go @@ -85,16 +85,23 @@ func NewRolloutInfo( roInfo.Containers = []*rollout.ContainerInfo{} var containerList []corev1.Container + var initContainerList []corev1.Container if workloadRef != nil { containerList = workloadRef.Spec.Template.Spec.Containers + initContainerList = workloadRef.Spec.Template.Spec.InitContainers } else { containerList = ro.Spec.Template.Spec.Containers + initContainerList = ro.Spec.Template.Spec.InitContainers } for _, c := range containerList { roInfo.Containers = append(roInfo.Containers, &rollout.ContainerInfo{Name: c.Name, Image: c.Image}) } + for _, c := range initContainerList { + roInfo.InitContainers = append(roInfo.InitContainers, &rollout.ContainerInfo{Name: c.Name, Image: c.Image}) + } + if ro.Status.RestartedAt != nil { roInfo.RestartedAt = ro.Status.RestartedAt.String() } else { diff --git a/ui/src/app/components/rollout/containers.tsx b/ui/src/app/components/rollout/containers.tsx index 552ac29a93..73eddc5139 100644 --- a/ui/src/app/components/rollout/containers.tsx +++ b/ui/src/app/components/rollout/containers.tsx @@ -9,6 +9,7 @@ import {faExclamationCircle, faPencilAlt, faSave, faTimes} from '@fortawesome/fr interface ContainersWidgetProps { containers: RolloutContainerInfo[]; images: ImageInfo[]; + name: string; interactive?: { editState: ReactStatePair; setImage: (container: string, image: string, tag: string) => void; @@ -16,7 +17,7 @@ interface ContainersWidgetProps { } export const ContainersWidget = (props: ContainersWidgetProps) => { - const {containers, images, interactive} = props; + const {containers, images, name, interactive} = props; const [editing, setEditing] = interactive?.editState || [null, null]; const inputMap: {[key: string]: string} = {}; for (const container of containers) { @@ -29,7 +30,7 @@ export const ContainersWidget = (props: ContainersWidgetProps) => {
    - Containers + {name}
    {interactive && diff --git a/ui/src/app/components/rollout/revision.tsx b/ui/src/app/components/rollout/revision.tsx index 394a3d09fe..62f31a0e76 100644 --- a/ui/src/app/components/rollout/revision.tsx +++ b/ui/src/app/components/rollout/revision.tsx @@ -3,7 +3,7 @@ import * as moment from 'moment'; import {RolloutAnalysisRunInfo, RolloutExperimentInfo, RolloutReplicaSetInfo} from '../../../models/rollout/generated'; import {IconForTag} from '../../shared/utils/utils'; import {ReplicaSets} from '../pods/pods'; -import {ImageInfo, parseImages} from './rollout'; +import {ImageInfo, parseImages, parseInitContainerImages} from './rollout'; import './rollout.scss'; import '../pods/pods.scss'; import {ConfirmButton} from '../confirm-button/confirm-button'; @@ -61,6 +61,8 @@ export const RevisionWidget = ({current, initCollapsed, revision, rollback}: Rev const [collapsed, setCollapsed] = React.useState(initCollapsed); const icon = collapsed ? faChevronCircleDown : faChevronCircleUp; const images = parseImages(revision.replicaSets ?? []); + const initContainerImages = parseInitContainerImages(revision.replicaSets ?? []); + const combinedImages = images.concat(initContainerImages); const hasPods = (revision.replicaSets || []).some((rs) => rs.pods?.length > 0); return ( @@ -81,7 +83,7 @@ export const RevisionWidget = ({current, initCollapsed, revision, rollback}: Rev
    - +
    {!collapsed && ( diff --git a/ui/src/app/components/rollout/rollout.tsx b/ui/src/app/components/rollout/rollout.tsx index f26b22a9a7..dfecde7e84 100644 --- a/ui/src/app/components/rollout/rollout.tsx +++ b/ui/src/app/components/rollout/rollout.tsx @@ -48,35 +48,23 @@ export const parseImages = (replicaSets: RolloutReplicaSetInfo[]): ImageInfo[] = const unknownImages: {[key: string]: boolean} = {}; (replicaSets || []).forEach((rs) => { (rs.images || []).forEach((img) => { - const tags: ImageTag[] = []; - - if (rs.canary) { - tags.push(ImageTag.Canary); - } - if (rs.stable) { - tags.push(ImageTag.Stable); - } - if (rs.active) { - tags.push(ImageTag.Active); - } - if (rs.preview) { - tags.push(ImageTag.Preview); - } + updateImageInfo(rs,img,images,unknownImages); + }); + }); - if (images[img]) { - images[img].tags = [...tags, ...images[img].tags]; - } else { - images[img] = { - image: img, - tags: tags, - }; - } + const imgArray = Object.values(images); + imgArray.sort((a, b) => { + return unknownImages[a.image] ? 1 : -1; + }); + return imgArray; +}; - if (images[img].tags.length === 0) { - unknownImages[img] = true; - } else { - unknownImages[img] = false; - } +export const parseInitContainerImages = (replicaSets: RolloutReplicaSetInfo[]): ImageInfo[] => { + const images: {[key: string]: ImageInfo} = {}; + const unknownImages: {[key: string]: boolean} = {}; + (replicaSets || []).forEach((rs) => { + (rs.initContainerImages || []).forEach((img) => { + updateImageInfo(rs,img,images,unknownImages); }); }); @@ -87,6 +75,38 @@ export const parseImages = (replicaSets: RolloutReplicaSetInfo[]): ImageInfo[] = return imgArray; }; +const updateImageInfo = (rs: RolloutReplicaSetInfo,img: string ,images: {[key: string]: ImageInfo},unknownImages:{[key: string]: boolean}) => { + const tags: ImageTag[] = []; + + if (rs.canary) { + tags.push(ImageTag.Canary); + } + if (rs.stable) { + tags.push(ImageTag.Stable); + } + if (rs.active) { + tags.push(ImageTag.Active); + } + if (rs.preview) { + tags.push(ImageTag.Preview); + } + + if (images[img]) { + images[img].tags = [...tags, ...images[img].tags]; + } else { + images[img] = { + image: img, + tags: tags, + }; + } + + if (images[img].tags.length === 0) { + unknownImages[img] = true; + } else { + unknownImages[img] = false; + } +}; + export type ReactStatePair = [boolean, React.Dispatch>]; export const RolloutWidget = (props: {rollout: RolloutRolloutInfo; interactive?: {editState: ReactStatePair; api: RolloutServiceApi; namespace: string}}) => { @@ -94,8 +114,10 @@ export const RolloutWidget = (props: {rollout: RolloutRolloutInfo; interactive?: const curStep = parseInt(rollout.step, 10) || (rollout.steps || []).length; const revisions = ProcessRevisions(rollout); - const images = parseImages(rollout?.replicaSets || []); + const initContainerEditState = React.useState(false); + const initContainerImages = parseInitContainerImages(rollout?.replicaSets || []); + const images = parseImages(rollout?.replicaSets || []); for (const img of images) { for (const container of rollout.containers || []) { if (img.image === container.image) { @@ -132,6 +154,7 @@ export const RolloutWidget = (props: {rollout: RolloutRolloutInfo; interactive?:
    + {rollout.initContainers &&
    + { + interactive.api.rolloutServiceSetRolloutImage({}, interactive.namespace, rollout.objectMeta?.name, container, image, tag); + }, + } + : null + } + /> +
    }
    diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 2e657d455e..01e838622c 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -7361,6 +7361,12 @@ export interface RolloutReplicaSetInfo { * @memberof RolloutReplicaSetInfo */ pong?: boolean; + /** + * + * @type {Array} + * @memberof RolloutReplicaSetInfo + */ + initContainerImages?: Array; } /** * @@ -7526,6 +7532,12 @@ export interface RolloutRolloutInfo { * @memberof RolloutRolloutInfo */ steps?: Array; + /** + * + * @type {Array} + * @memberof RolloutRolloutInfo + */ + initContainers?: Array; } /** * From d108c59c215c97a50472570d666b1524db781ef1 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Tue, 26 Mar 2024 19:44:52 +0100 Subject: [PATCH 235/264] feat: ping pong support for istio (#3371) * feat: wip ping pong support for istio Signed-off-by: Zach Aller * feat: wip ping pong validation fixes Signed-off-by: Zach Aller * add istio ping pong e2e Signed-off-by: Zach Aller * add istio ping pong e2e Signed-off-by: Zach Aller * clean up comments Signed-off-by: Zach Aller * add ping pong and destRule both configred e2e test Signed-off-by: Zach Aller * cleanup not needed test Signed-off-by: Zach Aller * add docs Signed-off-by: Zach Aller * add new test instead of piggy backing of an old one Signed-off-by: Zach Aller * change test name Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- docs/features/traffic-management/istio.md | 12 ++ pkg/apis/rollouts/validation/validation.go | 10 +- .../rollouts/validation/validation_test.go | 17 +- rollout/trafficrouting/istio/istio.go | 18 +- rollout/trafficrouting/istio/istio_test.go | 176 +++++++++++++++++- .../e2e/istio/istio-host-split-ping-pong.yaml | 84 +++++++++ test/e2e/istio_test.go | 51 +++++ 7 files changed, 348 insertions(+), 20 deletions(-) create mode 100644 test/e2e/istio/istio-host-split-ping-pong.yaml diff --git a/docs/features/traffic-management/istio.md b/docs/features/traffic-management/istio.md index 415313841a..9d146d545c 100644 --- a/docs/features/traffic-management/istio.md +++ b/docs/features/traffic-management/istio.md @@ -473,6 +473,18 @@ help address this problem. The proposed solution is to introduce an annotation t indicates to Argo CD to respect and preserve the differences at a specified path, in order to allow other controllers (e.g. Argo Rollouts) controller manage them instead. +## Ping Pong + +!!! important + + Available since v1.7 + +Argo Rollouts also supports ping pong when using Istio this was added to support configuring both ALB and +Istio traffic routers at the same time. When using an ALB, ping-pong is generally a best practice especially with ALB readiness +gates enabled. However, when we change the service selectors when a rollout is aborted back to stable pod hash it causes a blip +of traffic outage because the ALB controller will set the pod readiness gates to false for a short while due to the label changes. +If we configure both ALB and Istio with ping-pong this selector change does not happen and hence we do not see any outages. + ## Alternatives Considered ### Rollout ownership over the Virtual Service diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 76ab8d6c66..9bb3f24af6 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -81,8 +81,8 @@ const ( DuplicatedPingPongServicesMessage = "This rollout uses the same service for the ping and pong services, but two different services are required." // MissedAlbRootServiceMessage indicates that the rollout with ALB TrafficRouting and ping pong feature enabled must have root service provided MissedAlbRootServiceMessage = "Root service field is required for the configuration with ALB and ping-pong feature enabled" - // PingPongWithAlbOnlyMessage At this moment ping-pong feature works with the ALB traffic routing only - PingPongWithAlbOnlyMessage = "Ping-pong feature works with the ALB traffic routing only" + // PingPongWithRouterOnlyMessage At this moment ping-pong feature works with the ALB traffic routing only + PingPongWithRouterOnlyMessage = "Ping-pong feature works with the ALB and Istio traffic routers only" // InvalideStepRouteNameNotFoundInManagedRoutes A step has been configured that requires managedRoutes and the route name // is missing from managedRoutes InvalideStepRouteNameNotFoundInManagedRoutes = "Steps define a route that does not exist in spec.strategy.canary.trafficRouting.managedRoutes" @@ -241,7 +241,7 @@ func requireCanaryStableServices(rollout *v1alpha1.Rollout) bool { switch { case canary.TrafficRouting.ALB != nil && canary.PingPong == nil, - canary.TrafficRouting.Istio != nil && canary.TrafficRouting.Istio.DestinationRule == nil, + canary.TrafficRouting.Istio != nil && canary.TrafficRouting.Istio.DestinationRule == nil && canary.PingPong == nil, canary.TrafficRouting.SMI != nil, canary.TrafficRouting.Apisix != nil, canary.TrafficRouting.Ambassador != nil, @@ -262,8 +262,8 @@ func ValidateRolloutStrategyCanary(rollout *v1alpha1.Rollout, fldPath *field.Pat allErrs = append(allErrs, field.Invalid(fldPath.Child("stableService"), canary.StableService, DuplicatedServicesCanaryMessage)) } if canary.PingPong != nil { - if canary.TrafficRouting != nil && canary.TrafficRouting.ALB == nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("trafficRouting").Child("alb"), canary.TrafficRouting.ALB, PingPongWithAlbOnlyMessage)) + if canary.TrafficRouting != nil && canary.TrafficRouting.ALB == nil && canary.TrafficRouting.Istio == nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("trafficRouting").Child("alb"), canary.TrafficRouting.ALB, PingPongWithRouterOnlyMessage)) } if canary.PingPong.PingService == "" { allErrs = append(allErrs, field.Invalid(fldPath.Child("pingPong").Child("pingService"), canary.PingPong.PingService, InvalidPingPongProvidedMessage)) diff --git a/pkg/apis/rollouts/validation/validation_test.go b/pkg/apis/rollouts/validation/validation_test.go index 5d5c19be5e..c9fc9ad923 100644 --- a/pkg/apis/rollouts/validation/validation_test.go +++ b/pkg/apis/rollouts/validation/validation_test.go @@ -290,6 +290,21 @@ func TestValidateRolloutStrategyCanary(t *testing.T) { assert.Empty(t, allErrs) }) + t.Run("valid Istio with ping pong", func(t *testing.T) { + validRo := ro.DeepCopy() + validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) + validRo.Spec.Strategy.Canary.CanaryService = "" + validRo.Spec.Strategy.Canary.StableService = "" + validRo.Spec.Strategy.Canary.PingPong = &v1alpha1.PingPongSpec{ + PingService: "ping", + PongService: "pong", + } + validRo.Spec.Strategy.Canary.TrafficRouting.Istio = &v1alpha1.IstioTrafficRouting{DestinationRule: &v1alpha1.IstioDestinationRule{Name: "destination-rule"}} + validRo.Spec.Strategy.Canary.TrafficRouting.ALB = nil + allErrs := ValidateRolloutStrategyCanary(validRo, field.NewPath("")) + assert.Empty(t, allErrs) + }) + t.Run("valid PingPong missing canary and stable service", func(t *testing.T) { validRo := ro.DeepCopy() validRo.Spec.Strategy.Canary.Steps[0].SetWeight = pointer.Int32(10) @@ -368,7 +383,7 @@ func TestValidateRolloutStrategyCanary(t *testing.T) { Nginx: &v1alpha1.NginxTrafficRouting{StableIngress: "stable-ingress"}, } allErrs := ValidateRolloutStrategyCanary(invalidRo, field.NewPath("")) - assert.Equal(t, PingPongWithAlbOnlyMessage, allErrs[0].Detail) + assert.Equal(t, PingPongWithRouterOnlyMessage, allErrs[0].Detail) }) t.Run("invalid traffic routing", func(t *testing.T) { diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index dd44da7b25..5308d59a42 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -6,6 +6,8 @@ import ( "fmt" "strings" + "github.com/argoproj/argo-rollouts/rollout/trafficrouting" + jsonpatch "github.com/evanphx/json-patch/v5" "github.com/mitchellh/mapstructure" log "github.com/sirupsen/logrus" @@ -123,8 +125,7 @@ func (patches virtualServicePatches) patchVirtualService(httpRoutes []any, tlsRo } func (r *Reconciler) generateVirtualServicePatches(rolloutVsvcRouteNames []string, httpRoutes []VirtualServiceHTTPRoute, rolloutVsvcTLSRoutes []v1alpha1.TLSRoute, tlsRoutes []VirtualServiceTLSRoute, rolloutVsvcTCPRoutes []v1alpha1.TCPRoute, tcpRoutes []VirtualServiceTCPRoute, desiredWeight int64, additionalDestinations ...v1alpha1.WeightDestination) virtualServicePatches { - canarySvc := r.rollout.Spec.Strategy.Canary.CanaryService - stableSvc := r.rollout.Spec.Strategy.Canary.StableService + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) canarySubset := "" stableSubset := "" if r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule != nil { @@ -717,7 +718,7 @@ func (r *Reconciler) reconcileVirtualServiceHeaderRoutes(virtualService v1alpha1 return err } - canarySvc := r.rollout.Spec.Strategy.Canary.CanaryService + _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) if destRuleHost != "" { canarySvc = destRuleHost } @@ -1022,8 +1023,7 @@ func searchTcpRoute(tcpRoute v1alpha1.TCPRoute, istioTcpRoutes []VirtualServiceT // ValidateHTTPRoutes ensures that all the routes in the rollout exist func ValidateHTTPRoutes(r *v1alpha1.Rollout, routeNames []string, httpRoutes []VirtualServiceHTTPRoute) error { - stableSvc := r.Spec.Strategy.Canary.StableService - canarySvc := r.Spec.Strategy.Canary.CanaryService + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) routeIndexesToPatch, err := getHttpRouteIndexesToPatch(routeNames, httpRoutes) if err != nil { @@ -1060,8 +1060,7 @@ func ValidateHTTPRoutes(r *v1alpha1.Rollout, routeNames []string, httpRoutes []V // ValidateTlsRoutes ensures that all the routes in the rollout exist and they only have two destinations func ValidateTlsRoutes(r *v1alpha1.Rollout, vsvcTLSRoutes []v1alpha1.TLSRoute, tlsRoutes []VirtualServiceTLSRoute) error { - stableSvc := r.Spec.Strategy.Canary.StableService - canarySvc := r.Spec.Strategy.Canary.CanaryService + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) routeIndexesToPatch, err := getTlsRouteIndexesToPatch(vsvcTLSRoutes, tlsRoutes) if err != nil { @@ -1082,8 +1081,7 @@ func ValidateTlsRoutes(r *v1alpha1.Rollout, vsvcTLSRoutes []v1alpha1.TLSRoute, t // ValidateTcpRoutes ensures that all the routes in the rollout exist and they only have two destinations func ValidateTcpRoutes(r *v1alpha1.Rollout, vsvcTCPRoutes []v1alpha1.TCPRoute, tcpRoutes []VirtualServiceTCPRoute) error { - stableSvc := r.Spec.Strategy.Canary.StableService - canarySvc := r.Spec.Strategy.Canary.CanaryService + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) routeIndexesToPatch, err := getTcpRouteIndexesToPatch(vsvcTCPRoutes, tcpRoutes) if err != nil { @@ -1191,7 +1189,7 @@ func (r *Reconciler) reconcileVirtualServiceMirrorRoutes(virtualService v1alpha1 if err != nil { return fmt.Errorf("[reconcileVirtualServiceMirrorRoutes] failed to get destination rule host: %w", err) } - canarySvc := r.rollout.Spec.Strategy.Canary.CanaryService + _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) if destRuleHost != "" { canarySvc = destRuleHost } diff --git a/rollout/trafficrouting/istio/istio_test.go b/rollout/trafficrouting/istio/istio_test.go index c18cdedae5..c6c0f8d9a1 100644 --- a/rollout/trafficrouting/istio/istio_test.go +++ b/rollout/trafficrouting/istio/istio_test.go @@ -64,6 +64,31 @@ func rollout(stableSvc, canarySvc string, istioVirtualService *v1alpha1.IstioVir } } +func rolloutPingPong(istioVirtualService *v1alpha1.IstioVirtualService) *v1alpha1.Rollout { + return &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "rollout", + Namespace: "default", + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + PingPong: &v1alpha1.PingPongSpec{ + PingService: "ping", + PongService: "pong", + }, + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + Istio: &v1alpha1.IstioTrafficRouting{ + VirtualService: istioVirtualService, + }, + }, + }, + }, + }, + Status: v1alpha1.RolloutStatus{Canary: v1alpha1.CanaryStatus{StablePingPong: "ping"}}, + } +} + func rolloutWithHttpRoutes(stableSvc, canarySvc, vsvc string, httpRoutes []string) *v1alpha1.Rollout { istioVirtualService := &v1alpha1.IstioVirtualService{ Name: vsvc, @@ -98,6 +123,16 @@ func rolloutWithHttpAndTlsAndTcpRoutes(stableSvc, canarySvc, vsvc string, httpRo return rollout(stableSvc, canarySvc, istioVirtualService) } +func rolloutWithHttpAndTlsAndTcpRoutesPingPong(vsvc string, httpRoutes []string, tlsRoutes []v1alpha1.TLSRoute, tcpRoutes []v1alpha1.TCPRoute) *v1alpha1.Rollout { + istioVirtualService := &v1alpha1.IstioVirtualService{ + Name: vsvc, + Routes: httpRoutes, + TLSRoutes: tlsRoutes, + TCPRoutes: tcpRoutes, + } + return rolloutPingPong(istioVirtualService) +} + func checkDestination(t *testing.T, destinations []VirtualServiceRouteDestination, svc string, expectWeight int) { for _, destination := range destinations { if destination.Destination.Host == svc { @@ -263,6 +298,72 @@ spec: host: canary weight: 0` +const regularMixedVsvcPingPong = `apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: vsvc + namespace: default +spec: + gateways: + - istio-rollout-gateway + hosts: + - istio-rollout.dev.argoproj.io + http: + - name: primary + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0 + - name: secondary + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0 + tls: + - match: + - port: 3000 + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0 + - match: + - port: 3001 + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0 + tcp: + - match: + - port: 3000 + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0 + - match: + - port: 3001 + route: + - destination: + host: 'ping' + weight: 100 + - destination: + host: pong + weight: 0` + const regularMixedVsvcTwoHttpRoutes = `apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: @@ -597,6 +698,14 @@ func extractTcpRoutes(t *testing.T, modifiedObj *unstructured.Unstructured) []Vi } func assertTcpRouteWeightChanges(t *testing.T, tcpRoute VirtualServiceTCPRoute, portNum, canaryWeight, stableWeight int) { + assertTcpRouteWeightChangesBase(t, tcpRoute, portNum, canaryWeight, stableWeight, "stable", "canary") +} + +func assertTcpRouteWeightChangesPingPong(t *testing.T, tcpRoute VirtualServiceTCPRoute, portNum, canaryWeight, stableWeight int) { + assertTcpRouteWeightChangesBase(t, tcpRoute, portNum, canaryWeight, stableWeight, "ping", "pong") +} + +func assertTcpRouteWeightChangesBase(t *testing.T, tcpRoute VirtualServiceTCPRoute, portNum, canaryWeight, stableWeight int, stableSvc, canarySvc string) { portsMap := make(map[int64]bool) for _, routeMatch := range tcpRoute.Match { if routeMatch.Port != 0 { @@ -610,8 +719,8 @@ func assertTcpRouteWeightChanges(t *testing.T, tcpRoute VirtualServiceTCPRoute, if portNum != 0 { assert.Equal(t, portNum, port) } - checkDestination(t, tcpRoute.Route, "stable", stableWeight) - checkDestination(t, tcpRoute.Route, "canary", canaryWeight) + checkDestination(t, tcpRoute.Route, stableSvc, stableWeight) + checkDestination(t, tcpRoute.Route, canarySvc, canaryWeight) } func extractHttpRoutes(t *testing.T, modifiedObj *unstructured.Unstructured) []VirtualServiceHTTPRoute { @@ -643,6 +752,14 @@ func extractTlsRoutes(t *testing.T, modifiedObj *unstructured.Unstructured) []Vi } func assertTlsRouteWeightChanges(t *testing.T, tlsRoute VirtualServiceTLSRoute, snis []string, portNum, canaryWeight, stableWeight int) { + assertTlsRouteWeightChangesBase(t, tlsRoute, snis, portNum, canaryWeight, stableWeight, "stable", "canary") +} + +func assertTlsRouteWeightChangesPingPong(t *testing.T, tlsRoute VirtualServiceTLSRoute, snis []string, portNum, canaryWeight, stableWeight int) { + assertTlsRouteWeightChangesBase(t, tlsRoute, snis, portNum, canaryWeight, stableWeight, "ping", "pong") +} + +func assertTlsRouteWeightChangesBase(t *testing.T, tlsRoute VirtualServiceTLSRoute, snis []string, portNum, canaryWeight, stableWeight int, stableSvc, canarySvc string) { portsMap := make(map[int64]bool) sniHostsMap := make(map[string]bool) for _, routeMatch := range tlsRoute.Match { @@ -667,8 +784,8 @@ func assertTlsRouteWeightChanges(t *testing.T, tlsRoute VirtualServiceTLSRoute, if len(snis) != 0 { assert.Equal(t, evalUtils.Equal(snis, sniHosts), true) } - checkDestination(t, tlsRoute.Route, "stable", stableWeight) - checkDestination(t, tlsRoute.Route, "canary", canaryWeight) + checkDestination(t, tlsRoute.Route, stableSvc, stableWeight) + checkDestination(t, tlsRoute.Route, canarySvc, canaryWeight) } func TestHttpReconcileWeightsBaseCase(t *testing.T) { @@ -1104,6 +1221,57 @@ func TestReconcileWeightsBaseCase(t *testing.T) { assertTcpRouteWeightChanges(t, tcpRoutes[1], 3001, 0, 100) } +func TestReconcileWeightsPingPongBaseCase(t *testing.T) { + r := &Reconciler{ + rollout: rolloutWithHttpAndTlsAndTcpRoutesPingPong("vsvc", []string{"primary"}, + []v1alpha1.TLSRoute{ + { + Port: 3000, + }, + }, + []v1alpha1.TCPRoute{ + { + Port: 3000, + }, + }, + ), + } + obj := unstructuredutil.StrToUnstructuredUnsafe(regularMixedVsvcPingPong) + vsvcRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.Routes + vsvcTLSRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TLSRoutes + vsvcTCPRoutes := r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.VirtualService.TCPRoutes + modifiedObj, _, err := r.reconcileVirtualService(obj, vsvcRoutes, vsvcTLSRoutes, vsvcTCPRoutes, 20) + assert.Nil(t, err) + assert.NotNil(t, modifiedObj) + + // HTTP Routes + httpRoutes := extractHttpRoutes(t, modifiedObj) + + // Assertions + assert.Equal(t, httpRoutes[0].Name, "primary") + checkDestination(t, httpRoutes[0].Route, "ping", 80) + checkDestination(t, httpRoutes[0].Route, "pong", 20) + + //assertHttpRouteWeightChanges(t, httpRoutes[1], "secondary", 0, 100) + assert.Equal(t, httpRoutes[1].Name, "secondary") + checkDestination(t, httpRoutes[1].Route, "ping", 100) + checkDestination(t, httpRoutes[1].Route, "pong", 0) + + // TLS Routes + tlsRoutes := extractTlsRoutes(t, modifiedObj) + // + // Assestions + assertTlsRouteWeightChangesPingPong(t, tlsRoutes[0], nil, 3000, 20, 80) + assertTlsRouteWeightChangesPingPong(t, tlsRoutes[1], nil, 3001, 0, 100) + // + // TCP Routes + tcpRoutes := extractTcpRoutes(t, modifiedObj) + + // Assestions + assertTcpRouteWeightChangesPingPong(t, tcpRoutes[0], 3000, 20, 80) + assertTcpRouteWeightChangesPingPong(t, tcpRoutes[1], 3001, 0, 100) +} + func TestReconcileUpdateVirtualService(t *testing.T) { ro := rolloutWithHttpRoutes("stable", "canary", "vsvc", []string{"primary"}) AssertReconcileUpdateVirtualService(t, regularVsvc, ro) diff --git a/test/e2e/istio/istio-host-split-ping-pong.yaml b/test/e2e/istio/istio-host-split-ping-pong.yaml new file mode 100644 index 0000000000..b9eb38ad37 --- /dev/null +++ b/test/e2e/istio/istio-host-split-ping-pong.yaml @@ -0,0 +1,84 @@ +apiVersion: v1 +kind: Service +metadata: + name: pong +spec: + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: istio-host-split + +--- +apiVersion: v1 +kind: Service +metadata: + name: ping +spec: + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: istio-host-split + +--- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: istio-host-split-vsvc +spec: + hosts: + - istio-host-split + http: + - name: primary + route: + - destination: + host: ping + weight: 100 + - destination: + host: pong + weight: 0 + +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: istio-host-split +spec: + strategy: + canary: + pingPong: + pingService: ping + pongService: pong + trafficRouting: + istio: + virtualService: + name: istio-host-split-vsvc + routes: + - primary + steps: + - setWeight: 25 + - pause: { duration: 5s } + selector: + matchLabels: + app: istio-host-split + template: + metadata: + labels: + app: istio-host-split + spec: + containers: + - name: istio-host-split + image: nginx:1.19-alpine + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m diff --git a/test/e2e/istio_test.go b/test/e2e/istio_test.go index 610feab03f..9797b3e503 100644 --- a/test/e2e/istio_test.go +++ b/test/e2e/istio_test.go @@ -493,6 +493,57 @@ func (s *IstioSuite) TestIstioSubsetSplitExperimentStep() { s.TearDownSuite() } +func (s *IstioSuite) TestIstioPingPongUpdate() { + s.Given(). + RolloutObjects("@istio/istio-host-split-ping-pong.yaml"). + When().ApplyManifests().WaitForRolloutStatus("Healthy"). + Then(). + //Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[1].Weight) + }). + // Update 1. Test the weight switch from ping => pong + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + //Assert(assertWeights(s, "ping-service", "pong-service", 75, 25)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(75), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(25), vsvc.Spec.HTTP[0].Route[1].Weight) + }). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + //Assert(assertWeights(s, "ping-service", "pong-service", 0, 100)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[1].Weight) + }). + // Update 2. Test the weight switch from pong => ping + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + //Assert(assertWeights(s, "ping-service", "pong-service", 25, 75)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(25), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(75), vsvc.Spec.HTTP[0].Route[1].Weight) + }). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + //Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)) + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[1].Weight) + }) +} + func (s *IstioSuite) TestIstioSubsetSplitInStableDownscaleAfterCanaryAbort() { s.Given(). RolloutObjects("@istio/istio-subset-split-in-stable-downscale-after-canary-abort.yaml"). From 633819b8330cdd5f90d008562a4231f04cf0e05e Mon Sep 17 00:00:00 2001 From: Dimitri John Ledkov <19779+xnox@users.noreply.github.com> Date: Wed, 27 Mar 2024 13:39:04 +0000 Subject: [PATCH 236/264] chore: set webpack hashFunction to modern sha256, remove legacy-provider. Fixes #2609 (#3475) Reference from https://stackoverflow.com/a/74999688 Fixes https://github.com/argoproj/argo-rollouts/issues/2609 Signed-off-by: Dimitri John Ledkov --- ui/package.json | 4 ++-- ui/src/app/webpack.common.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/package.json b/ui/package.json index 69eb7872cd..0a631d3773 100644 --- a/ui/package.json +++ b/ui/package.json @@ -26,8 +26,8 @@ "web-vitals": "^1.0.1" }, "scripts": { - "start": "NODE_OPTIONS=--openssl-legacy-provider webpack serve --config ./src/app/webpack.dev.js", - "build": "rm -rf dist && NODE_OPTIONS=--openssl-legacy-provider webpack --config ./src/app/webpack.prod.js", + "start": "webpack serve --config ./src/app/webpack.dev.js", + "build": "rm -rf dist && webpack --config ./src/app/webpack.prod.js", "test": "jest", "eject": "react-scripts eject", "protogen": "../hack/swagger-codegen.sh generate -i ../pkg/apiclient/rollout/rollout.swagger.json -l typescript-fetch -o src/models/rollout/generated" diff --git a/ui/src/app/webpack.common.js b/ui/src/app/webpack.common.js index 194af2c9b3..72d6d908ad 100644 --- a/ui/src/app/webpack.common.js +++ b/ui/src/app/webpack.common.js @@ -1,5 +1,9 @@ 'use strict;'; +const crypto = require("crypto"); +const crypto_orig_createHash = crypto.createHash; +crypto.createHash = algorithm => crypto_orig_createHash(algorithm == "md4" ? "sha256" : algorithm); + const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); From 86a2df6bce9fb37eb460ff740043f372884c05c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etien=20Ro=C5=BEnik?= <12816736+eroznik@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:10:27 +0100 Subject: [PATCH 237/264] feat: expose secrets for notification templates (#3455) (#3466) * feat: expose secrets for notification templates Signed-off-by: Etien Roznik <12816736+eroznik@users.noreply.github.com> * feat: expose secrets for notification templates Signed-off-by: Etien Roznik <12816736+eroznik@users.noreply.github.com> --------- Signed-off-by: Etien Roznik <12816736+eroznik@users.noreply.github.com> --- utils/record/record.go | 13 +++++++++++-- utils/record/record_test.go | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/utils/record/record.go b/utils/record/record.go index 801db089b6..22424de0e3 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -289,7 +289,11 @@ func NewAPIFactorySettings(arInformer argoinformers.AnalysisRunInformer) api.Set InitGetVars: func(cfg *api.Config, configMap *corev1.ConfigMap, secret *corev1.Secret) (api.GetVars, error) { return func(obj map[string]any, dest services.Destination) map[string]any { - var vars = map[string]any{"rollout": obj, "time": timeExprs} + var vars = map[string]any{ + "rollout": obj, + "time": timeExprs, + "secrets": secret.Data, + } if arInformer == nil { log.Infof("Notification is not set for analysisRun Informer: %s", dest) @@ -313,7 +317,12 @@ func NewAPIFactorySettings(arInformer argoinformers.AnalysisRunInformer) api.Set } - vars = map[string]any{"rollout": obj, "analysisRuns": arsObj, "time": timeExprs} + vars = map[string]any{ + "rollout": obj, + "analysisRuns": arsObj, + "time": timeExprs, + "secrets": secret.Data, + } return vars }, nil }, diff --git a/utils/record/record_test.go b/utils/record/record_test.go index 2cc7afd12c..96df39cfec 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -484,6 +484,18 @@ func TestNewAPIFactorySettings(t *testing.T) { }, } + expectedSecrets := map[string][]byte{ + "notification-secret": []byte("secret-value"), + } + + notificationsSecret := corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "argo-rollouts-notification-secret", + Namespace: "default", + }, + Data: expectedSecrets, + } + type expectedFunc func(obj map[string]interface{}, ar any) map[string]interface{} type arInformerFunc func([]*v1alpha1.AnalysisRun) argoinformers.AnalysisRunInformer @@ -506,6 +518,7 @@ func TestNewAPIFactorySettings(t *testing.T) { "rollout": obj, "analysisRuns": ar, "time": timeExprs, + "secrets": expectedSecrets, } }, }, @@ -531,6 +544,7 @@ func TestNewAPIFactorySettings(t *testing.T) { "rollout": obj, "analysisRuns": nil, "time": timeExprs, + "secrets": expectedSecrets, } }, }, @@ -545,6 +559,7 @@ func TestNewAPIFactorySettings(t *testing.T) { return map[string]interface{}{ "rollout": obj, "time": timeExprs, + "secrets": expectedSecrets, } }, }, @@ -570,6 +585,7 @@ func TestNewAPIFactorySettings(t *testing.T) { "rollout": obj, "analysisRuns": nil, "time": timeExprs, + "secrets": expectedSecrets, } }, }, @@ -579,7 +595,7 @@ func TestNewAPIFactorySettings(t *testing.T) { t.Run(test.name, func(t *testing.T) { settings := NewAPIFactorySettings(test.arInformer(test.ars)) - getVars, err := settings.InitGetVars(nil, nil, nil) + getVars, err := settings.InitGetVars(nil, nil, ¬ificationsSecret) require.NoError(t, err) if err != nil { t.Errorf("Unexpected error: %v", err) From 4d6e12b17c8a3a01d6d740d885c975c764accde2 Mon Sep 17 00:00:00 2001 From: shubhajyoti-bagchi-groww <114666956+shubhajyoti-bagchi-groww@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:14:28 +0530 Subject: [PATCH 238/264] chore: added organization to users.md (#3481) Added organisation to users.md Signed-off-by: shubhajyoti-bagchi-groww --- USERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/USERS.md b/USERS.md index 12a504f4cb..14c36f7605 100644 --- a/USERS.md +++ b/USERS.md @@ -50,3 +50,4 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [WeLab Bank](https://www.welab.bank/) 1. [Yotpo](https://www.yotpo.com/) 1. [VGS](https://www.vgs.io) +2. [Groww](https://groww.in/) From 149ff1e7c4db00a5647dc9579d785a1649afeb3d Mon Sep 17 00:00:00 2001 From: Jonathan West Date: Thu, 28 Mar 2024 15:13:44 -0400 Subject: [PATCH 239/264] chore: fix unit test data races (#3478) (#3479) chore: fix unit test data races Signed-off-by: Jonathan West --- analysis/controller_test.go | 21 +++++++--- experiments/controller_test.go | 8 ++-- .../cmd/get/get_rollout.go | 7 ++++ .../viewcontroller/viewcontroller.go | 22 ++++++++-- .../viewcontroller/viewcontroller_test.go | 22 +++++++++- rollout/canary_test.go | 4 ++ rollout/controller_test.go | 26 +++++++----- rollout/sync_test.go | 2 +- .../ambassador/ambassador_test.go | 6 ++- rollout/trafficrouting/apisix/apisix_test.go | 42 ++++--------------- .../trafficrouting/traefik/traefik_test.go | 26 ++++-------- utils/record/record.go | 27 +++++++++++- utils/record/record_test.go | 2 +- utils/time/now.go | 25 ++++++++++- 14 files changed, 156 insertions(+), 84 deletions(-) diff --git a/analysis/controller_test.go b/analysis/controller_test.go index 8282f09c2a..601139a6d4 100644 --- a/analysis/controller_test.go +++ b/analysis/controller_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "reflect" + "sync" "testing" "time" @@ -50,9 +51,13 @@ type fixture struct { // Actions expected to happen on the client. actions []core.Action // Objects from here preloaded into NewSimpleFake. - objects []runtime.Object - enqueuedObjects map[string]int - unfreezeTime func() error + objects []runtime.Object + + // Acquire 'enqueuedObjectMutex' before accessing enqueuedObjects + enqueuedObjects map[string]int + enqueuedObjectMutex sync.Mutex + + unfreezeTime func() error // fake provider provider *mocks.Provider @@ -66,11 +71,11 @@ func newFixture(t *testing.T) *fixture { f.objects = []runtime.Object{} f.enqueuedObjects = make(map[string]int) f.now = time.Now() - timeutil.Now = func() time.Time { + timeutil.SetNowTimeFunc(func() time.Time { return f.now - } + }) f.unfreezeTime = func() error { - timeutil.Now = time.Now + timeutil.SetNowTimeFunc(time.Now) return nil } return f @@ -122,6 +127,10 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { panic(err) } + + f.enqueuedObjectMutex.Lock() + defer f.enqueuedObjectMutex.Unlock() + count, ok := f.enqueuedObjects[key] if !ok { count = 0 diff --git a/experiments/controller_test.go b/experiments/controller_test.go index 0103e03ce1..55e9c1e917 100644 --- a/experiments/controller_test.go +++ b/experiments/controller_test.go @@ -116,13 +116,15 @@ func newFixture(t *testing.T, objects ...runtime.Object) *fixture { f.kubeclient = k8sfake.NewSimpleClientset(f.kubeobjects...) f.enqueuedObjects = make(map[string]int) now := time.Now() - timeutil.Now = func() time.Time { + + timeutil.SetNowTimeFunc(func() time.Time { return now - } + }) f.unfreezeTime = func() error { - timeutil.Now = time.Now + timeutil.SetNowTimeFunc(time.Now) return nil } + return f } diff --git a/pkg/kubectl-argo-rollouts/cmd/get/get_rollout.go b/pkg/kubectl-argo-rollouts/cmd/get/get_rollout.go index 48c40bad3b..f5b0719509 100644 --- a/pkg/kubectl-argo-rollouts/cmd/get/get_rollout.go +++ b/pkg/kubectl-argo-rollouts/cmd/get/get_rollout.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "strings" + "sync" "time" "github.com/juju/ansiterm" @@ -59,7 +60,11 @@ func NewCmdGetRollout(o *options.ArgoRolloutsOptions) *cobra.Command { getOptions.PrintRollout(ri) } else { rolloutUpdates := make(chan *rollout.RolloutInfo) + var rolloutUpdatesMutex sync.Mutex + controller.RegisterCallback(func(roInfo *rollout.RolloutInfo) { + rolloutUpdatesMutex.Lock() + defer rolloutUpdatesMutex.Unlock() rolloutUpdates <- roInfo }) stopCh := ctx.Done() @@ -72,6 +77,8 @@ func NewCmdGetRollout(o *options.ArgoRolloutsOptions) *cobra.Command { } go getOptions.WatchRollout(stopCh, rolloutUpdates) controller.Run(ctx) + rolloutUpdatesMutex.Lock() + defer rolloutUpdatesMutex.Unlock() close(rolloutUpdates) } return nil diff --git a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go index 4aafb0a32a..79dc728428 100644 --- a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go +++ b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller.go @@ -3,6 +3,7 @@ package viewcontroller import ( "context" "reflect" + "sync" "time" "github.com/argoproj/argo-rollouts/utils/queue" @@ -11,7 +12,6 @@ import ( v1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/informers" kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" appslisters "k8s.io/client-go/listers/apps/v1" @@ -32,7 +32,7 @@ type viewController struct { name string namespace string - kubeInformerFactory informers.SharedInformerFactory + kubeInformerFactory kubeinformers.SharedInformerFactory rolloutsInformerFactory rolloutinformers.SharedInformerFactory replicaSetLister appslisters.ReplicaSetNamespaceLister @@ -48,6 +48,8 @@ type viewController struct { prevObj any getObj func() (any, error) callbacks []func(any) + // acquire 'callbacksLock' before reading/writing to 'callbacks' + callbacksLock sync.Mutex } type RolloutViewController struct { @@ -164,7 +166,13 @@ func (c *viewController) processNextWorkItem() bool { return true } if !reflect.DeepEqual(c.prevObj, newObj) { - for _, cb := range c.callbacks { + + // Acquire the mutex and make a thread-local copy of the list of callbacks + c.callbacksLock.Lock() + callbacks := append(make([]func(any), 0), c.callbacks...) + c.callbacksLock.Unlock() + + for _, cb := range callbacks { cb(newObj) } c.prevObj = newObj @@ -173,6 +181,9 @@ func (c *viewController) processNextWorkItem() bool { } func (c *viewController) DeregisterCallbacks() { + c.callbacksLock.Lock() + defer c.callbacksLock.Unlock() + c.callbacks = nil } @@ -218,6 +229,9 @@ func (c *RolloutViewController) RegisterCallback(callback RolloutInfoCallback) { cb := func(i any) { callback(i.(*rollout.RolloutInfo)) } + c.callbacksLock.Lock() + defer c.callbacksLock.Unlock() + c.callbacks = append(c.callbacks, cb) } @@ -246,5 +260,7 @@ func (c *ExperimentViewController) RegisterCallback(callback ExperimentInfoCallb cb := func(i any) { callback(i.(*rollout.ExperimentInfo)) } + c.callbacksLock.Lock() + defer c.callbacksLock.Unlock() c.callbacks = append(c.callbacks, cb) } diff --git a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller_test.go b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller_test.go index 90752629c2..7e1dd9c30e 100644 --- a/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller_test.go +++ b/pkg/kubectl-argo-rollouts/viewcontroller/viewcontroller_test.go @@ -2,6 +2,7 @@ package viewcontroller import ( "context" + "sync" "testing" "time" @@ -53,7 +54,11 @@ func TestRolloutControllerCallback(t *testing.T) { } callbackCalled := false + var callbackCalledLock sync.Mutex // acquire before accessing callbackCalled + cb := func(roInfo *rollout.RolloutInfo) { + callbackCalledLock.Lock() + defer callbackCalledLock.Unlock() callbackCalled = true assert.Equal(t, roInfo.ObjectMeta.Name, "foo") } @@ -67,11 +72,16 @@ func TestRolloutControllerCallback(t *testing.T) { go c.Run(ctx) time.Sleep(time.Second) for i := 0; i < 100; i++ { - if callbackCalled { + callbackCalledLock.Lock() + isCallbackCalled := callbackCalled + callbackCalledLock.Unlock() + if isCallbackCalled { break } time.Sleep(10 * time.Millisecond) } + callbackCalledLock.Lock() + defer callbackCalledLock.Unlock() assert.True(t, callbackCalled) } @@ -100,8 +110,11 @@ func TestExperimentControllerCallback(t *testing.T) { }, } + var callbackCalledLock sync.Mutex // acquire before accessing callbackCalled callbackCalled := false cb := func(expInfo *rollout.ExperimentInfo) { + callbackCalledLock.Lock() + defer callbackCalledLock.Unlock() callbackCalled = true assert.Equal(t, expInfo.ObjectMeta.Name, "foo") } @@ -115,10 +128,15 @@ func TestExperimentControllerCallback(t *testing.T) { go c.Run(ctx) time.Sleep(time.Second) for i := 0; i < 100; i++ { - if callbackCalled { + callbackCalledLock.Lock() + isCallbackCalled := callbackCalled + callbackCalledLock.Unlock() + if isCallbackCalled { break } time.Sleep(10 * time.Millisecond) } + callbackCalledLock.Lock() + defer callbackCalledLock.Unlock() assert.True(t, callbackCalled) } diff --git a/rollout/canary_test.go b/rollout/canary_test.go index f89f47494f..0d2065a8db 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -1156,6 +1156,8 @@ func TestSyncRolloutWaitAddToQueue(t *testing.T) { f.runController(key, true, false, c, i, k8sI) // When the controller starts, it will enqueue the rollout while syncing the informer and during the reconciliation step + f.enqueuedObjectsLock.Lock() + defer f.enqueuedObjectsLock.Unlock() assert.Equal(t, 2, f.enqueuedObjects[key]) } @@ -1204,6 +1206,8 @@ func TestSyncRolloutIgnoreWaitOutsideOfReconciliationPeriod(t *testing.T) { c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) f.runController(key, true, false, c, i, k8sI) // When the controller starts, it will enqueue the rollout so we expect the rollout to enqueue at least once. + f.enqueuedObjectsLock.Lock() + defer f.enqueuedObjectsLock.Unlock() assert.Equal(t, 1, f.enqueuedObjects[key]) } diff --git a/rollout/controller_test.go b/rollout/controller_test.go index a637d68f29..1409e675e7 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -99,10 +99,12 @@ type fixture struct { kubeactions []core.Action actions []core.Action // Objects from here preloaded into NewSimpleFake. - kubeobjects []runtime.Object - objects []runtime.Object - enqueuedObjects map[string]int - unfreezeTime func() error + kubeobjects []runtime.Object + objects []runtime.Object + // Acquire 'enqueuedObjectsLock' before accessing enqueuedObjects + enqueuedObjects map[string]int + enqueuedObjectsLock sync.Mutex + unfreezeTime func() error // events holds all the K8s Event Reasons emitted during the run events []string @@ -116,9 +118,12 @@ func newFixture(t *testing.T) *fixture { f.kubeobjects = []runtime.Object{} f.enqueuedObjects = make(map[string]int) now := time.Now() - timeutil.Now = func() time.Time { return now } + + timeutil.SetNowTimeFunc(func() time.Time { + return now + }) f.unfreezeTime = func() error { - timeutil.Now = time.Now + timeutil.SetNowTimeFunc(time.Now) return nil } @@ -598,15 +603,15 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share RefResolver: &FakeWorkloadRefResolver{}, }) - var enqueuedObjectsLock sync.Mutex c.enqueueRollout = func(obj any) { var key string var err error if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil { panic(err) } - enqueuedObjectsLock.Lock() - defer enqueuedObjectsLock.Unlock() + + f.enqueuedObjectsLock.Lock() + defer f.enqueuedObjectsLock.Unlock() count, ok := f.enqueuedObjects[key] if !ok { count = 0 @@ -720,7 +725,8 @@ func (f *fixture) runController(rolloutName string, startInformers bool, expectE f.t.Errorf("%d expected actions did not happen:%+v", len(f.kubeactions)-len(k8sActions), f.kubeactions[len(k8sActions):]) } fakeRecorder := c.recorder.(*record.FakeEventRecorder) - f.events = fakeRecorder.Events + + f.events = fakeRecorder.Events() return c } diff --git a/rollout/sync_test.go b/rollout/sync_test.go index a77fc358cb..c29b954804 100644 --- a/rollout/sync_test.go +++ b/rollout/sync_test.go @@ -455,7 +455,7 @@ func TestSendStateChangeEvents(t *testing.T) { recorder := record.NewFakeEventRecorder() roCtx.recorder = recorder roCtx.sendStateChangeEvents(&test.prevStatus, &test.newStatus) - assert.Equal(t, test.expectedEventReasons, recorder.Events) + assert.Equal(t, test.expectedEventReasons, recorder.Events()) } } diff --git a/rollout/trafficrouting/ambassador/ambassador_test.go b/rollout/trafficrouting/ambassador/ambassador_test.go index bd6e4613de..66d193b83a 100644 --- a/rollout/trafficrouting/ambassador/ambassador_test.go +++ b/rollout/trafficrouting/ambassador/ambassador_test.go @@ -136,8 +136,9 @@ type getReturn struct { func (f *fakeClient) Get(ctx context.Context, name string, options metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) { invokation := &getInvokation{name: name} f.mu.Lock() + defer f.mu.Unlock() f.getInvokations = append(f.getInvokations, invokation) - f.mu.Unlock() + if len(f.getReturns) == 0 { return nil, nil } @@ -145,7 +146,8 @@ func (f *fakeClient) Get(ctx context.Context, name string, options metav1.GetOpt if len(f.getReturns) >= len(f.getInvokations) { ret = f.getReturns[len(f.getInvokations)-1] } - return ret.obj, ret.err + // We clone the object before returning it, to prevent modification of the fake object in memory by the calling function + return ret.obj.DeepCopy(), ret.err } func (f *fakeClient) Create(ctx context.Context, obj *unstructured.Unstructured, options metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) { diff --git a/rollout/trafficrouting/apisix/apisix_test.go b/rollout/trafficrouting/apisix/apisix_test.go index 823e3bfb10..3749e64d6d 100644 --- a/rollout/trafficrouting/apisix/apisix_test.go +++ b/rollout/trafficrouting/apisix/apisix_test.go @@ -116,10 +116,6 @@ spec: priority: 2 ` -var ( - client *mocks.FakeClient = &mocks.FakeClient{} -) - const ( stableServiceName string = "stable-rollout" fakeStableServiceName string = "fake-stable-rollout" @@ -135,7 +131,7 @@ func TestUpdateHash(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -152,10 +148,9 @@ func TestSetWeight(t *testing.T) { mocks.ErrorApisixRouteObj = toUnstructured(t, errorApisixRoute) t.Run("SetWeight", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -195,7 +190,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithError", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -212,7 +206,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorManifest", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -229,10 +222,9 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorStableName", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(fakeStableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -244,10 +236,9 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorCanaryName", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, fakeCanaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -259,7 +250,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("ApisixUpdateError", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -380,7 +370,6 @@ func TestSetHeaderRoute(t *testing.T) { mocks.DuplicateSetHeaderApisixRouteObj = toUnstructured(t, apisixSetHeaderDuplicateRoute) mocks.ErrorApisixRouteObj = toUnstructured(t, errorApisixRoute) t.Run("SetHeaderGetRouteError", func(t *testing.T) { - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -397,7 +386,6 @@ func TestSetHeaderRoute(t *testing.T) { assert.Error(t, err) }) t.Run("SetHeaderGetManagedRouteError", func(t *testing.T) { - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -420,7 +408,6 @@ func TestSetHeaderRoute(t *testing.T) { assert.Error(t, err) }) t.Run("SetHeaderDuplicateManagedRouteError", func(t *testing.T) { - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -445,7 +432,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderRouteNilMatchWithNew", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: &mocks.FakeClient{ @@ -466,7 +452,6 @@ func TestSetHeaderRoute(t *testing.T) { t.Run("SetHeaderRouteNilMatch", func(t *testing.T) { client := &mocks.FakeClient{} // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: client, @@ -485,7 +470,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderRoutePriorityWithNew", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsGetNotFoundError: true, } @@ -521,7 +505,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderRoutePriorityWithNew", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsGetNotFoundError: false, } @@ -558,7 +541,6 @@ func TestSetHeaderRoute(t *testing.T) { t.Run("SetHeaderRouteExprsWithNew", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsGetNotFoundError: true, } @@ -613,7 +595,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderRouteExprs", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsGetNotFoundError: false, } @@ -668,7 +649,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderDeleteError", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsDeleteError: true, } @@ -686,7 +666,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderCreateError", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsCreateError: true, IsGetNotFoundError: true, @@ -710,7 +689,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("SetHeaderUpdateError", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ UpdateError: true, IsGetNotFoundError: false, @@ -734,7 +712,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("RemoveManagedRoutesDeleteError", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsDeleteError: true, } @@ -749,7 +726,6 @@ func TestSetHeaderRoute(t *testing.T) { }) t.Run("RemoveManagedRoutesNilManagedRoutes", func(t *testing.T) { // Given - t.Parallel() client := &mocks.FakeClient{ IsDeleteError: true, } @@ -799,7 +775,7 @@ func TestSetMirrorRoute(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -826,7 +802,6 @@ func TestRemoveManagedRoutes(t *testing.T) { t.Run("RemoveManagedRoutes", func(t *testing.T) { client := &mocks.FakeClient{} // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: client, @@ -842,7 +817,6 @@ func TestRemoveManagedRoutes(t *testing.T) { IsGetManagedRouteError: true, } // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: client, @@ -858,7 +832,6 @@ func TestRemoveManagedRoutes(t *testing.T) { IsGetNotFoundError: true, } // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), Client: client, @@ -889,7 +862,7 @@ func TestVerifyWeight(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -906,10 +879,9 @@ func TestType(t *testing.T) { mocks.ApisixRouteObj = toUnstructured(t, apisixRoute) t.Run("Type", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, apisixRouteName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) diff --git a/rollout/trafficrouting/traefik/traefik_test.go b/rollout/trafficrouting/traefik/traefik_test.go index 892468df0a..0b5b0c9701 100644 --- a/rollout/trafficrouting/traefik/traefik_test.go +++ b/rollout/trafficrouting/traefik/traefik_test.go @@ -38,10 +38,6 @@ metadata: name: mocks-service ` -var ( - client *mocks.FakeClient = &mocks.FakeClient{} -) - const ( stableServiceName string = "stable-rollout" fakeStableServiceName string = "fake-stable-rollout" @@ -67,7 +63,7 @@ func TestUpdateHash(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -84,10 +80,9 @@ func TestSetWeight(t *testing.T) { mocks.ErrorTraefikServiceObj = toUnstructured(t, errorTraefikService) t.Run("SetWeight", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -114,7 +109,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithError", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), Client: &mocks.FakeClient{ @@ -131,7 +125,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorManifest", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), Client: &mocks.FakeClient{ @@ -148,10 +141,9 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorStableName", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(fakeStableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -163,10 +155,9 @@ func TestSetWeight(t *testing.T) { }) t.Run("SetWeightWithErrorCanaryName", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, fakeCanaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -178,7 +169,6 @@ func TestSetWeight(t *testing.T) { }) t.Run("TraefikUpdateError", func(t *testing.T) { // Given - t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), Client: &mocks.FakeClient{ @@ -202,7 +192,7 @@ func TestSetHeaderRoute(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -231,7 +221,7 @@ func TestSetMirrorRoute(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -269,7 +259,7 @@ func TestVerifyWeight(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) @@ -289,7 +279,7 @@ func TestType(t *testing.T) { t.Parallel() cfg := ReconcilerConfig{ Rollout: newRollout(stableServiceName, canaryServiceName, traefikServiceName), - Client: client, + Client: &mocks.FakeClient{}, } r := NewReconciler(&cfg) diff --git a/utils/record/record.go b/utils/record/record.go index 22424de0e3..96be7c8582 100644 --- a/utils/record/record.go +++ b/utils/record/record.go @@ -9,6 +9,7 @@ import ( "regexp" "sort" "strings" + "sync" "time" argoinformers "github.com/argoproj/argo-rollouts/pkg/client/informers/externalversions/rollouts/v1alpha1" @@ -107,7 +108,29 @@ func NewEventRecorder(kubeclientset kubernetes.Interface, rolloutEventCounter *p // reasons which were emitted type FakeEventRecorder struct { EventRecorderAdapter - Events []string + // acquire eventsLock before using events + events []string + eventsLock sync.Mutex +} + +func (e *FakeEventRecorder) appendEvents(events ...string) { + e.eventsLock.Lock() + defer e.eventsLock.Unlock() + + e.events = append(e.events, events...) +} + +// Events returns a list of received events, with thread safety +func (e *FakeEventRecorder) Events() []string { + + e.eventsLock.Lock() + defer e.eventsLock.Unlock() + + if e.events == nil { + return nil + } + + return append(make([]string, 0), e.events...) } func NewFakeApiFactory() api.Factory { @@ -178,7 +201,7 @@ func NewFakeEventRecorder() *FakeEventRecorder { fakeRecorder := &FakeEventRecorder{} recorder.eventf = func(object runtime.Object, warn bool, opts EventOptions, messageFmt string, args ...any) { recorder.defaultEventf(object, warn, opts, messageFmt, args...) - fakeRecorder.Events = append(fakeRecorder.Events, opts.EventReason) + fakeRecorder.appendEvents(opts.EventReason) } fakeRecorder.EventRecorderAdapter = *recorder return fakeRecorder diff --git a/utils/record/record_test.go b/utils/record/record_test.go index 96df39cfec..4098feca4f 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -97,7 +97,7 @@ func TestIncCounter(t *testing.T) { buf := dto.Metric{} m.Write(&buf) assert.Equal(t, float64(3), *buf.Counter.Value) - assert.Equal(t, []string{"FooReason", "FooReason", "FooReason"}, rec.Events) + assert.Equal(t, []string{"FooReason", "FooReason", "FooReason"}, rec.Events()) } func TestSendNotifications(t *testing.T) { diff --git a/utils/time/now.go b/utils/time/now.go index 1b51cb3cc0..87952a91b4 100644 --- a/utils/time/now.go +++ b/utils/time/now.go @@ -1,13 +1,36 @@ package time import ( + "sync" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +var ( + timeNowFunc = time.Now + + // Acquire this mutex when accessing now function + nowLock sync.RWMutex +) + // Now is a wrapper around time.Now() and used to override behavior in tests. -var Now = time.Now +// Now invokes time.Now(), or its replacement function +func Now() time.Time { + nowLock.RLock() + defer nowLock.RUnlock() + + return timeNowFunc() +} + +// Replace the function used to return the current time (defaults to time.Now() ) +func SetNowTimeFunc(f func() time.Time) { + nowLock.Lock() + defer nowLock.Unlock() + + timeNowFunc = f + +} // MetaNow is a wrapper around metav1.Now() and used to override behavior in tests. var MetaNow = func() metav1.Time { From cae52ac4ad58326177f3a2d8d0674e9f383dd112 Mon Sep 17 00:00:00 2001 From: "Kostis (Codefresh)" <39800303+kostis-codefresh@users.noreply.github.com> Date: Fri, 29 Mar 2024 17:59:29 +0100 Subject: [PATCH 240/264] docs: more best practices (#3484) Signed-off-by: Kostis Kapelonis --- docs/best-practices.md | 75 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/docs/best-practices.md b/docs/best-practices.md index 735478aa5b..2f7908f4ba 100644 --- a/docs/best-practices.md +++ b/docs/best-practices.md @@ -1,6 +1,71 @@ # Best Practices -This document describes some best practices, tips and tricks when using Argo Rollouts. +This document describes some best practices, tips and tricks when using Argo Rollouts. Be sure to read the [FAQ page](../FAQ) as well. + + +## Check application compatibility + +Argo Rollouts is a great solution for applications that your team is deploying in a continuous manner (and you have access to the source code). Before using Argo Rollouts you need to contact the developers of the application and verify that you can indeed run multiple versions of the same application at the same time. + +Not all applications can work with Argo Rollouts. Applications that use shared resources (e.g. writing to a shared file) will have issues, and "worker" type applications (that load data from queues) will rarely work ok without source code modifications. + +Note that using Argo Rollouts for "infrastructure" applications such as cert-manager, nginx, coredns, sealed-secrets etc is **NOT** recommended. + +## Understand the scope of Argo Rollouts + +Currently Argo Rollouts works with a single Kubernetes deployment/application and within a single cluster only. You also need to have the controller deployed on *every* cluster where a Rollout is running if have more than one clusters using Rollout workloads. + +If you want to look at multiple-services on multiple clusters +see discussion at issues [2737](https://github.com/argoproj/argo-rollouts/issues/2737), [451](https://github.com/argoproj/argo-rollouts/issues/451) and [2088](https://github.com/argoproj/argo-rollouts/issues/2088). + + +Note also that Argo Rollouts is a self-contained solution. It doesn't need Argo CD or any other Argo project to work. + +## Understand your use case + +Argo Rollouts is perfect for all progressive delivery scenarios as explained in [the concepts page](../concepts). + +You should *NOT* use Argo Rollouts for preview/ephemeral environments. For that use case check the [Argo CD Pull Request generator](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators-Pull-Request/). + +The recommended way to use Argo Rollouts is for brief deployments that take 15-20 minutes or maximum 1-2 hours. If you want to run new versions for days or weeks before deciding to promote, then Argo Rollouts is probably not the best solution for you. + +Also, if you want to run a wave of multiple versions at the same time (i.e. have 1.1 and 1.2 and 1.3 running at the same time), know that Argo Rollouts was not designed for this scenario. + +A version that has just been promoted is assumed to be ready for production and has already passed all your tests (either manual or automated). + +## Prepare your metrics + +The end-goal for using Argo Rollouts is to have **fully automated** deployments that also include rollbacks when needed. + +While Argo Rollouts supports manual promotions and other manual pauses, these are best used for experimentation and test reasons. + +Ideally you should have proper metrics that tell you in 5-15 minutes if a deployment is successful or not. If you don't have those metrics, then you will miss a lot of value from Argo Rollouts. + +Get your [metrics](../features/analysis) in place first and test them with dry-runs before applying them to production deployments. + + +## There is no "Argo Rollouts API" + +A lot of people want to find an official API for managing Rollouts. There isn't any separate Argo Rollouts API. You can always use the Kubernetes API and patching of resources if you want to control a rollout. + +But as explained in the previous point the end goal should be fully automated deployments without you having to tell Argo Rollouts to promote or abort. + +## Integrating with other systems and processes + +There are two main ways to integrate other systems with Argo Rollouts. + +The easiest way is to use [Notifications](../features/notifications). This means that when a rollout is finished/aborted you send a notification to another system that does other tasks that you want to happen. + +Alternatively you can control Rollouts with the CLI or by patching manually the Kubernetes resources. + + +## Use the Kubernetes Downward API + +If you want your applications to know if they are part of a canary or not, you can use [Ephemeral labels](../features/ephemeral-metadata) along with the [Kubernetes downward api](https://kubernetes.io/docs/concepts/workloads/pods/downward-api/). + +This means that your application will read from files its configuration in a dynamic manner and adapt according to the situation. + + ## Ingress desired/stable host routes @@ -67,8 +132,10 @@ additional load balancers. ## Reducing operator memory usage On clusters with thousands of rollouts memory usage for the argo-rollouts -operator can be reduced significantly by changing RevisionHistoryLimit from the -default of 10 to a lower number. One user of Argo Rollouts saw a 27% reduction +controller can be reduced significantly by changing the `RevisionHistoryLimit` property from the +default of 10 to a lower number. + +One user of Argo Rollouts saw a 27% reduction in memory usage for a cluster with 1290 rollouts by changing -RevisionHistoryLimit from 10 to 0. +`RevisionHistoryLimit` from 10 to 0. From 47f579c5eeca1726ef4f160d2c71c3edf51db758 Mon Sep 17 00:00:00 2001 From: Chetan Banavikalmutt Date: Sat, 30 Mar 2024 00:29:50 +0530 Subject: [PATCH 241/264] chore: fix lint errors reported by golangci-lint (#3458) fix: lint errors reported by golangci-lint Signed-off-by: Chetan Banavikalmutt --- controller/metrics/prommetrics.go | 2 +- rollout/canary_test.go | 3 --- rollout/service_test.go | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/controller/metrics/prommetrics.go b/controller/metrics/prommetrics.go index 3e55ba1ccb..c0d3b89f62 100644 --- a/controller/metrics/prommetrics.go +++ b/controller/metrics/prommetrics.go @@ -135,7 +135,7 @@ var ( MetricAnalysisTemplateInfo = prometheus.NewDesc( "analysis_template_info", "Information about analysis templates.", - append(namespaceNameLabels), + namespaceNameLabels, nil, ) diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 0d2065a8db..56b05c7177 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -957,7 +957,6 @@ func TestRollBackToActiveReplicaSetWithinWindow(t *testing.T) { f.kubeobjects = append(f.kubeobjects, rs1, rs2) f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) - f.serviceLister = append(f.serviceLister) // Switch back to version 1 r2.Spec.Template = r1.Spec.Template @@ -1658,8 +1657,6 @@ func TestCanaryRolloutWithInvalidPingServiceName(t *testing.T) { f.rolloutLister = append(f.rolloutLister, r) f.objects = append(f.objects, r) - f.kubeobjects = append(f.kubeobjects) - f.serviceLister = append(f.serviceLister) patchIndex := f.expectPatchRolloutAction(r) f.run(getKey(r, t)) diff --git a/rollout/service_test.go b/rollout/service_test.go index cb15367a3a..0466634bde 100644 --- a/rollout/service_test.go +++ b/rollout/service_test.go @@ -158,7 +158,6 @@ func TestPreviewServiceNotFound(t *testing.T) { activeSvc := newService("active-svc", 80, nil, nil) notUsedPreviewSvc := newService("preview-svc", 80, nil, nil) f.kubeobjects = append(f.kubeobjects, activeSvc) - f.serviceLister = append(f.serviceLister) patchIndex := f.expectPatchRolloutAction(r) f.run(getKey(r, t)) From 190c42aa7eccd46bc355846380cb7abc3538b773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20L=C3=B3pez?= Date: Fri, 29 Mar 2024 20:04:21 +0100 Subject: [PATCH 242/264] feat(dashboard): improve pods visibility (#3483) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds two improvements to the Pods view: * Show spinner (pending status) while the pod is not ready (like ArgoCD UI does) * Show the `ready` property on the tooltip Signed-off-by: Alejandro López Sánchez --- USERS.md | 1 + ui/src/app/components/pods/pods.tsx | 20 +++++++++++++++---- .../rollout-grid-widget.tsx | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/USERS.md b/USERS.md index 14c36f7605..fc8217db6a 100644 --- a/USERS.md +++ b/USERS.md @@ -16,6 +16,7 @@ Organizations below are **officially** using Argo Rollouts. Please send a PR wit 1. [DaoCloud](https://daocloud.io) 1. [Databricks](https://github.com/databricks) 1. [Devtron Labs](https://github.com/devtron-labs/devtron) +1. [Factorial](https://factorialhr.com) 1. [Farfetch](https://www.farfetch.com/) 1. [Flipkart](https://flipkart.com) 1. [GetYourGuide](https://www.getyourguide.com) diff --git a/ui/src/app/components/pods/pods.tsx b/ui/src/app/components/pods/pods.tsx index ec0d65eead..5e7005fcbd 100644 --- a/ui/src/app/components/pods/pods.tsx +++ b/ui/src/app/components/pods/pods.tsx @@ -20,7 +20,17 @@ export enum PodStatus { Unknown = 'unknown', } -export const ParsePodStatus = (status: string): PodStatus => { +const isPodReady = (ready: string) => { + // Ready is a string in the format "0/1", "1/1", etc. + const [current, total] = ready.split('/'); + return current === total; +}; + +export const ParsePodStatus = (status: string, ready: string): PodStatus => { + if (status === 'Running' && !isPodReady(ready)) { + return PodStatus.Pending; + } + switch (status) { case 'Pending': case 'Terminating': @@ -101,10 +111,12 @@ export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boo key={pod.objectMeta?.uid} name={pod.objectMeta?.name} status={pod.status} + ready={pod.ready} tooltip={
    -
    Status: {pod.status}
    {pod.objectMeta?.name}
    +
    Status: {pod.status}
    +
    Ready: {pod.ready}
    } /> @@ -115,7 +127,7 @@ export const ReplicaSet = (props: {rs: RolloutReplicaSetInfo; showRevision?: boo ); }; -export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; status: string; tooltip: React.ReactNode; customIcon?: IconDefinition}) => { +export const PodWidget = ({name, status, ready, tooltip, customIcon}: {name: string; status: string; ready: string; tooltip: React.ReactNode; customIcon?: IconDefinition}) => { let icon: IconDefinition; let spin = false; if (status.startsWith('Init:')) { @@ -129,7 +141,7 @@ export const PodWidget = ({name, status, tooltip, customIcon}: {name: string; st icon = faExclamationTriangle; } - const className = ParsePodStatus(status); + const className = ParsePodStatus(status, ready); if (customIcon) { icon = customIcon; diff --git a/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx index 89497124ff..503a0415ed 100644 --- a/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx +++ b/ui/src/app/components/rollout-grid-widget/rollout-grid-widget.tsx @@ -21,7 +21,7 @@ import './rollout-grid-widget.scss'; export const isInProgress = (rollout: RolloutInfo): boolean => { for (const rs of rollout.replicaSets || []) { for (const p of rs.pods || []) { - const status = ParsePodStatus(p.status); + const status = ParsePodStatus(p.status, p.ready); if (status === PodStatus.Pending) { return true; } From ebe2816b7d93d15bf4a303812b523403ccb6df30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 14:27:01 -0500 Subject: [PATCH 243/264] chore(deps): bump codecov/codecov-action from 4.1.0 to 4.1.1 (#3476) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 6ef64e0c82..abb903a3f1 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -90,7 +90,7 @@ jobs: path: coverage.out - name: Upload code coverage information to codecov.io - uses: codecov/codecov-action@v4.1.0 + uses: codecov/codecov-action@v4.1.1 with: file: coverage.out From ea398fc9503a8313f937a6bb4a7dacad2dfde770 Mon Sep 17 00:00:00 2001 From: William Van Hevelingen Date: Fri, 29 Mar 2024 12:40:50 -0700 Subject: [PATCH 244/264] chore(deps): update golang to 1.21 (#3482) Signed-off-by: william.vanhevelingen --- .github/workflows/docker-publish.yml | 4 ++-- .github/workflows/e2e.yaml | 2 +- .github/workflows/gh-pages.yaml | 2 +- .github/workflows/go.yml | 4 ++-- .github/workflows/release.yaml | 6 +++--- Dockerfile | 6 +++--- go.mod | 4 +++- go.sum | 12 ++++++++++++ 8 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index c762c89c29..04fd8f9efc 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -67,7 +67,7 @@ jobs: with: quay_image_name: ${{ needs.set-vars.outputs.controller-meta-tags }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.20' + go-version: '1.21' platforms: ${{ needs.set-vars.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} secrets: @@ -84,7 +84,7 @@ jobs: with: quay_image_name: ${{ needs.set-vars.outputs.plugin-meta-tags }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.20' + go-version: '1.21' platforms: ${{ needs.set-vars.outputs.platforms }} push: ${{ github.event_name != 'pull_request' }} target: kubectl-argo-rollouts diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 8587e74426..558745f54b 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -48,7 +48,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5.0.0 with: - go-version: '1.20' + go-version: '1.21' - uses: actions/checkout@v4 - name: Setup k3s env: diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml index 49aff35408..ffd8b736d0 100644 --- a/.github/workflows/gh-pages.yaml +++ b/.github/workflows/gh-pages.yaml @@ -26,7 +26,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5.0.0 with: - go-version: '1.20' + go-version: '1.21' - name: build run: | pip install mkdocs mkdocs_material diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index abb903a3f1..65e600d8d3 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -9,7 +9,7 @@ on: - "master" env: # Golang version to use across CI steps - GOLANG_VERSION: '1.20' + GOLANG_VERSION: '1.21' concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -44,7 +44,7 @@ jobs: - name: Run golangci-lint uses: golangci/golangci-lint-action@v4 with: - version: v1.53.3 + version: v1.57.2 args: --timeout 6m build: name: Build diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 78ae2c52bf..a8c0781fbe 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -7,7 +7,7 @@ on: permissions: {} env: - GOLANG_VERSION: '1.20' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. + GOLANG_VERSION: '1.21' # Note: go-version must also be set in job controller-image.with.go-version & plugin-image.with.go-version. jobs: controller-image: @@ -19,7 +19,7 @@ jobs: with: quay_image_name: quay.io/argoproj/argo-rollouts:${{ github.ref_name }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.20' + go-version: '1.21' platforms: linux/amd64,linux/arm64 push: true secrets: @@ -35,7 +35,7 @@ jobs: with: quay_image_name: quay.io/argoproj/kubectl-argo-rollouts:${{ github.ref_name }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) - go-version: '1.20' + go-version: '1.21' platforms: linux/amd64,linux/arm64 push: true target: kubectl-argo-rollouts diff --git a/Dockerfile b/Dockerfile index 096b150517..4998a43454 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # Initial stage which pulls prepares build dependencies and CLI tooling we need for our final image # Also used as the image in CI jobs so needs all dependencies #################################################################################################### -FROM --platform=$BUILDPLATFORM golang:1.20 as builder +FROM --platform=$BUILDPLATFORM golang:1.21 as builder RUN apt-get update && apt-get install -y \ wget \ @@ -12,7 +12,7 @@ RUN apt-get update && apt-get install -y \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Install golangci-lint -RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.53.3 && \ +RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.57.2 && \ golangci-lint linters COPY .golangci.yml ${GOPATH}/src/dummy/.golangci.yml @@ -40,7 +40,7 @@ RUN NODE_ENV='production' yarn build #################################################################################################### # Rollout Controller Build stage which performs the actual build of argo-rollouts binaries #################################################################################################### -FROM --platform=$BUILDPLATFORM golang:1.20 as argo-rollouts-build +FROM --platform=$BUILDPLATFORM golang:1.21 as argo-rollouts-build WORKDIR /go/src/github.com/argoproj/argo-rollouts diff --git a/go.mod b/go.mod index 5e423a2e93..a0844bb1d3 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/argoproj/argo-rollouts -go 1.20 +go 1.21 + +toolchain go1.21.7 require ( github.com/antonmedv/expr v1.15.5 diff --git a/go.sum b/go.sum index 5c5c9f6e16..b6e32badba 100644 --- a/go.sum +++ b/go.sum @@ -88,6 +88,7 @@ github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954/go github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= @@ -139,6 +140,7 @@ github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhO github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg/5rSNNXwmMct5XaE= github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= @@ -181,6 +183,7 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20220417044921-416226498f94 h1:VIy7cdK7ufs7ctpTFkXJHm1uP3dJSnCGSPysEICB1so= +github.com/elazarl/goproxy v0.0.0-20220417044921-416226498f94/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= @@ -208,6 +211,7 @@ github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBd github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -408,6 +412,7 @@ github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1 github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -444,6 +449,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -540,6 +546,7 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -547,6 +554,7 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 h1:nV98dkBpqaYbDnhefmOQ+Rn4hE+jD6AtjYHXaU5WyJI= @@ -589,10 +597,12 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/servicemeshinterface/smi-sdk-go v0.5.0 h1:9cZdhvGbGDlmnp9qqmcQL+RL6KZ3IzHfDLoA5Axg8n0= github.com/servicemeshinterface/smi-sdk-go v0.5.0/go.mod h1:nm1Slf3pfaZPP3g2tE/K5wDmQ1uWVSP0p3uu5rQAQLc= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= @@ -809,6 +819,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1103,6 +1114,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From f5793e40fae1da9e5e50cfb3001105897571ce48 Mon Sep 17 00:00:00 2001 From: OpenGuidou <73480729+OpenGuidou@users.noreply.github.com> Date: Fri, 29 Mar 2024 21:23:16 +0100 Subject: [PATCH 245/264] feat: Reference AnalysisTemplates inside an AnalysisTemplate (#3353) Signed-off-by: Guillaume Doussin --- docs/features/analysis.md | 178 ++ .../features/kustomize/rollout_cr_schema.json | 38 +- experiments/controller_test.go | 16 +- experiments/experiment.go | 99 +- experiments/experiment_test.go | 421 ++++- experiments/replicaset_test.go | 4 +- manifests/crds/analysis-template-crd.yaml | 11 +- .../crds/cluster-analysis-template-crd.yaml | 11 +- manifests/install.yaml | 22 +- pkg/apiclient/rollout/rollout.swagger.json | 28 +- pkg/apis/api-rules/violation_exceptions.list | 1 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 6 +- pkg/apis/rollouts/v1alpha1/generated.pb.go | 1652 +++++++++-------- pkg/apis/rollouts/v1alpha1/generated.proto | 27 +- .../rollouts/v1alpha1/openapi_generated.go | 87 +- pkg/apis/rollouts/v1alpha1/types.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 39 +- .../validation/validation_references_test.go | 2 +- rollout/analysis.go | 73 +- rollout/analysis_test.go | 366 +++- rollout/bluegreen_test.go | 2 +- rollout/controller.go | 54 +- rollout/controller_test.go | 54 +- rollout/experiment_test.go | 2 +- rollout/sync_test.go | 6 +- ui/src/models/rollout/generated/api.ts | 42 +- utils/analysis/helpers.go | 20 + utils/analysis/helpers_test.go | 80 + 28 files changed, 2324 insertions(+), 1021 deletions(-) diff --git a/docs/features/analysis.md b/docs/features/analysis.md index d300f0cbb0..4029164425 100644 --- a/docs/features/analysis.md +++ b/docs/features/analysis.md @@ -358,6 +358,184 @@ templates together. The controller combines the `metrics` and `args` fields of a * Multiple metrics in the templates have the same name * Two arguments with the same name have different default values no matter the argument value in Rollout +## Analysis Template referencing other Analysis Templates + +AnalysisTemplates and ClusterAnalysisTemplates may reference other templates. + +They can be combined with other metrics: + +=== "AnalysisTemplate" + + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: error-rate + spec: + args: + - name: service-name + metrics: + - name: error-rate + interval: 5m + successCondition: result[0] <= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code=~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + --- + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: rates + spec: + args: + - name: service-name + metrics: + - name: success-rate + interval: 5m + successCondition: result[0] >= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + templates: + - templateName: error-rate + clusterScope: false + ``` + +Or without additional metrics: + +=== "AnalysisTemplate" + + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: success-rate + spec: + args: + - name: service-name + metrics: + - name: success-rate + interval: 5m + successCondition: result[0] >= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + --- + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: error-rate + spec: + args: + - name: service-name + metrics: + - name: error-rate + interval: 5m + successCondition: result[0] <= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code=~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + --- + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: rates + spec: + args: + - name: service-name + templates: + - templateName: success-rate + clusterScope: false + - templateName: error-rate + clusterScope: false + ``` + + The result in the AnalysisRun will have the aggregation of metrics of each template: + + === "AnalysisRun" + + ```yaml + # NOTE: Generated AnalysisRun from a single template referencing several templates + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisRun + metadata: + name: guestbook-CurrentPodHash-templates-in-template + spec: + args: + - name: service-name + value: guestbook-svc.default.svc.cluster.local + metrics: + - name: success-rate + interval: 5m + successCondition: result[0] >= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + - name: error-rate + interval: 5m + successCondition: result[0] <= 0.95 + failureLimit: 3 + provider: + prometheus: + address: http://prometheus.example.com:9090 + query: | + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code=~"5.*"}[5m] + )) / + sum(irate( + istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] + )) + ``` + +!!! note + The same limitations as for the multiple templates feature apply. + The controller will error when merging the templates if: + + * Multiple metrics in the templates have the same name + * Two arguments with the same name have different default values no matter the argument value in Rollout + + However, if the same AnalysisTemplate is referenced several times along the chain of references, the controller will only keep it once and discard the other references. + ## Analysis Template Arguments AnalysisTemplates may declare a set of arguments that can be passed by Rollouts. The args can then be used as in metrics configuration and are resolved at the time the AnalysisRun is created. Argument placeholders are defined as diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 815298b254..4dd0d72859 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -9250,11 +9250,24 @@ "type": "array", "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge" + }, + "templates": { + "items": { + "properties": { + "clusterScope": { + "type": "boolean" + }, + "templateName": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge" } }, - "required": [ - "metrics" - ], "type": "object" } }, @@ -13883,11 +13896,24 @@ "type": "array", "x-kubernetes-patch-merge-key": "name", "x-kubernetes-patch-strategy": "merge" + }, + "templates": { + "items": { + "properties": { + "clusterScope": { + "type": "boolean" + }, + "templateName": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array", + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge" } }, - "required": [ - "metrics" - ], "type": "object" } }, diff --git a/experiments/controller_test.go b/experiments/controller_test.go index 55e9c1e917..9365480cb9 100644 --- a/experiments/controller_test.go +++ b/experiments/controller_test.go @@ -303,7 +303,7 @@ func generateRSName(ex *v1alpha1.Experiment, template v1alpha1.TemplateSpec) str return fmt.Sprintf("%s-%s", ex.Name, template.Name) } -func calculatePatch(ex *v1alpha1.Experiment, patch string, templates []v1alpha1.TemplateStatus, condition *v1alpha1.ExperimentCondition) string { +func calculatePatch(ex *v1alpha1.Experiment, patch string, templates []v1alpha1.TemplateStatus, condition *v1alpha1.ExperimentCondition, analysisRuns []*v1alpha1.ExperimentAnalysisRunStatus, message string) string { patchMap := make(map[string]any) err := json.Unmarshal([]byte(patch), &patchMap) if err != nil { @@ -318,6 +318,14 @@ func calculatePatch(ex *v1alpha1.Experiment, patch string, templates []v1alpha1. newStatus["conditions"] = []v1alpha1.ExperimentCondition{*condition} patchMap["status"] = newStatus } + if analysisRuns != nil { + newStatus["analysisRuns"] = analysisRuns + patchMap["status"] = newStatus + } + if message != "" { + newStatus["message"] = message + patchMap["status"] = newStatus + } patchBytes, err := json.Marshal(patchMap) if err != nil { @@ -806,7 +814,7 @@ func TestAddInvalidSpec(t *testing.T) { expectedPatch := calculatePatch(e, `{ "status":{ } - }`, nil, cond) + }`, nil, cond, nil, "") assert.JSONEq(t, expectedPatch, patch) } @@ -853,7 +861,7 @@ func TestUpdateInvalidSpec(t *testing.T) { expectedPatch := calculatePatch(e, `{ "status":{ } - }`, nil, cond) + }`, nil, cond, nil, "") assert.JSONEq(t, expectedPatch, patch) } @@ -893,7 +901,7 @@ func TestRemoveInvalidSpec(t *testing.T) { expectedPatch := calculatePatch(e, `{ "status":{ } - }`, templateStatus, cond) + }`, templateStatus, cond, nil, "") assert.JSONEq(t, expectedPatch, patch) } diff --git a/experiments/experiment.go b/experiments/experiment.go index d63f652dc7..1b40464015 100644 --- a/experiments/experiment.go +++ b/experiments/experiment.go @@ -638,13 +638,12 @@ func (ec *experimentContext) assessAnalysisRuns() (v1alpha1.AnalysisPhase, strin func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysisTemplateRef, args []v1alpha1.Argument, dryRunMetrics []v1alpha1.DryRun, measurementRetentionMetrics []v1alpha1.MeasurementRetention, analysisRunMetadata *v1alpha1.AnalysisRunMetadata) (*v1alpha1.AnalysisRun, error) { if analysis.ClusterScope { - clusterTemplate, err := ec.clusterAnalysisTemplateLister.Get(analysis.TemplateName) + analysisTemplates, clusterAnalysisTemplates, err := ec.getAnalysisTemplatesFromClusterAnalysis(analysis) if err != nil { return nil, err } name := fmt.Sprintf("%s-%s", ec.ex.Name, analysis.Name) - clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{clusterTemplate} runLabels := map[string]string{} runAnnotations := map[string]string{} @@ -660,7 +659,7 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis runAnnotations[k] = v } } - run, err := analysisutil.NewAnalysisRunFromTemplates(nil, clusterAnalysisTemplates, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) + run, err := analysisutil.NewAnalysisRunFromTemplates(analysisTemplates, clusterAnalysisTemplates, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) if err != nil { return nil, err } @@ -668,13 +667,12 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis run.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(ec.ex, controllerKind)} return run, nil } else { - template, err := ec.analysisTemplateLister.AnalysisTemplates(ec.ex.Namespace).Get(analysis.TemplateName) + analysisTemplates, clusterAnalysisTemplates, err := ec.getAnalysisTemplatesFromAnalysis(analysis) if err != nil { return nil, err } name := fmt.Sprintf("%s-%s", ec.ex.Name, analysis.Name) - analysisTemplates := []*v1alpha1.AnalysisTemplate{template} runLabels := map[string]string{} runAnnotations := map[string]string{} instanceID := analysisutil.GetInstanceID(ec.ex) @@ -690,7 +688,7 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis } } - run, err := analysisutil.NewAnalysisRunFromTemplates(analysisTemplates, nil, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) + run, err := analysisutil.NewAnalysisRunFromTemplates(analysisTemplates, clusterAnalysisTemplates, args, dryRunMetrics, measurementRetentionMetrics, runLabels, runAnnotations, name, "", ec.ex.Namespace) if err != nil { return nil, err } @@ -700,6 +698,95 @@ func (ec *experimentContext) newAnalysisRun(analysis v1alpha1.ExperimentAnalysis } } +func (ec *experimentContext) getAnalysisTemplatesFromClusterAnalysis(analysis v1alpha1.ExperimentAnalysisTemplateRef) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate, error) { + clusterTemplate, err := ec.clusterAnalysisTemplateLister.Get(analysis.TemplateName) + if err != nil { + return nil, nil, err + } + templates := make([]*v1alpha1.AnalysisTemplate, 0) + clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) + clusterTemplates = append(clusterTemplates, clusterTemplate) + + if clusterTemplate.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := ec.getAnalysisTemplatesFromRefs(&clusterTemplate.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + uniqueTemplates, uniqueClusterTemplates := analysisutil.FilterUniqueTemplates(templates, clusterTemplates) + return uniqueTemplates, uniqueClusterTemplates, nil +} + +func (ec *experimentContext) getAnalysisTemplatesFromAnalysis(analysis v1alpha1.ExperimentAnalysisTemplateRef) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate, error) { + template, err := ec.analysisTemplateLister.AnalysisTemplates(ec.ex.Namespace).Get(analysis.TemplateName) + if err != nil { + return nil, nil, err + } + templates := make([]*v1alpha1.AnalysisTemplate, 0) + clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) + templates = append(templates, template) + + if template.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := ec.getAnalysisTemplatesFromRefs(&template.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + uniqueTemplates, uniqueClusterTemplates := analysisutil.FilterUniqueTemplates(templates, clusterTemplates) + return uniqueTemplates, uniqueClusterTemplates, nil +} + +func (ec *experimentContext) getAnalysisTemplatesFromRefs(templateRefs *[]v1alpha1.AnalysisTemplateRef) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate, error) { + templates := make([]*v1alpha1.AnalysisTemplate, 0) + clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) + for _, templateRef := range *templateRefs { + if templateRef.ClusterScope { + template, err := ec.clusterAnalysisTemplateLister.Get(templateRef.TemplateName) + if err != nil { + if k8serrors.IsNotFound(err) { + ec.log.Warnf("ClusterAnalysisTemplate '%s' not found", templateRef.TemplateName) + } + return nil, nil, err + } + clusterTemplates = append(clusterTemplates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := ec.getAnalysisTemplatesFromRefs(&template.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + } else { + template, err := ec.analysisTemplateLister.AnalysisTemplates(ec.ex.Namespace).Get(templateRef.TemplateName) + if err != nil { + if k8serrors.IsNotFound(err) { + ec.log.Warnf("AnalysisTemplate '%s' not found", templateRef.TemplateName) + } + return nil, nil, err + } + templates = append(templates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := ec.getAnalysisTemplatesFromRefs(&template.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + } + + } + uniqueTemplates, uniqueClusterTemplates := analysisutil.FilterUniqueTemplates(templates, clusterTemplates) + return uniqueTemplates, uniqueClusterTemplates, nil +} + // verifyAnalysisTemplate verifies an AnalysisTemplate. For now, it simply means that it exists func (ec *experimentContext) verifyAnalysisTemplate(analysis v1alpha1.ExperimentAnalysisTemplateRef) error { _, err := ec.analysisTemplateLister.AnalysisTemplates(ec.ex.Namespace).Get(analysis.TemplateName) diff --git a/experiments/experiment_test.go b/experiments/experiment_test.go index 82db0190aa..a21e8146d8 100644 --- a/experiments/experiment_test.go +++ b/experiments/experiment_test.go @@ -97,7 +97,7 @@ func TestSetExperimentToPending(t *testing.T) { "status":{ "phase": "Pending" } - }`, templateStatus, cond) + }`, templateStatus, cond, nil, "") assert.Equal(t, expectedPatch, patch) } @@ -281,7 +281,7 @@ func TestSuccessAfterDurationPasses(t *testing.T) { "status":{ "phase": "Successful" } - }`, templateStatuses, cond) + }`, templateStatuses, cond, nil, "") assert.JSONEq(t, expectedPatch, patch) } @@ -555,3 +555,420 @@ func TestServiceNameSet(t *testing.T) { assert.NotNil(t, exCtx.templateServices["bar"]) assert.Equal(t, exCtx.templateServices["bar"].Name, "service-name") } + +func TestCreatenalysisRunWithClusterTemplatesAndTemplateAndInnerTemplates(t *testing.T) { + + at := analysisTemplateWithNamespacedAnalysisRefs("bar", "bar2") + at2 := analysisTemplateWithClusterAnalysisRefs("bar2", "clusterbar", "clusterbar2") + cat := clusterAnalysisTemplateWithAnalysisRefs("clusterbar", "clusterbar2", "clusterbar3") + cat2 := clusterAnalysisTemplate("clusterbar2") + cat3 := clusterAnalysisTemplate("clusterbar3") + cat4 := clusterAnalysisTemplate("clusterbar4") + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "bar", + ClusterScope: false, + }, + { + Name: "exp-bar-2", + TemplateName: "clusterbar4", + ClusterScope: true, + }, + } + + e.Status = v1alpha1.ExperimentStatus{} + e.Status.AvailableAt = now() + e.Status.Phase = v1alpha1.AnalysisPhaseRunning + + cond := newCondition(conditions.ReplicaSetUpdatedReason, e) + + rs := templateToRS(e, templates[0], 0) + f := newFixture(t, e, rs, cat, cat2, cat3, cat4, at, at2) + defer f.Close() + + ar1 := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo-exp-bar", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(rs, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: concatMultipleSlices([][]v1alpha1.Metric{at.Spec.Metrics, at2.Spec.Metrics, cat.Spec.Metrics, cat2.Spec.Metrics, cat3.Spec.Metrics}), + DryRun: concatMultipleSlices([][]v1alpha1.DryRun{at.Spec.DryRun, at2.Spec.DryRun, cat.Spec.DryRun, cat2.Spec.DryRun, cat3.Spec.DryRun}), + Args: at.Spec.Args, + MeasurementRetention: concatMultipleSlices([][]v1alpha1.MeasurementRetention{at.Spec.MeasurementRetention, at2.Spec.MeasurementRetention, cat.Spec.MeasurementRetention, cat2.Spec.MeasurementRetention, cat3.Spec.MeasurementRetention}), + }, + } + ar2 := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo-exp-bar-2", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(rs, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: cat4.Spec.Metrics, + Args: cat4.Spec.Args, + DryRun: cat4.Spec.DryRun, + MeasurementRetention: cat4.Spec.MeasurementRetention, + }, + } + createdIndex1 := f.expectCreateAnalysisRunAction(ar1) + createdIndex2 := f.expectCreateAnalysisRunAction(ar2) + index := f.expectPatchExperimentAction(e) + + f.run(getKey(e, t)) + + createdAr1 := f.getCreatedAnalysisRun(createdIndex1) + createdAr2 := f.getCreatedAnalysisRun(createdIndex2) + + patch := f.getPatchedExperiment(index) + templateStatus := []v1alpha1.TemplateStatus{ + generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, nil), + } + analysisRun := []*v1alpha1.ExperimentAnalysisRunStatus{ + { + AnalysisRun: "foo-exp-bar", + Name: "exp-bar", + Phase: "Pending", + }, + { + AnalysisRun: "foo-exp-bar-2", + Name: "exp-bar-2", + Phase: "Pending", + }, + } + expectedPatch := calculatePatch(e, `{ + "status":{ + "phase": "Pending" + } + }`, templateStatus, cond, analysisRun, "") + assert.Equal(t, expectedPatch, patch) + + assert.Equal(t, "foo-exp-bar", createdAr1.Name) + assert.Len(t, createdAr1.Spec.Metrics, 5) + assert.Equal(t, "foo-exp-bar-2", createdAr2.Name) + assert.Len(t, createdAr2.Spec.Metrics, 1) +} + +func TestCreatenalysisRunWithTemplatesAndNoMetricsAtRoot(t *testing.T) { + + at := analysisTemplateWithOnlyNamespacedAnalysisRefs("bar", "bar2") + at2 := analysisTemplateWithClusterAnalysisRefs("bar2", "clusterbar", "clusterbar2") + cat := clusterAnalysisTemplateWithAnalysisRefs("clusterbar", "clusterbar2", "clusterbar3") + cat2 := clusterAnalysisTemplate("clusterbar2") + cat3 := clusterAnalysisTemplate("clusterbar3") + cat4 := clusterAnalysisTemplate("clusterbar4") + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "bar", + ClusterScope: false, + }, + { + Name: "exp-bar-2", + TemplateName: "clusterbar4", + ClusterScope: true, + }, + } + + e.Status = v1alpha1.ExperimentStatus{} + e.Status.AvailableAt = now() + e.Status.Phase = v1alpha1.AnalysisPhaseRunning + + cond := newCondition(conditions.ReplicaSetUpdatedReason, e) + + rs := templateToRS(e, templates[0], 0) + f := newFixture(t, e, rs, cat, cat2, cat3, cat4, at, at2) + defer f.Close() + + ar1 := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo-exp-bar", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(rs, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: concatMultipleSlices([][]v1alpha1.Metric{at2.Spec.Metrics, cat.Spec.Metrics, cat2.Spec.Metrics, cat3.Spec.Metrics}), + DryRun: concatMultipleSlices([][]v1alpha1.DryRun{at2.Spec.DryRun, cat.Spec.DryRun, cat2.Spec.DryRun, cat3.Spec.DryRun}), + Args: at.Spec.Args, + MeasurementRetention: concatMultipleSlices([][]v1alpha1.MeasurementRetention{at2.Spec.MeasurementRetention, cat.Spec.MeasurementRetention, cat2.Spec.MeasurementRetention, cat3.Spec.MeasurementRetention}), + }, + } + ar2 := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo-exp-bar-2", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(rs, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: cat4.Spec.Metrics, + Args: cat4.Spec.Args, + DryRun: cat4.Spec.DryRun, + MeasurementRetention: cat4.Spec.MeasurementRetention, + }, + } + createdIndex1 := f.expectCreateAnalysisRunAction(ar1) + createdIndex2 := f.expectCreateAnalysisRunAction(ar2) + index := f.expectPatchExperimentAction(e) + + f.run(getKey(e, t)) + + createdAr1 := f.getCreatedAnalysisRun(createdIndex1) + createdAr2 := f.getCreatedAnalysisRun(createdIndex2) + + patch := f.getPatchedExperiment(index) + templateStatus := []v1alpha1.TemplateStatus{ + generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, nil), + } + analysisRun := []*v1alpha1.ExperimentAnalysisRunStatus{ + { + AnalysisRun: "foo-exp-bar", + Name: "exp-bar", + Phase: "Pending", + }, + { + AnalysisRun: "foo-exp-bar-2", + Name: "exp-bar-2", + Phase: "Pending", + }, + } + expectedPatch := calculatePatch(e, `{ + "status":{ + "phase": "Pending" + } + }`, templateStatus, cond, analysisRun, "") + assert.Equal(t, expectedPatch, patch) + + assert.Equal(t, "foo-exp-bar", createdAr1.Name) + assert.Len(t, createdAr1.Spec.Metrics, 4) + assert.Equal(t, "foo-exp-bar-2", createdAr2.Name) + assert.Len(t, createdAr2.Spec.Metrics, 1) +} + +func TestAnalysisTemplateNotFoundShouldFailTheExperiment(t *testing.T) { + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "bar", + ClusterScope: false, + }, + } + + rs := templateToRS(e, templates[0], 0) + + expectFailureWithMessage(e, templates, t, "Failed to create AnalysisRun for analysis 'exp-bar': analysistemplate.argoproj.io \"bar\" not found", e, rs) +} + +func TestClusterAnalysisTemplateNotFoundShouldFailTheExperiment(t *testing.T) { + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "cluster-bar", + ClusterScope: true, + }, + } + + rs := templateToRS(e, templates[0], 0) + + expectFailureWithMessage(e, templates, t, "Failed to create AnalysisRun for analysis 'exp-bar': clusteranalysistemplate.argoproj.io \"cluster-bar\" not found", e, rs) +} + +func TestInnerAnalysisTemplateNotFoundShouldFailTheExperiment(t *testing.T) { + + at := analysisTemplateWithOnlyNamespacedAnalysisRefs("bar", "bar2") + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "bar", + ClusterScope: false, + }, + } + + rs := templateToRS(e, templates[0], 0) + + expectFailureWithMessage(e, templates, t, "Failed to create AnalysisRun for analysis 'exp-bar': analysistemplate.argoproj.io \"bar2\" not found", at, e, rs) +} + +func TestInnerClusterAnalysisTemplateNotFoundShouldFailTheExperiment(t *testing.T) { + + cat := clusterAnalysisTemplateWithAnalysisRefs("clusterbar", "clusterbar2", "clusterbar3") + cat2 := clusterAnalysisTemplate("clusterbar2") + + templates := generateTemplates("bar") + e := newExperiment("foo", templates, "") + e.Spec.Analyses = []v1alpha1.ExperimentAnalysisTemplateRef{ + { + Name: "exp-bar", + TemplateName: "clusterbar", + ClusterScope: true, + }, + } + rs := templateToRS(e, templates[0], 0) + + expectFailureWithMessage(e, templates, t, "Failed to create AnalysisRun for analysis 'exp-bar': clusteranalysistemplate.argoproj.io \"clusterbar3\" not found", cat, cat2, e, rs) +} + +func expectFailureWithMessage(e *v1alpha1.Experiment, templates []v1alpha1.TemplateSpec, t *testing.T, message string, objects ...runtime.Object) { + + e.Status = v1alpha1.ExperimentStatus{} + e.Status.AvailableAt = now() + e.Status.Phase = v1alpha1.AnalysisPhaseRunning + + cond := newCondition(conditions.ReplicaSetUpdatedReason, e) + + f := newFixture(t, objects...) + defer f.Close() + + index := f.expectPatchExperimentAction(e) + + f.run(getKey(e, t)) + + patch := f.getPatchedExperiment(index) + templateStatus := []v1alpha1.TemplateStatus{ + generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, nil), + } + analysisRun := []*v1alpha1.ExperimentAnalysisRunStatus{ + { + AnalysisRun: "", + Name: "exp-bar", + Message: message, + Phase: "Error", + }, + } + expectedPatch := calculatePatch(e, `{ + "status":{ + "phase": "Error" + } + }`, templateStatus, cond, analysisRun, message) + assert.Equal(t, expectedPatch, patch) +} + +func concatMultipleSlices[T any](slices [][]T) []T { + var totalLen int + + for _, s := range slices { + totalLen += len(s) + } + + result := make([]T, totalLen) + + var i int + + for _, s := range slices { + i += copy(result[i:], s) + } + + return result +} + +func analysisTemplateWithNamespacedAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithAnalysisRefs(name, false, innerRefsName...) +} + +func analysisTemplateWithClusterAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithAnalysisRefs(name, true, innerRefsName...) +} + +func analysisTemplateWithAnalysisRefs(name string, clusterScope bool, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: clusterScope, + }) + } + return &v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{{ + Name: "example-" + name, + }}, + DryRun: []v1alpha1.DryRun{{ + MetricName: "example-" + name, + }}, + MeasurementRetention: []v1alpha1.MeasurementRetention{{ + MetricName: "example-" + name, + }}, + Templates: templatesRefs, + }, + } +} + +func analysisTemplateWithOnlyNamespacedAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithOnlyRefs(name, false, innerRefsName...) +} + +func analysisTemplateWithOnlyRefs(name string, clusterScope bool, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: clusterScope, + }) + } + return &v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{}, + DryRun: []v1alpha1.DryRun{}, + MeasurementRetention: []v1alpha1.MeasurementRetention{}, + Templates: templatesRefs, + }, + } +} + +func clusterAnalysisTemplate(name string) *v1alpha1.ClusterAnalysisTemplate { + return &v1alpha1.ClusterAnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{{ + Name: "clusterexample-" + name, + }}, + }, + } +} + +func clusterAnalysisTemplateWithAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.ClusterAnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: true, + }) + } + return &v1alpha1.ClusterAnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{{ + Name: "clusterexample-" + name, + }}, + Templates: templatesRefs, + }, + } +} diff --git a/experiments/replicaset_test.go b/experiments/replicaset_test.go index 030414f2df..a3d3e9e0a7 100644 --- a/experiments/replicaset_test.go +++ b/experiments/replicaset_test.go @@ -41,7 +41,7 @@ func TestCreateMultipleRS(t *testing.T) { expectedPatch := calculatePatch(e, `{ "status":{ } - }`, templateStatus, cond) + }`, templateStatus, cond, nil, "") assert.JSONEq(t, expectedPatch, patch) } @@ -72,7 +72,7 @@ func TestCreateMissingRS(t *testing.T) { generateTemplatesStatus("bar", 0, 0, v1alpha1.TemplateStatusProgressing, now()), generateTemplatesStatus("baz", 0, 0, v1alpha1.TemplateStatusProgressing, now()), } - assert.JSONEq(t, calculatePatch(e, expectedPatch, templateStatuses, cond), patch) + assert.JSONEq(t, calculatePatch(e, expectedPatch, templateStatuses, cond, nil, ""), patch) } func TestTemplateHasMultipleRS(t *testing.T) { diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index 9dbaa69c65..d1b0cba2d1 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -3008,8 +3008,15 @@ spec: - provider type: object type: array - required: - - metrics + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array type: object required: - spec diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 9fadaef522..ba8af4b57a 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -3008,8 +3008,15 @@ spec: - provider type: object type: array - required: - - metrics + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array type: object required: - spec diff --git a/manifests/install.yaml b/manifests/install.yaml index 289428bffd..730864ee02 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -6162,8 +6162,15 @@ spec: - provider type: object type: array - required: - - metrics + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array type: object required: - spec @@ -9182,8 +9189,15 @@ spec: - provider type: object type: array - required: - - metrics + templates: + items: + properties: + clusterScope: + type: boolean + templateName: + type: string + type: object + type: array type: object required: - spec diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 7279aea5e3..2a2df62deb 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -693,6 +693,19 @@ }, "title": "AnalysisRunStrategy configuration for the analysis runs and experiments to retain" }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplateRef": { + "type": "object", + "properties": { + "templateName": { + "type": "string", + "title": "TemplateName name of template to use in AnalysisRun\n+optional" + }, + "clusterScope": { + "type": "boolean", + "title": "Whether to look for the templateName at cluster scope or namespace scope\n+optional" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AntiAffinity": { "type": "object", "properties": { @@ -1840,7 +1853,7 @@ "templates": { "type": "array", "items": { - "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisTemplate" + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplateRef" }, "title": "Templates reference to a list of analysis templates to combine for an AnalysisRun\n+patchMergeKey=templateName\n+patchStrategy=merge" }, @@ -1900,19 +1913,6 @@ } } }, - "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisTemplate": { - "type": "object", - "properties": { - "templateName": { - "type": "string", - "title": "TemplateName name of template to use in AnalysisRun\n+optional" - }, - "clusterScope": { - "type": "boolean", - "title": "Whether to look for the templateName at cluster scope or namespace scope\n+optional" - } - } - }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutCondition": { "type": "object", "properties": { diff --git a/pkg/apis/api-rules/violation_exceptions.list b/pkg/apis/api-rules/violation_exceptions.list index 39cdd4c776..ea9a241837 100644 --- a/pkg/apis/api-rules/violation_exceptions.list +++ b/pkg/apis/api-rules/violation_exceptions.list @@ -9,6 +9,7 @@ API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisTemplateSpec,DryRun API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisTemplateSpec,MeasurementRetention API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisTemplateSpec,Metrics +API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AnalysisTemplateSpec,Templates API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,ApisixRoute,Rules API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,AppMeshVirtualService,Routes API rule violation: list_type_missing,github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1,CanaryStrategy,Steps diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index f7acbdc6cf..08ef18071f 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -56,7 +56,7 @@ type AnalysisTemplateSpec struct { // Metrics contains the list of metrics to query as part of an analysis run // +patchMergeKey=name // +patchStrategy=merge - Metrics []Metric `json:"metrics" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,1,rep,name=metrics"` + Metrics []Metric `json:"metrics,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,1,rep,name=metrics"` // Args are the list of arguments to the template // +patchMergeKey=name // +patchStrategy=merge @@ -72,6 +72,10 @@ type AnalysisTemplateSpec struct { // +patchStrategy=merge // +optional MeasurementRetention []MeasurementRetention `json:"measurementRetention,omitempty" patchStrategy:"merge" patchMergeKey:"metricName" protobuf:"bytes,4,rep,name=measurementRetention"` + // Templates reference to a list of analysis templates to combine with the rest of the metrics for an AnalysisRun + // +patchMergeKey=templateName + // +patchStrategy=merge + Templates []AnalysisTemplateRef `json:"templates,omitempty" patchStrategy:"merge" patchMergeKey:"templateName" protobuf:"bytes,5,rep,name=templates"` } // DurationString is a string representing a duration (e.g. 30s, 5m, 1h) diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index f1b6428971..cab169a9d0 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -383,10 +383,38 @@ func (m *AnalysisTemplateList) XXX_DiscardUnknown() { var xxx_messageInfo_AnalysisTemplateList proto.InternalMessageInfo +func (m *AnalysisTemplateRef) Reset() { *m = AnalysisTemplateRef{} } +func (*AnalysisTemplateRef) ProtoMessage() {} +func (*AnalysisTemplateRef) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{12} +} +func (m *AnalysisTemplateRef) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AnalysisTemplateRef) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *AnalysisTemplateRef) XXX_Merge(src proto.Message) { + xxx_messageInfo_AnalysisTemplateRef.Merge(m, src) +} +func (m *AnalysisTemplateRef) XXX_Size() int { + return m.Size() +} +func (m *AnalysisTemplateRef) XXX_DiscardUnknown() { + xxx_messageInfo_AnalysisTemplateRef.DiscardUnknown(m) +} + +var xxx_messageInfo_AnalysisTemplateRef proto.InternalMessageInfo + func (m *AnalysisTemplateSpec) Reset() { *m = AnalysisTemplateSpec{} } func (*AnalysisTemplateSpec) ProtoMessage() {} func (*AnalysisTemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{12} + return fileDescriptor_e0e705f843545fab, []int{13} } func (m *AnalysisTemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -414,7 +442,7 @@ var xxx_messageInfo_AnalysisTemplateSpec proto.InternalMessageInfo func (m *AntiAffinity) Reset() { *m = AntiAffinity{} } func (*AntiAffinity) ProtoMessage() {} func (*AntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{13} + return fileDescriptor_e0e705f843545fab, []int{14} } func (m *AntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -442,7 +470,7 @@ var xxx_messageInfo_AntiAffinity proto.InternalMessageInfo func (m *ApisixRoute) Reset() { *m = ApisixRoute{} } func (*ApisixRoute) ProtoMessage() {} func (*ApisixRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{14} + return fileDescriptor_e0e705f843545fab, []int{15} } func (m *ApisixRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -470,7 +498,7 @@ var xxx_messageInfo_ApisixRoute proto.InternalMessageInfo func (m *ApisixTrafficRouting) Reset() { *m = ApisixTrafficRouting{} } func (*ApisixTrafficRouting) ProtoMessage() {} func (*ApisixTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{15} + return fileDescriptor_e0e705f843545fab, []int{16} } func (m *ApisixTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -498,7 +526,7 @@ var xxx_messageInfo_ApisixTrafficRouting proto.InternalMessageInfo func (m *AppMeshTrafficRouting) Reset() { *m = AppMeshTrafficRouting{} } func (*AppMeshTrafficRouting) ProtoMessage() {} func (*AppMeshTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{16} + return fileDescriptor_e0e705f843545fab, []int{17} } func (m *AppMeshTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -526,7 +554,7 @@ var xxx_messageInfo_AppMeshTrafficRouting proto.InternalMessageInfo func (m *AppMeshVirtualNodeGroup) Reset() { *m = AppMeshVirtualNodeGroup{} } func (*AppMeshVirtualNodeGroup) ProtoMessage() {} func (*AppMeshVirtualNodeGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{17} + return fileDescriptor_e0e705f843545fab, []int{18} } func (m *AppMeshVirtualNodeGroup) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -554,7 +582,7 @@ var xxx_messageInfo_AppMeshVirtualNodeGroup proto.InternalMessageInfo func (m *AppMeshVirtualNodeReference) Reset() { *m = AppMeshVirtualNodeReference{} } func (*AppMeshVirtualNodeReference) ProtoMessage() {} func (*AppMeshVirtualNodeReference) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{18} + return fileDescriptor_e0e705f843545fab, []int{19} } func (m *AppMeshVirtualNodeReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -582,7 +610,7 @@ var xxx_messageInfo_AppMeshVirtualNodeReference proto.InternalMessageInfo func (m *AppMeshVirtualService) Reset() { *m = AppMeshVirtualService{} } func (*AppMeshVirtualService) ProtoMessage() {} func (*AppMeshVirtualService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{19} + return fileDescriptor_e0e705f843545fab, []int{20} } func (m *AppMeshVirtualService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -610,7 +638,7 @@ var xxx_messageInfo_AppMeshVirtualService proto.InternalMessageInfo func (m *Argument) Reset() { *m = Argument{} } func (*Argument) ProtoMessage() {} func (*Argument) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{20} + return fileDescriptor_e0e705f843545fab, []int{21} } func (m *Argument) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -638,7 +666,7 @@ var xxx_messageInfo_Argument proto.InternalMessageInfo func (m *ArgumentValueFrom) Reset() { *m = ArgumentValueFrom{} } func (*ArgumentValueFrom) ProtoMessage() {} func (*ArgumentValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{21} + return fileDescriptor_e0e705f843545fab, []int{22} } func (m *ArgumentValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -666,7 +694,7 @@ var xxx_messageInfo_ArgumentValueFrom proto.InternalMessageInfo func (m *Authentication) Reset() { *m = Authentication{} } func (*Authentication) ProtoMessage() {} func (*Authentication) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{22} + return fileDescriptor_e0e705f843545fab, []int{23} } func (m *Authentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +722,7 @@ var xxx_messageInfo_Authentication proto.InternalMessageInfo func (m *AwsResourceRef) Reset() { *m = AwsResourceRef{} } func (*AwsResourceRef) ProtoMessage() {} func (*AwsResourceRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{23} + return fileDescriptor_e0e705f843545fab, []int{24} } func (m *AwsResourceRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -722,7 +750,7 @@ var xxx_messageInfo_AwsResourceRef proto.InternalMessageInfo func (m *BlueGreenStatus) Reset() { *m = BlueGreenStatus{} } func (*BlueGreenStatus) ProtoMessage() {} func (*BlueGreenStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{24} + return fileDescriptor_e0e705f843545fab, []int{25} } func (m *BlueGreenStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -750,7 +778,7 @@ var xxx_messageInfo_BlueGreenStatus proto.InternalMessageInfo func (m *BlueGreenStrategy) Reset() { *m = BlueGreenStrategy{} } func (*BlueGreenStrategy) ProtoMessage() {} func (*BlueGreenStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{25} + return fileDescriptor_e0e705f843545fab, []int{26} } func (m *BlueGreenStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -778,7 +806,7 @@ var xxx_messageInfo_BlueGreenStrategy proto.InternalMessageInfo func (m *CanaryStatus) Reset() { *m = CanaryStatus{} } func (*CanaryStatus) ProtoMessage() {} func (*CanaryStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{26} + return fileDescriptor_e0e705f843545fab, []int{27} } func (m *CanaryStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +834,7 @@ var xxx_messageInfo_CanaryStatus proto.InternalMessageInfo func (m *CanaryStep) Reset() { *m = CanaryStep{} } func (*CanaryStep) ProtoMessage() {} func (*CanaryStep) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{27} + return fileDescriptor_e0e705f843545fab, []int{28} } func (m *CanaryStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -834,7 +862,7 @@ var xxx_messageInfo_CanaryStep proto.InternalMessageInfo func (m *CanaryStrategy) Reset() { *m = CanaryStrategy{} } func (*CanaryStrategy) ProtoMessage() {} func (*CanaryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{28} + return fileDescriptor_e0e705f843545fab, []int{29} } func (m *CanaryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -862,7 +890,7 @@ var xxx_messageInfo_CanaryStrategy proto.InternalMessageInfo func (m *CloudWatchMetric) Reset() { *m = CloudWatchMetric{} } func (*CloudWatchMetric) ProtoMessage() {} func (*CloudWatchMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{29} + return fileDescriptor_e0e705f843545fab, []int{30} } func (m *CloudWatchMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -890,7 +918,7 @@ var xxx_messageInfo_CloudWatchMetric proto.InternalMessageInfo func (m *CloudWatchMetricDataQuery) Reset() { *m = CloudWatchMetricDataQuery{} } func (*CloudWatchMetricDataQuery) ProtoMessage() {} func (*CloudWatchMetricDataQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{30} + return fileDescriptor_e0e705f843545fab, []int{31} } func (m *CloudWatchMetricDataQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -918,7 +946,7 @@ var xxx_messageInfo_CloudWatchMetricDataQuery proto.InternalMessageInfo func (m *CloudWatchMetricStat) Reset() { *m = CloudWatchMetricStat{} } func (*CloudWatchMetricStat) ProtoMessage() {} func (*CloudWatchMetricStat) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{31} + return fileDescriptor_e0e705f843545fab, []int{32} } func (m *CloudWatchMetricStat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -946,7 +974,7 @@ var xxx_messageInfo_CloudWatchMetricStat proto.InternalMessageInfo func (m *CloudWatchMetricStatMetric) Reset() { *m = CloudWatchMetricStatMetric{} } func (*CloudWatchMetricStatMetric) ProtoMessage() {} func (*CloudWatchMetricStatMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{32} + return fileDescriptor_e0e705f843545fab, []int{33} } func (m *CloudWatchMetricStatMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -974,7 +1002,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetric proto.InternalMessageInfo func (m *CloudWatchMetricStatMetricDimension) Reset() { *m = CloudWatchMetricStatMetricDimension{} } func (*CloudWatchMetricStatMetricDimension) ProtoMessage() {} func (*CloudWatchMetricStatMetricDimension) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{33} + return fileDescriptor_e0e705f843545fab, []int{34} } func (m *CloudWatchMetricStatMetricDimension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1002,7 +1030,7 @@ var xxx_messageInfo_CloudWatchMetricStatMetricDimension proto.InternalMessageInf func (m *ClusterAnalysisTemplate) Reset() { *m = ClusterAnalysisTemplate{} } func (*ClusterAnalysisTemplate) ProtoMessage() {} func (*ClusterAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{34} + return fileDescriptor_e0e705f843545fab, []int{35} } func (m *ClusterAnalysisTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1030,7 +1058,7 @@ var xxx_messageInfo_ClusterAnalysisTemplate proto.InternalMessageInfo func (m *ClusterAnalysisTemplateList) Reset() { *m = ClusterAnalysisTemplateList{} } func (*ClusterAnalysisTemplateList) ProtoMessage() {} func (*ClusterAnalysisTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{35} + return fileDescriptor_e0e705f843545fab, []int{36} } func (m *ClusterAnalysisTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1058,7 +1086,7 @@ var xxx_messageInfo_ClusterAnalysisTemplateList proto.InternalMessageInfo func (m *DatadogMetric) Reset() { *m = DatadogMetric{} } func (*DatadogMetric) ProtoMessage() {} func (*DatadogMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{36} + return fileDescriptor_e0e705f843545fab, []int{37} } func (m *DatadogMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1086,7 +1114,7 @@ var xxx_messageInfo_DatadogMetric proto.InternalMessageInfo func (m *DryRun) Reset() { *m = DryRun{} } func (*DryRun) ProtoMessage() {} func (*DryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{37} + return fileDescriptor_e0e705f843545fab, []int{38} } func (m *DryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1114,7 +1142,7 @@ var xxx_messageInfo_DryRun proto.InternalMessageInfo func (m *Experiment) Reset() { *m = Experiment{} } func (*Experiment) ProtoMessage() {} func (*Experiment) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{38} + return fileDescriptor_e0e705f843545fab, []int{39} } func (m *Experiment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1142,7 +1170,7 @@ var xxx_messageInfo_Experiment proto.InternalMessageInfo func (m *ExperimentAnalysisRunStatus) Reset() { *m = ExperimentAnalysisRunStatus{} } func (*ExperimentAnalysisRunStatus) ProtoMessage() {} func (*ExperimentAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{39} + return fileDescriptor_e0e705f843545fab, []int{40} } func (m *ExperimentAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1170,7 +1198,7 @@ var xxx_messageInfo_ExperimentAnalysisRunStatus proto.InternalMessageInfo func (m *ExperimentAnalysisTemplateRef) Reset() { *m = ExperimentAnalysisTemplateRef{} } func (*ExperimentAnalysisTemplateRef) ProtoMessage() {} func (*ExperimentAnalysisTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{40} + return fileDescriptor_e0e705f843545fab, []int{41} } func (m *ExperimentAnalysisTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1198,7 +1226,7 @@ var xxx_messageInfo_ExperimentAnalysisTemplateRef proto.InternalMessageInfo func (m *ExperimentCondition) Reset() { *m = ExperimentCondition{} } func (*ExperimentCondition) ProtoMessage() {} func (*ExperimentCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{41} + return fileDescriptor_e0e705f843545fab, []int{42} } func (m *ExperimentCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1226,7 +1254,7 @@ var xxx_messageInfo_ExperimentCondition proto.InternalMessageInfo func (m *ExperimentList) Reset() { *m = ExperimentList{} } func (*ExperimentList) ProtoMessage() {} func (*ExperimentList) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{42} + return fileDescriptor_e0e705f843545fab, []int{43} } func (m *ExperimentList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1254,7 +1282,7 @@ var xxx_messageInfo_ExperimentList proto.InternalMessageInfo func (m *ExperimentSpec) Reset() { *m = ExperimentSpec{} } func (*ExperimentSpec) ProtoMessage() {} func (*ExperimentSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{43} + return fileDescriptor_e0e705f843545fab, []int{44} } func (m *ExperimentSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +1310,7 @@ var xxx_messageInfo_ExperimentSpec proto.InternalMessageInfo func (m *ExperimentStatus) Reset() { *m = ExperimentStatus{} } func (*ExperimentStatus) ProtoMessage() {} func (*ExperimentStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{44} + return fileDescriptor_e0e705f843545fab, []int{45} } func (m *ExperimentStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1310,7 +1338,7 @@ var xxx_messageInfo_ExperimentStatus proto.InternalMessageInfo func (m *FieldRef) Reset() { *m = FieldRef{} } func (*FieldRef) ProtoMessage() {} func (*FieldRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{45} + return fileDescriptor_e0e705f843545fab, []int{46} } func (m *FieldRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1338,7 +1366,7 @@ var xxx_messageInfo_FieldRef proto.InternalMessageInfo func (m *GraphiteMetric) Reset() { *m = GraphiteMetric{} } func (*GraphiteMetric) ProtoMessage() {} func (*GraphiteMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{46} + return fileDescriptor_e0e705f843545fab, []int{47} } func (m *GraphiteMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1394,7 @@ var xxx_messageInfo_GraphiteMetric proto.InternalMessageInfo func (m *HeaderRoutingMatch) Reset() { *m = HeaderRoutingMatch{} } func (*HeaderRoutingMatch) ProtoMessage() {} func (*HeaderRoutingMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{47} + return fileDescriptor_e0e705f843545fab, []int{48} } func (m *HeaderRoutingMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1394,7 +1422,7 @@ var xxx_messageInfo_HeaderRoutingMatch proto.InternalMessageInfo func (m *InfluxdbMetric) Reset() { *m = InfluxdbMetric{} } func (*InfluxdbMetric) ProtoMessage() {} func (*InfluxdbMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{48} + return fileDescriptor_e0e705f843545fab, []int{49} } func (m *InfluxdbMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1422,7 +1450,7 @@ var xxx_messageInfo_InfluxdbMetric proto.InternalMessageInfo func (m *IstioDestinationRule) Reset() { *m = IstioDestinationRule{} } func (*IstioDestinationRule) ProtoMessage() {} func (*IstioDestinationRule) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{49} + return fileDescriptor_e0e705f843545fab, []int{50} } func (m *IstioDestinationRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1450,7 +1478,7 @@ var xxx_messageInfo_IstioDestinationRule proto.InternalMessageInfo func (m *IstioTrafficRouting) Reset() { *m = IstioTrafficRouting{} } func (*IstioTrafficRouting) ProtoMessage() {} func (*IstioTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{50} + return fileDescriptor_e0e705f843545fab, []int{51} } func (m *IstioTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1478,7 +1506,7 @@ var xxx_messageInfo_IstioTrafficRouting proto.InternalMessageInfo func (m *IstioVirtualService) Reset() { *m = IstioVirtualService{} } func (*IstioVirtualService) ProtoMessage() {} func (*IstioVirtualService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{51} + return fileDescriptor_e0e705f843545fab, []int{52} } func (m *IstioVirtualService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1506,7 +1534,7 @@ var xxx_messageInfo_IstioVirtualService proto.InternalMessageInfo func (m *JobMetric) Reset() { *m = JobMetric{} } func (*JobMetric) ProtoMessage() {} func (*JobMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{52} + return fileDescriptor_e0e705f843545fab, []int{53} } func (m *JobMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1534,7 +1562,7 @@ var xxx_messageInfo_JobMetric proto.InternalMessageInfo func (m *KayentaMetric) Reset() { *m = KayentaMetric{} } func (*KayentaMetric) ProtoMessage() {} func (*KayentaMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{53} + return fileDescriptor_e0e705f843545fab, []int{54} } func (m *KayentaMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1562,7 +1590,7 @@ var xxx_messageInfo_KayentaMetric proto.InternalMessageInfo func (m *KayentaScope) Reset() { *m = KayentaScope{} } func (*KayentaScope) ProtoMessage() {} func (*KayentaScope) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{54} + return fileDescriptor_e0e705f843545fab, []int{55} } func (m *KayentaScope) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1590,7 +1618,7 @@ var xxx_messageInfo_KayentaScope proto.InternalMessageInfo func (m *KayentaThreshold) Reset() { *m = KayentaThreshold{} } func (*KayentaThreshold) ProtoMessage() {} func (*KayentaThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{55} + return fileDescriptor_e0e705f843545fab, []int{56} } func (m *KayentaThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1618,7 +1646,7 @@ var xxx_messageInfo_KayentaThreshold proto.InternalMessageInfo func (m *MangedRoutes) Reset() { *m = MangedRoutes{} } func (*MangedRoutes) ProtoMessage() {} func (*MangedRoutes) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{56} + return fileDescriptor_e0e705f843545fab, []int{57} } func (m *MangedRoutes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1674,7 @@ var xxx_messageInfo_MangedRoutes proto.InternalMessageInfo func (m *Measurement) Reset() { *m = Measurement{} } func (*Measurement) ProtoMessage() {} func (*Measurement) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{57} + return fileDescriptor_e0e705f843545fab, []int{58} } func (m *Measurement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1674,7 +1702,7 @@ var xxx_messageInfo_Measurement proto.InternalMessageInfo func (m *MeasurementRetention) Reset() { *m = MeasurementRetention{} } func (*MeasurementRetention) ProtoMessage() {} func (*MeasurementRetention) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{58} + return fileDescriptor_e0e705f843545fab, []int{59} } func (m *MeasurementRetention) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1730,7 @@ var xxx_messageInfo_MeasurementRetention proto.InternalMessageInfo func (m *Metric) Reset() { *m = Metric{} } func (*Metric) ProtoMessage() {} func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{59} + return fileDescriptor_e0e705f843545fab, []int{60} } func (m *Metric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1730,7 +1758,7 @@ var xxx_messageInfo_Metric proto.InternalMessageInfo func (m *MetricProvider) Reset() { *m = MetricProvider{} } func (*MetricProvider) ProtoMessage() {} func (*MetricProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{60} + return fileDescriptor_e0e705f843545fab, []int{61} } func (m *MetricProvider) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1758,7 +1786,7 @@ var xxx_messageInfo_MetricProvider proto.InternalMessageInfo func (m *MetricResult) Reset() { *m = MetricResult{} } func (*MetricResult) ProtoMessage() {} func (*MetricResult) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{61} + return fileDescriptor_e0e705f843545fab, []int{62} } func (m *MetricResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1786,7 +1814,7 @@ var xxx_messageInfo_MetricResult proto.InternalMessageInfo func (m *NewRelicMetric) Reset() { *m = NewRelicMetric{} } func (*NewRelicMetric) ProtoMessage() {} func (*NewRelicMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{62} + return fileDescriptor_e0e705f843545fab, []int{63} } func (m *NewRelicMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1814,7 +1842,7 @@ var xxx_messageInfo_NewRelicMetric proto.InternalMessageInfo func (m *NginxTrafficRouting) Reset() { *m = NginxTrafficRouting{} } func (*NginxTrafficRouting) ProtoMessage() {} func (*NginxTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{63} + return fileDescriptor_e0e705f843545fab, []int{64} } func (m *NginxTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1842,7 +1870,7 @@ var xxx_messageInfo_NginxTrafficRouting proto.InternalMessageInfo func (m *OAuth2Config) Reset() { *m = OAuth2Config{} } func (*OAuth2Config) ProtoMessage() {} func (*OAuth2Config) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{64} + return fileDescriptor_e0e705f843545fab, []int{65} } func (m *OAuth2Config) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1870,7 +1898,7 @@ var xxx_messageInfo_OAuth2Config proto.InternalMessageInfo func (m *ObjectRef) Reset() { *m = ObjectRef{} } func (*ObjectRef) ProtoMessage() {} func (*ObjectRef) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{65} + return fileDescriptor_e0e705f843545fab, []int{66} } func (m *ObjectRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1898,7 +1926,7 @@ var xxx_messageInfo_ObjectRef proto.InternalMessageInfo func (m *PauseCondition) Reset() { *m = PauseCondition{} } func (*PauseCondition) ProtoMessage() {} func (*PauseCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{66} + return fileDescriptor_e0e705f843545fab, []int{67} } func (m *PauseCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1926,7 +1954,7 @@ var xxx_messageInfo_PauseCondition proto.InternalMessageInfo func (m *PingPongSpec) Reset() { *m = PingPongSpec{} } func (*PingPongSpec) ProtoMessage() {} func (*PingPongSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{67} + return fileDescriptor_e0e705f843545fab, []int{68} } func (m *PingPongSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1954,7 +1982,7 @@ var xxx_messageInfo_PingPongSpec proto.InternalMessageInfo func (m *PodTemplateMetadata) Reset() { *m = PodTemplateMetadata{} } func (*PodTemplateMetadata) ProtoMessage() {} func (*PodTemplateMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{68} + return fileDescriptor_e0e705f843545fab, []int{69} } func (m *PodTemplateMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1984,7 +2012,7 @@ func (m *PreferredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*PreferredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*PreferredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{69} + return fileDescriptor_e0e705f843545fab, []int{70} } func (m *PreferredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2012,7 +2040,7 @@ var xxx_messageInfo_PreferredDuringSchedulingIgnoredDuringExecution proto.Intern func (m *PrometheusMetric) Reset() { *m = PrometheusMetric{} } func (*PrometheusMetric) ProtoMessage() {} func (*PrometheusMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{70} + return fileDescriptor_e0e705f843545fab, []int{71} } func (m *PrometheusMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2042,7 +2070,7 @@ func (m *RequiredDuringSchedulingIgnoredDuringExecution) Reset() { } func (*RequiredDuringSchedulingIgnoredDuringExecution) ProtoMessage() {} func (*RequiredDuringSchedulingIgnoredDuringExecution) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{71} + return fileDescriptor_e0e705f843545fab, []int{72} } func (m *RequiredDuringSchedulingIgnoredDuringExecution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2070,7 +2098,7 @@ var xxx_messageInfo_RequiredDuringSchedulingIgnoredDuringExecution proto.Interna func (m *RollbackWindowSpec) Reset() { *m = RollbackWindowSpec{} } func (*RollbackWindowSpec) ProtoMessage() {} func (*RollbackWindowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{72} + return fileDescriptor_e0e705f843545fab, []int{73} } func (m *RollbackWindowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2098,7 +2126,7 @@ var xxx_messageInfo_RollbackWindowSpec proto.InternalMessageInfo func (m *Rollout) Reset() { *m = Rollout{} } func (*Rollout) ProtoMessage() {} func (*Rollout) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{73} + return fileDescriptor_e0e705f843545fab, []int{74} } func (m *Rollout) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2126,7 +2154,7 @@ var xxx_messageInfo_Rollout proto.InternalMessageInfo func (m *RolloutAnalysis) Reset() { *m = RolloutAnalysis{} } func (*RolloutAnalysis) ProtoMessage() {} func (*RolloutAnalysis) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{74} + return fileDescriptor_e0e705f843545fab, []int{75} } func (m *RolloutAnalysis) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2154,7 +2182,7 @@ var xxx_messageInfo_RolloutAnalysis proto.InternalMessageInfo func (m *RolloutAnalysisBackground) Reset() { *m = RolloutAnalysisBackground{} } func (*RolloutAnalysisBackground) ProtoMessage() {} func (*RolloutAnalysisBackground) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{75} + return fileDescriptor_e0e705f843545fab, []int{76} } func (m *RolloutAnalysisBackground) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2182,7 +2210,7 @@ var xxx_messageInfo_RolloutAnalysisBackground proto.InternalMessageInfo func (m *RolloutAnalysisRunStatus) Reset() { *m = RolloutAnalysisRunStatus{} } func (*RolloutAnalysisRunStatus) ProtoMessage() {} func (*RolloutAnalysisRunStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{76} + return fileDescriptor_e0e705f843545fab, []int{77} } func (m *RolloutAnalysisRunStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2207,34 +2235,6 @@ func (m *RolloutAnalysisRunStatus) XXX_DiscardUnknown() { var xxx_messageInfo_RolloutAnalysisRunStatus proto.InternalMessageInfo -func (m *RolloutAnalysisTemplate) Reset() { *m = RolloutAnalysisTemplate{} } -func (*RolloutAnalysisTemplate) ProtoMessage() {} -func (*RolloutAnalysisTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{77} -} -func (m *RolloutAnalysisTemplate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RolloutAnalysisTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *RolloutAnalysisTemplate) XXX_Merge(src proto.Message) { - xxx_messageInfo_RolloutAnalysisTemplate.Merge(m, src) -} -func (m *RolloutAnalysisTemplate) XXX_Size() int { - return m.Size() -} -func (m *RolloutAnalysisTemplate) XXX_DiscardUnknown() { - xxx_messageInfo_RolloutAnalysisTemplate.DiscardUnknown(m) -} - -var xxx_messageInfo_RolloutAnalysisTemplate proto.InternalMessageInfo - func (m *RolloutCondition) Reset() { *m = RolloutCondition{} } func (*RolloutCondition) ProtoMessage() {} func (*RolloutCondition) Descriptor() ([]byte, []int) { @@ -3232,6 +3232,7 @@ func init() { proto.RegisterType((*AnalysisRunStrategy)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisRunStrategy") proto.RegisterType((*AnalysisTemplate)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplate") proto.RegisterType((*AnalysisTemplateList)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplateList") + proto.RegisterType((*AnalysisTemplateRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplateRef") proto.RegisterType((*AnalysisTemplateSpec)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AnalysisTemplateSpec") proto.RegisterType((*AntiAffinity)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.AntiAffinity") proto.RegisterType((*ApisixRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ApisixRoute") @@ -3304,7 +3305,6 @@ func init() { proto.RegisterType((*RolloutAnalysis)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysis") proto.RegisterType((*RolloutAnalysisBackground)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisBackground") proto.RegisterType((*RolloutAnalysisRunStatus)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisRunStatus") - proto.RegisterType((*RolloutAnalysisTemplate)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutAnalysisTemplate") proto.RegisterType((*RolloutCondition)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutCondition") proto.RegisterType((*RolloutExperimentStep)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutExperimentStep") proto.RegisterType((*RolloutExperimentStepAnalysisTemplateRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.RolloutExperimentStepAnalysisTemplateRef") @@ -3349,543 +3349,543 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8566 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xd9, - 0x71, 0x98, 0x9a, 0xc3, 0x21, 0x39, 0x35, 0x5c, 0x92, 0xfb, 0x76, 0xf7, 0x8e, 0xc7, 0xbb, 0xdd, - 0x59, 0xf5, 0x39, 0x97, 0x3d, 0xeb, 0x44, 0x4a, 0x7b, 0x77, 0xc9, 0x49, 0xa7, 0x5c, 0x32, 0x43, - 0xee, 0xde, 0x72, 0x8f, 0xdc, 0xe5, 0xd5, 0x70, 0x6f, 0x6d, 0x49, 0x67, 0xab, 0x39, 0xf3, 0x38, - 0xec, 0xe5, 0x4c, 0xf7, 0xa8, 0xbb, 0x87, 0xbb, 0x3c, 0x1d, 0xac, 0x93, 0x84, 0x53, 0x14, 0x41, - 0x82, 0x95, 0xd8, 0x42, 0x10, 0x24, 0x08, 0x14, 0xc3, 0x80, 0x93, 0xd8, 0x3f, 0x02, 0xc3, 0x41, - 0xf2, 0xc3, 0x40, 0x8c, 0x38, 0x76, 0x14, 0x20, 0x0e, 0xe4, 0x1f, 0x89, 0x9c, 0x00, 0xa6, 0x23, - 0x3a, 0x7f, 0x62, 0x24, 0x10, 0x12, 0x28, 0x30, 0xb2, 0x3f, 0x82, 0xe0, 0x7d, 0xf6, 0xeb, 0x9e, - 0x1e, 0xee, 0x90, 0xd3, 0x5c, 0x9d, 0x13, 0xff, 0x9b, 0x79, 0x55, 0xaf, 0xaa, 0xfa, 0x7d, 0xd6, - 0xab, 0x57, 0x55, 0x0f, 0xd6, 0x5a, 0x6e, 0xb4, 0xd3, 0xdb, 0x5a, 0x6c, 0xf8, 0x9d, 0x25, 0x27, - 0x68, 0xf9, 0xdd, 0xc0, 0xbf, 0xc7, 0x7f, 0x7c, 0x34, 0xf0, 0xdb, 0x6d, 0xbf, 0x17, 0x85, 0x4b, - 0xdd, 0xdd, 0xd6, 0x92, 0xd3, 0x75, 0xc3, 0x25, 0x5d, 0xb2, 0xf7, 0x71, 0xa7, 0xdd, 0xdd, 0x71, - 0x3e, 0xbe, 0xd4, 0xa2, 0x1e, 0x0d, 0x9c, 0x88, 0x36, 0x17, 0xbb, 0x81, 0x1f, 0xf9, 0xe4, 0x53, - 0x31, 0xb5, 0x45, 0x45, 0x8d, 0xff, 0xf8, 0x59, 0x55, 0x77, 0xb1, 0xbb, 0xdb, 0x5a, 0x64, 0xd4, - 0x16, 0x75, 0x89, 0xa2, 0xb6, 0xf0, 0x51, 0x43, 0x96, 0x96, 0xdf, 0xf2, 0x97, 0x38, 0xd1, 0xad, - 0xde, 0x36, 0xff, 0xc7, 0xff, 0xf0, 0x5f, 0x82, 0xd9, 0xc2, 0xb3, 0xbb, 0xaf, 0x84, 0x8b, 0xae, - 0xcf, 0x64, 0x5b, 0xda, 0x72, 0xa2, 0xc6, 0xce, 0xd2, 0x5e, 0x9f, 0x44, 0x0b, 0xb6, 0x81, 0xd4, - 0xf0, 0x03, 0x9a, 0x85, 0xf3, 0x52, 0x8c, 0xd3, 0x71, 0x1a, 0x3b, 0xae, 0x47, 0x83, 0xfd, 0xf8, - 0xab, 0x3b, 0x34, 0x72, 0xb2, 0x6a, 0x2d, 0x0d, 0xaa, 0x15, 0xf4, 0xbc, 0xc8, 0xed, 0xd0, 0xbe, - 0x0a, 0x7f, 0xe9, 0x51, 0x15, 0xc2, 0xc6, 0x0e, 0xed, 0x38, 0x7d, 0xf5, 0x5e, 0x1c, 0x54, 0xaf, - 0x17, 0xb9, 0xed, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0x7f, 0x58, 0x80, 0x52, 0x75, - 0xad, 0x56, 0x8f, 0x9c, 0xa8, 0x17, 0x92, 0xaf, 0x5a, 0x30, 0xdd, 0xf6, 0x9d, 0x66, 0xcd, 0x69, - 0x3b, 0x5e, 0x83, 0x06, 0xf3, 0xd6, 0x65, 0xeb, 0x4a, 0xf9, 0xea, 0xda, 0xe2, 0x28, 0xfd, 0xb5, - 0x58, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0xb7, 0x6b, 0xe7, 0xbf, 0x7b, 0x50, - 0xf9, 0xd0, 0xe1, 0x41, 0x65, 0x7a, 0xcd, 0xe0, 0x84, 0x09, 0xbe, 0xe4, 0xdb, 0x16, 0x9c, 0x6d, - 0x38, 0x9e, 0x13, 0xec, 0x6f, 0x3a, 0x41, 0x8b, 0x46, 0xaf, 0x07, 0x7e, 0xaf, 0x3b, 0x3f, 0x76, - 0x0a, 0xd2, 0x3c, 0x25, 0xa5, 0x39, 0xbb, 0x9c, 0x66, 0x87, 0xfd, 0x12, 0x70, 0xb9, 0xc2, 0xc8, - 0xd9, 0x6a, 0x53, 0x53, 0xae, 0xc2, 0x69, 0xca, 0x55, 0x4f, 0xb3, 0xc3, 0x7e, 0x09, 0xc8, 0xf3, - 0x30, 0xe9, 0x7a, 0xad, 0x80, 0x86, 0xe1, 0xfc, 0xf8, 0x65, 0xeb, 0x4a, 0xa9, 0x36, 0x2b, 0xab, - 0x4f, 0xae, 0x8a, 0x62, 0x54, 0x70, 0xfb, 0xd7, 0x0b, 0x70, 0xb6, 0xba, 0x56, 0xdb, 0x0c, 0x9c, - 0xed, 0x6d, 0xb7, 0x81, 0x7e, 0x2f, 0x72, 0xbd, 0x96, 0x49, 0xc0, 0x3a, 0x9a, 0x00, 0x79, 0x19, - 0xca, 0x21, 0x0d, 0xf6, 0xdc, 0x06, 0xdd, 0xf0, 0x83, 0x88, 0x77, 0x4a, 0xb1, 0x76, 0x4e, 0xa2, - 0x97, 0xeb, 0x31, 0x08, 0x4d, 0x3c, 0x56, 0x2d, 0xf0, 0xfd, 0x48, 0xc2, 0x79, 0x9b, 0x95, 0xe2, - 0x6a, 0x18, 0x83, 0xd0, 0xc4, 0x23, 0x2b, 0x30, 0xe7, 0x78, 0x9e, 0x1f, 0x39, 0x91, 0xeb, 0x7b, - 0x1b, 0x01, 0xdd, 0x76, 0x1f, 0xc8, 0x4f, 0x9c, 0x97, 0x75, 0xe7, 0xaa, 0x29, 0x38, 0xf6, 0xd5, - 0x20, 0xdf, 0xb2, 0x60, 0x2e, 0x8c, 0xdc, 0xc6, 0xae, 0xeb, 0xd1, 0x30, 0x5c, 0xf6, 0xbd, 0x6d, - 0xb7, 0x35, 0x5f, 0xe4, 0xdd, 0x76, 0x6b, 0xb4, 0x6e, 0xab, 0xa7, 0xa8, 0xd6, 0xce, 0x33, 0x91, - 0xd2, 0xa5, 0xd8, 0xc7, 0x9d, 0x7c, 0x04, 0x4a, 0xb2, 0x45, 0x69, 0x38, 0x3f, 0x71, 0xb9, 0x70, - 0xa5, 0x54, 0x3b, 0x73, 0x78, 0x50, 0x29, 0xad, 0xaa, 0x42, 0x8c, 0xe1, 0xf6, 0x0a, 0xcc, 0x57, - 0x3b, 0x5b, 0x4e, 0x18, 0x3a, 0x4d, 0x3f, 0x48, 0x75, 0xdd, 0x15, 0x98, 0xea, 0x38, 0xdd, 0xae, - 0xeb, 0xb5, 0x58, 0xdf, 0x31, 0x3a, 0xd3, 0x87, 0x07, 0x95, 0xa9, 0x75, 0x59, 0x86, 0x1a, 0x6a, - 0xff, 0xc7, 0x31, 0x28, 0x57, 0x3d, 0xa7, 0xbd, 0x1f, 0xba, 0x21, 0xf6, 0x3c, 0xf2, 0x39, 0x98, - 0x62, 0xab, 0x56, 0xd3, 0x89, 0x1c, 0x39, 0xd3, 0x3f, 0xb6, 0x28, 0x16, 0x91, 0x45, 0x73, 0x11, - 0x89, 0x3f, 0x9f, 0x61, 0x2f, 0xee, 0x7d, 0x7c, 0xf1, 0xf6, 0xd6, 0x3d, 0xda, 0x88, 0xd6, 0x69, - 0xe4, 0xd4, 0x88, 0xec, 0x05, 0x88, 0xcb, 0x50, 0x53, 0x25, 0x3e, 0x8c, 0x87, 0x5d, 0xda, 0x90, - 0x33, 0x77, 0x7d, 0xc4, 0x19, 0x12, 0x8b, 0x5e, 0xef, 0xd2, 0x46, 0x6d, 0x5a, 0xb2, 0x1e, 0x67, - 0xff, 0x90, 0x33, 0x22, 0xf7, 0x61, 0x22, 0xe4, 0x6b, 0x99, 0x9c, 0x94, 0xb7, 0xf3, 0x63, 0xc9, - 0xc9, 0xd6, 0x66, 0x24, 0xd3, 0x09, 0xf1, 0x1f, 0x25, 0x3b, 0xfb, 0x3f, 0x59, 0x70, 0xce, 0xc0, - 0xae, 0x06, 0xad, 0x5e, 0x87, 0x7a, 0x11, 0xb9, 0x0c, 0xe3, 0x9e, 0xd3, 0xa1, 0x72, 0x56, 0x69, - 0x91, 0x6f, 0x39, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x85, 0xe2, 0x9e, 0xd3, 0xee, 0x51, 0xde, 0x48, - 0xa5, 0xda, 0x19, 0x89, 0x52, 0x7c, 0x8b, 0x15, 0xa2, 0x80, 0x91, 0x77, 0xa1, 0xc4, 0x7f, 0x5c, - 0x0f, 0xfc, 0x4e, 0x4e, 0x9f, 0x26, 0x25, 0x7c, 0x4b, 0x91, 0x15, 0xc3, 0x4f, 0xff, 0xc5, 0x98, - 0xa1, 0xfd, 0x47, 0x16, 0xcc, 0x1a, 0x1f, 0xb7, 0xe6, 0x86, 0x11, 0xf9, 0x6c, 0xdf, 0xe0, 0x59, - 0x1c, 0x6e, 0xf0, 0xb0, 0xda, 0x7c, 0xe8, 0xcc, 0xc9, 0x2f, 0x9d, 0x52, 0x25, 0xc6, 0xc0, 0xf1, - 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8f, 0x5d, 0x2e, 0x5c, 0x29, 0x5f, 0x5d, 0xcd, 0xad, 0x1b, - 0xe3, 0xf6, 0x5d, 0x65, 0xf4, 0x51, 0xb0, 0xb1, 0x7f, 0xa3, 0x90, 0xe8, 0xbe, 0x75, 0x25, 0xc7, - 0xfb, 0x16, 0x4c, 0xb4, 0x9d, 0x2d, 0xda, 0x16, 0x73, 0xab, 0x7c, 0xf5, 0xed, 0xdc, 0x24, 0x51, - 0x3c, 0x16, 0xd7, 0x38, 0xfd, 0x6b, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, - 0xfe, 0x8e, 0x05, 0xe5, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x95, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, - 0xd2, 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0x85, 0x4f, 0x40, 0xd9, 0xf8, 0x04, 0x32, 0x07, 0x85, - 0x5d, 0xba, 0x2f, 0x06, 0x3c, 0xb2, 0x9f, 0xe4, 0x7c, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0xc9, 0xb1, - 0x57, 0xac, 0x85, 0xd7, 0x60, 0x2e, 0xcd, 0xf0, 0x38, 0xf5, 0xed, 0x7f, 0x52, 0x4c, 0x0c, 0x4c, - 0xb6, 0x10, 0x10, 0x1f, 0x26, 0x3b, 0x34, 0x0a, 0xdc, 0x86, 0xea, 0xb2, 0x95, 0xd1, 0x5a, 0x69, - 0x9d, 0x13, 0x8b, 0x37, 0x44, 0xf1, 0x3f, 0x44, 0xc5, 0x85, 0xec, 0xc0, 0xb8, 0x13, 0xb4, 0x54, - 0x9f, 0x5c, 0xcf, 0x67, 0x5a, 0xc6, 0x4b, 0x45, 0x35, 0x68, 0x85, 0xc8, 0x39, 0x90, 0x25, 0x28, - 0x45, 0x34, 0xe8, 0xb8, 0x9e, 0x13, 0x89, 0x1d, 0x74, 0xaa, 0x76, 0x56, 0xa2, 0x95, 0x36, 0x15, - 0x00, 0x63, 0x1c, 0xd2, 0x86, 0x89, 0x66, 0xb0, 0x8f, 0x3d, 0x6f, 0x7e, 0x3c, 0x8f, 0xa6, 0x58, - 0xe1, 0xb4, 0xe2, 0x41, 0x2a, 0xfe, 0xa3, 0xe4, 0x41, 0x7e, 0xd9, 0x82, 0xf3, 0x1d, 0xea, 0x84, - 0xbd, 0x80, 0xb2, 0x4f, 0x40, 0x1a, 0x51, 0x8f, 0x75, 0xec, 0x7c, 0x91, 0x33, 0xc7, 0x51, 0xfb, - 0xa1, 0x9f, 0x72, 0xed, 0x19, 0x29, 0xca, 0xf9, 0x2c, 0x28, 0x66, 0x4a, 0x43, 0xde, 0x85, 0x72, - 0x14, 0xb5, 0xeb, 0x11, 0xd3, 0x83, 0x5b, 0xfb, 0xf3, 0x13, 0x7c, 0xf1, 0x1a, 0x71, 0x85, 0xd9, - 0xdc, 0x5c, 0x53, 0x04, 0x6b, 0xb3, 0x6c, 0xb6, 0x18, 0x05, 0x68, 0xb2, 0xb3, 0xff, 0x79, 0x11, - 0xce, 0xf6, 0x6d, 0x2b, 0xe4, 0x25, 0x28, 0x76, 0x77, 0x9c, 0x50, 0xed, 0x13, 0x97, 0xd4, 0x22, - 0xb5, 0xc1, 0x0a, 0x1f, 0x1e, 0x54, 0xce, 0xa8, 0x2a, 0xbc, 0x00, 0x05, 0x32, 0xd3, 0xda, 0x3a, - 0x34, 0x0c, 0x9d, 0x96, 0xda, 0x3c, 0x8c, 0x41, 0xca, 0x8b, 0x51, 0xc1, 0xc9, 0x5f, 0xb7, 0xe0, - 0x8c, 0x18, 0xb0, 0x48, 0xc3, 0x5e, 0x3b, 0x62, 0x1b, 0x24, 0xeb, 0x94, 0x9b, 0x79, 0x4c, 0x0e, - 0x41, 0xb2, 0x76, 0x41, 0x72, 0x3f, 0x63, 0x96, 0x86, 0x98, 0xe4, 0x4b, 0xee, 0x42, 0x29, 0x8c, - 0x9c, 0x20, 0xa2, 0xcd, 0x6a, 0xc4, 0x55, 0xb9, 0xf2, 0xd5, 0x9f, 0x1c, 0x6e, 0xe7, 0xd8, 0x74, - 0x3b, 0x54, 0xec, 0x52, 0x75, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x5d, 0x80, 0xa0, 0xe7, 0xd5, 0x7b, - 0x9d, 0x8e, 0x13, 0xec, 0x4b, 0xed, 0xee, 0xc6, 0x68, 0x9f, 0x87, 0x9a, 0x5e, 0xac, 0xe8, 0xc4, - 0x65, 0x68, 0xf0, 0x23, 0x5f, 0xb2, 0xe0, 0x8c, 0x98, 0x07, 0x4a, 0x82, 0x89, 0x9c, 0x25, 0x38, - 0xcb, 0x9a, 0x76, 0xc5, 0x64, 0x81, 0x49, 0x8e, 0xe4, 0x6d, 0x28, 0x37, 0xfc, 0x4e, 0xb7, 0x4d, - 0x45, 0xe3, 0x4e, 0x1e, 0xbb, 0x71, 0xf9, 0xd0, 0x5d, 0x8e, 0x49, 0xa0, 0x49, 0xcf, 0xfe, 0xf7, - 0x49, 0x1d, 0x47, 0x0d, 0x69, 0xf2, 0x19, 0x78, 0x2a, 0xec, 0x35, 0x1a, 0x34, 0x0c, 0xb7, 0x7b, - 0x6d, 0xec, 0x79, 0x37, 0xdc, 0x30, 0xf2, 0x83, 0xfd, 0x35, 0xb7, 0xe3, 0x46, 0x7c, 0x40, 0x17, - 0x6b, 0x17, 0x0f, 0x0f, 0x2a, 0x4f, 0xd5, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0xa7, 0x7b, - 0xde, 0x60, 0xf2, 0xe2, 0xf8, 0x51, 0x39, 0x3c, 0xa8, 0x3c, 0x7d, 0x67, 0x30, 0x1a, 0x1e, 0x45, - 0xc3, 0xfe, 0x13, 0x8b, 0x6d, 0x43, 0xe2, 0xbb, 0x36, 0x69, 0xa7, 0xdb, 0x66, 0x4b, 0xe7, 0xe9, - 0x2b, 0xc7, 0x51, 0x42, 0x39, 0xc6, 0x7c, 0xf6, 0x72, 0x25, 0xff, 0x20, 0x0d, 0xd9, 0xfe, 0xaf, - 0x16, 0x9c, 0x4f, 0x23, 0x3f, 0x06, 0x85, 0x2e, 0x4c, 0x2a, 0x74, 0xb7, 0xf2, 0xfd, 0xda, 0x01, - 0x5a, 0xdd, 0x57, 0xc7, 0xfb, 0xbf, 0xf5, 0xff, 0x75, 0x1d, 0x21, 0xde, 0xf2, 0x0b, 0x3f, 0xce, - 0x2d, 0x7f, 0xfc, 0x83, 0xb4, 0xe5, 0xdb, 0xff, 0x70, 0x1c, 0xa6, 0xab, 0x5e, 0xe4, 0x56, 0xb7, - 0xb7, 0x5d, 0xcf, 0x8d, 0xf6, 0xc9, 0x37, 0xc6, 0x60, 0xa9, 0x1b, 0xd0, 0x6d, 0x1a, 0x04, 0xb4, - 0xb9, 0xd2, 0x0b, 0x5c, 0xaf, 0x55, 0x6f, 0xec, 0xd0, 0x66, 0xaf, 0xed, 0x7a, 0xad, 0xd5, 0x96, - 0xe7, 0xeb, 0xe2, 0x6b, 0x0f, 0x68, 0xa3, 0xc7, 0x3f, 0x49, 0x4c, 0x8a, 0xce, 0x68, 0x9f, 0xb4, - 0x71, 0x3c, 0xa6, 0xb5, 0x17, 0x0f, 0x0f, 0x2a, 0x4b, 0xc7, 0xac, 0x84, 0xc7, 0xfd, 0x34, 0xf2, - 0xb5, 0x31, 0x58, 0x0c, 0xe8, 0xe7, 0x7b, 0xee, 0xf0, 0xad, 0x21, 0x56, 0xad, 0xf6, 0x88, 0xbb, - 0xdb, 0xb1, 0x78, 0xd6, 0xae, 0x1e, 0x1e, 0x54, 0x8e, 0x59, 0x07, 0x8f, 0xf9, 0x5d, 0xf6, 0x06, - 0x94, 0xab, 0x5d, 0x37, 0x74, 0x1f, 0xa0, 0xdf, 0x8b, 0xe8, 0x10, 0xe7, 0xf7, 0x0a, 0x14, 0x83, - 0x5e, 0x9b, 0x8a, 0xb9, 0x5d, 0xaa, 0x95, 0xd8, 0x2a, 0x84, 0xac, 0x00, 0x45, 0xb9, 0xfd, 0x65, - 0xb6, 0xe2, 0x72, 0x92, 0x29, 0xcb, 0xcd, 0x3d, 0x28, 0x06, 0x8c, 0x89, 0x1c, 0x59, 0xa3, 0x1e, - 0x72, 0x63, 0xa9, 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, 0xf6, 0x6f, 0x8f, 0xc1, 0x85, 0x6a, 0xb7, - 0xbb, 0x4e, 0xc3, 0x9d, 0x94, 0x14, 0x3f, 0x6f, 0xc1, 0xcc, 0x9e, 0x1b, 0x44, 0x3d, 0xa7, 0xad, - 0x8c, 0x73, 0x42, 0x9e, 0xfa, 0xa8, 0xf2, 0x70, 0x6e, 0x6f, 0x25, 0x48, 0xd7, 0xc8, 0xe1, 0x41, - 0x65, 0x26, 0x59, 0x86, 0x29, 0xf6, 0xe4, 0x6f, 0x5b, 0x30, 0x27, 0x8b, 0x6e, 0xf9, 0x4d, 0x6a, - 0x1a, 0x7f, 0xef, 0xe4, 0x29, 0x93, 0x26, 0x2e, 0x8c, 0x76, 0xe9, 0x52, 0xec, 0x13, 0xc2, 0xfe, - 0xef, 0x63, 0xf0, 0xe4, 0x00, 0x1a, 0xe4, 0x57, 0x2c, 0x38, 0x2f, 0x2c, 0xc6, 0x06, 0x08, 0xe9, - 0xb6, 0x6c, 0xcd, 0x9f, 0xce, 0x5b, 0x72, 0x64, 0x53, 0x9c, 0x7a, 0x0d, 0x5a, 0x9b, 0x67, 0xab, - 0xe1, 0x72, 0x06, 0x6b, 0xcc, 0x14, 0x88, 0x4b, 0x2a, 0x6c, 0xc8, 0x29, 0x49, 0xc7, 0x1e, 0x8b, - 0xa4, 0xf5, 0x0c, 0xd6, 0x98, 0x29, 0x90, 0xfd, 0x57, 0xe1, 0xe9, 0x23, 0xc8, 0x3d, 0x7a, 0x72, - 0xda, 0x6f, 0xeb, 0x51, 0x9f, 0x1c, 0x73, 0x43, 0xcc, 0x6b, 0x1b, 0x26, 0xf8, 0xd4, 0x51, 0x13, - 0x1b, 0xd8, 0xf6, 0xc7, 0xe7, 0x54, 0x88, 0x12, 0x62, 0xff, 0xb6, 0x05, 0x53, 0xc7, 0x30, 0xf5, - 0x55, 0x92, 0xa6, 0xbe, 0x52, 0x9f, 0x99, 0x2f, 0xea, 0x37, 0xf3, 0xbd, 0x3e, 0x5a, 0x6f, 0x0c, - 0x63, 0xde, 0xfb, 0xa1, 0x05, 0x67, 0xfb, 0xcc, 0x81, 0x64, 0x07, 0xce, 0x77, 0xfd, 0xa6, 0x52, - 0x9b, 0x6e, 0x38, 0xe1, 0x0e, 0x87, 0xc9, 0xcf, 0x7b, 0x89, 0xf5, 0xe4, 0x46, 0x06, 0xfc, 0xe1, - 0x41, 0x65, 0x5e, 0x13, 0x49, 0x21, 0x60, 0x26, 0x45, 0xd2, 0x85, 0xa9, 0x6d, 0x97, 0xb6, 0x9b, - 0xf1, 0x10, 0x1c, 0x51, 0x41, 0xba, 0x2e, 0xa9, 0x09, 0x4b, 0xb8, 0xfa, 0x87, 0x9a, 0x8b, 0xfd, - 0x23, 0x0b, 0x66, 0xaa, 0xbd, 0x68, 0x87, 0xa9, 0x07, 0x0d, 0x6e, 0x7c, 0x22, 0x1e, 0x14, 0x43, - 0xb7, 0xb5, 0xf7, 0x52, 0x3e, 0x8b, 0x71, 0x9d, 0x91, 0x92, 0x37, 0x02, 0x5a, 0x37, 0xe5, 0x85, - 0x28, 0xd8, 0x90, 0x00, 0x26, 0x7c, 0xa7, 0x17, 0xed, 0x5c, 0x95, 0x9f, 0x3c, 0xe2, 0x41, 0xfc, - 0x36, 0xfb, 0x9c, 0xab, 0x92, 0xa3, 0xd6, 0xd6, 0x44, 0x29, 0x4a, 0x4e, 0xf6, 0x17, 0x61, 0x26, - 0x79, 0xcd, 0x34, 0xc4, 0x98, 0xbd, 0x08, 0x05, 0x27, 0xf0, 0xe4, 0x88, 0x2d, 0x4b, 0x84, 0x42, - 0x15, 0x6f, 0x21, 0x2b, 0x27, 0x2f, 0xc0, 0xd4, 0x76, 0xaf, 0xdd, 0x66, 0x15, 0xe4, 0x9d, 0x8e, - 0x3e, 0x05, 0x5c, 0x97, 0xe5, 0xa8, 0x31, 0xec, 0xff, 0x3d, 0x0e, 0xb3, 0xb5, 0x76, 0x8f, 0xbe, - 0x1e, 0x50, 0xaa, 0x4c, 0x1f, 0x55, 0x98, 0xed, 0x06, 0x74, 0xcf, 0xa5, 0xf7, 0xeb, 0xb4, 0x4d, - 0x1b, 0x91, 0x1f, 0x48, 0x69, 0x9e, 0x94, 0x84, 0x66, 0x37, 0x92, 0x60, 0x4c, 0xe3, 0x93, 0xd7, - 0x60, 0xc6, 0x69, 0x44, 0xee, 0x1e, 0xd5, 0x14, 0x84, 0xb8, 0x4f, 0x48, 0x0a, 0x33, 0xd5, 0x04, - 0x14, 0x53, 0xd8, 0xe4, 0xb3, 0x30, 0x1f, 0x36, 0x9c, 0x36, 0xbd, 0xd3, 0x95, 0xac, 0x96, 0x77, - 0x68, 0x63, 0x77, 0xc3, 0x77, 0xbd, 0x48, 0x9a, 0xd9, 0x2e, 0x4b, 0x4a, 0xf3, 0xf5, 0x01, 0x78, - 0x38, 0x90, 0x02, 0xf9, 0x17, 0x16, 0x5c, 0xec, 0x06, 0x74, 0x23, 0xf0, 0x3b, 0x3e, 0x1b, 0x6a, - 0x7d, 0xd6, 0x1f, 0x69, 0x05, 0x79, 0x6b, 0x44, 0x5d, 0x4a, 0x94, 0xf4, 0x5f, 0x59, 0x7c, 0xf8, - 0xf0, 0xa0, 0x72, 0x71, 0xe3, 0x28, 0x01, 0xf0, 0x68, 0xf9, 0xc8, 0xbf, 0xb4, 0xe0, 0x52, 0xd7, - 0x0f, 0xa3, 0x23, 0x3e, 0xa1, 0x78, 0xaa, 0x9f, 0x60, 0x1f, 0x1e, 0x54, 0x2e, 0x6d, 0x1c, 0x29, - 0x01, 0x3e, 0x42, 0x42, 0xfb, 0xb0, 0x0c, 0x67, 0x8d, 0xb1, 0x27, 0x6d, 0x17, 0xaf, 0xc2, 0x19, - 0x35, 0x18, 0x62, 0xdd, 0xa7, 0x14, 0x9b, 0xb2, 0xaa, 0x26, 0x10, 0x93, 0xb8, 0x6c, 0xdc, 0xe9, - 0xa1, 0x28, 0x6a, 0xa7, 0xc6, 0xdd, 0x46, 0x02, 0x8a, 0x29, 0x6c, 0xb2, 0x0a, 0xe7, 0x64, 0x09, - 0xd2, 0x6e, 0xdb, 0x6d, 0x38, 0xcb, 0x7e, 0x4f, 0x0e, 0xb9, 0x62, 0xed, 0xc9, 0xc3, 0x83, 0xca, - 0xb9, 0x8d, 0x7e, 0x30, 0x66, 0xd5, 0x21, 0x6b, 0x70, 0xde, 0xe9, 0x45, 0xbe, 0xfe, 0xfe, 0x6b, - 0x1e, 0xdb, 0x4e, 0x9b, 0x7c, 0x68, 0x4d, 0x89, 0x7d, 0xb7, 0x9a, 0x01, 0xc7, 0xcc, 0x5a, 0x64, - 0x23, 0x45, 0xad, 0x4e, 0x1b, 0xbe, 0xd7, 0x14, 0xbd, 0x5c, 0x8c, 0x4f, 0x60, 0xd5, 0x0c, 0x1c, - 0xcc, 0xac, 0x49, 0xda, 0x30, 0xd3, 0x71, 0x1e, 0xdc, 0xf1, 0x9c, 0x3d, 0xc7, 0x6d, 0x33, 0x26, - 0xd2, 0x3c, 0x36, 0xd8, 0xa8, 0xd2, 0x8b, 0xdc, 0xf6, 0xa2, 0x70, 0x5b, 0x58, 0x5c, 0xf5, 0xa2, - 0xdb, 0x41, 0x3d, 0x62, 0x9a, 0xba, 0xd0, 0x20, 0xd7, 0x13, 0xb4, 0x30, 0x45, 0x9b, 0xdc, 0x86, - 0x0b, 0x7c, 0x3a, 0xae, 0xf8, 0xf7, 0xbd, 0x15, 0xda, 0x76, 0xf6, 0xd5, 0x07, 0x4c, 0xf2, 0x0f, - 0x78, 0xea, 0xf0, 0xa0, 0x72, 0xa1, 0x9e, 0x85, 0x80, 0xd9, 0xf5, 0x88, 0x03, 0x4f, 0x27, 0x01, - 0x48, 0xf7, 0xdc, 0xd0, 0xf5, 0x3d, 0x61, 0x85, 0x9a, 0x8a, 0xad, 0x50, 0xf5, 0xc1, 0x68, 0x78, - 0x14, 0x0d, 0xf2, 0x77, 0x2d, 0x38, 0x9f, 0x35, 0x0d, 0xe7, 0x4b, 0x79, 0x5c, 0x9e, 0xa6, 0xa6, - 0x96, 0x18, 0x11, 0x99, 0x8b, 0x42, 0xa6, 0x10, 0xe4, 0x3d, 0x0b, 0xa6, 0x1d, 0xe3, 0x04, 0x3d, - 0x0f, 0x79, 0xec, 0x5a, 0xe6, 0x99, 0xbc, 0x36, 0x77, 0x78, 0x50, 0x49, 0x9c, 0xd2, 0x31, 0xc1, - 0x91, 0xfc, 0x7d, 0x0b, 0x2e, 0x64, 0xce, 0xf1, 0xf9, 0xf2, 0x69, 0xb4, 0x10, 0x1f, 0x24, 0xd9, - 0x6b, 0x4e, 0xb6, 0x18, 0xe4, 0x5b, 0x96, 0xde, 0xca, 0xd4, 0x7d, 0xda, 0xfc, 0x34, 0x17, 0xed, - 0xcd, 0x11, 0x8d, 0x06, 0xb1, 0xd6, 0xa4, 0x08, 0xd7, 0xce, 0x19, 0x3b, 0xa3, 0x2a, 0xc4, 0x34, - 0x7b, 0xf2, 0x4d, 0x4b, 0x6d, 0x8d, 0x5a, 0xa2, 0x33, 0xa7, 0x25, 0x11, 0x89, 0x77, 0x5a, 0x2d, - 0x50, 0x8a, 0x39, 0xf9, 0x19, 0x58, 0x70, 0xb6, 0xfc, 0x20, 0xca, 0x9c, 0x7c, 0xf3, 0x33, 0x7c, - 0x1a, 0x5d, 0x3a, 0x3c, 0xa8, 0x2c, 0x54, 0x07, 0x62, 0xe1, 0x11, 0x14, 0xec, 0x5f, 0x2b, 0xc2, - 0xb4, 0x38, 0x09, 0xc9, 0xad, 0xeb, 0x37, 0x2d, 0x78, 0xa6, 0xd1, 0x0b, 0x02, 0xea, 0x45, 0xf5, - 0x88, 0x76, 0xfb, 0x37, 0x2e, 0xeb, 0x54, 0x37, 0xae, 0xcb, 0x87, 0x07, 0x95, 0x67, 0x96, 0x8f, - 0xe0, 0x8f, 0x47, 0x4a, 0x47, 0xfe, 0x9d, 0x05, 0xb6, 0x44, 0xa8, 0x39, 0x8d, 0xdd, 0x56, 0xe0, - 0xf7, 0xbc, 0x66, 0xff, 0x47, 0x8c, 0x9d, 0xea, 0x47, 0x3c, 0x77, 0x78, 0x50, 0xb1, 0x97, 0x1f, - 0x29, 0x05, 0x0e, 0x21, 0x29, 0x79, 0x1d, 0xce, 0x4a, 0xac, 0x6b, 0x0f, 0xba, 0x34, 0x70, 0xd9, - 0x99, 0x43, 0x2a, 0x8e, 0xb1, 0x2b, 0x56, 0x1a, 0x01, 0xfb, 0xeb, 0x90, 0x10, 0x26, 0xef, 0x53, - 0xb7, 0xb5, 0x13, 0x29, 0xf5, 0x69, 0x44, 0xff, 0x2b, 0x69, 0x15, 0xb9, 0x2b, 0x68, 0xd6, 0xca, - 0x87, 0x07, 0x95, 0x49, 0xf9, 0x07, 0x15, 0x27, 0x72, 0x0b, 0x66, 0xc4, 0x39, 0x75, 0xc3, 0xf5, - 0x5a, 0x1b, 0xbe, 0x27, 0x9c, 0x88, 0x4a, 0xb5, 0xe7, 0xd4, 0x86, 0x5f, 0x4f, 0x40, 0x1f, 0x1e, - 0x54, 0xa6, 0xd5, 0xef, 0xcd, 0xfd, 0x2e, 0xc5, 0x54, 0x6d, 0xfb, 0x77, 0x27, 0x00, 0xd4, 0x70, - 0xa5, 0x5d, 0xf2, 0x11, 0x28, 0x85, 0x34, 0x12, 0x5c, 0xe5, 0xc5, 0x89, 0xb8, 0xee, 0x52, 0x85, - 0x18, 0xc3, 0xc9, 0x2e, 0x14, 0xbb, 0x4e, 0x2f, 0xa4, 0xf9, 0x9c, 0x1f, 0x64, 0xe7, 0x6f, 0x30, - 0x8a, 0xe2, 0x60, 0xca, 0x7f, 0xa2, 0xe0, 0x41, 0xbe, 0x62, 0x01, 0xd0, 0x64, 0x87, 0x8d, 0x6c, - 0x20, 0x92, 0x2c, 0xe3, 0x3e, 0x65, 0x6d, 0x50, 0x9b, 0x39, 0x3c, 0xa8, 0x80, 0xd1, 0xf5, 0x06, - 0x5b, 0x72, 0x1f, 0xa6, 0x1c, 0xb5, 0xe6, 0x8f, 0x9f, 0xc6, 0x9a, 0xcf, 0xcf, 0x8b, 0x7a, 0xd0, - 0x6a, 0x66, 0xe4, 0x6b, 0x16, 0xcc, 0x84, 0x34, 0x92, 0x5d, 0xc5, 0x56, 0x1e, 0xa9, 0xf0, 0x8e, - 0x38, 0xe8, 0xea, 0x09, 0x9a, 0x62, 0x05, 0x4d, 0x96, 0x61, 0x8a, 0xaf, 0x12, 0xe5, 0x06, 0x75, - 0x9a, 0x34, 0xe0, 0xe6, 0x08, 0xa9, 0x49, 0x8d, 0x2e, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, - 0x8a, 0xaf, 0x12, 0x65, 0xdd, 0x0d, 0x02, 0x5f, 0x8a, 0x32, 0x95, 0x93, 0x28, 0x06, 0x4d, 0x2d, - 0x8a, 0x51, 0x86, 0x29, 0xbe, 0xf6, 0x77, 0xce, 0xc0, 0x8c, 0x9a, 0x48, 0xb1, 0x66, 0x2f, 0xac, - 0x5f, 0x03, 0x34, 0xfb, 0x65, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0x4c, 0xd5, 0xa4, 0x62, 0xaf, - 0x2b, 0xd7, 0x4d, 0x20, 0x26, 0x71, 0x49, 0x07, 0x8a, 0x61, 0x44, 0xbb, 0xea, 0x8a, 0x7d, 0xc4, - 0x1b, 0xe0, 0x78, 0x7d, 0x30, 0x2c, 0x09, 0x8c, 0x3c, 0x0a, 0x2e, 0xdc, 0x80, 0x1b, 0x25, 0x6c, - 0xba, 0x72, 0x72, 0xe4, 0x33, 0x3f, 0x93, 0xe6, 0x62, 0xd1, 0x1b, 0xc9, 0x32, 0x4c, 0xb1, 0xcf, - 0x50, 0xf6, 0x8b, 0xa7, 0xa8, 0xec, 0x7f, 0x1a, 0xa6, 0x3a, 0xce, 0x83, 0x7a, 0x2f, 0x68, 0x9d, - 0xfc, 0x50, 0x21, 0x5d, 0x26, 0x05, 0x15, 0xd4, 0xf4, 0xc8, 0x97, 0x2c, 0x63, 0xc9, 0x11, 0xf7, - 0xe9, 0x77, 0xf3, 0x5d, 0x72, 0xf4, 0x5e, 0x39, 0x70, 0xf1, 0xe9, 0x53, 0xbd, 0xa7, 0x1e, 0xbb, - 0xea, 0xcd, 0xd4, 0x48, 0x31, 0x41, 0xb4, 0x1a, 0x59, 0x3a, 0x55, 0x35, 0x72, 0x39, 0xc1, 0x0c, - 0x53, 0xcc, 0xb9, 0x3c, 0x62, 0xce, 0x69, 0x79, 0xe0, 0x54, 0xe5, 0xa9, 0x27, 0x98, 0x61, 0x8a, - 0xf9, 0xe0, 0xf3, 0x66, 0xf9, 0x74, 0xce, 0x9b, 0xd3, 0x39, 0x9c, 0x37, 0x8f, 0x56, 0xc5, 0xcf, - 0x8c, 0xaa, 0x8a, 0x93, 0x9b, 0x40, 0x9a, 0xfb, 0x9e, 0xd3, 0x71, 0x1b, 0x72, 0xb1, 0xe4, 0xdb, - 0xe6, 0x0c, 0xb7, 0x47, 0x2c, 0xc8, 0x85, 0x8c, 0xac, 0xf4, 0x61, 0x60, 0x46, 0x2d, 0x12, 0xc1, - 0x54, 0x57, 0x69, 0x5c, 0xb3, 0x79, 0x8c, 0x7e, 0xa5, 0x81, 0x09, 0x37, 0x09, 0x36, 0xf1, 0x54, - 0x09, 0x6a, 0x4e, 0x64, 0x0d, 0xce, 0x77, 0x5c, 0x6f, 0xc3, 0x6f, 0x86, 0x1b, 0x34, 0x90, 0xd6, - 0x96, 0x3a, 0x8d, 0xe6, 0xe7, 0x78, 0xdb, 0xf0, 0x13, 0xf4, 0x7a, 0x06, 0x1c, 0x33, 0x6b, 0xd9, - 0xff, 0xcb, 0x82, 0xb9, 0xe5, 0xb6, 0xdf, 0x6b, 0xde, 0x75, 0xa2, 0xc6, 0x8e, 0xf0, 0x10, 0x20, - 0xaf, 0xc1, 0x94, 0xeb, 0x45, 0x34, 0xd8, 0x73, 0xda, 0x72, 0x7f, 0xb2, 0x95, 0xf9, 0x74, 0x55, - 0x96, 0x3f, 0x3c, 0xa8, 0xcc, 0xac, 0xf4, 0x02, 0x6e, 0xa5, 0x16, 0xab, 0x15, 0xea, 0x3a, 0xe4, - 0x3b, 0x16, 0x9c, 0x15, 0x3e, 0x06, 0x2b, 0x4e, 0xe4, 0xbc, 0xd9, 0xa3, 0x81, 0x4b, 0x95, 0x97, - 0xc1, 0x88, 0x0b, 0x55, 0x5a, 0x56, 0xc5, 0x60, 0x3f, 0x56, 0xd4, 0xd7, 0xd3, 0x9c, 0xb1, 0x5f, - 0x18, 0xfb, 0x17, 0x0a, 0xf0, 0xd4, 0x40, 0x5a, 0x64, 0x01, 0xc6, 0xdc, 0xa6, 0xfc, 0x74, 0x90, - 0x74, 0xc7, 0x56, 0x9b, 0x38, 0xe6, 0x36, 0xc9, 0x22, 0xd7, 0x39, 0x03, 0x1a, 0x86, 0xea, 0xc2, - 0xb9, 0xa4, 0xd5, 0x43, 0x59, 0x8a, 0x06, 0x06, 0xa9, 0x40, 0x91, 0xbb, 0xcb, 0xca, 0xf3, 0x04, - 0xd7, 0x62, 0xb9, 0x67, 0x2a, 0x8a, 0x72, 0xf2, 0x65, 0x0b, 0x40, 0x08, 0xc8, 0x4e, 0x23, 0x72, - 0x97, 0xc4, 0x7c, 0x9b, 0x89, 0x51, 0x16, 0x52, 0xc6, 0xff, 0xd1, 0xe0, 0x4a, 0x36, 0x61, 0x82, - 0x29, 0xb4, 0x7e, 0xf3, 0xc4, 0x9b, 0x22, 0xbf, 0x89, 0xda, 0xe0, 0x34, 0x50, 0xd2, 0x62, 0x6d, - 0x15, 0xd0, 0xa8, 0x17, 0x78, 0xac, 0x69, 0xf9, 0x36, 0x38, 0x25, 0xa4, 0x40, 0x5d, 0x8a, 0x06, - 0x86, 0xfd, 0xcf, 0xc6, 0xe0, 0x7c, 0x96, 0xe8, 0x6c, 0xb7, 0x99, 0x10, 0xd2, 0xca, 0xa3, 0xf1, - 0x4f, 0xe5, 0xdf, 0x3e, 0xd2, 0x5d, 0x46, 0x5f, 0x53, 0x48, 0x7f, 0x41, 0xc9, 0x97, 0xfc, 0x94, - 0x6e, 0xa1, 0xb1, 0x13, 0xb6, 0x90, 0xa6, 0x9c, 0x6a, 0xa5, 0xcb, 0x30, 0x1e, 0xb2, 0x9e, 0x2f, - 0x24, 0xaf, 0x3b, 0x78, 0x1f, 0x71, 0x08, 0xc3, 0xe8, 0x79, 0x6e, 0x24, 0x63, 0x4c, 0x34, 0xc6, - 0x1d, 0xcf, 0x8d, 0x90, 0x43, 0xec, 0x6f, 0x8f, 0xc1, 0xc2, 0xe0, 0x8f, 0x22, 0xdf, 0xb6, 0x00, - 0x9a, 0xec, 0xb8, 0x12, 0x72, 0x47, 0x6d, 0xe1, 0x5e, 0xe4, 0x9c, 0x56, 0x1b, 0xae, 0x28, 0x4e, - 0xb1, 0xaf, 0x99, 0x2e, 0x0a, 0xd1, 0x10, 0x84, 0x5c, 0x55, 0x43, 0x9f, 0x5f, 0xd5, 0x88, 0xc9, - 0xa4, 0xeb, 0xac, 0x6b, 0x08, 0x1a, 0x58, 0xec, 0x3c, 0xea, 0x39, 0x1d, 0x1a, 0x76, 0x1d, 0x1d, - 0xb1, 0xc3, 0xcf, 0xa3, 0xb7, 0x54, 0x21, 0xc6, 0x70, 0xbb, 0x0d, 0xcf, 0x0e, 0x21, 0x67, 0x4e, - 0x01, 0x11, 0xf6, 0xff, 0xb0, 0xe0, 0xc9, 0xe5, 0x76, 0x2f, 0x8c, 0x68, 0xf0, 0xff, 0x8d, 0xeb, - 0xde, 0x9f, 0x5a, 0xf0, 0xf4, 0x80, 0x6f, 0x7e, 0x0c, 0x1e, 0x7c, 0xef, 0x24, 0x3d, 0xf8, 0xee, - 0x8c, 0x3a, 0xa4, 0x33, 0xbf, 0x63, 0x80, 0x23, 0xdf, 0xbf, 0x29, 0xc0, 0x19, 0xb6, 0x6c, 0x35, - 0xfd, 0x56, 0x4e, 0x1b, 0xe7, 0xb3, 0x50, 0xfc, 0x3c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, + // 8574 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x8c, 0x24, 0xd7, + 0x71, 0x98, 0x7a, 0x67, 0x67, 0x77, 0xa6, 0x66, 0xbf, 0xee, 0xdd, 0x1d, 0xb9, 0x5c, 0x92, 0x37, + 0x54, 0xd3, 0x61, 0x48, 0x8b, 0xda, 0x95, 0xf8, 0x91, 0x50, 0xa2, 0xc2, 0x64, 0x66, 0xf7, 0x8e, + 0xb7, 0xc7, 0xdd, 0xbb, 0x65, 0xcd, 0x1e, 0xcf, 0x96, 0x44, 0x5b, 0xbd, 0x33, 0x6f, 0x67, 0xfb, + 0x76, 0xa6, 0x7b, 0xd4, 0xdd, 0xb3, 0x77, 0x4b, 0x11, 0x16, 0x25, 0x81, 0xb2, 0xac, 0x48, 0xb0, + 0x12, 0x5b, 0x08, 0x82, 0x04, 0x81, 0x62, 0x18, 0x70, 0x12, 0xfb, 0x47, 0x60, 0x38, 0x48, 0x7e, + 0x18, 0x88, 0x11, 0xc5, 0x86, 0x02, 0xc4, 0x81, 0xfc, 0x23, 0x91, 0x13, 0xc0, 0xeb, 0x68, 0x9d, + 0x3f, 0x31, 0x12, 0x08, 0x09, 0x14, 0x18, 0xe1, 0x8f, 0x20, 0x78, 0x9f, 0xfd, 0xba, 0xa7, 0x67, + 0xbf, 0xa6, 0xf7, 0x48, 0x27, 0xfe, 0x37, 0xf3, 0xaa, 0x5e, 0x55, 0xf5, 0xfb, 0xac, 0x57, 0xaf, + 0xaa, 0x1e, 0xac, 0xb5, 0xdd, 0x68, 0xa7, 0xbf, 0xb5, 0xd8, 0xf4, 0xbb, 0x4b, 0x4e, 0xd0, 0xf6, + 0x7b, 0x81, 0x7f, 0x97, 0xff, 0xf8, 0x68, 0xe0, 0x77, 0x3a, 0x7e, 0x3f, 0x0a, 0x97, 0x7a, 0xbb, + 0xed, 0x25, 0xa7, 0xe7, 0x86, 0x4b, 0xba, 0x64, 0xef, 0xe3, 0x4e, 0xa7, 0xb7, 0xe3, 0x7c, 0x7c, + 0xa9, 0x4d, 0x3d, 0x1a, 0x38, 0x11, 0x6d, 0x2d, 0xf6, 0x02, 0x3f, 0xf2, 0xc9, 0xa7, 0x62, 0x6a, + 0x8b, 0x8a, 0x1a, 0xff, 0xf1, 0xb3, 0xaa, 0xee, 0x62, 0x6f, 0xb7, 0xbd, 0xc8, 0xa8, 0x2d, 0xea, + 0x12, 0x45, 0x6d, 0xe1, 0xa3, 0x86, 0x2c, 0x6d, 0xbf, 0xed, 0x2f, 0x71, 0xa2, 0x5b, 0xfd, 0x6d, + 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x04, 0xb3, 0x85, 0x27, 0x77, 0x5f, 0x0a, 0x17, 0x5d, 0x9f, 0xc9, + 0xb6, 0xb4, 0xe5, 0x44, 0xcd, 0x9d, 0xa5, 0xbd, 0x01, 0x89, 0x16, 0x6c, 0x03, 0xa9, 0xe9, 0x07, + 0x34, 0x0b, 0xe7, 0x85, 0x18, 0xa7, 0xeb, 0x34, 0x77, 0x5c, 0x8f, 0x06, 0xfb, 0xf1, 0x57, 0x77, + 0x69, 0xe4, 0x64, 0xd5, 0x5a, 0x1a, 0x56, 0x2b, 0xe8, 0x7b, 0x91, 0xdb, 0xa5, 0x03, 0x15, 0xfe, + 0xca, 0x71, 0x15, 0xc2, 0xe6, 0x0e, 0xed, 0x3a, 0x03, 0xf5, 0x9e, 0x1f, 0x56, 0xaf, 0x1f, 0xb9, + 0x9d, 0x25, 0xd7, 0x8b, 0xc2, 0x28, 0x48, 0x57, 0xb2, 0x7f, 0x54, 0x80, 0x72, 0x6d, 0xad, 0xde, + 0x88, 0x9c, 0xa8, 0x1f, 0x92, 0xaf, 0x5a, 0x30, 0xd5, 0xf1, 0x9d, 0x56, 0xdd, 0xe9, 0x38, 0x5e, + 0x93, 0x06, 0xf3, 0xd6, 0x13, 0xd6, 0xd3, 0x95, 0xe7, 0xd6, 0x16, 0x47, 0xe9, 0xaf, 0xc5, 0xda, + 0xbd, 0x10, 0x69, 0xe8, 0xf7, 0x83, 0x26, 0x45, 0xba, 0x5d, 0xbf, 0xf4, 0xbd, 0x83, 0xea, 0x87, + 0x0e, 0x0f, 0xaa, 0x53, 0x6b, 0x06, 0x27, 0x4c, 0xf0, 0x25, 0xdf, 0xb6, 0xe0, 0x42, 0xd3, 0xf1, + 0x9c, 0x60, 0x7f, 0xd3, 0x09, 0xda, 0x34, 0x7a, 0x35, 0xf0, 0xfb, 0xbd, 0xf9, 0xb1, 0x73, 0x90, + 0xe6, 0x11, 0x29, 0xcd, 0x85, 0xe5, 0x34, 0x3b, 0x1c, 0x94, 0x80, 0xcb, 0x15, 0x46, 0xce, 0x56, + 0x87, 0x9a, 0x72, 0x15, 0xce, 0x53, 0xae, 0x46, 0x9a, 0x1d, 0x0e, 0x4a, 0x40, 0x9e, 0x81, 0x49, + 0xd7, 0x6b, 0x07, 0x34, 0x0c, 0xe7, 0xc7, 0x9f, 0xb0, 0x9e, 0x2e, 0xd7, 0x67, 0x65, 0xf5, 0xc9, + 0x55, 0x51, 0x8c, 0x0a, 0x6e, 0xff, 0x66, 0x01, 0x2e, 0xd4, 0xd6, 0xea, 0x9b, 0x81, 0xb3, 0xbd, + 0xed, 0x36, 0xd1, 0xef, 0x47, 0xae, 0xd7, 0x36, 0x09, 0x58, 0x47, 0x13, 0x20, 0x2f, 0x42, 0x25, + 0xa4, 0xc1, 0x9e, 0xdb, 0xa4, 0x1b, 0x7e, 0x10, 0xf1, 0x4e, 0x29, 0xd6, 0x2f, 0x4a, 0xf4, 0x4a, + 0x23, 0x06, 0xa1, 0x89, 0xc7, 0xaa, 0x05, 0xbe, 0x1f, 0x49, 0x38, 0x6f, 0xb3, 0x72, 0x5c, 0x0d, + 0x63, 0x10, 0x9a, 0x78, 0x64, 0x05, 0xe6, 0x1c, 0xcf, 0xf3, 0x23, 0x27, 0x72, 0x7d, 0x6f, 0x23, + 0xa0, 0xdb, 0xee, 0x7d, 0xf9, 0x89, 0xf3, 0xb2, 0xee, 0x5c, 0x2d, 0x05, 0xc7, 0x81, 0x1a, 0xe4, + 0x5b, 0x16, 0xcc, 0x85, 0x91, 0xdb, 0xdc, 0x75, 0x3d, 0x1a, 0x86, 0xcb, 0xbe, 0xb7, 0xed, 0xb6, + 0xe7, 0x8b, 0xbc, 0xdb, 0x6e, 0x8e, 0xd6, 0x6d, 0x8d, 0x14, 0xd5, 0xfa, 0x25, 0x26, 0x52, 0xba, + 0x14, 0x07, 0xb8, 0x93, 0x8f, 0x40, 0x59, 0xb6, 0x28, 0x0d, 0xe7, 0x27, 0x9e, 0x28, 0x3c, 0x5d, + 0xae, 0x4f, 0x1f, 0x1e, 0x54, 0xcb, 0xab, 0xaa, 0x10, 0x63, 0xb8, 0xbd, 0x02, 0xf3, 0xb5, 0xee, + 0x96, 0x13, 0x86, 0x4e, 0xcb, 0x0f, 0x52, 0x5d, 0xf7, 0x34, 0x94, 0xba, 0x4e, 0xaf, 0xe7, 0x7a, + 0x6d, 0xd6, 0x77, 0x8c, 0xce, 0xd4, 0xe1, 0x41, 0xb5, 0xb4, 0x2e, 0xcb, 0x50, 0x43, 0xed, 0xff, + 0x38, 0x06, 0x95, 0x9a, 0xe7, 0x74, 0xf6, 0x43, 0x37, 0xc4, 0xbe, 0x47, 0x3e, 0x07, 0x25, 0xb6, + 0x6a, 0xb5, 0x9c, 0xc8, 0x91, 0x33, 0xfd, 0x63, 0x8b, 0x62, 0x11, 0x59, 0x34, 0x17, 0x91, 0xf8, + 0xf3, 0x19, 0xf6, 0xe2, 0xde, 0xc7, 0x17, 0x6f, 0x6d, 0xdd, 0xa5, 0xcd, 0x68, 0x9d, 0x46, 0x4e, + 0x9d, 0xc8, 0x5e, 0x80, 0xb8, 0x0c, 0x35, 0x55, 0xe2, 0xc3, 0x78, 0xd8, 0xa3, 0x4d, 0x39, 0x73, + 0xd7, 0x47, 0x9c, 0x21, 0xb1, 0xe8, 0x8d, 0x1e, 0x6d, 0xd6, 0xa7, 0x24, 0xeb, 0x71, 0xf6, 0x0f, + 0x39, 0x23, 0x72, 0x0f, 0x26, 0x42, 0xbe, 0x96, 0xc9, 0x49, 0x79, 0x2b, 0x3f, 0x96, 0x9c, 0x6c, + 0x7d, 0x46, 0x32, 0x9d, 0x10, 0xff, 0x51, 0xb2, 0xb3, 0xff, 0x93, 0x05, 0x17, 0x0d, 0xec, 0x5a, + 0xd0, 0xee, 0x77, 0xa9, 0x17, 0x91, 0x27, 0x60, 0xdc, 0x73, 0xba, 0x54, 0xce, 0x2a, 0x2d, 0xf2, + 0x4d, 0xa7, 0x4b, 0x91, 0x43, 0xc8, 0x93, 0x50, 0xdc, 0x73, 0x3a, 0x7d, 0xca, 0x1b, 0xa9, 0x5c, + 0x9f, 0x96, 0x28, 0xc5, 0x37, 0x58, 0x21, 0x0a, 0x18, 0x79, 0x1b, 0xca, 0xfc, 0xc7, 0xb5, 0xc0, + 0xef, 0xe6, 0xf4, 0x69, 0x52, 0xc2, 0x37, 0x14, 0x59, 0x31, 0xfc, 0xf4, 0x5f, 0x8c, 0x19, 0xda, + 0x7f, 0x6c, 0xc1, 0xac, 0xf1, 0x71, 0x6b, 0x6e, 0x18, 0x91, 0xcf, 0x0e, 0x0c, 0x9e, 0xc5, 0x93, + 0x0d, 0x1e, 0x56, 0x9b, 0x0f, 0x9d, 0x39, 0xf9, 0xa5, 0x25, 0x55, 0x62, 0x0c, 0x1c, 0x0f, 0x8a, + 0x6e, 0x44, 0xbb, 0xe1, 0xfc, 0xd8, 0x13, 0x85, 0xa7, 0x2b, 0xcf, 0xad, 0xe6, 0xd6, 0x8d, 0x71, + 0xfb, 0xae, 0x32, 0xfa, 0x28, 0xd8, 0xd8, 0xbf, 0x55, 0x48, 0x74, 0xdf, 0xba, 0x92, 0xe3, 0x5d, + 0x0b, 0x26, 0x3a, 0xce, 0x16, 0xed, 0x88, 0xb9, 0x55, 0x79, 0xee, 0xcd, 0xdc, 0x24, 0x51, 0x3c, + 0x16, 0xd7, 0x38, 0xfd, 0xab, 0x5e, 0x14, 0xec, 0xc7, 0xc3, 0x4b, 0x14, 0xa2, 0x64, 0x4e, 0xfe, + 0xae, 0x05, 0x95, 0x78, 0x55, 0x53, 0xcd, 0xb2, 0x95, 0xbf, 0x30, 0xf1, 0x62, 0x2a, 0x25, 0xd2, + 0x4b, 0xb4, 0x01, 0x41, 0x53, 0x96, 0x85, 0x4f, 0x40, 0xc5, 0xf8, 0x04, 0x32, 0x07, 0x85, 0x5d, + 0xba, 0x2f, 0x06, 0x3c, 0xb2, 0x9f, 0xe4, 0x52, 0x62, 0x84, 0xcb, 0x21, 0xfd, 0xc9, 0xb1, 0x97, + 0xac, 0x85, 0x57, 0x60, 0x2e, 0xcd, 0xf0, 0x34, 0xf5, 0xed, 0x7f, 0x5a, 0x4c, 0x0c, 0x4c, 0xb6, + 0x10, 0x10, 0x1f, 0x26, 0xbb, 0x34, 0x0a, 0xdc, 0xa6, 0xea, 0xb2, 0x95, 0xd1, 0x5a, 0x69, 0x9d, + 0x13, 0x8b, 0x37, 0x44, 0xf1, 0x3f, 0x44, 0xc5, 0x85, 0xec, 0xc0, 0xb8, 0x13, 0xb4, 0x55, 0x9f, + 0x5c, 0xcb, 0x67, 0x5a, 0xc6, 0x4b, 0x45, 0x2d, 0x68, 0x87, 0xc8, 0x39, 0x90, 0x25, 0x28, 0x47, + 0x34, 0xe8, 0xba, 0x9e, 0x13, 0x89, 0x1d, 0xb4, 0x54, 0xbf, 0x20, 0xd1, 0xca, 0x9b, 0x0a, 0x80, + 0x31, 0x0e, 0xe9, 0xc0, 0x44, 0x2b, 0xd8, 0xc7, 0xbe, 0x37, 0x3f, 0x9e, 0x47, 0x53, 0xac, 0x70, + 0x5a, 0xf1, 0x20, 0x15, 0xff, 0x51, 0xf2, 0x20, 0xbf, 0x6a, 0xc1, 0xa5, 0x2e, 0x75, 0xc2, 0x7e, + 0x40, 0xd9, 0x27, 0x20, 0x8d, 0xa8, 0xc7, 0x3a, 0x76, 0xbe, 0xc8, 0x99, 0xe3, 0xa8, 0xfd, 0x30, + 0x48, 0xb9, 0xfe, 0x98, 0x14, 0xe5, 0x52, 0x16, 0x14, 0x33, 0xa5, 0x21, 0x6f, 0x43, 0x25, 0x8a, + 0x3a, 0x8d, 0x88, 0xe9, 0xc1, 0xed, 0xfd, 0xf9, 0x09, 0xbe, 0x78, 0x8d, 0xb8, 0xc2, 0x6c, 0x6e, + 0xae, 0x29, 0x82, 0xf5, 0x59, 0x36, 0x5b, 0x8c, 0x02, 0x34, 0xd9, 0xd9, 0xff, 0xa2, 0x08, 0x17, + 0x06, 0xb6, 0x15, 0xf2, 0x02, 0x14, 0x7b, 0x3b, 0x4e, 0xa8, 0xf6, 0x89, 0x2b, 0x6a, 0x91, 0xda, + 0x60, 0x85, 0xef, 0x1d, 0x54, 0xa7, 0x55, 0x15, 0x5e, 0x80, 0x02, 0x99, 0x69, 0x6d, 0x5d, 0x1a, + 0x86, 0x4e, 0x5b, 0x6d, 0x1e, 0xc6, 0x20, 0xe5, 0xc5, 0xa8, 0xe0, 0xe4, 0xe7, 0x2d, 0x98, 0x16, + 0x03, 0x16, 0x69, 0xd8, 0xef, 0x44, 0x6c, 0x83, 0x64, 0x9d, 0x72, 0x23, 0x8f, 0xc9, 0x21, 0x48, + 0xd6, 0x2f, 0x4b, 0xee, 0xd3, 0x66, 0x69, 0x88, 0x49, 0xbe, 0xe4, 0x0e, 0x94, 0xc3, 0xc8, 0x09, + 0x22, 0xda, 0xaa, 0x45, 0x5c, 0x95, 0xab, 0x3c, 0xf7, 0x93, 0x27, 0xdb, 0x39, 0x36, 0xdd, 0x2e, + 0x15, 0xbb, 0x54, 0x43, 0x11, 0xc0, 0x98, 0x16, 0x79, 0x1b, 0x20, 0xe8, 0x7b, 0x8d, 0x7e, 0xb7, + 0xeb, 0x04, 0xfb, 0x52, 0xbb, 0xbb, 0x3e, 0xda, 0xe7, 0xa1, 0xa6, 0x17, 0x2b, 0x3a, 0x71, 0x19, + 0x1a, 0xfc, 0xc8, 0x97, 0x2c, 0x98, 0x16, 0xf3, 0x40, 0x49, 0x30, 0x91, 0xb3, 0x04, 0x17, 0x58, + 0xd3, 0xae, 0x98, 0x2c, 0x30, 0xc9, 0x91, 0xbc, 0x09, 0x95, 0xa6, 0xdf, 0xed, 0x75, 0xa8, 0x68, + 0xdc, 0xc9, 0x53, 0x37, 0x2e, 0x1f, 0xba, 0xcb, 0x31, 0x09, 0x34, 0xe9, 0xd9, 0xff, 0x3e, 0xa9, + 0xe3, 0xa8, 0x21, 0x4d, 0x3e, 0x03, 0x8f, 0x84, 0xfd, 0x66, 0x93, 0x86, 0xe1, 0x76, 0xbf, 0x83, + 0x7d, 0xef, 0xba, 0x1b, 0x46, 0x7e, 0xb0, 0xbf, 0xe6, 0x76, 0xdd, 0x88, 0x0f, 0xe8, 0x62, 0xfd, + 0xf1, 0xc3, 0x83, 0xea, 0x23, 0x8d, 0x61, 0x48, 0x38, 0xbc, 0x3e, 0x71, 0xe0, 0xd1, 0xbe, 0x37, + 0x9c, 0xbc, 0x38, 0x7e, 0x54, 0x0f, 0x0f, 0xaa, 0x8f, 0xde, 0x1e, 0x8e, 0x86, 0x47, 0xd1, 0xb0, + 0xff, 0xd4, 0x62, 0xdb, 0x90, 0xf8, 0xae, 0x4d, 0xda, 0xed, 0x75, 0xd8, 0xd2, 0x79, 0xfe, 0xca, + 0x71, 0x94, 0x50, 0x8e, 0x31, 0x9f, 0xbd, 0x5c, 0xc9, 0x3f, 0x4c, 0x43, 0xb6, 0xff, 0xab, 0x05, + 0x97, 0xd2, 0xc8, 0x0f, 0x40, 0xa1, 0x0b, 0x93, 0x0a, 0xdd, 0xcd, 0x7c, 0xbf, 0x76, 0x88, 0x56, + 0xf7, 0x0b, 0xc6, 0x80, 0x55, 0xa8, 0x48, 0xb7, 0xc9, 0x4b, 0x30, 0x15, 0xc9, 0xbf, 0x37, 0x63, + 0xe5, 0x5c, 0x1b, 0x26, 0x36, 0x0d, 0x18, 0x26, 0x30, 0x59, 0xcd, 0x66, 0xa7, 0x1f, 0x46, 0x34, + 0x68, 0x34, 0xfd, 0x9e, 0x58, 0x76, 0x4b, 0x71, 0xcd, 0x65, 0x03, 0x86, 0x09, 0x4c, 0xfb, 0x6f, + 0x16, 0x07, 0xdb, 0xfd, 0xff, 0x75, 0x7d, 0x25, 0x56, 0x3f, 0x0a, 0xef, 0xa7, 0xfa, 0x31, 0xfe, + 0x81, 0x52, 0x3f, 0xbe, 0x6c, 0x31, 0x2d, 0x4e, 0x0c, 0x80, 0x50, 0xaa, 0x46, 0xaf, 0xe7, 0x3b, + 0x1d, 0x90, 0x6e, 0x9b, 0x8a, 0xa1, 0xe4, 0x85, 0x31, 0x5b, 0xfb, 0x1f, 0x8d, 0xc3, 0x54, 0xcd, + 0x8b, 0xdc, 0xda, 0xf6, 0xb6, 0xeb, 0xb9, 0xd1, 0x3e, 0xf9, 0xc6, 0x18, 0x2c, 0xf5, 0x02, 0xba, + 0x4d, 0x83, 0x80, 0xb6, 0x56, 0xfa, 0x81, 0xeb, 0xb5, 0x1b, 0xcd, 0x1d, 0xda, 0xea, 0x77, 0x5c, + 0xaf, 0xbd, 0xda, 0xf6, 0x7c, 0x5d, 0x7c, 0xf5, 0x3e, 0x6d, 0xf6, 0x79, 0xbb, 0x8a, 0x55, 0xa2, + 0x3b, 0x9a, 0xec, 0x1b, 0xa7, 0x63, 0x5a, 0x7f, 0xfe, 0xf0, 0xa0, 0xba, 0x74, 0xca, 0x4a, 0x78, + 0xda, 0x4f, 0x23, 0x5f, 0x1b, 0x83, 0xc5, 0x80, 0x7e, 0xbe, 0xef, 0x9e, 0xbc, 0x35, 0xc4, 0x32, + 0xde, 0x19, 0x71, 0xbb, 0x3f, 0x15, 0xcf, 0xfa, 0x73, 0x87, 0x07, 0xd5, 0x53, 0xd6, 0xc1, 0x53, + 0x7e, 0x97, 0xbd, 0x01, 0x95, 0x5a, 0xcf, 0x0d, 0xdd, 0xfb, 0xe8, 0xf7, 0x23, 0x7a, 0x02, 0x83, + 0x46, 0x15, 0x8a, 0x41, 0xbf, 0x43, 0xc5, 0x02, 0x53, 0xae, 0x97, 0xd9, 0xb2, 0x8c, 0xac, 0x00, + 0x45, 0xb9, 0xfd, 0x65, 0xb6, 0x05, 0x71, 0x92, 0x29, 0x53, 0xd6, 0x5d, 0x28, 0x06, 0x8c, 0x89, + 0x1c, 0x59, 0xa3, 0x9e, 0xfa, 0x63, 0xa9, 0xa5, 0x10, 0xec, 0x27, 0x0a, 0x16, 0xf6, 0x77, 0xc7, + 0xe0, 0x72, 0xad, 0xd7, 0x5b, 0xa7, 0xe1, 0x4e, 0x4a, 0x8a, 0x5f, 0xb4, 0x60, 0x66, 0xcf, 0x0d, + 0xa2, 0xbe, 0xd3, 0x51, 0xd6, 0x4a, 0x21, 0x4f, 0x63, 0x54, 0x79, 0x38, 0xb7, 0x37, 0x12, 0xa4, + 0xeb, 0xe4, 0xf0, 0xa0, 0x3a, 0x93, 0x2c, 0xc3, 0x14, 0x7b, 0xf2, 0x77, 0x2c, 0x98, 0x93, 0x45, + 0x37, 0xfd, 0x16, 0x35, 0xad, 0xe1, 0xb7, 0xf3, 0x94, 0x49, 0x13, 0x17, 0x56, 0xcc, 0x74, 0x29, + 0x0e, 0x08, 0x61, 0xff, 0xf7, 0x31, 0x78, 0x78, 0x08, 0x0d, 0xf2, 0x6b, 0x16, 0x5c, 0x12, 0x26, + 0x74, 0x03, 0x84, 0x74, 0x5b, 0xb6, 0xe6, 0x4f, 0xe7, 0x2d, 0x39, 0xb2, 0x29, 0x4e, 0xbd, 0x26, + 0xad, 0xcf, 0xb3, 0x25, 0x79, 0x39, 0x83, 0x35, 0x66, 0x0a, 0xc4, 0x25, 0x15, 0x46, 0xf5, 0x94, + 0xa4, 0x63, 0x0f, 0x44, 0xd2, 0x46, 0x06, 0x6b, 0xcc, 0x14, 0xc8, 0xfe, 0xeb, 0xf0, 0xe8, 0x11, + 0xe4, 0x8e, 0x9f, 0x9c, 0xf6, 0x9b, 0x7a, 0xd4, 0x27, 0xc7, 0xdc, 0x09, 0xe6, 0xb5, 0x0d, 0x13, + 0x7c, 0xea, 0xa8, 0x89, 0x0d, 0x6c, 0x0f, 0xe6, 0x73, 0x2a, 0x44, 0x09, 0xb1, 0xbf, 0x6b, 0x41, + 0xe9, 0x14, 0xb6, 0xcf, 0x6a, 0xd2, 0xf6, 0x59, 0x1e, 0xb0, 0x7b, 0x46, 0x83, 0x76, 0xcf, 0x57, + 0x47, 0xeb, 0x8d, 0x93, 0xd8, 0x3b, 0x7f, 0x64, 0xc1, 0x85, 0x01, 0xfb, 0x28, 0xd9, 0x81, 0x4b, + 0x3d, 0xbf, 0xa5, 0xb6, 0xd3, 0xeb, 0x4e, 0xb8, 0xc3, 0x61, 0xf2, 0xf3, 0x5e, 0x60, 0x3d, 0xb9, + 0x91, 0x01, 0x7f, 0xef, 0xa0, 0x3a, 0xaf, 0x89, 0xa4, 0x10, 0x30, 0x93, 0x22, 0xe9, 0x41, 0x69, + 0xdb, 0xa5, 0x9d, 0x56, 0x3c, 0x04, 0x47, 0xd4, 0xd2, 0xae, 0x49, 0x6a, 0xe2, 0x6a, 0x40, 0xfd, + 0x43, 0xcd, 0xc5, 0xfe, 0xb1, 0x05, 0x33, 0xb5, 0x7e, 0xb4, 0xc3, 0x74, 0x94, 0x26, 0xb7, 0xc6, + 0x11, 0x0f, 0x8a, 0xa1, 0xdb, 0xde, 0x7b, 0x21, 0x9f, 0xc5, 0xb8, 0xc1, 0x48, 0xc9, 0x2b, 0x12, + 0xad, 0xac, 0xf3, 0x42, 0x14, 0x6c, 0x48, 0x00, 0x13, 0xbe, 0xd3, 0x8f, 0x76, 0x9e, 0x93, 0x9f, + 0x3c, 0xa2, 0x65, 0xe2, 0x16, 0xfb, 0x9c, 0xe7, 0x24, 0x47, 0xad, 0x32, 0x8a, 0x52, 0x94, 0x9c, + 0xec, 0x2f, 0xc2, 0x4c, 0xf2, 0xde, 0xed, 0x04, 0x63, 0xf6, 0x71, 0x28, 0x38, 0x81, 0x27, 0x47, + 0x6c, 0x45, 0x22, 0x14, 0x6a, 0x78, 0x13, 0x59, 0x39, 0x79, 0x16, 0x4a, 0xdb, 0xfd, 0x4e, 0x87, + 0x9f, 0x2b, 0xc4, 0x25, 0x97, 0x3e, 0x16, 0x5d, 0x93, 0xe5, 0xa8, 0x31, 0xec, 0xff, 0x3d, 0x0e, + 0xb3, 0xf5, 0x4e, 0x9f, 0xbe, 0x1a, 0x50, 0xaa, 0x6c, 0x41, 0x35, 0x98, 0xed, 0x05, 0x74, 0xcf, + 0xa5, 0xf7, 0x1a, 0xb4, 0x43, 0x9b, 0x91, 0x1f, 0x48, 0x69, 0x1e, 0x96, 0x84, 0x66, 0x37, 0x92, + 0x60, 0x4c, 0xe3, 0x93, 0x57, 0x60, 0xc6, 0x69, 0x46, 0xee, 0x1e, 0xd5, 0x14, 0x84, 0xb8, 0x0f, + 0x49, 0x0a, 0x33, 0xb5, 0x04, 0x14, 0x53, 0xd8, 0xe4, 0xb3, 0x30, 0x1f, 0x36, 0x9d, 0x0e, 0xbd, + 0xdd, 0x93, 0xac, 0x96, 0x77, 0x68, 0x73, 0x77, 0xc3, 0x77, 0xbd, 0x48, 0xda, 0x1d, 0x9f, 0x90, + 0x94, 0xe6, 0x1b, 0x43, 0xf0, 0x70, 0x28, 0x05, 0xf2, 0x2f, 0x2d, 0x78, 0xbc, 0x17, 0xd0, 0x8d, + 0xc0, 0xef, 0xfa, 0x6c, 0xa8, 0x0d, 0x98, 0xc3, 0xa4, 0x59, 0xe8, 0x8d, 0x11, 0x75, 0x29, 0x51, + 0x32, 0x78, 0x87, 0xf3, 0xe1, 0xc3, 0x83, 0xea, 0xe3, 0x1b, 0x47, 0x09, 0x80, 0x47, 0xcb, 0x47, + 0xfe, 0x95, 0x05, 0x57, 0x7a, 0x7e, 0x18, 0x1d, 0xf1, 0x09, 0xc5, 0x73, 0xfd, 0x04, 0xfb, 0xf0, + 0xa0, 0x7a, 0x65, 0xe3, 0x48, 0x09, 0xf0, 0x18, 0x09, 0xed, 0xc3, 0x0a, 0x5c, 0x30, 0xc6, 0x9e, + 0x34, 0xe6, 0xbc, 0x0c, 0xd3, 0x6a, 0x30, 0xc4, 0xba, 0x4f, 0x39, 0xb6, 0xed, 0xd5, 0x4c, 0x20, + 0x26, 0x71, 0xd9, 0xb8, 0xd3, 0x43, 0x51, 0xd4, 0x4e, 0x8d, 0xbb, 0x8d, 0x04, 0x14, 0x53, 0xd8, + 0x64, 0x15, 0x2e, 0xca, 0x12, 0xa4, 0xbd, 0x8e, 0xdb, 0x74, 0x96, 0xfd, 0xbe, 0x1c, 0x72, 0xc5, + 0xfa, 0xc3, 0x87, 0x07, 0xd5, 0x8b, 0x1b, 0x83, 0x60, 0xcc, 0xaa, 0x43, 0xd6, 0xe0, 0x92, 0xd3, + 0x8f, 0x7c, 0xfd, 0xfd, 0x57, 0x3d, 0xb6, 0x9d, 0xb6, 0xf8, 0xd0, 0x2a, 0x89, 0x7d, 0xb7, 0x96, + 0x01, 0xc7, 0xcc, 0x5a, 0x64, 0x23, 0x45, 0xad, 0x41, 0x9b, 0xbe, 0xd7, 0x12, 0xbd, 0x5c, 0x8c, + 0x8f, 0x81, 0xb5, 0x0c, 0x1c, 0xcc, 0xac, 0x49, 0x3a, 0x30, 0xd3, 0x75, 0xee, 0xdf, 0xf6, 0x9c, + 0x3d, 0xc7, 0xed, 0x30, 0x26, 0xd2, 0x5e, 0x38, 0xdc, 0xca, 0xd4, 0x8f, 0xdc, 0xce, 0xa2, 0xf0, + 0xe3, 0x58, 0x5c, 0xf5, 0xa2, 0x5b, 0x41, 0x23, 0x62, 0x9a, 0xba, 0xd0, 0x20, 0xd7, 0x13, 0xb4, + 0x30, 0x45, 0x9b, 0xdc, 0x82, 0xcb, 0x7c, 0x3a, 0xae, 0xf8, 0xf7, 0xbc, 0x15, 0xda, 0x71, 0xf6, + 0xd5, 0x07, 0x4c, 0xf2, 0x0f, 0x78, 0xe4, 0xf0, 0xa0, 0x7a, 0xb9, 0x91, 0x85, 0x80, 0xd9, 0xf5, + 0x88, 0x03, 0x8f, 0x26, 0x01, 0x48, 0xf7, 0xdc, 0xd0, 0xf5, 0x3d, 0x61, 0x96, 0x2b, 0xc5, 0x66, + 0xb9, 0xc6, 0x70, 0x34, 0x3c, 0x8a, 0x06, 0xf9, 0x7b, 0x16, 0x5c, 0xca, 0x9a, 0x86, 0xf3, 0xe5, + 0x3c, 0x6e, 0x93, 0x53, 0x53, 0x4b, 0x8c, 0x88, 0xcc, 0x45, 0x21, 0x53, 0x08, 0xf2, 0x8e, 0x05, + 0x53, 0x8e, 0x71, 0x82, 0x9e, 0x87, 0x3c, 0x76, 0x2d, 0xf3, 0x4c, 0x5e, 0x9f, 0x3b, 0x3c, 0xa8, + 0x26, 0x4e, 0xe9, 0x98, 0xe0, 0x48, 0xfe, 0x81, 0x05, 0x97, 0x33, 0xe7, 0xf8, 0x7c, 0xe5, 0x3c, + 0x5a, 0x88, 0x0f, 0x92, 0xec, 0x35, 0x27, 0x5b, 0x0c, 0xf2, 0x2d, 0x4b, 0x6f, 0x65, 0xea, 0x82, + 0x71, 0x7e, 0x8a, 0x8b, 0x36, 0xa2, 0xc1, 0xc3, 0x50, 0xa3, 0x14, 0xe1, 0xfa, 0x45, 0x63, 0x67, + 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x69, 0xa9, 0xad, 0x51, 0x4b, 0x34, 0x7d, 0x5e, 0x12, 0x91, + 0x78, 0xa7, 0xd5, 0x02, 0xa5, 0x98, 0x93, 0x9f, 0x81, 0x05, 0x67, 0xcb, 0x0f, 0xa2, 0xcc, 0xc9, + 0x37, 0x3f, 0xc3, 0xa7, 0xd1, 0x95, 0xc3, 0x83, 0xea, 0x42, 0x6d, 0x28, 0x16, 0x1e, 0x41, 0xc1, + 0xfe, 0x8d, 0x22, 0x4c, 0x89, 0x93, 0x90, 0xdc, 0xba, 0x7e, 0xdb, 0x82, 0xc7, 0x9a, 0xfd, 0x20, + 0xa0, 0x5e, 0xd4, 0x88, 0x68, 0x6f, 0x70, 0xe3, 0xb2, 0xce, 0x75, 0xe3, 0x7a, 0xe2, 0xf0, 0xa0, + 0xfa, 0xd8, 0xf2, 0x11, 0xfc, 0xf1, 0x48, 0xe9, 0xc8, 0xbf, 0xb3, 0xc0, 0x96, 0x08, 0x75, 0xa7, + 0xb9, 0xdb, 0x0e, 0xfc, 0xbe, 0xd7, 0x1a, 0xfc, 0x88, 0xb1, 0x73, 0xfd, 0x88, 0xa7, 0x0e, 0x0f, + 0xaa, 0xf6, 0xf2, 0xb1, 0x52, 0xe0, 0x09, 0x24, 0x25, 0xaf, 0xc2, 0x05, 0x89, 0x75, 0xf5, 0x7e, + 0x8f, 0x06, 0x2e, 0x3b, 0x73, 0x48, 0xc5, 0x31, 0xf6, 0x4d, 0x4b, 0x23, 0xe0, 0x60, 0x1d, 0x12, + 0xc2, 0xe4, 0x3d, 0xea, 0xb6, 0x77, 0x22, 0xa5, 0x3e, 0x8d, 0xe8, 0x90, 0x26, 0xad, 0x22, 0x77, + 0x04, 0xcd, 0x7a, 0xe5, 0xf0, 0xa0, 0x3a, 0x29, 0xff, 0xa0, 0xe2, 0x44, 0x6e, 0xc2, 0x8c, 0x38, + 0xa7, 0x6e, 0xb8, 0x5e, 0x7b, 0xc3, 0xf7, 0x84, 0x57, 0x55, 0xb9, 0xfe, 0x94, 0xda, 0xf0, 0x1b, + 0x09, 0xe8, 0x7b, 0x07, 0xd5, 0x29, 0xf5, 0x7b, 0x73, 0xbf, 0x47, 0x31, 0x55, 0xdb, 0xfe, 0xbd, + 0x09, 0x00, 0x35, 0x5c, 0x69, 0x8f, 0x7c, 0x04, 0xca, 0x21, 0x8d, 0x04, 0x57, 0x79, 0x93, 0x24, + 0xee, 0xff, 0x54, 0x21, 0xc6, 0x70, 0xb2, 0x0b, 0xc5, 0x9e, 0xd3, 0x0f, 0x69, 0x3e, 0xe7, 0x07, + 0xd9, 0xf9, 0x1b, 0x8c, 0xa2, 0x38, 0x98, 0xf2, 0x9f, 0x28, 0x78, 0x90, 0xaf, 0x58, 0x00, 0x34, + 0xd9, 0x61, 0x23, 0x1b, 0x88, 0x24, 0xcb, 0xb8, 0x4f, 0x59, 0x1b, 0xd4, 0x67, 0x0e, 0x0f, 0xaa, + 0x60, 0x74, 0xbd, 0xc1, 0x96, 0xdc, 0x83, 0x92, 0xa3, 0xd6, 0xfc, 0xf1, 0xf3, 0x58, 0xf3, 0xf9, + 0x79, 0x51, 0x0f, 0x5a, 0xcd, 0x8c, 0x7c, 0xcd, 0x82, 0x99, 0x90, 0x46, 0xb2, 0xab, 0xd8, 0xca, + 0x23, 0x15, 0xde, 0x11, 0x07, 0x5d, 0x23, 0x41, 0x53, 0xac, 0xa0, 0xc9, 0x32, 0x4c, 0xf1, 0x55, + 0xa2, 0x5c, 0xa7, 0x4e, 0x8b, 0x06, 0xdc, 0x1c, 0x21, 0x35, 0xa9, 0xd1, 0x45, 0x31, 0x68, 0x6a, + 0x51, 0x8c, 0x32, 0x4c, 0xf1, 0x55, 0xa2, 0xac, 0xbb, 0x41, 0xe0, 0x4b, 0x51, 0x4a, 0x39, 0x89, + 0x62, 0xd0, 0xd4, 0xa2, 0x18, 0x65, 0x98, 0xe2, 0x6b, 0x7f, 0x67, 0x1a, 0x66, 0xd4, 0x44, 0x8a, + 0x35, 0x7b, 0x61, 0xfd, 0x1a, 0xa2, 0xd9, 0x2f, 0x9b, 0x40, 0x4c, 0xe2, 0xb2, 0xca, 0x62, 0xaa, + 0x26, 0x15, 0x7b, 0x5d, 0xb9, 0x61, 0x02, 0x31, 0x89, 0x4b, 0xba, 0x50, 0x0c, 0x23, 0xda, 0x53, + 0x3e, 0x07, 0x23, 0x5e, 0x89, 0xc7, 0xeb, 0x83, 0x61, 0x49, 0x60, 0xe4, 0x51, 0x70, 0xe1, 0x06, + 0xdc, 0x28, 0x61, 0xd3, 0x95, 0x93, 0x23, 0x9f, 0xf9, 0x99, 0x34, 0x17, 0x8b, 0xde, 0x48, 0x96, + 0x61, 0x8a, 0x7d, 0x86, 0xb2, 0x5f, 0x3c, 0x47, 0x65, 0xff, 0xd3, 0x50, 0xea, 0x3a, 0xf7, 0x1b, + 0xfd, 0xa0, 0x7d, 0xf6, 0x43, 0x85, 0xf4, 0x21, 0x15, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb2, 0x8c, + 0x25, 0x47, 0x38, 0x18, 0xdc, 0xc9, 0x77, 0xc9, 0xd1, 0x7b, 0xe5, 0xd0, 0xc5, 0x67, 0x40, 0xf5, + 0x2e, 0x3d, 0x70, 0xd5, 0x9b, 0xa9, 0x91, 0x62, 0x82, 0x68, 0x35, 0xb2, 0x7c, 0xae, 0x6a, 0xe4, + 0x72, 0x82, 0x19, 0xa6, 0x98, 0x73, 0x79, 0xc4, 0x9c, 0xd3, 0xf2, 0xc0, 0xb9, 0xca, 0xd3, 0x48, + 0x30, 0xc3, 0x14, 0xf3, 0xe1, 0xe7, 0xcd, 0xca, 0xf9, 0x9c, 0x37, 0xa7, 0x72, 0x38, 0x6f, 0x1e, + 0xad, 0x8a, 0x4f, 0x8f, 0xaa, 0x8a, 0x93, 0x1b, 0x40, 0x5a, 0xfb, 0x9e, 0xd3, 0x75, 0x9b, 0x72, + 0xb1, 0xe4, 0xdb, 0xe6, 0x0c, 0xb7, 0x47, 0x2c, 0xc8, 0x85, 0x8c, 0xac, 0x0c, 0x60, 0x60, 0x46, + 0x2d, 0x12, 0x41, 0xa9, 0xa7, 0x34, 0xae, 0xd9, 0x3c, 0x46, 0xbf, 0xd2, 0xc0, 0x84, 0xdf, 0x08, + 0x9b, 0x78, 0xaa, 0x04, 0x35, 0x27, 0xb2, 0x06, 0x97, 0xba, 0xae, 0xb7, 0xe1, 0xb7, 0xc2, 0x0d, + 0x1a, 0x48, 0x6b, 0x4b, 0x83, 0x46, 0xf3, 0x73, 0xbc, 0x6d, 0xf8, 0x09, 0x7a, 0x3d, 0x03, 0x8e, + 0x99, 0xb5, 0xec, 0xff, 0x65, 0xc1, 0xdc, 0x72, 0xc7, 0xef, 0xb7, 0xee, 0x38, 0x51, 0x73, 0x47, + 0xb8, 0x29, 0x90, 0x57, 0xa0, 0xe4, 0x7a, 0x11, 0x0d, 0xf6, 0x9c, 0x8e, 0xdc, 0x9f, 0x6c, 0x65, + 0x3e, 0x5d, 0x95, 0xe5, 0xef, 0x1d, 0x54, 0x67, 0x56, 0xfa, 0x01, 0xb7, 0x52, 0x8b, 0xd5, 0x0a, + 0x75, 0x1d, 0xf2, 0x1d, 0x0b, 0x2e, 0x08, 0x47, 0x87, 0x15, 0x27, 0x72, 0x5e, 0xef, 0xd3, 0xc0, + 0xa5, 0xca, 0xd5, 0x61, 0xc4, 0x85, 0x2a, 0x2d, 0xab, 0x62, 0xb0, 0x1f, 0x2b, 0xea, 0xeb, 0x69, + 0xce, 0x38, 0x28, 0x8c, 0xfd, 0x4b, 0x05, 0x78, 0x64, 0x28, 0x2d, 0xb2, 0x00, 0x63, 0x6e, 0x4b, + 0x7e, 0x3a, 0x48, 0xba, 0x63, 0xab, 0x2d, 0x1c, 0x73, 0x5b, 0x64, 0x91, 0xeb, 0x9c, 0x01, 0x0d, + 0x43, 0x75, 0xe1, 0x5c, 0xd6, 0xea, 0xa1, 0x2c, 0x45, 0x03, 0x83, 0x54, 0xa1, 0xc8, 0xfd, 0x87, + 0xe5, 0x79, 0x82, 0x6b, 0xb1, 0xdc, 0x55, 0x17, 0x45, 0x39, 0xf9, 0xb2, 0x05, 0x20, 0x04, 0x64, + 0xa7, 0x11, 0xb9, 0x4b, 0x62, 0xbe, 0xcd, 0xc4, 0x28, 0x0b, 0x29, 0xe3, 0xff, 0x68, 0x70, 0x25, + 0x9b, 0x30, 0xc1, 0x14, 0x5a, 0xbf, 0x75, 0xe6, 0x4d, 0x91, 0xdf, 0x44, 0x6d, 0x70, 0x1a, 0x28, + 0x69, 0xb1, 0xb6, 0x0a, 0x68, 0xd4, 0x0f, 0x3c, 0xd6, 0xb4, 0x7c, 0x1b, 0x2c, 0x09, 0x29, 0x50, + 0x97, 0xa2, 0x81, 0x61, 0xff, 0xf3, 0x31, 0xb8, 0x94, 0x25, 0x3a, 0xdb, 0x6d, 0x26, 0x84, 0xb4, + 0xf2, 0x68, 0xfc, 0x53, 0xf9, 0xb7, 0x8f, 0xf4, 0xd9, 0xd1, 0xd7, 0x14, 0xd2, 0x81, 0x52, 0xf2, + 0x25, 0x3f, 0xa5, 0x5b, 0x68, 0xec, 0x8c, 0x2d, 0xa4, 0x29, 0xa7, 0x5a, 0xe9, 0x09, 0x18, 0x0f, + 0x59, 0xcf, 0x17, 0x92, 0xd7, 0x1d, 0xbc, 0x8f, 0x38, 0x84, 0x61, 0xf4, 0x3d, 0x37, 0x92, 0x41, + 0x37, 0x1a, 0xe3, 0xb6, 0xe7, 0x46, 0xc8, 0x21, 0xf6, 0xb7, 0xc7, 0x60, 0x61, 0xf8, 0x47, 0x91, + 0x6f, 0x5b, 0x00, 0x2d, 0x76, 0x5c, 0x09, 0xb9, 0xe7, 0xba, 0xf0, 0x71, 0x72, 0xce, 0xab, 0x0d, + 0x57, 0x14, 0xa7, 0xd8, 0xf9, 0x4e, 0x17, 0x85, 0x68, 0x08, 0x42, 0x9e, 0x53, 0x43, 0x9f, 0x5f, + 0xd5, 0x88, 0xc9, 0xa4, 0xeb, 0xac, 0x6b, 0x08, 0x1a, 0x58, 0xec, 0x3c, 0xea, 0x39, 0x5d, 0x1a, + 0xf6, 0x1c, 0x1d, 0xc2, 0xc4, 0xcf, 0xa3, 0x37, 0x55, 0x21, 0xc6, 0x70, 0xbb, 0x03, 0x4f, 0x9e, + 0x40, 0xce, 0x9c, 0x22, 0x44, 0xec, 0xff, 0x61, 0xc1, 0xc3, 0xd2, 0xfd, 0xec, 0xff, 0x1b, 0x5f, + 0xc6, 0x3f, 0xb3, 0xe0, 0xd1, 0x21, 0xdf, 0xfc, 0x00, 0x5c, 0x1a, 0xdf, 0x4a, 0xba, 0x34, 0xde, + 0x1e, 0x75, 0x48, 0x67, 0x7e, 0xc7, 0x10, 0xcf, 0xc6, 0x7f, 0x53, 0x80, 0x69, 0xb6, 0x6c, 0xb5, + 0xfc, 0x76, 0x4e, 0x1b, 0xe7, 0x93, 0x50, 0xfc, 0x3c, 0xdb, 0x80, 0xd2, 0x83, 0x8c, 0xef, 0x4a, 0x28, 0x60, 0xe4, 0x2b, 0x16, 0x4c, 0x7e, 0x5e, 0xee, 0xa9, 0xe2, 0x2c, 0x37, 0xe2, 0x62, 0x98, - 0xf8, 0x86, 0x45, 0xb9, 0x43, 0x8a, 0x38, 0x0b, 0xed, 0x3b, 0xa8, 0xb6, 0x52, 0xc5, 0x99, 0x3c, - 0x0f, 0x93, 0xdb, 0x7e, 0xd0, 0xe9, 0xb5, 0x9d, 0x74, 0x70, 0xdf, 0x75, 0x51, 0x8c, 0x0a, 0xce, - 0x26, 0xb9, 0xd3, 0x75, 0xdf, 0xa2, 0x41, 0x28, 0xdc, 0xee, 0x13, 0x93, 0xbc, 0xaa, 0x21, 0x68, - 0x60, 0xf1, 0x3a, 0xad, 0x56, 0x40, 0x5b, 0x4e, 0xe4, 0x07, 0x7c, 0xe7, 0x30, 0xeb, 0x68, 0x08, - 0x1a, 0x58, 0x0b, 0x9f, 0x84, 0x69, 0x53, 0xf8, 0x63, 0xc5, 0x6c, 0x7c, 0x0a, 0xa4, 0x13, 0x61, - 0x6a, 0x49, 0xb2, 0x86, 0x59, 0x92, 0xec, 0xff, 0x30, 0x06, 0x86, 0x75, 0xe8, 0x31, 0x4c, 0x75, - 0x2f, 0x31, 0xd5, 0x47, 0xb4, 0x6c, 0x18, 0xb6, 0xae, 0x41, 0x11, 0x6c, 0x7b, 0xa9, 0x08, 0xb6, - 0x5b, 0xb9, 0x71, 0x3c, 0x3a, 0x80, 0xed, 0xfb, 0x16, 0x3c, 0x1d, 0x23, 0xf7, 0x1b, 0x6e, 0x1f, - 0xbd, 0x6e, 0xbf, 0x0c, 0x65, 0x27, 0xae, 0x26, 0x27, 0x96, 0x11, 0x3e, 0xa4, 0x41, 0x68, 0xe2, - 0xc5, 0xa1, 0x0f, 0x85, 0x13, 0x86, 0x3e, 0x8c, 0x1f, 0x1d, 0xfa, 0x60, 0xff, 0x68, 0x0c, 0x2e, - 0xf6, 0x7f, 0x99, 0x5a, 0x71, 0x86, 0xf3, 0x82, 0x78, 0x05, 0xa6, 0x23, 0x59, 0xc1, 0xd8, 0x3f, - 0x75, 0x28, 0xf3, 0xa6, 0x01, 0xc3, 0x04, 0x26, 0xab, 0xd9, 0x10, 0x6b, 0x5d, 0xbd, 0xe1, 0x77, - 0x55, 0xd8, 0x8e, 0xae, 0xb9, 0x6c, 0xc0, 0x30, 0x81, 0xa9, 0x7d, 0x86, 0xc7, 0x4f, 0xdd, 0x67, - 0xb8, 0x0e, 0x17, 0x94, 0x97, 0xe4, 0x75, 0x3f, 0x90, 0xfe, 0xff, 0x6a, 0x05, 0x99, 0xaa, 0x5d, - 0x94, 0x55, 0x2e, 0x60, 0x16, 0x12, 0x66, 0xd7, 0xb5, 0xbf, 0x5f, 0x80, 0x73, 0x71, 0xb3, 0x2f, - 0xfb, 0x5e, 0xd3, 0xe5, 0x8e, 0x36, 0xaf, 0xc2, 0x78, 0xb4, 0xdf, 0x55, 0x8d, 0xfd, 0x17, 0x95, - 0x38, 0x9b, 0xfb, 0x5d, 0xd6, 0xdb, 0x4f, 0x66, 0x54, 0xe1, 0xa6, 0x73, 0x5e, 0x89, 0xac, 0xe9, - 0xd9, 0x21, 0x7a, 0xe0, 0xa5, 0xe4, 0x68, 0x7e, 0x78, 0x50, 0xc9, 0x88, 0xe4, 0x5f, 0xd4, 0x94, - 0x92, 0x63, 0x9e, 0xdc, 0x83, 0x99, 0xb6, 0x13, 0x46, 0x77, 0xba, 0x4d, 0x27, 0xa2, 0x9b, 0xae, - 0x74, 0x61, 0x39, 0x5e, 0xc8, 0x84, 0xbe, 0xeb, 0x5f, 0x4b, 0x50, 0xc2, 0x14, 0x65, 0xb2, 0x07, - 0x84, 0x95, 0x6c, 0x06, 0x8e, 0x17, 0x8a, 0xaf, 0x62, 0xfc, 0x8e, 0x1f, 0xff, 0xa2, 0x8f, 0xce, - 0x6b, 0x7d, 0xd4, 0x30, 0x83, 0x03, 0x79, 0x0e, 0x26, 0x02, 0xea, 0x84, 0x7a, 0x3b, 0xd0, 0xf3, - 0x1f, 0x79, 0x29, 0x4a, 0xa8, 0x39, 0xa1, 0x26, 0x1e, 0x31, 0xa1, 0xfe, 0xd0, 0x82, 0x99, 0xb8, - 0x9b, 0x1e, 0x83, 0xea, 0xd1, 0x49, 0xaa, 0x1e, 0x37, 0xf2, 0x5a, 0x12, 0x07, 0x68, 0x1b, 0x7f, - 0x32, 0x69, 0x7e, 0x1f, 0x0f, 0x18, 0xf8, 0x02, 0x94, 0xd4, 0xac, 0x56, 0x3a, 0xfd, 0x88, 0x16, - 0x88, 0x84, 0xb6, 0x67, 0x44, 0xf1, 0x49, 0x26, 0x18, 0xf3, 0x63, 0xba, 0x4e, 0x53, 0xea, 0x31, - 0x72, 0xd8, 0x6b, 0x5d, 0x47, 0xe9, 0x37, 0x59, 0xba, 0x8e, 0xaa, 0x43, 0xee, 0xc0, 0x93, 0xdd, - 0xc0, 0xe7, 0xb1, 0xe4, 0x2b, 0xd4, 0x69, 0xb6, 0x5d, 0x8f, 0x2a, 0x33, 0x8f, 0x70, 0x35, 0x79, - 0xfa, 0xf0, 0xa0, 0xf2, 0xe4, 0x46, 0x36, 0x0a, 0x0e, 0xaa, 0x9b, 0x8c, 0x46, 0x1c, 0x1f, 0x22, - 0x1a, 0xf1, 0x6f, 0x68, 0x63, 0x2a, 0x0d, 0x65, 0x4c, 0xe0, 0x67, 0xf2, 0xea, 0xca, 0x8c, 0x65, - 0x3d, 0x1e, 0x52, 0x55, 0xc9, 0x14, 0x35, 0xfb, 0xc1, 0x16, 0xbb, 0x89, 0x13, 0x5a, 0xec, 0xe2, - 0xb8, 0x8b, 0xc9, 0x1f, 0x67, 0xdc, 0xc5, 0xd4, 0x07, 0x2a, 0xd4, 0xf2, 0x3b, 0x16, 0x9c, 0x73, - 0xfa, 0xa3, 0x8c, 0xf3, 0x31, 0x1e, 0x67, 0x84, 0x2f, 0xd7, 0x9e, 0x96, 0x42, 0x66, 0x05, 0x73, - 0x63, 0x96, 0x28, 0xf6, 0xfb, 0x45, 0x98, 0x4b, 0x2b, 0x49, 0xa7, 0x1f, 0x8e, 0xf9, 0xb7, 0x2c, - 0x98, 0x53, 0x13, 0x5c, 0xf0, 0xd4, 0x47, 0x8c, 0xb5, 0x9c, 0xd6, 0x15, 0xa1, 0xee, 0xe9, 0x2c, - 0x19, 0x9b, 0x29, 0x6e, 0xd8, 0xc7, 0x9f, 0xbc, 0x0d, 0x65, 0x7d, 0xab, 0x72, 0xa2, 0xd8, 0x4c, - 0x1e, 0x3e, 0x58, 0x8d, 0x49, 0xa0, 0x49, 0x8f, 0xbc, 0x6f, 0x01, 0x34, 0xd4, 0x4e, 0xac, 0x16, - 0x80, 0x37, 0xf3, 0x5a, 0x00, 0xf4, 0x1e, 0x1f, 0xeb, 0xf3, 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, - 0x05, 0x7e, 0x9f, 0xa2, 0x47, 0x82, 0xc8, 0xbe, 0x31, 0xb2, 0xdb, 0xfb, 0x11, 0xba, 0x73, 0xac, - 0xed, 0x19, 0xa0, 0x10, 0x13, 0x42, 0xd8, 0xaf, 0x82, 0x76, 0x54, 0x66, 0x2b, 0x2b, 0x77, 0x55, - 0xde, 0x70, 0xa2, 0x1d, 0x39, 0x04, 0xf5, 0xca, 0x7a, 0x5d, 0x01, 0x30, 0xc6, 0xb1, 0x3f, 0x07, - 0x33, 0xaf, 0x07, 0x4e, 0x77, 0xc7, 0xe5, 0xf7, 0x16, 0xec, 0x7c, 0xfc, 0x3c, 0x4c, 0x3a, 0xcd, - 0x66, 0x56, 0x42, 0x97, 0xaa, 0x28, 0x46, 0x05, 0x1f, 0xea, 0x28, 0x6c, 0xff, 0xae, 0x05, 0x24, - 0xbe, 0xfb, 0x75, 0xbd, 0xd6, 0xba, 0x13, 0x35, 0x76, 0xd8, 0x11, 0x6e, 0x87, 0x97, 0x66, 0x1d, - 0xe1, 0x6e, 0x68, 0x08, 0x1a, 0x58, 0xe4, 0x5d, 0x28, 0x8b, 0x7f, 0x6f, 0xe9, 0x03, 0xe2, 0xe8, - 0xfe, 0xd6, 0x7c, 0xcf, 0xe3, 0x32, 0x89, 0x51, 0x78, 0x23, 0xe6, 0x80, 0x26, 0x3b, 0xd6, 0x54, - 0xab, 0xde, 0x76, 0xbb, 0xf7, 0xa0, 0xb9, 0x15, 0x37, 0x55, 0x37, 0xf0, 0xb7, 0xdd, 0x36, 0x4d, - 0x37, 0xd5, 0x86, 0x28, 0x46, 0x05, 0x1f, 0xae, 0xa9, 0xfe, 0x95, 0x05, 0xe7, 0x57, 0xc3, 0xc8, - 0xf5, 0x57, 0x68, 0x18, 0xb1, 0x9d, 0x8f, 0xad, 0x8f, 0xbd, 0xf6, 0x30, 0x31, 0x07, 0x2b, 0x30, - 0x27, 0xef, 0xa1, 0x7b, 0x5b, 0x21, 0x8d, 0x8c, 0xa3, 0x86, 0x9e, 0xc7, 0xcb, 0x29, 0x38, 0xf6, - 0xd5, 0x60, 0x54, 0xe4, 0x85, 0x74, 0x4c, 0xa5, 0x90, 0xa4, 0x52, 0x4f, 0xc1, 0xb1, 0xaf, 0x86, - 0xfd, 0xbd, 0x02, 0x9c, 0xe3, 0x9f, 0x91, 0x8a, 0x17, 0xfa, 0xe6, 0xa0, 0x78, 0xa1, 0x11, 0xa7, - 0x32, 0xe7, 0x75, 0x82, 0x68, 0xa1, 0xbf, 0x69, 0xc1, 0x6c, 0x33, 0xd9, 0xd2, 0xf9, 0xd8, 0xe5, - 0xb2, 0xfa, 0x50, 0xb8, 0xdd, 0xa5, 0x0a, 0x31, 0xcd, 0x9f, 0xfc, 0xa2, 0x05, 0xb3, 0x49, 0x31, - 0xd5, 0xea, 0x7e, 0x0a, 0x8d, 0xa4, 0xfd, 0xe4, 0x93, 0xe5, 0x21, 0xa6, 0x45, 0xb0, 0x7f, 0x6f, - 0x4c, 0x76, 0xe9, 0x69, 0x04, 0xc3, 0x90, 0xfb, 0x50, 0x8a, 0xda, 0xa1, 0x28, 0x94, 0x5f, 0x3b, - 0xe2, 0xa1, 0x75, 0x73, 0xad, 0x2e, 0x5c, 0x40, 0x62, 0xbd, 0x52, 0x96, 0x30, 0xfd, 0x58, 0xf1, - 0xe2, 0x8c, 0x1b, 0x5d, 0xc9, 0x38, 0x97, 0xd3, 0xf2, 0xe6, 0xf2, 0x46, 0x9a, 0xb1, 0x2c, 0x61, - 0x8c, 0x15, 0x2f, 0xfb, 0x57, 0x2d, 0x28, 0xdd, 0xf4, 0xd5, 0x3a, 0xf2, 0x33, 0x39, 0xd8, 0xa2, - 0xb4, 0xca, 0xaa, 0x95, 0x96, 0xf8, 0x14, 0xf4, 0x5a, 0xc2, 0x12, 0xf5, 0x8c, 0x41, 0x7b, 0x91, - 0xe7, 0xb5, 0x63, 0xa4, 0x6e, 0xfa, 0x5b, 0x03, 0xcd, 0xc7, 0xbf, 0x54, 0x84, 0x33, 0x6f, 0x38, - 0xfb, 0xd4, 0x8b, 0x9c, 0xe3, 0x6f, 0x12, 0x2f, 0x43, 0xd9, 0xe9, 0xf2, 0xbb, 0x4c, 0xe3, 0x18, - 0x12, 0x1b, 0x77, 0x62, 0x10, 0x9a, 0x78, 0xf1, 0x82, 0x26, 0x22, 0x53, 0xb2, 0x96, 0xa2, 0xe5, - 0x14, 0x1c, 0xfb, 0x6a, 0x90, 0x9b, 0x40, 0x64, 0x20, 0x75, 0xb5, 0xd1, 0xf0, 0x7b, 0x9e, 0x58, - 0xd2, 0x84, 0xdd, 0x47, 0x9f, 0x87, 0xd7, 0xfb, 0x30, 0x30, 0xa3, 0x16, 0xf9, 0x2c, 0xcc, 0x37, - 0x38, 0x65, 0x79, 0x3a, 0x32, 0x29, 0x8a, 0x13, 0xb2, 0x8e, 0xf5, 0x58, 0x1e, 0x80, 0x87, 0x03, - 0x29, 0x30, 0x49, 0xc3, 0xc8, 0x0f, 0x9c, 0x16, 0x35, 0xe9, 0x4e, 0x24, 0x25, 0xad, 0xf7, 0x61, - 0x60, 0x46, 0x2d, 0xf2, 0x45, 0x28, 0x45, 0x3b, 0x01, 0x0d, 0x77, 0xfc, 0x76, 0x53, 0xfa, 0x9e, - 0x8c, 0x68, 0x0c, 0x94, 0xbd, 0xbf, 0xa9, 0xa8, 0x1a, 0xc3, 0x5b, 0x15, 0x61, 0xcc, 0x93, 0x04, - 0x30, 0x11, 0x36, 0xfc, 0x2e, 0x0d, 0xe5, 0xa9, 0xe2, 0x66, 0x2e, 0xdc, 0xb9, 0x71, 0xcb, 0x30, - 0x43, 0x72, 0x0e, 0x28, 0x39, 0xd9, 0xbf, 0x33, 0x06, 0xd3, 0x26, 0xe2, 0x10, 0x6b, 0xd3, 0x57, - 0x2c, 0x98, 0x6e, 0xf8, 0x5e, 0x14, 0xf8, 0x6d, 0x61, 0x62, 0xcb, 0x47, 0xa3, 0x60, 0xa4, 0x56, - 0x68, 0xe4, 0xb8, 0x6d, 0xc3, 0x5a, 0x67, 0xb0, 0xc1, 0x04, 0x53, 0xf2, 0x0d, 0x0b, 0x66, 0x63, - 0x57, 0xc5, 0xd8, 0xd6, 0x97, 0xab, 0x20, 0x7a, 0xa9, 0xbf, 0x96, 0xe4, 0x84, 0x69, 0xd6, 0xf6, - 0x16, 0xcc, 0xa5, 0x7b, 0x9b, 0x35, 0x65, 0xd7, 0x91, 0x73, 0xbd, 0x10, 0x37, 0xe5, 0x86, 0x13, - 0x86, 0xc8, 0x21, 0xe4, 0x05, 0x98, 0xea, 0x38, 0x41, 0xcb, 0xf5, 0x9c, 0x36, 0x6f, 0xc5, 0x82, - 0xb1, 0x20, 0xc9, 0x72, 0xd4, 0x18, 0xf6, 0xc7, 0x60, 0x7a, 0xdd, 0xf1, 0x5a, 0xb4, 0x29, 0xd7, - 0xe1, 0x47, 0x87, 0x63, 0xfe, 0xf1, 0x38, 0x94, 0x8d, 0xe3, 0xe3, 0xe9, 0x9f, 0xb3, 0x12, 0xc9, - 0x66, 0x0a, 0x39, 0x26, 0x9b, 0xf9, 0x34, 0xc0, 0xb6, 0xeb, 0xb9, 0xe1, 0xce, 0x09, 0xd3, 0xd8, - 0xf0, 0xbb, 0xf9, 0xeb, 0x9a, 0x02, 0x1a, 0xd4, 0xe2, 0x0b, 0xd0, 0xe2, 0x11, 0x19, 0xe1, 0xde, - 0xb7, 0x8c, 0xed, 0x66, 0x22, 0x0f, 0x87, 0x0f, 0xa3, 0x63, 0x16, 0xd5, 0xf6, 0x23, 0xee, 0xa6, - 0x8e, 0xda, 0x95, 0x36, 0x61, 0x2a, 0xa0, 0x61, 0xaf, 0x43, 0x4f, 0x94, 0x70, 0x86, 0xbb, 0xde, - 0xa0, 0xac, 0x8f, 0x9a, 0xd2, 0xc2, 0xab, 0x70, 0x26, 0x21, 0xc2, 0xb1, 0x6e, 0x98, 0x7c, 0xc8, - 0xb4, 0x51, 0x9c, 0xe4, 0xbe, 0x89, 0xf5, 0x45, 0xdb, 0x48, 0x34, 0xa3, 0xfb, 0x42, 0x38, 0x58, - 0x09, 0x98, 0xfd, 0xa3, 0x09, 0x90, 0x3e, 0x0c, 0x43, 0x2c, 0x57, 0xe6, 0xcd, 0xe5, 0xd8, 0x09, - 0x6e, 0x2e, 0x6f, 0xc2, 0xb4, 0xeb, 0xb9, 0x91, 0xeb, 0xb4, 0xb9, 0xfd, 0x49, 0x6e, 0xa7, 0xca, - 0x03, 0x7d, 0x7a, 0xd5, 0x80, 0x65, 0xd0, 0x49, 0xd4, 0x25, 0x6f, 0x42, 0x91, 0xef, 0x37, 0x72, - 0x00, 0x1f, 0xdf, 0xd1, 0x82, 0xfb, 0xd8, 0x88, 0xb0, 0x34, 0x41, 0x89, 0x1f, 0x3e, 0x44, 0xa6, - 0x1d, 0x7d, 0xfc, 0x96, 0xe3, 0x38, 0x3e, 0x7c, 0xa4, 0xe0, 0xd8, 0x57, 0x83, 0x51, 0xd9, 0x76, - 0xdc, 0x76, 0x2f, 0xa0, 0x31, 0x95, 0x89, 0x24, 0x95, 0xeb, 0x29, 0x38, 0xf6, 0xd5, 0x20, 0xdb, - 0x30, 0x2d, 0xcb, 0x84, 0xdb, 0xdc, 0xe4, 0x09, 0xbf, 0x92, 0xbb, 0x47, 0x5e, 0x37, 0x28, 0x61, - 0x82, 0x2e, 0xe9, 0xc1, 0x59, 0xd7, 0x6b, 0xf8, 0x5e, 0xa3, 0xdd, 0x0b, 0xdd, 0x3d, 0x1a, 0xc7, - 0x84, 0x9d, 0x84, 0xd9, 0x85, 0xc3, 0x83, 0xca, 0xd9, 0xd5, 0x34, 0x39, 0xec, 0xe7, 0x40, 0xbe, - 0x64, 0xc1, 0x85, 0x86, 0xef, 0x85, 0x3c, 0x75, 0xc5, 0x1e, 0xbd, 0x16, 0x04, 0x7e, 0x20, 0x78, - 0x97, 0x4e, 0xc8, 0x9b, 0x9b, 0x3d, 0x97, 0xb3, 0x48, 0x62, 0x36, 0x27, 0xf2, 0x0e, 0x4c, 0x75, - 0x03, 0x7f, 0xcf, 0x6d, 0xd2, 0x40, 0xba, 0x60, 0xae, 0xe5, 0x91, 0x4a, 0x67, 0x43, 0xd2, 0x8c, - 0x97, 0x1e, 0x55, 0x82, 0x9a, 0x9f, 0xfd, 0x7f, 0xca, 0x30, 0x93, 0x44, 0x27, 0x3f, 0x07, 0xd0, - 0x0d, 0xfc, 0x0e, 0x8d, 0x76, 0xa8, 0x8e, 0xed, 0xb9, 0x35, 0x6a, 0xc6, 0x16, 0x45, 0x4f, 0xb9, - 0x2d, 0xb1, 0xe5, 0x22, 0x2e, 0x45, 0x83, 0x23, 0x09, 0x60, 0x72, 0x57, 0x6c, 0xbb, 0x52, 0x0b, - 0x79, 0x23, 0x17, 0x9d, 0x49, 0x72, 0xe6, 0x41, 0x29, 0xb2, 0x08, 0x15, 0x23, 0xb2, 0x05, 0x85, - 0xfb, 0x74, 0x2b, 0x9f, 0x74, 0x01, 0x77, 0xa9, 0x3c, 0xcd, 0xd4, 0x26, 0x0f, 0x0f, 0x2a, 0x85, - 0xbb, 0x74, 0x0b, 0x19, 0x71, 0xf6, 0x5d, 0x4d, 0xe1, 0xbb, 0x20, 0x97, 0x8a, 0x37, 0x72, 0x74, - 0x84, 0x10, 0xdf, 0x25, 0x8b, 0x50, 0x31, 0x22, 0xef, 0x40, 0xe9, 0xbe, 0xb3, 0x47, 0xb7, 0x03, - 0xdf, 0x8b, 0xa4, 0xaf, 0xdc, 0x88, 0xe1, 0x1e, 0x77, 0x15, 0x39, 0xc9, 0x97, 0x6f, 0xef, 0xba, - 0x10, 0x63, 0x76, 0x64, 0x0f, 0xa6, 0x3c, 0x7a, 0x1f, 0x69, 0xdb, 0x6d, 0xe4, 0x13, 0x5e, 0x71, - 0x4b, 0x52, 0x93, 0x9c, 0xf9, 0xbe, 0xa7, 0xca, 0x50, 0xf3, 0x62, 0x7d, 0x79, 0xcf, 0xdf, 0x92, - 0x0b, 0xd5, 0x88, 0x7d, 0xa9, 0x4f, 0xa6, 0xa2, 0x2f, 0x6f, 0xfa, 0x5b, 0xc8, 0x88, 0xb3, 0x39, - 0xd2, 0xd0, 0x8e, 0x5a, 0x72, 0x99, 0xba, 0x95, 0xaf, 0x83, 0x9a, 0x98, 0x23, 0x71, 0x29, 0x1a, - 0x1c, 0x59, 0xdb, 0xb6, 0xa4, 0xb1, 0x52, 0x2e, 0x54, 0x23, 0xb6, 0x6d, 0xd2, 0xf4, 0x29, 0xda, - 0x56, 0x95, 0xa1, 0xe6, 0xc5, 0xf8, 0xba, 0xd2, 0xf2, 0x97, 0xcf, 0x52, 0x95, 0xb4, 0x23, 0x0a, - 0xbe, 0xaa, 0x0c, 0x35, 0x2f, 0xd6, 0xde, 0xe1, 0xee, 0xfe, 0x7d, 0xa7, 0xbd, 0xeb, 0x7a, 0x2d, - 0x19, 0xab, 0x3a, 0x6a, 0xd6, 0xe9, 0xdd, 0xfd, 0xbb, 0x82, 0x9e, 0xd9, 0xde, 0x71, 0x29, 0x1a, - 0x1c, 0xc9, 0xdf, 0xb3, 0x60, 0xa2, 0xdb, 0xee, 0xb5, 0x5c, 0x6f, 0x7e, 0x3a, 0x0f, 0x27, 0xa6, - 0xe4, 0x92, 0xbb, 0xb8, 0xc1, 0x49, 0x0b, 0x45, 0xf1, 0x27, 0xb5, 0xdf, 0x25, 0x2f, 0xfc, 0xfa, - 0x1f, 0x55, 0xe6, 0xa9, 0xd7, 0xf0, 0x9b, 0xae, 0xd7, 0x5a, 0xba, 0x17, 0xfa, 0xde, 0x22, 0x3a, - 0xf7, 0x95, 0x8e, 0x2e, 0x65, 0x5a, 0xf8, 0x04, 0x94, 0x0d, 0x12, 0x8f, 0x52, 0xf4, 0xa6, 0x4d, - 0x45, 0xef, 0x57, 0x27, 0x60, 0xda, 0xcc, 0x35, 0x39, 0x84, 0xf6, 0xa5, 0x4f, 0x1c, 0x63, 0xc7, - 0x39, 0x71, 0xb0, 0x23, 0xa6, 0x71, 0xc1, 0xa5, 0xcc, 0x5b, 0xab, 0xb9, 0x29, 0xdc, 0xf1, 0x11, - 0xd3, 0x28, 0x0c, 0x31, 0xc1, 0xf4, 0x18, 0x3e, 0x2f, 0x4c, 0x6d, 0x15, 0x8a, 0x5d, 0x31, 0xa9, - 0xb6, 0x26, 0x54, 0xb5, 0xab, 0x00, 0x71, 0x52, 0x44, 0x79, 0xf1, 0xa9, 0xf5, 0x61, 0x23, 0x59, - 0xa3, 0x81, 0x45, 0x9e, 0x83, 0x09, 0xa6, 0xfa, 0xd0, 0xa6, 0x0c, 0xa5, 0xd7, 0xe7, 0xf8, 0xeb, - 0xbc, 0x14, 0x25, 0x94, 0xbc, 0xc2, 0xb4, 0xd4, 0x58, 0x61, 0x91, 0x11, 0xf2, 0xe7, 0x63, 0x2d, - 0x35, 0x86, 0x61, 0x02, 0x93, 0x89, 0x4e, 0x99, 0x7e, 0xc1, 0xd7, 0x06, 0x43, 0x74, 0xae, 0x74, - 0xa0, 0x80, 0x71, 0xbb, 0x52, 0x4a, 0x1f, 0xe1, 0x73, 0xba, 0x68, 0xd8, 0x95, 0x52, 0x70, 0xec, - 0xab, 0xc1, 0x3e, 0x46, 0xde, 0xd9, 0x96, 0x85, 0xc3, 0xf4, 0x80, 0xdb, 0xd6, 0xaf, 0x9a, 0x67, - 0xad, 0x1c, 0xe7, 0x90, 0x18, 0xb5, 0xc3, 0x1f, 0xb6, 0x46, 0x3b, 0x16, 0x7d, 0x0e, 0x66, 0x92, - 0xbb, 0x50, 0xee, 0x37, 0x1f, 0x5f, 0x1b, 0x87, 0x73, 0xb7, 0x5a, 0xae, 0x97, 0x4e, 0x74, 0x96, - 0x95, 0xc4, 0xdf, 0x3a, 0x76, 0x12, 0x7f, 0x1d, 0x93, 0x27, 0x53, 0xe4, 0x67, 0xc7, 0xe4, 0xa9, - 0xf7, 0x0a, 0x92, 0xb8, 0xe4, 0x0f, 0x2d, 0x78, 0xc6, 0x69, 0x8a, 0x73, 0x81, 0xd3, 0x96, 0xa5, - 0x46, 0xee, 0x69, 0x39, 0xa3, 0xc3, 0x11, 0x77, 0xf9, 0xfe, 0x8f, 0x5f, 0xac, 0x1e, 0xc1, 0x55, - 0xf4, 0xf8, 0x4f, 0xc8, 0x2f, 0x78, 0xe6, 0x28, 0x54, 0x3c, 0x52, 0x7c, 0xf2, 0x57, 0x60, 0x36, - 0xf1, 0xc1, 0xd2, 0x12, 0x5e, 0x12, 0x17, 0x16, 0xf5, 0x24, 0x08, 0xd3, 0xb8, 0x0b, 0xb7, 0xe1, - 0xc3, 0x8f, 0x94, 0xf3, 0x58, 0x83, 0xed, 0xbb, 0x16, 0x4c, 0x9b, 0x39, 0x89, 0xc8, 0x0b, 0x30, - 0x15, 0xf9, 0xbb, 0xd4, 0xbb, 0x13, 0x28, 0x87, 0x5d, 0x3d, 0xd0, 0x37, 0x79, 0x39, 0xae, 0xa1, - 0xc6, 0x60, 0xd8, 0x8d, 0xb6, 0x4b, 0xbd, 0x68, 0xb5, 0x29, 0xbb, 0x59, 0x63, 0x2f, 0x8b, 0xf2, - 0x15, 0xd4, 0x18, 0xc2, 0xc7, 0x8e, 0xfd, 0xae, 0xd3, 0x46, 0x40, 0x95, 0x7b, 0xbf, 0xe1, 0x63, - 0x17, 0xc3, 0x30, 0x81, 0x49, 0x6c, 0x6d, 0xe2, 0x1c, 0x8f, 0xef, 0x35, 0x52, 0x26, 0xc9, 0xdf, - 0xb0, 0xa0, 0x24, 0x4c, 0xf4, 0x48, 0xb7, 0x53, 0x2e, 0xb6, 0x29, 0x23, 0x42, 0x75, 0x63, 0x35, - 0xcb, 0xc5, 0xf6, 0x32, 0x8c, 0xef, 0xba, 0x9e, 0xfa, 0x12, 0xbd, 0x2d, 0xbd, 0xe1, 0x7a, 0x4d, - 0xe4, 0x10, 0xbd, 0x71, 0x15, 0x06, 0x6e, 0x5c, 0x4b, 0x50, 0xd2, 0x8e, 0x27, 0x72, 0xf9, 0xd7, - 0xd6, 0x5b, 0xed, 0xa8, 0x82, 0x31, 0x8e, 0xfd, 0xcb, 0x16, 0xcc, 0xf0, 0x18, 0xee, 0xf8, 0x3c, - 0xfc, 0xb2, 0xf6, 0x05, 0x13, 0x72, 0x5f, 0x4c, 0xfa, 0x82, 0x3d, 0x3c, 0xa8, 0x94, 0x45, 0xd4, - 0x77, 0xd2, 0x35, 0xec, 0x33, 0xd2, 0x88, 0xc6, 0x3d, 0xd6, 0xc6, 0x8e, 0x6d, 0xe3, 0x89, 0xc5, - 0x54, 0x44, 0x30, 0xa6, 0x67, 0xbf, 0x0b, 0xd3, 0x66, 0x30, 0x16, 0x79, 0x19, 0xca, 0x5d, 0xd7, - 0x6b, 0x25, 0x83, 0x76, 0xf5, 0x45, 0xc3, 0x46, 0x0c, 0x42, 0x13, 0x8f, 0x57, 0xf3, 0xe3, 0x6a, - 0xa9, 0xfb, 0x89, 0x0d, 0xdf, 0xac, 0x16, 0xff, 0xe1, 0x79, 0xff, 0x33, 0x82, 0xfe, 0x72, 0xcf, - 0xfb, 0x9f, 0xc1, 0xe3, 0xc7, 0x97, 0xf7, 0x3f, 0x4b, 0x98, 0x3f, 0x5b, 0x79, 0xff, 0x7f, 0x1a, - 0x8e, 0x9b, 0x13, 0x95, 0xed, 0xf5, 0xf7, 0xcd, 0xc4, 0x0a, 0xba, 0xc5, 0x65, 0x66, 0x05, 0x09, - 0xb5, 0x7f, 0xab, 0x00, 0x73, 0xe9, 0x23, 0x7f, 0xde, 0xde, 0x14, 0xe4, 0x1b, 0x16, 0xcc, 0x38, - 0x89, 0xfc, 0x73, 0x39, 0x3d, 0x22, 0x94, 0xa0, 0x69, 0xe4, 0x3f, 0x4b, 0x94, 0x63, 0x8a, 0x37, - 0xf9, 0x0b, 0x30, 0x19, 0xb9, 0x1d, 0xea, 0xf7, 0x84, 0x21, 0xb0, 0x20, 0x0e, 0xe4, 0x9b, 0xa2, - 0x08, 0x15, 0x8c, 0x2d, 0xca, 0x2e, 0xd7, 0xa0, 0x02, 0x2a, 0x3d, 0x83, 0xe7, 0x62, 0xcb, 0xa5, - 0x28, 0x47, 0x8d, 0x41, 0x1e, 0xc0, 0xa4, 0xf0, 0xbb, 0x50, 0x0e, 0x36, 0xeb, 0x39, 0x99, 0x26, - 0x84, 0x6b, 0x47, 0xdc, 0x05, 0xe2, 0x7f, 0x88, 0x8a, 0x9d, 0xfd, 0x31, 0x38, 0x66, 0x92, 0x58, - 0xfb, 0x1a, 0x10, 0xf4, 0xdb, 0xed, 0x2d, 0xa7, 0xb1, 0x7b, 0xd7, 0xf5, 0x9a, 0xfe, 0x7d, 0xbe, - 0x14, 0x2d, 0x41, 0x29, 0x90, 0x21, 0xb3, 0xa1, 0x1c, 0x35, 0x7a, 0x2d, 0x53, 0xb1, 0xb4, 0x21, - 0xc6, 0x38, 0xf6, 0xef, 0x8d, 0xc1, 0xa4, 0x8c, 0xef, 0x7e, 0x0c, 0x91, 0x09, 0xbb, 0x89, 0xfb, - 0xe0, 0xd5, 0x5c, 0xc2, 0xd2, 0x07, 0x86, 0x25, 0x84, 0xa9, 0xb0, 0x84, 0x37, 0xf2, 0x61, 0x77, - 0x74, 0x4c, 0xc2, 0xbf, 0x2e, 0xc2, 0x6c, 0x2a, 0x5e, 0x9e, 0xe9, 0xe2, 0x7d, 0xae, 0xb8, 0x77, - 0x72, 0x0d, 0xc9, 0xd7, 0xb1, 0x48, 0x47, 0x7b, 0xe5, 0x86, 0x89, 0x94, 0xde, 0xf9, 0xf9, 0x32, - 0xfe, 0x79, 0x76, 0xef, 0xbc, 0xbc, 0x4c, 0x8b, 0x1f, 0x1c, 0x2f, 0xd3, 0xff, 0x62, 0xc1, 0x53, - 0x03, 0x33, 0x3f, 0xf0, 0xc4, 0x61, 0x41, 0x12, 0x2a, 0xd7, 0x8c, 0x9c, 0xf3, 0xdb, 0xe8, 0xfb, - 0xe3, 0x74, 0xae, 0xa7, 0x34, 0x7b, 0xf2, 0x12, 0x4c, 0x73, 0x1d, 0x8d, 0xad, 0x9e, 0x11, 0xed, - 0xca, 0xeb, 0x2f, 0x7e, 0x11, 0x52, 0x37, 0xca, 0x31, 0x81, 0x65, 0x7f, 0xc7, 0x82, 0xf9, 0x41, - 0x69, 0xa4, 0x86, 0x30, 0xce, 0xfc, 0xe5, 0x54, 0x74, 0x47, 0xa5, 0x2f, 0xba, 0x23, 0x65, 0x9e, - 0x51, 0x81, 0x1c, 0x86, 0x65, 0xa4, 0xf0, 0x88, 0xe0, 0x85, 0x6f, 0x5a, 0xf0, 0xe4, 0x80, 0x09, - 0xdf, 0x17, 0xe5, 0x63, 0x9d, 0x38, 0xca, 0x67, 0x6c, 0xd8, 0x28, 0x1f, 0xfb, 0xf7, 0x0b, 0x30, - 0x27, 0xe5, 0x89, 0x15, 0xf5, 0x57, 0x12, 0x31, 0x32, 0x3f, 0x91, 0x8a, 0x91, 0x39, 0x9f, 0xc6, - 0xff, 0xf3, 0x00, 0x99, 0x0f, 0x56, 0x80, 0xcc, 0xd7, 0x8b, 0x70, 0x21, 0x33, 0xbb, 0x15, 0xf9, - 0x5a, 0xc6, 0xee, 0x75, 0x37, 0xe7, 0x34, 0x5a, 0x43, 0xee, 0x5f, 0xa3, 0x46, 0x95, 0xfc, 0xa2, - 0x19, 0xcd, 0x21, 0x76, 0xa3, 0xed, 0x53, 0x48, 0x08, 0x76, 0xdc, 0xc0, 0x8e, 0xc7, 0xfb, 0xe4, - 0xd5, 0x9f, 0x81, 0xad, 0xe7, 0xeb, 0x05, 0xb8, 0x32, 0x6c, 0xcb, 0x7e, 0x40, 0x23, 0x21, 0xc3, - 0x44, 0x24, 0xe4, 0x63, 0x52, 0xb5, 0x4e, 0x25, 0x28, 0xf2, 0x1f, 0x8c, 0x6b, 0x3d, 0xa0, 0x7f, - 0xc2, 0x0e, 0xe5, 0x3c, 0x32, 0xc9, 0xd4, 0x71, 0x95, 0x29, 0x3d, 0xde, 0x1b, 0x26, 0xeb, 0xa2, - 0xf8, 0xe1, 0x41, 0xe5, 0x6c, 0x9c, 0x74, 0x46, 0x16, 0xa2, 0xaa, 0x44, 0xae, 0xc0, 0x54, 0x20, - 0xa0, 0x2a, 0xf6, 0x4b, 0x7a, 0xe0, 0x88, 0x32, 0xd4, 0x50, 0xf2, 0x45, 0xe3, 0xfc, 0x32, 0x7e, - 0x5a, 0xb9, 0x95, 0x8e, 0x72, 0x2c, 0x7a, 0x1b, 0xa6, 0x42, 0x95, 0xce, 0x5b, 0x4c, 0xa7, 0x17, - 0x87, 0x0c, 0x29, 0x74, 0xb6, 0x68, 0x5b, 0xe5, 0xf6, 0x16, 0xdf, 0xa7, 0x33, 0x7f, 0x6b, 0x92, - 0xc4, 0xd6, 0xf6, 0x00, 0x71, 0xf1, 0x01, 0xfd, 0xb6, 0x00, 0x12, 0xc1, 0xa4, 0x7c, 0xc2, 0x56, - 0xde, 0xc8, 0xae, 0xe7, 0x14, 0x9b, 0x23, 0x3d, 0xb7, 0xf9, 0x31, 0x5b, 0xd9, 0xa5, 0x14, 0x2b, - 0xfb, 0xfb, 0x16, 0x94, 0xe5, 0x18, 0x79, 0x0c, 0xb1, 0x95, 0xf7, 0x92, 0xb1, 0x95, 0xd7, 0x72, - 0x59, 0xc2, 0x07, 0x04, 0x56, 0xde, 0x83, 0x69, 0x33, 0xcf, 0x24, 0xf9, 0xb4, 0xb1, 0x05, 0x59, - 0xa3, 0x64, 0x6e, 0x53, 0x9b, 0x54, 0xbc, 0x3d, 0xd9, 0xbf, 0x56, 0xd2, 0xad, 0xc8, 0x0f, 0xf3, - 0xe6, 0xc8, 0xb7, 0x8e, 0x1c, 0xf9, 0xe6, 0xc0, 0x1b, 0xcb, 0x7f, 0xe0, 0xbd, 0x09, 0x53, 0x6a, - 0x59, 0x94, 0xda, 0xd4, 0xb3, 0xa6, 0x2b, 0x37, 0x53, 0xc9, 0x18, 0x31, 0x63, 0xba, 0xf0, 0x43, - 0x79, 0x6c, 0x2d, 0x57, 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x81, 0xf2, 0x7d, 0x3f, 0xd8, 0x6d, 0xfb, - 0x0e, 0x7f, 0x43, 0x01, 0xf2, 0xf0, 0x1e, 0xd0, 0x16, 0x6f, 0x11, 0x4f, 0x73, 0x37, 0xa6, 0x8f, - 0x26, 0x33, 0x52, 0x85, 0xd9, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0x84, 0x72, 0x5c, 0xe4, 0x2f, - 0x57, 0x67, 0x8d, 0xf5, 0x24, 0x18, 0xd3, 0xf8, 0xdc, 0x1a, 0x16, 0x24, 0xcc, 0x2f, 0x32, 0x49, - 0xf1, 0xc6, 0xe8, 0x83, 0x31, 0x69, 0xd2, 0x11, 0x01, 0x25, 0xc9, 0x72, 0x4c, 0xf1, 0x26, 0x5f, - 0x80, 0xa9, 0x50, 0x3d, 0x0e, 0x59, 0xcc, 0xf1, 0x14, 0xa6, 0x1f, 0x88, 0xd4, 0x5d, 0xa9, 0x5f, - 0x88, 0xd4, 0x0c, 0xc9, 0x1a, 0x9c, 0x57, 0xf6, 0xa4, 0xc4, 0x3b, 0x77, 0x13, 0x71, 0xce, 0x31, - 0xcc, 0x80, 0x63, 0x66, 0x2d, 0xa6, 0xdb, 0xf2, 0xfc, 0xad, 0xe2, 0xb6, 0xd6, 0xb8, 0xe0, 0xe4, - 0xf3, 0xaf, 0x89, 0x12, 0x7a, 0x54, 0x84, 0xf0, 0xd4, 0x08, 0x11, 0xc2, 0x75, 0xb8, 0x90, 0x06, - 0xf1, 0x64, 0x72, 0x3c, 0x7f, 0x9d, 0xb1, 0x85, 0x6e, 0x64, 0x21, 0x61, 0x76, 0x5d, 0x72, 0x17, - 0x4a, 0x01, 0xe5, 0xa7, 0xce, 0xaa, 0x72, 0x74, 0x3b, 0xb6, 0x4b, 0x2f, 0x2a, 0x02, 0x18, 0xd3, - 0x62, 0xfd, 0xee, 0x24, 0x33, 0x8a, 0xbf, 0x99, 0xe3, 0xeb, 0xd1, 0xb2, 0xef, 0x07, 0x24, 0x79, - 0xb4, 0xff, 0xed, 0x2c, 0x9c, 0x49, 0x18, 0xc5, 0xc8, 0xb3, 0x50, 0xe4, 0xd9, 0xf5, 0xf8, 0x6a, - 0x35, 0x15, 0xaf, 0xa8, 0xa2, 0x71, 0x04, 0x8c, 0xfc, 0xbc, 0x05, 0xb3, 0xdd, 0xc4, 0x25, 0x8f, - 0x5a, 0xc8, 0x47, 0xb4, 0x24, 0x27, 0x6f, 0x8e, 0x8c, 0xb7, 0x38, 0x92, 0xcc, 0x30, 0xcd, 0x9d, - 0xad, 0x07, 0xd2, 0x2f, 0xbe, 0x4d, 0x03, 0x8e, 0x2d, 0x15, 0x3d, 0x4d, 0x62, 0x39, 0x09, 0xc6, - 0x34, 0x3e, 0xeb, 0x61, 0xfe, 0x75, 0xa3, 0xbc, 0x10, 0x5a, 0x55, 0x04, 0x30, 0xa6, 0x45, 0x5e, - 0x83, 0x19, 0x99, 0x48, 0x7a, 0xc3, 0x6f, 0xde, 0x70, 0xc2, 0x1d, 0x79, 0xe4, 0xd3, 0x47, 0xd4, - 0xe5, 0x04, 0x14, 0x53, 0xd8, 0xfc, 0xdb, 0xe2, 0x6c, 0xdd, 0x9c, 0xc0, 0x44, 0xf2, 0xa9, 0x92, - 0xe5, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x05, 0x63, 0x1b, 0x12, 0x1e, 0x14, 0x7a, 0x35, 0xc8, 0xd8, - 0x8a, 0xaa, 0x30, 0xdb, 0xe3, 0x27, 0xe4, 0xa6, 0x02, 0xca, 0xf9, 0xa8, 0x19, 0xde, 0x49, 0x82, - 0x31, 0x8d, 0x4f, 0x5e, 0x85, 0x33, 0x01, 0x5b, 0x6c, 0x35, 0x01, 0xe1, 0x56, 0xa1, 0x6f, 0xcd, - 0xd1, 0x04, 0x62, 0x12, 0x97, 0xbc, 0x0e, 0x67, 0xe3, 0xbc, 0xab, 0x8a, 0x80, 0xf0, 0xb3, 0xd0, - 0x49, 0x00, 0xab, 0x69, 0x04, 0xec, 0xaf, 0x43, 0xfe, 0x1a, 0xcc, 0x19, 0x2d, 0xb1, 0xea, 0x35, - 0xe9, 0x03, 0x99, 0x1b, 0x93, 0x3f, 0xbd, 0xb5, 0x9c, 0x82, 0x61, 0x1f, 0x36, 0xf9, 0x24, 0xcc, - 0x34, 0xfc, 0x76, 0x9b, 0xaf, 0x71, 0xe2, 0x99, 0x0c, 0x91, 0x04, 0x53, 0xa4, 0x0b, 0x4d, 0x40, - 0x30, 0x85, 0x49, 0x6e, 0x02, 0xf1, 0xb7, 0x98, 0x7a, 0x45, 0x9b, 0xaf, 0x53, 0x8f, 0x4a, 0x8d, - 0xe3, 0x4c, 0x32, 0x2a, 0xe7, 0x76, 0x1f, 0x06, 0x66, 0xd4, 0xe2, 0x39, 0x04, 0x8d, 0x28, 0xe6, - 0x99, 0x3c, 0x9e, 0xb3, 0x4c, 0xdb, 0x73, 0x1e, 0x19, 0xc2, 0x1c, 0xc0, 0x84, 0x08, 0x92, 0xca, - 0x27, 0x1b, 0xa6, 0x99, 0x31, 0x3f, 0xde, 0x23, 0x44, 0x29, 0x4a, 0x4e, 0xe4, 0xe7, 0xa0, 0xb4, - 0xa5, 0x9e, 0x4f, 0xe1, 0x29, 0x30, 0x47, 0xde, 0x17, 0x53, 0x2f, 0x01, 0xc5, 0xf6, 0x0a, 0x0d, - 0xc0, 0x98, 0x25, 0x79, 0x0e, 0xca, 0x37, 0x36, 0xaa, 0x7a, 0x14, 0x9e, 0xe5, 0xbd, 0x3f, 0xce, - 0xaa, 0xa0, 0x09, 0x60, 0x33, 0x4c, 0xab, 0x6f, 0x24, 0xe9, 0x3a, 0x90, 0xa1, 0x8d, 0x31, 0x6c, - 0xee, 0x0b, 0x81, 0xf5, 0xf9, 0x73, 0x29, 0x6c, 0x59, 0x8e, 0x1a, 0x83, 0xbc, 0x0d, 0x65, 0xb9, - 0x5f, 0xf0, 0xb5, 0xe9, 0xfc, 0xc9, 0x22, 0xe4, 0x31, 0x26, 0x81, 0x26, 0x3d, 0x7e, 0x89, 0xcd, - 0x5f, 0x95, 0xa0, 0xd7, 0x7b, 0xed, 0xf6, 0xfc, 0x05, 0xbe, 0x6e, 0xc6, 0x97, 0xd8, 0x31, 0x08, - 0x4d, 0x3c, 0xf2, 0xa2, 0xf2, 0x69, 0x7b, 0x22, 0x71, 0xab, 0xaf, 0x7d, 0xda, 0xb4, 0xd2, 0x3d, - 0x20, 0x88, 0xe6, 0xc9, 0x47, 0x38, 0x93, 0x6d, 0xc1, 0x82, 0xd2, 0xf8, 0xfa, 0x27, 0xc9, 0xfc, - 0x7c, 0xc2, 0x76, 0xb4, 0x70, 0x77, 0x20, 0x26, 0x1e, 0x41, 0x85, 0x6c, 0x41, 0xc1, 0x69, 0x6f, - 0xcd, 0x3f, 0x95, 0x87, 0xea, 0x5a, 0x5d, 0xab, 0xc9, 0x11, 0xc5, 0x1d, 0x5f, 0xab, 0x6b, 0x35, - 0x64, 0xc4, 0x89, 0x0b, 0xe3, 0x4e, 0x7b, 0x2b, 0x9c, 0x5f, 0xe0, 0x73, 0x36, 0x37, 0x26, 0xb1, - 0xf1, 0x60, 0xad, 0x16, 0x22, 0x67, 0x61, 0x7f, 0x69, 0x4c, 0xdf, 0x5c, 0xe9, 0x84, 0xe4, 0xef, - 0x9a, 0x13, 0x48, 0x1c, 0x77, 0x6e, 0xe7, 0x36, 0x81, 0xa4, 0x7a, 0x71, 0x66, 0xe0, 0xf4, 0xe9, - 0xea, 0x25, 0x23, 0x97, 0x4c, 0x66, 0xc9, 0x64, 0xeb, 0xe2, 0xf4, 0x9c, 0x5c, 0x30, 0xec, 0x2f, - 0x97, 0xb5, 0x15, 0x34, 0xe5, 0x0f, 0x16, 0x40, 0xd1, 0x0d, 0x23, 0xd7, 0xcf, 0x31, 0x70, 0x3c, - 0x95, 0xa5, 0x9c, 0xc7, 0xa5, 0x70, 0x00, 0x0a, 0x56, 0x8c, 0xa7, 0xd7, 0x72, 0xbd, 0x07, 0xf2, - 0xf3, 0xdf, 0xcc, 0xdd, 0xd1, 0x4b, 0xf0, 0xe4, 0x00, 0x14, 0xac, 0xc8, 0x3d, 0x31, 0xa8, 0x0b, - 0x79, 0xf4, 0x75, 0x75, 0xad, 0x96, 0xe2, 0x97, 0x1c, 0xdc, 0xf7, 0xa0, 0x10, 0x76, 0x5c, 0xa9, - 0x2e, 0x8d, 0xc8, 0xab, 0xbe, 0xbe, 0x9a, 0xc5, 0xab, 0xbe, 0xbe, 0x8a, 0x8c, 0x09, 0xf9, 0xaa, - 0x05, 0xe0, 0x74, 0xb6, 0x9c, 0x30, 0x74, 0x9a, 0xda, 0x3a, 0x33, 0xe2, 0xeb, 0x23, 0x55, 0x4d, - 0x2f, 0xc5, 0x9a, 0xbb, 0x36, 0xc7, 0x50, 0x34, 0x38, 0x93, 0x77, 0x60, 0xd2, 0x11, 0xcf, 0x3b, - 0x4a, 0x2f, 0xfd, 0x7c, 0xde, 0x2c, 0x4d, 0x49, 0xc0, 0xcd, 0x34, 0x12, 0x84, 0x8a, 0x21, 0xe3, - 0x1d, 0x05, 0x0e, 0xdd, 0x76, 0x77, 0xa5, 0x71, 0xa8, 0x3e, 0xf2, 0x03, 0x24, 0x8c, 0x58, 0x16, - 0x6f, 0x09, 0x42, 0xc5, 0x50, 0xbc, 0xe6, 0xef, 0x78, 0x8e, 0x8e, 0xbd, 0xcc, 0x27, 0x42, 0xd7, - 0x8c, 0xe6, 0x34, 0x5e, 0xf3, 0x37, 0x19, 0x61, 0x92, 0x2f, 0xd9, 0x83, 0x09, 0x87, 0x3f, 0x3c, - 0x2b, 0x8f, 0x62, 0x98, 0xc7, 0x23, 0xb6, 0xa9, 0x36, 0xe0, 0x8b, 0x8b, 0x7c, 0xde, 0x56, 0x72, - 0x23, 0xbf, 0x62, 0xc1, 0xa4, 0x70, 0x20, 0x67, 0x0a, 0x29, 0xfb, 0xf6, 0xcf, 0x9d, 0xc2, 0x6b, - 0x07, 0xd2, 0xb9, 0x5d, 0xba, 0x44, 0x7d, 0x44, 0x7b, 0xc7, 0x8a, 0xd2, 0x23, 0xdd, 0xdb, 0x95, - 0x74, 0x4c, 0xf5, 0xed, 0x38, 0x0f, 0x12, 0xcf, 0xcb, 0x98, 0xaa, 0xef, 0x7a, 0x0a, 0x86, 0x7d, - 0xd8, 0x0b, 0x9f, 0x84, 0x69, 0x53, 0x8e, 0x63, 0xb9, 0xc8, 0xff, 0xb0, 0x00, 0xc0, 0xbb, 0x4a, - 0xe4, 0x6b, 0xe9, 0xf0, 0xe4, 0xce, 0x3b, 0x7e, 0x33, 0xa7, 0x67, 0x2e, 0x8d, 0xb4, 0x2b, 0x20, - 0x33, 0x39, 0xef, 0xf8, 0x4d, 0x94, 0x4c, 0x48, 0x0b, 0xc6, 0xbb, 0x4e, 0xb4, 0x93, 0x7f, 0x8e, - 0x97, 0x29, 0x11, 0xb8, 0x1c, 0xed, 0x20, 0x67, 0x40, 0xde, 0xb3, 0x62, 0x6f, 0xa3, 0x42, 0x3e, - 0x3e, 0x21, 0xaa, 0xcd, 0x16, 0xa5, 0x7f, 0x51, 0x2a, 0x4d, 0x6b, 0xda, 0xeb, 0x68, 0xe1, 0x7d, - 0x0b, 0xa6, 0x4d, 0xd4, 0x8c, 0x6e, 0xfa, 0x59, 0xb3, 0x9b, 0xf2, 0x6c, 0x0f, 0xb3, 0xc7, 0xff, - 0x9b, 0x05, 0x80, 0x3d, 0xaf, 0xde, 0xeb, 0x74, 0x98, 0xda, 0xae, 0x23, 0x01, 0xac, 0xa1, 0x23, - 0x01, 0xc6, 0x8e, 0x19, 0x09, 0x50, 0x38, 0x56, 0x24, 0xc0, 0xf8, 0xf1, 0x23, 0x01, 0x8a, 0x83, - 0x23, 0x01, 0xec, 0x6f, 0x59, 0x70, 0xb6, 0x6f, 0xbf, 0x62, 0x9a, 0x74, 0xe0, 0xfb, 0xd1, 0x00, - 0x2f, 0x52, 0x8c, 0x41, 0x68, 0xe2, 0x91, 0x15, 0x98, 0x93, 0x4f, 0x99, 0xd4, 0xbb, 0x6d, 0x37, - 0x33, 0xff, 0xce, 0x66, 0x0a, 0x8e, 0x7d, 0x35, 0xec, 0xdf, 0xb2, 0xa0, 0x6c, 0x44, 0xed, 0xb3, - 0xef, 0xe0, 0xae, 0xc4, 0x52, 0x8c, 0xf8, 0x15, 0x17, 0x7e, 0xd5, 0x25, 0x60, 0xe2, 0x1a, 0xba, - 0x65, 0x24, 0xba, 0x8f, 0xaf, 0xa1, 0x59, 0x29, 0x4a, 0xa8, 0x48, 0x61, 0x4e, 0xbb, 0xbc, 0xd1, - 0x0b, 0x66, 0x0a, 0x73, 0xda, 0x45, 0x0e, 0xe1, 0xec, 0xd8, 0x91, 0x42, 0x7a, 0x09, 0x1b, 0x8f, - 0xc6, 0x38, 0x41, 0x84, 0x02, 0x46, 0x2e, 0x42, 0x81, 0x7a, 0x4d, 0x69, 0xff, 0xd0, 0xcf, 0xba, - 0x5e, 0xf3, 0x9a, 0xc8, 0xca, 0xed, 0xdb, 0x30, 0x2d, 0x3c, 0xa4, 0xdf, 0xa0, 0xfb, 0x43, 0xbf, - 0x13, 0xcb, 0x46, 0x7b, 0xea, 0x9d, 0x58, 0x56, 0x9d, 0x95, 0xdb, 0xff, 0xd8, 0x82, 0xd4, 0xcb, - 0x46, 0xc6, 0x0d, 0x8c, 0x35, 0xf0, 0x06, 0xc6, 0xb4, 0xda, 0x8f, 0x1d, 0x69, 0xb5, 0xbf, 0x09, - 0xa4, 0xc3, 0xa6, 0x42, 0x72, 0xa1, 0x2d, 0x24, 0x9f, 0x9b, 0x58, 0xef, 0xc3, 0xc0, 0x8c, 0x5a, - 0xf6, 0x3f, 0x12, 0xc2, 0x9a, 0x6f, 0x1d, 0x3d, 0xba, 0x01, 0x7a, 0x50, 0xe4, 0xa4, 0xa4, 0xfd, - 0x6d, 0x44, 0xdb, 0x75, 0x7f, 0xae, 0xad, 0xb8, 0x23, 0xe5, 0x94, 0xe7, 0xdc, 0xec, 0xdf, 0x17, - 0xb2, 0x1a, 0x8f, 0x21, 0x0d, 0x21, 0x6b, 0x27, 0x29, 0xeb, 0x8d, 0xbc, 0xd6, 0xca, 0x6c, 0x19, - 0xc9, 0x22, 0x40, 0x97, 0x06, 0x0d, 0xea, 0x45, 0x2a, 0x76, 0xa9, 0x28, 0xa3, 0x68, 0x75, 0x29, - 0x1a, 0x18, 0xf6, 0x37, 0xd9, 0x04, 0x8a, 0x5f, 0x50, 0x26, 0x57, 0xd2, 0xee, 0xb7, 0xe9, 0xc9, - 0xa1, 0xbd, 0x6f, 0x8d, 0x88, 0x96, 0xb1, 0x47, 0x44, 0xb4, 0x3c, 0x0f, 0x93, 0x81, 0xdf, 0xa6, - 0xd5, 0xc0, 0x4b, 0xfb, 0x0c, 0x21, 0x2b, 0xc6, 0x5b, 0xa8, 0xe0, 0xf6, 0x2f, 0x59, 0x30, 0x97, - 0x0e, 0xb9, 0xcb, 0xdd, 0x27, 0xd8, 0xcc, 0x0b, 0x50, 0x38, 0x7e, 0x5e, 0x00, 0xfb, 0x3d, 0x26, - 0x64, 0xe4, 0x36, 0x76, 0x5d, 0x4f, 0x84, 0xd2, 0xb3, 0x96, 0x7b, 0x1e, 0x26, 0xa9, 0x7c, 0x09, - 0x56, 0x98, 0x91, 0xb5, 0x90, 0xea, 0x01, 0x58, 0x05, 0x27, 0x55, 0x98, 0x55, 0x97, 0x67, 0xca, - 0xf6, 0x2f, 0x52, 0x80, 0x68, 0x5b, 0xe3, 0x4a, 0x12, 0x8c, 0x69, 0x7c, 0xfb, 0x8b, 0x50, 0x36, - 0x36, 0x25, 0xbe, 0x7e, 0x3f, 0x70, 0x1a, 0x51, 0x7a, 0xdd, 0xbb, 0xc6, 0x0a, 0x51, 0xc0, 0xf8, - 0x15, 0x85, 0x88, 0x08, 0x4a, 0xad, 0x7b, 0x32, 0x0e, 0x48, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, - 0x03, 0xf5, 0x0e, 0x81, 0x22, 0x86, 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x01, 0xa6, 0x54, 0xa2, 0x26, - 0x9e, 0xed, 0x44, 0x99, 0xcf, 0xcd, 0x6c, 0x27, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0x6f, 0xc1, 0x94, - 0xca, 0x27, 0xf5, 0x68, 0x6c, 0xb6, 0x14, 0x85, 0x9e, 0x7b, 0xc3, 0x0f, 0x23, 0x95, 0x04, 0x4b, - 0xdc, 0xf0, 0xdd, 0x5a, 0xe5, 0x65, 0xa8, 0xa1, 0xf6, 0x9f, 0x5a, 0x50, 0xde, 0xdc, 0x5c, 0xd3, - 0x07, 0x7f, 0x84, 0x27, 0x42, 0xd1, 0x42, 0xd5, 0xed, 0x88, 0x9a, 0xae, 0x04, 0x62, 0xe1, 0x5b, - 0x38, 0x3c, 0xa8, 0x3c, 0x51, 0xcf, 0xc4, 0xc0, 0x01, 0x35, 0xc9, 0x2a, 0x9c, 0x33, 0x21, 0x32, - 0x39, 0x81, 0x5c, 0x23, 0xf9, 0xd3, 0xc1, 0xf5, 0x7e, 0x30, 0x66, 0xd5, 0x49, 0x93, 0x92, 0xdb, - 0xbd, 0xf9, 0x0a, 0x71, 0xbd, 0x1f, 0x8c, 0x59, 0x75, 0xec, 0x17, 0x61, 0x36, 0x75, 0xc7, 0x3d, - 0x44, 0x52, 0x98, 0xdf, 0x29, 0xc0, 0xb4, 0x79, 0xd5, 0x39, 0xc4, 0xfa, 0x35, 0xfc, 0xb6, 0x90, - 0x71, 0x3d, 0x59, 0x38, 0xe6, 0xf5, 0xa4, 0x79, 0x1f, 0x3c, 0x7e, 0xba, 0xf7, 0xc1, 0xc5, 0x7c, - 0xee, 0x83, 0x0d, 0xbf, 0x85, 0x89, 0xc7, 0xe7, 0xb7, 0xf0, 0x9b, 0x45, 0x98, 0x49, 0x66, 0x19, - 0x1d, 0xa2, 0x27, 0x5f, 0xe8, 0xeb, 0xc9, 0x63, 0xde, 0x87, 0x14, 0x46, 0xbd, 0x0f, 0x19, 0x1f, - 0xf5, 0x3e, 0xa4, 0x78, 0x82, 0xfb, 0x90, 0xfe, 0xdb, 0x8c, 0x89, 0xa1, 0x6f, 0x33, 0x3e, 0xa5, - 0x5d, 0x3c, 0x27, 0x13, 0x2e, 0x40, 0xb1, 0x8b, 0x27, 0x49, 0x76, 0xc3, 0xb2, 0xdf, 0xcc, 0x74, - 0x95, 0x9d, 0x7a, 0x84, 0xdd, 0x37, 0xc8, 0xf4, 0xc8, 0x3c, 0xfe, 0x95, 0xeb, 0x13, 0xc7, 0xf0, - 0xc6, 0x7c, 0x19, 0xca, 0x72, 0x3c, 0x71, 0xe5, 0x1b, 0x92, 0x8a, 0x7b, 0x3d, 0x06, 0xa1, 0x89, - 0xc7, 0x06, 0x46, 0x37, 0x9e, 0x20, 0xfc, 0x66, 0xae, 0x9c, 0xbc, 0x99, 0xdb, 0x48, 0x82, 0x31, - 0x8d, 0x6f, 0x7f, 0x01, 0x2e, 0x64, 0x9a, 0x60, 0xb8, 0xf9, 0x9b, 0xeb, 0x85, 0xb4, 0x29, 0x11, - 0x0c, 0x31, 0x52, 0x8f, 0x8f, 0x2c, 0xdc, 0x1d, 0x88, 0x89, 0x47, 0x50, 0xb1, 0x7f, 0xbd, 0x00, - 0x33, 0xc9, 0x17, 0x68, 0xc9, 0x7d, 0x6d, 0xb0, 0xcd, 0xc5, 0x56, 0x2c, 0xc8, 0x1a, 0x99, 0x2b, - 0x07, 0x5e, 0xf4, 0xdc, 0xe7, 0xe3, 0x6b, 0x4b, 0xa7, 0xd1, 0x3c, 0x3d, 0xc6, 0xf2, 0x86, 0x45, - 0xb2, 0xe3, 0x8f, 0xcc, 0xc6, 0x41, 0xae, 0xf2, 0x1c, 0x9f, 0x3b, 0xf7, 0x38, 0x58, 0x53, 0xb3, - 0x42, 0x83, 0x2d, 0xdb, 0x5b, 0xf6, 0x68, 0xe0, 0x6e, 0xbb, 0xfa, 0xf5, 0x7c, 0xbe, 0x72, 0xbf, - 0x25, 0xcb, 0x50, 0x43, 0xed, 0xf7, 0xc6, 0xa0, 0xc4, 0x73, 0x72, 0x5d, 0x0f, 0xfc, 0x0e, 0x7f, - 0xa6, 0x31, 0x34, 0xce, 0x4c, 0xb2, 0xdb, 0x6e, 0x8e, 0xfa, 0x16, 0x6a, 0x4c, 0x51, 0xba, 0xdf, - 0x1b, 0x25, 0x98, 0xe0, 0x48, 0xba, 0x30, 0xb5, 0x2d, 0x73, 0x08, 0xcb, 0xbe, 0x1b, 0x31, 0x0f, - 0xa6, 0xca, 0x48, 0x2c, 0x9a, 0x40, 0xfd, 0x43, 0xcd, 0xc5, 0x76, 0x60, 0x36, 0x95, 0x54, 0x25, - 0xf7, 0xcc, 0xc3, 0xff, 0x73, 0x1c, 0x4a, 0x3a, 0xf6, 0x8b, 0x7c, 0x22, 0x61, 0xc0, 0x2a, 0xd5, - 0x3e, 0x6c, 0xbc, 0x21, 0xb6, 0xe3, 0x37, 0x1f, 0x1e, 0x54, 0x66, 0x35, 0x72, 0xca, 0x18, 0x75, - 0x11, 0x0a, 0xbd, 0xa0, 0x9d, 0x3e, 0xa1, 0xde, 0xc1, 0x35, 0x64, 0xe5, 0x66, 0xbc, 0x5a, 0xe1, - 0xb1, 0xc6, 0xab, 0xb1, 0x5d, 0x72, 0xcb, 0x6f, 0xee, 0xa7, 0xdf, 0x1c, 0xab, 0xf9, 0xcd, 0x7d, - 0xe4, 0x10, 0xf2, 0x1a, 0xcc, 0xc8, 0x20, 0x3c, 0xa5, 0xc4, 0x14, 0xb9, 0x9e, 0xaa, 0x1d, 0x17, - 0x36, 0x13, 0x50, 0x4c, 0x61, 0xb3, 0x5d, 0xf6, 0x5e, 0xe8, 0x7b, 0x3c, 0x9f, 0xf4, 0x44, 0xf2, - 0x96, 0xf3, 0x66, 0xfd, 0xf6, 0x2d, 0x6e, 0x48, 0xd3, 0x18, 0x89, 0x38, 0xbf, 0xc9, 0x47, 0xc6, - 0xf9, 0xad, 0x08, 0xda, 0x4c, 0x5a, 0xbe, 0xa3, 0x4c, 0xd7, 0xae, 0x28, 0xba, 0xac, 0xec, 0xe1, - 0xc1, 0x11, 0x46, 0x52, 0x5d, 0x33, 0x2b, 0x22, 0xb2, 0xf4, 0xe3, 0x8b, 0x88, 0xb4, 0xef, 0xc0, - 0x6c, 0xaa, 0xff, 0x94, 0x81, 0xc3, 0xca, 0x36, 0x70, 0x0c, 0xf7, 0x6a, 0xd9, 0x3f, 0xb5, 0xe0, - 0x6c, 0xdf, 0x8a, 0x34, 0x6c, 0x68, 0x6a, 0x7a, 0x6f, 0x1c, 0x3b, 0xf9, 0xde, 0x58, 0x38, 0xde, - 0xde, 0x58, 0xdb, 0xfa, 0xee, 0x0f, 0x2e, 0x7d, 0xe8, 0x7b, 0x3f, 0xb8, 0xf4, 0xa1, 0x3f, 0xf8, - 0xc1, 0xa5, 0x0f, 0xbd, 0x77, 0x78, 0xc9, 0xfa, 0xee, 0xe1, 0x25, 0xeb, 0x7b, 0x87, 0x97, 0xac, - 0x3f, 0x38, 0xbc, 0x64, 0xfd, 0xe7, 0xc3, 0x4b, 0xd6, 0xb7, 0xfe, 0xf8, 0xd2, 0x87, 0x3e, 0xfd, - 0xa9, 0xb8, 0xa7, 0x96, 0x54, 0x4f, 0xf1, 0x1f, 0x1f, 0x55, 0xfd, 0xb2, 0xd4, 0xdd, 0x6d, 0x2d, - 0xb1, 0x9e, 0x5a, 0xd2, 0x25, 0xaa, 0xa7, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x10, 0xcd, - 0x1f, 0xc0, 0x63, 0xa6, 0x00, 0x00, + 0xf8, 0x86, 0x45, 0xb9, 0x43, 0x8a, 0xc0, 0x13, 0xed, 0xc0, 0xa8, 0xb6, 0x52, 0xc5, 0x99, 0x3c, + 0x03, 0x93, 0xdb, 0x7e, 0xd0, 0xed, 0x77, 0x9c, 0x74, 0xb4, 0xe3, 0x35, 0x51, 0x8c, 0x0a, 0xce, + 0x26, 0xb9, 0xd3, 0x73, 0xdf, 0xa0, 0x41, 0x28, 0xe2, 0x10, 0x12, 0x93, 0xbc, 0xa6, 0x21, 0x68, + 0x60, 0xf1, 0x3a, 0xed, 0x76, 0x40, 0xdb, 0x4e, 0xe4, 0x07, 0x7c, 0xe7, 0x30, 0xeb, 0x68, 0x08, + 0x1a, 0x58, 0x0b, 0x9f, 0x84, 0x29, 0x53, 0xf8, 0x53, 0x05, 0xb1, 0x7c, 0x0a, 0xa4, 0x27, 0x63, + 0x6a, 0x49, 0xb2, 0x4e, 0xb2, 0x24, 0xd9, 0xff, 0x61, 0x0c, 0x0c, 0xeb, 0xd0, 0x03, 0x98, 0xea, + 0x5e, 0x62, 0xaa, 0x8f, 0x68, 0xd9, 0x30, 0x6c, 0x5d, 0xc3, 0x42, 0xfa, 0xf6, 0x52, 0x21, 0x7d, + 0x37, 0x73, 0xe3, 0x78, 0x74, 0x44, 0xdf, 0x0f, 0x2c, 0x78, 0x34, 0x46, 0x1e, 0x34, 0xdc, 0x1e, + 0xbf, 0x6e, 0xbf, 0x08, 0x15, 0x27, 0xae, 0x26, 0x27, 0x96, 0x11, 0x4f, 0xa5, 0x41, 0x68, 0xe2, + 0xc5, 0xb1, 0x20, 0x85, 0x33, 0xc6, 0x82, 0x8c, 0x1f, 0x1d, 0x0b, 0x62, 0xff, 0x78, 0x0c, 0x1e, + 0x1f, 0xfc, 0x32, 0xd3, 0x41, 0xfa, 0xf8, 0x6f, 0x4b, 0xbb, 0x50, 0x8f, 0x9d, 0xd9, 0x85, 0xba, + 0x70, 0x52, 0x17, 0x6a, 0xed, 0xb8, 0x3c, 0x7e, 0xee, 0x8e, 0xcb, 0x0d, 0xb8, 0xac, 0xbc, 0x24, + 0xaf, 0xf9, 0x81, 0x0c, 0x88, 0x50, 0x2b, 0x48, 0xa9, 0xfe, 0xb8, 0xac, 0x72, 0x19, 0xb3, 0x90, + 0x30, 0xbb, 0xae, 0xfd, 0x83, 0x02, 0x5c, 0x8c, 0x9b, 0x7d, 0xd9, 0xf7, 0x5a, 0x2e, 0x77, 0xb4, + 0x79, 0x19, 0xc6, 0xa3, 0xfd, 0x9e, 0x6a, 0xec, 0xbf, 0xac, 0xc4, 0xd9, 0xdc, 0xef, 0xb1, 0xde, + 0x7e, 0x38, 0xa3, 0x0a, 0x37, 0x9d, 0xf3, 0x4a, 0x64, 0x4d, 0xcf, 0x0e, 0xd1, 0x03, 0x2f, 0x24, + 0x47, 0xf3, 0x7b, 0x07, 0xd5, 0x8c, 0xd4, 0x06, 0x8b, 0x9a, 0x52, 0x72, 0xcc, 0x93, 0xbb, 0x30, + 0xd3, 0x71, 0xc2, 0xe8, 0x76, 0xaf, 0xe5, 0x44, 0x74, 0xd3, 0x95, 0x2e, 0x2c, 0xa7, 0x8b, 0x21, + 0xd1, 0x77, 0xfd, 0x6b, 0x09, 0x4a, 0x98, 0xa2, 0x4c, 0xf6, 0x80, 0xb0, 0x92, 0xcd, 0xc0, 0xf1, + 0x42, 0xf1, 0x55, 0x8c, 0xdf, 0xe9, 0x03, 0x82, 0xf4, 0xd1, 0x79, 0x6d, 0x80, 0x1a, 0x66, 0x70, + 0x20, 0x4f, 0xc1, 0x44, 0x40, 0x9d, 0x50, 0x6f, 0x07, 0x7a, 0xfe, 0x23, 0x2f, 0x45, 0x09, 0x35, + 0x27, 0xd4, 0xc4, 0x31, 0x13, 0xea, 0x8f, 0x2c, 0x98, 0x89, 0xbb, 0xe9, 0x01, 0xa8, 0x1e, 0xdd, + 0xa4, 0xea, 0x71, 0x3d, 0xaf, 0x25, 0x71, 0x88, 0xb6, 0xf1, 0xa7, 0x93, 0xe6, 0xf7, 0xf1, 0xa8, + 0x85, 0x2f, 0x98, 0x4e, 0xec, 0x56, 0x1e, 0xa1, 0x64, 0x09, 0x6d, 0xef, 0x48, 0xef, 0x75, 0xa6, + 0xeb, 0xb4, 0xa4, 0x1e, 0x23, 0x87, 0xbd, 0xd6, 0x75, 0x94, 0x7e, 0x93, 0xa5, 0xeb, 0xa8, 0x3a, + 0xe4, 0x36, 0x3c, 0xdc, 0x0b, 0x7c, 0x1e, 0x5c, 0xbf, 0x42, 0x9d, 0x56, 0xc7, 0xf5, 0xa8, 0x32, + 0xf3, 0x08, 0x57, 0x93, 0x47, 0x0f, 0x0f, 0xaa, 0x0f, 0x6f, 0x64, 0xa3, 0xe0, 0xb0, 0xba, 0xc9, + 0xf0, 0xcc, 0xf1, 0x13, 0x84, 0x67, 0xfe, 0x82, 0x36, 0xa6, 0xea, 0x48, 0x80, 0xcf, 0xe4, 0xd5, + 0x95, 0x59, 0x31, 0x01, 0x7a, 0x48, 0xd5, 0x24, 0x53, 0xd4, 0xec, 0x87, 0x5b, 0xec, 0x26, 0xce, + 0x68, 0xb1, 0x8b, 0x83, 0x3f, 0x26, 0xdf, 0xcf, 0xe0, 0x8f, 0xd2, 0x07, 0x2a, 0xf8, 0xe3, 0x3b, + 0x16, 0x5c, 0x74, 0x06, 0xc3, 0xae, 0xf3, 0x31, 0x1e, 0x67, 0xc4, 0x73, 0xd7, 0x1f, 0x95, 0x42, + 0x66, 0x45, 0xb7, 0x63, 0x96, 0x28, 0xf6, 0xbb, 0x45, 0x98, 0x4b, 0x2b, 0x49, 0xe7, 0x1f, 0x9f, + 0xfa, 0xb7, 0x2d, 0x98, 0x53, 0x13, 0x5c, 0xf0, 0xd4, 0x47, 0x8c, 0xb5, 0x9c, 0xd6, 0x15, 0xa1, + 0xee, 0xe9, 0xb4, 0x21, 0x9b, 0x29, 0x6e, 0x38, 0xc0, 0x9f, 0xbc, 0x09, 0x15, 0x7d, 0xab, 0x72, + 0xa6, 0x60, 0x55, 0x1e, 0x4f, 0x59, 0x8b, 0x49, 0xa0, 0x49, 0x8f, 0xbc, 0x6b, 0x01, 0x34, 0xd5, + 0x4e, 0x9c, 0x53, 0x28, 0x50, 0x86, 0xb6, 0x10, 0xeb, 0xf3, 0xba, 0x28, 0x44, 0x83, 0x31, 0xf9, + 0x25, 0x7e, 0x9f, 0xa2, 0x47, 0x82, 0x48, 0x47, 0x32, 0xb2, 0xdb, 0xfb, 0x11, 0xba, 0x73, 0xac, + 0xed, 0x19, 0xa0, 0x10, 0x13, 0x42, 0xd8, 0x2f, 0x83, 0x76, 0x54, 0x66, 0x2b, 0x2b, 0x77, 0x55, + 0xde, 0x70, 0xa2, 0x1d, 0x39, 0x04, 0xf5, 0xca, 0x7a, 0x4d, 0x01, 0x30, 0xc6, 0xb1, 0x3f, 0x07, + 0x33, 0xaf, 0x06, 0x4e, 0x6f, 0xc7, 0xe5, 0xf7, 0x16, 0xec, 0x7c, 0xfc, 0x0c, 0x4c, 0x3a, 0xad, + 0x56, 0x56, 0x86, 0x9b, 0x9a, 0x28, 0x46, 0x05, 0x3f, 0xd1, 0x51, 0xd8, 0xfe, 0x3d, 0x0b, 0x48, + 0x7c, 0xf7, 0xeb, 0x7a, 0xed, 0x75, 0x27, 0x6a, 0xee, 0xb0, 0x23, 0xdc, 0x0e, 0x2f, 0xcd, 0x3a, + 0xc2, 0x5d, 0xd7, 0x10, 0x34, 0xb0, 0xc8, 0xdb, 0x50, 0x11, 0xff, 0xde, 0xd0, 0x07, 0xc4, 0xd1, + 0xfd, 0xad, 0xf9, 0x9e, 0xc7, 0x65, 0x12, 0xa3, 0xf0, 0x7a, 0xcc, 0x01, 0x4d, 0x76, 0xac, 0xa9, + 0x56, 0xbd, 0xed, 0x4e, 0xff, 0x7e, 0x6b, 0x2b, 0x6e, 0xaa, 0x5e, 0xe0, 0x6f, 0xbb, 0x1d, 0x9a, + 0x6e, 0xaa, 0x0d, 0x51, 0x8c, 0x0a, 0x7e, 0xb2, 0xa6, 0xfa, 0xd7, 0x16, 0x5c, 0x5a, 0x0d, 0x23, + 0xd7, 0x5f, 0xa1, 0x61, 0xc4, 0x76, 0x3e, 0xb6, 0x3e, 0xf6, 0x3b, 0x27, 0x89, 0x39, 0x58, 0x81, + 0x39, 0x79, 0x0f, 0xdd, 0xdf, 0x0a, 0x69, 0x64, 0x1c, 0x35, 0xf4, 0x3c, 0x5e, 0x4e, 0xc1, 0x71, + 0xa0, 0x06, 0xa3, 0x22, 0x2f, 0xa4, 0x63, 0x2a, 0x85, 0x24, 0x95, 0x46, 0x0a, 0x8e, 0x03, 0x35, + 0xec, 0xef, 0x17, 0xe0, 0x22, 0xff, 0x8c, 0x54, 0xbc, 0xd0, 0x37, 0x87, 0xc5, 0x0b, 0x8d, 0x38, + 0x95, 0x39, 0xaf, 0x33, 0x44, 0x0b, 0xfd, 0x2d, 0x0b, 0x66, 0x5b, 0xc9, 0x96, 0xce, 0xc7, 0x2e, + 0x97, 0xd5, 0x87, 0xc2, 0xed, 0x2e, 0x55, 0x88, 0x69, 0xfe, 0xe4, 0x97, 0x2d, 0x98, 0x4d, 0x8a, + 0xa9, 0x56, 0xf7, 0x73, 0x68, 0x24, 0xed, 0x27, 0x9f, 0x2c, 0x0f, 0x31, 0x2d, 0x82, 0xfd, 0xfb, + 0x63, 0xb2, 0x4b, 0xcf, 0x23, 0x18, 0x86, 0xdc, 0x83, 0x72, 0xd4, 0x09, 0x45, 0xa1, 0xfc, 0xda, + 0x11, 0x0f, 0xad, 0x9b, 0x6b, 0x0d, 0xe1, 0x02, 0x12, 0xeb, 0x95, 0xb2, 0x84, 0xe9, 0xc7, 0x8a, + 0x17, 0x67, 0xdc, 0xec, 0x49, 0xc6, 0xb9, 0x9c, 0x96, 0x37, 0x97, 0x37, 0xd2, 0x8c, 0x65, 0x09, + 0x63, 0xac, 0x78, 0xd9, 0xbf, 0x6e, 0x41, 0xf9, 0x86, 0xaf, 0xd6, 0x91, 0x9f, 0xc9, 0xc1, 0x16, + 0xa5, 0x55, 0x56, 0xad, 0xb4, 0xc4, 0xa7, 0xa0, 0x57, 0x12, 0x96, 0xa8, 0xc7, 0x0c, 0xda, 0x8b, + 0x3c, 0xd1, 0x1f, 0x23, 0x75, 0xc3, 0xdf, 0x1a, 0x6a, 0x3e, 0xfe, 0x95, 0x22, 0x4c, 0xbf, 0xe6, + 0xec, 0x53, 0x2f, 0x72, 0x4e, 0xbf, 0x49, 0xbc, 0x08, 0x15, 0xa7, 0xc7, 0xef, 0x32, 0x8d, 0x63, + 0x48, 0x6c, 0xdc, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x88, 0x4c, 0xc9, 0x5a, 0x8a, 0x96, + 0x53, 0x70, 0x1c, 0xa8, 0x41, 0x6e, 0x00, 0x91, 0xd1, 0xdc, 0xb5, 0x66, 0xd3, 0xef, 0x7b, 0x62, + 0x49, 0x13, 0x76, 0x1f, 0x7d, 0x1e, 0x5e, 0x1f, 0xc0, 0xc0, 0x8c, 0x5a, 0xe4, 0xb3, 0x30, 0xdf, + 0xe4, 0x94, 0xe5, 0xe9, 0xc8, 0xa4, 0x28, 0x4e, 0xc8, 0x3a, 0xd6, 0x63, 0x79, 0x08, 0x1e, 0x0e, + 0xa5, 0xc0, 0x24, 0x0d, 0x23, 0x3f, 0x70, 0xda, 0xd4, 0xa4, 0x3b, 0x91, 0x94, 0xb4, 0x31, 0x80, + 0x81, 0x19, 0xb5, 0xc8, 0x17, 0xa1, 0x1c, 0xed, 0x04, 0x34, 0xdc, 0xf1, 0x3b, 0x2d, 0xe9, 0x7b, + 0x32, 0xa2, 0x31, 0x50, 0xf6, 0xfe, 0xa6, 0xa2, 0x6a, 0x0c, 0x6f, 0x55, 0x84, 0x31, 0x4f, 0x12, + 0xc0, 0x44, 0xd8, 0xf4, 0x7b, 0x34, 0x94, 0xa7, 0x8a, 0x1b, 0xb9, 0x70, 0xe7, 0xc6, 0x2d, 0xc3, + 0x0c, 0xc9, 0x39, 0xa0, 0xe4, 0x64, 0xff, 0xee, 0x18, 0x4c, 0x99, 0x88, 0x27, 0x58, 0x9b, 0xbe, + 0x62, 0xc1, 0x54, 0xd3, 0xf7, 0xa2, 0xc0, 0xef, 0xc4, 0x59, 0x0a, 0x46, 0xd7, 0x28, 0x18, 0xa9, + 0x15, 0x1a, 0x39, 0x6e, 0xc7, 0xb0, 0xd6, 0x19, 0x6c, 0x30, 0xc1, 0x94, 0x7c, 0xc3, 0x82, 0xd9, + 0xd8, 0x55, 0x31, 0xb6, 0xf5, 0xe5, 0x2a, 0x88, 0x5e, 0xea, 0xaf, 0x26, 0x39, 0x61, 0x9a, 0xb5, + 0xbd, 0x05, 0x73, 0xe9, 0xde, 0x66, 0x4d, 0xd9, 0x73, 0xe4, 0x5c, 0x2f, 0xc4, 0x4d, 0xb9, 0xe1, + 0x84, 0x21, 0x72, 0x08, 0x79, 0x16, 0x4a, 0x5d, 0x27, 0x68, 0xbb, 0x9e, 0xd3, 0xe1, 0xad, 0x58, + 0x30, 0x16, 0x24, 0x59, 0x8e, 0x1a, 0xc3, 0xfe, 0x18, 0x4c, 0xad, 0x3b, 0x5e, 0x9b, 0xb6, 0xe4, + 0x3a, 0x7c, 0x7c, 0x38, 0xe6, 0x9f, 0x8c, 0x43, 0xc5, 0x38, 0x3e, 0x9e, 0xff, 0x39, 0x2b, 0x91, + 0x7d, 0xa7, 0x90, 0x63, 0xf6, 0x9d, 0x4f, 0x03, 0x6c, 0xbb, 0x9e, 0x1b, 0xee, 0x9c, 0x31, 0xaf, + 0x0f, 0xbf, 0x9b, 0xbf, 0xa6, 0x29, 0xa0, 0x41, 0x2d, 0xbe, 0x00, 0x2d, 0x1e, 0x91, 0x22, 0xef, + 0x5d, 0xcb, 0xd8, 0x6e, 0x26, 0xf2, 0x70, 0xf8, 0x30, 0x3a, 0x66, 0x51, 0x6d, 0x3f, 0xe2, 0x6e, + 0xea, 0xa8, 0x5d, 0x69, 0x13, 0x4a, 0x01, 0x0d, 0xfb, 0x5d, 0x7a, 0xa6, 0x0c, 0x3c, 0xdc, 0xf5, + 0x06, 0x65, 0x7d, 0xd4, 0x94, 0x16, 0x5e, 0x86, 0xe9, 0x84, 0x08, 0xa7, 0xba, 0x61, 0xf2, 0x21, + 0xd3, 0x46, 0x71, 0x96, 0xfb, 0x26, 0xd6, 0x17, 0x1d, 0x23, 0xf3, 0x8e, 0xee, 0x0b, 0xe1, 0x60, + 0x25, 0x60, 0xf6, 0x8f, 0x27, 0x40, 0xfa, 0x30, 0x9c, 0x60, 0xb9, 0x32, 0x6f, 0x2e, 0xc7, 0xce, + 0x70, 0x73, 0x79, 0x03, 0xa6, 0x5c, 0xcf, 0x8d, 0x5c, 0xa7, 0xc3, 0xed, 0x4f, 0x72, 0x3b, 0x55, + 0x1e, 0xe8, 0x53, 0xab, 0x06, 0x2c, 0x83, 0x4e, 0xa2, 0x2e, 0x79, 0x1d, 0x8a, 0x7c, 0xbf, 0x91, + 0x03, 0xf8, 0xf4, 0x8e, 0x16, 0xdc, 0xc7, 0x46, 0x84, 0xa5, 0x09, 0x4a, 0xfc, 0xf0, 0x21, 0x52, + 0x0f, 0xe9, 0xe3, 0xb7, 0x1c, 0xc7, 0xf1, 0xe1, 0x23, 0x05, 0xc7, 0x81, 0x1a, 0x8c, 0xca, 0xb6, + 0xe3, 0x76, 0xfa, 0x01, 0x8d, 0xa9, 0x4c, 0x24, 0xa9, 0x5c, 0x4b, 0xc1, 0x71, 0xa0, 0x06, 0xd9, + 0x86, 0x29, 0x59, 0x26, 0xdc, 0xe6, 0x26, 0xcf, 0xf8, 0x95, 0xdc, 0x3d, 0xf2, 0x9a, 0x41, 0x09, + 0x13, 0x74, 0x49, 0x1f, 0x2e, 0xb8, 0x5e, 0xd3, 0xf7, 0x9a, 0x9d, 0x7e, 0xe8, 0xee, 0xd1, 0x38, + 0x26, 0xec, 0x2c, 0xcc, 0x2e, 0x1f, 0x1e, 0x54, 0x2f, 0xac, 0xa6, 0xc9, 0xe1, 0x20, 0x07, 0xf2, + 0x25, 0x0b, 0x2e, 0x37, 0x7d, 0x2f, 0xe4, 0xa9, 0x2b, 0xf6, 0xe8, 0xd5, 0x20, 0xf0, 0x03, 0xc1, + 0xbb, 0x7c, 0x46, 0xde, 0xdc, 0xec, 0xb9, 0x9c, 0x45, 0x12, 0xb3, 0x39, 0x91, 0xb7, 0xa0, 0xd4, + 0x0b, 0xfc, 0x3d, 0xb7, 0x45, 0x03, 0xe9, 0x82, 0xb9, 0x96, 0x47, 0x3e, 0x9f, 0x0d, 0x49, 0x33, + 0x5e, 0x7a, 0x54, 0x09, 0x6a, 0x7e, 0xf6, 0xff, 0xa9, 0xc0, 0x4c, 0x12, 0x9d, 0xfc, 0x1c, 0x40, + 0x2f, 0xf0, 0xbb, 0x34, 0xda, 0xa1, 0x3a, 0xb6, 0xe7, 0xe6, 0xa8, 0x19, 0x5b, 0x14, 0x3d, 0xe5, + 0xb6, 0xc4, 0x96, 0x8b, 0xb8, 0x14, 0x0d, 0x8e, 0x24, 0x80, 0xc9, 0x5d, 0xb1, 0xed, 0x4a, 0x2d, + 0xe4, 0xb5, 0x5c, 0x74, 0x26, 0xc9, 0x99, 0x07, 0xa5, 0xc8, 0x22, 0x54, 0x8c, 0xc8, 0x16, 0x14, + 0xee, 0xd1, 0xad, 0x7c, 0xd2, 0x05, 0xdc, 0xa1, 0xf2, 0x34, 0x53, 0x9f, 0x3c, 0x3c, 0xa8, 0x16, + 0xee, 0xd0, 0x2d, 0x64, 0xc4, 0xd9, 0x77, 0xb5, 0x84, 0xef, 0x82, 0x5c, 0x2a, 0x5e, 0xcb, 0xd1, + 0x11, 0x42, 0x7c, 0x97, 0x2c, 0x42, 0xc5, 0x88, 0xbc, 0x05, 0xe5, 0x7b, 0xce, 0x1e, 0xdd, 0x0e, + 0x7c, 0x2f, 0x92, 0xbe, 0x72, 0x23, 0x86, 0x7b, 0xdc, 0x51, 0xe4, 0x24, 0x5f, 0xbe, 0xbd, 0xeb, + 0x42, 0x8c, 0xd9, 0x91, 0x3d, 0x28, 0x79, 0xf4, 0x1e, 0xd2, 0x8e, 0xdb, 0xcc, 0x27, 0xbc, 0xe2, + 0xa6, 0xa4, 0x26, 0x39, 0xf3, 0x7d, 0x4f, 0x95, 0xa1, 0xe6, 0xc5, 0xfa, 0xf2, 0xae, 0xbf, 0x25, + 0x17, 0xaa, 0x11, 0xfb, 0x52, 0x9f, 0x4c, 0x45, 0x5f, 0xde, 0xf0, 0xb7, 0x90, 0x11, 0x67, 0x73, + 0xa4, 0xa9, 0x1d, 0xb5, 0xe4, 0x32, 0x75, 0x33, 0x5f, 0x07, 0x35, 0x31, 0x47, 0xe2, 0x52, 0x34, + 0x38, 0xb2, 0xb6, 0x6d, 0x4b, 0x63, 0xa5, 0x5c, 0xa8, 0x46, 0x6c, 0xdb, 0xa4, 0xe9, 0x53, 0xb4, + 0xad, 0x2a, 0x43, 0xcd, 0x8b, 0xf1, 0x75, 0xa5, 0xe5, 0x2f, 0x9f, 0xa5, 0x2a, 0x69, 0x47, 0x14, + 0x7c, 0x55, 0x19, 0x6a, 0x5e, 0xac, 0xbd, 0xc3, 0xdd, 0xfd, 0x7b, 0x4e, 0x67, 0xd7, 0xf5, 0xda, + 0x32, 0x56, 0x75, 0xd4, 0x34, 0xdc, 0xbb, 0xfb, 0x77, 0x04, 0x3d, 0xb3, 0xbd, 0xe3, 0x52, 0x34, + 0x38, 0x92, 0xbf, 0x6f, 0xc1, 0x44, 0xaf, 0xd3, 0x6f, 0xbb, 0xde, 0xfc, 0x54, 0x1e, 0x4e, 0x4c, + 0xc9, 0x25, 0x77, 0x71, 0x83, 0x93, 0x16, 0x8a, 0xe2, 0x4f, 0x6a, 0xbf, 0x4b, 0x5e, 0xf8, 0xf5, + 0x3f, 0xae, 0xce, 0x53, 0xaf, 0xe9, 0xb7, 0x5c, 0xaf, 0xbd, 0x74, 0x37, 0xf4, 0xbd, 0x45, 0x74, + 0xee, 0x29, 0x1d, 0x5d, 0xca, 0xb4, 0xf0, 0x09, 0xa8, 0x18, 0x24, 0x8e, 0x53, 0xf4, 0xa6, 0x4c, + 0x45, 0xef, 0xd7, 0x27, 0x60, 0xca, 0x4c, 0xbe, 0x79, 0x02, 0xed, 0x4b, 0x9f, 0x38, 0xc6, 0x4e, + 0x73, 0xe2, 0x60, 0x47, 0x4c, 0xe3, 0x82, 0x4b, 0x99, 0xb7, 0x56, 0x73, 0x53, 0xb8, 0xe3, 0x23, + 0xa6, 0x51, 0x18, 0x62, 0x82, 0xe9, 0x29, 0x7c, 0x5e, 0x98, 0xda, 0x2a, 0x14, 0xbb, 0x62, 0x52, + 0x6d, 0x4d, 0xa8, 0x6a, 0xcf, 0x01, 0xc4, 0x59, 0x22, 0xe5, 0xc5, 0xa7, 0xd6, 0x87, 0x8d, 0xec, + 0x95, 0x06, 0x16, 0x79, 0x0a, 0x26, 0x98, 0xea, 0x43, 0x5b, 0x32, 0x94, 0x5e, 0x9f, 0xe3, 0xaf, + 0xf1, 0x52, 0x94, 0x50, 0xf2, 0x12, 0xd3, 0x52, 0x63, 0x85, 0x45, 0x46, 0xc8, 0x5f, 0x8a, 0xb5, + 0xd4, 0x18, 0x86, 0x09, 0x4c, 0x26, 0x3a, 0x65, 0xfa, 0x05, 0x5f, 0x1b, 0x0c, 0xd1, 0xb9, 0xd2, + 0x81, 0x02, 0xc6, 0xed, 0x4a, 0x29, 0x7d, 0x84, 0xcf, 0xe9, 0xa2, 0x61, 0x57, 0x4a, 0xc1, 0x71, + 0xa0, 0x06, 0xfb, 0x18, 0x79, 0x67, 0x5b, 0x11, 0x0e, 0xd3, 0x43, 0x6e, 0x5b, 0xbf, 0x6a, 0x9e, + 0xb5, 0x72, 0x9c, 0x43, 0x62, 0xd4, 0x9e, 0xfc, 0xb0, 0x35, 0xda, 0xb1, 0xe8, 0x73, 0x30, 0x93, + 0xdc, 0x85, 0x72, 0xbf, 0xf9, 0xf8, 0xda, 0x38, 0x5c, 0xbc, 0xd9, 0x76, 0xbd, 0x74, 0xa2, 0xb3, + 0xac, 0x57, 0x0d, 0xac, 0x53, 0xbf, 0x6a, 0xa0, 0x63, 0xf2, 0xe4, 0x9b, 0x01, 0xd9, 0x31, 0x79, + 0xea, 0x01, 0x87, 0x24, 0x2e, 0xf9, 0x23, 0x0b, 0x1e, 0x73, 0x5a, 0xe2, 0x5c, 0xe0, 0x74, 0x64, + 0xa9, 0x91, 0x8c, 0x5b, 0xce, 0xe8, 0x70, 0xc4, 0x5d, 0x7e, 0xf0, 0xe3, 0x17, 0x6b, 0x47, 0x70, + 0x15, 0x3d, 0xfe, 0x13, 0xf2, 0x0b, 0x1e, 0x3b, 0x0a, 0x15, 0x8f, 0x14, 0x9f, 0xfc, 0x35, 0x98, + 0x4d, 0x7c, 0xb0, 0xb4, 0x84, 0x97, 0xc5, 0x85, 0x45, 0x23, 0x09, 0xc2, 0x34, 0xee, 0xc2, 0x2d, + 0xf8, 0xf0, 0xb1, 0x72, 0x9e, 0x6a, 0xb0, 0x7d, 0xcf, 0x82, 0x29, 0x33, 0x27, 0x11, 0x79, 0x16, + 0x4a, 0x91, 0xbf, 0x4b, 0xbd, 0xdb, 0x81, 0x72, 0xd8, 0xd5, 0x03, 0x7d, 0x93, 0x97, 0xe3, 0x1a, + 0x6a, 0x0c, 0x86, 0xdd, 0xec, 0xb8, 0xd4, 0x8b, 0x56, 0x5b, 0xb2, 0x9b, 0x35, 0xf6, 0xb2, 0x28, + 0x5f, 0x41, 0x8d, 0x21, 0x7c, 0xec, 0xd8, 0xef, 0x06, 0x6d, 0x06, 0x54, 0xb9, 0xf7, 0x1b, 0x3e, + 0x76, 0x31, 0x0c, 0x13, 0x98, 0xc4, 0xd6, 0x26, 0xce, 0xf1, 0xf8, 0x5e, 0x23, 0x65, 0x92, 0xfc, + 0x2d, 0x0b, 0xca, 0xc2, 0x44, 0x8f, 0x74, 0x3b, 0xe5, 0x62, 0x9b, 0x32, 0x22, 0xd4, 0x36, 0x56, + 0xb3, 0x5c, 0x6c, 0x9f, 0x80, 0xf1, 0x5d, 0xd7, 0x53, 0x5f, 0xa2, 0xb7, 0xa5, 0xd7, 0x5c, 0xaf, + 0x85, 0x1c, 0xa2, 0x37, 0xae, 0xc2, 0xd0, 0x8d, 0x6b, 0x09, 0xca, 0xda, 0xf1, 0x44, 0x2e, 0xff, + 0xda, 0x7a, 0xab, 0x1d, 0x55, 0x30, 0xc6, 0xb1, 0x7f, 0xd5, 0x82, 0x19, 0x1e, 0xc3, 0x1d, 0x9f, + 0x87, 0x5f, 0xd4, 0xbe, 0x60, 0x42, 0xee, 0xc7, 0x93, 0xbe, 0x60, 0xef, 0x1d, 0x54, 0x2b, 0x22, + 0xea, 0x3b, 0xe9, 0x1a, 0xf6, 0x19, 0x69, 0x44, 0xe3, 0x1e, 0x6b, 0x63, 0xa7, 0xb6, 0xf1, 0xc4, + 0x62, 0x2a, 0x22, 0x18, 0xd3, 0xb3, 0xdf, 0x86, 0x29, 0x33, 0x18, 0x8b, 0xbc, 0x08, 0x95, 0x9e, + 0xeb, 0xb5, 0x93, 0x41, 0xbb, 0xfa, 0xa2, 0x61, 0x23, 0x06, 0xa1, 0x89, 0xc7, 0xab, 0xf9, 0x71, + 0xb5, 0xd4, 0xfd, 0xc4, 0x86, 0x6f, 0x56, 0x8b, 0xff, 0xf0, 0x87, 0x10, 0x32, 0x82, 0xfe, 0x72, + 0x7f, 0x08, 0x21, 0x83, 0xc7, 0xfb, 0xf7, 0x10, 0x42, 0x96, 0x30, 0x7f, 0xbe, 0x1e, 0x42, 0xf8, + 0x69, 0x38, 0x6d, 0x4e, 0x54, 0xb6, 0xd7, 0xdf, 0x33, 0x13, 0x2b, 0xe8, 0x16, 0x97, 0x99, 0x15, + 0x24, 0xd4, 0xfe, 0x9d, 0x02, 0xcc, 0xa5, 0x8f, 0xfc, 0x79, 0x7b, 0x53, 0x90, 0x6f, 0x58, 0x30, + 0xe3, 0x24, 0xf2, 0xcf, 0xe5, 0xf4, 0xaa, 0x52, 0x82, 0xa6, 0x91, 0xff, 0x2c, 0x51, 0x8e, 0x29, + 0xde, 0xe4, 0x2f, 0xc1, 0x64, 0xe4, 0x76, 0xa9, 0xdf, 0x17, 0x86, 0xc0, 0x82, 0x38, 0x90, 0x6f, + 0x8a, 0x22, 0x54, 0x30, 0xb6, 0x28, 0xbb, 0x5c, 0x83, 0x0a, 0xa8, 0xf4, 0x0c, 0x9e, 0x8b, 0x2d, + 0x97, 0xa2, 0x1c, 0x35, 0x06, 0xb9, 0x0f, 0x93, 0xc2, 0xef, 0x42, 0x39, 0xd8, 0xac, 0xe7, 0x64, + 0x9a, 0x10, 0xae, 0x1d, 0x71, 0x17, 0x88, 0xff, 0x21, 0x2a, 0x76, 0xf6, 0xc7, 0xe0, 0x94, 0x49, + 0x62, 0xed, 0xab, 0x40, 0xd0, 0xef, 0x74, 0xb6, 0x9c, 0xe6, 0xee, 0x1d, 0xd7, 0x6b, 0xf9, 0xf7, + 0xf8, 0x52, 0xb4, 0x04, 0xe5, 0x40, 0x86, 0xcc, 0x86, 0x72, 0xd4, 0xe8, 0xb5, 0x4c, 0xc5, 0xd2, + 0x86, 0x18, 0xe3, 0xd8, 0xbf, 0x3f, 0x06, 0x93, 0x32, 0xbe, 0xfb, 0x01, 0x44, 0x26, 0xec, 0x26, + 0xee, 0x83, 0x57, 0x73, 0x09, 0x4b, 0x1f, 0x1a, 0x96, 0x10, 0xa6, 0xc2, 0x12, 0x5e, 0xcb, 0x87, + 0xdd, 0xd1, 0x31, 0x09, 0xdf, 0x2d, 0xc2, 0x6c, 0x2a, 0x5e, 0x3e, 0x95, 0x4f, 0xda, 0x7a, 0x5f, + 0xf2, 0x49, 0x93, 0x30, 0x91, 0x53, 0x3c, 0x3f, 0x3f, 0xc6, 0xbf, 0x48, 0x2f, 0x9e, 0x97, 0x87, + 0x69, 0xf1, 0x83, 0xe3, 0x61, 0xfa, 0x5f, 0x2c, 0x78, 0x64, 0x68, 0xd6, 0x07, 0x9e, 0x34, 0x2c, + 0x48, 0x42, 0xe5, 0x7a, 0x91, 0x73, 0x6e, 0x1b, 0x7d, 0x77, 0x9c, 0xce, 0xf3, 0x94, 0x66, 0x4f, + 0x5e, 0x80, 0x29, 0xae, 0x9f, 0xb1, 0x95, 0x33, 0xa2, 0x3d, 0x79, 0xf5, 0xc5, 0x2f, 0x41, 0x1a, + 0x46, 0x39, 0x26, 0xb0, 0xec, 0xef, 0x58, 0x30, 0x3f, 0x2c, 0x85, 0xd4, 0x09, 0x0c, 0x33, 0x7f, + 0x35, 0x15, 0xd9, 0x51, 0x1d, 0x88, 0xec, 0x48, 0x99, 0x66, 0x54, 0x10, 0x87, 0x61, 0x15, 0x29, + 0x1c, 0x13, 0xb8, 0xf0, 0x07, 0x05, 0x98, 0x93, 0x22, 0xc6, 0x4a, 0xf1, 0x4b, 0x89, 0x78, 0x94, + 0x9f, 0x48, 0xc5, 0xa3, 0x5c, 0x4a, 0xe3, 0xff, 0x45, 0x30, 0xca, 0x07, 0x2b, 0x18, 0xe5, 0xeb, + 0x45, 0xb8, 0x9c, 0x99, 0x49, 0x8a, 0x7c, 0x2d, 0x63, 0xa7, 0xb8, 0x93, 0x73, 0xca, 0x2a, 0x1d, + 0xb7, 0x7a, 0xbe, 0x11, 0x1c, 0xbf, 0x6c, 0x46, 0x4e, 0x88, 0xd5, 0x7f, 0xfb, 0x1c, 0x92, 0x6f, + 0x9d, 0x36, 0x88, 0xe2, 0xc1, 0xbe, 0xb7, 0xf5, 0xe7, 0x60, 0xa9, 0xff, 0x7a, 0x01, 0x9e, 0x3e, + 0x69, 0xcb, 0x7e, 0x40, 0xa3, 0x0e, 0xc3, 0x44, 0xd4, 0xe1, 0x03, 0x52, 0x6d, 0xce, 0x25, 0x00, + 0xf1, 0x1f, 0x8e, 0xeb, 0x7d, 0x77, 0x70, 0xc2, 0x9e, 0xc8, 0x51, 0x63, 0x92, 0xa9, 0xbe, 0x2a, + 0x2b, 0x79, 0xbc, 0x37, 0x4c, 0x36, 0x44, 0xf1, 0x7b, 0x07, 0xd5, 0x0b, 0x71, 0x82, 0x17, 0x59, + 0x88, 0xaa, 0x12, 0x79, 0x1a, 0x4a, 0x81, 0x80, 0xaa, 0x38, 0x2b, 0xe9, 0xed, 0x22, 0xca, 0x50, + 0x43, 0xc9, 0x17, 0x8d, 0xb3, 0xc2, 0xf8, 0x79, 0xe5, 0x31, 0x3a, 0xca, 0x89, 0xe7, 0x4d, 0x28, + 0x85, 0x2a, 0x75, 0xb6, 0x98, 0x4e, 0xcf, 0x9f, 0x30, 0x7c, 0xcf, 0xd9, 0xa2, 0x1d, 0x95, 0x47, + 0x5b, 0x7c, 0x9f, 0xce, 0xb2, 0xad, 0x49, 0x12, 0x5b, 0x9f, 0xbd, 0xc5, 0x25, 0x03, 0x0c, 0x9e, + 0xbb, 0x49, 0x04, 0x93, 0xf2, 0xfd, 0x5c, 0x79, 0xfb, 0xb9, 0x9e, 0x53, 0x1c, 0x8c, 0xf4, 0x92, + 0xe6, 0x47, 0x5a, 0x65, 0x03, 0x52, 0xac, 0xec, 0x1f, 0x58, 0x50, 0x91, 0x63, 0xe4, 0x01, 0xc4, + 0x31, 0xde, 0x4d, 0xc6, 0x31, 0x5e, 0xcd, 0x65, 0x09, 0x1f, 0x12, 0xc4, 0x78, 0x17, 0xa6, 0xcc, + 0x9c, 0x8e, 0xe4, 0xd3, 0xc6, 0x16, 0x64, 0x8d, 0x92, 0x25, 0x4d, 0x6d, 0x52, 0xf1, 0xf6, 0x64, + 0xff, 0x46, 0x59, 0xb7, 0x22, 0x3f, 0x38, 0x9b, 0x23, 0xdf, 0x3a, 0x72, 0xe4, 0x9b, 0x03, 0x6f, + 0x2c, 0xff, 0x81, 0xf7, 0x3a, 0x94, 0xd4, 0xb2, 0x28, 0xb5, 0xa9, 0x27, 0x4d, 0xb7, 0x69, 0xa6, + 0x92, 0x31, 0x62, 0xc6, 0x74, 0xe1, 0x07, 0xe0, 0xd8, 0x32, 0xad, 0x96, 0x6b, 0x4d, 0x86, 0xbc, + 0x05, 0x95, 0x7b, 0x7e, 0xb0, 0xdb, 0xf1, 0x1d, 0xfe, 0x5e, 0x01, 0xe4, 0x71, 0x53, 0xaf, 0xad, + 0xcb, 0x22, 0x76, 0xe5, 0x4e, 0x4c, 0x1f, 0x4d, 0x66, 0xa4, 0x06, 0xb3, 0x5d, 0xd7, 0x43, 0xea, + 0xb4, 0x74, 0xb8, 0xe2, 0xb8, 0xc8, 0x15, 0xae, 0x74, 0xfb, 0xf5, 0x24, 0x18, 0xd3, 0xf8, 0xdc, + 0xf2, 0x14, 0x24, 0x4c, 0x1d, 0x32, 0x21, 0xf0, 0xc6, 0xe8, 0x83, 0x31, 0x69, 0x3e, 0x11, 0xc1, + 0x1b, 0xc9, 0x72, 0x4c, 0xf1, 0x26, 0x5f, 0x80, 0x52, 0xa8, 0x5e, 0xa6, 0x2c, 0xe6, 0x78, 0xea, + 0xd1, 0xaf, 0x53, 0xea, 0xae, 0xd4, 0xcf, 0x53, 0x6a, 0x86, 0x64, 0x0d, 0x2e, 0x29, 0xdb, 0x4d, + 0xe2, 0x91, 0xbd, 0x89, 0x38, 0xbf, 0x17, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0xd3, 0x6d, 0x79, 0xae, + 0x54, 0x71, 0x33, 0x6a, 0x5c, 0x26, 0xf2, 0xf9, 0xd7, 0x42, 0x09, 0x3d, 0x2a, 0x1a, 0xb7, 0x34, + 0x42, 0x34, 0x6e, 0x03, 0x2e, 0xa7, 0x41, 0x3c, 0x71, 0x1b, 0xcf, 0x15, 0x67, 0x6c, 0xa1, 0x1b, + 0x59, 0x48, 0x98, 0x5d, 0x97, 0xdc, 0x81, 0x72, 0x40, 0xf9, 0x29, 0xaf, 0xa6, 0x9c, 0xca, 0x4e, + 0xed, 0x3e, 0x8b, 0x8a, 0x00, 0xc6, 0xb4, 0x58, 0xbf, 0x3b, 0xc9, 0xec, 0xdd, 0xaf, 0xe7, 0xf8, + 0x74, 0xb5, 0xec, 0xfb, 0x21, 0x09, 0x15, 0xed, 0x7f, 0x3b, 0x0b, 0xd3, 0x09, 0x03, 0x14, 0x79, + 0x12, 0x8a, 0x3c, 0x93, 0x1d, 0x5f, 0xad, 0x4a, 0xf1, 0x8a, 0x2a, 0x1a, 0x47, 0xc0, 0xc8, 0x2f, + 0x5a, 0x30, 0xdb, 0x4b, 0x5c, 0xa8, 0xa8, 0x85, 0x7c, 0x44, 0xab, 0x6d, 0xf2, 0x96, 0xc6, 0x78, + 0xf7, 0x22, 0xc9, 0x0c, 0xd3, 0xdc, 0xd9, 0x7a, 0x20, 0x7d, 0xd0, 0x3b, 0x34, 0xe0, 0xd8, 0x52, + 0xd1, 0xd3, 0x24, 0x96, 0x93, 0x60, 0x4c, 0xe3, 0xb3, 0x1e, 0xe6, 0x5f, 0x37, 0xca, 0xf3, 0xa4, + 0x35, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x15, 0x98, 0x91, 0x49, 0x9b, 0x37, 0xfc, 0xd6, 0x75, 0x27, + 0xdc, 0x91, 0x47, 0x3e, 0x7d, 0x44, 0x5d, 0x4e, 0x40, 0x31, 0x85, 0xcd, 0xbf, 0x2d, 0xce, 0x8c, + 0xcd, 0x09, 0x4c, 0x24, 0x9f, 0x05, 0x59, 0x4e, 0x82, 0x31, 0x8d, 0x4f, 0x9e, 0x35, 0xb6, 0x21, + 0xe1, 0xad, 0xa0, 0x57, 0x83, 0x8c, 0xad, 0xa8, 0x06, 0xb3, 0x7d, 0x7e, 0x42, 0x6e, 0x29, 0xa0, + 0x9c, 0x8f, 0x9a, 0xe1, 0xed, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x65, 0x98, 0x0e, 0xd8, 0x62, 0xab, + 0x09, 0x08, 0x17, 0x06, 0x7d, 0x43, 0x8d, 0x26, 0x10, 0x93, 0xb8, 0xe4, 0x55, 0xb8, 0x10, 0xe7, + 0x38, 0x55, 0x04, 0x84, 0x4f, 0x83, 0x4e, 0xb8, 0x57, 0x4b, 0x23, 0xe0, 0x60, 0x1d, 0xf2, 0x37, + 0x60, 0xce, 0x68, 0x89, 0x55, 0xaf, 0x45, 0xef, 0xcb, 0x3c, 0x94, 0xfc, 0x99, 0xab, 0xe5, 0x14, + 0x0c, 0x07, 0xb0, 0xc9, 0x27, 0x61, 0xa6, 0xe9, 0x77, 0x3a, 0x7c, 0x8d, 0x13, 0x4f, 0x52, 0x88, + 0x84, 0x93, 0x22, 0x35, 0x67, 0x02, 0x82, 0x29, 0x4c, 0x72, 0x03, 0x88, 0xbf, 0xc5, 0xd4, 0x2b, + 0xda, 0x7a, 0x95, 0x7a, 0x54, 0x6a, 0x1c, 0xd3, 0xc9, 0x08, 0x98, 0x5b, 0x03, 0x18, 0x98, 0x51, + 0x8b, 0xe7, 0xeb, 0x33, 0x22, 0x86, 0x67, 0xf2, 0x78, 0x4b, 0x33, 0x6d, 0xcf, 0x39, 0x36, 0x5c, + 0x38, 0x80, 0x09, 0x11, 0x90, 0x94, 0x4f, 0xe6, 0x49, 0x33, 0x3b, 0x7d, 0xbc, 0x47, 0x88, 0x52, + 0x94, 0x9c, 0xc8, 0xcf, 0x41, 0x79, 0x4b, 0x3d, 0x55, 0xc2, 0xd3, 0x4d, 0x8e, 0xbc, 0x2f, 0xa6, + 0x5e, 0xdd, 0x89, 0xed, 0x15, 0x1a, 0x80, 0x31, 0x4b, 0xf2, 0x14, 0x54, 0xae, 0x6f, 0xd4, 0xf4, + 0x28, 0xbc, 0xc0, 0x7b, 0x7f, 0x9c, 0x55, 0x41, 0x13, 0xc0, 0x66, 0x98, 0x56, 0xdf, 0x48, 0xf2, + 0x9a, 0x3e, 0x43, 0x1b, 0x63, 0xd8, 0xdc, 0xef, 0x00, 0x1b, 0xf3, 0x17, 0x53, 0xd8, 0xb2, 0x1c, + 0x35, 0x06, 0x79, 0x13, 0x2a, 0x72, 0xbf, 0xe0, 0x6b, 0xd3, 0xa5, 0xb3, 0x45, 0xa3, 0x63, 0x4c, + 0x02, 0x4d, 0x7a, 0xfc, 0xc2, 0x98, 0xbf, 0xe0, 0x40, 0xaf, 0xf5, 0x3b, 0x9d, 0xf9, 0xcb, 0x7c, + 0xdd, 0x8c, 0x2f, 0x8c, 0x63, 0x10, 0x9a, 0x78, 0xe4, 0x79, 0xe5, 0x3f, 0xf6, 0x50, 0xe2, 0x06, + 0x5d, 0xfb, 0x8f, 0x69, 0xa5, 0x7b, 0x48, 0xc0, 0xca, 0xc3, 0xc7, 0x38, 0x6e, 0x6d, 0xc1, 0x82, + 0xd2, 0xf8, 0x06, 0x27, 0xc9, 0xfc, 0x7c, 0xc2, 0x76, 0xb4, 0x70, 0x67, 0x28, 0x26, 0x1e, 0x41, + 0x85, 0x6c, 0x41, 0xc1, 0xe9, 0x6c, 0xcd, 0x3f, 0x92, 0x87, 0xea, 0x5a, 0x5b, 0xab, 0xcb, 0x11, + 0xc5, 0x9d, 0x4c, 0x6b, 0x6b, 0x75, 0x64, 0xc4, 0x89, 0x0b, 0xe3, 0x4e, 0x67, 0x2b, 0x9c, 0x5f, + 0xe0, 0x73, 0x36, 0x37, 0x26, 0xb1, 0xf1, 0x60, 0xad, 0x1e, 0x22, 0x67, 0x61, 0x7f, 0x69, 0x4c, + 0xdf, 0x12, 0xe9, 0xe4, 0xdf, 0x6f, 0x9b, 0x13, 0x48, 0x1c, 0x77, 0x6e, 0xe5, 0x36, 0x81, 0xa4, + 0x7a, 0x31, 0x3d, 0x74, 0xfa, 0xf4, 0xf4, 0x92, 0x91, 0x4b, 0xd6, 0xb0, 0x64, 0x62, 0x73, 0x71, + 0x7a, 0x4e, 0x2e, 0x18, 0xf6, 0x97, 0x2b, 0xda, 0x0a, 0x9a, 0xf2, 0xbd, 0x0a, 0xa0, 0xe8, 0x86, + 0x91, 0xeb, 0xe7, 0x18, 0xa4, 0x9d, 0xca, 0x08, 0xce, 0x63, 0x40, 0x38, 0x00, 0x05, 0x2b, 0xc6, + 0xd3, 0x6b, 0xbb, 0xde, 0x7d, 0xf9, 0xf9, 0xaf, 0xe7, 0xee, 0x54, 0x25, 0x78, 0x72, 0x00, 0x0a, + 0x56, 0xe4, 0xae, 0x18, 0xd4, 0x85, 0x3c, 0xfa, 0xba, 0xb6, 0x56, 0x4f, 0xf1, 0x4b, 0x0e, 0xee, + 0xbb, 0x50, 0x08, 0xbb, 0xae, 0x54, 0x97, 0x46, 0xe4, 0xd5, 0x58, 0x5f, 0xcd, 0xe2, 0xd5, 0x58, + 0x5f, 0x45, 0xc6, 0x84, 0x7c, 0xd5, 0x02, 0x70, 0xba, 0x5b, 0x4e, 0x18, 0x3a, 0x2d, 0x6d, 0x9d, + 0x19, 0xf1, 0xa5, 0x8f, 0x9a, 0xa6, 0x97, 0x62, 0xcd, 0xdd, 0x88, 0x63, 0x28, 0x1a, 0x9c, 0xc9, + 0x5b, 0x30, 0xe9, 0x88, 0xa7, 0x14, 0xa5, 0x47, 0x7c, 0x3e, 0xef, 0x83, 0xa6, 0x24, 0xe0, 0x66, + 0x1a, 0x09, 0x42, 0xc5, 0x90, 0xf1, 0x8e, 0x02, 0x87, 0x6e, 0xbb, 0xbb, 0xd2, 0x38, 0xd4, 0x18, + 0xf9, 0xb1, 0x0f, 0x46, 0x2c, 0x8b, 0xb7, 0x04, 0xa1, 0x62, 0x48, 0x7e, 0xde, 0x82, 0xe9, 0xae, + 0xe3, 0x39, 0x3a, 0xce, 0x31, 0x9f, 0x68, 0x58, 0x33, 0x72, 0x32, 0xd6, 0x10, 0xd7, 0x4d, 0x46, + 0x98, 0xe4, 0x4b, 0xf6, 0x60, 0xc2, 0xe1, 0x8f, 0xbc, 0xca, 0xa3, 0x18, 0xe6, 0xf1, 0x60, 0x6c, + 0xaa, 0x0d, 0xf8, 0xe2, 0x22, 0x9f, 0x92, 0x95, 0xdc, 0xc8, 0xaf, 0x59, 0x30, 0x29, 0x9c, 0xb5, + 0x99, 0x42, 0xca, 0xbe, 0xfd, 0x73, 0xe7, 0xf0, 0xb2, 0x80, 0x74, 0x24, 0x97, 0xee, 0x47, 0x1f, + 0xd1, 0x9e, 0xa8, 0xa2, 0xf4, 0x48, 0x57, 0x72, 0x25, 0x1d, 0x53, 0x7d, 0xbb, 0xce, 0xfd, 0xc4, + 0x53, 0x2e, 0xa6, 0xea, 0xbb, 0x9e, 0x82, 0xe1, 0x00, 0xf6, 0xc2, 0x27, 0x61, 0xca, 0x94, 0xe3, + 0x54, 0xee, 0xe8, 0x3f, 0x2a, 0x00, 0xf0, 0xae, 0x12, 0xb9, 0x51, 0xba, 0x3c, 0x91, 0xf2, 0x8e, + 0xdf, 0xca, 0xe9, 0x49, 0x49, 0x23, 0xc5, 0x09, 0xc8, 0xac, 0xc9, 0x3b, 0x7e, 0x0b, 0x25, 0x13, + 0xd2, 0x86, 0xf1, 0x9e, 0x13, 0xed, 0xe4, 0x9f, 0x4f, 0xa5, 0x24, 0x82, 0x84, 0xa3, 0x1d, 0xe4, + 0x0c, 0xc8, 0x3b, 0x56, 0xec, 0xd9, 0x53, 0xc8, 0x23, 0x17, 0x6c, 0xdc, 0x66, 0x8b, 0xd2, 0x97, + 0x27, 0x95, 0x12, 0x35, 0xed, 0xe1, 0xb3, 0xf0, 0xae, 0x05, 0x53, 0x26, 0x6a, 0x46, 0x37, 0xfd, + 0xac, 0xd9, 0x4d, 0x79, 0xb6, 0x87, 0xd9, 0xe3, 0xff, 0xcd, 0x02, 0xc0, 0xbe, 0xd7, 0xe8, 0x77, + 0xbb, 0x4c, 0x6d, 0xd7, 0x5e, 0xf7, 0xd6, 0x89, 0xbd, 0xee, 0xc7, 0x4e, 0xe9, 0x75, 0x5f, 0x38, + 0x95, 0xd7, 0xfd, 0xf8, 0xe9, 0xbd, 0xee, 0x8b, 0xc3, 0xbd, 0xee, 0xed, 0x6f, 0x59, 0x70, 0x61, + 0x60, 0xbf, 0x62, 0x9a, 0x74, 0xe0, 0xfb, 0xd1, 0x10, 0x8f, 0x4d, 0x8c, 0x41, 0x68, 0xe2, 0x91, + 0x15, 0x98, 0x93, 0xcf, 0x86, 0x34, 0x7a, 0x1d, 0x37, 0x33, 0xd7, 0xcd, 0x66, 0x0a, 0x8e, 0x03, + 0x35, 0xec, 0xdf, 0xb1, 0xa0, 0x62, 0x44, 0xc8, 0xb3, 0xef, 0xe0, 0x6e, 0xbb, 0x52, 0x8c, 0xf8, + 0xc5, 0x14, 0x7e, 0xd5, 0x25, 0x60, 0xe2, 0x1a, 0xba, 0x6d, 0x24, 0x95, 0x8f, 0xaf, 0xa1, 0x59, + 0x29, 0x4a, 0xa8, 0x48, 0x17, 0x4e, 0x7b, 0xbc, 0xd1, 0x0b, 0x66, 0xba, 0x70, 0xda, 0x43, 0x0e, + 0xe1, 0xec, 0xd8, 0x91, 0x42, 0x7a, 0xe4, 0x1a, 0x0f, 0xb4, 0x38, 0x41, 0x84, 0x02, 0x46, 0x1e, + 0x87, 0x02, 0xf5, 0x5a, 0xd2, 0xfe, 0xa1, 0x9f, 0x50, 0xbd, 0xea, 0xb5, 0x90, 0x95, 0xdb, 0xb7, + 0x60, 0x4a, 0x78, 0x23, 0xbf, 0x46, 0xf7, 0x4f, 0xfc, 0x26, 0x2b, 0x1b, 0xed, 0xa9, 0x37, 0x59, + 0x59, 0x75, 0x56, 0x6e, 0xff, 0x13, 0x0b, 0x52, 0xaf, 0x08, 0x19, 0x37, 0x30, 0xd6, 0xd0, 0x1b, + 0x18, 0xd3, 0x6a, 0x3f, 0x76, 0xa4, 0xd5, 0xfe, 0x06, 0x90, 0x2e, 0x9b, 0x0a, 0xc9, 0x85, 0xb6, + 0x90, 0x7c, 0xda, 0x61, 0x7d, 0x00, 0x03, 0x33, 0x6a, 0xd9, 0xff, 0x58, 0x08, 0x6b, 0xbe, 0x2b, + 0x74, 0x7c, 0x03, 0xf4, 0xa1, 0xc8, 0x49, 0x49, 0xfb, 0xdb, 0x88, 0xb6, 0xeb, 0xc1, 0xbc, 0x56, + 0x71, 0x47, 0xca, 0x29, 0xcf, 0xb9, 0xd9, 0x7f, 0x20, 0x64, 0x35, 0x1e, 0x1e, 0x3a, 0x81, 0xac, + 0xdd, 0xa4, 0xac, 0xd7, 0xf3, 0x5a, 0x2b, 0xb3, 0x65, 0x24, 0x8b, 0x00, 0x3d, 0x1a, 0x34, 0xa9, + 0x17, 0xa9, 0x38, 0xa1, 0xa2, 0x8c, 0x58, 0xd5, 0xa5, 0x68, 0x60, 0xd8, 0xdf, 0x64, 0x13, 0x28, + 0x7e, 0xad, 0x98, 0x3c, 0x9d, 0x76, 0x75, 0x4d, 0x4f, 0x0e, 0xed, 0xe9, 0x6a, 0x44, 0x8f, 0x8c, + 0x1d, 0x13, 0x3d, 0xf2, 0x0c, 0x4c, 0x06, 0x7e, 0x87, 0xd6, 0x02, 0x2f, 0xed, 0xa3, 0x83, 0xac, + 0x18, 0x6f, 0xa2, 0x82, 0xdb, 0xbf, 0x62, 0xc1, 0x5c, 0x3a, 0xbc, 0x2d, 0x77, 0xff, 0x5b, 0x33, + 0x06, 0xbf, 0x70, 0xfa, 0x18, 0x7c, 0xfb, 0x1d, 0x26, 0x64, 0xe4, 0x36, 0x77, 0x5d, 0x4f, 0x84, + 0xad, 0xb3, 0x96, 0x7b, 0x06, 0x26, 0xa9, 0x7c, 0x75, 0x55, 0x98, 0x91, 0xb5, 0x90, 0xea, 0xb1, + 0x55, 0x05, 0x27, 0x35, 0x98, 0x55, 0x97, 0x67, 0xca, 0xf6, 0x2f, 0xd2, 0x6d, 0x68, 0x5b, 0xe3, + 0x4a, 0x12, 0x8c, 0x69, 0x7c, 0xfb, 0x8b, 0x50, 0x31, 0x36, 0x25, 0xbe, 0x7e, 0xdf, 0x77, 0x9a, + 0x51, 0x7a, 0xdd, 0xbb, 0xca, 0x0a, 0x51, 0xc0, 0xf8, 0x15, 0x85, 0x88, 0xbe, 0x49, 0xad, 0x7b, + 0x32, 0xe6, 0x46, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe9, 0x7d, 0x95, 0xf3, 0x5f, 0x11, 0x43, 0x56, + 0x88, 0x02, 0x66, 0x3f, 0x0b, 0x25, 0x95, 0x14, 0x89, 0x67, 0x16, 0x51, 0xe6, 0x73, 0x33, 0xb3, + 0x88, 0x1f, 0x44, 0xc8, 0x21, 0xf6, 0x1b, 0x50, 0x52, 0xb9, 0x9b, 0x8e, 0xc7, 0x66, 0x4b, 0x51, + 0xe8, 0xb9, 0xd7, 0xfd, 0x30, 0x52, 0x09, 0xa7, 0xc4, 0x0d, 0xdf, 0xcd, 0x55, 0x5e, 0x86, 0x1a, + 0x6a, 0xff, 0x99, 0x05, 0x95, 0xcd, 0xcd, 0x35, 0x7d, 0xf0, 0x47, 0x78, 0x28, 0x14, 0x2d, 0x54, + 0xdb, 0x8e, 0xa8, 0xe9, 0x4a, 0x20, 0x16, 0xbe, 0x85, 0xc3, 0x83, 0xea, 0x43, 0x8d, 0x4c, 0x0c, + 0x1c, 0x52, 0x93, 0xac, 0xc2, 0x45, 0x13, 0x22, 0x13, 0x01, 0xc8, 0x35, 0x92, 0x3f, 0xd3, 0xdb, + 0x18, 0x04, 0x63, 0x56, 0x9d, 0x34, 0x29, 0xb9, 0xdd, 0x9b, 0x2f, 0xfe, 0x36, 0x06, 0xc1, 0x98, + 0x55, 0xc7, 0x7e, 0x1e, 0x66, 0x53, 0x77, 0xdc, 0x27, 0x48, 0xc0, 0xf2, 0xbb, 0x05, 0x98, 0x32, + 0xaf, 0x3a, 0x4f, 0xb0, 0x7e, 0x9d, 0x7c, 0x5b, 0xc8, 0xb8, 0x9e, 0x2c, 0x9c, 0xf2, 0x7a, 0xd2, + 0xbc, 0x0f, 0x1e, 0x3f, 0xdf, 0xfb, 0xe0, 0x62, 0x3e, 0xf7, 0xc1, 0x86, 0xdf, 0xc2, 0xc4, 0x83, + 0xf3, 0x5b, 0xf8, 0xed, 0x22, 0xcc, 0x24, 0x33, 0x7a, 0x9e, 0xa0, 0x27, 0x9f, 0x1d, 0xe8, 0xc9, + 0x53, 0xde, 0x87, 0x14, 0x46, 0xbd, 0x0f, 0x19, 0x1f, 0xf5, 0x3e, 0xa4, 0x78, 0x86, 0xfb, 0x90, + 0xc1, 0xdb, 0x8c, 0x89, 0x13, 0xdf, 0x66, 0x7c, 0x4a, 0xbb, 0x78, 0x4e, 0x26, 0x5c, 0x80, 0x62, + 0x17, 0x4f, 0x92, 0xec, 0x86, 0x65, 0xbf, 0x95, 0xe9, 0x9a, 0x5a, 0x3a, 0xc6, 0xee, 0x1b, 0x64, + 0x7a, 0x64, 0x9e, 0xfe, 0xca, 0xf5, 0xa1, 0x53, 0x78, 0x63, 0xbe, 0x08, 0x15, 0x39, 0x9e, 0xb8, + 0xf2, 0x0d, 0x49, 0xc5, 0xbd, 0x11, 0x83, 0xd0, 0xc4, 0xe3, 0x0f, 0xf6, 0xc7, 0x13, 0x84, 0xdf, + 0xcc, 0x55, 0x52, 0x0f, 0xf6, 0x27, 0xc1, 0x98, 0xc6, 0xb7, 0xbf, 0x00, 0x97, 0x33, 0x4d, 0x30, + 0xdc, 0xfc, 0xcd, 0xf5, 0x42, 0xda, 0x92, 0x08, 0x86, 0x18, 0xa9, 0x87, 0x3e, 0x16, 0xee, 0x0c, + 0xc5, 0xc4, 0x23, 0xa8, 0xd8, 0xbf, 0x59, 0x80, 0x99, 0xe4, 0x6b, 0xaf, 0xe4, 0x9e, 0x36, 0xd8, + 0xe6, 0x62, 0x2b, 0x16, 0x64, 0x8d, 0x2c, 0x91, 0x43, 0x2f, 0x7a, 0xee, 0xf1, 0xf1, 0xb5, 0xa5, + 0x53, 0x56, 0x9e, 0x1f, 0x63, 0x79, 0xc3, 0x22, 0xd9, 0xf1, 0x07, 0x5d, 0xe3, 0x80, 0x52, 0x79, + 0x8e, 0xcf, 0x9d, 0x7b, 0x1c, 0x18, 0xa9, 0x59, 0xa1, 0xc1, 0x96, 0xed, 0x2d, 0x7b, 0x34, 0x70, + 0xb7, 0x5d, 0xfd, 0x52, 0x3d, 0x5f, 0xb9, 0xdf, 0x90, 0x65, 0xa8, 0xa1, 0xf6, 0x3b, 0x63, 0x50, + 0xe6, 0xf9, 0xaf, 0xae, 0x05, 0x7e, 0x97, 0x3f, 0x89, 0x18, 0x1a, 0x67, 0x26, 0xd9, 0x6d, 0x37, + 0x46, 0x7d, 0x77, 0x34, 0xa6, 0x28, 0xdd, 0xdd, 0x8d, 0x12, 0x4c, 0x70, 0x24, 0x3d, 0x28, 0x6d, + 0xcb, 0x7c, 0xbd, 0xb2, 0xef, 0x46, 0xcc, 0x39, 0xa9, 0xb2, 0xff, 0x8a, 0x26, 0x50, 0xff, 0x50, + 0x73, 0xb1, 0x1d, 0x98, 0x4d, 0x25, 0x30, 0xc9, 0x3d, 0xcb, 0xef, 0xff, 0x1c, 0x87, 0xb2, 0x8e, + 0xb3, 0x22, 0x9f, 0x48, 0x18, 0xb0, 0xca, 0xf5, 0x0f, 0x1b, 0xef, 0x75, 0xed, 0xf8, 0xad, 0xf7, + 0x0e, 0xaa, 0xb3, 0x1a, 0x39, 0x65, 0x8c, 0x7a, 0x1c, 0x0a, 0xfd, 0xa0, 0x93, 0x3e, 0xa1, 0xde, + 0xc6, 0x35, 0x64, 0xe5, 0x66, 0x6c, 0x58, 0xe1, 0x81, 0xc6, 0x86, 0xb1, 0x5d, 0x72, 0xcb, 0x6f, + 0xed, 0xa7, 0xdf, 0xf7, 0xaa, 0xfb, 0xad, 0x7d, 0xe4, 0x10, 0xf2, 0x0a, 0xcc, 0xc8, 0x80, 0x37, + 0xa5, 0xc4, 0x14, 0xb9, 0x9e, 0xaa, 0x1d, 0x17, 0x36, 0x13, 0x50, 0x4c, 0x61, 0xb3, 0x5d, 0xf6, + 0x6e, 0xe8, 0x7b, 0x3c, 0x77, 0xf3, 0x44, 0xf2, 0x96, 0xf3, 0x46, 0xe3, 0xd6, 0x4d, 0x6e, 0x48, + 0xd3, 0x18, 0x89, 0x98, 0xba, 0xc9, 0x63, 0x63, 0xea, 0x56, 0x04, 0x6d, 0x26, 0x2d, 0xdf, 0x51, + 0xa6, 0xea, 0x4f, 0x2b, 0xba, 0xac, 0xec, 0xbd, 0x83, 0x23, 0x8c, 0xa4, 0xba, 0x66, 0x56, 0xf4, + 0x61, 0xf9, 0xfd, 0x8b, 0x3e, 0xb4, 0x6f, 0xc3, 0x6c, 0xaa, 0xff, 0x94, 0x81, 0xc3, 0xca, 0x36, + 0x70, 0x9c, 0xec, 0x85, 0xb0, 0x7f, 0x66, 0xc1, 0x85, 0x81, 0x15, 0xe9, 0xa4, 0x61, 0xa0, 0xe9, + 0xbd, 0x71, 0xec, 0xec, 0x7b, 0x63, 0xe1, 0x74, 0x7b, 0x63, 0x7d, 0xeb, 0x7b, 0x3f, 0xbc, 0xf2, + 0xa1, 0xef, 0xff, 0xf0, 0xca, 0x87, 0xfe, 0xf0, 0x87, 0x57, 0x3e, 0xf4, 0xce, 0xe1, 0x15, 0xeb, + 0x7b, 0x87, 0x57, 0xac, 0xef, 0x1f, 0x5e, 0xb1, 0xfe, 0xf0, 0xf0, 0x8a, 0xf5, 0x9f, 0x0f, 0xaf, + 0x58, 0xdf, 0xfa, 0x93, 0x2b, 0x1f, 0xfa, 0xf4, 0xa7, 0xe2, 0x9e, 0x5a, 0x52, 0x3d, 0xc5, 0x7f, + 0x7c, 0x54, 0xf5, 0xcb, 0x52, 0x6f, 0xb7, 0xbd, 0xc4, 0x7a, 0x6a, 0x49, 0x97, 0xa8, 0x9e, 0xfa, + 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x7d, 0x66, 0x21, 0xe0, 0xa6, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -4571,6 +4571,42 @@ func (m *AnalysisTemplateList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *AnalysisTemplateRef) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AnalysisTemplateRef) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AnalysisTemplateRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.ClusterScope { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + i -= len(m.TemplateName) + copy(dAtA[i:], m.TemplateName) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.TemplateName))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *AnalysisTemplateSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4591,6 +4627,20 @@ func (m *AnalysisTemplateSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Templates) > 0 { + for iNdEx := len(m.Templates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Templates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + } if len(m.MeasurementRetention) > 0 { for iNdEx := len(m.MeasurementRetention) - 1; iNdEx >= 0; iNdEx-- { { @@ -8289,42 +8339,6 @@ func (m *RolloutAnalysisRunStatus) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *RolloutAnalysisTemplate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RolloutAnalysisTemplate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RolloutAnalysisTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - i-- - if m.ClusterScope { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - i -= len(m.TemplateName) - copy(dAtA[i:], m.TemplateName) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.TemplateName))) - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - func (m *RolloutCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10636,6 +10650,18 @@ func (m *AnalysisTemplateList) Size() (n int) { return n } +func (m *AnalysisTemplateRef) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TemplateName) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + return n +} + func (m *AnalysisTemplateSpec) Size() (n int) { if m == nil { return 0 @@ -10666,6 +10692,12 @@ func (m *AnalysisTemplateSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.Templates) > 0 { + for _, e := range m.Templates { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -12018,20 +12050,8 @@ func (m *RolloutAnalysisRunStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Status) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Message) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - -func (m *RolloutAnalysisTemplate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TemplateName) - n += 1 + l + sovGenerated(uint64(l)) - n += 2 + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -12997,6 +13017,17 @@ func (this *AnalysisTemplateList) String() string { }, "") return s } +func (this *AnalysisTemplateRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AnalysisTemplateRef{`, + `TemplateName:` + fmt.Sprintf("%v", this.TemplateName) + `,`, + `ClusterScope:` + fmt.Sprintf("%v", this.ClusterScope) + `,`, + `}`, + }, "") + return s +} func (this *AnalysisTemplateSpec) String() string { if this == nil { return "nil" @@ -13021,11 +13052,17 @@ func (this *AnalysisTemplateSpec) String() string { repeatedStringForMeasurementRetention += strings.Replace(strings.Replace(f.String(), "MeasurementRetention", "MeasurementRetention", 1), `&`, ``, 1) + "," } repeatedStringForMeasurementRetention += "}" + repeatedStringForTemplates := "[]AnalysisTemplateRef{" + for _, f := range this.Templates { + repeatedStringForTemplates += strings.Replace(strings.Replace(f.String(), "AnalysisTemplateRef", "AnalysisTemplateRef", 1), `&`, ``, 1) + "," + } + repeatedStringForTemplates += "}" s := strings.Join([]string{`&AnalysisTemplateSpec{`, `Metrics:` + repeatedStringForMetrics + `,`, `Args:` + repeatedStringForArgs + `,`, `DryRun:` + repeatedStringForDryRun + `,`, `MeasurementRetention:` + repeatedStringForMeasurementRetention + `,`, + `Templates:` + repeatedStringForTemplates + `,`, `}`, }, "") return s @@ -13987,9 +14024,9 @@ func (this *RolloutAnalysis) String() string { if this == nil { return "nil" } - repeatedStringForTemplates := "[]RolloutAnalysisTemplate{" + repeatedStringForTemplates := "[]AnalysisTemplateRef{" for _, f := range this.Templates { - repeatedStringForTemplates += strings.Replace(strings.Replace(f.String(), "RolloutAnalysisTemplate", "RolloutAnalysisTemplate", 1), `&`, ``, 1) + "," + repeatedStringForTemplates += strings.Replace(strings.Replace(f.String(), "AnalysisTemplateRef", "AnalysisTemplateRef", 1), `&`, ``, 1) + "," } repeatedStringForTemplates += "}" repeatedStringForArgs := "[]AnalysisRunArgument{" @@ -14040,17 +14077,6 @@ func (this *RolloutAnalysisRunStatus) String() string { }, "") return s } -func (this *RolloutAnalysisTemplate) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&RolloutAnalysisTemplate{`, - `TemplateName:` + fmt.Sprintf("%v", this.TemplateName) + `,`, - `ClusterScope:` + fmt.Sprintf("%v", this.ClusterScope) + `,`, - `}`, - }, "") - return s -} func (this *RolloutCondition) String() string { if this == nil { return "nil" @@ -16690,6 +16716,108 @@ func (m *AnalysisTemplateList) Unmarshal(dAtA []byte) error { } return nil } +func (m *AnalysisTemplateRef) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AnalysisTemplateRef: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AnalysisTemplateRef: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TemplateName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TemplateName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterScope", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ClusterScope = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *AnalysisTemplateSpec) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -16855,6 +16983,40 @@ func (m *AnalysisTemplateSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Templates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Templates = append(m.Templates, AnalysisTemplateRef{}) + if err := m.Templates[len(m.Templates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -28192,7 +28354,7 @@ func (m *RolloutAnalysis) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Templates = append(m.Templates, RolloutAnalysisTemplate{}) + m.Templates = append(m.Templates, AnalysisTemplateRef{}) if err := m.Templates[len(m.Templates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -28602,108 +28764,6 @@ func (m *RolloutAnalysisRunStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *RolloutAnalysisTemplate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RolloutAnalysisTemplate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RolloutAnalysisTemplate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TemplateName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TemplateName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterScope", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ClusterScope = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RolloutCondition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 6e225848b9..0ea0a7bc2c 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -202,6 +202,16 @@ message AnalysisTemplateList { repeated AnalysisTemplate items = 2; } +message AnalysisTemplateRef { + // TemplateName name of template to use in AnalysisRun + // +optional + optional string templateName = 1; + + // Whether to look for the templateName at cluster scope or namespace scope + // +optional + optional bool clusterScope = 2; +} + // AnalysisTemplateSpec is the specification for a AnalysisTemplate resource message AnalysisTemplateSpec { // Metrics contains the list of metrics to query as part of an analysis run @@ -226,6 +236,11 @@ message AnalysisTemplateSpec { // +patchStrategy=merge // +optional repeated MeasurementRetention measurementRetention = 4; + + // Templates reference to a list of analysis templates to combine with the rest of the metrics for an AnalysisRun + // +patchMergeKey=templateName + // +patchStrategy=merge + repeated AnalysisTemplateRef templates = 5; } // AntiAffinity defines which inter-pod scheduling rule to use for anti-affinity injection @@ -1228,7 +1243,7 @@ message RolloutAnalysis { // Templates reference to a list of analysis templates to combine for an AnalysisRun // +patchMergeKey=templateName // +patchStrategy=merge - repeated RolloutAnalysisTemplate templates = 1; + repeated AnalysisTemplateRef templates = 1; // Args the arguments that will be added to the AnalysisRuns // +patchMergeKey=name @@ -1269,16 +1284,6 @@ message RolloutAnalysisRunStatus { optional string message = 3; } -message RolloutAnalysisTemplate { - // TemplateName name of template to use in AnalysisRun - // +optional - optional string templateName = 1; - - // Whether to look for the templateName at cluster scope or namespace scope - // +optional - optional bool clusterScope = 2; -} - // RolloutCondition describes the state of a rollout at a certain point. message RolloutCondition { // Type of deployment condition. diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 1ccc09140f..f486b7eb77 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -40,6 +40,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunStrategy": schema_pkg_apis_rollouts_v1alpha1_AnalysisRunStrategy(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplate": schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplate(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateList": schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateList(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef": schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateSpec": schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateSpec(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AntiAffinity": schema_pkg_apis_rollouts_v1alpha1_AntiAffinity(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ApisixRoute": schema_pkg_apis_rollouts_v1alpha1_ApisixRoute(ref), @@ -105,7 +106,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysis": schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysis(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisBackground": schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisRunStatus": schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisRunStatus(ref), - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate": schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisTemplate(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutCondition": schema_pkg_apis_rollouts_v1alpha1_RolloutCondition(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentStep": schema_pkg_apis_rollouts_v1alpha1_RolloutExperimentStep(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutExperimentStepAnalysisTemplateRef": schema_pkg_apis_rollouts_v1alpha1_RolloutExperimentStepAnalysisTemplateRef(ref), @@ -753,6 +753,33 @@ func schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateList(ref common.Reference } } +func schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateRef(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "templateName": { + SchemaProps: spec.SchemaProps{ + Description: "TemplateName name of template to use in AnalysisRun", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "clusterScope": { + SchemaProps: spec.SchemaProps{ + Description: "Whether to look for the templateName at cluster scope or namespace scope", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -840,12 +867,31 @@ func schema_pkg_apis_rollouts_v1alpha1_AnalysisTemplateSpec(ref common.Reference }, }, }, + "templates": { + VendorExtensible: spec.VendorExtensible{ + Extensions: spec.Extensions{ + "x-kubernetes-patch-merge-key": "templateName", + "x-kubernetes-patch-strategy": "merge", + }, + }, + SchemaProps: spec.SchemaProps{ + Description: "Templates reference to a list of analysis templates to combine with the rest of the metrics for an AnalysisRun", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef"), + }, + }, + }, + }, + }, }, - Required: []string{"metrics"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Metric"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Argument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.Metric"}, } } @@ -3702,7 +3748,7 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysis(ref common.ReferenceCallb Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"), + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef"), }, }, }, @@ -3779,7 +3825,7 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysis(ref common.ReferenceCallb }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention"}, } } @@ -3804,7 +3850,7 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref common.Refe Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"), + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef"), }, }, }, @@ -3888,7 +3934,7 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisBackground(ref common.Refe }, }, Dependencies: []string{ - "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.RolloutAnalysisTemplate"}, + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunArgument", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisRunMetadata", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.AnalysisTemplateRef", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.DryRun", "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.MeasurementRetention"}, } } @@ -3925,33 +3971,6 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisRunStatus(ref common.Refer } } -func schema_pkg_apis_rollouts_v1alpha1_RolloutAnalysisTemplate(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "templateName": { - SchemaProps: spec.SchemaProps{ - Description: "TemplateName name of template to use in AnalysisRun", - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "clusterScope": { - SchemaProps: spec.SchemaProps{ - Description: "Whether to look for the templateName at cluster scope or namespace scope", - Type: []string{"boolean"}, - Format: "", - }, - }, - }, - }, - }, - } -} - func schema_pkg_apis_rollouts_v1alpha1_RolloutCondition(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/rollouts/v1alpha1/types.go b/pkg/apis/rollouts/v1alpha1/types.go index 32b8441689..2ab4ea1018 100755 --- a/pkg/apis/rollouts/v1alpha1/types.go +++ b/pkg/apis/rollouts/v1alpha1/types.go @@ -715,7 +715,7 @@ type RolloutAnalysis struct { // Templates reference to a list of analysis templates to combine for an AnalysisRun // +patchMergeKey=templateName // +patchStrategy=merge - Templates []RolloutAnalysisTemplate `json:"templates,omitempty" patchStrategy:"merge" patchMergeKey:"templateName" protobuf:"bytes,1,rep,name=templates"` + Templates []AnalysisTemplateRef `json:"templates,omitempty" patchStrategy:"merge" patchMergeKey:"templateName" protobuf:"bytes,1,rep,name=templates"` // Args the arguments that will be added to the AnalysisRuns // +patchMergeKey=name // +patchStrategy=merge @@ -735,7 +735,7 @@ type RolloutAnalysis struct { AnalysisRunMetadata AnalysisRunMetadata `json:"analysisRunMetadata,omitempty" protobuf:"bytes,5,opt,name=analysisRunMetadata"` } -type RolloutAnalysisTemplate struct { +type AnalysisTemplateRef struct { //TemplateName name of template to use in AnalysisRun // +optional TemplateName string `json:"templateName" protobuf:"bytes,1,opt,name=templateName"` diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index 58d85887f3..496cedc2a0 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -375,6 +375,22 @@ func (in *AnalysisTemplateList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AnalysisTemplateRef) DeepCopyInto(out *AnalysisTemplateRef) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AnalysisTemplateRef. +func (in *AnalysisTemplateRef) DeepCopy() *AnalysisTemplateRef { + if in == nil { + return nil + } + out := new(AnalysisTemplateRef) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *AnalysisTemplateSpec) DeepCopyInto(out *AnalysisTemplateSpec) { *out = *in @@ -402,6 +418,11 @@ func (in *AnalysisTemplateSpec) DeepCopyInto(out *AnalysisTemplateSpec) { *out = make([]MeasurementRetention, len(*in)) copy(*out, *in) } + if in.Templates != nil { + in, out := &in.Templates, &out.Templates + *out = make([]AnalysisTemplateRef, len(*in)) + copy(*out, *in) + } return } @@ -2048,7 +2069,7 @@ func (in *RolloutAnalysis) DeepCopyInto(out *RolloutAnalysis) { *out = *in if in.Templates != nil { in, out := &in.Templates, &out.Templates - *out = make([]RolloutAnalysisTemplate, len(*in)) + *out = make([]AnalysisTemplateRef, len(*in)) copy(*out, *in) } if in.Args != nil { @@ -2120,22 +2141,6 @@ func (in *RolloutAnalysisRunStatus) DeepCopy() *RolloutAnalysisRunStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *RolloutAnalysisTemplate) DeepCopyInto(out *RolloutAnalysisTemplate) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RolloutAnalysisTemplate. -func (in *RolloutAnalysisTemplate) DeepCopy() *RolloutAnalysisTemplate { - if in == nil { - return nil - } - out := new(RolloutAnalysisTemplate) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RolloutCondition) DeepCopyInto(out *RolloutCondition) { *out = *in diff --git a/pkg/apis/rollouts/validation/validation_references_test.go b/pkg/apis/rollouts/validation/validation_references_test.go index 4fc8349fdf..a8e12f0055 100644 --- a/pkg/apis/rollouts/validation/validation_references_test.go +++ b/pkg/apis/rollouts/validation/validation_references_test.go @@ -684,7 +684,7 @@ func TestValidateAnalysisTemplatesWithType(t *testing.T) { rollout := getAlbRollout("alb-ingress") rollout.Spec.Strategy.Canary.Steps = append(rollout.Spec.Strategy.Canary.Steps, v1alpha1.CanaryStep{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: "analysis-template-name", }, diff --git a/rollout/analysis.go b/rollout/analysis.go index 26205235a1..7bb0d47f1f 100644 --- a/rollout/analysis.go +++ b/rollout/analysis.go @@ -431,29 +431,9 @@ func (c *rolloutContext) newAnalysisRunFromRollout(rolloutAnalysis *v1alpha1.Rol name := strings.Join(nameParts, "-") var run *v1alpha1.AnalysisRun var err error - templates := make([]*v1alpha1.AnalysisTemplate, 0) - clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) - for _, templateRef := range rolloutAnalysis.Templates { - if templateRef.ClusterScope { - template, err := c.clusterAnalysisTemplateLister.Get(templateRef.TemplateName) - if err != nil { - if k8serrors.IsNotFound(err) { - c.log.Warnf("ClusterAnalysisTemplate '%s' not found", templateRef.TemplateName) - } - return nil, err - } - clusterTemplates = append(clusterTemplates, template) - } else { - template, err := c.analysisTemplateLister.AnalysisTemplates(c.rollout.Namespace).Get(templateRef.TemplateName) - if err != nil { - if k8serrors.IsNotFound(err) { - c.log.Warnf("AnalysisTemplate '%s' not found", templateRef.TemplateName) - } - return nil, err - } - templates = append(templates, template) - } - + templates, clusterTemplates, err := c.getAnalysisTemplatesFromRefs(&rolloutAnalysis.Templates) + if err != nil { + return nil, err } runLabels := labels for k, v := range rolloutAnalysis.AnalysisRunMetadata.Labels { @@ -479,6 +459,53 @@ func (c *rolloutContext) newAnalysisRunFromRollout(rolloutAnalysis *v1alpha1.Rol return run, nil } +func (c *rolloutContext) getAnalysisTemplatesFromRefs(templateRefs *[]v1alpha1.AnalysisTemplateRef) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate, error) { + templates := make([]*v1alpha1.AnalysisTemplate, 0) + clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) + for _, templateRef := range *templateRefs { + if templateRef.ClusterScope { + template, err := c.clusterAnalysisTemplateLister.Get(templateRef.TemplateName) + if err != nil { + if k8serrors.IsNotFound(err) { + c.log.Warnf("ClusterAnalysisTemplate '%s' not found", templateRef.TemplateName) + } + return nil, nil, err + } + clusterTemplates = append(clusterTemplates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := c.getAnalysisTemplatesFromRefs(&template.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + } else { + template, err := c.analysisTemplateLister.AnalysisTemplates(c.rollout.Namespace).Get(templateRef.TemplateName) + if err != nil { + if k8serrors.IsNotFound(err) { + c.log.Warnf("AnalysisTemplate '%s' not found", templateRef.TemplateName) + } + return nil, nil, err + } + templates = append(templates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerTemplates, innerClusterTemplates, innerErr := c.getAnalysisTemplatesFromRefs(&template.Spec.Templates) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } + } + + } + uniqueTemplates, uniqueClusterTemplates := analysisutil.FilterUniqueTemplates(templates, clusterTemplates) + return uniqueTemplates, uniqueClusterTemplates, nil +} + func (c *rolloutContext) deleteAnalysisRuns(ars []*v1alpha1.AnalysisRun) error { ctx := context.TODO() for i := range ars { diff --git a/rollout/analysis_test.go b/rollout/analysis_test.go index 4b5d5d72d7..46a741bd63 100644 --- a/rollout/analysis_test.go +++ b/rollout/analysis_test.go @@ -43,15 +43,98 @@ func analysisTemplate(name string) *v1alpha1.AnalysisTemplate { } } -func clusterAnalysisTemplate(name string) *v1alpha1.ClusterAnalysisTemplate { +func analysisTemplateWithNamespacedAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithAnalysisRefs(name, false, innerRefsName...) +} + +func analysisTemplateWithClusterAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithAnalysisRefs(name, true, innerRefsName...) +} + +func analysisTemplateWithAnalysisRefs(name string, clusterScope bool, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: clusterScope, + }) + } + return &v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{{ + Name: "example-" + name, + }}, + DryRun: []v1alpha1.DryRun{{ + MetricName: "example-" + name, + }}, + MeasurementRetention: []v1alpha1.MeasurementRetention{{ + MetricName: "example-" + name, + }}, + Templates: templatesRefs, + }, + } +} + +func analysisTemplateWithOnlyNamespacedAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + return analysisTemplateWithOnlyRefs(name, false, innerRefsName...) +} + +func analysisTemplateWithOnlyRefs(name string, clusterScope bool, innerRefsName ...string) *v1alpha1.AnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: clusterScope, + }) + } + return &v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{}, + DryRun: []v1alpha1.DryRun{}, + MeasurementRetention: []v1alpha1.MeasurementRetention{}, + Templates: templatesRefs, + }, + } +} + +func clusterAnalysisTemplate(name string, metricName string) *v1alpha1.ClusterAnalysisTemplate { + return &v1alpha1.ClusterAnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1alpha1.AnalysisTemplateSpec{ + Metrics: []v1alpha1.Metric{{ + Name: metricName, + }}, + }, + } +} + +func clusterAnalysisTemplateWithAnalysisRefs(name string, innerRefsName ...string) *v1alpha1.ClusterAnalysisTemplate { + templatesRefs := []v1alpha1.AnalysisTemplateRef{} + for _, innerTplName := range innerRefsName { + templatesRefs = append(templatesRefs, v1alpha1.AnalysisTemplateRef{ + TemplateName: innerTplName, + ClusterScope: true, + }) + } return &v1alpha1.ClusterAnalysisTemplate{ ObjectMeta: metav1.ObjectMeta{ Name: name, }, Spec: v1alpha1.AnalysisTemplateSpec{ Metrics: []v1alpha1.Metric{{ - Name: "clusterexample", + Name: "clusterexample-" + name, }}, + Templates: templatesRefs, }, } } @@ -133,7 +216,7 @@ func TestCreateBackgroundAnalysisRun(t *testing.T) { ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -196,7 +279,7 @@ func TestCreateBackgroundAnalysisRunWithTemplates(t *testing.T) { ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, }, @@ -251,13 +334,13 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplates(t *testing.T) { steps := []v1alpha1.CanaryStep{{ SetWeight: int32Ptr(10), }} - cat := clusterAnalysisTemplate("bar") + cat := clusterAnalysisTemplate("bar", "clusterexample") r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r2 := bumpVersion(r1) ar := clusterAnalysisRun(cat, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: cat.Name, ClusterScope: true, }}, @@ -313,7 +396,7 @@ func TestInvalidSpecMissingClusterTemplatesBackgroundAnalysis(t *testing.T) { r := newCanaryRollout("foo", 10, nil, nil, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "missing", ClusterScope: true, }}, @@ -350,7 +433,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T SetWeight: int32Ptr(10), }} at := analysisTemplate("bar") - cat := clusterAnalysisTemplate("clusterbar") + cat := clusterAnalysisTemplate("clusterbar", "clusterexample") r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r2 := bumpVersion(r1) @@ -367,7 +450,7 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T } r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: cat.Name, ClusterScope: true, }, { @@ -419,6 +502,169 @@ func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplate(t *testing.T assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) } +func TestCreateBackgroundAnalysisRunWithClusterTemplatesAndTemplateAndInnerTemplates(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(10), + }} + at := analysisTemplateWithNamespacedAnalysisRefs("bar", "bar2") + at2 := analysisTemplateWithClusterAnalysisRefs("bar2", "clusterbar2", "clusterbar4") + cat := clusterAnalysisTemplateWithAnalysisRefs("clusterbar", "clusterbar2", "clusterbar3") + cat2 := clusterAnalysisTemplate("clusterbar2", "clusterexample-clusterbar2") + cat3 := clusterAnalysisTemplate("clusterbar3", "clusterexample-clusterbar3") + cat4 := clusterAnalysisTemplate("clusterbar4", "clusterexample-clusterbar4") + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r2 := bumpVersion(r1) + + ar := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run1", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(r1, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: concatMultipleSlices([][]v1alpha1.Metric{at.Spec.Metrics, at2.Spec.Metrics, cat.Spec.Metrics, cat2.Spec.Metrics, cat3.Spec.Metrics, cat4.Spec.Metrics}), + Args: at.Spec.Args, + }, + } + r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ + RolloutAnalysis: v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.AnalysisTemplateRef{{ + TemplateName: cat.Name, + ClusterScope: true, + }, { + TemplateName: at.Name, + }}, + }, + } + rs1 := newReplicaSetWithStatus(r1, 10, 10) + rs2 := newReplicaSetWithStatus(r2, 0, 0) + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 10, 0, 10, false) + progressingCondition, _ := newProgressingCondition(conditions.ReplicaSetUpdatedReason, rs2, "") + conditions.SetRolloutCondition(&r2.Status, progressingCondition) + availableCondition, _ := newAvailableCondition(true) + conditions.SetRolloutCondition(&r2.Status, availableCondition) + completedCondition, _ := newCompletedCondition(false) + conditions.SetRolloutCondition(&r2.Status, completedCondition) + + f.rolloutLister = append(f.rolloutLister, r2) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, cat, cat2, cat3, cat4) + f.analysisTemplateLister = append(f.analysisTemplateLister, at, at2) + f.objects = append(f.objects, r2, cat, at, at2, cat2, cat3, cat4) + + createdIndex := f.expectCreateAnalysisRunAction(ar) + f.expectUpdateReplicaSetAction(rs2) + index := f.expectPatchRolloutAction(r1) + + f.run(getKey(r2, t)) + createdAr := f.getCreatedAnalysisRun(createdIndex) + expectedArName := fmt.Sprintf("%s-%s-%s", r2.Name, rs2PodHash, "2") + assert.Equal(t, expectedArName, createdAr.Name) + assert.Len(t, createdAr.Spec.Metrics, 6) + + patch := f.getPatchedRollout(index) + expectedPatch := `{ + "status": { + "canary": { + "currentBackgroundAnalysisRunStatus": { + "name": "%s", + "status": "" + } + } + } + }` + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) +} + +// Test the case where the analysis template does't have metrics, but refences other templates +func TestCreateBackgroundAnalysisRunWithTemplatesAndNoMetrics(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{{ + SetWeight: int32Ptr(10), + }} + at := analysisTemplateWithOnlyNamespacedAnalysisRefs("bar", "bar2") + at2 := analysisTemplateWithClusterAnalysisRefs("bar2", "clusterbar2", "clusterbar4") + cat := clusterAnalysisTemplateWithAnalysisRefs("clusterbar", "clusterbar2", "clusterbar3") + cat2 := clusterAnalysisTemplate("clusterbar2", "clusterexample-clusterbar2") + cat3 := clusterAnalysisTemplate("clusterbar3", "clusterexample-clusterbar3") + cat4 := clusterAnalysisTemplate("clusterbar4", "clusterexample-clusterbar4") + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) + r2 := bumpVersion(r1) + + ar := &v1alpha1.AnalysisRun{ + ObjectMeta: metav1.ObjectMeta{ + Name: "run1", + Namespace: metav1.NamespaceDefault, + OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(r1, controllerKind)}, + }, + Spec: v1alpha1.AnalysisRunSpec{ + Metrics: concatMultipleSlices([][]v1alpha1.Metric{at.Spec.Metrics, at2.Spec.Metrics, cat.Spec.Metrics, cat2.Spec.Metrics, cat3.Spec.Metrics, cat4.Spec.Metrics}), + Args: at.Spec.Args, + }, + } + r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ + RolloutAnalysis: v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.AnalysisTemplateRef{{ + TemplateName: cat.Name, + ClusterScope: true, + }, { + TemplateName: at.Name, + }}, + }, + } + rs1 := newReplicaSetWithStatus(r1, 10, 10) + rs2 := newReplicaSetWithStatus(r2, 0, 0) + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 10, 0, 10, false) + progressingCondition, _ := newProgressingCondition(conditions.ReplicaSetUpdatedReason, rs2, "") + conditions.SetRolloutCondition(&r2.Status, progressingCondition) + availableCondition, _ := newAvailableCondition(true) + conditions.SetRolloutCondition(&r2.Status, availableCondition) + completedCondition, _ := newCompletedCondition(false) + conditions.SetRolloutCondition(&r2.Status, completedCondition) + + f.rolloutLister = append(f.rolloutLister, r2) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, cat, cat2, cat3, cat4) + f.analysisTemplateLister = append(f.analysisTemplateLister, at, at2) + f.objects = append(f.objects, r2, cat, at, at2, cat2, cat3, cat4) + + createdIndex := f.expectCreateAnalysisRunAction(ar) + f.expectUpdateReplicaSetAction(rs2) + index := f.expectPatchRolloutAction(r1) + + f.run(getKey(r2, t)) + createdAr := f.getCreatedAnalysisRun(createdIndex) + expectedArName := fmt.Sprintf("%s-%s-%s", r2.Name, rs2PodHash, "2") + assert.Equal(t, expectedArName, createdAr.Name) + assert.Len(t, createdAr.Spec.Metrics, 5) + + patch := f.getPatchedRollout(index) + expectedPatch := `{ + "status": { + "canary": { + "currentBackgroundAnalysisRunStatus": { + "name": "%s", + "status": "" + } + } + } + }` + assert.JSONEq(t, calculatePatch(r2, fmt.Sprintf(expectedPatch, expectedArName)), patch) +} + // TestCreateAnalysisRunWithCollision ensures we will create an new analysis run with a new name // when there is a conflict (e.g. such as when there is a retry) func TestCreateAnalysisRunWithCollision(t *testing.T) { @@ -434,7 +680,7 @@ func TestCreateAnalysisRunWithCollision(t *testing.T) { ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -505,7 +751,7 @@ func TestCreateAnalysisRunWithCollisionAndSemanticEquality(t *testing.T) { ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -560,7 +806,7 @@ func TestCreateAnalysisRunOnAnalysisStep(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -621,7 +867,7 @@ func TestCreateAnalysisRunOnPromotedAnalysisStepIfPreviousStepWasAnalysisToo(t * at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -629,7 +875,7 @@ func TestCreateAnalysisRunOnPromotedAnalysisStepIfPreviousStepWasAnalysisToo(t * }, }, { Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -698,7 +944,7 @@ func TestFailCreateStepAnalysisRunIfInvalidTemplateRef(t *testing.T) { steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: "bad-template", }, @@ -749,7 +995,7 @@ func TestFailCreateBackgroundAnalysisRunIfInvalidTemplateRef(t *testing.T) { r := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: "bad-template", }, @@ -788,23 +1034,25 @@ func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { }} at := analysisTemplate("bad-template") + at2 := analysisTemplate("bad-template-2") at.Spec.Metrics = append(at.Spec.Metrics, at.Spec.Metrics[0]) - f.analysisTemplateLister = append(f.analysisTemplateLister, at) + at2.Spec.Metrics = append(at2.Spec.Metrics, at2.Spec.Metrics[0]) + f.analysisTemplateLister = append(f.analysisTemplateLister, at, at2) r := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, { - TemplateName: at.Name, + TemplateName: at2.Name, }, }, }, } f.rolloutLister = append(f.rolloutLister, r) - f.objects = append(f.objects, r, at) + f.objects = append(f.objects, r, at, at2) patchIndex := f.expectPatchRolloutAction(r) f.run(getKey(r, t)) @@ -816,7 +1064,7 @@ func TestFailCreateBackgroundAnalysisRunIfMetricRepeated(t *testing.T) { "message": "InvalidSpec: %s" } }` - errmsg := "The Rollout \"foo\" is invalid: spec.strategy.canary.analysis.templates: Invalid value: \"templateNames: [bad-template bad-template]\": two metrics have the same name 'example'" + errmsg := "The Rollout \"foo\" is invalid: spec.strategy.canary.analysis.templates: Invalid value: \"templateNames: [bad-template bad-template-2]\": two metrics have the same name 'example'" _, progressingCond := newProgressingCondition(conditions.ReplicaSetUpdatedReason, r, "") invalidSpecCond := conditions.NewRolloutCondition(v1alpha1.InvalidSpec, corev1.ConditionTrue, conditions.InvalidSpecReason, errmsg) invalidSpecBytes, _ := json.Marshal(invalidSpecCond) @@ -839,7 +1087,7 @@ func TestDoNothingWithAnalysisRunsWhileBackgroundAnalysisRunRunning(t *testing.T r2 := bumpVersion(r1) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -886,7 +1134,7 @@ func TestDoNothingWhileStepBasedAnalysisRunRunning(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -935,7 +1183,7 @@ func TestCancelOlderAnalysisRuns(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1003,7 +1251,7 @@ func TestDeleteAnalysisRunsWithNoMatchingRS(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1059,7 +1307,7 @@ func TestDeleteAnalysisRunsAfterRSDelete(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1116,7 +1364,7 @@ func TestIncrementStepAfterSuccessfulAnalysisRun(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1180,7 +1428,7 @@ func TestPausedOnInconclusiveBackgroundAnalysisRun(t *testing.T) { ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1240,7 +1488,7 @@ func TestPausedStepAfterInconclusiveAnalysisRun(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1303,7 +1551,7 @@ func TestErrorConditionAfterErrorAnalysisRunStep(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1378,7 +1626,7 @@ func TestErrorConditionAfterErrorAnalysisRunBackground(t *testing.T) { r2 := bumpVersion(r1) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1446,7 +1694,7 @@ func TestCancelAnalysisRunsWhenAborted(t *testing.T) { at := analysisTemplate("bar") steps := []v1alpha1.CanaryStep{{ Analysis: &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1513,7 +1761,7 @@ func TestCancelBackgroundAnalysisRunWhenRolloutIsCompleted(t *testing.T) { r2 := bumpVersion(r1) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1559,7 +1807,7 @@ func TestDoNotCreateBackgroundAnalysisRunAfterInconclusiveRun(t *testing.T) { r2 := bumpVersion(r1) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1614,7 +1862,7 @@ func TestDoNotCreateBackgroundAnalysisRunOnNewCanaryRollout(t *testing.T) { r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r1.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1649,7 +1897,7 @@ func TestDoNotCreateBackgroundAnalysisRunOnNewCanaryRolloutStableRSEmpty(t *test r1 := newCanaryRollout("foo", 1, nil, steps, pointer.Int32Ptr(0), intstr.FromInt(0), intstr.FromInt(1)) r1.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -1679,7 +1927,7 @@ func TestCreatePrePromotionAnalysisRun(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -1737,7 +1985,7 @@ func TestDoNotCreatePrePromotionAnalysisAfterPromotionRollout(t *testing.T) { r1 := newBlueGreenRollout("foo", 1, nil, "bar", "") r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "test", }}, } @@ -1786,7 +2034,7 @@ func TestDoNotCreatePrePromotionAnalysisRunOnNewRollout(t *testing.T) { r := newBlueGreenRollout("foo", 1, nil, "active", "") r.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "test", }}, } @@ -1819,7 +2067,7 @@ func TestDoNotCreatePrePromotionAnalysisRunOnNotReadyReplicaSet(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "test", }}, } @@ -1861,7 +2109,7 @@ func TestRolloutPrePromotionAnalysisBecomesInconclusive(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -1931,7 +2179,7 @@ func TestRolloutPrePromotionAnalysisSwitchServiceAfterSuccess(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(true) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -1996,7 +2244,7 @@ func TestRolloutPrePromotionAnalysisHonorAutoPromotionSeconds(t *testing.T) { r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.AutoPromotionSeconds = 10 r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2061,7 +2309,7 @@ func TestRolloutPrePromotionAnalysisDoNothingOnInconclusiveAnalysis(t *testing.T r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2115,7 +2363,7 @@ func TestAbortRolloutOnErrorPrePromotionAnalysis(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2185,7 +2433,7 @@ func TestCreatePostPromotionAnalysisRun(t *testing.T) { r1 := newBlueGreenRollout("foo", 1, nil, "active", "") r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PostPromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2232,7 +2480,7 @@ func TestRolloutPostPromotionAnalysisSuccess(t *testing.T) { r1 := newBlueGreenRollout("foo", 1, nil, "active", "") r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PostPromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2290,7 +2538,7 @@ func TestPostPromotionAnalysisRunHandleInconclusive(t *testing.T) { r1 := newBlueGreenRollout("foo", 1, nil, "active", "") r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PostPromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2353,7 +2601,7 @@ func TestAbortRolloutOnErrorPostPromotionAnalysis(t *testing.T) { r1 := newBlueGreenRollout("foo", 1, nil, "active", "") r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PostPromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: at.Name, }}, } @@ -2430,7 +2678,7 @@ func TestCreateAnalysisRunWithCustomAnalysisRunMetadataAndROCopyLabels(t *testin ar := analysisRun(at, v1alpha1.RolloutTypeBackgroundRunLabel, r2) r2.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -2510,3 +2758,21 @@ func TestCancelBackgroundAnalysisRunWhenRolloutAnalysisHasNoTemplate(t *testing. assert.Contains(t, patch, `"currentBackgroundAnalysisRunStatus":null`) } + +func concatMultipleSlices[T any](slices [][]T) []T { + var totalLen int + + for _, s := range slices { + totalLen += len(s) + } + + result := make([]T, totalLen) + + var i int + + for _, s := range slices { + i += copy(result[i:], s) + } + + return result +} diff --git a/rollout/bluegreen_test.go b/rollout/bluegreen_test.go index cff894e8ca..2ff9515fe3 100644 --- a/rollout/bluegreen_test.go +++ b/rollout/bluegreen_test.go @@ -428,7 +428,7 @@ func TestBlueGreenHandlePause(t *testing.T) { r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r2 := bumpVersion(r1) r2.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "test", }}, } diff --git a/rollout/controller.go b/rollout/controller.go index 1d7d8cde92..972cea882c 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -795,38 +795,64 @@ func (c *rolloutContext) getReferencedRolloutAnalyses() (*[]validation.AnalysisT } func (c *rolloutContext) getReferencedAnalysisTemplates(rollout *v1alpha1.Rollout, rolloutAnalysis *v1alpha1.RolloutAnalysis, templateType validation.AnalysisTemplateType, canaryStepIndex int) (*validation.AnalysisTemplatesWithType, error) { - templates := make([]*v1alpha1.AnalysisTemplate, 0) - clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) fldPath := validation.GetAnalysisTemplateWithTypeFieldPath(templateType, canaryStepIndex) - for _, templateRef := range rolloutAnalysis.Templates { + templates, clusterTemplates, err := c.getReferencedAnalysisTemplatesFromRef(&rolloutAnalysis.Templates, fldPath) + + return &validation.AnalysisTemplatesWithType{ + AnalysisTemplates: templates, + ClusterAnalysisTemplates: clusterTemplates, + TemplateType: templateType, + CanaryStepIndex: canaryStepIndex, + }, err +} + +func (c *rolloutContext) getReferencedAnalysisTemplatesFromRef(templateRefs *[]v1alpha1.AnalysisTemplateRef, fieldPath *field.Path) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate, error) { + templates := make([]*v1alpha1.AnalysisTemplate, 0) + clusterTemplates := make([]*v1alpha1.ClusterAnalysisTemplate, 0) + for _, templateRef := range *templateRefs { if templateRef.ClusterScope { template, err := c.clusterAnalysisTemplateLister.Get(templateRef.TemplateName) if err != nil { if k8serrors.IsNotFound(err) { - return nil, field.Invalid(fldPath, templateRef.TemplateName, fmt.Sprintf("ClusterAnalysisTemplate '%s' not found", templateRef.TemplateName)) + return nil, nil, field.Invalid(fieldPath, templateRef.TemplateName, fmt.Sprintf("ClusterAnalysisTemplate '%s' not found", templateRef.TemplateName)) } - return nil, err + return nil, nil, err } clusterTemplates = append(clusterTemplates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerFldPath := field.NewPath("spec", "templates") + innerTemplates, innerClusterTemplates, innerErr := c.getReferencedAnalysisTemplatesFromRef(&template.Spec.Templates, innerFldPath) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } } else { template, err := c.analysisTemplateLister.AnalysisTemplates(c.rollout.Namespace).Get(templateRef.TemplateName) if err != nil { if k8serrors.IsNotFound(err) { - return nil, field.Invalid(fldPath, templateRef.TemplateName, fmt.Sprintf("AnalysisTemplate '%s' not found", templateRef.TemplateName)) + return nil, nil, field.Invalid(fieldPath, templateRef.TemplateName, fmt.Sprintf("AnalysisTemplate '%s' not found", templateRef.TemplateName)) } - return nil, err + return nil, nil, err } templates = append(templates, template) + // Look for nested templates + if template.Spec.Templates != nil { + innerFldPath := field.NewPath("spec", "templates") + innerTemplates, innerClusterTemplates, innerErr := c.getReferencedAnalysisTemplatesFromRef(&template.Spec.Templates, innerFldPath) + if innerErr != nil { + return nil, nil, innerErr + } + clusterTemplates = append(clusterTemplates, innerClusterTemplates...) + templates = append(templates, innerTemplates...) + } } } - - return &validation.AnalysisTemplatesWithType{ - AnalysisTemplates: templates, - ClusterAnalysisTemplates: clusterTemplates, - TemplateType: templateType, - CanaryStepIndex: canaryStepIndex, - }, nil + uniqueTemplates, uniqueClusterTemplates := analysisutil.FilterUniqueTemplates(templates, clusterTemplates) + return uniqueTemplates, uniqueClusterTemplates, nil } func (c *rolloutContext) getReferencedIngresses() (*[]ingressutil.Ingress, error) { diff --git a/rollout/controller_test.go b/rollout/controller_test.go index 1409e675e7..892a2be64f 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -1585,7 +1585,7 @@ func TestGetReferencedAnalyses(t *testing.T) { defer f.Close() rolloutAnalysisFail := v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "does-not-exist", ClusterScope: false, }}, @@ -1644,12 +1644,12 @@ func TestGetReferencedAnalyses(t *testing.T) { }) } -func TestGetReferencedAnalysisTemplate(t *testing.T) { +func TestGetReferencedClusterAnalysisTemplate(t *testing.T) { f := newFixture(t) defer f.Close() r := newBlueGreenRollout("rollout", 1, nil, "active-service", "preview-service") roAnalysisTemplate := &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{{ + Templates: []v1alpha1.AnalysisTemplateRef{{ TemplateName: "cluster-analysis-template-name", ClusterScope: true, }}, @@ -1665,7 +1665,53 @@ func TestGetReferencedAnalysisTemplate(t *testing.T) { }) t.Run("get referenced analysisTemplate - success", func(t *testing.T) { - f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplate("cluster-analysis-template-name")) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplate("cluster-analysis-template-name", "cluster-example")) + c, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := c.newRolloutContext(r) + assert.NoError(t, err) + _, err = roCtx.getReferencedAnalysisTemplates(r, roAnalysisTemplate, validation.PrePromotionAnalysis, 0) + assert.NoError(t, err) + }) +} + +func TestGetInnerReferencedAnalysisTemplate(t *testing.T) { + f := newFixture(t) + defer f.Close() + r := newBlueGreenRollout("rollout", 1, nil, "active-service", "preview-service") + roAnalysisTemplate := &v1alpha1.RolloutAnalysis{ + Templates: []v1alpha1.AnalysisTemplateRef{{ + TemplateName: "first-cluster-analysis-template-name", + ClusterScope: true, + }}, + } + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplateWithAnalysisRefs("first-cluster-analysis-template-name", "second-cluster-analysis-template-name", "third-cluster-analysis-template-name")) + + t.Run("get inner referenced analysisTemplate - fail", func(t *testing.T) { + c, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := c.newRolloutContext(r) + assert.NoError(t, err) + _, err = roCtx.getReferencedAnalysisTemplates(r, roAnalysisTemplate, validation.PrePromotionAnalysis, 0) + expectedErr := field.Invalid(field.NewPath("spec", "templates"), "second-cluster-analysis-template-name", "ClusterAnalysisTemplate 'second-cluster-analysis-template-name' not found") + assert.Error(t, err) + assert.Equal(t, expectedErr.Error(), err.Error()) + }) + + t.Run("get inner referenced analysisTemplate second level - fail", func(t *testing.T) { + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplate("second-cluster-analysis-template-name", "cluster-example")) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplateWithAnalysisRefs("third-cluster-analysis-template-name", "fourth-cluster-analysis-template-name")) + c, _, _ := f.newController(noResyncPeriodFunc) + roCtx, err := c.newRolloutContext(r) + assert.NoError(t, err) + _, err = roCtx.getReferencedAnalysisTemplates(r, roAnalysisTemplate, validation.PrePromotionAnalysis, 0) + expectedErr := field.Invalid(field.NewPath("spec", "templates"), "fourth-cluster-analysis-template-name", "ClusterAnalysisTemplate 'fourth-cluster-analysis-template-name' not found") + assert.Error(t, err) + assert.Equal(t, expectedErr.Error(), err.Error()) + }) + + t.Run("get inner referenced analysisTemplate - success", func(t *testing.T) { + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplate("second-cluster-analysis-template-name", "cluster-example")) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplateWithAnalysisRefs("third-cluster-analysis-template-name", "fourth-cluster-analysis-template-name")) + f.clusterAnalysisTemplateLister = append(f.clusterAnalysisTemplateLister, clusterAnalysisTemplate("fourth-cluster-analysis-template-name", "cluster-example")) c, _, _ := f.newController(noResyncPeriodFunc) roCtx, err := c.newRolloutContext(r) assert.NoError(t, err) diff --git a/rollout/experiment_test.go b/rollout/experiment_test.go index f3dc2029b9..6dabeb47f7 100644 --- a/rollout/experiment_test.go +++ b/rollout/experiment_test.go @@ -76,7 +76,7 @@ func TestRolloutCreateClusterTemplateExperiment(t *testing.T) { f := newFixture(t) defer f.Close() - cat := clusterAnalysisTemplate("bar") + cat := clusterAnalysisTemplate("bar", "cluster-example") steps := []v1alpha1.CanaryStep{{ Experiment: &v1alpha1.RolloutExperimentStep{ Templates: []v1alpha1.RolloutExperimentTemplate{{ diff --git a/rollout/sync_test.go b/rollout/sync_test.go index c29b954804..7b2552e6c9 100644 --- a/rollout/sync_test.go +++ b/rollout/sync_test.go @@ -313,7 +313,7 @@ func TestCanaryPromoteFull(t *testing.T) { r1 := newCanaryRollout("foo", 10, nil, steps, int32Ptr(0), intstr.FromInt(10), intstr.FromInt(0)) r1.Spec.Strategy.Canary.Analysis = &v1alpha1.RolloutAnalysisBackground{ RolloutAnalysis: v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, @@ -359,14 +359,14 @@ func TestBlueGreenPromoteFull(t *testing.T) { r1 := newBlueGreenRollout("foo", 10, nil, "active", "preview") r1.Spec.Strategy.BlueGreen.AutoPromotionEnabled = pointer.BoolPtr(false) r1.Spec.Strategy.BlueGreen.PrePromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, }, } r1.Spec.Strategy.BlueGreen.PostPromotionAnalysis = &v1alpha1.RolloutAnalysis{ - Templates: []v1alpha1.RolloutAnalysisTemplate{ + Templates: []v1alpha1.AnalysisTemplateRef{ { TemplateName: at.Name, }, diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 01e838622c..1927cd61a6 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -319,6 +319,25 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisRun */ unsuccessfulRunHistoryLimit?: number; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisTemplateRef + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisTemplateRef { + /** + * + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisTemplateRef + */ + templateName?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1AnalysisTemplateRef + */ + clusterScope?: boolean; +} /** * * @export @@ -1891,10 +1910,10 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1Rollout { export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysis { /** * - * @type {Array} + * @type {Array} * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysis */ - templates?: Array; + templates?: Array; /** * * @type {Array} @@ -1964,25 +1983,6 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnal */ message?: string; } -/** - * - * @export - * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysisTemplate - */ -export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysisTemplate { - /** - * - * @type {string} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysisTemplate - */ - templateName?: string; - /** - * - * @type {boolean} - * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1RolloutAnalysisTemplate - */ - clusterScope?: boolean; -} /** * RolloutCondition describes the state of a rollout at a certain point. * @export diff --git a/utils/analysis/helpers.go b/utils/analysis/helpers.go index 36fb880e98..42ded67315 100644 --- a/utils/analysis/helpers.go +++ b/utils/analysis/helpers.go @@ -585,3 +585,23 @@ func GetInstanceID(obj runtime.Object) string { } return "" } + +func FilterUniqueTemplates(templates []*v1alpha1.AnalysisTemplate, clusterTemplates []*v1alpha1.ClusterAnalysisTemplate) ([]*v1alpha1.AnalysisTemplate, []*v1alpha1.ClusterAnalysisTemplate) { + uniqueTemplates := []*v1alpha1.AnalysisTemplate{} + uniqueClusterTemplates := []*v1alpha1.ClusterAnalysisTemplate{} + seenTemplates := map[string]bool{} + seenClusterTemplates := map[string]bool{} + for _, template := range templates { + if !seenTemplates[template.Name] { + seenTemplates[template.Name] = true + uniqueTemplates = append(uniqueTemplates, template) + } + } + for _, clusterTemplate := range clusterTemplates { + if !seenClusterTemplates[clusterTemplate.Name] { + seenClusterTemplates[clusterTemplate.Name] = true + uniqueClusterTemplates = append(uniqueClusterTemplates, clusterTemplate) + } + } + return uniqueTemplates, uniqueClusterTemplates +} diff --git a/utils/analysis/helpers_test.go b/utils/analysis/helpers_test.go index d87937c0c9..de1aa97d58 100644 --- a/utils/analysis/helpers_test.go +++ b/utils/analysis/helpers_test.go @@ -1115,3 +1115,83 @@ func TestGetMeasurementRetentionMetrics(t *testing.T) { assert.Equal(t, len(measurementRetentionMetricNamesMap), 0) }) } + +func TestAnalysisTemplateFiltering(t *testing.T) { + t.Run("FilterAnalysisTemplates is returning empty arrays when empty arrays are provided in parameters", func(t *testing.T) { + + analysisTemplates := []*v1alpha1.AnalysisTemplate{} + clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{} + + filteredAnalysisTemplates, filteredClusterAnalysisTemplates := FilterUniqueTemplates(analysisTemplates, clusterAnalysisTemplates) + + assert.Equal(t, len(filteredAnalysisTemplates), 0) + assert.Equal(t, len(filteredClusterAnalysisTemplates), 0) + + }) + + t.Run("FilterAnalysisTemplates is not filtering analysisTemplates duplications if there are none in the reference tree", func(t *testing.T) { + + analysisTemplates := []*v1alpha1.AnalysisTemplate{ + analysisTemplate("foo"), + analysisTemplate("bar"), + analysisTemplate("foo-2"), + analysisTemplate("foo-3"), + } + clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{ + clusterAnalysisTemplate("cluster-foo"), + clusterAnalysisTemplate("cluster-bar"), + clusterAnalysisTemplate("cluster-foo-2"), + clusterAnalysisTemplate("cluster-foo-3"), + } + + filteredAnalysisTemplates, filteredClusterAnalysisTemplates := FilterUniqueTemplates(analysisTemplates, clusterAnalysisTemplates) + + assert.Equal(t, len(filteredAnalysisTemplates), 4) + assert.Equal(t, len(filteredClusterAnalysisTemplates), 4) + + }) + t.Run("FilterAnalysisTemplates is filtering analysisTemplates duplications in the reference tree", func(t *testing.T) { + + analysisTemplates := []*v1alpha1.AnalysisTemplate{ + analysisTemplate("foo"), + analysisTemplate("foo"), + analysisTemplate("foo-2"), + analysisTemplate("foo-3"), + analysisTemplate("foo-3"), + } + clusterAnalysisTemplates := []*v1alpha1.ClusterAnalysisTemplate{ + clusterAnalysisTemplate("cluster-foo"), + clusterAnalysisTemplate("cluster-foo"), + clusterAnalysisTemplate("cluster-bar"), + clusterAnalysisTemplate("cluster-bar"), + clusterAnalysisTemplate("cluster-bar"), + clusterAnalysisTemplate("cluster-bar"), + clusterAnalysisTemplate("cluster-foo-2"), + clusterAnalysisTemplate("cluster-foo-2"), + clusterAnalysisTemplate("cluster-foo-2"), + clusterAnalysisTemplate("cluster-foo-3"), + } + + filteredAnalysisTemplates, filteredClusterAnalysisTemplates := FilterUniqueTemplates(analysisTemplates, clusterAnalysisTemplates) + + assert.Equal(t, len(filteredAnalysisTemplates), 3) + assert.Equal(t, len(filteredClusterAnalysisTemplates), 4) + + }) +} + +func analysisTemplate(name string) *v1alpha1.AnalysisTemplate { + return &v1alpha1.AnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } +} + +func clusterAnalysisTemplate(name string) *v1alpha1.ClusterAnalysisTemplate { + return &v1alpha1.ClusterAnalysisTemplate{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + } +} From d2826cd15e42cbbc207215d841deb531ed8f77a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 15:23:35 -0500 Subject: [PATCH 246/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.5 to 1.27.9 (#3469) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.27.5 to 1.27.9. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.27.5...config/v1.27.9) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index a0844bb1d3..4f93661c53 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.26.0 - github.com/aws/aws-sdk-go-v2/config v1.27.5 + github.com/aws/aws-sdk-go-v2/config v1.27.9 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 github.com/aws/smithy-go v1.20.1 @@ -80,17 +80,17 @@ require ( github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index b6e32badba..f9c4008588 100644 --- a/go.sum +++ b/go.sum @@ -95,12 +95,12 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= -github.com/aws/aws-sdk-go-v2/config v1.27.5 h1:brBPsyRFQn97M1ZhQ9tLXkO7Zytiar0NS06FGmEJBdg= -github.com/aws/aws-sdk-go-v2/config v1.27.5/go.mod h1:I53uvsfddRRTG5YcC4n5Z3aOD1BU8hYCoIG7iEJG4wM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.5 h1:yn3zSvIKC2NZIs40cY3kckcy9Zma96PrRR07N54PCvY= -github.com/aws/aws-sdk-go-v2/credentials v1.17.5/go.mod h1:8JcKPAGZVnDWuR5lusAwmrSDtZnDIAnpQWaDC9RFt2g= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2 h1:AK0J8iYBFeUk2Ax7O8YpLtFsfhdOByh2QIkHmigpRYk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.2/go.mod h1:iRlGzMix0SExQEviAyptRWRGdYNo3+ufW/lCzvKVTUc= +github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= +github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= +github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= @@ -113,16 +113,16 @@ github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 h1:Lq2q/AWzF github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4/go.mod h1:SNhjWOsnsHSveL4fDQL0sDiAIMVnKrvJTp9Z/MNspx0= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3 h1:x0N5ftQzgcfRpCpTiyZC40pvNUJYhzf4UgCsAyO6/P8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.3/go.mod h1:Ru7vg1iQ7cR4i7SZ/JTLYN9kaXtbL69UdgG0OQWQxW0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 h1:b+E7zIUHMmcB4Dckjpkapoy47W6C9QBv/zoUP+Hn8Kc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6/go.mod h1:S2fNV0rxrP78NhPbCZeQgY8H9jdDMeGtwcfZIRxzBqU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.1 h1:utEGkfdQ4L6YW/ietH7111ZYglLJvS+sLriHJ1NBJEQ= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.1/go.mod h1:RsYqzYr2F2oPDdpy+PdhephuZxTfjHQe7SOBcZGoAU8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1 h1:9/GylMS45hGGFCcMrUZDVayQE1jYSIN6da9jo7RAYIw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.1/go.mod h1:YjAPFn4kGFqKC54VsHs5fn5B6d+PCY2tziEa3U/GB5Y= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.2 h1:0YjXuWdYHvsm0HnT4vO8XpwG1D+i2roxSCBoN6deJ7M= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.2/go.mod h1:jI+FWmYkSMn+4APWmZiZTgt0oM0TrvymD51FMqCnWgA= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 h1:mnbuWHOcM70/OFUlZZ5rcdfA8PflGXXiefU/O+1S3+8= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.3/go.mod h1:5HFu51Elk+4oRBZVxmHrSds5jFXmFj8C3w7DVF2gnrs= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1AaQDaPpwTKAeByEc6WFM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 6a003794ee72061c9a3f066a8f4ee13e66f91feb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:04:35 -0500 Subject: [PATCH 247/264] chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 (#3429) * chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 Bumps google.golang.org/protobuf from 1.32.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 Bumps google.golang.org/protobuf from 1.32.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * manual bump: https://github.com/protocolbuffers/protobuf/issues/16163 Signed-off-by: Zach Aller --------- Signed-off-by: dependabot[bot] Signed-off-by: Zach Aller Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zach Aller --- go.mod | 6 +++--- go.sum | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 4f93661c53..d3357124da 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/argoproj/argo-rollouts go 1.21 -toolchain go1.21.7 +toolchain go1.21.8 require ( github.com/antonmedv/expr v1.15.5 @@ -18,7 +18,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.3 + github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-plugin v1.6.0 github.com/influxdata/influxdb-client-go/v2 v2.13.0 @@ -42,7 +42,7 @@ require ( golang.org/x/oauth2 v0.18.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.26.11 k8s.io/apiextensions-apiserver v0.26.11 diff --git a/go.sum b/go.sum index f9c4008588..d235c1ad67 100644 --- a/go.sum +++ b/go.sum @@ -299,8 +299,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -1078,8 +1078,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= From 8e3eefae56c1699b7898e24a09f9045f17f73c76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:04:59 -0500 Subject: [PATCH 248/264] chore(deps): bump github.com/aws/smithy-go from 1.20.1 to 1.20.2 (#3488) Bumps [github.com/aws/smithy-go](https://github.com/aws/smithy-go) from 1.20.1 to 1.20.2. - [Release notes](https://github.com/aws/smithy-go/releases) - [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/smithy-go/compare/v1.20.1...v1.20.2) --- updated-dependencies: - dependency-name: github.com/aws/smithy-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d3357124da..bff1fe2c09 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.27.9 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 - github.com/aws/smithy-go v1.20.1 + github.com/aws/smithy-go v1.20.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 github.com/evanphx/json-patch/v5 v5.9.0 diff --git a/go.sum b/go.sum index d235c1ad67..66dfb96d7d 100644 --- a/go.sum +++ b/go.sum @@ -123,8 +123,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1A github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= -github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= -github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= From a13d033524c1f0ce324bb2da6679d1a3f665b255 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 23:30:28 +0000 Subject: [PATCH 249/264] chore(deps): bump github.com/prometheus/common from 0.42.0 to 0.51.1 (#3468) * chore(deps): bump github.com/prometheus/common from 0.42.0 to 0.51.1 Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.42.0 to 0.51.1. - [Release notes](https://github.com/prometheus/common/releases) - [Commits](https://github.com/prometheus/common/compare/v0.42.0...v0.51.1) --- updated-dependencies: - dependency-name: github.com/prometheus/common dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix test Signed-off-by: Zach Aller --------- Signed-off-by: dependabot[bot] Signed-off-by: Zach Aller Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zach Aller --- go.mod | 9 ++++----- go.sum | 18 ++++++++---------- utils/record/record_test.go | 8 +++++++- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index bff1fe2c09..73ba453285 100644 --- a/go.mod +++ b/go.mod @@ -27,9 +27,9 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.16.0 - github.com/prometheus/client_model v0.3.0 - github.com/prometheus/common v0.42.0 + github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/client_model v0.6.0 + github.com/prometheus/common v0.51.1 github.com/prometheus/common/sigv4 v0.1.0 github.com/servicemeshinterface/smi-sdk-go v0.5.0 github.com/sirupsen/logrus v1.9.3 @@ -143,7 +143,6 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.0.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect @@ -161,7 +160,7 @@ require ( github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/slack-go/slack v0.12.2 // indirect diff --git a/go.sum b/go.sum index 66dfb96d7d..33137e491a 100644 --- a/go.sum +++ b/go.sum @@ -487,8 +487,6 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.29/go.mod h1:x81+AX5gHSfCSqw7jxRKHvxUXMlE5uKX0Vb75Xk5yYg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= @@ -571,28 +569,28 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw= +github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= diff --git a/utils/record/record_test.go b/utils/record/record_test.go index 4098feca4f..dfea598eae 100644 --- a/utils/record/record_test.go +++ b/utils/record/record_test.go @@ -317,7 +317,13 @@ func TestNotificationSendPerformance(t *testing.T) { if err != nil { t.Fatalf("error: %v", err) } - log.Infof("mfs: %v, %v, %v, %v", *mfs[0], *mfs[0].Metric[0].Histogram.SampleCount, *mfs[0].Metric[0].Histogram.SampleSum, *mfs[0].Metric[0].Histogram.Bucket[0].CumulativeCount) + t.Logf( + "mfs: %s, %v, %v, %v", + mfs[0].GetName(), + mfs[0].GetMetric()[0].GetHistogram().GetSampleCount(), + mfs[0].GetMetric()[0].GetHistogram().GetSampleSum(), + mfs[0].GetMetric()[0].GetHistogram().GetBucket()[0].GetCumulativeCount(), + ) want := `# HELP notification_send_performance Notification send performance. # TYPE notification_send_performance histogram notification_send_performance_bucket{name="guestbook",namespace="default",le="0.01"} 0 From 55bac14fee7f05b3aacca45c954ea9cca3d1d00f Mon Sep 17 00:00:00 2001 From: Chetan Banavikalmutt Date: Tue, 2 Apr 2024 22:17:25 +0530 Subject: [PATCH 250/264] fix: set formatter for klog logger (#3493) Signed-off-by: Chetan Banavikalmutt --- cmd/rollouts-controller/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/rollouts-controller/main.go b/cmd/rollouts-controller/main.go index 4b058b09a7..c8deab3ea0 100644 --- a/cmd/rollouts-controller/main.go +++ b/cmd/rollouts-controller/main.go @@ -89,11 +89,13 @@ func newCommand() *cobra.Command { fmt.Println(version.GetVersion()) return nil } + logger := log.New() setLogLevel(logLevel) if logFormat != "" { log.SetFormatter(createFormatter(logFormat)) + logger.SetFormatter(createFormatter(logFormat)) } - logutil.SetKLogLogger(log.New()) + logutil.SetKLogLogger(logger) logutil.SetKLogLevel(klogLevel) log.WithField("version", version.GetVersion()).Info("Argo Rollouts starting") From 2dc71e3cf2fa7d1ac81da60122657b6a6dba2073 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 3 Apr 2024 00:34:44 +0200 Subject: [PATCH 251/264] chore: bump k8s versions to 1.29 (#3494) * chore: bump k8s versions Signed-off-by: Zach Aller * chore: bump k8s versions Signed-off-by: Zach Aller * chore: bump k8s versions Signed-off-by: Zach Aller * chore: bump k8s versions Signed-off-by: Zach Aller * chore: bump k8s versions - cleanup Signed-off-by: Zach Aller * bump time to pass on new and old versions Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- .github/workflows/e2e.yaml | 4 +- .../features/kustomize/rollout_cr_schema.json | 947 ++++++++++++++++++ go.mod | 152 +-- go.sum | 288 ++++-- hack/swagger-codegen.sh | 6 +- hack/update-codegen.sh | 2 +- manifests/crds/analysis-run-crd.yaml | 141 +++ manifests/crds/analysis-template-crd.yaml | 141 +++ .../crds/cluster-analysis-template-crd.yaml | 141 +++ manifests/crds/experiment-crd.yaml | 133 +++ manifests/crds/rollout-crd.yaml | 133 +++ manifests/install.yaml | 689 +++++++++++++ pkg/apiclient/rollout/rollout.swagger.json | 187 +++- .../rollouts/v1alpha1/openapi_generated.go | 10 +- pkg/apis/rollouts/validation/validation.go | 4 +- pkg/client/clientset/versioned/doc.go | 20 - .../v1alpha1/fake/fake_analysisrun.go | 5 +- .../v1alpha1/fake/fake_analysistemplate.go | 5 +- .../fake/fake_clusteranalysistemplate.go | 5 +- .../rollouts/v1alpha1/fake/fake_experiment.go | 5 +- .../rollouts/v1alpha1/fake/fake_rollout.go | 5 +- .../informers/externalversions/factory.go | 14 +- test/e2e/functional_test.go | 4 +- ui/src/models/rollout/generated/api.ts | 186 +++- 24 files changed, 2971 insertions(+), 256 deletions(-) delete mode 100644 pkg/client/clientset/versioned/doc.go diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 558745f54b..36e4a26aa4 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -38,10 +38,12 @@ jobs: fail-fast: false matrix: kubernetes-minor-version: - - 1.23 - 1.24 - 1.25 - 1.26 + - 1.27 + - 1.28 + - 1.29 name: Run end-to-end tests runs-on: ubuntu-latest steps: diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 4dd0d72859..038ebebf89 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -336,6 +336,10 @@ "format": "int32", "type": "integer" }, + "backoffLimitPerIndex": { + "format": "int32", + "type": "integer" + }, "completionMode": { "type": "string" }, @@ -346,6 +350,10 @@ "manualSelector": { "type": "boolean" }, + "maxFailedIndexes": { + "format": "int32", + "type": "integer" + }, "parallelism": { "format": "int32", "type": "integer" @@ -415,6 +423,9 @@ ], "type": "object" }, + "podReplacementPolicy": { + "type": "string" + }, "selector": { "properties": { "matchExpressions": { @@ -665,6 +676,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -768,6 +793,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -867,6 +906,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -970,6 +1023,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -1249,6 +1316,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -1333,6 +1412,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -1644,6 +1735,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -1673,6 +1783,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -2217,6 +2330,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -2301,6 +2426,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -2612,6 +2749,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -2641,6 +2797,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -3195,6 +3354,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -3279,6 +3450,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -3590,6 +3773,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -3619,6 +3821,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -4969,6 +5174,10 @@ "format": "int32", "type": "integer" }, + "backoffLimitPerIndex": { + "format": "int32", + "type": "integer" + }, "completionMode": { "type": "string" }, @@ -4979,6 +5188,10 @@ "manualSelector": { "type": "boolean" }, + "maxFailedIndexes": { + "format": "int32", + "type": "integer" + }, "parallelism": { "format": "int32", "type": "integer" @@ -5048,6 +5261,9 @@ ], "type": "object" }, + "podReplacementPolicy": { + "type": "string" + }, "selector": { "properties": { "matchExpressions": { @@ -5298,6 +5514,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -5401,6 +5631,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -5500,6 +5744,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -5603,6 +5861,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -5882,6 +6154,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -5966,6 +6250,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -6277,6 +6573,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -6306,6 +6621,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -6850,6 +7168,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -6934,6 +7264,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -7245,6 +7587,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -7274,6 +7635,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -7828,6 +8192,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -7912,6 +8288,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -8223,6 +8611,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -8252,6 +8659,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -9615,6 +10025,10 @@ "format": "int32", "type": "integer" }, + "backoffLimitPerIndex": { + "format": "int32", + "type": "integer" + }, "completionMode": { "type": "string" }, @@ -9625,6 +10039,10 @@ "manualSelector": { "type": "boolean" }, + "maxFailedIndexes": { + "format": "int32", + "type": "integer" + }, "parallelism": { "format": "int32", "type": "integer" @@ -9694,6 +10112,9 @@ ], "type": "object" }, + "podReplacementPolicy": { + "type": "string" + }, "selector": { "properties": { "matchExpressions": { @@ -9944,6 +10365,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -10047,6 +10482,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -10146,6 +10595,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -10249,6 +10712,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -10528,6 +11005,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -10612,6 +11101,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -10923,6 +11424,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -10952,6 +11472,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -11496,6 +12019,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -11580,6 +12115,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -11891,6 +12438,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -11920,6 +12486,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -12474,6 +13043,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -12558,6 +13139,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -12869,6 +13462,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -12898,6 +13510,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -14309,6 +14924,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -14412,6 +15041,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -14511,6 +15154,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -14614,6 +15271,20 @@ "type": "object", "x-kubernetes-map-type": "atomic" }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "namespaceSelector": { "properties": { "matchExpressions": { @@ -14893,6 +15564,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -14977,6 +15660,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -15288,6 +15983,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -15317,6 +16031,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -15861,6 +16578,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -15945,6 +16674,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -16256,6 +16997,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -16285,6 +17045,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -16839,6 +17602,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -16923,6 +17698,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -17234,6 +18021,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -17263,6 +18069,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -18459,6 +19268,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -18543,6 +19364,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -18854,6 +19687,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -18883,6 +19735,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -19392,6 +20247,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -19476,6 +20343,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -19787,6 +20666,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -19816,6 +20714,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { @@ -20361,6 +21262,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -20445,6 +21358,18 @@ ], "type": "object" }, + "sleep": { + "properties": { + "seconds": { + "format": "int64", + "type": "integer" + } + }, + "required": [ + "seconds" + ], + "type": "object" + }, "tcpSocket": { "properties": { "host": { @@ -20756,6 +21681,25 @@ }, "type": "object" }, + "resizePolicy": { + "items": { + "properties": { + "resourceName": { + "type": "string" + }, + "restartPolicy": { + "type": "string" + } + }, + "required": [ + "resourceName", + "restartPolicy" + ], + "type": "object" + }, + "type": "array", + "x-kubernetes-list-type": "atomic" + }, "resources": { "properties": { "claims": { @@ -20785,6 +21729,9 @@ }, "type": "object" }, + "restartPolicy": { + "type": "string" + }, "securityContext": { "properties": { "allowPrivilegeEscalation": { diff --git a/go.mod b/go.mod index 73ba453285..342bb38b37 100644 --- a/go.mod +++ b/go.mod @@ -27,9 +27,9 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/newrelic/newrelic-client-go v1.1.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/client_golang v1.18.0 github.com/prometheus/client_model v0.6.0 - github.com/prometheus/common v0.51.1 + github.com/prometheus/common v0.47.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/servicemeshinterface/smi-sdk-go v0.5.0 github.com/sirupsen/logrus v1.9.3 @@ -44,19 +44,19 @@ require ( google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.26.11 - k8s.io/apiextensions-apiserver v0.26.11 - k8s.io/apimachinery v0.26.11 - k8s.io/apiserver v0.26.11 - k8s.io/cli-runtime v0.26.11 - k8s.io/client-go v0.26.11 - k8s.io/code-generator v0.26.11 - k8s.io/component-base v0.26.11 - k8s.io/klog/v2 v2.80.1 - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 - k8s.io/kubectl v0.26.11 - k8s.io/kubernetes v1.26.11 - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 + k8s.io/api v0.29.3 + k8s.io/apiextensions-apiserver v0.29.3 + k8s.io/apimachinery v0.29.3 + k8s.io/apiserver v0.29.3 + k8s.io/cli-runtime v0.29.3 + k8s.io/client-go v0.29.3 + k8s.io/code-generator v0.29.3 + k8s.io/component-base v0.29.3 + k8s.io/klog/v2 v2.110.1 + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 + k8s.io/kubectl v0.29.3 + k8s.io/kubernetes v1.29.3 + k8s.io/utils v0.0.0-20230726121419-3b25d923346b sigs.k8s.io/yaml v1.4.0 ) @@ -76,9 +76,12 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.2.0 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect github.com/RocketChat/Rocket.Chat.Go.SDK v0.0.0-20220708192748-b73dcb041214 // indirect + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect @@ -93,27 +96,33 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/circl v1.3.3 // indirect + github.com/coreos/go-semver v0.3.1 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.7.0 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.21.1 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/gnostic v0.6.9 // indirect + github.com/google/cel-go v0.17.7 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v53 v53.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -126,6 +135,8 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/gregdel/pushover v1.2.1 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v0.14.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.1 // indirect @@ -148,12 +159,13 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect + github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/oapi-codegen/runtime v1.0.0 // indirect github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -166,22 +178,40 @@ require ( github.com/slack-go/slack v0.12.2 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fastjson v1.6.3 // indirect github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 // indirect - github.com/xlab/treeprint v1.1.0 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + go.etcd.io/etcd/api/v3 v3.5.10 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect + go.etcd.io/etcd/client/v3 v3.5.10 // indirect go.opencensus.io v0.24.0 // indirect - go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/sdk v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.19.0 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.12.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect + golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect + golang.org/x/tools v0.16.1 // indirect gomodules.xyz/envconfig v1.3.1-0.20190308184047-426f31af0d45 // indirect gomodules.xyz/notify v0.1.1 // indirect google.golang.org/api v0.149.0 // indirect @@ -191,42 +221,48 @@ require ( gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/cloud-provider v0.0.0 // indirect k8s.io/cluster-bootstrap v0.25.8 // indirect - k8s.io/component-helpers v0.26.11 // indirect - k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kustomize/api v0.12.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + k8s.io/component-helpers v0.29.3 // indirect + k8s.io/controller-manager v0.29.3 // indirect + k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 // indirect + k8s.io/kms v0.29.3 // indirect + k8s.io/kubelet v0.0.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) replace ( github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 github.com/go-telegram-bot-api/telegram-bot-api/v5 => github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf - k8s.io/api v0.0.0 => k8s.io/api v0.26.11 - k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.26.11 - k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.26.11 - k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.26.11 - k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.26.11 - k8s.io/client-go v0.0.0 => k8s.io/client-go v0.26.11 - k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.26.11 - k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.26.11 - k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.26.11 - k8s.io/component-base v0.0.0 => k8s.io/component-base v0.26.11 - k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.26.11 - k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.26.11 - k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.26.11 - k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.26.11 - k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.26.11 - k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.26.11 - k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.26.11 - k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.26.11 - k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.26.11 - k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.26.11 - k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.26.11 - k8s.io/metrics v0.0.0 => k8s.io/metrics v0.26.11 - k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.26.11 - k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.26.11 - k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.26.11 + k8s.io/api v0.0.0 => k8s.io/api v0.29.3 + k8s.io/apiextensions-apiserver v0.0.0 => k8s.io/apiextensions-apiserver v0.29.3 + k8s.io/apimachinery v0.0.0 => k8s.io/apimachinery v0.29.3 + k8s.io/apiserver v0.0.0 => k8s.io/apiserver v0.29.3 + k8s.io/cli-runtime v0.0.0 => k8s.io/cli-runtime v0.29.3 + k8s.io/client-go v0.0.0 => k8s.io/client-go v0.29.3 + k8s.io/cloud-provider v0.0.0 => k8s.io/cloud-provider v0.29.3 + k8s.io/cluster-bootstrap v0.0.0 => k8s.io/cluster-bootstrap v0.29.3 + k8s.io/code-generator v0.0.0 => k8s.io/code-generator v0.29.3 + k8s.io/component-base v0.0.0 => k8s.io/component-base v0.29.3 + k8s.io/component-helpers v0.0.0 => k8s.io/component-helpers v0.29.3 + k8s.io/controller-manager v0.0.0 => k8s.io/controller-manager v0.29.3 + k8s.io/cri-api v0.0.0 => k8s.io/cri-api v0.29.3 + k8s.io/csi-translation-lib v0.0.0 => k8s.io/csi-translation-lib v0.29.3 + k8s.io/kube-aggregator v0.0.0 => k8s.io/kube-aggregator v0.29.3 + k8s.io/kube-controller-manager v0.0.0 => k8s.io/kube-controller-manager v0.29.3 + k8s.io/kube-proxy v0.0.0 => k8s.io/kube-proxy v0.29.3 + k8s.io/kube-scheduler v0.0.0 => k8s.io/kube-scheduler v0.29.3 + k8s.io/kubectl v0.0.0 => k8s.io/kubectl v0.29.3 + k8s.io/kubelet v0.0.0 => k8s.io/kubelet v0.29.3 + k8s.io/legacy-cloud-providers v0.0.0 => k8s.io/legacy-cloud-providers v0.29.3 + k8s.io/metrics v0.0.0 => k8s.io/metrics v0.29.3 + k8s.io/mount-utils v0.0.0 => k8s.io/mount-utils v0.29.3 + k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.29.3 + k8s.io/sample-apiserver v0.0.0 => k8s.io/sample-apiserver v0.29.3 ) diff --git a/go.sum b/go.sum index 33137e491a..81c7a7ee5f 100644 --- a/go.sum +++ b/go.sum @@ -58,7 +58,8 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf h1:a7VKhbjKYPO8twGy/1AxMpM2Fp0qT7bf25fmCVMVu4s= github.com/OvyFlash/telegram-bot-api/v5 v5.0.0-20240108230938-63e5c59035bf/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/PagerDuty/go-pagerduty v1.7.0 h1:S1NcMKECxT5hJwV4VT+QzeSsSiv4oWl1s2821dUqG/8= @@ -78,6 +79,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/antonmedv/expr v1.15.5 h1:y0Iz3cEwmpRz5/r3w4qQR0MfIqJGdGM1zbhD/v0G5Vg= github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= @@ -89,6 +92,8 @@ github.com/argoproj/pkg v0.13.6 h1:36WPD9MNYECHcO1/R1pj6teYspiK7uMQLCgLGft2abM= github.com/argoproj/pkg v0.13.6/go.mod h1:I698DoJBKuvNFaixh4vFl2C88cNIT1WS7KCbz5ewyF8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= @@ -126,6 +131,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yG github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -141,13 +148,13 @@ github.com/bradleyfalzon/ghinstallation/v2 v2.5.0 h1:yaYcGQ7yEIGbsJfW/9z7v1sLiZg github.com/bradleyfalzon/ghinstallation/v2 v2.5.0/go.mod h1:amcvPQMrRkWNdueWOjPytGL25xQGzox7425qMgzo+Vo= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -161,39 +168,44 @@ github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtM github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20220417044921-416226498f94 h1:VIy7cdK7ufs7ctpTFkXJHm1uP3dJSnCGSPysEICB1so= github.com/elazarl/goproxy v0.0.0-20220417044921-416226498f94/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= @@ -209,11 +221,12 @@ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= @@ -232,30 +245,37 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -305,8 +325,10 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +github.com/google/cel-go v0.17.7 h1:6ebJFzu1xO2n7TLtN+UBqShGBhlD85bhvglh5DpcfqQ= +github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -344,6 +366,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -375,8 +399,14 @@ github.com/gregdel/pushover v1.2.1/go.mod h1:EcaO66Nn1StkpEm1iKtBTV3d2A16SoMsVER github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -418,6 +448,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= @@ -468,7 +500,6 @@ github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= @@ -505,8 +536,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= +github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -523,10 +554,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/newrelic/newrelic-client-go v1.1.0 h1:aflNjzQ21c+2GwBVh+UbAf9lznkRfCcVABoc5UM4IXw= github.com/newrelic/newrelic-client-go v1.1.0/go.mod h1:RYMXt7hgYw7nzuXIGd2BH0F1AivgWw7WrBhNBQZEB4k= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oapi-codegen/runtime v1.0.0 h1:P4rqFX5fMFWqRzY9M/3YF9+aPSPPB06IzP2P7oOxrWo= @@ -543,16 +574,16 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo/v2 v2.4.0 h1:+Ig9nvqgS5OBSACXNk15PLdp0U9XPYROt9CFzVdFGIs= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.23.0 h1:/oxKu9c2HVap+F3PfKort2Hw5DEU+HGlW8n+tguWsys= -github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.13 h1:nV98dkBpqaYbDnhefmOQ+Rn4hE+jD6AtjYHXaU5WyJI= @@ -569,8 +600,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -581,8 +612,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.51.1 h1:eIjN50Bwglz6a/c3hAgSMcofL3nD+nFQkV6Dd4DsQCw= -github.com/prometheus/common v0.51.1/go.mod h1:lrWtQx+iDfn2mbH5GUzlH9TSHyfZpHkSiG1W7y3sF2Q= +github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= +github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -594,8 +625,8 @@ github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3c github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -622,7 +653,6 @@ github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= github.com/spaceapegames/go-wavefront v1.8.1 h1:Xuby0uBfw1WVxD9d+l8Gh+zINqnBfd0RJT8e/3i3vBM= github.com/spaceapegames/go-wavefront v1.8.1/go.mod h1:GtdIjtJ0URkfPmaKx0+7vMSDvT/MON9v+4pbdagA8As= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= @@ -637,6 +667,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -659,6 +690,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -669,17 +702,32 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0 h1:qqllXPzXh+So+mmANlX/gCJrgo+1kQyshMoQ+NASzm0= github.com/whilp/git-urls v0.0.0-20191001220047-6db9661140c0/go.mod h1:2rx5KE5FLD0HRfkkpyn8JwbVLBdhgeiOb2D2D9LLKM4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.etcd.io/etcd/pkg/v3 v3.5.10 h1:WPR8K0e9kWl1gAhB5A7gEa5ZBTNkT9NdNWrR8Qpo1CM= +go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs= +go.etcd.io/etcd/raft/v3 v3.5.10 h1:cgNAYe7xrsrn/5kXMSaH8kM/Ky8mAdMqGOxyYwpP0LA= +go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= +go.etcd.io/etcd/server/v3 v3.5.10 h1:4NOGyOwD5sUZ22PiWYKmfxqoeh72z6EhYjNosKGLmZg= +go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -687,9 +735,37 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -719,6 +795,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -742,8 +820,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -785,7 +863,6 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= @@ -838,7 +915,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -890,6 +966,7 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= @@ -902,7 +979,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= @@ -932,12 +1008,12 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -969,8 +1045,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1037,7 +1113,6 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= @@ -1058,8 +1133,6 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1074,7 +1147,6 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= @@ -1084,7 +1156,6 @@ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -1094,6 +1165,8 @@ gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkp gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1106,13 +1179,10 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1122,68 +1192,78 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.17.8/go.mod h1:N++Llhs8kCixMUoCaXXAyMMPbo8dDVnh+IQ36xZV2/0= k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= -k8s.io/api v0.26.11 h1:hLhTZRdYc3vBBOY4wbEyTLWgMyieOAk2Ws9NG57QqO4= -k8s.io/api v0.26.11/go.mod h1:bSr/A0TKRt5W2OMDdexkM/ER1NxOxiQqNNFXW2nMZrM= -k8s.io/apiextensions-apiserver v0.26.11 h1:6/T0Jm9c+Aw1AYUflPOz2sAsty304/DDSkciTr8+HuE= -k8s.io/apiextensions-apiserver v0.26.11/go.mod h1:xMqWxAB+AvSTdmFRVWlpavY9bJl/3g6yWiPn/fwZbT0= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= +k8s.io/apiextensions-apiserver v0.29.3 h1:9HF+EtZaVpFjStakF4yVufnXGPRppWFEQ87qnO91YeI= +k8s.io/apiextensions-apiserver v0.29.3/go.mod h1:po0XiY5scnpJfFizNGo6puNU6Fq6D70UJY2Cb2KwAVc= k8s.io/apimachinery v0.17.8/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= -k8s.io/apimachinery v0.26.11 h1:w//840HHdwSRKqD15j9YX9HLlU6RPlfrvW0xEhLk2+0= -k8s.io/apimachinery v0.26.11/go.mod h1:2/HZp0l6coXtS26du1Bk36fCuAEr/lVs9Q9NbpBtd1Y= -k8s.io/apiserver v0.26.11 h1:JcrlATLu5xQVLV7/rfRFFl9ivvNLmZH0dM3DFFdFp+w= -k8s.io/apiserver v0.26.11/go.mod h1:htEG/Q3sI3+6Is3Z26QzBjaCGICsz/kFj+IhIP4oJuE= -k8s.io/cli-runtime v0.26.11 h1:HO3Sgf06XkT8/8wWnhskfz4+LMKrChRz+A13vDJSQrE= -k8s.io/cli-runtime v0.26.11/go.mod h1:D98GjQtDmqn7WDuKBgWivd6R8qEs3yzT19EmCM5pqBs= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= +k8s.io/apiserver v0.29.3 h1:xR7ELlJ/BZSr2n4CnD3lfA4gzFivh0wwfNfz9L0WZcE= +k8s.io/apiserver v0.29.3/go.mod h1:hrvXlwfRulbMbBgmWRQlFru2b/JySDpmzvQwwk4GUOs= +k8s.io/cli-runtime v0.29.3 h1:r68rephmmytoywkw2MyJ+CxjpasJDQY7AGc3XY2iv1k= +k8s.io/cli-runtime v0.29.3/go.mod h1:aqVUsk86/RhaGJwDhHXH0jcdqBrgdF3bZWk4Z9D4mkM= k8s.io/client-go v0.17.8/go.mod h1:SJsDS64AAtt9VZyeaQMb4Ck5etCitZ/FwajWdzua5eY= k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= -k8s.io/client-go v0.26.11 h1:RjfZr5+vQjjTRmk4oCqHyC0cgrZXPjw+X+ge35sk4GI= -k8s.io/client-go v0.26.11/go.mod h1:+emNszw9va/uRJIM5ALTBtFnlZMTjwBrNjRfEh0iuw8= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= +k8s.io/cloud-provider v0.29.3 h1:y39hNq0lrPD1qmqQ2ykwMJGeWF9LsepVkR2a4wskwLc= +k8s.io/cloud-provider v0.29.3/go.mod h1:daDV1WkAO6pTrdsn7v8TpN/q9n75ExUC4RJDl7vlPKk= k8s.io/cluster-bootstrap v0.25.8 h1:2JoXlDAnki1rmYMdrExP5tYXJgJhCERYHtAbucjZgs8= k8s.io/cluster-bootstrap v0.25.8/go.mod h1:O7q/A8Os259t1Tm2S9Zn9XipZ9eej0AfApj1htCT0Lc= k8s.io/code-generator v0.18.8/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.26.11 h1:S0PJxapUhG6LWYezYB/FVE5Gf4BxGY0fCwnLrwfQ/70= -k8s.io/code-generator v0.26.11/go.mod h1:Hjxj7hpvSxcNnYIWzCSuEdwN0/9aHlezQRKJXr0Kv8U= -k8s.io/component-base v0.26.11 h1:1/JmB6fexefGByfFyIK6aHksZZVtaDskttzXOzmZ6zA= -k8s.io/component-base v0.26.11/go.mod h1:jYNisnoM6iWFRUg51pxaQabzL5fBYTr5CMpsLjUYGp0= -k8s.io/component-helpers v0.26.11 h1:XD2/2lik/5n1WFepDvgHzIGL0tix/EU3GaxGJHdsgkA= -k8s.io/component-helpers v0.26.11/go.mod h1:lw3bchkI0NHMPmb+CE73GznPW0Mvqd/Y9UVMEqBkysE= +k8s.io/code-generator v0.29.3 h1:m7E25/t9R9NvejspO2zBdyu+/Gl0Z5m7dCRc680KS14= +k8s.io/code-generator v0.29.3/go.mod h1:x47ofBhN4gxYFcxeKA1PYXeaPreAGaDN85Y/lNUsPoM= +k8s.io/component-base v0.29.3 h1:Oq9/nddUxlnrCuuR2K/jp6aflVvc0uDvxMzAWxnGzAo= +k8s.io/component-base v0.29.3/go.mod h1:Yuj33XXjuOk2BAaHsIGHhCKZQAgYKhqIxIjIr2UXYio= +k8s.io/component-helpers v0.29.3 h1:1dqZswuZgT2ZMixYeORyCUOAApXxgsvjVSgfoUT+P4o= +k8s.io/component-helpers v0.29.3/go.mod h1:yiDqbRQrnQY+sPju/bL7EkwDJb6LVOots53uZNMZBos= +k8s.io/controller-manager v0.29.3 h1:pvm3mirypgW7kM6dHRk6O5ANZj4bZTWirfk5gO6RlCo= +k8s.io/controller-manager v0.29.3/go.mod h1:RNxpf0d1WAo59sOLd32isWJP0oZ7Zxr+q4VEEaSq4gk= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08= -k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.5.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kms v0.29.3 h1:ReljsAUhYlm2spdT4yXmY+9a8x8dc/OT4mXvwQPPteQ= +k8s.io/kms v0.29.3/go.mod h1:TBGbJKpRUMk59neTMDMddjIDL+D4HuFUbpuiuzmOPg0= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.26.11 h1:cVPzYA4HKefU3tPiVK7hZpJ+5Lm04XoyvCCY5ODznpQ= -k8s.io/kubectl v0.26.11/go.mod h1:xjEX/AHtEQrGj2AGqVopyHr/JU1hLy1k7Yn48JuK9LQ= -k8s.io/kubernetes v1.26.11 h1:g3r1IAUqsaHnOG2jdpoagJ5W9UCXkR2ljQ/7BmCzPNg= -k8s.io/kubernetes v1.26.11/go.mod h1:z1URAaBJ+XnOTr3Q/l4umxRUxn/OyD2fbkUgS0Bl7u4= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/kubectl v0.29.3 h1:RuwyyIU42MAISRIePaa8Q7A3U74Q9P4MoJbDFz9o3us= +k8s.io/kubectl v0.29.3/go.mod h1:yCxfY1dbwgVdEt2zkJ6d5NNLOhhWgTyrqACIoFhpdd4= +k8s.io/kubelet v0.29.3 h1:X9h0ZHzc+eUeNTaksbN0ItHyvGhQ7Z0HPjnQD2oHdwU= +k8s.io/kubelet v0.29.3/go.mod h1:jDiGuTkFOUynyBKzOoC1xRSWlgAZ9UPcTYeFyjr6vas= +k8s.io/kubernetes v1.29.3 h1:EuOAKN4zpiP+kBx/0e9yS5iBkPSyLml19juOqZxBtDw= +k8s.io/kubernetes v1.29.3/go.mod h1:CP+Z+S9haxyB7J+nV6ywYry4dqlphArPXjcc0CsBVXc= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= -sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= -sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= -sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0 h1:TgtAeesdhpm2SGwkQasmbeqDo8th5wOBA5h/AjTKA4I= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0/go.mod h1:VHVDI/KrK4fjnV61bE2g3sA7tiETLn8sooImelsCx3Y= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/hack/swagger-codegen.sh b/hack/swagger-codegen.sh index 8b5dc9c3d2..9ba2cf6634 100755 --- a/hack/swagger-codegen.sh +++ b/hack/swagger-codegen.sh @@ -3,7 +3,7 @@ export SWAGGER_CODEGEN_VERSION=3.0.25 PROJECT_ROOT=$(cd $(dirname ${BASH_SOURCE})/..; pwd) -test -f "/tmp/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar" || \ - curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/${SWAGGER_CODEGEN_VERSION}/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar -o "/tmp/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar" +test -f "$PROJECT_ROOT/dist/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar" || \ + curl https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/${SWAGGER_CODEGEN_VERSION}/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar -o "$PROJECT_ROOT/dist/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar" -docker run --rm -v /tmp:/tmp -v $PROJECT_ROOT:/src -w /src/ui -t maven:3-jdk-8 java -jar /tmp/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar $@ \ No newline at end of file +docker run --rm -v $PROJECT_ROOT:/src -w /src/ui -t maven:3-jdk-8 java -jar /src/dist/swagger-codegen-cli-${SWAGGER_CODEGEN_VERSION}.jar $@ \ No newline at end of file diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 6b1294143f..088e99875d 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -20,7 +20,7 @@ cleanup() { trap "cleanup" EXIT SIGINT -chmod +x ${CODEGEN_PKG}/generate-groups.sh +chmod +x ${CODEGEN_PKG}/*.sh ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/argoproj/argo-rollouts/pkg/client github.com/argoproj/argo-rollouts/pkg/apis \ diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 4885ee8360..c0199f2de2 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -244,6 +244,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -251,6 +254,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -298,6 +304,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -469,6 +477,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -537,6 +555,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -603,6 +631,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -671,6 +709,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -850,6 +898,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -900,6 +956,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1096,6 +1160,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1115,6 +1192,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1467,6 +1546,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1517,6 +1604,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1713,6 +1808,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1732,6 +1840,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2091,6 +2201,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2141,6 +2259,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2337,6 +2463,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2356,6 +2495,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index d1b0cba2d1..aaf34277bd 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -240,6 +240,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -247,6 +250,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -294,6 +300,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -465,6 +473,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -533,6 +551,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -599,6 +627,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -667,6 +705,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -846,6 +894,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -896,6 +952,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1092,6 +1156,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1111,6 +1188,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1463,6 +1542,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1513,6 +1600,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1709,6 +1804,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1728,6 +1836,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2087,6 +2197,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2137,6 +2255,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2333,6 +2459,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2352,6 +2491,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index ba8af4b57a..ed75ada312 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -240,6 +240,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -247,6 +250,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -294,6 +300,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -465,6 +473,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -533,6 +551,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -599,6 +627,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -667,6 +705,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -846,6 +894,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -896,6 +952,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1092,6 +1156,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1111,6 +1188,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1463,6 +1542,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1513,6 +1600,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1709,6 +1804,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1728,6 +1836,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2087,6 +2197,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2137,6 +2255,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2333,6 +2459,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2352,6 +2491,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/manifests/crds/experiment-crd.yaml b/manifests/crds/experiment-crd.yaml index 486a608e8a..e4287b51e0 100644 --- a/manifests/crds/experiment-crd.yaml +++ b/manifests/crds/experiment-crd.yaml @@ -310,6 +310,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -378,6 +388,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -444,6 +464,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -512,6 +542,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -691,6 +731,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -741,6 +789,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -937,6 +993,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -956,6 +1025,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1308,6 +1379,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1358,6 +1437,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1554,6 +1641,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1573,6 +1673,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1932,6 +2034,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1982,6 +2092,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2178,6 +2296,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2197,6 +2328,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/manifests/crds/rollout-crd.yaml b/manifests/crds/rollout-crd.yaml index 9f17209eeb..cd244b8b98 100755 --- a/manifests/crds/rollout-crd.yaml +++ b/manifests/crds/rollout-crd.yaml @@ -1106,6 +1106,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -1174,6 +1184,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -1240,6 +1260,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -1308,6 +1338,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -1487,6 +1527,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1537,6 +1585,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1733,6 +1789,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1752,6 +1821,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2104,6 +2175,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2154,6 +2233,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2350,6 +2437,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2369,6 +2469,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2728,6 +2830,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2778,6 +2888,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2974,6 +3092,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2993,6 +3124,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/manifests/install.yaml b/manifests/install.yaml index 730864ee02..1b5013ef4a 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -245,6 +245,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -252,6 +255,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -299,6 +305,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -470,6 +478,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -538,6 +556,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -604,6 +632,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -672,6 +710,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -851,6 +899,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -901,6 +957,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1097,6 +1161,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1116,6 +1193,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -1468,6 +1547,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1518,6 +1605,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -1714,6 +1809,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -1733,6 +1841,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -2092,6 +2202,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2142,6 +2260,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -2338,6 +2464,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -2357,6 +2496,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -3394,6 +3535,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -3401,6 +3545,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -3448,6 +3595,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -3619,6 +3768,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -3687,6 +3846,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -3753,6 +3922,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -3821,6 +4000,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -4000,6 +4189,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -4050,6 +4247,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -4246,6 +4451,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -4265,6 +4483,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -4617,6 +4837,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -4667,6 +4895,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -4863,6 +5099,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -4882,6 +5131,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -5241,6 +5492,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -5291,6 +5550,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -5487,6 +5754,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -5506,6 +5786,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -6421,6 +6703,9 @@ spec: backoffLimit: format: int32 type: integer + backoffLimitPerIndex: + format: int32 + type: integer completionMode: type: string completions: @@ -6428,6 +6713,9 @@ spec: type: integer manualSelector: type: boolean + maxFailedIndexes: + format: int32 + type: integer parallelism: format: int32 type: integer @@ -6475,6 +6763,8 @@ spec: required: - rules type: object + podReplacementPolicy: + type: string selector: properties: matchExpressions: @@ -6646,6 +6936,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -6714,6 +7014,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -6780,6 +7090,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -6848,6 +7168,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -7027,6 +7357,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -7077,6 +7415,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -7273,6 +7619,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -7292,6 +7651,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -7644,6 +8005,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -7694,6 +8063,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -7890,6 +8267,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -7909,6 +8299,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -8268,6 +8660,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -8318,6 +8718,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -8514,6 +8922,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -8533,6 +8954,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -9518,6 +9941,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -9586,6 +10019,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -9652,6 +10095,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -9720,6 +10173,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -9899,6 +10362,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -9949,6 +10420,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -10145,6 +10624,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -10164,6 +10656,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -10516,6 +11010,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -10566,6 +11068,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -10762,6 +11272,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -10781,6 +11304,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -11140,6 +11665,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -11190,6 +11723,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -11386,6 +11927,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -11405,6 +11959,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -13040,6 +13596,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -13108,6 +13674,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -13174,6 +13750,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -13242,6 +13828,16 @@ spec: type: object type: object x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic namespaceSelector: properties: matchExpressions: @@ -13421,6 +14017,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -13471,6 +14075,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -13667,6 +14279,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -13686,6 +14311,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -14038,6 +14665,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -14088,6 +14723,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -14284,6 +14927,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -14303,6 +14959,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: @@ -14662,6 +15320,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -14712,6 +15378,14 @@ spec: required: - port type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object tcpSocket: properties: host: @@ -14908,6 +15582,19 @@ spec: format: int32 type: integer type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic resources: properties: claims: @@ -14927,6 +15614,8 @@ spec: requests: x-kubernetes-preserve-unknown-fields: true type: object + restartPolicy: + type: string securityContext: properties: allowPrivilegeEscalation: diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 2a2df62deb..b3c10e03f8 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -2794,7 +2794,7 @@ "completions": { "type": "integer", "format": "int32", - "title": "Specifies the desired number of successfully finished pods the\njob should be run with. Setting to nil means that the success of any\npod signals the success of all pods, and allows parallelism to have any positive\nvalue. Setting to 1 means that parallelism is limited to 1 and the success of that\npod signals the success of the job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" + "title": "Specifies the desired number of successfully finished pods the\njob should be run with. Setting to null means that the success of any\npod signals the success of all pods, and allows parallelism to have any positive\nvalue. Setting to 1 means that parallelism is limited to 1 and the success of that\npod signals the success of the job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/\n+optional" }, "activeDeadlineSeconds": { "type": "string", @@ -2810,6 +2810,16 @@ "format": "int32", "title": "Specifies the number of retries before marking this job failed.\nDefaults to 6\n+optional" }, + "backoffLimitPerIndex": { + "type": "integer", + "format": "int32", + "title": "Specifies the limit for the number of retries within an\nindex before marking this index as failed. When enabled the number of\nfailures per index is kept in the pod's\nbatch.kubernetes.io/job-index-failure-count annotation. It can only\nbe set when Job's completionMode=Indexed, and the Pod's restart\npolicy is Never. The field is immutable.\nThis field is beta-level. It can be used when the `JobBackoffLimitPerIndex`\nfeature gate is enabled (enabled by default).\n+optional" + }, + "maxFailedIndexes": { + "type": "integer", + "format": "int32", + "title": "Specifies the maximal number of failed indexes before marking the Job as\nfailed, when backoffLimitPerIndex is set. Once the number of failed\nindexes exceeds this number the entire Job is marked as Failed and its\nexecution is terminated. When left as null the job continues execution of\nall of its indexes and is marked with the `Complete` Job condition.\nIt can only be specified when backoffLimitPerIndex is set.\nIt can be null or up to completions. It is required and must be\nless than or equal to 10^4 when is completions greater than 10^5.\nThis field is beta-level. It can be used when the `JobBackoffLimitPerIndex`\nfeature gate is enabled (enabled by default).\n+optional" + }, "selector": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", "title": "A label query over pods that should match the pod count.\nNormally, the system sets this field for you.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors\n+optional" @@ -2820,7 +2830,7 @@ }, "template": { "$ref": "#/definitions/k8s.io.api.core.v1.PodTemplateSpec", - "title": "Describes the pod that will be created when executing a job.\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/" + "title": "Describes the pod that will be created when executing a job.\nThe only allowed template.spec.restartPolicy values are \"Never\" or \"OnFailure\".\nMore info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/" }, "ttlSecondsAfterFinished": { "type": "integer", @@ -2829,11 +2839,15 @@ }, "completionMode": { "type": "string", - "description": "CompletionMode specifies how Pod completions are tracked. It can be\n`NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have\nbeen .spec.completions successfully completed Pods. Each Pod completion is\nhomologous to each other.\n\n`Indexed` means that the Pods of a\nJob get an associated completion index from 0 to (.spec.completions - 1),\navailable in the annotation batch.kubernetes.io/job-completion-index.\nThe Job is considered complete when there is one successfully completed Pod\nfor each index.\nWhen value is `Indexed`, .spec.completions must be specified and\n`.spec.parallelism` must be less than or equal to 10^5.\nIn addition, The Pod name takes the form\n`$(job-name)-$(index)-$(random-string)`,\nthe Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future.\nIf the Job controller observes a mode that it doesn't recognize, which\nis possible during upgrades due to version skew, the controller\nskips updates for the Job.\n+optional" + "description": "completionMode specifies how Pod completions are tracked. It can be\n`NonIndexed` (default) or `Indexed`.\n\n`NonIndexed` means that the Job is considered complete when there have\nbeen .spec.completions successfully completed Pods. Each Pod completion is\nhomologous to each other.\n\n`Indexed` means that the Pods of a\nJob get an associated completion index from 0 to (.spec.completions - 1),\navailable in the annotation batch.kubernetes.io/job-completion-index.\nThe Job is considered complete when there is one successfully completed Pod\nfor each index.\nWhen value is `Indexed`, .spec.completions must be specified and\n`.spec.parallelism` must be less than or equal to 10^5.\nIn addition, The Pod name takes the form\n`$(job-name)-$(index)-$(random-string)`,\nthe Pod hostname takes the form `$(job-name)-$(index)`.\n\nMore completion modes can be added in the future.\nIf the Job controller observes a mode that it doesn't recognize, which\nis possible during upgrades due to version skew, the controller\nskips updates for the Job.\n+optional" }, "suspend": { "type": "boolean", - "description": "Suspend specifies whether the Job controller should create Pods or not. If\na Job is created with suspend set to true, no Pods are created by the Job\ncontroller. If a Job is suspended after creation (i.e. the flag goes from\nfalse to true), the Job controller will delete all active Pods associated\nwith this Job. Users must design their workload to gracefully handle this.\nSuspending a Job will reset the StartTime field of the Job, effectively\nresetting the ActiveDeadlineSeconds timer too. Defaults to false.\n\n+optional" + "description": "suspend specifies whether the Job controller should create Pods or not. If\na Job is created with suspend set to true, no Pods are created by the Job\ncontroller. If a Job is suspended after creation (i.e. the flag goes from\nfalse to true), the Job controller will delete all active Pods associated\nwith this Job. Users must design their workload to gracefully handle this.\nSuspending a Job will reset the StartTime field of the Job, effectively\nresetting the ActiveDeadlineSeconds timer too. Defaults to false.\n\n+optional" + }, + "podReplacementPolicy": { + "type": "string", + "description": "podReplacementPolicy specifies when to create replacement Pods.\nPossible values are:\n- TerminatingOrFailed means that we recreate pods\n when they are terminating (has a metadata.deletionTimestamp) or failed.\n- Failed means to wait until a previously created Pod is fully terminated (has phase\n Failed or Succeeded) before creating a replacement Pod.\n\nWhen using podFailurePolicy, Failed is the the only allowed value.\nTerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use.\nThis is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle.\nThis is on by default.\n+optional" } }, "description": "JobSpec describes how the job execution will look like." @@ -2860,7 +2874,8 @@ }, "operator": { "type": "string", - "description": "Represents the relationship between the container exit code(s) and the\nspecified values. Containers completed with success (exit code 0) are\nexcluded from the requirement check. Possible values are:\n- In: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is in the set of specified values.\n- NotIn: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is not in the set of specified values.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown operator by assuming the requirement is not satisfied." + "description": "- In: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is in the set of specified values.\n- NotIn: the requirement is satisfied if at least one container exit code\n (might be multiple if there are multiple containers not restricted\n by the 'containerName' field) is not in the set of specified values.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown operator by assuming the requirement is not satisfied.", + "title": "Represents the relationship between the container exit code(s) and the\nspecified values. Containers completed with success (exit code 0) are\nexcluded from the requirement check. Possible values are:" }, "values": { "type": "array", @@ -2892,7 +2907,8 @@ "properties": { "action": { "type": "string", - "description": "Specifies the action taken on a pod failure when the requirements are satisfied.\nPossible values are:\n- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown action by skipping the rule." + "description": "- FailJob: indicates that the pod's job is marked as Failed and all\n running pods are terminated.\n- FailIndex: indicates that the pod's index is marked as Failed and will\n not be restarted.\n This value is beta-level. It can be used when the\n `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default).\n- Ignore: indicates that the counter towards the .backoffLimit is not\n incremented and a replacement pod is created.\n- Count: indicates that the pod is handled in the default way - the\n counter towards the .backoffLimit is incremented.\nAdditional values are considered to be added in the future. Clients should\nreact to an unknown action by skipping the rule.", + "title": "Specifies the action taken on a pod failure when the requirements are satisfied.\nPossible values are:" }, "onExitCodes": { "$ref": "#/definitions/k8s.io.api.batch.v1.PodFailurePolicyOnExitCodesRequirement", @@ -2906,7 +2922,7 @@ "title": "Represents the requirement on the pod conditions. The requirement is represented\nas a list of pod condition patterns. The requirement is satisfied if at\nleast one pattern matches an actual pod condition. At most 20 elements are allowed.\n+listType=atomic\n+optional" } }, - "description": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met.\nOne of OnExitCodes and onPodConditions, but not both, can be used in each rule." + "description": "PodFailurePolicyRule describes how a pod failure is handled when the requirements are met.\nOne of onExitCodes and onPodConditions, but not both, can be used in each rule." }, "k8s.io.api.core.v1.AWSElasticBlockStoreVolumeSource": { "type": "object", @@ -3110,11 +3126,37 @@ }, "resourceClaimTemplateName": { "type": "string", - "description": "ResourceClaimTemplateName is the name of a ResourceClaimTemplate\nobject in the same namespace as this pod.\n\nThe template will be used to create a new ResourceClaim, which will\nbe bound to this pod. When this pod is deleted, the ResourceClaim\nwill also be deleted. The name of the ResourceClaim will be \u003cpod\nname\u003e-\u003cresource name\u003e, where \u003cresource name\u003e is the\nPodResourceClaim.Name. Pod validation will reject the pod if the\nconcatenated name is not valid for a ResourceClaim (e.g. too long).\n\nAn existing ResourceClaim with that name that is not owned by the\npod will not be used for the pod to avoid using an unrelated\nresource by mistake. Scheduling and pod startup are then blocked\nuntil the unrelated ResourceClaim is removed.\n\nThis field is immutable and no changes will be made to the\ncorresponding ResourceClaim by the control plane after creating the\nResourceClaim." + "description": "ResourceClaimTemplateName is the name of a ResourceClaimTemplate\nobject in the same namespace as this pod.\n\nThe template will be used to create a new ResourceClaim, which will\nbe bound to this pod. When this pod is deleted, the ResourceClaim\nwill also be deleted. The pod name and resource name, along with a\ngenerated component, will be used to form a unique name for the\nResourceClaim, which will be recorded in pod.status.resourceClaimStatuses.\n\nThis field is immutable and no changes will be made to the\ncorresponding ResourceClaim by the control plane after creating the\nResourceClaim." } }, "description": "ClaimSource describes a reference to a ResourceClaim.\n\nExactly one of these fields should be set. Consumers of this type must\ntreat an empty object as if it has an unknown value." }, + "k8s.io.api.core.v1.ClusterTrustBundleProjection": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "Select a single ClusterTrustBundle by object name. Mutually-exclusive\nwith signerName and labelSelector.\n+optional" + }, + "signerName": { + "type": "string", + "title": "Select all ClusterTrustBundles that match this signer name.\nMutually-exclusive with name. The contents of all selected\nClusterTrustBundles will be unified and deduplicated.\n+optional" + }, + "labelSelector": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", + "title": "Select all ClusterTrustBundles that match this label selector. Only has\neffect if signerName is set. Mutually-exclusive with name. If unset,\ninterpreted as \"match nothing\". If set but empty, interpreted as \"match\neverything\".\n+optional" + }, + "optional": { + "type": "boolean", + "title": "If true, don't block pod startup if the referenced ClusterTrustBundle(s)\naren't available. If using name, then the named ClusterTrustBundle is\nallowed not to exist. If using signerName, then the combination of\nsignerName and labelSelector is allowed to match zero\nClusterTrustBundles.\n+optional" + }, + "path": { + "type": "string", + "description": "Relative path from the volume root to write the bundle." + } + }, + "description": "ClusterTrustBundleProjection describes how to select a set of\nClusterTrustBundle objects and project their contents into the pod\nfilesystem." + }, "k8s.io.api.core.v1.ConfigMapEnvSource": { "type": "object", "properties": { @@ -3246,6 +3288,17 @@ "$ref": "#/definitions/k8s.io.api.core.v1.ResourceRequirements", "title": "Compute Resources required by this container.\nCannot be updated.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" }, + "resizePolicy": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.core.v1.ContainerResizePolicy" + }, + "title": "Resources resize policy for the container.\n+featureGate=InPlacePodVerticalScaling\n+optional\n+listType=atomic" + }, + "restartPolicy": { + "type": "string", + "title": "RestartPolicy defines the restart behavior of individual containers in a pod.\nThis field may only be set for init containers, and the only allowed value is \"Always\".\nFor non-init containers or when this field is not specified,\nthe restart behavior is defined by the Pod's restart policy and the container type.\nSetting the RestartPolicy as \"Always\" for the init container will have the following effect:\nthis init container will be continually restarted on\nexit until all regular containers have terminated. Once all regular\ncontainers have completed, all init containers with restartPolicy \"Always\"\nwill be shut down. This lifecycle differs from normal init containers and\nis often referred to as a \"sidecar\" container. Although this init\ncontainer still starts in the init container sequence, it does not wait\nfor the container to complete before proceeding to the next init\ncontainer. Instead, the next init container starts immediately after this\ninit container is started, or after any startupProbe has successfully\ncompleted.\n+featureGate=SidecarContainers\n+optional" + }, "volumeMounts": { "type": "array", "items": { @@ -3335,6 +3388,20 @@ }, "description": "ContainerPort represents a network port in a single container." }, + "k8s.io.api.core.v1.ContainerResizePolicy": { + "type": "object", + "properties": { + "resourceName": { + "type": "string", + "description": "Name of the resource to which this resource resize policy applies.\nSupported values: cpu, memory." + }, + "restartPolicy": { + "type": "string", + "description": "Restart policy to apply when specified resource is resized.\nIf not specified, it defaults to NotRequired." + } + }, + "description": "ContainerResizePolicy represents resource resize policy for the container." + }, "k8s.io.api.core.v1.DownwardAPIProjection": { "type": "object", "properties": { @@ -3398,7 +3465,7 @@ }, "sizeLimit": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.api.resource.Quantity", - "title": "sizeLimit is the total amount of local storage required for this EmptyDir volume.\nThe size limit is also applicable for memory medium.\nThe maximum usage on memory medium EmptyDir would be the minimum value between\nthe SizeLimit specified here and the sum of memory limits of all containers in a pod.\nThe default is nil which means that the limit is undefined.\nMore info: http://kubernetes.io/docs/user-guide/volumes#emptydir\n+optional" + "title": "sizeLimit is the total amount of local storage required for this EmptyDir volume.\nThe size limit is also applicable for memory medium.\nThe maximum usage on memory medium EmptyDir would be the minimum value between\nthe SizeLimit specified here and the sum of memory limits of all containers in a pod.\nThe default is nil which means that the limit is undefined.\nMore info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir\n+optional" } }, "description": "Represents an empty directory for a pod.\nEmpty directory volumes support ownership management and SELinux relabeling." @@ -3529,6 +3596,17 @@ "$ref": "#/definitions/k8s.io.api.core.v1.ResourceRequirements", "title": "Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources\nalready allocated to the pod.\n+optional" }, + "resizePolicy": { + "type": "array", + "items": { + "$ref": "#/definitions/k8s.io.api.core.v1.ContainerResizePolicy" + }, + "title": "Resources resize policy for the container.\n+featureGate=InPlacePodVerticalScaling\n+optional\n+listType=atomic" + }, + "restartPolicy": { + "type": "string", + "title": "Restart policy for the container to manage the restart behavior of each\ncontainer within a pod.\nThis may only be set for init containers. You cannot set this field on\nephemeral containers.\n+featureGate=SidecarContainers\n+optional" + }, "volumeMounts": { "type": "array", "items": { @@ -3937,6 +4015,10 @@ "tcpSocket": { "$ref": "#/definitions/k8s.io.api.core.v1.TCPSocketAction", "title": "Deprecated. TCPSocket is NOT supported as a LifecycleHandler and kept\nfor the backward compatibility. There are no validation of this field and\nlifecycle hooks will fail in runtime when tcp handler is specified.\n+optional" + }, + "sleep": { + "$ref": "#/definitions/k8s.io.api.core.v1.SleepAction", + "title": "Sleep represents the duration that the container should sleep before being terminated.\n+featureGate=PodLifecycleSleepAction\n+optional" } }, "description": "LifecycleHandler defines a specific action that should be taken in a lifecycle\nhook. One and only one of the fields, except TCPSocket must be specified." @@ -4069,7 +4151,7 @@ "title": "selector is a label query over volumes to consider for binding.\n+optional" }, "resources": { - "$ref": "#/definitions/k8s.io.api.core.v1.ResourceRequirements", + "$ref": "#/definitions/k8s.io.api.core.v1.VolumeResourceRequirements", "title": "resources represents the minimum resources the volume should have.\nIf RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements\nthat are lower than previous value but must still be higher than capacity recorded in the\nstatus field of the claim.\nMore info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources\n+optional" }, "volumeName": { @@ -4091,6 +4173,10 @@ "dataSourceRef": { "$ref": "#/definitions/k8s.io.api.core.v1.TypedObjectReference", "title": "dataSourceRef specifies the object from which to populate the volume with data, if a non-empty\nvolume is desired. This may be any object from a non-empty API group (non\ncore object) or a PersistentVolumeClaim object.\nWhen this field is specified, volume binding will only succeed if the type of\nthe specified object matches some installed volume populator or dynamic\nprovisioner.\nThis field will replace the functionality of the dataSource field and as such\nif both fields are non-empty, they must have the same value. For backwards\ncompatibility, when namespace isn't specified in dataSourceRef,\nboth fields (dataSource and dataSourceRef) will be set to the same\nvalue automatically if one of them is empty and the other is non-empty.\nWhen namespace is specified in dataSourceRef,\ndataSource isn't set to the same value and must be empty.\nThere are three important differences between dataSource and dataSourceRef:\n* While dataSource only allows two specific types of objects, dataSourceRef\n allows any non-core object, as well as PersistentVolumeClaim objects.\n* While dataSource ignores disallowed values (dropping them), dataSourceRef\n preserves all values, and generates an error if a disallowed value is\n specified.\n* While dataSource only allows local objects, dataSourceRef allows objects\n in any namespaces.\n(Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.\n(Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.\n+optional" + }, + "volumeAttributesClassName": { + "type": "string", + "title": "volumeAttributesClassName may be used to set the VolumeAttributesClass used by this claim.\nIf specified, the CSI driver will create or update the volume with the attributes defined\nin the corresponding VolumeAttributesClass. This has a different purpose than storageClassName,\nit can be changed after the claim is created. An empty string value means that no VolumeAttributesClass\nwill be applied to the claim but it's not allowed to reset this field to empty string once it is set.\nIf unspecified and the PersistentVolumeClaim is unbound, the default VolumeAttributesClass\nwill be set by the persistentvolume controller if it exists.\nIf the resource referred to by volumeAttributesClass does not exist, this PersistentVolumeClaim will be\nset to a Pending state, as reflected by the modifyVolumeStatus field, until such as a resource\nexists.\nMore info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#volumeattributesclass\n(Alpha) Using this field requires the VolumeAttributesClass feature gate to be enabled.\n+featureGate=VolumeAttributesClass\n+optional" } }, "title": "PersistentVolumeClaimSpec describes the common attributes of storage devices\nand allows a Source for provider-specific attributes" @@ -4162,7 +4248,7 @@ "properties": { "labelSelector": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", - "title": "A label query over a set of resources, in this case pods.\n+optional" + "title": "A label query over a set of resources, in this case pods.\nIf it's null, this PodAffinityTerm matches with no Pods.\n+optional" }, "namespaces": { "type": "array", @@ -4178,6 +4264,20 @@ "namespaceSelector": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector", "title": "A label query over the set of namespaces that the term applies to.\nThe term is applied to the union of the namespaces selected by this field\nand the ones listed in the namespaces field.\nnull selector and null or empty namespaces list means \"this pod's namespace\".\nAn empty selector ({}) matches all namespaces.\n+optional" + }, + "matchLabelKeys": { + "type": "array", + "items": { + "type": "string" + }, + "title": "MatchLabelKeys is a set of pod label keys to select which pods will\nbe taken into consideration. The keys are used to lookup values from the\nincoming pod labels, those key-value labels are merged with `LabelSelector` as `key in (value)`\nto select the group of existing pods which pods will be taken into consideration\nfor the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\npod labels will be ignored. The default value is empty.\nThe same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\nAlso, MatchLabelKeys cannot be set when LabelSelector isn't set.\nThis is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n+listType=atomic\n+optional" + }, + "mismatchLabelKeys": { + "type": "array", + "items": { + "type": "string" + }, + "title": "MismatchLabelKeys is a set of pod label keys to select which pods will\nbe taken into consideration. The keys are used to lookup values from the\nincoming pod labels, those key-value labels are merged with `LabelSelector` as `key notin (value)`\nto select the group of existing pods which pods will be taken into consideration\nfor the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming\npod labels will be ignored. The default value is empty.\nThe same key is forbidden to exist in both MismatchLabelKeys and LabelSelector.\nAlso, MismatchLabelKeys cannot be set when LabelSelector isn't set.\nThis is an alpha field and requires enabling MatchLabelKeysInPodAffinity feature gate.\n+listType=atomic\n+optional" } }, "title": "Defines a set of pods (namely those matching the labelSelector\nrelative to the given namespace(s)) that this pod should be\nco-located (affinity) or not co-located (anti-affinity) with,\nwhere co-located is defined as running on a node whose value of\nthe label with key \u003ctopologyKey\u003e matches that of any node on which\na pod of the set of pods is running" @@ -4377,7 +4477,7 @@ }, "restartPolicy": { "type": "string", - "title": "Restart policy for all containers within the pod.\nOne of Always, OnFailure, Never.\nDefault to Always.\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n+optional" + "title": "Restart policy for all containers within the pod.\nOne of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted.\nDefault to Always.\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy\n+optional" }, "terminationGracePeriodSeconds": { "type": "string", @@ -4536,7 +4636,7 @@ "items": { "$ref": "#/definitions/k8s.io.api.core.v1.PodSchedulingGate" }, - "description": "SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\nMore info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness.\n\nThis is an alpha-level feature enabled by PodSchedulingReadiness feature gate.\n+optional\n+patchMergeKey=name\n+patchStrategy=merge\n+listType=map\n+listMapKey=name" + "description": "SchedulingGates is an opaque list of values that if specified will block scheduling the pod.\nIf schedulingGates is not empty, the pod will stay in the SchedulingGated state and the\nscheduler will not attempt to schedule the pod.\n\nSchedulingGates can only be set at pod creation time, and be removed only afterwards.\n\nThis is a beta feature enabled by the PodSchedulingReadiness feature gate.\n\n+patchMergeKey=name\n+patchStrategy=merge\n+listType=map\n+listMapKey=name\n+featureGate=PodSchedulingReadiness\n+optional" }, "resourceClaims": { "type": "array", @@ -4652,7 +4752,7 @@ }, "grpc": { "$ref": "#/definitions/k8s.io.api.core.v1.GRPCAction", - "title": "GRPC specifies an action involving a GRPC port.\nThis is a beta field and requires enabling GRPCContainerProbe feature gate.\n+featureGate=GRPCContainerProbe\n+optional" + "title": "GRPC specifies an action involving a GRPC port.\n+optional" } }, "description": "ProbeHandler defines a specific action that should be taken in a probe.\nOne and only one of the fields must be specified." @@ -4789,7 +4889,7 @@ "additionalProperties": { "$ref": "#/definitions/k8s.io.apimachinery.pkg.api.resource.Quantity" }, - "title": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" + "title": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" }, "claims": { "type": "array", @@ -4879,7 +4979,7 @@ }, "localhostProfile": { "type": "string", - "title": "localhostProfile indicates a profile defined in a file on the node should be used.\nThe profile must be preconfigured on the node to work.\nMust be a descending path, relative to the kubelet's configured seccomp profile location.\nMust only be set if type is \"Localhost\".\n+optional" + "title": "localhostProfile indicates a profile defined in a file on the node should be used.\nThe profile must be preconfigured on the node to work.\nMust be a descending path, relative to the kubelet's configured seccomp profile location.\nMust be set if type is \"Localhost\". Must NOT be set for any other type.\n+optional" } }, "title": "SeccompProfile defines a pod/container's seccomp profile settings.\nOnly one profile source may be set.\n+union" @@ -5033,6 +5133,17 @@ }, "description": "ServiceAccountTokenProjection represents a projected service account token\nvolume. This projection can be used to insert a service account token into\nthe pods runtime filesystem for use against APIs (Kubernetes API Server or\notherwise)." }, + "k8s.io.api.core.v1.SleepAction": { + "type": "object", + "properties": { + "seconds": { + "type": "string", + "format": "int64", + "description": "Seconds is the number of seconds to sleep." + } + }, + "description": "SleepAction describes a \"sleep\" action." + }, "k8s.io.api.core.v1.StorageOSVolumeSource": { "type": "object", "properties": { @@ -5152,7 +5263,7 @@ "items": { "type": "string" }, - "title": "MatchLabelKeys is a set of pod label keys to select the pods over which\nspreading will be calculated. The keys are used to lookup values from the\nincoming pod labels, those key-value labels are ANDed with labelSelector\nto select the group of existing pods over which spreading will be calculated\nfor the incoming pod. Keys that don't exist in the incoming pod labels will\nbe ignored. A null or empty list means only match against labelSelector.\n+listType=atomic\n+optional" + "description": "MatchLabelKeys is a set of pod label keys to select the pods over which\nspreading will be calculated. The keys are used to lookup values from the\nincoming pod labels, those key-value labels are ANDed with labelSelector\nto select the group of existing pods over which spreading will be calculated\nfor the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector.\nMatchLabelKeys cannot be set when LabelSelector isn't set.\nKeys that don't exist in the incoming pod labels will\nbe ignored. A null or empty list means only match against labelSelector.\n\nThis is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default).\n+listType=atomic\n+optional" } }, "description": "TopologySpreadConstraint specifies how to spread matching pods among the given topology." @@ -5272,10 +5383,34 @@ "serviceAccountToken": { "$ref": "#/definitions/k8s.io.api.core.v1.ServiceAccountTokenProjection", "title": "serviceAccountToken is information about the serviceAccountToken data to project\n+optional" + }, + "clusterTrustBundle": { + "$ref": "#/definitions/k8s.io.api.core.v1.ClusterTrustBundleProjection", + "description": "ClusterTrustBundle allows a pod to access the `.spec.trustBundle` field\nof ClusterTrustBundle objects in an auto-updating file.\n\nAlpha, gated by the ClusterTrustBundleProjection feature gate.\n\nClusterTrustBundle objects can either be selected by name, or by the\ncombination of signer name and a label selector.\n\nKubelet performs aggressive normalization of the PEM contents written\ninto the pod filesystem. Esoteric PEM features such as inter-block\ncomments and block headers are stripped. Certificates are deduplicated.\nThe ordering of certificates within the file is arbitrary, and Kubelet\nmay change the order over time.\n\n+featureGate=ClusterTrustBundleProjection\n+optional" } }, "title": "Projection that may be projected along with other supported volume types" }, + "k8s.io.api.core.v1.VolumeResourceRequirements": { + "type": "object", + "properties": { + "limits": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.api.resource.Quantity" + }, + "title": "Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" + }, + "requests": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/k8s.io.apimachinery.pkg.api.resource.Quantity" + }, + "title": "Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n+optional" + } + }, + "description": "VolumeResourceRequirements describes the storage resource requirements for a volume." + }, "k8s.io.api.core.v1.VolumeSource": { "type": "object", "properties": { @@ -5452,7 +5587,7 @@ }, "hostProcess": { "type": "boolean", - "title": "HostProcess determines if a container should be run as a 'Host Process' container.\nThis field is alpha-level and will only be honored by components that enable the\nWindowsHostProcessContainers feature flag. Setting this field without the feature\nflag will result in errors when validating the Pod. All of a Pod's containers must\nhave the same effective HostProcess value (it is not allowed to have a mix of HostProcess\ncontainers and non-HostProcess containers). In addition, if HostProcess is true\nthen HostNetwork must also be set to true.\n+optional" + "title": "HostProcess determines if a container should be run as a 'Host Process' container.\nAll of a Pod's containers must have the same effective HostProcess value\n(it is not allowed to have a mix of HostProcess containers and non-HostProcess containers).\nIn addition, if HostProcess is true then HostNetwork must also be set to true.\n+optional" } }, "description": "WindowsSecurityContextOptions contain Windows-specific options and credentials." @@ -5502,7 +5637,7 @@ "properties": { "key": { "type": "string", - "title": "key is the label key that the selector applies to.\n+patchMergeKey=key\n+patchStrategy=merge" + "description": "key is the label key that the selector applies to." }, "operator": { "type": "string", @@ -5557,7 +5692,7 @@ "properties": { "name": { "type": "string", - "title": "Name must be unique within a namespace. Is required when creating resources, although\nsome resources may allow a client to request the generation of an appropriate name\nautomatically. Name is primarily intended for creation idempotence and configuration\ndefinition.\nCannot be updated.\nMore info: http://kubernetes.io/docs/user-guide/identifiers#names\n+optional" + "title": "Name must be unique within a namespace. Is required when creating resources, although\nsome resources may allow a client to request the generation of an appropriate name\nautomatically. Name is primarily intended for creation idempotence and configuration\ndefinition.\nCannot be updated.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names\n+optional" }, "generateName": { "type": "string", @@ -5565,7 +5700,7 @@ }, "namespace": { "type": "string", - "description": "Namespace defines the space within which each name must be unique. An empty namespace is\nequivalent to the \"default\" namespace, but \"default\" is the canonical representation.\nNot all objects are required to be scoped to a namespace - the value of this field for\nthose objects will be empty.\n\nMust be a DNS_LABEL.\nCannot be updated.\nMore info: http://kubernetes.io/docs/user-guide/namespaces\n+optional" + "description": "Namespace defines the space within which each name must be unique. An empty namespace is\nequivalent to the \"default\" namespace, but \"default\" is the canonical representation.\nNot all objects are required to be scoped to a namespace - the value of this field for\nthose objects will be empty.\n\nMust be a DNS_LABEL.\nCannot be updated.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces\n+optional" }, "selfLink": { "type": "string", @@ -5573,7 +5708,7 @@ }, "uid": { "type": "string", - "description": "UID is the unique in time and space value for this object. It is typically generated by\nthe server on successful creation of a resource and is not allowed to change on PUT\noperations.\n\nPopulated by the system.\nRead-only.\nMore info: http://kubernetes.io/docs/user-guide/identifiers#uids\n+optional" + "description": "UID is the unique in time and space value for this object. It is typically generated by\nthe server on successful creation of a resource and is not allowed to change on PUT\noperations.\n\nPopulated by the system.\nRead-only.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids\n+optional" }, "resourceVersion": { "type": "string", @@ -5602,14 +5737,14 @@ "additionalProperties": { "type": "string" }, - "title": "Map of string keys and values that can be used to organize and categorize\n(scope and select) objects. May match selectors of replication controllers\nand services.\nMore info: http://kubernetes.io/docs/user-guide/labels\n+optional" + "title": "Map of string keys and values that can be used to organize and categorize\n(scope and select) objects. May match selectors of replication controllers\nand services.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels\n+optional" }, "annotations": { "type": "object", "additionalProperties": { "type": "string" }, - "title": "Annotations is an unstructured key value map stored with a resource that may be\nset by external tools to store and retrieve arbitrary metadata. They are not\nqueryable and should be preserved when modifying objects.\nMore info: http://kubernetes.io/docs/user-guide/annotations\n+optional" + "title": "Annotations is an unstructured key value map stored with a resource that may be\nset by external tools to store and retrieve arbitrary metadata. They are not\nqueryable and should be preserved when modifying objects.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations\n+optional" }, "ownerReferences": { "type": "array", @@ -5648,11 +5783,11 @@ }, "name": { "type": "string", - "title": "Name of the referent.\nMore info: http://kubernetes.io/docs/user-guide/identifiers#names" + "title": "Name of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names" }, "uid": { "type": "string", - "title": "UID of the referent.\nMore info: http://kubernetes.io/docs/user-guide/identifiers#uids" + "title": "UID of the referent.\nMore info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids" }, "controller": { "type": "boolean", diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index f486b7eb77..2d4d68ff1e 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -1707,8 +1707,7 @@ func schema_pkg_apis_rollouts_v1alpha1_CloudWatchMetricStat(ref common.Reference }, "period": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), + Ref: ref("k8s.io/apimachinery/pkg/util/intstr.IntOrString"), }, }, "stat": { @@ -2152,14 +2151,12 @@ func schema_pkg_apis_rollouts_v1alpha1_ExperimentCondition(ref common.ReferenceC "lastUpdateTime": { SchemaProps: spec.SchemaProps{ Description: "The last time this condition was updated.", - Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, "lastTransitionTime": { SchemaProps: spec.SchemaProps{ Description: "Last time the condition transitioned from one status to another.", - Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, @@ -3470,8 +3467,7 @@ func schema_pkg_apis_rollouts_v1alpha1_PauseCondition(ref common.ReferenceCallba }, "startTime": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, }, @@ -3997,14 +3993,12 @@ func schema_pkg_apis_rollouts_v1alpha1_RolloutCondition(ref common.ReferenceCall "lastUpdateTime": { SchemaProps: spec.SchemaProps{ Description: "The last time this condition was updated.", - Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, "lastTransitionTime": { SchemaProps: spec.SchemaProps{ Description: "Last time the condition transitioned from one status to another.", - Default: map[string]interface{}{}, Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), }, }, diff --git a/pkg/apis/rollouts/validation/validation.go b/pkg/apis/rollouts/validation/validation.go index 9bb3f24af6..8eb7cdac19 100644 --- a/pkg/apis/rollouts/validation/validation.go +++ b/pkg/apis/rollouts/validation/validation.go @@ -94,10 +94,8 @@ const ( // NOTE: this variable may need to be updated whenever we update our k8s libraries as new options // are introduced or removed. var allowAllPodValidationOptions = apivalidation.PodValidationOptions{ - AllowDownwardAPIHugePages: true, AllowInvalidPodDeletionCost: true, AllowIndivisibleHugePagesValues: true, - AllowExpandedDNSConfig: true, } func ValidateRollout(rollout *v1alpha1.Rollout) field.ErrorList { @@ -163,7 +161,7 @@ func ValidateRolloutSpec(rollout *v1alpha1.Rollout, fldPath *field.Path) field.E // Skip validating empty template for rollout resolved from ref if rollout.Spec.TemplateResolvedFromRef || spec.WorkloadRef == nil { - allErrs = append(allErrs, validation.ValidatePodTemplateSpecForReplicaSet(&template, selector, replicas, fldPath.Child("template"), allowAllPodValidationOptions)...) + allErrs = append(allErrs, validation.ValidatePodTemplateSpecForReplicaSet(&template, nil, selector, replicas, fldPath.Child("template"), allowAllPodValidationOptions)...) } } allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) diff --git a/pkg/client/clientset/versioned/doc.go b/pkg/client/clientset/versioned/doc.go deleted file mode 100644 index 41721ca52d..0000000000 --- a/pkg/client/clientset/versioned/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -// This package has the automatically generated clientset. -package versioned diff --git a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysisrun.go b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysisrun.go index 89de9c005c..710496ab7c 100644 --- a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysisrun.go +++ b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysisrun.go @@ -24,7 +24,6 @@ import ( v1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" @@ -36,9 +35,9 @@ type FakeAnalysisRuns struct { ns string } -var analysisrunsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "analysisruns"} +var analysisrunsResource = v1alpha1.SchemeGroupVersion.WithResource("analysisruns") -var analysisrunsKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "AnalysisRun"} +var analysisrunsKind = v1alpha1.SchemeGroupVersion.WithKind("AnalysisRun") // Get takes name of the analysisRun, and returns the corresponding analysisRun object, and an error if there is any. func (c *FakeAnalysisRuns) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AnalysisRun, err error) { diff --git a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysistemplate.go b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysistemplate.go index 2cbb02d515..05d0d6c83a 100644 --- a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysistemplate.go +++ b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_analysistemplate.go @@ -24,7 +24,6 @@ import ( v1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" @@ -36,9 +35,9 @@ type FakeAnalysisTemplates struct { ns string } -var analysistemplatesResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "analysistemplates"} +var analysistemplatesResource = v1alpha1.SchemeGroupVersion.WithResource("analysistemplates") -var analysistemplatesKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "AnalysisTemplate"} +var analysistemplatesKind = v1alpha1.SchemeGroupVersion.WithKind("AnalysisTemplate") // Get takes name of the analysisTemplate, and returns the corresponding analysisTemplate object, and an error if there is any. func (c *FakeAnalysisTemplates) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AnalysisTemplate, err error) { diff --git a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_clusteranalysistemplate.go b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_clusteranalysistemplate.go index 36389661de..cfa35d16c3 100644 --- a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_clusteranalysistemplate.go +++ b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_clusteranalysistemplate.go @@ -24,7 +24,6 @@ import ( v1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" @@ -35,9 +34,9 @@ type FakeClusterAnalysisTemplates struct { Fake *FakeArgoprojV1alpha1 } -var clusteranalysistemplatesResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "clusteranalysistemplates"} +var clusteranalysistemplatesResource = v1alpha1.SchemeGroupVersion.WithResource("clusteranalysistemplates") -var clusteranalysistemplatesKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "ClusterAnalysisTemplate"} +var clusteranalysistemplatesKind = v1alpha1.SchemeGroupVersion.WithKind("ClusterAnalysisTemplate") // Get takes name of the clusterAnalysisTemplate, and returns the corresponding clusterAnalysisTemplate object, and an error if there is any. func (c *FakeClusterAnalysisTemplates) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.ClusterAnalysisTemplate, err error) { diff --git a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_experiment.go b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_experiment.go index f237ce32d1..d2c72a9480 100644 --- a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_experiment.go +++ b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_experiment.go @@ -24,7 +24,6 @@ import ( v1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" @@ -36,9 +35,9 @@ type FakeExperiments struct { ns string } -var experimentsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "experiments"} +var experimentsResource = v1alpha1.SchemeGroupVersion.WithResource("experiments") -var experimentsKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "Experiment"} +var experimentsKind = v1alpha1.SchemeGroupVersion.WithKind("Experiment") // Get takes name of the experiment, and returns the corresponding experiment object, and an error if there is any. func (c *FakeExperiments) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.Experiment, err error) { diff --git a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollout.go b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollout.go index fce5e8d66e..f2eb37d613 100644 --- a/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollout.go +++ b/pkg/client/clientset/versioned/typed/rollouts/v1alpha1/fake/fake_rollout.go @@ -24,7 +24,6 @@ import ( v1alpha1 "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" labels "k8s.io/apimachinery/pkg/labels" - schema "k8s.io/apimachinery/pkg/runtime/schema" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" testing "k8s.io/client-go/testing" @@ -36,9 +35,9 @@ type FakeRollouts struct { ns string } -var rolloutsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "rollouts"} +var rolloutsResource = v1alpha1.SchemeGroupVersion.WithResource("rollouts") -var rolloutsKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "Rollout"} +var rolloutsKind = v1alpha1.SchemeGroupVersion.WithKind("Rollout") // Get takes name of the rollout, and returns the corresponding rollout object, and an error if there is any. func (c *FakeRollouts) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.Rollout, err error) { diff --git a/pkg/client/informers/externalversions/factory.go b/pkg/client/informers/externalversions/factory.go index 1e6b2cef58..3a643461c3 100644 --- a/pkg/client/informers/externalversions/factory.go +++ b/pkg/client/informers/externalversions/factory.go @@ -42,6 +42,7 @@ type sharedInformerFactory struct { lock sync.Mutex defaultResync time.Duration customResync map[reflect.Type]time.Duration + transform cache.TransformFunc informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -80,6 +81,14 @@ func WithNamespace(namespace string) SharedInformerOption { } } +// WithTransform sets a transform on all informers. +func WithTransform(transform cache.TransformFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.transform = transform + return factory + } +} + // NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { return NewSharedInformerFactoryWithOptions(client, defaultResync) @@ -166,7 +175,7 @@ func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[ref return res } -// InternalInformerFor returns the SharedIndexInformer for obj using an internal +// InformerFor returns the SharedIndexInformer for obj using an internal // client. func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer { f.lock.Lock() @@ -184,6 +193,7 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal } informer = newFunc(f.client, resyncPeriod) + informer.SetTransform(f.transform) f.informers[informerType] = informer return informer @@ -239,7 +249,7 @@ type SharedInformerFactory interface { // ForResource gives generic access to a shared informer of the matching type. ForResource(resource schema.GroupVersionResource) (GenericInformer, error) - // InternalInformerFor returns the SharedIndexInformer for obj using an internal + // InformerFor returns the SharedIndexInformer for obj using an internal // client. InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index f3724ca95b..930c7d0c61 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -228,11 +228,11 @@ spec: ApplyManifests(). WaitForRolloutStatus("Healthy"). UpdateSpec(). - Sleep(time.Second). + Sleep(3 * time.Second). PromoteRolloutFull(). WaitForRolloutStatus("Healthy"). Then(). - ExpectAnalysisRunCount(0) + ExpectAnalysisRunCount(1) } func (s *FunctionalSuite) TestRolloutRestart() { diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 1927cd61a6..114f705aee 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -3182,6 +3182,18 @@ export interface K8sIoApiBatchV1JobSpec { * @memberof K8sIoApiBatchV1JobSpec */ backoffLimit?: number; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + backoffLimitPerIndex?: number; + /** + * + * @type {number} + * @memberof K8sIoApiBatchV1JobSpec + */ + maxFailedIndexes?: number; /** * * @type {K8sIoApimachineryPkgApisMetaV1LabelSelector} @@ -3207,17 +3219,23 @@ export interface K8sIoApiBatchV1JobSpec { */ ttlSecondsAfterFinished?: number; /** - * CompletionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. `NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. `Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job. +optional + * completionMode specifies how Pod completions are tracked. It can be `NonIndexed` (default) or `Indexed`. `NonIndexed` means that the Job is considered complete when there have been .spec.completions successfully completed Pods. Each Pod completion is homologous to each other. `Indexed` means that the Pods of a Job get an associated completion index from 0 to (.spec.completions - 1), available in the annotation batch.kubernetes.io/job-completion-index. The Job is considered complete when there is one successfully completed Pod for each index. When value is `Indexed`, .spec.completions must be specified and `.spec.parallelism` must be less than or equal to 10^5. In addition, The Pod name takes the form `$(job-name)-$(index)-$(random-string)`, the Pod hostname takes the form `$(job-name)-$(index)`. More completion modes can be added in the future. If the Job controller observes a mode that it doesn't recognize, which is possible during upgrades due to version skew, the controller skips updates for the Job. +optional * @type {string} * @memberof K8sIoApiBatchV1JobSpec */ completionMode?: string; /** - * Suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false. +optional + * suspend specifies whether the Job controller should create Pods or not. If a Job is created with suspend set to true, no Pods are created by the Job controller. If a Job is suspended after creation (i.e. the flag goes from false to true), the Job controller will delete all active Pods associated with this Job. Users must design their workload to gracefully handle this. Suspending a Job will reset the StartTime field of the Job, effectively resetting the ActiveDeadlineSeconds timer too. Defaults to false. +optional * @type {boolean} * @memberof K8sIoApiBatchV1JobSpec */ suspend?: boolean; + /** + * podReplacementPolicy specifies when to create replacement Pods. Possible values are: - TerminatingOrFailed means that we recreate pods when they are terminating (has a metadata.deletionTimestamp) or failed. - Failed means to wait until a previously created Pod is fully terminated (has phase Failed or Succeeded) before creating a replacement Pod. When using podFailurePolicy, Failed is the the only allowed value. TerminatingOrFailed and Failed are allowed values when podFailurePolicy is not in use. This is an beta field. To use this, enable the JobPodReplacementPolicy feature toggle. This is on by default. +optional + * @type {string} + * @memberof K8sIoApiBatchV1JobSpec + */ + podReplacementPolicy?: string; } /** * PodFailurePolicy describes how failed pods influence the backoffLimit. @@ -3245,7 +3263,7 @@ export interface K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement { */ containerName?: string; /** - * Represents the relationship between the container exit code(s) and the specified values. Containers completed with success (exit code 0) are excluded from the requirement check. Possible values are: - In: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is in the set of specified values. - NotIn: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is not in the set of specified values. Additional values are considered to be added in the future. Clients should react to an unknown operator by assuming the requirement is not satisfied. + * - In: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is in the set of specified values. - NotIn: the requirement is satisfied if at least one container exit code (might be multiple if there are multiple containers not restricted by the 'containerName' field) is not in the set of specified values. Additional values are considered to be added in the future. Clients should react to an unknown operator by assuming the requirement is not satisfied. * @type {string} * @memberof K8sIoApiBatchV1PodFailurePolicyOnExitCodesRequirement */ @@ -3277,13 +3295,13 @@ export interface K8sIoApiBatchV1PodFailurePolicyOnPodConditionsPattern { status?: string; } /** - * PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of OnExitCodes and onPodConditions, but not both, can be used in each rule. + * PodFailurePolicyRule describes how a pod failure is handled when the requirements are met. One of onExitCodes and onPodConditions, but not both, can be used in each rule. * @export * @interface K8sIoApiBatchV1PodFailurePolicyRule */ export interface K8sIoApiBatchV1PodFailurePolicyRule { /** - * Specifies the action taken on a pod failure when the requirements are satisfied. Possible values are: - FailJob: indicates that the pod's job is marked as Failed and all running pods are terminated. - Ignore: indicates that the counter towards the .backoffLimit is not incremented and a replacement pod is created. - Count: indicates that the pod is handled in the default way - the counter towards the .backoffLimit is incremented. Additional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule. + * - FailJob: indicates that the pod's job is marked as Failed and all running pods are terminated. - FailIndex: indicates that the pod's index is marked as Failed and will not be restarted. This value is beta-level. It can be used when the `JobBackoffLimitPerIndex` feature gate is enabled (enabled by default). - Ignore: indicates that the counter towards the .backoffLimit is not incremented and a replacement pod is created. - Count: indicates that the pod is handled in the default way - the counter towards the .backoffLimit is incremented. Additional values are considered to be added in the future. Clients should react to an unknown action by skipping the rule. * @type {string} * @memberof K8sIoApiBatchV1PodFailurePolicyRule */ @@ -3568,12 +3586,49 @@ export interface K8sIoApiCoreV1ClaimSource { */ resourceClaimName?: string; /** - * ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long). An existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed. This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim. + * ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The pod name and resource name, along with a generated component, will be used to form a unique name for the ResourceClaim, which will be recorded in pod.status.resourceClaimStatuses. This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim. * @type {string} * @memberof K8sIoApiCoreV1ClaimSource */ resourceClaimTemplateName?: string; } +/** + * ClusterTrustBundleProjection describes how to select a set of ClusterTrustBundle objects and project their contents into the pod filesystem. + * @export + * @interface K8sIoApiCoreV1ClusterTrustBundleProjection + */ +export interface K8sIoApiCoreV1ClusterTrustBundleProjection { + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1ClusterTrustBundleProjection + */ + name?: string; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1ClusterTrustBundleProjection + */ + signerName?: string; + /** + * + * @type {K8sIoApimachineryPkgApisMetaV1LabelSelector} + * @memberof K8sIoApiCoreV1ClusterTrustBundleProjection + */ + labelSelector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; + /** + * + * @type {boolean} + * @memberof K8sIoApiCoreV1ClusterTrustBundleProjection + */ + optional?: boolean; + /** + * Relative path from the volume root to write the bundle. + * @type {string} + * @memberof K8sIoApiCoreV1ClusterTrustBundleProjection + */ + path?: string; +} /** * ConfigMapEnvSource selects a ConfigMap to populate the environment variables with. The contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables. * @export @@ -3734,6 +3789,18 @@ export interface K8sIoApiCoreV1Container { * @memberof K8sIoApiCoreV1Container */ resources?: K8sIoApiCoreV1ResourceRequirements; + /** + * + * @type {Array} + * @memberof K8sIoApiCoreV1Container + */ + resizePolicy?: Array; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1Container + */ + restartPolicy?: string; /** * * @type {Array} @@ -3850,6 +3917,25 @@ export interface K8sIoApiCoreV1ContainerPort { */ hostIP?: string; } +/** + * ContainerResizePolicy represents resource resize policy for the container. + * @export + * @interface K8sIoApiCoreV1ContainerResizePolicy + */ +export interface K8sIoApiCoreV1ContainerResizePolicy { + /** + * Name of the resource to which this resource resize policy applies. Supported values: cpu, memory. + * @type {string} + * @memberof K8sIoApiCoreV1ContainerResizePolicy + */ + resourceName?: string; + /** + * Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired. + * @type {string} + * @memberof K8sIoApiCoreV1ContainerResizePolicy + */ + restartPolicy?: string; +} /** * Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode. * @export @@ -4092,6 +4178,18 @@ export interface K8sIoApiCoreV1EphemeralContainerCommon { * @memberof K8sIoApiCoreV1EphemeralContainerCommon */ resources?: K8sIoApiCoreV1ResourceRequirements; + /** + * + * @type {Array} + * @memberof K8sIoApiCoreV1EphemeralContainerCommon + */ + resizePolicy?: Array; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1EphemeralContainerCommon + */ + restartPolicy?: string; /** * * @type {Array} @@ -4625,6 +4723,12 @@ export interface K8sIoApiCoreV1LifecycleHandler { * @memberof K8sIoApiCoreV1LifecycleHandler */ tcpSocket?: K8sIoApiCoreV1TCPSocketAction; + /** + * + * @type {K8sIoApiCoreV1SleepAction} + * @memberof K8sIoApiCoreV1LifecycleHandler + */ + sleep?: K8sIoApiCoreV1SleepAction; } /** * @@ -4779,10 +4883,10 @@ export interface K8sIoApiCoreV1PersistentVolumeClaimSpec { selector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; /** * - * @type {K8sIoApiCoreV1ResourceRequirements} + * @type {K8sIoApiCoreV1VolumeResourceRequirements} * @memberof K8sIoApiCoreV1PersistentVolumeClaimSpec */ - resources?: K8sIoApiCoreV1ResourceRequirements; + resources?: K8sIoApiCoreV1VolumeResourceRequirements; /** * * @type {string} @@ -4813,6 +4917,12 @@ export interface K8sIoApiCoreV1PersistentVolumeClaimSpec { * @memberof K8sIoApiCoreV1PersistentVolumeClaimSpec */ dataSourceRef?: K8sIoApiCoreV1TypedObjectReference; + /** + * + * @type {string} + * @memberof K8sIoApiCoreV1PersistentVolumeClaimSpec + */ + volumeAttributesClassName?: string; } /** * PersistentVolumeClaimTemplate is used to produce PersistentVolumeClaim objects as part of an EphemeralVolumeSource. @@ -4920,6 +5030,18 @@ export interface K8sIoApiCoreV1PodAffinityTerm { * @memberof K8sIoApiCoreV1PodAffinityTerm */ namespaceSelector?: K8sIoApimachineryPkgApisMetaV1LabelSelector; + /** + * + * @type {Array} + * @memberof K8sIoApiCoreV1PodAffinityTerm + */ + matchLabelKeys?: Array; + /** + * + * @type {Array} + * @memberof K8sIoApiCoreV1PodAffinityTerm + */ + mismatchLabelKeys?: Array; } /** * Pod anti affinity is a group of inter pod anti affinity scheduling rules. @@ -5338,7 +5460,7 @@ export interface K8sIoApiCoreV1PodSpec { */ hostUsers?: boolean; /** - * SchedulingGates is an opaque list of values that if specified will block scheduling the pod. More info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness. This is an alpha-level feature enabled by PodSchedulingReadiness feature gate. +optional +patchMergeKey=name +patchStrategy=merge +listType=map +listMapKey=name + * SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod. SchedulingGates can only be set at pod creation time, and be removed only afterwards. This is a beta feature enabled by the PodSchedulingReadiness feature gate. +patchMergeKey=name +patchStrategy=merge +listType=map +listMapKey=name +featureGate=PodSchedulingReadiness +optional * @type {Array} * @memberof K8sIoApiCoreV1PodSpec */ @@ -5988,6 +6110,19 @@ export interface K8sIoApiCoreV1ServiceAccountTokenProjection { */ path?: string; } +/** + * SleepAction describes a \"sleep\" action. + * @export + * @interface K8sIoApiCoreV1SleepAction + */ +export interface K8sIoApiCoreV1SleepAction { + /** + * Seconds is the number of seconds to sleep. + * @type {string} + * @memberof K8sIoApiCoreV1SleepAction + */ + seconds?: string; +} /** * Represents a StorageOS persistent volume resource. * @export @@ -6149,7 +6284,7 @@ export interface K8sIoApiCoreV1TopologySpreadConstraint { */ nodeTaintsPolicy?: string; /** - * + * MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default). +listType=atomic +optional * @type {Array} * @memberof K8sIoApiCoreV1TopologySpreadConstraint */ @@ -6322,6 +6457,31 @@ export interface K8sIoApiCoreV1VolumeProjection { * @memberof K8sIoApiCoreV1VolumeProjection */ serviceAccountToken?: K8sIoApiCoreV1ServiceAccountTokenProjection; + /** + * + * @type {K8sIoApiCoreV1ClusterTrustBundleProjection} + * @memberof K8sIoApiCoreV1VolumeProjection + */ + clusterTrustBundle?: K8sIoApiCoreV1ClusterTrustBundleProjection; +} +/** + * VolumeResourceRequirements describes the storage resource requirements for a volume. + * @export + * @interface K8sIoApiCoreV1VolumeResourceRequirements + */ +export interface K8sIoApiCoreV1VolumeResourceRequirements { + /** + * + * @type {{ [key: string]: K8sIoApimachineryPkgApiResourceQuantity; }} + * @memberof K8sIoApiCoreV1VolumeResourceRequirements + */ + limits?: { [key: string]: K8sIoApimachineryPkgApiResourceQuantity; }; + /** + * + * @type {{ [key: string]: K8sIoApimachineryPkgApiResourceQuantity; }} + * @memberof K8sIoApiCoreV1VolumeResourceRequirements + */ + requests?: { [key: string]: K8sIoApimachineryPkgApiResourceQuantity; }; } /** * Represents the source of a volume to mount. Only one of its members may be specified. @@ -6637,7 +6797,7 @@ export interface K8sIoApimachineryPkgApisMetaV1LabelSelector { */ export interface K8sIoApimachineryPkgApisMetaV1LabelSelectorRequirement { /** - * + * key is the label key that the selector applies to. * @type {string} * @memberof K8sIoApimachineryPkgApisMetaV1LabelSelectorRequirement */ @@ -6723,7 +6883,7 @@ export interface K8sIoApimachineryPkgApisMetaV1ObjectMeta { */ generateName?: string; /** - * Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces +optional + * Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. Must be a DNS_LABEL. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces +optional * @type {string} * @memberof K8sIoApimachineryPkgApisMetaV1ObjectMeta */ @@ -6735,7 +6895,7 @@ export interface K8sIoApimachineryPkgApisMetaV1ObjectMeta { */ selfLink?: string; /** - * UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids +optional + * UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations. Populated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids +optional * @type {string} * @memberof K8sIoApimachineryPkgApisMetaV1ObjectMeta */ From d35ad952b92ee4f0af84adecd04cb48274ea887a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 18:24:31 -0500 Subject: [PATCH 252/264] chore(deps): bump github.com/aws/aws-sdk-go-v2 from 1.26.0 to 1.26.1 (#3490) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.26.0 to 1.26.1. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.26.0...v1.26.1) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 342bb38b37..a610334ac5 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/antonmedv/expr v1.15.5 github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 - github.com/aws/aws-sdk-go-v2 v1.26.0 + github.com/aws/aws-sdk-go-v2 v1.26.1 github.com/aws/aws-sdk-go-v2/config v1.27.9 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 diff --git a/go.sum b/go.sum index 81c7a7ee5f..8be1c767fe 100644 --- a/go.sum +++ b/go.sum @@ -98,8 +98,8 @@ github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2z github.com/aws/aws-sdk-go v1.44.39/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY= github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= -github.com/aws/aws-sdk-go-v2 v1.26.0/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= From 34c8a91a7bc0c754499594a20e93052710cf67bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:15:46 -0500 Subject: [PATCH 253/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.36.3 to 1.37.0 (#3489) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.36.3 to 1.37.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.37.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ssm/v1.36.3...service/s3/v1.37.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index a610334ac5..064f690d75 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.26.1 github.com/aws/aws-sdk-go-v2/config v1.27.9 - github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 + github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 github.com/aws/smithy-go v1.20.2 github.com/blang/semver v3.5.1+incompatible @@ -85,8 +85,8 @@ require ( github.com/aws/aws-sdk-go v1.44.116 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect diff --git a/go.sum b/go.sum index 8be1c767fe..6d6f824e13 100644 --- a/go.sum +++ b/go.sum @@ -106,14 +106,14 @@ github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMN github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 h1:0ScVK/4qZ8CIW0k8jOeFVsyS/sAiXpYxRBLolMkuLQM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4/go.mod h1:84KyjNZdHC6QZW08nfHI6yZgPd+qRgaWcYsyLUo3QY8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4 h1:sHmMWWX5E7guWEFQ9SVo6A3S4xpPrWnd77a6y4WM6PU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.4/go.mod h1:WjpDrhWisWOIoS9n3nk67A3Ll1vfULJ9Kq6h29HTD48= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3 h1:l3vM7tnmYWZBdyN1d2Q4gTCnDNbwKNtns4oCFt0zfQk= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.36.3/go.mod h1:xeAHc7vhdOYwpG2t4uXdnGhOvOIpJ8n+A5AHnCkk8iw= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 h1:sGGUnU/pUSzjrcCvQgN2pEc3aTQILyK2rRsWVY5CSt0= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0/go.mod h1:U12sr6Lt14X96f16t+rR52+2BdqtydwN7DjEEHRMjO0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 h1:Lq2q/AWzFv5jHVoGJ2Hz1PkxwHYNdGzAB3lbw2g7IEU= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4/go.mod h1:SNhjWOsnsHSveL4fDQL0sDiAIMVnKrvJTp9Z/MNspx0= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= From 91b0a500bb7c40c4b971ba25f46066bee450f26d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 01:49:27 +0000 Subject: [PATCH 254/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.27.9 to 1.27.10 (#3492) chore(deps): bump github.com/aws/aws-sdk-go-v2/config Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.27.9 to 1.27.10. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.27.9...config/v1.27.10) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/config dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 064f690d75..43b76fe5fa 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/argoproj/notifications-engine v0.4.1-0.20240219110818-7a069766e954 github.com/argoproj/pkg v0.13.6 github.com/aws/aws-sdk-go-v2 v1.26.1 - github.com/aws/aws-sdk-go-v2/config v1.27.9 + github.com/aws/aws-sdk-go-v2/config v1.27.10 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 github.com/aws/smithy-go v1.20.2 @@ -83,17 +83,17 @@ require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/aws/aws-sdk-go v1.44.116 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.10 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.4 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect diff --git a/go.sum b/go.sum index 6d6f824e13..0d5bbba0cc 100644 --- a/go.sum +++ b/go.sum @@ -100,12 +100,12 @@ github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WN github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= -github.com/aws/aws-sdk-go-v2/config v1.27.9 h1:gRx/NwpNEFSk+yQlgmk1bmxxvQ5TyJ76CWXs9XScTqg= -github.com/aws/aws-sdk-go-v2/config v1.27.9/go.mod h1:dK1FQfpwpql83kbD873E9vz4FyAxuJtR22wzoXn3qq0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.9 h1:N8s0/7yW+h8qR8WaRlPQeJ6czVMNQVNtNdUqf6cItao= -github.com/aws/aws-sdk-go-v2/credentials v1.17.9/go.mod h1:446YhIdmSV0Jf/SLafGZalQo+xr2iw7/fzXGDPTU1yQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0 h1:af5YzcLf80tv4Em4jWVD75lpnOHSBkPUZxZfGkrI3HI= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.0/go.mod h1:nQ3how7DMnFMWiU1SpECohgC82fpn4cKZ875NDMmwtA= +github.com/aws/aws-sdk-go-v2/config v1.27.10 h1:PS+65jThT0T/snC5WjyfHHyUgG+eBoupSDV+f838cro= +github.com/aws/aws-sdk-go-v2/config v1.27.10/go.mod h1:BePM7Vo4OBpHreKRUMuDXX+/+JWP38FLkzl5m27/Jjs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.10 h1:qDZ3EA2lv1KangvQB6y258OssCHD0xvaGiEDkG4X/10= +github.com/aws/aws-sdk-go-v2/credentials v1.17.10/go.mod h1:6t3sucOaYDwDssHQa0ojH1RpmVmF5/jArkye1b2FKMI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= @@ -116,18 +116,18 @@ github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 h1:sGGUnU/pUSzjrcCvQgN2p github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0/go.mod h1:U12sr6Lt14X96f16t+rR52+2BdqtydwN7DjEEHRMjO0= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 h1:Lq2q/AWzFv5jHVoGJ2Hz1PkxwHYNdGzAB3lbw2g7IEU= github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4/go.mod h1:SNhjWOsnsHSveL4fDQL0sDiAIMVnKrvJTp9Z/MNspx0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1 h1:EyBZibRTVAs6ECHZOw5/wlylS9OcTzwyjeQMudmREjE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.1/go.mod h1:JKpmtYhhPs7D97NL/ltqz7yCkERFW5dOlHyVl66ZYF8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6 h1:b+E7zIUHMmcB4Dckjpkapoy47W6C9QBv/zoUP+Hn8Kc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.6/go.mod h1:S2fNV0rxrP78NhPbCZeQgY8H9jdDMeGtwcfZIRxzBqU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7 h1:tRNrFDGRm81e6nTX5Q4CFblea99eAfm0dxXazGpLceU= github.com/aws/aws-sdk-go-v2/service/sqs v1.29.7/go.mod h1:8GWUDux5Z2h6z2efAtr54RdHXtLm8sq7Rg85ZNY/CZM= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.3 h1:mnbuWHOcM70/OFUlZZ5rcdfA8PflGXXiefU/O+1S3+8= -github.com/aws/aws-sdk-go-v2/service/sso v1.20.3/go.mod h1:5HFu51Elk+4oRBZVxmHrSds5jFXmFj8C3w7DVF2gnrs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3 h1:uLq0BKatTmDzWa/Nu4WO0M1AaQDaPpwTKAeByEc6WFM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.3/go.mod h1:b+qdhjnxj8GSR6t5YfphOffeoQSQ1KmpoVVuBn+PWxs= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.5 h1:J/PpTf/hllOjx8Xu9DMflff3FajfLxqM5+tepvVXmxg= -github.com/aws/aws-sdk-go-v2/service/sts v1.28.5/go.mod h1:0ih0Z83YDH/QeQ6Ori2yGE2XvWYv/Xm+cZc01LC6oK0= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.4 h1:WzFol5Cd+yDxPAdnzTA5LmpHYSWinhmSj4rQChV0ee8= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.4/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= From 07c84c630d43b42aee61e12f6c9607e068c4f854 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 05:03:31 +0200 Subject: [PATCH 255/264] chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 from 1.30.4 to 1.30.5 (#3491) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 Bumps [github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2](https://github.com/aws/aws-sdk-go-v2) from 1.30.4 to 1.30.5. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.30.4...service/s3/v1.30.5) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 43b76fe5fa..422327627b 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.26.1 github.com/aws/aws-sdk-go-v2/config v1.27.10 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.5 github.com/aws/smithy-go v1.20.2 github.com/blang/semver v3.5.1+incompatible github.com/bombsimon/logrusr/v4 v4.1.0 diff --git a/go.sum b/go.sum index 0d5bbba0cc..3aff874a74 100644 --- a/go.sum +++ b/go.sum @@ -114,8 +114,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0 h1:sGGUnU/pUSzjrcCvQgN2pEc3aTQILyK2rRsWVY5CSt0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.37.0/go.mod h1:U12sr6Lt14X96f16t+rR52+2BdqtydwN7DjEEHRMjO0= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4 h1:Lq2q/AWzFv5jHVoGJ2Hz1PkxwHYNdGzAB3lbw2g7IEU= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.4/go.mod h1:SNhjWOsnsHSveL4fDQL0sDiAIMVnKrvJTp9Z/MNspx0= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.5 h1:/x2u/TOx+n17U+gz98TOw1HKJom0EOqrhL4SjrHr0cQ= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.30.5/go.mod h1:e1McVqsud0JOERidvppLEHnuCdh/X6MRyL5L0LseAUk= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= From 745d21321ec1031c712409c0f8ce6576ea8fd803 Mon Sep 17 00:00:00 2001 From: dhawani Date: Wed, 10 Apr 2024 19:06:02 +0530 Subject: [PATCH 256/264] fix(controller): Corrects the logic of comparing sha256 has. Fixes #3519 (#3520) Fixed sha256 algo Signed-off-by: dhawani Signed-off-by: dhawani Co-authored-by: dhawani --- utils/plugin/downloader.go | 9 +++++++-- utils/plugin/downloader_test.go | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/utils/plugin/downloader.go b/utils/plugin/downloader.go index b8b1ad6263..a67dcb38e5 100644 --- a/utils/plugin/downloader.go +++ b/utils/plugin/downloader.go @@ -43,12 +43,17 @@ func checkPluginExists(pluginLocation string) error { } func checkShaOfPlugin(pluginLocation string, expectedSha256 string) (bool, error) { - hasher := sha256.New() fileBytes, err := os.ReadFile(pluginLocation) if err != nil { return false, fmt.Errorf("failed to read file %s: %w", pluginLocation, err) } - fileSha256 := fmt.Sprintf("%x", hasher.Sum(fileBytes)) + var fileSha256 string + if len(expectedSha256) == 64 { + fileSha256 = fmt.Sprintf("%x", sha256.Sum256(fileBytes)) + } else { + hasher := sha256.New() + fileSha256 = fmt.Sprintf("%x", hasher.Sum(fileBytes)) + } match := fileSha256 == expectedSha256 if !match { log.Printf("expected sha256: %s, actual sha256: %s, of downloaded metric plugin (%s)", expectedSha256, fileSha256, pluginLocation) diff --git a/utils/plugin/downloader_test.go b/utils/plugin/downloader_test.go index 75dc4cae71..ab14be3385 100644 --- a/utils/plugin/downloader_test.go +++ b/utils/plugin/downloader_test.go @@ -47,7 +47,7 @@ func TestPlugin(t *testing.T) { Name: "argo-rollouts-config", Namespace: "argo-rollouts", }, - Data: map[string]string{"metricProviderPlugins": "\n - name: argoproj-labs/http\n location: https://test/plugin\n - name: argoproj-labs/http-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}, + Data: map[string]string{"metricProviderPlugins": "\n - name: argoproj-labs/http\n location: https://test/plugin\n - name: argoproj-labs/http-sha\n location: https://test/plugin\n sha256: 74657374e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n - name: argoproj-labs/http-sha-correct\n location: https://test/plugin\n sha256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"}, } client := fake.NewSimpleClientset(cm) From ce345e6a431b6f44776ef7453559b1d00dec9b85 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Fri, 7 Jun 2024 11:53:09 -0700 Subject: [PATCH 257/264] fix: rs conflict with fallback to patch (#3559) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: fallback to patch on scale conflict Signed-off-by: Zach Aller fix: switch to retry logic Signed-off-by: Zach Aller lint Signed-off-by: Zach Aller retry experiments Signed-off-by: Zach Aller remove TODO Signed-off-by: Zach Aller remove accidental add Signed-off-by: Zach Aller remove accidental add Signed-off-by: Zach Aller add retry to setting revision Signed-off-by: Zach Aller chore(deps): bump slsa-framework/slsa-github-generator from 1.10.0 to 2.0.0 (#3537) chore(deps): bump slsa-framework/slsa-github-generator Bumps [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) from 1.10.0 to 2.0.0. - [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases) - [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md) - [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v1.10.0...v2.0.0) --- updated-dependencies: - dependency-name: slsa-framework/slsa-github-generator dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> chore(deps): bump sigstore/cosign-installer from 3.4.0 to 3.5.0 (#3522) Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/sigstore/cosign-installer/releases) - [Commits](https://github.com/sigstore/cosign-installer/compare/e1523de7571e31dbe865fd2e80c5c7c23ae71eb4...59acb6260d9c0ba8f4a2f9d9b48431a222b68e20) --- updated-dependencies: - dependency-name: sigstore/cosign-installer dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> chore(deps): bump golangci/golangci-lint-action from 4 to 5 (#3540) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 4 to 5. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v4...v5) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> docs: provide recommendation for strategies (#3531) * docs: provide recommendation for strategies Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> * docs: traffic manager clarifications Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> * docs: explain canary with/out traffic manager Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> * docs: add 3 columns on the comparison table Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> --------- Signed-off-by: Kostis (Codefresh) <39800303+kostis-codefresh@users.noreply.github.com> feat(dashboard): change the color of the current rollout step (#3526) I feel that having the current (running) step in a orange color is misleading, as orange usually means warning. This commit changes the color to the `$argo-running-color`. Signed-off-by: Alejandro López Sánchez chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.37.0 to 1.38.0 (#3525) chore(deps): bump github.com/aws/aws-sdk-go-v2/service/cloudwatch Bumps [github.com/aws/aws-sdk-go-v2/service/cloudwatch](https://github.com/aws/aws-sdk-go-v2) from 1.37.0 to 1.38.0. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/s3/v1.38.0/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.37.0...service/s3/v1.38.0) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/cloudwatch dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> perform all of set revision actions on retry Signed-off-by: Zach Aller fix variable Signed-off-by: Zach Aller add retry counts to log Signed-off-by: Zach Aller add retry counts to logs Signed-off-by: Zach Aller clean logs, always dump controller e2e logs Signed-off-by: Zach Aller lower timeout Signed-off-by: Zach Aller bump timeout on e2e Signed-off-by: Zach Aller retry on rollout conflict Signed-off-by: Zach Aller don't reque on rs changes Signed-off-by: Zach Aller reque rs Signed-off-by: Zach Aller bump qps for e2e Signed-off-by: Zach Aller fix gen-crd Signed-off-by: Zach Aller switch to patch Signed-off-by: Zach Aller switch to patch Signed-off-by: Zach Aller add log Signed-off-by: Zach Aller move log lines Signed-off-by: Zach Aller Trigger Build Signed-off-by: Zach Aller fix one e2e test Signed-off-by: Zach Aller lint Signed-off-by: Zach Aller add test Signed-off-by: Zach Aller chore(deps): bump actions/setup-go from 5.0.0 to 5.0.1 (#3552) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.0.0 to 5.0.1. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v5.0.0...v5.0.1) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> chore(deps): bump codecov/codecov-action from 4.3.0 to 4.3.1 (#3550) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.3.0 to 4.3.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.3.0...v4.3.1) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> chore(deps): bump google.golang.org/protobuf from 1.33.0 to 1.34.0 (#3548) Bumps google.golang.org/protobuf from 1.33.0 to 1.34.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> refactor Signed-off-by: Zach Aller add test for updating rs revision Signed-off-by: Zach Aller add retry for ephemeral metadata Signed-off-by: Zach Aller clear some fields Signed-off-by: Zach Aller add logs Signed-off-by: Zach Aller refactor into function Signed-off-by: Zach Aller change log Signed-off-by: Zach Aller switch rollout update to patch fallback Signed-off-by: Zach Aller siwtch ephemeral metadata sync to shared function Signed-off-by: Zach Aller siwtch merge type Signed-off-by: Zach Aller lint Signed-off-by: Zach Aller don't update status Signed-off-by: Zach Aller switch rollout update to not use patch Signed-off-by: Zach Aller change log Signed-off-by: Zach Aller switch to small patch Signed-off-by: Zach Aller some cleanup Signed-off-by: Zach Aller remove not found rollout removal Signed-off-by: Zach Aller working setup Signed-off-by: Zach Aller lint Signed-off-by: Zach Aller fix test Signed-off-by: Zach Aller small cleanup Signed-off-by: Zach Aller * typo Signed-off-by: Zach Aller * cleanup commented out code Signed-off-by: Zach Aller * Trigger Build Signed-off-by: Zach Aller * only patch rollouts manged fields Signed-off-by: Zach Aller * lint Signed-off-by: Zach Aller * fix flaky test Signed-off-by: Zach Aller * fix flaky test Signed-off-by: Zach Aller * reduce patch size Signed-off-by: Zach Aller * get some logs Signed-off-by: Zach Aller * cleanup Signed-off-by: Zach Aller * improve tests Signed-off-by: Zach Aller * Trigger Build Signed-off-by: Zach Aller * add env var to log diff Signed-off-by: Zach Aller * remove expirment rs patch Signed-off-by: Zach Aller * imporve logs Signed-off-by: Zach Aller * use correct variable Signed-off-by: Zach Aller * change env var Signed-off-by: Zach Aller * fix flaky e2e Signed-off-by: Zach Aller * fix flaky e2e Signed-off-by: Zach Aller * fix flaky e2e Signed-off-by: Zach Aller * remove not found rollouts Signed-off-by: Zach Aller * update replica count Signed-off-by: Zach Aller * lint Signed-off-by: Zach Aller * refactor cleanup Signed-off-by: Zach Aller * keep track of UpdatedReplicas on sync Signed-off-by: Zach Aller * some hpa tests and log changes Signed-off-by: Zach Aller * remove update to UpdatedReplicas Signed-off-by: Zach Aller * add more test Signed-off-by: Zach Aller * fix test Signed-off-by: Zach Aller * undo change Signed-off-by: Zach Aller * add comment to flaky tests Signed-off-by: Zach Aller * cleanup Makefile Signed-off-by: Zach Aller * remove test Signed-off-by: Zach Aller * use labels Signed-off-by: Zach Aller * remove make file change Signed-off-by: Zach Aller * add label to test Signed-off-by: Zach Aller * review changes Signed-off-by: Zach Aller * change to TODO Signed-off-by: Zach Aller * fix test Signed-off-by: Zach Aller * add extra logging for tests Signed-off-by: Zach Aller * Trigger Build Signed-off-by: Zach Aller * add ignore to codecov Signed-off-by: Zach Aller * we always generate patch because we are comparing against emtpy obj Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- .codecov.yml | 23 ++-- .github/workflows/e2e.yaml | 2 +- Makefile | 2 +- hack/gen-crd-spec/main.go | 11 +- rollout/canary.go | 2 +- rollout/canary_test.go | 109 ++++++++++++++++++ rollout/controller.go | 96 +++++++++++++++ rollout/controller_test.go | 21 ++++ rollout/ephemeralmetadata.go | 10 +- rollout/sync.go | 28 ++--- test/e2e/aws_test.go | 2 + test/e2e/canary_test.go | 6 +- .../analysistemplate-sleep-job.yaml | 2 +- test/e2e/functional_test.go | 13 ++- test/fixtures/e2e_suite.go | 6 +- utils/annotations/annotations.go | 3 + utils/controller/controller.go | 7 ++ utils/replicaset/canary.go | 4 +- 18 files changed, 295 insertions(+), 52 deletions(-) mode change 100755 => 100644 utils/replicaset/canary.go diff --git a/.codecov.yml b/.codecov.yml index 9b9f57ef04..2758a60933 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -8,13 +8,16 @@ coverage: default: threshold: 0.1 ignore: - - "pkg/apis/rollouts/v1alpha1" - - "test" - - "**/*.pb.go" - - "**/*.pb.gw.go" - - "**/*generated.go" - - "**/*generated.deepcopy.go" - - "**/*_test.go" - - "pkg/apis/client/.*" - - "pkg/client/.*" - - "vendor/.*" + - 'pkg/apis/rollouts/v1alpha1' + - 'test' + - '**/*.pb.go' + - '**/*.pb.gw.go' + - '**/*generated.go' + - '**/*generated.deepcopy.go' + - '**/*_test.go' + - 'pkg/apis/client/.*' + - 'pkg/client/.*' + - 'vendor/.*' + - '**/mocks/*' + - 'hack/gen-crd-spec/main.go' + - 'hack/gen-docs/main.go' diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 36e4a26aa4..74499dcaae 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -97,4 +97,4 @@ jobs: with: name: e2e-controller-k8s-${{ matrix.kubernetes-minor-version }}.log path: /tmp/e2e-controller.log - if: ${{ failure() }} + if: ${{ always() }} diff --git a/Makefile b/Makefile index a17bf33676..a9216aa4ff 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ DEV_IMAGE ?= false E2E_INSTANCE_ID ?= argo-rollouts-e2e E2E_TEST_OPTIONS ?= E2E_PARALLEL ?= 1 -E2E_WAIT_TIMEOUT ?= 120 +E2E_WAIT_TIMEOUT ?= 90 GOPATH ?= $(shell go env GOPATH) override LDFLAGS += \ diff --git a/hack/gen-crd-spec/main.go b/hack/gen-crd-spec/main.go index a3e31d92b8..60c1bde9d7 100644 --- a/hack/gen-crd-spec/main.go +++ b/hack/gen-crd-spec/main.go @@ -96,11 +96,12 @@ func NewCustomResourceDefinition() []*extensionsobj.CustomResourceDefinition { // clean up stuff left by controller-gen deleteFile("config/webhook/manifests.yaml") deleteFile("config/webhook") - deleteFile("config/argoproj.io_analysisruns.yaml") - deleteFile("config/argoproj.io_analysistemplates.yaml") - deleteFile("config/argoproj.io_clusteranalysistemplates.yaml") - deleteFile("config/argoproj.io_experiments.yaml") - deleteFile("config/argoproj.io_rollouts.yaml") + deleteFile("config/crd/argoproj.io_analysisruns.yaml") + deleteFile("config/crd/argoproj.io_analysistemplates.yaml") + deleteFile("config/crd/argoproj.io_clusteranalysistemplates.yaml") + deleteFile("config/crd/argoproj.io_experiments.yaml") + deleteFile("config/crd/argoproj.io_rollouts.yaml") + deleteFile("config/crd") deleteFile("config") crds := []*extensionsobj.CustomResourceDefinition{} diff --git a/rollout/canary.go b/rollout/canary.go index ed27bd0a79..fa33b43616 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -112,7 +112,7 @@ func (c *rolloutContext) reconcileCanaryStableReplicaSet() (bool, error) { } scaled, _, err := c.scaleReplicaSetAndRecordEvent(c.stableRS, desiredStableRSReplicaCount) if err != nil { - return scaled, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in reconcileCanaryStableReplicaSet:L %w", err) + return scaled, fmt.Errorf("failed to scaleReplicaSetAndRecordEvent in reconcileCanaryStableReplicaSet: %w", err) } return scaled, err } diff --git a/rollout/canary_test.go b/rollout/canary_test.go index 56b05c7177..3d1eec9d14 100644 --- a/rollout/canary_test.go +++ b/rollout/canary_test.go @@ -4,10 +4,16 @@ import ( "context" "encoding/json" "fmt" + "os" "strconv" "testing" "time" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + k8stesting "k8s.io/client-go/testing" + "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/apps/v1" @@ -2141,3 +2147,106 @@ func TestCanaryReplicaAndSpecChangedTogether(t *testing.T) { // check the canary one is updated assert.NotEqual(t, originReplicas, int(*updated.Spec.Replicas)) } + +func TestSyncRolloutWithConflictInScaleReplicaSet(t *testing.T) { + os.Setenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT", "true") + defer os.Unsetenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") + + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{ + { + SetWeight: int32Ptr(10), + }, { + Pause: &v1alpha1.RolloutPause{ + Duration: v1alpha1.DurationFromInt(10), + }, + }, + } + r1 := newCanaryRollout("foo", 10, nil, steps, int32Ptr(1), intstr.FromInt(1), intstr.FromInt(0)) + r1.Spec.Template.Labels["rollout.argoproj.io/foo"] = "bar" + + rs1 := newReplicaSetWithStatus(r1, 10, 10) + r1.Spec.Replicas = pointer.Int32(2) + f.kubeobjects = append(f.kubeobjects, rs1) + f.replicaSetLister = append(f.replicaSetLister, rs1) + + f.rolloutLister = append(f.rolloutLister, r1) + f.objects = append(f.objects, r1) + + f.expectPatchRolloutAction(r1) + f.expectUpdateReplicaSetAction(rs1) // attempt to scale replicaset but conflict + patchIndex := f.expectPatchReplicaSetAction(rs1) // instead of update patch replicaset + + key := fmt.Sprintf("%s/%s", r1.Namespace, r1.Name) + c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) + + f.kubeclient.PrependReactor("update", "replicasets", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { + return true, action.(k8stesting.UpdateAction).GetObject(), errors.NewConflict(schema.GroupResource{ + Group: "Apps", + Resource: "ReplicaSet", + }, action.(k8stesting.UpdateAction).GetObject().(*appsv1.ReplicaSet).Name, fmt.Errorf("test error")) + }) + + f.runController(key, true, false, c, i, k8sI) + + updatedRs := f.getPatchedReplicaSet(patchIndex) // minus one because update did not happen because conflict + assert.Equal(t, int32(2), *updatedRs.Spec.Replicas) +} + +func TestSyncRolloutWithConflictInSyncReplicaSetRevision(t *testing.T) { + os.Setenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT", "true") + defer os.Unsetenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") + + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{ + { + SetWeight: int32Ptr(10), + }, { + Pause: &v1alpha1.RolloutPause{ + Duration: v1alpha1.DurationFromInt(10), + }, + }, + } + r1 := newCanaryRollout("foo", 3, nil, steps, int32Ptr(1), intstr.FromInt(1), intstr.FromInt(0)) + r2 := bumpVersion(r1) + + rs1 := newReplicaSetWithStatus(r1, 3, 3) + rs2 := newReplicaSetWithStatus(r2, 3, 3) + rs2.Annotations["rollout.argoproj.io/revision"] = "1" + + f.kubeobjects = append(f.kubeobjects, rs1, rs2) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + key := fmt.Sprintf("%s/%s", r1.Namespace, r1.Name) + c, i, k8sI := f.newController(func() time.Duration { return 30 * time.Minute }) + + f.kubeclient.PrependReactor("update", "replicasets", func(action k8stesting.Action) (handled bool, ret runtime.Object, err error) { + return true, &appsv1.ReplicaSet{}, errors.NewConflict(schema.GroupResource{ + Group: "Apps", + Resource: "ReplicaSet", + }, action.(k8stesting.UpdateAction).GetObject().(*appsv1.ReplicaSet).Name, fmt.Errorf("test error")) + }) + + f.expectPatchRolloutAction(r2) + f.expectUpdateReplicaSetAction(rs1) // attempt to update replicaset revision but conflict + patchIndex1 := f.expectPatchReplicaSetAction(rs1) // instead of update patch replicaset + + f.expectUpdateReplicaSetAction(rs2) // attempt to scale replicaset but conflict + patchIndex2 := f.expectPatchReplicaSetAction(rs2) // instead of update patch replicaset + + f.runController(key, true, false, c, i, k8sI) + + updatedRs1 := f.getPatchedReplicaSet(patchIndex1) + assert.Equal(t, "2", updatedRs1.Annotations["rollout.argoproj.io/revision"]) + assert.Equal(t, int32(3), *updatedRs1.Spec.Replicas) + + updatedRs2 := f.getPatchedReplicaSet(patchIndex2) + assert.Equal(t, int32(0), *updatedRs2.Spec.Replicas) +} diff --git a/rollout/controller.go b/rollout/controller.go index 972cea882c..23f7f340dd 100644 --- a/rollout/controller.go +++ b/rollout/controller.go @@ -4,11 +4,16 @@ import ( "context" "encoding/json" "fmt" + "os" "reflect" "strconv" + "strings" "sync" "time" + "github.com/argoproj/argo-rollouts/utils/annotations" + + "github.com/argoproj/argo-rollouts/utils/diff" "k8s.io/apimachinery/pkg/runtime/schema" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts" @@ -16,11 +21,13 @@ import ( log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" k8serrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + patchtypes "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/dynamic" @@ -937,3 +944,92 @@ func remarshalRollout(r *v1alpha1.Rollout) *v1alpha1.Rollout { } return &remarshalled } + +// updateReplicaSetWithPatch updates the replicaset using Update and on failure falls back to a patch this function only exists to make sure we always can update +// replicasets and to not get into an conflict loop updating replicasets. We should really look into a complete refactor of how rollouts handles replicasets such +// that we do not keep a fully replicaset on the rollout context under newRS and instead switch to a patch only based approach. +func (c *rolloutContext) updateReplicaSetFallbackToPatch(ctx context.Context, rs *appsv1.ReplicaSet) (*appsv1.ReplicaSet, error) { + updatedRS, err := c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Update(ctx, rs, metav1.UpdateOptions{}) + if err != nil { + if errors.IsConflict(err) { + if os.Getenv("ARGO_ROLLOUTS_LOG_RS_DIFF_CONFLICT") == "true" { + rsGet, err := c.replicaSetLister.ReplicaSets(rs.Namespace).Get(rs.Name) + if err != nil { + return nil, fmt.Errorf("error getting replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + rsGetJson, err := json.Marshal(rsGet) + if err != nil { + return nil, fmt.Errorf("error marshalling informer replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + rsCopyJson, err := json.Marshal(rs) + if err != nil { + return nil, fmt.Errorf("error marshalling memory replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + c.log.Infof("Informer RS: %s", rsGetJson) + c.log.Infof("Memory RS: %s", rsCopyJson) + } + + c.log.Infof("Conflict when updating replicaset %s, falling back to patch", rs.Name) + + patchRS := appsv1.ReplicaSet{} + patchRS.Spec.Replicas = rs.Spec.Replicas + patchRS.Spec.Template.Labels = rs.Spec.Template.Labels + patchRS.Spec.Template.Annotations = rs.Spec.Template.Annotations + + patchRS.Annotations = make(map[string]string) + patchRS.Labels = make(map[string]string) + patchRS.Spec.Selector = &metav1.LabelSelector{ + MatchLabels: make(map[string]string), + } + + if _, found := rs.Labels[v1alpha1.DefaultRolloutUniqueLabelKey]; found { + patchRS.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] = rs.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + } + + if _, found := rs.Annotations[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey]; found { + patchRS.Annotations[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey] = rs.Labels[v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey] + } + + if _, found := rs.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey]; found { + patchRS.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey] = rs.Spec.Selector.MatchLabels[v1alpha1.DefaultRolloutUniqueLabelKey] + } + + for key, value := range rs.Annotations { + if strings.HasPrefix(key, annotations.RolloutLabel) || + strings.HasPrefix(key, "argo-rollouts.argoproj.io") || + strings.HasPrefix(key, "experiment.argoproj.io") { + patchRS.Annotations[key] = value + } + } + for key, value := range rs.Labels { + if strings.HasPrefix(key, annotations.RolloutLabel) || + strings.HasPrefix(key, "argo-rollouts.argoproj.io") || + strings.HasPrefix(key, "experiment.argoproj.io") { + patchRS.Labels[key] = value + } + } + + patch, _, err := diff.CreateTwoWayMergePatch(appsv1.ReplicaSet{}, patchRS, appsv1.ReplicaSet{}) + if err != nil { + return nil, fmt.Errorf("error creating patch for conflict log in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + + c.log.Infof("Patching replicaset with patch: %s", string(patch)) + updatedRS, err = c.kubeclientset.AppsV1().ReplicaSets(rs.Namespace).Patch(ctx, rs.Name, patchtypes.StrategicMergePatchType, patch, metav1.PatchOptions{}) + if err != nil { + return nil, fmt.Errorf("error patching replicaset in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + + err = c.replicaSetInformer.GetIndexer().Update(updatedRS) + if err != nil { + return nil, fmt.Errorf("error updating replicaset informer in updateReplicaSetFallbackToPatch %s: %w", rs.Name, err) + } + + return updatedRS, err + } + } + if updatedRS != nil { + updatedRS.DeepCopyInto(rs) + } + return rs, err +} diff --git a/rollout/controller_test.go b/rollout/controller_test.go index 892a2be64f..e38fca79c5 100644 --- a/rollout/controller_test.go +++ b/rollout/controller_test.go @@ -792,6 +792,12 @@ func (f *fixture) expectPatchServiceAction(s *corev1.Service, newLabel string) i return len } +func (f *fixture) expectGetReplicaSetAction(r *appsv1.ReplicaSet) int { //nolint:unused + len := len(f.kubeactions) + f.kubeactions = append(f.kubeactions, core.NewGetAction(schema.GroupVersionResource{Resource: "replicasets"}, r.Namespace, r.Name)) + return len +} + func (f *fixture) expectCreateReplicaSetAction(r *appsv1.ReplicaSet) int { len := len(f.kubeactions) f.kubeactions = append(f.kubeactions, core.NewCreateAction(schema.GroupVersionResource{Resource: "replicasets"}, r.Namespace, r)) @@ -950,6 +956,21 @@ func (f *fixture) getUpdatedReplicaSet(index int) *appsv1.ReplicaSet { return rs } +func (f *fixture) getPatchedReplicaSet(index int) *appsv1.ReplicaSet { + action := filterInformerActions(f.kubeclient.Actions())[index] + patchAction, ok := action.(core.PatchAction) + if !ok { + f.t.Fatalf("Expected Patch action, not %s", action.GetVerb()) + } + + rs := appsv1.ReplicaSet{} + err := json.Unmarshal(patchAction.GetPatch(), &rs) + if err != nil { + panic(err) + } + return &rs +} + func (f *fixture) verifyPatchedReplicaSet(index int, scaleDownDelaySeconds int32) { action := filterInformerActions(f.kubeclient.Actions())[index] patchAction, ok := action.(core.PatchAction) diff --git a/rollout/ephemeralmetadata.go b/rollout/ephemeralmetadata.go index 60b745ed29..4f502a78ab 100644 --- a/rollout/ephemeralmetadata.go +++ b/rollout/ephemeralmetadata.go @@ -82,14 +82,12 @@ func (c *rolloutContext) syncEphemeralMetadata(ctx context.Context, rs *appsv1.R } // 2. Update ReplicaSet so that any new pods it creates will have the metadata - rs, err = c.kubeclientset.AppsV1().ReplicaSets(modifiedRS.Namespace).Update(ctx, modifiedRS, metav1.UpdateOptions{}) + rs, err = c.updateReplicaSetFallbackToPatch(ctx, modifiedRS) if err != nil { - return fmt.Errorf("error updating replicaset in syncEphemeralMetadata: %w", err) - } - err = c.replicaSetInformer.GetIndexer().Update(rs) - if err != nil { - return fmt.Errorf("error updating replicaset informer in syncEphemeralMetadata: %w", err) + c.log.Infof("failed to sync ephemeral metadata %v to ReplicaSet %s: %v", podMetadata, rs.Name, err) + return fmt.Errorf("failed to sync ephemeral metadata: %w", err) } + c.log.Infof("synced ephemeral metadata %v to ReplicaSet %s", podMetadata, rs.Name) return nil } diff --git a/rollout/sync.go b/rollout/sync.go index 875949ee55..6d656e2d5a 100644 --- a/rollout/sync.go +++ b/rollout/sync.go @@ -83,17 +83,13 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { affinityNeedsUpdate := replicasetutil.IfInjectedAntiAffinityRuleNeedsUpdate(rsCopy.Spec.Template.Spec.Affinity, *c.rollout) if annotationsUpdated || minReadySecondsNeedsUpdate || affinityNeedsUpdate { + rsCopy.Spec.MinReadySeconds = c.rollout.Spec.MinReadySeconds rsCopy.Spec.Template.Spec.Affinity = replicasetutil.GenerateReplicaSetAffinity(*c.rollout) - rs, err := c.kubeclientset.AppsV1().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) - if err != nil { - c.log.WithError(err).Error("Error: updating replicaset revision") - return nil, fmt.Errorf("error updating replicaset revision: %v", err) - } - c.log.Infof("Synced revision on ReplicaSet '%s' to '%s'", rs.Name, newRevision) - err = c.replicaSetInformer.GetIndexer().Update(rs) + + rs, err := c.updateReplicaSetFallbackToPatch(ctx, rsCopy) if err != nil { - return nil, fmt.Errorf("error updating replicaset informer in syncReplicaSetRevision: %w", err) + return nil, fmt.Errorf("failed to update replicaset revision on %s: %w", rsCopy.Name, err) } return rs, nil } @@ -113,7 +109,7 @@ func (c *rolloutContext) syncReplicaSetRevision() (*appsv1.ReplicaSet, error) { conditions.SetRolloutCondition(&c.rollout.Status, *condition) updatedRollout, err := c.argoprojclientset.ArgoprojV1alpha1().Rollouts(c.rollout.Namespace).UpdateStatus(ctx, c.rollout, metav1.UpdateOptions{}) if err != nil { - c.log.WithError(err).Error("Error: updating rollout revision") + c.log.WithError(err).Error("Error: updating rollout status in syncReplicaSetRevision") return nil, err } c.rollout = updatedRollout @@ -245,7 +241,7 @@ func (c *rolloutContext) createDesiredReplicaSet() (*appsv1.ReplicaSet, error) { cond := conditions.NewRolloutCondition(v1alpha1.RolloutProgressing, corev1.ConditionFalse, conditions.FailedRSCreateReason, msg) patchErr := c.patchCondition(c.rollout, newStatus, cond) if patchErr != nil { - c.log.Warnf("Error Patching Rollout: %s", patchErr.Error()) + c.log.Warnf("Error Patching Rollout Conditions: %s", patchErr.Error()) } return nil, err default: @@ -370,25 +366,21 @@ func (c *rolloutContext) scaleReplicaSet(rs *appsv1.ReplicaSet, newScale int32, rolloutReplicas := defaults.GetReplicasOrDefault(rollout.Spec.Replicas) annotationsNeedUpdate := annotations.ReplicasAnnotationsNeedUpdate(rs, rolloutReplicas) - scaled := false var err error + scaled := false if sizeNeedsUpdate || annotationsNeedUpdate { rsCopy := rs.DeepCopy() oldScale := defaults.GetReplicasOrDefault(rs.Spec.Replicas) *(rsCopy.Spec.Replicas) = newScale annotations.SetReplicasAnnotations(rsCopy, rolloutReplicas) if fullScaleDown && !c.shouldDelayScaleDownOnAbort() { + // This bypasses the normal call to removeScaleDownDelay and then depends on the removal via an update in updateReplicaSetFallbackToPatch delete(rsCopy.Annotations, v1alpha1.DefaultReplicaSetScaleDownDeadlineAnnotationKey) } - rs, err = c.kubeclientset.AppsV1().ReplicaSets(rsCopy.Namespace).Update(ctx, rsCopy, metav1.UpdateOptions{}) - if err != nil { - return scaled, rs, fmt.Errorf("error updating replicaset %s: %w", rsCopy.Name, err) - } - err = c.replicaSetInformer.GetIndexer().Update(rs) + rs, err = c.updateReplicaSetFallbackToPatch(ctx, rsCopy) if err != nil { - err = fmt.Errorf("error updating replicaset informer in scaleReplicaSet: %w", err) - return scaled, rs, err + return scaled, rs, fmt.Errorf("failed to updateReplicaSetFallbackToPatch in scaleReplicaSet: %w", err) } if sizeNeedsUpdate { diff --git a/test/e2e/aws_test.go b/test/e2e/aws_test.go index f8b0553fe2..dab037e395 100644 --- a/test/e2e/aws_test.go +++ b/test/e2e/aws_test.go @@ -239,6 +239,7 @@ func (s *AWSSuite) TestALBExperimentStepMultiIngress() { } func (s *AWSSuite) TestALBExperimentStepNoSetWeight() { + //TODO: this test is flaky s.Given(). RolloutObjects("@alb/rollout-alb-experiment-no-setweight.yaml"). When(). @@ -272,6 +273,7 @@ func (s *AWSSuite) TestALBExperimentStepNoSetWeight() { } func (s *AWSSuite) TestALBExperimentStepNoSetWeightMultiIngress() { + //TODO: this test is flaky s.Given(). RolloutObjects("@alb/rollout-alb-multi-ingress-experiment-no-setweight.yaml"). When(). diff --git a/test/e2e/canary_test.go b/test/e2e/canary_test.go index 2c68ec8bd7..8656aa5c4d 100644 --- a/test/e2e/canary_test.go +++ b/test/e2e/canary_test.go @@ -149,7 +149,10 @@ spec: spec: containers: - name: updatescaling - command: [/bad-command]`). + resources: + requests: + memory: 16Mi + cpu: 2m`). WaitForRolloutReplicas(7). Then(). ExpectCanaryStablePodCount(4, 3). @@ -658,6 +661,7 @@ func (s *CanarySuite) TestCanaryDynamicStableScale() { When(). MarkPodsReady("1", 1). // mark last remaining stable pod as ready (4/4 stable are ready) WaitForRevisionPodCount("2", 0). + Sleep(2*time.Second). //WaitForRevisionPodCount does not wait for terminating pods and so ExpectServiceSelector fails sleep a bit for the terminating pods to be deleted Then(). // Expect that the canary service selector is now set to stable because of dynamic stable scale is over and we have all pods up on stable rs ExpectServiceSelector("dynamic-stable-scale-canary", map[string]string{"app": "dynamic-stable-scale", "rollouts-pod-template-hash": "868d98995b"}, false). diff --git a/test/e2e/functional/analysistemplate-sleep-job.yaml b/test/e2e/functional/analysistemplate-sleep-job.yaml index 86faa2c877..4fdd369dee 100644 --- a/test/e2e/functional/analysistemplate-sleep-job.yaml +++ b/test/e2e/functional/analysistemplate-sleep-job.yaml @@ -6,7 +6,7 @@ metadata: spec: args: - name: duration - value: 0s + value: "0" - name: exit-code value: "0" - name: count diff --git a/test/e2e/functional_test.go b/test/e2e/functional_test.go index 930c7d0c61..668c75bb0c 100644 --- a/test/e2e/functional_test.go +++ b/test/e2e/functional_test.go @@ -166,13 +166,14 @@ spec: UpdateSpec(). WaitForRolloutStatus("Paused"). // At step 1 (pause: {duration: 24h}) PromoteRollout(). - Sleep(2*time.Second). + Sleep(3*time.Second). + WaitForInlineAnalysisRunPhase("Running"). Then(). + ExpectRolloutStatus("Progressing"). // At step 2 (analysis: sleep-job - 24h) + ExpectAnalysisRunCount(1). ExpectRollout("status.currentStepIndex == 1", func(r *v1alpha1.Rollout) bool { return *r.Status.CurrentStepIndex == 1 }). - ExpectRolloutStatus("Progressing"). // At step 2 (analysis: sleep-job - 24h) - ExpectAnalysisRunCount(1). When(). PromoteRollout(). Sleep(2 * time.Second). @@ -205,6 +206,9 @@ spec: prePromotionAnalysis: templates: - templateName: sleep-job + args: + - name: duration + value: "10" postPromotionAnalysis: templates: - templateName: sleep-job @@ -228,7 +232,8 @@ spec: ApplyManifests(). WaitForRolloutStatus("Healthy"). UpdateSpec(). - Sleep(3 * time.Second). + Sleep(5 * time.Second). + WaitForPrePromotionAnalysisRunPhase("Running"). PromoteRolloutFull(). WaitForRolloutStatus("Healthy"). Then(). diff --git a/test/fixtures/e2e_suite.go b/test/fixtures/e2e_suite.go index a774afcf94..e78ae1aa68 100644 --- a/test/fixtures/e2e_suite.go +++ b/test/fixtures/e2e_suite.go @@ -54,7 +54,7 @@ const ( ) var ( - E2EWaitTimeout time.Duration = time.Second * 120 + E2EWaitTimeout time.Duration = time.Second * 90 E2EPodDelay = 0 E2EALBIngressAnnotations map[string]string @@ -143,8 +143,8 @@ func (s *E2ESuite) SetupSuite() { restConfig, err := config.ClientConfig() s.CheckError(err) s.Common.kubernetesHost = restConfig.Host - restConfig.Burst = defaults.DefaultBurst * 2 - restConfig.QPS = defaults.DefaultQPS * 2 + restConfig.Burst = defaults.DefaultBurst * 10 + restConfig.QPS = defaults.DefaultQPS * 10 s.namespace, _, err = config.Namespace() s.CheckError(err) s.kubeClient, err = kubernetes.NewForConfig(restConfig) diff --git a/utils/annotations/annotations.go b/utils/annotations/annotations.go index 121c6c0803..067492bc2b 100644 --- a/utils/annotations/annotations.go +++ b/utils/annotations/annotations.go @@ -28,6 +28,8 @@ const ( DesiredReplicasAnnotation = RolloutLabel + "/desired-replicas" // WorkloadGenerationAnnotation is the generation of the referenced workload WorkloadGenerationAnnotation = RolloutLabel + "/workload-generation" + // NotificationEngineAnnotation the annotation notification engine uses to determine if it should notify + NotificationEngineAnnotation = "notified.notifications.argoproj.io" ) // GetDesiredReplicasAnnotation returns the number of desired replicas @@ -219,6 +221,7 @@ var annotationsToSkip = map[string]bool{ RevisionAnnotation: true, RevisionHistoryAnnotation: true, DesiredReplicasAnnotation: true, + NotificationEngineAnnotation: true, } // skipCopyAnnotation returns true if we should skip copying the annotation with the given annotation key diff --git a/utils/controller/controller.go b/utils/controller/controller.go index 2530e1d5fa..b5c1fc875b 100644 --- a/utils/controller/controller.go +++ b/utils/controller/controller.go @@ -6,6 +6,8 @@ import ( "runtime/debug" "time" + "k8s.io/apimachinery/pkg/api/errors" + log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -157,6 +159,11 @@ func processNextWorkItem(ctx context.Context, workqueue workqueue.RateLimitingIn if err := runSyncHandler(); err != nil { logCtx.Errorf("%s syncHandler error: %v", objType, err) metricsServer.IncError(namespace, name, objType) + + if errors.IsNotFound(err) { + workqueue.Forget(obj) + return nil + } // Put the item back on // the workqueue to handle any transient errors. workqueue.AddRateLimited(key) diff --git a/utils/replicaset/canary.go b/utils/replicaset/canary.go old mode 100755 new mode 100644 index cf41e6baa5..f8fd8fe869 --- a/utils/replicaset/canary.go +++ b/utils/replicaset/canary.go @@ -4,6 +4,8 @@ import ( "encoding/json" "math" + "github.com/argoproj/argo-rollouts/utils/annotations" + log "github.com/sirupsen/logrus" appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -15,7 +17,7 @@ import ( const ( // EphemeralMetadataAnnotation denotes pod metadata which is ephemerally injected to canary/stable pods - EphemeralMetadataAnnotation = "rollout.argoproj.io/ephemeral-metadata" + EphemeralMetadataAnnotation = annotations.RolloutLabel + "/ephemeral-metadata" ) func allDesiredAreAvailable(rs *appsv1.ReplicaSet, desired int32) bool { From ba4d01e09055fd95de64a54eae8d0ce153487674 Mon Sep 17 00:00:00 2001 From: Joshua Mathew <59318184+umjoshua@users.noreply.github.com> Date: Thu, 13 Jun 2024 01:52:13 +0530 Subject: [PATCH 258/264] fix: protocol missing in ambassador canary mapping creation. Fixes #3593 (#3603) fix protocol missing in ambassador canary mapping creation Signed-off-by: Joshua Mathew --- .../trafficrouting/ambassador/ambassador.go | 22 +++++-------------- .../ambassador/ambassador_test.go | 12 +++++----- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/rollout/trafficrouting/ambassador/ambassador.go b/rollout/trafficrouting/ambassador/ambassador.go index 5c50f38f26..ceb389c81a 100644 --- a/rollout/trafficrouting/ambassador/ambassador.go +++ b/rollout/trafficrouting/ambassador/ambassador.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "strconv" "strings" "sync" "time" @@ -218,7 +217,8 @@ func (r *Reconciler) createCanaryMapping(ctx context.Context, } canarySvc := r.Rollout.Spec.Strategy.Canary.CanaryService - canaryMapping := buildCanaryMapping(baseMapping, canarySvc, desiredWeight) + stableService := r.Rollout.Spec.Strategy.Canary.StableService + canaryMapping := buildCanaryMapping(baseMapping, canarySvc, stableService, desiredWeight) _, err = client.Create(ctx, canaryMapping, metav1.CreateOptions{}) if err != nil { msg := fmt.Sprintf("Error creating canary mapping: %s", err) @@ -227,9 +227,9 @@ func (r *Reconciler) createCanaryMapping(ctx context.Context, return err } -func buildCanaryMapping(baseMapping *unstructured.Unstructured, canarySvc string, desiredWeight int32) *unstructured.Unstructured { +func buildCanaryMapping(baseMapping *unstructured.Unstructured, canarySvc string, stableService string, desiredWeight int32) *unstructured.Unstructured { canaryMapping := baseMapping.DeepCopy() - svc := buildCanaryService(baseMapping, canarySvc) + svc := buildCanaryService(baseMapping, canarySvc, stableService) unstructured.RemoveNestedField(canaryMapping.Object, "metadata") cMappingName := buildCanaryMappingName(baseMapping.GetName()) canaryMapping.SetName(cMappingName) @@ -239,19 +239,9 @@ func buildCanaryMapping(baseMapping *unstructured.Unstructured, canarySvc string return canaryMapping } -func buildCanaryService(baseMapping *unstructured.Unstructured, canarySvc string) string { +func buildCanaryService(baseMapping *unstructured.Unstructured, canarySvc string, stableService string) string { curSvc := GetMappingService(baseMapping) - parts := strings.Split(curSvc, ":") - if len(parts) < 2 { - return canarySvc - } - // Check if the last part is a valid int that can be used as the port - port := parts[len(parts)-1] - if _, err := strconv.Atoi(port); err != nil { - return canarySvc - - } - return fmt.Sprintf("%s:%s", canarySvc, port) + return strings.Replace(curSvc, stableService, canarySvc, 1) } func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) (*bool, error) { diff --git a/rollout/trafficrouting/ambassador/ambassador_test.go b/rollout/trafficrouting/ambassador/ambassador_test.go index 66d193b83a..ee1ac347e3 100644 --- a/rollout/trafficrouting/ambassador/ambassador_test.go +++ b/rollout/trafficrouting/ambassador/ambassador_test.go @@ -31,7 +31,7 @@ metadata: spec: prefix: /myapp/ rewrite: /myapp/ - service: myapp:8080` + service: main-service:8080` baseMappingNoPort = ` apiVersion: getambassador.io/v2 @@ -42,7 +42,7 @@ metadata: spec: prefix: /myapp/ rewrite: /myapp/ - service: myapp` + service: main-service` baseMappingWithWeight = ` apiVersion: getambassador.io/v2 @@ -53,7 +53,7 @@ metadata: spec: prefix: /myapp/ rewrite: /myapp/ - service: myapp:8080 + service: main-service:8080 weight: 20` baseV3Mapping = ` @@ -66,7 +66,7 @@ spec: hostname: 'example.com' prefix: /myapp/ rewrite: /myapp/ - service: myapp:8080` + service: main-service:8080` canaryMapping = ` apiVersion: getambassador.io/v2 @@ -77,7 +77,7 @@ metadata: spec: prefix: /myapp/ rewrite: /myapp/ - service: myapp:8080 + service: main-service:8080 weight: 20` canaryMappingWithZeroWeight = ` @@ -89,7 +89,7 @@ metadata: spec: prefix: /myapp/ rewrite: /myapp/ - service: myapp:8080 + service: main-service:8080 weight: 0` ) From a13073e1705974ba8880bf4288d8a16def098b74 Mon Sep 17 00:00:00 2001 From: May Zhang Date: Wed, 12 Jun 2024 13:18:02 -0700 Subject: [PATCH 259/264] fix: when Rollout has pingpong and stable/canary service defined, only alb traffic management uses pingpong. (#3628) * fix: when Rollout has pingpong and stable/canary service defined, GetStableAndCanaryServices returns based on isPingpongPreferred. Only when it is ALB controller, then isPringpongPreferred is true. Signed-off-by: mayz985 * fix lint error Signed-off-by: mayz985 * added e2e Signed-off-by: mayz985 --------- Signed-off-by: mayz985 --- rollout/canary.go | 2 +- rollout/service.go | 2 +- rollout/trafficrouting/alb/alb.go | 6 +- rollout/trafficrouting/istio/istio.go | 12 +- rollout/trafficrouting/service_helper.go | 17 ++- rollout/trafficrouting/service_helper_test.go | 82 +++++++++++ test/e2e/aws_test.go | 65 ++++++++ ...albmesh-pingpong-stablecanary-rollout.yaml | 139 ++++++++++++++++++ 8 files changed, 310 insertions(+), 15 deletions(-) create mode 100644 rollout/trafficrouting/service_helper_test.go create mode 100644 test/e2e/functional/albmesh-pingpong-stablecanary-rollout.yaml diff --git a/rollout/canary.go b/rollout/canary.go index fa33b43616..a3033fea02 100644 --- a/rollout/canary.go +++ b/rollout/canary.go @@ -296,7 +296,7 @@ func (c *rolloutContext) canProceedWithScaleDownAnnotation(oldRSs []*appsv1.Repl // AWS API calls. return true, nil } - stableSvcName, _ := trafficrouting.GetStableAndCanaryServices(c.rollout) + stableSvcName, _ := trafficrouting.GetStableAndCanaryServices(c.rollout, true) stableSvc, err := c.servicesLister.Services(c.rollout.Namespace).Get(stableSvcName) if err != nil { return false, err diff --git a/rollout/service.go b/rollout/service.go index 69739b9315..c0904ffd23 100644 --- a/rollout/service.go +++ b/rollout/service.go @@ -243,7 +243,7 @@ func (c *rolloutContext) getPreviewAndActiveServices() (*corev1.Service, *corev1 func (c *rolloutContext) reconcilePingAndPongService() error { if trafficrouting.IsPingPongEnabled(c.rollout) && !rolloututils.IsFullyPromoted(c.rollout) { - _, canaryService := trafficrouting.GetStableAndCanaryServices(c.rollout) + _, canaryService := trafficrouting.GetStableAndCanaryServices(c.rollout, true) return c.ensureSVCTargets(canaryService, c.newRS, false) } return nil diff --git a/rollout/trafficrouting/alb/alb.go b/rollout/trafficrouting/alb/alb.go index 8e81b113c7..992f808fe7 100644 --- a/rollout/trafficrouting/alb/alb.go +++ b/rollout/trafficrouting/alb/alb.go @@ -242,7 +242,7 @@ func (r *Reconciler) VerifyWeightPerIngress(desiredWeight int32, ingresses []str } resourceIDToDest := map[string]v1alpha1.WeightDestination{} - stableService, canaryService := trafficrouting.GetStableAndCanaryServices(rollout) + stableService, canaryService := trafficrouting.GetStableAndCanaryServices(rollout, true) canaryResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), canaryService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) stableResourceID := aws.BuildTargetGroupResourceID(rollout.Namespace, ingress.GetName(), stableService, rollout.Spec.Strategy.Canary.TrafficRouting.ALB.ServicePort) @@ -347,7 +347,7 @@ func updateTargetGroupStatus(status *v1alpha1.ALBStatus, tg *aws.TargetGroupMeta } func getForwardActionString(r *v1alpha1.Rollout, port int32, desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) (string, error) { - stableService, canaryService := trafficrouting.GetStableAndCanaryServices(r) + stableService, canaryService := trafficrouting.GetStableAndCanaryServices(r, true) portStr := strconv.Itoa(int(port)) stableWeight := int32(100) targetGroups := make([]ingressutil.ALBTargetGroup, 0) @@ -479,7 +479,7 @@ func removeValue(array []string, key string) []string { } func getTrafficForwardActionString(r *v1alpha1.Rollout, port int32) (string, error) { - _, canaryService := trafficrouting.GetStableAndCanaryServices(r) + _, canaryService := trafficrouting.GetStableAndCanaryServices(r, true) portStr := strconv.Itoa(int(port)) weight := int64(100) targetGroups := make([]ingressutil.ALBTargetGroup, 0) diff --git a/rollout/trafficrouting/istio/istio.go b/rollout/trafficrouting/istio/istio.go index 5308d59a42..bb9a15eb5e 100644 --- a/rollout/trafficrouting/istio/istio.go +++ b/rollout/trafficrouting/istio/istio.go @@ -125,7 +125,7 @@ func (patches virtualServicePatches) patchVirtualService(httpRoutes []any, tlsRo } func (r *Reconciler) generateVirtualServicePatches(rolloutVsvcRouteNames []string, httpRoutes []VirtualServiceHTTPRoute, rolloutVsvcTLSRoutes []v1alpha1.TLSRoute, tlsRoutes []VirtualServiceTLSRoute, rolloutVsvcTCPRoutes []v1alpha1.TCPRoute, tcpRoutes []VirtualServiceTCPRoute, desiredWeight int64, additionalDestinations ...v1alpha1.WeightDestination) virtualServicePatches { - stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout, false) canarySubset := "" stableSubset := "" if r.rollout.Spec.Strategy.Canary.TrafficRouting.Istio.DestinationRule != nil { @@ -718,7 +718,7 @@ func (r *Reconciler) reconcileVirtualServiceHeaderRoutes(virtualService v1alpha1 return err } - _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) + _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout, false) if destRuleHost != "" { canarySvc = destRuleHost } @@ -1023,7 +1023,7 @@ func searchTcpRoute(tcpRoute v1alpha1.TCPRoute, istioTcpRoutes []VirtualServiceT // ValidateHTTPRoutes ensures that all the routes in the rollout exist func ValidateHTTPRoutes(r *v1alpha1.Rollout, routeNames []string, httpRoutes []VirtualServiceHTTPRoute) error { - stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r, false) routeIndexesToPatch, err := getHttpRouteIndexesToPatch(routeNames, httpRoutes) if err != nil { @@ -1060,7 +1060,7 @@ func ValidateHTTPRoutes(r *v1alpha1.Rollout, routeNames []string, httpRoutes []V // ValidateTlsRoutes ensures that all the routes in the rollout exist and they only have two destinations func ValidateTlsRoutes(r *v1alpha1.Rollout, vsvcTLSRoutes []v1alpha1.TLSRoute, tlsRoutes []VirtualServiceTLSRoute) error { - stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r, false) routeIndexesToPatch, err := getTlsRouteIndexesToPatch(vsvcTLSRoutes, tlsRoutes) if err != nil { @@ -1081,7 +1081,7 @@ func ValidateTlsRoutes(r *v1alpha1.Rollout, vsvcTLSRoutes []v1alpha1.TLSRoute, t // ValidateTcpRoutes ensures that all the routes in the rollout exist and they only have two destinations func ValidateTcpRoutes(r *v1alpha1.Rollout, vsvcTCPRoutes []v1alpha1.TCPRoute, tcpRoutes []VirtualServiceTCPRoute) error { - stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r) + stableSvc, canarySvc := trafficrouting.GetStableAndCanaryServices(r, false) routeIndexesToPatch, err := getTcpRouteIndexesToPatch(vsvcTCPRoutes, tcpRoutes) if err != nil { @@ -1189,7 +1189,7 @@ func (r *Reconciler) reconcileVirtualServiceMirrorRoutes(virtualService v1alpha1 if err != nil { return fmt.Errorf("[reconcileVirtualServiceMirrorRoutes] failed to get destination rule host: %w", err) } - _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout) + _, canarySvc := trafficrouting.GetStableAndCanaryServices(r.rollout, false) if destRuleHost != "" { canarySvc = destRuleHost } diff --git a/rollout/trafficrouting/service_helper.go b/rollout/trafficrouting/service_helper.go index 15d03cad53..8bae069fe7 100644 --- a/rollout/trafficrouting/service_helper.go +++ b/rollout/trafficrouting/service_helper.go @@ -7,17 +7,26 @@ import ( // GetStableAndCanaryServices return a service names for current stable and canary services. // If ping-pong feature enabled then the current ping or pong service will be returned. Which is a stable is defined // based on a rollout status field Status.Canary.StablePingPong -func GetStableAndCanaryServices(ro *v1alpha1.Rollout) (string, string) { - if IsPingPongEnabled(ro) { + +// isPingpongPreferred is needed when Rollout uses both pingpong service and stable/canary service +// for ALB trafficRouting, isPingpongPreferred is true. It uses pingpong service as priority +// for other trafficRouting, isPingpongPrefrered is false. It uses stable/canary service +// This is to ensure it is compatible with previous release. + +func GetStableAndCanaryServices(ro *v1alpha1.Rollout, isPingpongPreferred bool) (string, string) { + pingPongNotPreferredOtherServiceNotDefined := !isPingpongPreferred && ro.Spec.Strategy.Canary.StableService == "" && ro.Spec.Strategy.Canary.CanaryService == "" + if IsPingPongEnabled(ro) && + (isPingpongPreferred || pingPongNotPreferredOtherServiceNotDefined) { canary := ro.Spec.Strategy.Canary if IsStablePing(ro) { return canary.PingPong.PingService, canary.PingPong.PongService } else { return canary.PingPong.PongService, canary.PingPong.PingService } - } else { - return ro.Spec.Strategy.Canary.StableService, ro.Spec.Strategy.Canary.CanaryService } + + return ro.Spec.Strategy.Canary.StableService, ro.Spec.Strategy.Canary.CanaryService + } // IsStablePing return true if the 'ping' service is pointing to the stable replica set. diff --git a/rollout/trafficrouting/service_helper_test.go b/rollout/trafficrouting/service_helper_test.go new file mode 100644 index 0000000000..cc0634eb6f --- /dev/null +++ b/rollout/trafficrouting/service_helper_test.go @@ -0,0 +1,82 @@ +package trafficrouting + +import ( + "testing" + + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + "github.com/stretchr/testify/assert" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const PING_SVC = "ping-service" +const PONG_SVC = "pong-service" + +func fakeRollout(stableSvc, canarySvc string, pingPong *v1alpha1.PingPongSpec, stableIng string, port int32) *v1alpha1.Rollout { + return &v1alpha1.Rollout{ + ObjectMeta: metav1.ObjectMeta{ + Name: "rollout", + Namespace: metav1.NamespaceDefault, + }, + Spec: v1alpha1.RolloutSpec{ + Strategy: v1alpha1.RolloutStrategy{ + Canary: &v1alpha1.CanaryStrategy{ + StableService: stableSvc, + CanaryService: canarySvc, + PingPong: pingPong, + TrafficRouting: &v1alpha1.RolloutTrafficRouting{ + ALB: &v1alpha1.ALBTrafficRouting{ + Ingress: stableIng, + ServicePort: port, + }, + Istio: &v1alpha1.IstioTrafficRouting{ + VirtualService: &v1alpha1.IstioVirtualService{ + Name: "istio-vsvc", + }, + DestinationRule: &v1alpha1.IstioDestinationRule{ + Name: "istio-destrule", + CanarySubsetName: "canary", + StableSubsetName: "stable", + }, + }, + }, + }, + }, + }, + } +} + +func TestGetStableAndCanaryServices(t *testing.T) { + // Rollout has no pingPong + rollout := fakeRollout("stable-service", "canary-service", nil, "stable-ingress", 443) + + stableService, canaryService := GetStableAndCanaryServices(rollout, true) + assert.Equal(t, "stable-service", stableService) + assert.Equal(t, "canary-service", canaryService) + + stableService, canaryService = GetStableAndCanaryServices(rollout, false) + assert.Equal(t, "stable-service", stableService) + assert.Equal(t, "canary-service", canaryService) + + // Rollout has pingPong and stable/canary + pp := &v1alpha1.PingPongSpec{PingService: PING_SVC, PongService: PONG_SVC} + rollout = fakeRollout("stable-service", "canary-service", pp, "stable-ingress", 443) + + stableService, canaryService = GetStableAndCanaryServices(rollout, true) + assert.Equal(t, PONG_SVC, stableService) + assert.Equal(t, PING_SVC, canaryService) + + stableService, canaryService = GetStableAndCanaryServices(rollout, false) + assert.Equal(t, "stable-service", stableService) + assert.Equal(t, "canary-service", canaryService) + + // Rollout has pingPong, no stable/canary + rollout = fakeRollout("", "", pp, "stable-ingress", 443) + + stableService, canaryService = GetStableAndCanaryServices(rollout, true) + assert.Equal(t, PONG_SVC, stableService) + assert.Equal(t, PING_SVC, canaryService) + + stableService, canaryService = GetStableAndCanaryServices(rollout, false) + assert.Equal(t, PONG_SVC, stableService) + assert.Equal(t, PING_SVC, canaryService) +} diff --git a/test/e2e/aws_test.go b/test/e2e/aws_test.go index dab037e395..fcbb1a2ef5 100644 --- a/test/e2e/aws_test.go +++ b/test/e2e/aws_test.go @@ -94,6 +94,71 @@ func (s *AWSSuite) TestALBPingPongUpdate() { Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)) } +// Rollout uses both alb and mesh for trafficRouting. +// also uses both pingpong service and stable/canary services +// Expecting: * alb is using pingpong +// - mesh is using stable/canary +func (s *AWSSuite) TestALBMesh_PingPong_StableCanary_Update() { + s.Given(). + RolloutObjects("@functional/albmesh-pingpong-stablecanary-rollout.yaml"). + When().ApplyManifests().WaitForRolloutStatus("Healthy"). + Then(). + Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[1].Weight) + assert.Equal(s.T(), "stable-service", vsvc.Spec.HTTP[0].Route[0].Destination.Host) + assert.Equal(s.T(), "canary-service", vsvc.Spec.HTTP[0].Route[1].Destination.Host) + }). + // Update 1. Test the weight switch from ping => pong + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + Assert(assertWeights(s, "ping-service", "pong-service", 75, 25)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(75), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(25), vsvc.Spec.HTTP[0].Route[1].Weight) + assert.Equal(s.T(), "stable-service", vsvc.Spec.HTTP[0].Route[0].Destination.Host) + assert.Equal(s.T(), "canary-service", vsvc.Spec.HTTP[0].Route[1].Destination.Host) + }). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + Assert(assertWeights(s, "ping-service", "pong-service", 0, 100)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[1].Weight) + assert.Equal(s.T(), "stable-service", vsvc.Spec.HTTP[0].Route[0].Destination.Host) + assert.Equal(s.T(), "canary-service", vsvc.Spec.HTTP[0].Route[1].Destination.Host) + }). + // Update 2. Test the weight switch from pong => ping + When().UpdateSpec(). + WaitForRolloutCanaryStepIndex(1).Sleep(1 * time.Second).Then(). + Assert(assertWeights(s, "ping-service", "pong-service", 25, 75)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(75), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(25), vsvc.Spec.HTTP[0].Route[1].Weight) + assert.Equal(s.T(), "stable-service", vsvc.Spec.HTTP[0].Route[0].Destination.Host) + assert.Equal(s.T(), "canary-service", vsvc.Spec.HTTP[0].Route[1].Destination.Host) + }). + When().PromoteRollout(). + WaitForRolloutStatus("Healthy"). + Sleep(1 * time.Second). + Then(). + Assert(assertWeights(s, "ping-service", "pong-service", 100, 0)). + Assert(func(t *fixtures.Then) { + vsvc := t.GetVirtualService() + assert.Equal(s.T(), int64(100), vsvc.Spec.HTTP[0].Route[0].Weight) + assert.Equal(s.T(), int64(0), vsvc.Spec.HTTP[0].Route[1].Weight) + assert.Equal(s.T(), "stable-service", vsvc.Spec.HTTP[0].Route[0].Destination.Host) + assert.Equal(s.T(), "canary-service", vsvc.Spec.HTTP[0].Route[1].Destination.Host) + }) +} + func (s *AWSSuite) TestALBPingPongUpdateMultiIngress() { s.Given(). RolloutObjects("@functional/alb-pingpong-multi-ingress-rollout.yaml"). diff --git a/test/e2e/functional/albmesh-pingpong-stablecanary-rollout.yaml b/test/e2e/functional/albmesh-pingpong-stablecanary-rollout.yaml new file mode 100644 index 0000000000..0476b1076e --- /dev/null +++ b/test/e2e/functional/albmesh-pingpong-stablecanary-rollout.yaml @@ -0,0 +1,139 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: ping-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary +--- +apiVersion: v1 +kind: Service +metadata: + name: pong-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary +--- +--- +apiVersion: v1 +kind: Service +metadata: + name: stable-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary +--- +apiVersion: v1 +kind: Service +metadata: + name: canary-service +spec: + type: NodePort + ports: + - port: 80 + targetPort: http + protocol: TCP + name: http + selector: + app: alb-canary +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: alb-canary-ingress + annotations: + kubernetes.io/ingress.class: alb +spec: + rules: + - http: + paths: + - path: /* + backend: + service: + name: alb-rollout-root + port: + name: use-annotation + pathType: ImplementationSpecific +--- +apiVersion: argoproj.io/v1alpha1 +kind: Rollout +metadata: + name: alb-canary +spec: + replicas: 2 + selector: + matchLabels: + app: alb-canary + template: + metadata: + labels: + app: alb-canary + spec: + containers: + - name: alb-canary + image: "argoproj/rollouts-demo:red" + ports: + - name: http + containerPort: 80 + protocol: TCP + resources: + requests: + memory: 16Mi + cpu: 5m + strategy: + canary: + scaleDownDelaySeconds: 2 + canaryService: canary-service + stableService: stable-service + pingPong: + pingService: ping-service + pongService: pong-service + trafficRouting: + alb: + ingress: alb-canary-ingress + rootService: alb-rollout-root + servicePort: 80 + istio: + virtualService: + name: istio-host-split-vsvc + routes: + - primary + steps: + - setWeight: 25 + - pause: {} +--- +apiVersion: networking.istio.io/v1alpha3 +kind: VirtualService +metadata: + name: istio-host-split-vsvc +spec: + hosts: + - istio-host-split + http: + - name: primary + route: + - destination: + host: stable-service + weight: 100 + - destination: + host: canary-service + weight: 0 From 693799656bbf22017dceb8a17d5d2ec1ef42ae8b Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Wed, 12 Jun 2024 12:11:22 -0500 Subject: [PATCH 260/264] fix: verify the weight of the alb at the end of the rollout (#3627) * fix: verify the weight of the alb at the end of the rollout when we auto set max weight Signed-off-by: Zach Aller * add unit test Signed-off-by: Zach Aller * refactor add unit test Signed-off-by: Zach Aller * Trigger Build Signed-off-by: Zach Aller * Trigger Build Signed-off-by: Zach Aller * block reconcile Signed-off-by: Zach Aller * add tests Signed-off-by: Zach Aller * rename test and cleanup un-need logic check Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- rollout/trafficrouting.go | 6 ++++ rollout/trafficrouting/alb/alb.go | 2 +- rollout/trafficrouting/alb/alb_test.go | 43 +++++++++++++++++++++++ rollout/trafficrouting_test.go | 47 ++++++++++++++++++++++++++ utils/rollout/rolloututil.go | 10 +++--- utils/rollout/rolloututil_test.go | 12 +++++-- 6 files changed, 112 insertions(+), 8 deletions(-) diff --git a/rollout/trafficrouting.go b/rollout/trafficrouting.go index f8b01951a4..e992277a57 100644 --- a/rollout/trafficrouting.go +++ b/rollout/trafficrouting.go @@ -288,6 +288,12 @@ func (c *rolloutContext) reconcileTrafficRouting() error { } else { c.log.Infof("Desired weight (stepIdx: %s) %d not yet verified", indexString, desiredWeight) c.enqueueRolloutAfter(c.rollout, defaults.GetRolloutVerifyRetryInterval()) + // At the end of the rollout we need to verify the weight is correct, and return an error if not because we don't want the rest of the + // reconcile process to continue. We don't need to do this if we are in the middle of the rollout because the rest of the reconcile + // process won't scale down the old replicasets yet due to being in the middle of some steps. + if desiredWeight == weightutil.MaxTrafficWeight(c.rollout) && len(c.rollout.Spec.Strategy.Canary.Steps) >= int(*c.rollout.Status.CurrentStepIndex) { + return fmt.Errorf("end of rollout, desired weight %d not yet verified", desiredWeight) + } } } } diff --git a/rollout/trafficrouting/alb/alb.go b/rollout/trafficrouting/alb/alb.go index 992f808fe7..0a053857d6 100644 --- a/rollout/trafficrouting/alb/alb.go +++ b/rollout/trafficrouting/alb/alb.go @@ -202,7 +202,7 @@ func (r *Reconciler) VerifyWeight(desiredWeight int32, additionalDestinations .. return nil, nil } - if !rolloututil.ShouldVerifyWeight(r.cfg.Rollout) { + if !rolloututil.ShouldVerifyWeight(r.cfg.Rollout, desiredWeight) { // If we should not verify weight but the ALB status has not been set yet due to a Rollout resource just being // installed in the cluster we want to actually run the rest of the function, so we do not return if // r.cfg.Rollout.Status.ALB is nil. However, if we should not verify, and we have already updated the status once diff --git a/rollout/trafficrouting/alb/alb_test.go b/rollout/trafficrouting/alb/alb_test.go index fb131849d4..faa798e524 100644 --- a/rollout/trafficrouting/alb/alb_test.go +++ b/rollout/trafficrouting/alb/alb_test.go @@ -918,6 +918,7 @@ func TestVerifyWeight(t *testing.T) { { var status v1alpha1.RolloutStatus r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ { LoadBalancerName: pointer.StringPtr("lb-abc123-name"), @@ -955,6 +956,48 @@ func TestVerifyWeight(t *testing.T) { assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) } + // LoadBalancer found, at max weight, end of rollout + { + var status v1alpha1.RolloutStatus + status.CurrentStepIndex = pointer.Int32Ptr(2) + r, fakeClient := newFakeReconciler(&status) + fakeClient.loadBalancers = []*elbv2types.LoadBalancer{ + { + LoadBalancerName: pointer.StringPtr("lb-abc123-name"), + LoadBalancerArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/lb-abc123-name/1234567890123456"), + DNSName: pointer.StringPtr("verify-weight-test-abc-123.us-west-2.elb.amazonaws.com"), + }, + } + fakeClient.targetGroups = []aws.TargetGroupMeta{ + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("canary-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/canary-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(100), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-canary-svc:443", + }, + }, + { + TargetGroup: elbv2types.TargetGroup{ + TargetGroupName: pointer.StringPtr("stable-tg-abc123-name"), + TargetGroupArn: pointer.StringPtr("arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/stable-tg-abc123-name/1234567890123456"), + }, + Weight: pointer.Int32Ptr(0), + Tags: map[string]string{ + aws.AWSLoadBalancerV2TagKeyResourceID: "default/ingress-stable-svc:443", + }, + }, + } + + weightVerified, err := r.VerifyWeight(100) + assert.NoError(t, err) + assert.True(t, *weightVerified) + assert.Equal(t, status.ALBs[0], *status.ALB) + assert.Equal(t, *status.ALB, *fakeClient.getAlbStatus("ingress")) + } + // LoadBalancer found, but ARNs are unparsable { var status v1alpha1.RolloutStatus diff --git a/rollout/trafficrouting_test.go b/rollout/trafficrouting_test.go index f7dd459964..f358a18f64 100644 --- a/rollout/trafficrouting_test.go +++ b/rollout/trafficrouting_test.go @@ -130,6 +130,53 @@ func TestReconcileTrafficRoutingVerifyWeightFalse(t *testing.T) { assert.True(t, enqueued) } +func TestReconcileTrafficRoutingVerifyWeightEndOfRollout(t *testing.T) { + f := newFixture(t) + defer f.Close() + + steps := []v1alpha1.CanaryStep{ + { + SetWeight: pointer.Int32Ptr(10), + }, + { + Pause: &v1alpha1.RolloutPause{}, + }, + } + r1 := newCanaryRollout("foo", 10, nil, steps, pointer.Int32Ptr(2), intstr.FromInt(1), intstr.FromInt(0)) + r2 := bumpVersion(r1) + r2.Spec.Strategy.Canary.TrafficRouting = &v1alpha1.RolloutTrafficRouting{} + r2.Spec.Strategy.Canary.CanaryService = "canary" + r2.Spec.Strategy.Canary.StableService = "stable" + + rs1 := newReplicaSetWithStatus(r1, 10, 10) + rs2 := newReplicaSetWithStatus(r2, 10, 10) + + rs1PodHash := rs1.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + rs2PodHash := rs2.Labels[v1alpha1.DefaultRolloutUniqueLabelKey] + canarySelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs2PodHash} + stableSelector := map[string]string{v1alpha1.DefaultRolloutUniqueLabelKey: rs1PodHash} + canarySvc := newService("canary", 80, canarySelector, r2) + stableSvc := newService("stable", 80, stableSelector, r2) + + f.kubeobjects = append(f.kubeobjects, rs1, rs2, canarySvc, stableSvc) + f.replicaSetLister = append(f.replicaSetLister, rs1, rs2) + + r2 = updateCanaryRolloutStatus(r2, rs1PodHash, 10, 0, 10, false) + f.rolloutLister = append(f.rolloutLister, r2) + f.objects = append(f.objects, r2) + + f.fakeTrafficRouting = newUnmockedFakeTrafficRoutingReconciler() + f.fakeTrafficRouting.On("UpdateHash", mock.Anything, mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("SetWeight", mock.Anything, mock.Anything).Return(func(desiredWeight int32, additionalDestinations ...v1alpha1.WeightDestination) error { + // make sure SetWeight was called with correct value + assert.Equal(t, int32(100), desiredWeight) + return nil + }) + f.fakeTrafficRouting.On("SetHeaderRoute", mock.Anything, mock.Anything).Return(nil) + f.fakeTrafficRouting.On("VerifyWeight", mock.Anything).Return(pointer.BoolPtr(false), nil) + f.runExpectError(getKey(r2, t), true) +} + func TestRolloutUseDesiredWeight(t *testing.T) { f := newFixture(t) defer f.Close() diff --git a/utils/rollout/rolloututil.go b/utils/rollout/rolloututil.go index 0b7df7ff38..5411f3f58c 100644 --- a/utils/rollout/rolloututil.go +++ b/utils/rollout/rolloututil.go @@ -4,6 +4,8 @@ import ( "fmt" "strconv" + "github.com/argoproj/argo-rollouts/utils/weightutil" + replicasetutil "github.com/argoproj/argo-rollouts/utils/replicaset" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -184,13 +186,13 @@ func CanaryStepString(c v1alpha1.CanaryStep) string { // ShouldVerifyWeight We use this to test if we should verify weights because weight verification could involve // API calls to the cloud provider which could incur rate limiting -func ShouldVerifyWeight(ro *v1alpha1.Rollout) bool { +func ShouldVerifyWeight(ro *v1alpha1.Rollout, desiredWeight int32) bool { currentStep, _ := replicasetutil.GetCurrentCanaryStep(ro) // If we are in the middle of an update at a setWeight step, also perform weight verification. // Note that we don't do this every reconciliation because weight verification typically involves // API calls to the cloud provider which could incur rate limitingq - shouldVerifyWeight := ro.Status.StableRS != "" && - !IsFullyPromoted(ro) && - currentStep != nil && currentStep.SetWeight != nil + shouldVerifyWeight := (ro.Status.StableRS != "" && !IsFullyPromoted(ro) && currentStep != nil && currentStep.SetWeight != nil) || + (ro.Status.StableRS != "" && !IsFullyPromoted(ro) && currentStep == nil && desiredWeight == weightutil.MaxTrafficWeight(ro)) // We are at end of rollout + return shouldVerifyWeight } diff --git a/utils/rollout/rolloututil_test.go b/utils/rollout/rolloututil_test.go index 37c1810f00..d88f080f64 100644 --- a/utils/rollout/rolloututil_test.go +++ b/utils/rollout/rolloututil_test.go @@ -422,15 +422,21 @@ func TestShouldVerifyWeight(t *testing.T) { ro.Spec.Strategy.Canary.Steps = []v1alpha1.CanaryStep{{ SetWeight: pointer.Int32Ptr(20), }} - assert.Equal(t, true, ShouldVerifyWeight(ro)) + assert.Equal(t, true, ShouldVerifyWeight(ro, 20)) ro.Status.StableRS = "" - assert.Equal(t, false, ShouldVerifyWeight(ro)) + assert.Equal(t, false, ShouldVerifyWeight(ro, 20)) ro.Status.StableRS = "34feab23f" ro.Status.CurrentStepIndex = nil ro.Spec.Strategy.Canary.Steps = nil - assert.Equal(t, false, ShouldVerifyWeight(ro)) + assert.Equal(t, false, ShouldVerifyWeight(ro, 20)) + + // Test when the weight is 100, because we are at end of rollout + ro.Status.StableRS = "34feab23f" + ro.Status.CurrentStepIndex = nil + ro.Spec.Strategy.Canary.Steps = nil + assert.Equal(t, true, ShouldVerifyWeight(ro, 100)) } func Test_isGenerationObserved(t *testing.T) { From 0e304fbbad2ef62a91a7a4973b3e3a7c4e76a582 Mon Sep 17 00:00:00 2001 From: Tommy Chen Date: Mon, 17 Jun 2024 22:14:28 +0800 Subject: [PATCH 261/264] fix: Add volume for plugin and tmp folder (#3546) Signed-off-by: Tommy Chen --- manifests/base/argo-rollouts-deployment.yaml | 13 +++++++++++++ manifests/install.yaml | 13 +++++++++++++ manifests/namespace-install.yaml | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/manifests/base/argo-rollouts-deployment.yaml b/manifests/base/argo-rollouts-deployment.yaml index 046a1a0bba..285617fde4 100644 --- a/manifests/base/argo-rollouts-deployment.yaml +++ b/manifests/base/argo-rollouts-deployment.yaml @@ -52,7 +52,20 @@ spec: readOnlyRootFilesystem: true seccompProfile: type: RuntimeDefault + resources: + limits: + ephemeral-storage: 1Gi + volumeMounts: + - name: plugin-bin + mountPath: /home/argo-rollouts/plugin-bin + - name: tmp + mountPath: /tmp securityContext: runAsNonRoot: true + volumes: + - name: plugin-bin + emptyDir: {} + - name: tmp + emptyDir: {} strategy: type: RollingUpdate diff --git a/manifests/install.yaml b/manifests/install.yaml index 1b5013ef4a..6063161feb 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -16757,6 +16757,9 @@ spec: periodSeconds: 5 successThreshold: 1 timeoutSeconds: 4 + resources: + limits: + ephemeral-storage: 1Gi securityContext: allowPrivilegeEscalation: false capabilities: @@ -16765,6 +16768,16 @@ spec: readOnlyRootFilesystem: true seccompProfile: type: RuntimeDefault + volumeMounts: + - mountPath: /home/argo-rollouts/plugin-bin + name: plugin-bin + - mountPath: /tmp + name: tmp securityContext: runAsNonRoot: true serviceAccountName: argo-rollouts + volumes: + - emptyDir: {} + name: plugin-bin + - emptyDir: {} + name: tmp diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 0a7adf80ed..3f0dffa29b 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -413,6 +413,9 @@ spec: periodSeconds: 5 successThreshold: 1 timeoutSeconds: 4 + resources: + limits: + ephemeral-storage: 1Gi securityContext: allowPrivilegeEscalation: false capabilities: @@ -421,6 +424,16 @@ spec: readOnlyRootFilesystem: true seccompProfile: type: RuntimeDefault + volumeMounts: + - mountPath: /home/argo-rollouts/plugin-bin + name: plugin-bin + - mountPath: /tmp + name: tmp securityContext: runAsNonRoot: true serviceAccountName: argo-rollouts + volumes: + - emptyDir: {} + name: plugin-bin + - emptyDir: {} + name: tmp From e472955b3a38152431f7336173e27cb4196bbea6 Mon Sep 17 00:00:00 2001 From: Zach Aller Date: Mon, 17 Jun 2024 11:09:11 -0500 Subject: [PATCH 262/264] fix: don't default datadog aggregator (#3643) * fix: don't default datadog aggregator Signed-off-by: Zach Aller * codegen Signed-off-by: Zach Aller * fix: don't default datadog aggregator Signed-off-by: Zach Aller --------- Signed-off-by: Zach Aller --- docs/features/kustomize/rollout_cr_schema.json | 3 --- manifests/crds/analysis-run-crd.yaml | 1 - manifests/crds/analysis-template-crd.yaml | 1 - manifests/crds/cluster-analysis-template-crd.yaml | 1 - manifests/install.yaml | 3 --- metricproviders/datadog/datadog_test.go | 6 ------ pkg/apiclient/rollout/rollout.swagger.json | 2 +- pkg/apis/rollouts/v1alpha1/analysis_types.go | 3 +-- pkg/apis/rollouts/v1alpha1/generated.proto | 3 +-- pkg/apis/rollouts/v1alpha1/openapi_generated.go | 2 +- 10 files changed, 4 insertions(+), 21 deletions(-) diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 038ebebf89..b7ca35204f 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -244,7 +244,6 @@ "datadog": { "properties": { "aggregator": { - "default": "last", "enum": [ "avg", "min", @@ -5082,7 +5081,6 @@ "datadog": { "properties": { "aggregator": { - "default": "last", "enum": [ "avg", "min", @@ -9933,7 +9931,6 @@ "datadog": { "properties": { "aggregator": { - "default": "last", "enum": [ "avg", "min", diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index c0199f2de2..04539115a5 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -179,7 +179,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index aaf34277bd..ffb0da24c3 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -175,7 +175,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index ed75ada312..444d46fcaa 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -175,7 +175,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min diff --git a/manifests/install.yaml b/manifests/install.yaml index 6063161feb..f47baa477d 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -180,7 +180,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min @@ -3470,7 +3469,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min @@ -6638,7 +6636,6 @@ spec: datadog: properties: aggregator: - default: last enum: - avg - min diff --git a/metricproviders/datadog/datadog_test.go b/metricproviders/datadog/datadog_test.go index fe817f385e..ed81977296 100644 --- a/metricproviders/datadog/datadog_test.go +++ b/metricproviders/datadog/datadog_test.go @@ -66,12 +66,6 @@ func TestDatadogSpecDefaults(t *testing.T) { assert.Equal(t, "\"l2norm\"", string(aggregatorEnums[7].Raw), "\"l2norm\" expected, got %s", string(aggregatorEnums[7].Raw)) assert.Equal(t, "\"area\"", string(aggregatorEnums[8].Raw), "\"area\" expected, got %s", string(aggregatorEnums[8].Raw)) }) - - t.Run("aggregator: Validate default is last", func(t *testing.T) { - defaultAggregator := string(ddSpec.Properties["aggregator"].Default.Raw) - assert.Equal(t, "\"last\"", defaultAggregator, "Default aggregator should be \"last\" ") - }) - } func TestValidateIncomingProps(t *testing.T) { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index b3c10e03f8..3a74f48a24 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1205,7 +1205,7 @@ }, "aggregator": { "type": "string", - "title": "+kubebuilder:default=\"last\"\n+kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area\nAggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2" + "title": "+kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area\nAggregator is a type of aggregator to use for metrics-based queries (default: \"\"). Used for v2" } } }, diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 08ef18071f..3a287ec856 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -601,8 +601,7 @@ type DatadogMetric struct { // +kubebuilder:validation:Enum=v1;v2 // +kubebuilder:default=v1 ApiVersion string `json:"apiVersion,omitempty" protobuf:"bytes,5,opt,name=apiVersion"` - // +kubebuilder:default="last" // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area - // Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2 + // Aggregator is a type of aggregator to use for metrics-based queries (default: ""). Used for v2 Aggregator string `json:"aggregator,omitempty" protobuf:"bytes,6,opt,name=aggregator"` } diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 0ea0a7bc2c..eebb4453cc 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -655,9 +655,8 @@ message DatadogMetric { // +kubebuilder:default=v1 optional string apiVersion = 5; - // +kubebuilder:default="last" // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area - // Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2 + // Aggregator is a type of aggregator to use for metrics-based queries (default: ""). Used for v2 optional string aggregator = 6; } diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index 2d4d68ff1e..6c18e64a2b 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -1935,7 +1935,7 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac }, "aggregator": { SchemaProps: spec.SchemaProps{ - Description: "Aggregator is a type of aggregator to use for metrics-based queries (default: last). Used for v2", + Description: "Aggregator is a type of aggregator to use for metrics-based queries (default: \"\"). Used for v2", Type: []string{"string"}, Format: "", }, From 6a99ea9908e8f1e816ccd71e4c35adbbbbdd5f6c Mon Sep 17 00:00:00 2001 From: yyzxw <34639446+yyzxw@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:30:01 +0800 Subject: [PATCH 263/264] fix: docs site version selector broken (#3590) Signed-off-by: xiaowu.zhu Signed-off-by: root --- docs/assets/versions.js | 76 ++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/docs/assets/versions.js b/docs/assets/versions.js index 1336443d1a..fe0aeb1d3c 100644 --- a/docs/assets/versions.js +++ b/docs/assets/versions.js @@ -1,15 +1,40 @@ -setTimeout(function() { - const callbackName = 'callback_' + new Date().getTime(); - window[callbackName] = function (response) { - const div = document.createElement('div'); - div.innerHTML = response.html; - document.querySelector(".md-header__inner > .md-header__title").appendChild(div); - const container = div.querySelector('.rst-versions'); - var caret = document.createElement('div'); - caret.innerHTML = "" - caret.classList.add('dropdown-caret') - div.querySelector('.rst-current-version').appendChild(caret); +const targetNode = document.querySelector('.md-header__inner'); +const observerOptions = { + childList: true, + subtree: true +}; + +const observerCallback = function(mutationsList, observer) { + for (let mutation of mutationsList) { + if (mutation.type === 'childList') { + const titleElement = document.querySelector('.md-header__inner > .md-header__title'); + if (titleElement) { + initializeVersionDropdown(); + observer.disconnect(); + } + } } +}; + +const observer = new MutationObserver(observerCallback); +observer.observe(targetNode, observerOptions); + +function initializeVersionDropdown() { + const callbackName = 'callback_' + new Date().getTime(); + window[callbackName] = function(response) { + const div = document.createElement('div'); + div.innerHTML = response.html; + document.querySelector(".md-header__inner > .md-header__title").appendChild(div); + const container = div.querySelector('.rst-versions'); + var caret = document.createElement('div'); + caret.innerHTML = ""; + caret.classList.add('dropdown-caret'); + div.querySelector('.rst-current-version').appendChild(caret); + + div.querySelector('.rst-current-version').addEventListener('click', function() { + container.classList.toggle('shift-up'); + }); + }; var CSSLink = document.createElement('link'); CSSLink.rel='stylesheet'; @@ -20,6 +45,31 @@ setTimeout(function() { script.src = 'https://argo-rollouts.readthedocs.io/_/api/v2/footer_html/?'+ 'callback=' + callbackName + '&project=argo-rollouts&page=&theme=mkdocs&format=jsonp&docroot=docs&source_suffix=.md&version=' + (window['READTHEDOCS_DATA'] || { version: 'latest' }).version; document.getElementsByTagName('head')[0].appendChild(script); -}, 0); - +} +// VERSION WARNINGS +window.addEventListener("DOMContentLoaded", function() { + var currentVersion = window.location.href.match(/\/en\/(release-(?:v\d+|\w+)|latest|stable)\//); + var margin = 30; + var headerHeight = document.getElementsByClassName("md-header")[0].offsetHeight; + if (currentVersion && currentVersion.length > 1) { + currentVersion = currentVersion[1]; + if (currentVersion === "latest") { + document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for an unreleased version of Argo Rollouts, click here to go to the latest stable version.
    "; + var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; + document.querySelector("header.md-header").style.top = bannerHeight + "px"; + document.querySelector('style').textContent += + "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + document.querySelector('style').textContent += + "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + } else if (currentVersion !== "stable") { + document.querySelector("div[data-md-component=announce]").innerHTML = "
    You are viewing the docs for a previous version of Argo Rollouts, click here to go to the latest stable version.
    "; + var bannerHeight = document.getElementById('announce-msg').offsetHeight + margin; + document.querySelector("header.md-header").style.top = bannerHeight + "px"; + document.querySelector('style').textContent += + "@media screen and (min-width: 76.25em){ .md-sidebar { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + document.querySelector('style').textContent += + "@media screen and (min-width: 60em){ .md-sidebar--secondary { height: 0; top:" + (bannerHeight + headerHeight) + "px !important; }}"; + } + } +}); \ No newline at end of file From 6ebc7e17759f020aedf1e171d48daf9be56604f1 Mon Sep 17 00:00:00 2001 From: Denys Melnyk Date: Fri, 26 Jul 2024 14:39:48 +0300 Subject: [PATCH 264/264] bump --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 40bdab01a0..14e453023c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.6.1-CR-23199 +v1.7.1-CR-24605 \ No newline at end of file