From b224ea013dd35a0cfd01331913e4bd9cc84502c4 Mon Sep 17 00:00:00 2001 From: Orel Misan Date: Tue, 11 Jul 2023 22:32:05 +0300 Subject: [PATCH] Update kubevirt.io/client-go to v1.0.0 Currently, we are using kubevirt.io/client-go@v0.58.0. Update to v1.0.0 in order to: 1. Take advantage of context.Context parameter that was added to VMI methods. 2. Eliminate the following warning from the checkup's logs: ``` W0702 08:56:11.138067 1 warnings.go:70] kubevirt.io/v1alpha3 is now deprecated and will be removed in a future release. ``` Signed-off-by: Orel Misan --- go.mod | 81 +- go.sum | 664 +- pkg/internal/client/client.go | 47 +- .../pkg/apis/monitoring/v1/bindata.go | 12 +- .../pkg/apis/monitoring/v1/thanos_types.go | 6 +- .../pkg/apis/monitoring/v1/types.go | 76 +- .../monitoring/v1/zz_generated.deepcopy.go | 83 +- .../emicklei/go-restful/v3/.gitignore | 71 + .../emicklei/go-restful/v3/.goconvey | 1 + .../emicklei/go-restful/v3/.travis.yml | 13 + .../emicklei/go-restful/v3/CHANGES.md | 376 + .../github.com/emicklei/go-restful/v3/LICENSE | 22 + .../emicklei/go-restful/v3/Makefile | 8 + .../emicklei/go-restful/v3/README.md | 111 + .../emicklei/go-restful/v3/SECURITY.md | 13 + .../github.com/emicklei/go-restful/v3/Srcfile | 1 + .../emicklei/go-restful/v3/bench_test.sh | 10 + .../emicklei/go-restful/v3/compress.go | 127 + .../go-restful/v3/compressor_cache.go | 103 + .../go-restful/v3/compressor_pools.go | 91 + .../emicklei/go-restful/v3/compressors.go | 54 + .../emicklei/go-restful/v3/constants.go | 30 + .../emicklei/go-restful/v3/container.go | 450 + .../emicklei/go-restful/v3/cors_filter.go | 193 + .../emicklei/go-restful/v3/coverage.sh | 2 + .../emicklei/go-restful/v3/curly.go | 173 + .../emicklei/go-restful/v3/curly_route.go | 54 + .../emicklei/go-restful/v3/custom_verb.go | 29 + .../github.com/emicklei/go-restful/v3/doc.go | 185 + .../go-restful/v3/entity_accessors.go | 162 + .../emicklei/go-restful/v3/extensions.go | 21 + .../emicklei/go-restful/v3/filter.go | 37 + .../emicklei/go-restful/v3/filter_adapter.go | 21 + .../github.com/emicklei/go-restful/v3/json.go | 11 + .../emicklei/go-restful/v3/jsoniter.go | 12 + .../emicklei/go-restful/v3/jsr311.go | 326 + .../emicklei/go-restful/v3/log/log.go | 34 + .../emicklei/go-restful/v3/logger.go | 32 + .../github.com/emicklei/go-restful/v3/mime.go | 50 + .../emicklei/go-restful/v3/options_filter.go | 34 + .../emicklei/go-restful/v3/parameter.go | 242 + .../emicklei/go-restful/v3/path_expression.go | 74 + .../emicklei/go-restful/v3/path_processor.go | 74 + .../emicklei/go-restful/v3/request.go | 132 + .../emicklei/go-restful/v3/response.go | 256 + .../emicklei/go-restful/v3/route.go | 178 + .../emicklei/go-restful/v3/route_builder.go | 376 + .../emicklei/go-restful/v3/route_reader.go | 66 + .../emicklei/go-restful/v3/router.go | 20 + .../emicklei/go-restful/v3/service_error.go | 32 + .../emicklei/go-restful/v3/web_service.go | 305 + .../go-restful/v3/web_service_container.go | 39 + .../github.com/go-kit/kit/log/json_logger.go | 4 +- .../github.com/go-logfmt/logfmt/.travis.yml | 18 - vendor/github.com/go-logfmt/logfmt/README.md | 66 +- vendor/github.com/go-logr/logr/.golangci.yaml | 3 - vendor/github.com/go-logr/logr/discard.go | 32 +- vendor/github.com/go-logr/logr/funcr/funcr.go | 27 +- vendor/github.com/go-logr/logr/logr.go | 166 +- .../go-openapi/jsonpointer/.editorconfig | 26 + .../go-openapi/jsonpointer/.gitignore | 1 + .../go-openapi/jsonpointer/CODE_OF_CONDUCT.md | 74 + .../github.com/go-openapi/jsonpointer/LICENSE | 202 + .../go-openapi/jsonpointer/README.md | 15 + .../go-openapi/jsonpointer/pointer.go | 390 + .../go-openapi/jsonreference/.gitignore | 1 + .../go-openapi/jsonreference/.golangci.yml | 50 + .../jsonreference/CODE_OF_CONDUCT.md | 74 + .../go-openapi/jsonreference/LICENSE | 202 + .../go-openapi/jsonreference/README.md | 15 + .../jsonreference/internal/normalize_url.go | 64 + .../go-openapi/jsonreference/reference.go | 158 + .../github.com/go-openapi/swag/.editorconfig | 26 + .../github.com/go-openapi/swag/.gitattributes | 2 + vendor/github.com/go-openapi/swag/.gitignore | 4 + .../github.com/go-openapi/swag/.golangci.yml | 54 + .../go-openapi/swag/CODE_OF_CONDUCT.md | 74 + vendor/github.com/go-openapi/swag/LICENSE | 202 + vendor/github.com/go-openapi/swag/README.md | 21 + vendor/github.com/go-openapi/swag/convert.go | 208 + .../go-openapi/swag/convert_types.go | 730 ++ vendor/github.com/go-openapi/swag/doc.go | 31 + vendor/github.com/go-openapi/swag/file.go | 33 + vendor/github.com/go-openapi/swag/json.go | 312 + vendor/github.com/go-openapi/swag/loading.go | 121 + .../github.com/go-openapi/swag/name_lexem.go | 87 + vendor/github.com/go-openapi/swag/net.go | 38 + vendor/github.com/go-openapi/swag/path.go | 59 + .../github.com/go-openapi/swag/post_go18.go | 24 + .../github.com/go-openapi/swag/post_go19.go | 68 + vendor/github.com/go-openapi/swag/pre_go18.go | 24 + vendor/github.com/go-openapi/swag/pre_go19.go | 70 + vendor/github.com/go-openapi/swag/split.go | 262 + vendor/github.com/go-openapi/swag/util.go | 386 + vendor/github.com/go-openapi/swag/yaml.go | 450 + vendor/github.com/golang/mock/gomock/call.go | 54 +- .../github.com/golang/mock/gomock/callset.go | 3 +- .../golang/mock/gomock/controller.go | 5 +- .../github.com/golang/mock/gomock/matchers.go | 76 +- .../{googleapis => google}/gnostic/LICENSE | 0 .../gnostic/compiler/README.md | 0 .../gnostic/compiler/context.go | 0 .../gnostic/compiler/error.go | 0 .../gnostic/compiler/extensions.go | 3 +- .../gnostic/compiler/helpers.go | 3 +- .../gnostic/compiler/main.go | 0 .../gnostic/compiler/reader.go | 0 .../gnostic/extensions/README.md | 0 .../gnostic/extensions/extension.pb.go | 2 +- .../gnostic/extensions/extension.proto | 0 .../gnostic/extensions/extensions.go | 0 .../gnostic/jsonschema/README.md | 0 .../gnostic/jsonschema/base.go | 0 .../gnostic/jsonschema/display.go | 0 .../gnostic/jsonschema/models.go | 0 .../gnostic/jsonschema/operations.go | 0 .../gnostic/jsonschema/reader.go | 0 .../gnostic/jsonschema/schema.json | 0 .../gnostic/jsonschema/writer.go | 0 .../gnostic/openapiv2/OpenAPIv2.go | 6 +- .../gnostic/openapiv2/OpenAPIv2.pb.go | 2 +- .../gnostic/openapiv2/OpenAPIv2.proto | 0 .../gnostic/openapiv2/README.md | 0 .../gnostic/openapiv2/document.go | 3 +- .../gnostic/openapiv2/openapi-2.0.json | 0 .../google/gnostic/openapiv3/OpenAPIv3.go | 8633 +++++++++++++++++ .../google/gnostic/openapiv3/OpenAPIv3.pb.go | 8053 +++++++++++++++ .../google/gnostic/openapiv3/OpenAPIv3.proto | 672 ++ .../google/gnostic/openapiv3/README.md | 21 + .../google/gnostic/openapiv3/document.go | 42 + .../google/gnostic/openapiv3/openapi-3.0.json | 1251 +++ .../google/gnostic/openapiv3/openapi-3.1.json | 1250 +++ vendor/github.com/google/uuid/hash.go | 4 +- vendor/github.com/google/uuid/null.go | 118 + vendor/github.com/google/uuid/sql.go | 2 +- vendor/github.com/google/uuid/uuid.go | 55 +- vendor/github.com/google/uuid/version4.go | 35 +- vendor/github.com/imdario/mergo/.travis.yml | 3 + .../github.com/imdario/mergo/CONTRIBUTING.md | 112 + vendor/github.com/imdario/mergo/README.md | 54 +- vendor/github.com/imdario/mergo/SECURITY.md | 14 + vendor/github.com/imdario/mergo/map.go | 6 +- vendor/github.com/imdario/mergo/merge.go | 73 +- vendor/github.com/imdario/mergo/mergo.go | 15 +- vendor/github.com/josharian/intern/README.md | 5 + vendor/github.com/josharian/intern/intern.go | 44 + vendor/github.com/josharian/intern/license.md | 21 + vendor/github.com/mailru/easyjson/LICENSE | 7 + .../github.com/mailru/easyjson/buffer/pool.go | 278 + .../mailru/easyjson/jlexer/bytestostr.go | 24 + .../easyjson/jlexer/bytestostr_nounsafe.go | 13 + .../mailru/easyjson/jlexer/error.go | 15 + .../mailru/easyjson/jlexer/lexer.go | 1244 +++ .../mailru/easyjson/jwriter/writer.go | 405 + vendor/github.com/munnerz/goautoneg/LICENSE | 31 + vendor/github.com/munnerz/goautoneg/Makefile | 13 + .../github.com/munnerz/goautoneg/README.txt | 67 + .../github.com/munnerz/goautoneg/autoneg.go | 189 + ...rsion-operator_01_clusteroperator.crd.yaml | 137 + ...ersion-operator_01_clusterversion.crd.yaml | 435 + .../0000_03_config-operator_01_proxy.crd.yaml | 78 + ...rketplace-operator_01_operatorhub.crd.yaml | 84 + ...fig-operator_01_apiserver-Default.crd.yaml | 179 + ...01_apiserver-TechPreviewNoUpgrade.crd.yaml | 179 + ...config-operator_01_authentication.crd.yaml | 101 + .../0000_10_config-operator_01_build.crd.yaml | 290 + ...000_10_config-operator_01_console.crd.yaml | 57 + .../0000_10_config-operator_01_dns.crd.yaml | 72 + ...10_config-operator_01_featuregate.crd.yaml | 153 + .../0000_10_config-operator_01_image.crd.yaml | 108 + ...ig-operator_01_imagecontentpolicy.crd.yaml | 68 + ...-operator_01_imagedigestmirrorset.crd.yaml | 74 + ...fig-operator_01_imagetagmirrorset.crd.yaml | 74 + ...perator_01_infrastructure-Default.crd.yaml | 834 ++ ...r_01_infrastructure-Default.crd.yaml-patch | 24 + ...frastructure-TechPreviewNoUpgrade.crd.yaml | 905 ++ ...ucture-TechPreviewNoUpgrade.crd.yaml-patch | 24 + ...000_10_config-operator_01_ingress.crd.yaml | 334 + ...000_10_config-operator_01_network.crd.yaml | 163 + .../0000_10_config-operator_01_node.crd.yaml | 59 + .../0000_10_config-operator_01_oauth.crd.yaml | 444 + ...000_10_config-operator_01_project.crd.yaml | 55 + ...0_10_config-operator_01_scheduler.crd.yaml | 68 + .../openshift/api/config/v1/Makefile | 3 + .../github.com/openshift/api/config/v1/doc.go | 8 + .../openshift/api/config/v1/feature_gates.go | 185 + .../openshift/api/config/v1/register.go | 78 + .../config/v1/stable.apiserver.testsuite.yaml | 36 + .../v1/stable.authentication.testsuite.yaml | 14 + .../api/config/v1/stable.build.testsuite.yaml | 14 + .../v1/stable.clusteroperator.testsuite.yaml | 14 + .../v1/stable.clusterversion.testsuite.yaml | 138 + .../config/v1/stable.console.testsuite.yaml | 14 + .../api/config/v1/stable.dns.testsuite.yaml | 14 + .../v1/stable.featuregate.testsuite.yaml | 14 + .../api/config/v1/stable.image.testsuite.yaml | 14 + .../stable.imagecontentpolicy.testsuite.yaml | 14 + ...stable.imagedigestmirrorset.testsuite.yaml | 14 + .../stable.imagetagmirrorset.testsuite.yaml | 14 + .../v1/stable.infrastructure.testsuite.yaml | 476 + .../config/v1/stable.ingress.testsuite.yaml | 14 + .../config/v1/stable.network.testsuite.yaml | 14 + .../api/config/v1/stable.node.testsuite.yaml | 14 + .../api/config/v1/stable.oauth.testsuite.yaml | 14 + .../v1/stable.operatorhub.testsuite.yaml | 14 + .../config/v1/stable.project.testsuite.yaml | 14 + .../api/config/v1/stable.proxy.testsuite.yaml | 14 + .../config/v1/stable.scheduler.testsuite.yaml | 14 + .../openshift/api/config/v1/stringsource.go | 31 + .../v1/techpreview.apiserver.testsuite.yaml | 35 + .../techpreview.infrastructure.testsuite.yaml | 213 + .../openshift/api/config/v1/types.go | 400 + .../api/config/v1/types_apiserver.go | 221 + .../api/config/v1/types_authentication.go | 161 + .../openshift/api/config/v1/types_build.go | 127 + .../api/config/v1/types_cluster_operator.go | 216 + .../api/config/v1/types_cluster_version.go | 650 ++ .../openshift/api/config/v1/types_console.go | 75 + .../openshift/api/config/v1/types_dns.go | 98 + .../openshift/api/config/v1/types_feature.go | 283 + .../openshift/api/config/v1/types_image.go | 134 + .../config/v1/types_image_content_policy.go | 95 + .../v1/types_image_digest_mirror_set.go | 137 + .../config/v1/types_image_tag_mirror_set.go | 124 + .../api/config/v1/types_infrastructure.go | 1342 +++ .../openshift/api/config/v1/types_ingress.go | 334 + .../openshift/api/config/v1/types_network.go | 183 + .../openshift/api/config/v1/types_node.go | 114 + .../openshift/api/config/v1/types_oauth.go | 592 ++ .../api/config/v1/types_operatorhub.go | 91 + .../openshift/api/config/v1/types_project.go | 65 + .../openshift/api/config/v1/types_proxy.go | 105 + .../api/config/v1/types_scheduling.go | 111 + .../api/config/v1/types_tlssecurityprofile.go | 262 + .../api/config/v1/zz_generated.deepcopy.go | 5299 ++++++++++ .../v1/zz_generated.swagger_doc_generated.go | 2281 +++++ .../openshift/api/route/v1/Makefile | 3 + .../openshift/api/route/v1/generated.pb.go | 198 +- .../openshift/api/route/v1/generated.proto | 43 +- .../openshift/api/route/v1/route.crd.yaml | 298 + .../api/route/v1/route.crd.yaml-patch | 86 + .../api/route/v1/stable.route.testsuite.yaml | 22 + .../api/route/v1/test-route-validation.sh | 476 + .../openshift/api/route/v1/types.go | 76 +- .../api/route/v1/zz_generated.deepcopy.go | 1 + .../v1/zz_generated.swagger_doc_generated.go | 18 +- ...0000_03_security-openshift_01_scc.crd.yaml | 591 +- .../openshift/api/security/v1/Makefile | 3 + .../openshift/api/security/v1/generated.pb.go | 315 +- .../openshift/api/security/v1/generated.proto | 31 +- ....securitycontextconstraints.testsuite.yaml | 36 + .../openshift/api/security/v1/types.go | 37 +- .../api/security/v1/zz_generated.deepcopy.go | 1 + .../v1/zz_generated.swagger_doc_generated.go | 26 +- vendor/github.com/pborman/uuid/time.go | 2 +- vendor/github.com/pborman/uuid/version4.go | 2 +- .../testify/assert/assertion_compare.go | 24 +- .../assert/assertion_compare_can_convert.go | 2 +- .../testify/assert/assertion_format.go | 10 + .../testify/assert/assertion_forward.go | 20 + .../stretchr/testify/assert/assertions.go | 78 +- .../stretchr/testify/require/require.go | 26 + .../testify/require/require_forward.go | 20 + .../x/crypto/chacha20/chacha_generic.go | 4 +- .../x/crypto/chacha20/chacha_s390x.go | 1 + .../x/crypto/curve25519/curve25519.go | 9 +- .../curve25519/internal/field/fe_amd64.go | 3 + vendor/golang.org/x/crypto/ed25519/ed25519.go | 188 +- .../x/crypto/ed25519/ed25519_go113.go | 74 - .../ed25519/internal/edwards25519/const.go | 1422 --- .../internal/edwards25519/edwards25519.go | 1793 ---- .../{subtle/aliasing.go => alias/alias.go} | 5 +- .../alias_purego.go} | 5 +- .../{ => internal}/poly1305/bits_compat.go | 0 .../{ => internal}/poly1305/bits_go1.13.go | 0 .../{ => internal}/poly1305/mac_noasm.go | 0 .../{ => internal}/poly1305/poly1305.go | 2 +- .../{ => internal}/poly1305/sum_amd64.go | 0 .../{ => internal}/poly1305/sum_amd64.s | 0 .../{ => internal}/poly1305/sum_generic.go | 5 +- .../{ => internal}/poly1305/sum_ppc64le.go | 0 .../{ => internal}/poly1305/sum_ppc64le.s | 0 .../{ => internal}/poly1305/sum_s390x.go | 1 + .../{ => internal}/poly1305/sum_s390x.s | 2 +- vendor/golang.org/x/crypto/ssh/certs.go | 89 +- vendor/golang.org/x/crypto/ssh/cipher.go | 23 +- vendor/golang.org/x/crypto/ssh/client.go | 18 +- vendor/golang.org/x/crypto/ssh/client_auth.go | 132 +- vendor/golang.org/x/crypto/ssh/common.go | 80 +- vendor/golang.org/x/crypto/ssh/connection.go | 2 +- vendor/golang.org/x/crypto/ssh/doc.go | 5 +- vendor/golang.org/x/crypto/ssh/handshake.go | 83 +- vendor/golang.org/x/crypto/ssh/kex.go | 186 +- vendor/golang.org/x/crypto/ssh/keys.go | 149 +- vendor/golang.org/x/crypto/ssh/messages.go | 21 +- vendor/golang.org/x/crypto/ssh/server.go | 60 +- vendor/golang.org/x/crypto/ssh/session.go | 8 +- vendor/golang.org/x/crypto/ssh/transport.go | 10 +- vendor/golang.org/x/net/html/doc.go | 15 + vendor/golang.org/x/net/html/escape.go | 81 + vendor/golang.org/x/net/html/parse.go | 2 +- vendor/golang.org/x/net/html/render.go | 2 +- vendor/golang.org/x/net/html/token.go | 51 +- vendor/golang.org/x/net/http2/flow.go | 88 +- vendor/golang.org/x/net/http2/frame.go | 11 +- vendor/golang.org/x/net/http2/hpack/hpack.go | 81 +- vendor/golang.org/x/net/http2/server.go | 105 +- vendor/golang.org/x/net/http2/transport.go | 88 +- vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c | 1 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 44 +- vendor/golang.org/x/sys/cpu/endian_big.go | 11 + vendor/golang.org/x/sys/cpu/endian_little.go | 11 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 15 + vendor/golang.org/x/sys/cpu/parse.go | 43 + .../x/sys/cpu/proc_cpuinfo_linux.go | 54 + vendor/golang.org/x/sys/cpu/runtime_auxv.go | 16 + .../x/sys/cpu/runtime_auxv_go121.go | 19 + vendor/golang.org/x/sys/unix/gccgo.go | 4 +- vendor/golang.org/x/sys/unix/gccgo_c.c | 4 +- vendor/golang.org/x/sys/unix/ioctl.go | 21 +- vendor/golang.org/x/sys/unix/ioctl_zos.go | 8 +- vendor/golang.org/x/sys/unix/mkall.sh | 4 +- vendor/golang.org/x/sys/unix/ptrace_darwin.go | 6 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 6 + vendor/golang.org/x/sys/unix/syscall_aix.go | 5 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 3 +- .../golang.org/x/sys/unix/syscall_darwin.go | 13 +- .../x/sys/unix/syscall_darwin_amd64.go | 1 + .../x/sys/unix/syscall_darwin_arm64.go | 1 + .../x/sys/unix/syscall_dragonfly.go | 2 + .../golang.org/x/sys/unix/syscall_freebsd.go | 44 +- .../x/sys/unix/syscall_freebsd_386.go | 12 +- .../x/sys/unix/syscall_freebsd_amd64.go | 12 +- .../x/sys/unix/syscall_freebsd_arm.go | 10 +- .../x/sys/unix/syscall_freebsd_arm64.go | 10 +- .../x/sys/unix/syscall_freebsd_riscv64.go | 10 +- vendor/golang.org/x/sys/unix/syscall_hurd.go | 30 + .../golang.org/x/sys/unix/syscall_hurd_386.go | 29 + vendor/golang.org/x/sys/unix/syscall_linux.go | 87 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 20 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 2 + .../x/sys/unix/syscall_openbsd_libc.go | 4 +- .../golang.org/x/sys/unix/syscall_solaris.go | 22 +- vendor/golang.org/x/sys/unix/syscall_unix.go | 57 +- .../x/sys/unix/syscall_zos_s390x.go | 4 +- vendor/golang.org/x/sys/unix/timestruct.go | 2 +- vendor/golang.org/x/sys/unix/xattr_bsd.go | 9 +- vendor/golang.org/x/sys/unix/zerrors_linux.go | 40 +- .../x/sys/unix/zerrors_linux_386.go | 1 + .../x/sys/unix/zerrors_linux_amd64.go | 1 + .../x/sys/unix/zerrors_linux_arm.go | 1 + .../x/sys/unix/zerrors_linux_arm64.go | 1 + .../x/sys/unix/zerrors_linux_loong64.go | 1 + .../x/sys/unix/zerrors_linux_mips.go | 1 + .../x/sys/unix/zerrors_linux_mips64.go | 1 + .../x/sys/unix/zerrors_linux_mips64le.go | 1 + .../x/sys/unix/zerrors_linux_mipsle.go | 1 + .../x/sys/unix/zerrors_linux_ppc.go | 1 + .../x/sys/unix/zerrors_linux_ppc64.go | 1 + .../x/sys/unix/zerrors_linux_ppc64le.go | 1 + .../x/sys/unix/zerrors_linux_riscv64.go | 1 + .../x/sys/unix/zerrors_linux_s390x.go | 1 + .../x/sys/unix/zerrors_linux_sparc64.go | 1 + .../x/sys/unix/zerrors_openbsd_386.go | 356 +- .../x/sys/unix/zerrors_openbsd_amd64.go | 189 +- .../x/sys/unix/zerrors_openbsd_arm.go | 348 +- .../x/sys/unix/zerrors_openbsd_arm64.go | 160 +- .../x/sys/unix/zerrors_openbsd_mips64.go | 95 +- .../x/sys/unix/zptrace_armnn_linux.go | 8 +- .../x/sys/unix/zptrace_linux_arm64.go | 4 +- .../x/sys/unix/zptrace_mipsnn_linux.go | 8 +- .../x/sys/unix/zptrace_mipsnnle_linux.go | 8 +- .../x/sys/unix/zptrace_x86_linux.go | 8 +- .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 10 + .../x/sys/unix/zsyscall_aix_ppc64.go | 10 + .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 7 + .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 8 + .../x/sys/unix/zsyscall_darwin_amd64.go | 16 + .../x/sys/unix/zsyscall_darwin_arm64.go | 16 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 20 + .../x/sys/unix/zsyscall_freebsd_386.go | 30 + .../x/sys/unix/zsyscall_freebsd_amd64.go | 30 + .../x/sys/unix/zsyscall_freebsd_arm.go | 30 + .../x/sys/unix/zsyscall_freebsd_arm64.go | 30 + .../x/sys/unix/zsyscall_freebsd_riscv64.go | 30 + .../golang.org/x/sys/unix/zsyscall_linux.go | 21 + .../x/sys/unix/zsyscall_netbsd_386.go | 20 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 20 + .../x/sys/unix/zsyscall_netbsd_arm.go | 20 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 20 + .../x/sys/unix/zsyscall_openbsd_386.go | 22 + .../x/sys/unix/zsyscall_openbsd_386.s | 137 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 22 + .../x/sys/unix/zsyscall_openbsd_amd64.s | 137 +- .../x/sys/unix/zsyscall_openbsd_arm.go | 22 + .../x/sys/unix/zsyscall_openbsd_arm.s | 137 +- .../x/sys/unix/zsyscall_openbsd_arm64.go | 22 + .../x/sys/unix/zsyscall_openbsd_arm64.s | 137 +- .../x/sys/unix/zsyscall_openbsd_mips64.go | 820 +- .../x/sys/unix/zsyscall_openbsd_mips64.s | 669 ++ .../x/sys/unix/zsyscall_openbsd_ppc64.go | 22 + .../x/sys/unix/zsyscall_openbsd_ppc64.s | 6 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 22 + .../x/sys/unix/zsyscall_openbsd_riscv64.s | 137 +- .../x/sys/unix/zsyscall_solaris_amd64.go | 24 + .../x/sys/unix/zsyscall_zos_s390x.go | 10 + .../x/sys/unix/zsysctl_openbsd_386.go | 51 +- .../x/sys/unix/zsysctl_openbsd_amd64.go | 17 +- .../x/sys/unix/zsysctl_openbsd_arm.go | 51 +- .../x/sys/unix/zsysctl_openbsd_arm64.go | 11 +- .../x/sys/unix/zsysctl_openbsd_mips64.go | 3 +- .../x/sys/unix/zsysnum_openbsd_mips64.go | 1 + .../x/sys/unix/ztypes_freebsd_386.go | 2 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 2 +- .../x/sys/unix/ztypes_freebsd_arm.go | 2 +- .../x/sys/unix/ztypes_freebsd_arm64.go | 2 +- .../x/sys/unix/ztypes_freebsd_riscv64.go | 2 +- vendor/golang.org/x/sys/unix/ztypes_linux.go | 349 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 +- .../x/sys/unix/ztypes_linux_amd64.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 +- .../x/sys/unix/ztypes_linux_arm64.go | 2 +- .../x/sys/unix/ztypes_linux_loong64.go | 2 +- .../x/sys/unix/ztypes_linux_mips.go | 2 +- .../x/sys/unix/ztypes_linux_mips64.go | 2 +- .../x/sys/unix/ztypes_linux_mips64le.go | 2 +- .../x/sys/unix/ztypes_linux_mipsle.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 +- .../x/sys/unix/ztypes_linux_ppc64.go | 2 +- .../x/sys/unix/ztypes_linux_ppc64le.go | 2 +- .../x/sys/unix/ztypes_linux_riscv64.go | 2 +- .../x/sys/unix/ztypes_linux_s390x.go | 2 +- .../x/sys/unix/ztypes_linux_sparc64.go | 2 +- .../x/sys/unix/ztypes_netbsd_386.go | 84 + .../x/sys/unix/ztypes_netbsd_amd64.go | 84 + .../x/sys/unix/ztypes_netbsd_arm.go | 84 + .../x/sys/unix/ztypes_netbsd_arm64.go | 84 + .../x/sys/unix/ztypes_openbsd_386.go | 97 +- .../x/sys/unix/ztypes_openbsd_amd64.go | 33 +- .../x/sys/unix/ztypes_openbsd_arm.go | 9 +- .../x/sys/unix/ztypes_openbsd_arm64.go | 9 +- .../x/sys/unix/ztypes_openbsd_mips64.go | 9 +- .../x/sys/windows/syscall_windows.go | 20 +- .../golang.org/x/sys/windows/types_windows.go | 85 + .../x/sys/windows/zsyscall_windows.go | 27 + .../x/text/encoding/internal/internal.go | 2 +- .../internal/language/compact/language.go | 2 +- .../x/text/internal/language/language.go | 2 +- vendor/golang.org/x/text/language/language.go | 2 +- .../x/text/unicode/norm/forminfo.go | 2 +- vendor/golang.org/x/time/rate/rate.go | 21 +- .../grpc/NOTICE.txt} | 6 +- .../google.golang.org/grpc/status/status.go | 34 +- vendor/google.golang.org/protobuf/AUTHORS | 3 - .../google.golang.org/protobuf/CONTRIBUTORS | 3 - .../protobuf/encoding/prototext/decode.go | 116 +- .../protobuf/encoding/prototext/encode.go | 39 +- .../protobuf/encoding/protowire/wire.go | 4 + .../protobuf/internal/descfmt/stringer.go | 66 +- .../internal/encoding/defval/default.go | 78 +- .../encoding/messageset/messageset.go | 7 +- .../protobuf/internal/encoding/tag/tag.go | 96 +- .../protobuf/internal/encoding/text/decode.go | 30 +- .../internal/encoding/text/decode_number.go | 6 +- .../protobuf/internal/encoding/text/doc.go | 4 +- .../protobuf/internal/filedesc/build.go | 19 +- .../protobuf/internal/filedesc/desc.go | 380 +- .../protobuf/internal/filedesc/desc_init.go | 36 +- .../protobuf/internal/filedesc/desc_lazy.go | 80 +- .../protobuf/internal/filedesc/desc_list.go | 167 +- .../protobuf/internal/filedesc/placeholder.go | 136 +- .../protobuf/internal/filetype/build.go | 87 +- .../protobuf/internal/impl/api_export.go | 42 +- .../protobuf/internal/impl/checkinit.go | 12 +- .../protobuf/internal/impl/codec_extension.go | 36 +- .../protobuf/internal/impl/codec_field.go | 90 +- .../protobuf/internal/impl/codec_map.go | 20 +- .../protobuf/internal/impl/codec_message.go | 30 +- .../protobuf/internal/impl/codec_tables.go | 290 +- .../protobuf/internal/impl/convert.go | 228 +- .../protobuf/internal/impl/convert_list.go | 42 +- .../protobuf/internal/impl/convert_map.go | 32 +- .../protobuf/internal/impl/decode.go | 21 +- .../protobuf/internal/impl/enum.go | 10 +- .../protobuf/internal/impl/extension.go | 26 +- .../protobuf/internal/impl/legacy_enum.go | 57 +- .../protobuf/internal/impl/legacy_export.go | 18 +- .../internal/impl/legacy_extension.go | 100 +- .../protobuf/internal/impl/legacy_message.go | 122 +- .../protobuf/internal/impl/merge.go | 32 +- .../protobuf/internal/impl/message.go | 41 +- .../protobuf/internal/impl/message_reflect.go | 74 +- .../internal/impl/message_reflect_field.go | 118 +- .../protobuf/internal/impl/validate.go | 50 +- .../protobuf/internal/impl/weak.go | 16 +- .../protobuf/internal/order/order.go | 16 +- .../protobuf/internal/order/range.go | 22 +- .../protobuf/internal/strs/strings_unsafe.go | 6 +- .../protobuf/internal/version/version.go | 54 +- .../protobuf/proto/decode.go | 3 +- .../google.golang.org/protobuf/proto/doc.go | 21 +- .../protobuf/proto/encode.go | 5 +- .../google.golang.org/protobuf/proto/equal.go | 50 +- .../reflect/protodesc/desc_resolve.go | 6 +- .../protobuf/reflect/protoreflect/proto.go | 32 +- .../protobuf/reflect/protoreflect/source.go | 1 + .../protobuf/reflect/protoreflect/type.go | 1 + .../reflect/protoreflect/value_union.go | 2 + .../reflect/protoregistry/registry.go | 2 + .../protobuf/runtime/protoimpl/version.go | 8 +- .../admissionregistration/v1/generated.pb.go | 141 +- .../admissionregistration/v1/generated.proto | 6 +- .../api/admissionregistration/v1/types.go | 4 + .../api/admissionregistration/v1alpha1/doc.go | 23 + .../v1alpha1/generated.pb.go | 2956 ++++++ .../v1alpha1/generated.proto | 317 + .../v1alpha1/register.go | 56 + .../admissionregistration/v1alpha1/types.go | 373 + .../v1alpha1/types_swagger_doc_generated.go | 146 + .../v1alpha1/zz_generated.deepcopy.go | 331 + .../v1beta1/generated.pb.go | 701 +- .../v1beta1/generated.proto | 64 +- .../admissionregistration/v1beta1/types.go | 74 +- .../v1beta1/types_swagger_doc_generated.go | 21 - .../v1beta1/zz_generated.deepcopy.go | 73 +- .../apidiscovery/v2beta1}/doc.go | 10 +- .../api/apidiscovery/v2beta1/generated.pb.go | 1744 ++++ .../api/apidiscovery/v2beta1/generated.proto | 156 + .../api/apidiscovery/v2beta1/register.go | 56 + .../k8s.io/api/apidiscovery/v2beta1/types.go | 163 + .../v2beta1/zz_generated.deepcopy.go | 190 + .../zz_generated.prerelease-lifecycle.go | 58 + .../v1alpha1/generated.pb.go | 98 +- .../v1alpha1/generated.proto | 4 +- .../api/apiserverinternal/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/apps/v1/generated.pb.go | 534 +- vendor/k8s.io/api/apps/v1/generated.proto | 57 +- vendor/k8s.io/api/apps/v1/types.go | 54 +- .../apps/v1/types_swagger_doc_generated.go | 27 +- .../api/apps/v1/zz_generated.deepcopy.go | 26 + .../k8s.io/api/apps/v1beta1/generated.pb.go | 511 +- .../k8s.io/api/apps/v1beta1/generated.proto | 53 +- vendor/k8s.io/api/apps/v1beta1/types.go | 50 +- .../v1beta1/types_swagger_doc_generated.go | 23 +- .../api/apps/v1beta1/zz_generated.deepcopy.go | 26 + .../k8s.io/api/apps/v1beta2/generated.pb.go | 550 +- .../k8s.io/api/apps/v1beta2/generated.proto | 57 +- vendor/k8s.io/api/apps/v1beta2/types.go | 54 +- .../v1beta2/types_swagger_doc_generated.go | 27 +- .../api/apps/v1beta2/zz_generated.deepcopy.go | 26 + .../api/authentication/v1/generated.pb.go | 116 +- .../api/authentication/v1/generated.proto | 4 +- vendor/k8s.io/api/authentication/v1/types.go | 2 +- .../v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/authentication/v1alpha1/doc.go | 23 + .../authentication/v1alpha1/generated.pb.go | 567 ++ .../authentication/v1alpha1/generated.proto | 50 + .../authentication}/v1alpha1/register.go | 18 +- .../api/authentication/v1alpha1/types.go | 47 + .../v1alpha1}/types_swagger_doc_generated.go | 23 +- .../v1alpha1}/zz_generated.deepcopy.go | 40 +- .../zz_generated.prerelease-lifecycle.go | 40 + .../authentication/v1beta1/generated.pb.go | 86 +- .../authentication/v1beta1/generated.proto | 2 +- .../api/authorization/v1/generated.pb.go | 144 +- .../api/authorization/v1/generated.proto | 2 +- .../api/authorization/v1beta1/generated.pb.go | 138 +- .../api/authorization/v1beta1/generated.proto | 2 +- .../k8s.io/api/autoscaling/v1/generated.pb.go | 204 +- .../k8s.io/api/autoscaling/v1/generated.proto | 4 +- vendor/k8s.io/api/autoscaling/v1/types.go | 2 +- .../v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/autoscaling/v2/generated.pb.go | 220 +- .../k8s.io/api/autoscaling/v2/generated.proto | 4 +- vendor/k8s.io/api/autoscaling/v2/types.go | 2 +- .../v2/types_swagger_doc_generated.go | 2 +- .../api/autoscaling/v2beta1/generated.pb.go | 198 +- .../api/autoscaling/v2beta1/generated.proto | 4 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 2 +- .../v2beta1/types_swagger_doc_generated.go | 2 +- .../api/autoscaling/v2beta2/generated.pb.go | 202 +- .../api/autoscaling/v2beta2/generated.proto | 4 +- .../k8s.io/api/autoscaling/v2beta2/types.go | 2 +- .../v2beta2/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/batch/v1/generated.pb.go | 1282 ++- vendor/k8s.io/api/batch/v1/generated.proto | 131 +- vendor/k8s.io/api/batch/v1/types.go | 181 +- .../batch/v1/types_swagger_doc_generated.go | 51 +- .../api/batch/v1/zz_generated.deepcopy.go | 101 + .../k8s.io/api/batch/v1beta1/generated.pb.go | 148 +- .../k8s.io/api/batch/v1beta1/generated.proto | 15 +- vendor/k8s.io/api/batch/v1beta1/types.go | 13 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../batch/v1beta1/zz_generated.deepcopy.go | 5 + .../api/certificates/v1/generated.pb.go | 116 +- .../api/certificates/v1/generated.proto | 4 +- vendor/k8s.io/api/certificates/v1/types.go | 7 +- .../v1/types_swagger_doc_generated.go | 2 +- .../api/certificates/v1beta1/generated.pb.go | 117 +- .../api/certificates/v1beta1/generated.proto | 4 +- .../k8s.io/api/certificates/v1beta1/types.go | 5 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../api/coordination/v1/generated.pb.go | 70 +- .../api/coordination/v1/generated.proto | 2 +- .../api/coordination/v1beta1/generated.pb.go | 70 +- .../api/coordination/v1beta1/generated.proto | 2 +- vendor/k8s.io/api/core/v1/generated.pb.go | 4983 ++++++---- vendor/k8s.io/api/core/v1/generated.proto | 985 +- vendor/k8s.io/api/core/v1/toleration.go | 9 +- vendor/k8s.io/api/core/v1/types.go | 1067 +- .../core/v1/types_swagger_doc_generated.go | 718 +- .../k8s.io/api/core/v1/well_known_taints.go | 4 + .../api/core/v1/zz_generated.deepcopy.go | 152 +- .../k8s.io/api/discovery/v1/generated.pb.go | 114 +- .../k8s.io/api/discovery/v1/generated.proto | 16 +- vendor/k8s.io/api/discovery/v1/types.go | 14 +- .../v1/types_swagger_doc_generated.go | 10 +- .../api/discovery/v1beta1/generated.pb.go | 112 +- .../api/discovery/v1beta1/generated.proto | 16 +- vendor/k8s.io/api/discovery/v1beta1/types.go | 14 +- .../v1beta1/types_swagger_doc_generated.go | 10 +- vendor/k8s.io/api/events/v1/generated.pb.go | 100 +- vendor/k8s.io/api/events/v1/generated.proto | 2 +- .../k8s.io/api/events/v1beta1/generated.pb.go | 100 +- .../k8s.io/api/events/v1beta1/generated.proto | 2 +- .../api/extensions/v1beta1/generated.pb.go | 1630 +++- .../api/extensions/v1beta1/generated.proto | 78 +- vendor/k8s.io/api/extensions/v1beta1/types.go | 106 +- .../v1beta1/types_swagger_doc_generated.go | 51 +- .../v1beta1/zz_generated.deepcopy.go | 91 + .../api/flowcontrol/v1alpha1/generated.pb.go | 252 +- .../api/flowcontrol/v1alpha1/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1alpha1/types.go | 41 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../v1alpha1/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 8 +- .../api/flowcontrol/v1beta1/generated.pb.go | 252 +- .../api/flowcontrol/v1beta1/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1beta1/types.go | 41 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 8 +- .../api/flowcontrol/v1beta2/generated.pb.go | 252 +- .../api/flowcontrol/v1beta2/generated.proto | 35 +- .../k8s.io/api/flowcontrol/v1beta2/types.go | 37 +- .../v1beta2/types_swagger_doc_generated.go | 4 +- .../v1beta2/zz_generated.deepcopy.go | 10 + .../zz_generated.prerelease-lifecycle.go | 28 + vendor/k8s.io/api/flowcontrol/v1beta3/doc.go | 25 + .../api/flowcontrol/v1beta3/generated.pb.go | 5428 +++++++++++ .../api/flowcontrol/v1beta3/generated.proto | 473 + .../api/flowcontrol/v1beta3/register.go | 58 + .../k8s.io/api/flowcontrol/v1beta3/types.go | 612 ++ .../v1beta3/types_swagger_doc_generated.go | 263 + .../v1beta3/zz_generated.deepcopy.go | 552 ++ .../zz_generated.prerelease-lifecycle.go | 94 + .../k8s.io/api/networking/v1/generated.pb.go | 1316 ++- .../k8s.io/api/networking/v1/generated.proto | 96 +- vendor/k8s.io/api/networking/v1/types.go | 126 +- .../v1/types_swagger_doc_generated.go | 51 +- .../networking/v1/zz_generated.deepcopy.go | 91 + .../networking/v1alpha1}/doc.go | 10 +- .../api/networking/v1alpha1/generated.pb.go | 913 ++ .../api/networking/v1alpha1/generated.proto | 94 + .../api/networking/v1alpha1/register.go | 56 + .../k8s.io/api/networking/v1alpha1/types.go | 95 + .../v1alpha1/types_swagger_doc_generated.go | 62 + .../v1alpha1}/zz_generated.deepcopy.go | 73 +- .../zz_generated.prerelease-lifecycle.go | 58 + .../api/networking/v1beta1/generated.pb.go | 830 +- .../api/networking/v1beta1/generated.proto | 51 +- vendor/k8s.io/api/networking/v1beta1/types.go | 51 +- .../v1beta1/types_swagger_doc_generated.go | 31 + .../v1beta1/zz_generated.deepcopy.go | 67 + vendor/k8s.io/api/node/v1/generated.pb.go | 85 +- vendor/k8s.io/api/node/v1/generated.proto | 4 +- vendor/k8s.io/api/node/v1/types.go | 2 - .../node/v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/node/v1alpha1/generated.pb.go | 90 +- .../k8s.io/api/node/v1alpha1/generated.proto | 3 +- vendor/k8s.io/api/node/v1alpha1/types.go | 1 - .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/node/v1beta1/generated.pb.go | 86 +- .../k8s.io/api/node/v1beta1/generated.proto | 3 +- vendor/k8s.io/api/node/v1beta1/types.go | 1 - .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/policy/v1/generated.pb.go | 152 +- vendor/k8s.io/api/policy/v1/generated.proto | 30 +- vendor/k8s.io/api/policy/v1/types.go | 48 + .../policy/v1/types_swagger_doc_generated.go | 9 +- .../api/policy/v1/zz_generated.deepcopy.go | 5 + .../k8s.io/api/policy/v1beta1/generated.pb.go | 288 +- .../k8s.io/api/policy/v1beta1/generated.proto | 32 +- vendor/k8s.io/api/policy/v1beta1/types.go | 52 +- .../v1beta1/types_swagger_doc_generated.go | 11 +- .../policy/v1beta1/zz_generated.deepcopy.go | 5 + vendor/k8s.io/api/rbac/v1/generated.pb.go | 104 +- vendor/k8s.io/api/rbac/v1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1/types.go | 2 +- .../rbac/v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 105 +- .../k8s.io/api/rbac/v1alpha1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/rbac/v1beta1/generated.pb.go | 104 +- .../k8s.io/api/rbac/v1beta1/generated.proto | 4 +- vendor/k8s.io/api/rbac/v1beta1/types.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/resource/v1alpha1/doc.go | 24 + .../api/resource/v1alpha1/generated.pb.go | 4593 +++++++++ .../api/resource/v1alpha1/generated.proto | 372 + .../k8s.io/api/resource/v1alpha1/register.go | 63 + vendor/k8s.io/api/resource/v1alpha1/types.go | 430 + .../v1alpha1/types_swagger_doc_generated.go | 222 + .../v1alpha1/zz_generated.deepcopy.go | 477 + .../k8s.io/api/scheduling/v1/generated.pb.go | 64 +- .../k8s.io/api/scheduling/v1/generated.proto | 3 +- vendor/k8s.io/api/scheduling/v1/types.go | 1 - .../v1/types_swagger_doc_generated.go | 2 +- .../api/scheduling/v1alpha1/generated.pb.go | 64 +- .../api/scheduling/v1alpha1/generated.proto | 3 +- .../k8s.io/api/scheduling/v1alpha1/types.go | 1 - .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../api/scheduling/v1beta1/generated.pb.go | 65 +- .../api/scheduling/v1beta1/generated.proto | 3 +- vendor/k8s.io/api/scheduling/v1beta1/types.go | 1 - .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/storage/v1/generated.pb.go | 849 +- vendor/k8s.io/api/storage/v1/generated.proto | 121 +- vendor/k8s.io/api/storage/v1/register.go | 3 + vendor/k8s.io/api/storage/v1/types.go | 126 +- .../storage/v1/types_swagger_doc_generated.go | 26 +- .../api/storage/v1/zz_generated.deepcopy.go | 80 + .../api/storage/v1alpha1/generated.pb.go | 118 +- .../api/storage/v1alpha1/generated.proto | 14 +- vendor/k8s.io/api/storage/v1alpha1/types.go | 14 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../api/storage/v1beta1/generated.pb.go | 246 +- .../api/storage/v1beta1/generated.proto | 39 +- vendor/k8s.io/api/storage/v1beta1/types.go | 41 +- .../v1beta1/types_swagger_doc_generated.go | 7 +- .../storage/v1beta1/zz_generated.deepcopy.go | 5 + .../zz_generated.prerelease-lifecycle.go | 12 + .../pkg/apis/apiextensions/v1/generated.pb.go | 382 +- .../pkg/apis/apiextensions/v1/generated.proto | 4 +- .../pkg/apis/apiextensions/v1/types.go | 2 +- .../apiextensions/v1beta1/generated.pb.go | 388 +- .../apiextensions/v1beta1/generated.proto | 4 +- .../pkg/apis/apiextensions/v1beta1/types.go | 2 +- .../client/clientset/clientset/clientset.go | 7 +- .../clientset/clientset/scheme/register.go | 14 +- .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 31 +- .../apimachinery/pkg/api/errors/errors.go | 75 +- .../k8s.io/apimachinery/pkg/api/meta/OWNERS | 26 +- .../apimachinery/pkg/api/meta/conditions.go | 6 +- .../apimachinery/pkg/api/meta/errors.go | 35 +- .../k8s.io/apimachinery/pkg/api/meta/help.go | 7 +- .../k8s.io/apimachinery/pkg/api/meta/meta.go | 5 +- .../apimachinery/pkg/api/meta/restmapper.go | 3 +- .../apimachinery/pkg/api/resource/OWNERS | 17 +- .../pkg/api/resource/generated.pb.go | 6 +- .../pkg/api/resource/generated.proto | 29 +- .../apimachinery/pkg/api/resource/quantity.go | 41 +- .../apimachinery/pkg/api/resource/suffix.go | 2 +- .../pkg/apis/meta/internalversion/register.go | 88 - .../pkg/apis/meta/internalversion/types.go | 80 - .../zz_generated.conversion.go | 146 - .../apimachinery/pkg/apis/meta/v1/OWNERS | 33 +- .../pkg/apis/meta/v1/generated.pb.go | 399 +- .../pkg/apis/meta/v1/generated.proto | 145 +- .../apimachinery/pkg/apis/meta/v1/helpers.go | 2 +- .../apimachinery/pkg/apis/meta/v1/meta.go | 4 - .../pkg/apis/meta/v1/micro_time_proto.go | 10 +- .../apimachinery/pkg/apis/meta/v1/types.go | 154 +- .../meta/v1/types_swagger_doc_generated.go | 17 +- .../pkg/apis/meta/v1/unstructured/helpers.go | 1 + .../apis/meta/v1/unstructured/unstructured.go | 12 - .../pkg/apis/meta/v1beta1/conversion.go | 46 - .../pkg/apis/meta/v1beta1/generated.pb.go | 412 - .../pkg/apis/meta/v1beta1/generated.proto | 41 - .../pkg/apis/meta/v1beta1/register.go | 62 - .../pkg/apis/meta/v1beta1/types.go | 84 - .../meta/v1beta1/zz_generated.defaults.go | 33 - .../apimachinery/pkg/conversion/converter.go | 8 +- .../apimachinery/pkg/conversion/deep_equal.go | 11 + .../apimachinery/pkg/conversion/helper.go | 2 +- .../pkg/conversion/queryparams/convert.go | 4 +- .../apimachinery/pkg/labels/selector.go | 69 +- .../apimachinery/pkg/runtime/allocator.go | 76 + .../k8s.io/apimachinery/pkg/runtime/codec.go | 13 +- .../apimachinery/pkg/runtime/codec_check.go | 2 +- .../apimachinery/pkg/runtime/converter.go | 52 +- .../apimachinery/pkg/runtime/generated.pb.go | 50 +- .../apimachinery/pkg/runtime/generated.proto | 61 +- .../apimachinery/pkg/runtime/interfaces.go | 37 +- .../pkg/runtime/schema/generated.pb.go | 26 +- .../pkg/runtime/schema/generated.proto | 2 +- .../pkg/runtime/schema/group_version.go | 6 +- .../k8s.io/apimachinery/pkg/runtime/scheme.go | 15 +- .../pkg/runtime/serializer/codec_factory.go | 3 +- .../pkg/runtime/serializer/json/json.go | 19 +- .../runtime/serializer/protobuf/protobuf.go | 64 +- .../runtime/serializer/streaming/streaming.go | 20 + .../serializer/versioning/versioning.go | 61 +- .../k8s.io/apimachinery/pkg/runtime/types.go | 59 +- .../k8s.io/apimachinery/pkg/types/nodename.go | 24 +- .../apimachinery/pkg/util/cache/expiring.go | 192 - .../pkg/util/cache/lruexpirecache.go | 160 - .../k8s.io/apimachinery/pkg/util/diff/diff.go | 157 - .../apimachinery/pkg/util/framer/framer.go | 8 +- .../pkg/util/intstr/generated.pb.go | 38 +- .../pkg/util/intstr/generated.proto | 2 +- .../apimachinery/pkg/util/intstr/intstr.go | 6 +- .../pkg/util/managedfields/extract.go | 2 +- .../pkg/util/managedfields/gvkparser.go | 3 +- .../apimachinery/pkg/util/mergepatch/OWNERS | 5 +- .../apimachinery/pkg/util/mergepatch/util.go | 3 +- .../k8s.io/apimachinery/pkg/util/net/http.go | 99 - .../apimachinery/pkg/util/net/interface.go | 2 +- .../apimachinery/pkg/util/net/port_split.go | 13 +- .../k8s.io/apimachinery/pkg/util/net/util.go | 1 + .../apimachinery/pkg/util/runtime/runtime.go | 9 +- .../k8s.io/apimachinery/pkg/util/sets/byte.go | 150 +- .../k8s.io/apimachinery/pkg/util/sets/doc.go | 7 +- .../apimachinery/pkg/util/sets/empty.go | 4 +- .../k8s.io/apimachinery/pkg/util/sets/int.go | 150 +- .../apimachinery/pkg/util/sets/int32.go | 150 +- .../apimachinery/pkg/util/sets/int64.go | 150 +- .../apimachinery/pkg/util/sets/ordered.go | 53 + .../k8s.io/apimachinery/pkg/util/sets/set.go | 227 + .../apimachinery/pkg/util/sets/string.go | 150 +- .../pkg/util/strategicpatch/OWNERS | 8 +- .../pkg/util/strategicpatch/meta.go | 4 +- .../pkg/util/strategicpatch/patch.go | 25 + .../pkg/util/validation/field/errors.go | 58 +- .../pkg/util/validation/validation.go | 2 +- .../k8s.io/apimachinery/pkg/util/wait/wait.go | 24 +- .../k8s.io/apimachinery/pkg/watch/filter.go | 1 - vendor/k8s.io/apimachinery/pkg/watch/mux.go | 53 +- vendor/k8s.io/apimachinery/pkg/watch/watch.go | 4 +- .../third_party/forked/golang/json/OWNERS | 5 +- .../third_party/forked/golang/json/fields.go | 4 +- .../forked/golang/reflect/deep_equal.go | 84 +- .../v1/mutatingwebhookconfiguration.go | 18 - .../v1/validatingwebhookconfiguration.go | 18 - .../v1alpha1/admissionpolicyspec.go | 75 + .../v1alpha1/matchresources.go | 90 + .../v1alpha1/namedrulewithoperations.go | 95 + .../v1alpha1/paramkind.go | 48 + .../v1alpha1/paramref.go | 48 + .../v1alpha1/paramsource.go | 48 + .../admissionregistration/v1alpha1/rule.go | 76 + .../v1alpha1/rulewithoperations.go | 85 + .../v1alpha1/validatingadmissionpolicy.go | 247 + .../validatingadmissionpolicybinding.go | 247 + .../validatingadmissionpolicybindingspec.go | 57 + .../v1alpha1/validatingadmissionpolicyspec.go | 75 + .../v1alpha1/validation.go | 61 + .../v1beta1/mutatingwebhook.go | 15 +- .../v1beta1/mutatingwebhookconfiguration.go | 18 - .../v1beta1/rulewithoperations.go | 11 +- .../v1beta1/validatingwebhook.go | 15 +- .../v1beta1/validatingwebhookconfiguration.go | 18 - .../v1alpha1/storageversion.go | 18 - .../apps/v1/controllerrevision.go | 18 - .../applyconfigurations/apps/v1/daemonset.go | 18 - .../applyconfigurations/apps/v1/deployment.go | 18 - .../applyconfigurations/apps/v1/replicaset.go | 18 - .../v1/rollingupdatestatefulsetstrategy.go | 15 +- .../apps/v1/statefulset.go | 18 - .../apps/v1/statefulsetordinals.go | 39 + .../apps/v1/statefulsetspec.go | 9 + .../apps/v1beta1/controllerrevision.go | 18 - .../apps/v1beta1/deployment.go | 18 - .../rollingupdatestatefulsetstrategy.go | 15 +- .../apps/v1beta1/statefulset.go | 18 - .../apps/v1beta1/statefulsetordinals.go | 39 + .../apps/v1beta1/statefulsetspec.go | 9 + .../apps/v1beta2/controllerrevision.go | 18 - .../apps/v1beta2/daemonset.go | 18 - .../apps/v1beta2/deployment.go | 18 - .../apps/v1beta2/replicaset.go | 18 - .../rollingupdatestatefulsetstrategy.go | 15 +- .../applyconfigurations/apps/v1beta2/scale.go | 23 +- .../apps/v1beta2/statefulset.go | 18 - .../apps/v1beta2/statefulsetordinals.go | 39 + .../apps/v1beta2/statefulsetspec.go | 9 + .../autoscaling/v1/horizontalpodautoscaler.go | 18 - .../autoscaling/v1/scale.go | 23 +- .../autoscaling/v2/horizontalpodautoscaler.go | 18 - .../v2beta1/horizontalpodautoscaler.go | 18 - .../v2beta2/horizontalpodautoscaler.go | 18 - .../applyconfigurations/batch/v1/cronjob.go | 18 - .../batch/v1/cronjobspec.go | 9 + .../applyconfigurations/batch/v1/job.go | 18 - .../applyconfigurations/batch/v1/jobspec.go | 15 +- .../batch/v1/jobtemplatespec.go | 18 - .../batch/v1/podfailurepolicy.go | 44 + .../podfailurepolicyonexitcodesrequirement.go | 63 + .../podfailurepolicyonpodconditionspattern.go | 52 + .../batch/v1/podfailurepolicyrule.go | 66 + .../batch/v1beta1/cronjob.go | 18 - .../batch/v1beta1/cronjobspec.go | 9 + .../batch/v1beta1/jobtemplatespec.go | 18 - .../v1/certificatesigningrequest.go | 18 - .../v1beta1/certificatesigningrequest.go | 18 - .../coordination/v1/lease.go | 18 - .../coordination/v1beta1/lease.go | 18 - .../core/v1/claimsource.go | 48 + .../core/v1/componentstatus.go | 18 - .../applyconfigurations/core/v1/configmap.go | 18 - .../core/v1/csipersistentvolumesource.go | 9 + .../applyconfigurations/core/v1/endpoints.go | 18 - .../applyconfigurations/core/v1/event.go | 18 - .../applyconfigurations/core/v1/limitrange.go | 18 - .../applyconfigurations/core/v1/namespace.go | 18 - .../applyconfigurations/core/v1/node.go | 18 - .../core/v1/persistentvolume.go | 18 - .../core/v1/persistentvolumeclaim.go | 18 - .../core/v1/persistentvolumeclaimspec.go | 4 +- .../core/v1/persistentvolumeclaimtemplate.go | 18 - .../applyconfigurations/core/v1/pod.go | 18 - .../core/v1/podresourceclaim.go | 48 + .../core/v1/podschedulinggate.go | 39 + .../applyconfigurations/core/v1/podspec.go | 37 + .../core/v1/podtemplate.go | 18 - .../core/v1/podtemplatespec.go | 18 - .../core/v1/replicationcontroller.go | 18 - .../core/v1/resourceclaim.go | 39 + .../core/v1/resourcequota.go | 18 - .../core/v1/resourcerequirements.go | 18 +- .../applyconfigurations/core/v1/secret.go | 18 - .../applyconfigurations/core/v1/service.go | 18 - .../core/v1/serviceaccount.go | 18 - .../core/v1/servicespec.go | 4 +- .../core/v1/topologyspreadconstraint.go | 46 +- .../core/v1/typedobjectreference.go | 66 + .../discovery/v1/endpointslice.go | 18 - .../discovery/v1beta1/endpointslice.go | 18 - .../applyconfigurations/events/v1/event.go | 18 - .../events/v1beta1/event.go | 18 - .../extensions/v1beta1/daemonset.go | 18 - .../extensions/v1beta1/deployment.go | 18 - .../extensions/v1beta1/ingress.go | 18 - .../v1beta1/ingressloadbalanceringress.go | 62 + .../v1beta1/ingressloadbalancerstatus.go | 44 + .../extensions/v1beta1/ingressportstatus.go | 61 + .../extensions/v1beta1/ingressstatus.go | 8 +- .../extensions/v1beta1/networkpolicy.go | 29 +- .../extensions/v1beta1/networkpolicystatus.go | 48 + .../extensions/v1beta1/podsecuritypolicy.go | 18 - .../extensions/v1beta1/replicaset.go | 18 - .../extensions/v1beta1/scale.go | 23 +- .../flowcontrol/v1alpha1/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1alpha1/prioritylevelconfiguration.go | 18 - .../flowcontrol/v1beta1/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1beta1/prioritylevelconfiguration.go | 18 - .../flowcontrol/v1beta2/flowschema.go | 18 - .../limitedprioritylevelconfiguration.go | 18 + .../v1beta2/prioritylevelconfiguration.go | 18 - .../v1beta3/flowdistinguishermethod.go | 43 + .../flowcontrol/v1beta3/flowschema.go | 256 + .../v1beta3/flowschemacondition.go | 80 + .../flowcontrol/v1beta3/flowschemaspec.go | 71 + .../flowcontrol/v1beta3/flowschemastatus.go | 44 + .../flowcontrol/v1beta3/groupsubject.go | 39 + .../limitedprioritylevelconfiguration.go | 66 + .../flowcontrol/v1beta3/limitresponse.go | 52 + .../v1beta3/nonresourcepolicyrule.go | 52 + .../v1beta3/policyruleswithsubjects.go | 72 + .../v1beta3/prioritylevelconfiguration.go | 256 + .../prioritylevelconfigurationcondition.go | 80 + .../prioritylevelconfigurationreference.go | 39 + .../v1beta3/prioritylevelconfigurationspec.go | 52 + .../prioritylevelconfigurationstatus.go | 44 + .../v1beta3/queuingconfiguration.go | 57 + .../flowcontrol/v1beta3/resourcepolicyrule.go | 83 + .../v1beta3/serviceaccountsubject.go | 48 + .../flowcontrol/v1beta3/subject.go | 70 + .../flowcontrol/v1beta3/usersubject.go | 39 + .../applyconfigurations/internal/internal.go | 1280 ++- .../meta/v1/deleteoptions.go | 5 +- .../meta/v1/groupversionkind.go | 57 + .../applyconfigurations/meta/v1/listmeta.go | 66 + .../applyconfigurations/meta/v1/objectmeta.go | 18 - .../applyconfigurations/meta/v1/status.go | 142 + .../meta/v1/statuscause.go | 61 + .../meta/v1/statusdetails.go | 93 + .../networking/v1/ingress.go | 18 - .../networking/v1/ingressclass.go | 18 - .../v1/ingressloadbalanceringress.go | 62 + .../v1/ingressloadbalancerstatus.go | 44 + .../networking/v1/ingressportstatus.go | 61 + .../networking/v1/ingressstatus.go | 8 +- .../networking/v1/networkpolicy.go | 29 +- .../networking/v1/networkpolicystatus.go | 48 + .../networking/v1alpha1/clustercidr.go | 247 + .../networking/v1alpha1/clustercidrspec.go | 70 + .../networking/v1beta1/ingress.go | 18 - .../networking/v1beta1/ingressclass.go | 18 - .../v1beta1/ingressloadbalanceringress.go | 62 + .../v1beta1/ingressloadbalancerstatus.go | 44 + .../networking/v1beta1/ingressportstatus.go | 61 + .../networking/v1beta1/ingressstatus.go | 8 +- .../node/v1/runtimeclass.go | 18 - .../node/v1alpha1/runtimeclass.go | 18 - .../node/v1beta1/runtimeclass.go | 18 - .../applyconfigurations/policy/v1/eviction.go | 18 - .../policy/v1/poddisruptionbudget.go | 18 - .../policy/v1/poddisruptionbudgetspec.go | 16 +- .../policy/v1beta1/eviction.go | 18 - .../policy/v1beta1/poddisruptionbudget.go | 18 - .../policy/v1beta1/poddisruptionbudgetspec.go | 16 +- .../policy/v1beta1/podsecuritypolicy.go | 18 - .../rbac/v1/clusterrole.go | 18 - .../rbac/v1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1/role.go | 18 - .../rbac/v1/rolebinding.go | 18 - .../rbac/v1alpha1/clusterrole.go | 18 - .../rbac/v1alpha1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1alpha1/role.go | 18 - .../rbac/v1alpha1/rolebinding.go | 18 - .../rbac/v1beta1/clusterrole.go | 18 - .../rbac/v1beta1/clusterrolebinding.go | 18 - .../applyconfigurations/rbac/v1beta1/role.go | 18 - .../rbac/v1beta1/rolebinding.go | 18 - .../resource/v1alpha1/allocationresult.go | 61 + .../resource/v1alpha1/podscheduling.go | 258 + .../resource/v1alpha1/podschedulingspec.go | 50 + .../resource/v1alpha1/podschedulingstatus.go | 44 + .../resource/v1alpha1/resourceclaim.go | 258 + .../resourceclaimconsumerreference.go | 70 + .../resourceclaimparametersreference.go | 57 + .../v1alpha1/resourceclaimschedulingstatus.go | 50 + .../resource/v1alpha1/resourceclaimspec.go | 61 + .../resource/v1alpha1/resourceclaimstatus.go | 71 + .../v1alpha1/resourceclaimtemplate.go | 249 + .../v1alpha1/resourceclaimtemplatespec.go | 188 + .../resource/v1alpha1/resourceclass.go | 266 + .../resourceclassparametersreference.go | 66 + .../scheduling/v1/priorityclass.go | 18 - .../scheduling/v1alpha1/priorityclass.go | 18 - .../scheduling/v1beta1/priorityclass.go | 18 - .../storage/v1/csidriver.go | 18 - .../storage/v1/csidriverspec.go | 9 + .../applyconfigurations/storage/v1/csinode.go | 18 - .../storage/v1/csistoragecapacity.go | 277 + .../storage/v1/storageclass.go | 18 - .../storage/v1/volumeattachment.go | 18 - .../storage/v1alpha1/csistoragecapacity.go | 18 - .../storage/v1alpha1/volumeattachment.go | 18 - .../storage/v1beta1/csidriver.go | 18 - .../storage/v1beta1/csidriverspec.go | 9 + .../storage/v1beta1/csinode.go | 18 - .../storage/v1beta1/csistoragecapacity.go | 18 - .../storage/v1beta1/storageclass.go | 18 - .../storage/v1beta1/volumeattachment.go | 18 - .../discovery/aggregated_discovery.go | 134 + .../client-go/discovery/discovery_client.go | 318 +- .../client-go/discovery/fake/discovery.go | 19 +- vendor/k8s.io/client-go/discovery/helper.go | 21 + vendor/k8s.io/client-go/dynamic/interface.go | 2 + vendor/k8s.io/client-go/dynamic/simple.go | 113 +- .../k8s.io/client-go/kubernetes/clientset.go | 162 +- .../kubernetes/fake/clientset_generated.go | 35 + .../client-go/kubernetes/fake/register.go | 24 +- .../client-go/kubernetes/scheme/register.go | 24 +- .../v1alpha1/admissionregistration_client.go | 112 + .../admissionregistration/v1alpha1/doc.go | 20 + .../v1alpha1/fake/doc.go | 20 + .../fake/fake_admissionregistration_client.go | 44 + .../fake/fake_validatingadmissionpolicy.go | 146 + .../fake_validatingadmissionpolicybinding.go | 146 + .../v1alpha1/generated_expansion.go | 23 + .../v1alpha1/validatingadmissionpolicy.go | 197 + .../validatingadmissionpolicybinding.go | 197 + .../v1alpha1/authentication_client.go | 107 + .../typed/authentication/v1alpha1/doc.go | 20 + .../typed/authentication/v1alpha1/fake/doc.go | 20 + .../fake/fake_authentication_client.go | 40 + .../v1alpha1/fake/fake_selfsubjectreview.go | 47 + .../v1alpha1/generated_expansion.go | 21 + .../v1alpha1/selfsubjectreview.go | 64 + .../core/v1/fake/fake_event_expansion.go | 18 +- .../typed/core/v1/fake/fake_pod_expansion.go | 4 +- .../typed/events/v1beta1/event_expansion.go | 3 +- .../v1beta1/fake/fake_networkpolicy.go | 35 + .../typed/extensions/v1beta1/networkpolicy.go | 48 + .../typed/flowcontrol/v1beta3/doc.go | 20 + .../typed/flowcontrol/v1beta3/fake/doc.go | 20 + .../v1beta3/fake/fake_flowcontrol_client.go | 44 + .../v1beta3/fake/fake_flowschema.go | 179 + .../fake/fake_prioritylevelconfiguration.go | 179 + .../flowcontrol/v1beta3/flowcontrol_client.go | 112 + .../typed/flowcontrol/v1beta3/flowschema.go | 243 + .../v1beta3/generated_expansion.go | 23 + .../v1beta3/prioritylevelconfiguration.go | 243 + .../networking/v1/fake/fake_networkpolicy.go | 35 + .../typed/networking/v1/networkpolicy.go | 48 + .../typed/networking/v1alpha1/clustercidr.go | 197 + .../typed/networking/v1alpha1/doc.go | 20 + .../typed/networking/v1alpha1/fake/doc.go | 20 + .../v1alpha1/fake/fake_clustercidr.go | 146 + .../v1alpha1/fake/fake_networking_client.go} | 29 +- .../v1alpha1/generated_expansion.go | 21 + .../networking/v1alpha1/networking_client.go | 107 + .../kubernetes/typed/resource/v1alpha1/doc.go | 20 + .../typed/resource/v1alpha1/fake/doc.go | 20 + .../v1alpha1/fake/fake_podscheduling.go | 190 + .../v1alpha1/fake/fake_resource_client.go | 52 + .../v1alpha1/fake/fake_resourceclaim.go | 190 + .../fake/fake_resourceclaimtemplate.go | 155 + .../v1alpha1/fake/fake_resourceclass.go | 146 + .../resource/v1alpha1/generated_expansion.go | 27 + .../typed/resource/v1alpha1/podscheduling.go | 256 + .../resource/v1alpha1/resource_client.go | 122 + .../typed/resource/v1alpha1/resourceclaim.go | 256 + .../v1alpha1/resourceclaimtemplate.go | 208 + .../typed/resource/v1alpha1/resourceclass.go | 197 + .../typed/storage/v1/csistoragecapacity.go | 208 + .../v1/fake/fake_csistoragecapacity.go | 155 + .../storage/v1/fake/fake_storage_client.go | 4 + .../typed/storage/v1/generated_expansion.go | 2 + .../typed/storage/v1/storage_client.go | 5 + vendor/k8s.io/client-go/openapi/client.go | 64 + .../k8s.io/client-go/openapi/groupversion.go | 46 + .../pkg/apis/clientauthentication/OWNERS | 7 +- .../clientauthentication/install/install.go | 2 - .../pkg/apis/clientauthentication/types.go | 19 +- .../pkg/apis/clientauthentication/v1/types.go | 5 + .../v1/zz_generated.conversion.go | 18 +- .../v1alpha1/conversion.go | 27 - .../clientauthentication/v1alpha1/types.go | 78 - .../v1alpha1/zz_generated.conversion.go | 173 - .../v1alpha1/zz_generated.deepcopy.go | 129 - .../v1beta1/conversion.go | 28 - .../clientauthentication/v1beta1/types.go | 5 + .../v1beta1/zz_generated.conversion.go | 18 +- .../zz_generated.deepcopy.go | 36 - .../client-go/pkg/version/.gitattributes | 1 - .../plugin/pkg/client/auth/exec/exec.go | 60 +- vendor/k8s.io/client-go/rest/OWNERS | 30 +- vendor/k8s.io/client-go/rest/client.go | 14 +- vendor/k8s.io/client-go/rest/config.go | 10 +- vendor/k8s.io/client-go/rest/exec.go | 9 +- vendor/k8s.io/client-go/rest/plugin.go | 7 +- vendor/k8s.io/client-go/rest/request.go | 274 +- vendor/k8s.io/client-go/rest/transport.go | 5 +- vendor/k8s.io/client-go/rest/warnings.go | 6 +- vendor/k8s.io/client-go/rest/with_retry.go | 227 +- vendor/k8s.io/client-go/testing/fixture.go | 20 +- vendor/k8s.io/client-go/tools/auth/OWNERS | 7 +- .../k8s.io/client-go/tools/auth/clientauth.go | 33 +- vendor/k8s.io/client-go/tools/cache/OWNERS | 38 - .../client-go/tools/cache/controller.go | 482 - .../client-go/tools/cache/delta_fifo.go | 757 -- vendor/k8s.io/client-go/tools/cache/doc.go | 24 - .../client-go/tools/cache/expiration_cache.go | 215 - .../tools/cache/expiration_cache_fakes.go | 57 - .../tools/cache/fake_custom_store.go | 102 - vendor/k8s.io/client-go/tools/cache/fifo.go | 373 - vendor/k8s.io/client-go/tools/cache/heap.go | 322 - vendor/k8s.io/client-go/tools/cache/index.go | 101 - .../k8s.io/client-go/tools/cache/listers.go | 183 - .../k8s.io/client-go/tools/cache/listwatch.go | 112 - .../client-go/tools/cache/mutation_cache.go | 262 - .../tools/cache/mutation_detector.go | 166 - .../k8s.io/client-go/tools/cache/reflector.go | 616 -- .../tools/cache/reflector_metrics.go | 89 - .../client-go/tools/cache/shared_informer.go | 824 -- vendor/k8s.io/client-go/tools/cache/store.go | 271 - .../tools/cache/thread_safe_store.go | 339 - .../client-go/tools/cache/undelta_store.go | 89 - .../client-go/tools/clientcmd/api/helpers.go | 91 +- .../client-go/tools/clientcmd/api/types.go | 5 + .../client-go/tools/clientcmd/api/v1/types.go | 5 + .../api/v1/zz_generated.conversion.go | 2 + .../client-go/tools/clientcmd/auth_loaders.go | 5 +- .../tools/clientcmd/client_config.go | 7 +- .../client-go/tools/clientcmd/loader.go | 15 +- .../client-go/tools/clientcmd/overrides.go | 44 +- .../client-go/tools/clientcmd/validation.go | 15 +- vendor/k8s.io/client-go/tools/metrics/OWNERS | 5 +- .../k8s.io/client-go/tools/metrics/metrics.go | 21 + vendor/k8s.io/client-go/tools/pager/pager.go | 247 - .../k8s.io/client-go/tools/reference/ref.go | 2 +- vendor/k8s.io/client-go/transport/OWNERS | 11 +- vendor/k8s.io/client-go/transport/cache.go | 28 +- .../k8s.io/client-go/transport/cache_go118.go | 24 + vendor/k8s.io/client-go/transport/config.go | 21 +- .../client-go/transport/round_trippers.go | 12 +- .../client-go/transport/token_source.go | 4 +- .../k8s.io/client-go/transport/transport.go | 27 +- vendor/k8s.io/client-go/util/cert/OWNERS | 7 +- vendor/k8s.io/client-go/util/cert/cert.go | 10 +- vendor/k8s.io/client-go/util/cert/io.go | 7 +- vendor/k8s.io/client-go/util/keyutil/OWNERS | 7 +- vendor/k8s.io/client-go/util/keyutil/key.go | 9 +- .../util/workqueue/delaying_queue.go | 4 +- vendor/k8s.io/client-go/util/workqueue/doc.go | 14 +- .../util/workqueue/rate_limiting_queue.go | 9 + vendor/k8s.io/klog/v2/OWNERS | 17 +- vendor/k8s.io/klog/v2/README.md | 17 +- vendor/k8s.io/klog/v2/contextual.go | 212 + vendor/k8s.io/klog/v2/exit.go | 69 + .../v1/conversion.go => klog/v2/imports.go} | 26 +- .../k8s.io/klog/v2/internal/buffer/buffer.go | 176 + .../k8s.io/klog/v2/internal/clock/README.md | 7 + vendor/k8s.io/klog/v2/internal/clock/clock.go | 178 + vendor/k8s.io/klog/v2/internal/dbg/dbg.go | 42 + .../klog/v2/internal/serialize/keyvalues.go | 346 + .../klog/v2/internal/severity/severity.go | 58 + vendor/k8s.io/klog/v2/k8s_references.go | 212 + vendor/k8s.io/klog/v2/klog.go | 1175 ++- vendor/k8s.io/klog/v2/klogr.go | 89 + .../kube-openapi/pkg/builder3/util/util.go | 51 + .../k8s.io/kube-openapi/pkg/cached/cache.go | 264 + .../k8s.io/kube-openapi/pkg/common/common.go | 324 + .../pkg/common}/doc.go | 7 +- .../kube-openapi/pkg/common/interfaces.go | 88 + .../kube-openapi/pkg/handler3/handler.go | 294 + .../k8s.io/kube-openapi/pkg/internal/flags.go | 24 + .../pkg/internal/serialization.go | 65 + .../go-json-experiment/json}/AUTHORS | 0 .../go-json-experiment/json}/CONTRIBUTORS | 0 .../go-json-experiment/json/LICENSE | 27 + .../go-json-experiment/json/README.md | 321 + .../go-json-experiment/json/arshal.go | 513 + .../go-json-experiment/json/arshal_any.go | 238 + .../go-json-experiment/json/arshal_default.go | 1485 +++ .../go-json-experiment/json/arshal_funcs.go | 387 + .../go-json-experiment/json/arshal_inlined.go | 213 + .../go-json-experiment/json/arshal_methods.go | 229 + .../go-json-experiment/json/arshal_time.go | 241 + .../go-json-experiment/json/decode.go | 1655 ++++ .../go-json-experiment/json/doc.go | 182 + .../go-json-experiment/json/encode.go | 1170 +++ .../go-json-experiment/json/errors.go | 183 + .../go-json-experiment/json/fields.go | 509 + .../go-json-experiment/json/fold.go | 56 + .../go-json-experiment/json/intern.go | 86 + .../go-json-experiment/json/pools.go | 182 + .../go-json-experiment/json/state.go | 747 ++ .../go-json-experiment/json/token.go | 522 + .../go-json-experiment/json/value.go | 381 + .../kube-openapi/pkg/openapiconv/convert.go | 322 + .../kube-openapi/pkg/schemaconv/openapi.go | 260 + .../pkg/schemaconv/proto_models.go | 178 + .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 292 +- .../kube-openapi/pkg/schemamutation/walker.go | 519 + .../kube-openapi/pkg/spec3/component.go | 47 + .../k8s.io/kube-openapi/pkg/spec3/encoding.go | 84 + .../k8s.io/kube-openapi/pkg/spec3/example.go | 96 + .../pkg/spec3/external_documentation.go | 77 + vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go | 254 + .../k8s.io/kube-openapi/pkg/spec3/header.go | 111 + .../kube-openapi/pkg/spec3/media_type.go | 86 + .../kube-openapi/pkg/spec3/operation.go | 97 + .../kube-openapi/pkg/spec3/parameter.go | 116 + vendor/k8s.io/kube-openapi/pkg/spec3/path.go | 222 + .../kube-openapi/pkg/spec3/request_body.go | 94 + .../k8s.io/kube-openapi/pkg/spec3/response.go | 310 + .../kube-openapi/pkg/spec3/security_scheme.go | 118 + .../k8s.io/kube-openapi/pkg/spec3/server.go | 135 + vendor/k8s.io/kube-openapi/pkg/spec3/spec.go | 50 + .../kube-openapi/pkg/util/proto/document.go | 2 +- .../pkg/util/proto/document_v3.go | 324 + .../pkg/validation/spec/.gitignore | 2 + .../kube-openapi/pkg/validation/spec/LICENSE | 202 + .../pkg/validation/spec/contact_info.go | 24 + .../pkg/validation/spec/external_docs.go | 24 + .../kube-openapi/pkg/validation/spec/fuzz.go | 502 + .../pkg/validation/spec/gnostic.go | 1517 +++ .../pkg/validation/spec/header.go | 118 + .../kube-openapi/pkg/validation/spec/info.go | 219 + .../kube-openapi/pkg/validation/spec/items.go | 180 + .../pkg/validation/spec/license.go | 23 + .../pkg/validation/spec/operation.go | 146 + .../pkg/validation/spec/parameter.go | 172 + .../pkg/validation/spec/path_item.go | 113 + .../kube-openapi/pkg/validation/spec/paths.go | 164 + .../kube-openapi/pkg/validation/spec/ref.go | 155 + .../pkg/validation/spec/response.go | 131 + .../pkg/validation/spec/responses.go | 208 + .../pkg/validation/spec/schema.go | 631 ++ .../pkg/validation/spec/security_scheme.go | 92 + .../pkg/validation/spec/swagger.go | 439 + .../kube-openapi/pkg/validation/spec/tag.go | 91 + vendor/k8s.io/utils/buffer/ring_growing.go | 72 - vendor/k8s.io/utils/clock/clock.go | 10 + .../k8s.io/utils/clock/testing/fake_clock.go | 9 +- vendor/k8s.io/utils/net/ipfamily.go | 181 + vendor/k8s.io/utils/net/net.go | 126 +- vendor/k8s.io/utils/net/port.go | 18 +- vendor/k8s.io/utils/pointer/pointer.go | 169 +- vendor/k8s.io/utils/strings/slices/slices.go | 82 + vendor/k8s.io/utils/trace/README.md | 67 - vendor/k8s.io/utils/trace/trace.go | 282 - .../api/clone/v1alpha1/deepcopy_generated.go | 2 +- .../api/core/v1/deepcopy_generated.go | 488 +- vendor/kubevirt.io/api/core/v1/doc.go | 5 +- vendor/kubevirt.io/api/core/v1/register.go | 15 +- vendor/kubevirt.io/api/core/v1/schema.go | 61 +- .../api/core/v1/schema_swagger_generated.go | 36 +- vendor/kubevirt.io/api/core/v1/types.go | 373 +- .../api/core/v1/types_swagger_generated.go | 150 +- .../api/core/v1/zz_generated.defaults.go | 2 +- .../api/export/v1alpha1/deepcopy_generated.go | 38 +- .../kubevirt.io/api/export/v1alpha1/types.go | 48 +- .../v1alpha1/types_swagger_generated.go | 30 +- .../kubevirt.io/api/instancetype/register.go | 7 + .../api/instancetype/v1alpha1/conversion.go | 65 + .../v1alpha1/conversion_generated.go | 822 ++ .../v1alpha1/deepcopy_generated.go | 4 +- .../api/instancetype/v1alpha1/doc.go | 2 + .../api/instancetype/v1alpha1/register.go | 2 + .../api/instancetype/v1alpha1/types.go | 2 +- .../v1alpha1/types_swagger_generated.go | 2 +- .../api/instancetype/v1alpha2/conversion.go | 65 + .../v1alpha2/conversion_generated.go | 853 ++ .../v1alpha2/deepcopy_generated.go | 25 +- .../api/instancetype/v1alpha2/doc.go | 2 + .../api/instancetype/v1alpha2/register.go | 2 + .../api/instancetype/v1alpha2/types.go | 16 +- .../v1alpha2/types_swagger_generated.go | 7 + .../v1beta1/deepcopy_generated.go | 752 ++ .../api/instancetype/v1beta1/doc.go | 24 + .../api/instancetype/v1beta1/register.go | 64 + .../api/instancetype/v1beta1/types.go | 534 + .../v1beta1/types_swagger_generated.go | 206 + .../migrations/v1alpha1/deepcopy_generated.go | 2 +- .../api/pool/v1alpha1/deepcopy_generated.go | 2 +- vendor/kubevirt.io/api/pool/v1alpha1/types.go | 7 +- .../snapshot/v1alpha1/deepcopy_generated.go | 33 +- .../api/snapshot/v1alpha1/types.go | 14 + .../v1alpha1/types_swagger_generated.go | 9 + .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/core/v1beta1/cdi.go | 2 +- .../versioned/typed/core/v1beta1/cdiconfig.go | 2 +- .../typed/core/v1beta1/core_client.go | 17 +- .../typed/core/v1beta1/dataimportcron.go | 2 +- .../typed/core/v1beta1/datasource.go | 2 +- .../typed/core/v1beta1/datavolume.go | 2 +- .../versioned/typed/core/v1beta1/doc.go | 2 +- .../typed/core/v1beta1/generated_expansion.go | 8 +- .../typed/core/v1beta1/objecttransfer.go | 2 +- .../typed/core/v1beta1/storageprofile.go | 2 +- .../typed/core/v1beta1/volumeclonesource.go | 178 + .../typed/core/v1beta1/volumeimportsource.go | 195 + .../typed/core/v1beta1/volumeuploadsource.go | 195 + .../versioned/typed/upload/v1beta1/doc.go | 2 +- .../upload/v1beta1/generated_expansion.go | 2 +- .../typed/upload/v1beta1/upload_client.go | 2 +- .../upload/v1beta1/uploadtokenrequest.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/volumesnapshot/v1/doc.go | 2 +- .../volumesnapshot/v1/generated_expansion.go | 2 +- .../typed/volumesnapshot/v1/volumesnapshot.go | 2 +- .../v1/volumesnapshot_client.go | 2 +- .../volumesnapshot/v1/volumesnapshotclass.go | 2 +- .../v1/volumesnapshotcontent.go | 2 +- .../kubevirt/clientset/versioned/clientset.go | 16 +- .../kubevirt/clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 18 +- .../typed/clone/v1alpha1/clone_client.go | 2 +- .../versioned/typed/clone/v1alpha1/doc.go | 2 +- .../clone/v1alpha1/generated_expansion.go | 2 +- .../clone/v1alpha1/virtualmachineclone.go | 2 +- .../versioned/typed/export/v1alpha1/doc.go | 2 +- .../typed/export/v1alpha1/export_client.go | 2 +- .../export/v1alpha1/generated_expansion.go | 2 +- .../export/v1alpha1/virtualmachineexport.go | 2 +- .../typed/instancetype/v1alpha1/doc.go | 2 +- .../v1alpha1/generated_expansion.go | 2 +- .../v1alpha1/instancetype_client.go | 2 +- .../virtualmachineclusterinstancetype.go | 2 +- .../virtualmachineclusterpreference.go | 2 +- .../v1alpha1/virtualmachineinstancetype.go | 2 +- .../v1alpha1/virtualmachinepreference.go | 2 +- .../typed/instancetype/v1alpha2/doc.go | 2 +- .../v1alpha2/generated_expansion.go | 2 +- .../v1alpha2/instancetype_client.go | 2 +- .../virtualmachineclusterinstancetype.go | 2 +- .../virtualmachineclusterpreference.go | 2 +- .../v1alpha2/virtualmachineinstancetype.go | 2 +- .../v1alpha2/virtualmachinepreference.go | 2 +- .../typed/instancetype/v1beta1/doc.go | 20 + .../v1beta1/generated_expansion.go | 27 + .../v1beta1/instancetype_client.go | 104 + .../virtualmachineclusterinstancetype.go | 168 + .../virtualmachineclusterpreference.go | 168 + .../v1beta1/virtualmachineinstancetype.go | 178 + .../v1beta1/virtualmachinepreference.go | 178 + .../typed/migrations/v1alpha1/doc.go | 2 +- .../v1alpha1/generated_expansion.go | 2 +- .../migrations/v1alpha1/migrationpolicy.go | 2 +- .../migrations/v1alpha1/migrations_client.go | 2 +- .../versioned/typed/pool/v1alpha1/doc.go | 2 +- .../pool/v1alpha1/generated_expansion.go | 2 +- .../typed/pool/v1alpha1/pool_client.go | 2 +- .../typed/pool/v1alpha1/virtualmachinepool.go | 2 +- .../versioned/typed/snapshot/v1alpha1/doc.go | 2 +- .../snapshot/v1alpha1/generated_expansion.go | 2 +- .../snapshot/v1alpha1/snapshot_client.go | 2 +- .../v1alpha1/virtualmachinerestore.go | 2 +- .../v1alpha1/virtualmachinesnapshot.go | 2 +- .../v1alpha1/virtualmachinesnapshotcontent.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../versioned/typed/k8s.cni.cncf.io/v1/doc.go | 2 +- .../k8s.cni.cncf.io/v1/generated_expansion.go | 2 +- .../v1/k8s.cni.cncf.io_client.go | 2 +- .../v1/networkattachmentdefinition.go | 2 +- .../clientset/versioned/clientset.go | 2 +- .../clientset/versioned/doc.go | 2 +- .../clientset/versioned/scheme/doc.go | 2 +- .../clientset/versioned/scheme/register.go | 16 +- .../typed/monitoring/v1/alertmanager.go | 2 +- .../versioned/typed/monitoring/v1/doc.go | 2 +- .../monitoring/v1/generated_expansion.go | 2 +- .../typed/monitoring/v1/monitoring_client.go | 2 +- .../typed/monitoring/v1/podmonitor.go | 2 +- .../typed/monitoring/v1/prometheus.go | 2 +- .../typed/monitoring/v1/prometheusrule.go | 2 +- .../typed/monitoring/v1/servicemonitor.go | 2 +- .../typed/monitoring/v1/thanosruler.go | 2 +- vendor/kubevirt.io/client-go/kubecli/async.go | 6 +- .../kubecli/generated_mock_kubevirt.go | 521 +- .../kubevirt.io/client-go/kubecli/guestfs.go | 18 +- .../kubevirt.io/client-go/kubecli/handler.go | 97 +- .../client-go/kubecli/instancetype.go | 16 +- .../kubevirt.io/client-go/kubecli/kubecli.go | 91 +- .../kubevirt.io/client-go/kubecli/kubevirt.go | 110 +- .../kubevirt.io/client-go/kubecli/profiler.go | 8 +- .../kubevirt.io/client-go/kubecli/version.go | 16 +- vendor/kubevirt.io/client-go/kubecli/vm.go | 113 +- vendor/kubevirt.io/client-go/kubecli/vmi.go | 117 +- vendor/kubevirt.io/client-go/log/log.go | 88 +- vendor/kubevirt.io/client-go/util/util.go | 3 +- .../pkg/apis/core/v1beta1/authorize.go | 162 + .../pkg/apis/core/v1beta1/authorize_utils.go | 351 + .../pkg/apis/core/v1beta1/register.go | 8 +- .../pkg/apis/core/v1beta1/types.go | 213 +- .../core/v1beta1/types_swagger_generated.go | 126 +- .../pkg/apis/core/v1beta1/utils.go | 18 + .../core/v1beta1/zz_generated.deepcopy.go | 408 + vendor/modules.txt | 190 +- .../internal/golang/encoding/json/decode.go | 90 +- .../internal/golang/encoding/json/encode.go | 71 +- .../internal/golang/encoding/json/fold.go | 5 +- .../internal/golang/encoding/json/fuzz.go | 9 +- .../golang/encoding/json/kubernetes_patch.go | 69 +- .../internal/golang/encoding/json/scanner.go | 4 +- .../internal/golang/encoding/json/stream.go | 9 +- .../internal/golang/encoding/json/tags.go | 16 +- vendor/sigs.k8s.io/json/json.go | 39 +- .../v4/schema/elements.go | 131 +- .../structured-merge-diff/v4/schema/equals.go | 3 + .../v4/schema/schemaschema.go | 3 + .../structured-merge-diff/v4/typed/helpers.go | 6 +- .../structured-merge-diff/v4/typed/merge.go | 7 +- .../v4/typed/reconcile_schema.go | 2 +- .../structured-merge-diff/v4/typed/typed.go | 13 +- 1475 files changed, 147904 insertions(+), 30540 deletions(-) create mode 100644 vendor/github.com/emicklei/go-restful/v3/.gitignore create mode 100644 vendor/github.com/emicklei/go-restful/v3/.goconvey create mode 100644 vendor/github.com/emicklei/go-restful/v3/.travis.yml create mode 100644 vendor/github.com/emicklei/go-restful/v3/CHANGES.md create mode 100644 vendor/github.com/emicklei/go-restful/v3/LICENSE create mode 100644 vendor/github.com/emicklei/go-restful/v3/Makefile create mode 100644 vendor/github.com/emicklei/go-restful/v3/README.md create mode 100644 vendor/github.com/emicklei/go-restful/v3/SECURITY.md create mode 100644 vendor/github.com/emicklei/go-restful/v3/Srcfile create mode 100644 vendor/github.com/emicklei/go-restful/v3/bench_test.sh create mode 100644 vendor/github.com/emicklei/go-restful/v3/compress.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/compressor_cache.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/compressor_pools.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/compressors.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/constants.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/container.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/cors_filter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/coverage.sh create mode 100644 vendor/github.com/emicklei/go-restful/v3/curly.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/curly_route.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/custom_verb.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/doc.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/entity_accessors.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/extensions.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/filter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/filter_adapter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/json.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/jsoniter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/jsr311.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/log/log.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/logger.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/mime.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/options_filter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/parameter.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/path_expression.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/path_processor.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/request.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/response.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/route.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/route_builder.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/route_reader.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/router.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/service_error.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/web_service.go create mode 100644 vendor/github.com/emicklei/go-restful/v3/web_service_container.go delete mode 100644 vendor/github.com/go-logfmt/logfmt/.travis.yml create mode 100644 vendor/github.com/go-openapi/jsonpointer/.editorconfig create mode 100644 vendor/github.com/go-openapi/jsonpointer/.gitignore create mode 100644 vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/LICENSE create mode 100644 vendor/github.com/go-openapi/jsonpointer/README.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/pointer.go create mode 100644 vendor/github.com/go-openapi/jsonreference/.gitignore create mode 100644 vendor/github.com/go-openapi/jsonreference/.golangci.yml create mode 100644 vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/jsonreference/LICENSE create mode 100644 vendor/github.com/go-openapi/jsonreference/README.md create mode 100644 vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go create mode 100644 vendor/github.com/go-openapi/jsonreference/reference.go create mode 100644 vendor/github.com/go-openapi/swag/.editorconfig create mode 100644 vendor/github.com/go-openapi/swag/.gitattributes create mode 100644 vendor/github.com/go-openapi/swag/.gitignore create mode 100644 vendor/github.com/go-openapi/swag/.golangci.yml create mode 100644 vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/go-openapi/swag/LICENSE create mode 100644 vendor/github.com/go-openapi/swag/README.md create mode 100644 vendor/github.com/go-openapi/swag/convert.go create mode 100644 vendor/github.com/go-openapi/swag/convert_types.go create mode 100644 vendor/github.com/go-openapi/swag/doc.go create mode 100644 vendor/github.com/go-openapi/swag/file.go create mode 100644 vendor/github.com/go-openapi/swag/json.go create mode 100644 vendor/github.com/go-openapi/swag/loading.go create mode 100644 vendor/github.com/go-openapi/swag/name_lexem.go create mode 100644 vendor/github.com/go-openapi/swag/net.go create mode 100644 vendor/github.com/go-openapi/swag/path.go create mode 100644 vendor/github.com/go-openapi/swag/post_go18.go create mode 100644 vendor/github.com/go-openapi/swag/post_go19.go create mode 100644 vendor/github.com/go-openapi/swag/pre_go18.go create mode 100644 vendor/github.com/go-openapi/swag/pre_go19.go create mode 100644 vendor/github.com/go-openapi/swag/split.go create mode 100644 vendor/github.com/go-openapi/swag/util.go create mode 100644 vendor/github.com/go-openapi/swag/yaml.go rename vendor/github.com/{googleapis => google}/gnostic/LICENSE (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/context.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/error.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/extensions.go (97%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/helpers.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/main.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/compiler/reader.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extension.pb.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extension.proto (100%) rename vendor/github.com/{googleapis => google}/gnostic/extensions/extensions.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/base.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/display.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/models.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/operations.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/reader.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/schema.json (100%) rename vendor/github.com/{googleapis => google}/gnostic/jsonschema/writer.go (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.pb.go (99%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/OpenAPIv2.proto (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/README.md (100%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/document.go (96%) rename vendor/github.com/{googleapis => google}/gnostic/openapiv2/openapi-2.0.json (100%) create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto create mode 100644 vendor/github.com/google/gnostic/openapiv3/README.md create mode 100644 vendor/github.com/google/gnostic/openapiv3/document.go create mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json create mode 100644 vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json create mode 100644 vendor/github.com/google/uuid/null.go create mode 100644 vendor/github.com/imdario/mergo/CONTRIBUTING.md create mode 100644 vendor/github.com/imdario/mergo/SECURITY.md create mode 100644 vendor/github.com/josharian/intern/README.md create mode 100644 vendor/github.com/josharian/intern/intern.go create mode 100644 vendor/github.com/josharian/intern/license.md create mode 100644 vendor/github.com/mailru/easyjson/LICENSE create mode 100644 vendor/github.com/mailru/easyjson/buffer/pool.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/error.go create mode 100644 vendor/github.com/mailru/easyjson/jlexer/lexer.go create mode 100644 vendor/github.com/mailru/easyjson/jwriter/writer.go create mode 100644 vendor/github.com/munnerz/goautoneg/LICENSE create mode 100644 vendor/github.com/munnerz/goautoneg/Makefile create mode 100644 vendor/github.com/munnerz/goautoneg/README.txt create mode 100644 vendor/github.com/munnerz/goautoneg/autoneg.go create mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_03_marketplace-operator_01_operatorhub.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagecontentpolicy.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_node.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/Makefile create mode 100644 vendor/github.com/openshift/api/config/v1/doc.go create mode 100644 vendor/github.com/openshift/api/config/v1/feature_gates.go create mode 100644 vendor/github.com/openshift/api/config/v1/register.go create mode 100644 vendor/github.com/openshift/api/config/v1/stable.apiserver.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.authentication.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.build.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.clusteroperator.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.clusterversion.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.console.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.dns.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.featuregate.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.image.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagecontentpolicy.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagedigestmirrorset.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.imagetagmirrorset.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.ingress.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.network.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.node.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.oauth.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.operatorhub.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.project.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.proxy.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stable.scheduler.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/stringsource.go create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.apiserver.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/techpreview.infrastructure.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/config/v1/types.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_apiserver.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_authentication.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_build.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_cluster_operator.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_cluster_version.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_console.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_dns.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_feature.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_image.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_image_content_policy.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_infrastructure.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_ingress.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_network.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_node.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_oauth.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_operatorhub.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_project.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_proxy.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_scheduling.go create mode 100644 vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go create mode 100644 vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go create mode 100644 vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go create mode 100644 vendor/github.com/openshift/api/route/v1/Makefile create mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch create mode 100644 vendor/github.com/openshift/api/route/v1/stable.route.testsuite.yaml create mode 100644 vendor/github.com/openshift/api/route/v1/test-route-validation.sh create mode 100644 vendor/github.com/openshift/api/security/v1/Makefile create mode 100644 vendor/github.com/openshift/api/security/v1/stable.securitycontextconstraints.testsuite.yaml delete mode 100644 vendor/golang.org/x/crypto/ed25519/ed25519_go113.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go delete mode 100644 vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go rename vendor/golang.org/x/crypto/internal/{subtle/aliasing.go => alias/alias.go} (84%) rename vendor/golang.org/x/crypto/internal/{subtle/aliasing_purego.go => alias/alias_purego.go} (86%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/bits_compat.go (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/bits_go1.13.go (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/mac_noasm.go (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/poly1305.go (98%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_amd64.go (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_amd64.s (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_generic.go (99%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_ppc64le.go (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_ppc64le.s (100%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_s390x.go (99%) rename vendor/golang.org/x/crypto/{ => internal}/poly1305/sum_s390x.s (99%) create mode 100644 vendor/golang.org/x/sys/cpu/endian_big.go create mode 100644 vendor/golang.org/x/sys/cpu/endian_little.go create mode 100644 vendor/golang.org/x/sys/cpu/parse.go create mode 100644 vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd.go create mode 100644 vendor/golang.org/x/sys/unix/syscall_hurd_386.go create mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s rename vendor/{k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go => google.golang.org/grpc/NOTICE.txt} (89%) delete mode 100644 vendor/google.golang.org/protobuf/AUTHORS delete mode 100644 vendor/google.golang.org/protobuf/CONTRIBUTORS create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication/v1alpha1 => api/apidiscovery/v2beta1}/doc.go (68%) create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/generated.proto create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/register.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/types.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/apidiscovery/v2beta1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/generated.proto rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication => api/authentication}/v1alpha1/register.go (75%) create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/types.go rename vendor/k8s.io/{apimachinery/pkg/apis/meta/v1beta1 => api/authentication/v1alpha1}/types_swagger_doc_generated.go (57%) rename vendor/k8s.io/{apimachinery/pkg/apis/meta/v1beta1 => api/authentication/v1alpha1}/zz_generated.deepcopy.go (57%) create mode 100644 vendor/k8s.io/api/authentication/v1alpha1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/doc.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/generated.pb.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/generated.proto create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/register.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/types.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/flowcontrol/v1beta3/zz_generated.prerelease-lifecycle.go rename vendor/k8s.io/{apimachinery/pkg/apis/meta/v1beta1 => api/networking/v1alpha1}/doc.go (74%) create mode 100644 vendor/k8s.io/api/networking/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/networking/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/types_swagger_doc_generated.go rename vendor/k8s.io/{apimachinery/pkg/apis/meta/internalversion => api/networking/v1alpha1}/zz_generated.deepcopy.go (58%) create mode 100644 vendor/k8s.io/api/networking/v1alpha1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/resource/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/resource/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/register.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/allocator.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/expiring.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/diff.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/ordered.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/set.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/admissionpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/matchresources.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/namedrulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramkind.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramref.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicybinding.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicybindingspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validation.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicy.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonexitcodesrequirement.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyonpodconditionspattern.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/batch/v1/podfailurepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/claimsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podresourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/podschedulinggate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/typedobjectreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/networkpolicystatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowdistinguishermethod.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschema.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemacondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemaspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/flowschemastatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/groupsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/limitedprioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/limitresponse.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/nonresourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/policyruleswithsubjects.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationcondition.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/prioritylevelconfigurationstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/queuingconfiguration.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/resourcepolicyrule.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/serviceaccountsubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/subject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/flowcontrol/v1beta3/usersubject.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/groupversionkind.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/status.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statuscause.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statusdetails.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1/networkpolicystatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidr.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/clustercidrspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressloadbalanceringress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressloadbalancerstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1beta1/ingressportstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/allocationresult.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podscheduling.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimconsumerreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimschedulingstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimtemplatespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclassparametersreference.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/storage/v1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/discovery/aggregated_discovery.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_validatingadmissionpolicybinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/validatingadmissionpolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/validatingadmissionpolicybinding.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/fake_authentication_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/fake/fake_selfsubjectreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1alpha1/selfsubjectreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_flowcontrol_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_flowschema.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/fake/fake_prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/flowcontrol_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/flowschema.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/flowcontrol/v1beta3/prioritylevelconfiguration.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/clustercidr.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/fake/fake_clustercidr.go rename vendor/k8s.io/client-go/{pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go => kubernetes/typed/networking/v1alpha1/fake/fake_networking_client.go} (50%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/networking_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_podscheduling.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resource_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/fake/fake_resourceclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/podscheduling.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resource_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_csistoragecapacity.go create mode 100644 vendor/k8s.io/client-go/openapi/client.go create mode 100644 vendor/k8s.io/client-go/openapi/groupversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/version/.gitattributes delete mode 100644 vendor/k8s.io/client-go/tools/cache/OWNERS delete mode 100644 vendor/k8s.io/client-go/tools/cache/controller.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/delta_fifo.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/doc.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/expiration_cache.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/expiration_cache_fakes.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/fake_custom_store.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/fifo.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/heap.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/index.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/listers.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/listwatch.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/mutation_cache.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/mutation_detector.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/reflector.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/reflector_metrics.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/shared_informer.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/store.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/thread_safe_store.go delete mode 100644 vendor/k8s.io/client-go/tools/cache/undelta_store.go delete mode 100644 vendor/k8s.io/client-go/tools/pager/pager.go create mode 100644 vendor/k8s.io/client-go/transport/cache_go118.go create mode 100644 vendor/k8s.io/klog/v2/contextual.go create mode 100644 vendor/k8s.io/klog/v2/exit.go rename vendor/k8s.io/{client-go/pkg/apis/clientauthentication/v1/conversion.go => klog/v2/imports.go} (53%) create mode 100644 vendor/k8s.io/klog/v2/internal/buffer/buffer.go create mode 100644 vendor/k8s.io/klog/v2/internal/clock/README.md create mode 100644 vendor/k8s.io/klog/v2/internal/clock/clock.go create mode 100644 vendor/k8s.io/klog/v2/internal/dbg/dbg.go create mode 100644 vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go create mode 100644 vendor/k8s.io/klog/v2/internal/severity/severity.go create mode 100644 vendor/k8s.io/klog/v2/k8s_references.go create mode 100644 vendor/k8s.io/klog/v2/klogr.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/builder3/util/util.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/cached/cache.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/common.go rename vendor/k8s.io/{apimachinery/pkg/apis/meta/internalversion => kube-openapi/pkg/common}/doc.go (76%) create mode 100644 vendor/k8s.io/kube-openapi/pkg/common/interfaces.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/handler3/handler.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/flags.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/serialization.go rename vendor/{golang.org/x/crypto => k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json}/AUTHORS (100%) rename vendor/{golang.org/x/crypto => k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json}/CONTRIBUTORS (100%) create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/LICENSE create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/README.md create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_any.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_default.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_funcs.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_inlined.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_methods.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/arshal_time.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/decode.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/doc.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/encode.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/errors.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fields.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/fold.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/intern.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/pools.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/state.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/token.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/value.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/openapiconv/convert.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemaconv/openapi.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemaconv/proto_models.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemamutation/walker.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/component.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/encoding.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/example.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/external_documentation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/header.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/media_type.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/operation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/parameter.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/path.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/request_body.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/response.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/security_scheme.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/server.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/spec.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/util/proto/document_v3.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/.gitignore create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/LICENSE create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/contact_info.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/external_docs.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/fuzz.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/gnostic.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/header.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/info.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/license.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/schema.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/swagger.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go delete mode 100644 vendor/k8s.io/utils/buffer/ring_growing.go create mode 100644 vendor/k8s.io/utils/net/ipfamily.go create mode 100644 vendor/k8s.io/utils/strings/slices/slices.go delete mode 100644 vendor/k8s.io/utils/trace/README.md delete mode 100644 vendor/k8s.io/utils/trace/trace.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha1/conversion.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha1/conversion_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha2/conversion.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1alpha2/conversion_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/deepcopy_generated.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/doc.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/register.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/types.go create mode 100644 vendor/kubevirt.io/api/instancetype/v1beta1/types_swagger_generated.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeclonesource.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeimportsource.go create mode 100644 vendor/kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned/typed/core/v1beta1/volumeuploadsource.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/doc.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/generated_expansion.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/instancetype_client.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineclusterinstancetype.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineclusterpreference.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachineinstancetype.go create mode 100644 vendor/kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/instancetype/v1beta1/virtualmachinepreference.go create mode 100644 vendor/kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1/authorize.go create mode 100644 vendor/kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1/authorize_utils.go diff --git a/go.mod b/go.mod index 520093dd..b6649c1a 100644 --- a/go.mod +++ b/go.mod @@ -7,72 +7,79 @@ require ( github.com/kiagnose/kiagnose v0.2.1-0.20221208132946-95d8c7995fab github.com/onsi/ginkgo/v2 v2.7.0 github.com/onsi/gomega v1.24.2 - github.com/stretchr/testify v1.7.1 - google.golang.org/grpc v1.40.0 - k8s.io/api v0.26.0 - k8s.io/apimachinery v0.23.5 + github.com/stretchr/testify v1.8.1 + google.golang.org/grpc v1.49.0 + k8s.io/api v0.27.1 + k8s.io/apimachinery v0.27.1 k8s.io/client-go v12.0.0+incompatible - kubevirt.io/api v0.0.0-20221013011232-17665f214e18 - kubevirt.io/client-go v0.58.0 + kubevirt.io/api v0.0.0-20230706190111-5527663af491 + kubevirt.io/client-go v1.0.0 ) require ( - github.com/coreos/prometheus-operator v0.38.0 // indirect + github.com/coreos/prometheus-operator v0.38.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/go-kit/kit v0.9.0 // indirect - github.com/go-logfmt/logfmt v0.5.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-kit/kit v0.10.0 // indirect + github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.0.0 // indirect - github.com/golang/mock v1.5.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/imdario/mergo v0.3.10 // indirect + github.com/imdario/mergo v0.3.15 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 // indirect github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/openshift/api v0.0.0-20210105115604-44119421ec6b // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 // indirect github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 // indirect github.com/openshift/custom-resource-status v1.1.2 // indirect - github.com/pborman/uuid v1.2.0 // indirect + github.com/pborman/uuid v1.2.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect - golang.org/x/net v0.4.0 // indirect - golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/term v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.23.5 // indirect - k8s.io/klog/v2 v2.40.1 // indirect - k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf // indirect - k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect - kubevirt.io/containerized-data-importer-api v1.50.0 // indirect + k8s.io/apiextensions-apiserver v0.26.3 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect + k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect + kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 // indirect kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -// Pinned to kubernetes-0.23.1 +// Pinned to kubernetes-0.26.3 replace ( - k8s.io/api => k8s.io/api v0.23.1 - k8s.io/apimachinery => k8s.io/apimachinery v0.23.1 - k8s.io/client-go => k8s.io/client-go v0.23.1 + k8s.io/api => k8s.io/api v0.26.3 + k8s.io/apimachinery => k8s.io/apimachinery v0.26.3 + k8s.io/client-go => k8s.io/client-go v0.26.3 ) diff --git a/go.sum b/go.sum index 3b6025df..25b989cd 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,14 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.49.0/go.mod h1:hGvAdzcWNbyuxS3nWhD7H2cIJxjRRTRLQVB0bdputVY= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -14,20 +16,15 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 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/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -38,54 +35,55 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v36.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v41.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v11.2.8+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -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.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= 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.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -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.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/autorest/validation v0.2.1-0.20191028180845-3492b2aff503/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -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/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/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 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 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -95,35 +93,43 @@ github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= +github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -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/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= +github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -133,20 +139,18 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 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/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= @@ -154,23 +158,21 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/prometheus-operator v0.38.0 h1:gF2xYIfO09XLFdyEecND46uihQ2KTaDwTozRZpXLtN4= -github.com/coreos/prometheus-operator v0.38.0/go.mod h1:xZC7/TgeC0/mBaJk+1H9dbHaiEvLYHgX6Mi1h40UPh8= +github.com/coreos/prometheus-operator v0.38.3 h1:EaiEJFZ6uEV5PcuvZ272kB3Z/Ki8kViMeVhMDKYx7jI= +github.com/coreos/prometheus-operator v0.38.3/go.mod h1:nHyLLa5yyGbUNTcRXIbofXLsrg90aIxt2HQp5tT9Fy0= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -181,6 +183,7 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-sysinfo v1.0.1/go.mod h1:O/D5m1VpYLwGjCYzEt63g3Z1uO3jXfwyzzjiW90t8cY= github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= @@ -190,14 +193,15 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg 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 v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= 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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= 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.20210217033140-668b12f5399d/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.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -205,57 +209,64 @@ github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structtag v1.1.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= 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.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= 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/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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 v1.2.0/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.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +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-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= +github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.4/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= 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.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -263,49 +274,89 @@ github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo 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.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= +github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= 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.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= +github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -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-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= +github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -314,11 +365,12 @@ github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/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/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= 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= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -331,8 +383,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -349,16 +401,17 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 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/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= +github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= 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= @@ -367,9 +420,9 @@ 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= +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-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= @@ -383,41 +436,40 @@ github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gm github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200417002340-c6e0a841f49a/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-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= 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/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= 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/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.6.0/go.mod h1:GICNByuaEBibcjmjvI7QvYJSZEbGkcYwAR7EZK2WMqM= +github.com/gophercloud/gophercloud v0.10.0/go.mod h1:gmC5oQqMDOMO1t1gq5DquX/yAU808e/4mzjjDA76+Ss= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -426,64 +478,83 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -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/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/grpc-ecosystem/grpc-gateway v1.14.4/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 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-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 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/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/flux v0.65.0/go.mod h1:BwN2XG2lMszOoquQaFdPET8FRQfrXiZsWmcMO9rkaVY= github.com/influxdata/influxdb v1.7.7/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/influxdata/influxdb v1.8.0/go.mod h1:SIzcnsjaHRFpmlxpJ4S3NT64qtEKYweNTUMb/vh0OMQ= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxql v1.1.0/go.mod h1:KpVI7okXjK6PRi3Z5B+mtKZli+R1DnZgb3N+tzevNgo= +github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -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/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -491,30 +562,41 @@ github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBv github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jsonnet-bundler/jsonnet-bundler v0.2.0/go.mod h1:/by7P/OoohkI3q4CgSFqcoFsVY+IaNbzOVDknEsKDeU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0 h1:VzM3TYHDgqPkettiP6I6q2jOeQFL4nrJM+UcAc4f6Fs= github.com/k8snetworkplumbingwg/network-attachment-definition-client v1.4.0/go.mod h1:nqCI7aelBJU61wiBeeZWJ6oi4bJy5nrjkM6lWIMA4j0= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kiagnose/kiagnose v0.2.1-0.20221208132946-95d8c7995fab h1:/nLuhyPsdIh90D4kKHxEMXfeYxbgVtdVe9BuDhWs/xE= github.com/kiagnose/kiagnose v0.2.1-0.20221208132946-95d8c7995fab/go.mod h1:Tg4bdyFGP/OaOkDRiHrkYGOFDsLfegF2gXCdeGR2LJ0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= +github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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= @@ -525,23 +607,29 @@ github.com/kubernetes-csi/external-snapshotter/client/v4 v4.2.0/go.mod h1:YBCo4D github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.0/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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.1/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/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= @@ -549,14 +637,21 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 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.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/minio/minio-go/v6 v6.0.49/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -569,9 +664,8 @@ github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452/go.mod h1: github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= 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= @@ -580,19 +674,29 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mozillazg/go-cos v0.13.0/go.mod h1:Zp6DvvXn0RUOXGJ2chmWt2bLEqRAnJnS3DnAZsJsoaE= github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -606,8 +710,12 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= +github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow= github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= @@ -617,34 +725,54 @@ 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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/onsi/gomega v1.24.2 h1:J/tulyYK6JwBldPViHJReihxxZ+22FHs0piGjQAvoUE= github.com/onsi/gomega v1.24.2/go.mod h1:gs3J10IS7Z7r7eXRoNJIrNqU4ToQukCJhFtKrWgHWnk= -github.com/openshift/api v0.0.0-20210105115604-44119421ec6b h1:9wG43AJGupRUUAAF/GN2CtQgVlo+BzdIlmsTwUlIATE= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openshift/api v0.0.0-20210105115604-44119421ec6b/go.mod h1:aqU5Cq+kqKKPbDMqxo9FojgDeSpNJI7iuskjXjtojDg= +github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183 h1:t/CahSnpqY46sQR01SoS+Jt0jtjgmhgE6lFmRnO4q70= +github.com/openshift/api v0.0.0-20230503133300-8bbcb7ca7183/go.mod h1:4VWG+W22wrB4HfBL88P40DxLEpSOaiBVxUnfalfJo9k= github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47 h1:+TEY29DK0XhqB7HFC9OfV8qf3wffSyi7MWv3AP28DGQ= github.com/openshift/client-go v0.0.0-20210112165513-ebc401615f47/go.mod h1:u7NRAjtYVAKokiI9LouzTv4mhds8P4S1TwdVAfbjKSk= github.com/openshift/custom-resource-status v1.1.2 h1:C3DL44LEbvlbItfd8mT5jWrqPfHnSOQoQf/sypqA6A4= github.com/openshift/custom-resource-status v1.1.2/go.mod h1:DB/Mf2oTeiAmVVX1gN+NEqweonAPY0TKUwADizj8+ZA= github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 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= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -655,45 +783,45 @@ github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2a github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.2.0/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= -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.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/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.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -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.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/prometheus v1.8.2-0.20200110114423-1e64d757f711/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= +github.com/prometheus/prometheus v1.8.2-0.20200507164740-ecee9c8abfd1/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -705,7 +833,10 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -713,63 +844,66 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/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= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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= 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/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/thanos-io/thanos v0.11.0/go.mod h1:N/Yes7J68KqvmY+xM6J5CJqEvWIvKSR5sqGtmuD6wDc= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.20.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.23.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= @@ -781,25 +915,19 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/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= github.com/ziutek/telnet v0.0.0-20180329124119-c3b780dc415b/go.mod h1:IZpXDfkJ6tWD3PhBK5YzgQT+xJWh7OsdwiG8hA2MkO4= go.elastic.co/apm v1.5.0/go.mod h1:OdB9sPtM6Vt7oz3VXt7+KR96i9li74qrxBGHTQygFvk= go.elastic.co/apm/module/apmhttp v1.5.0/go.mod h1:1FbmNuyD3ddauwzgVwFB0fqY6KbZt3JkV187tGCYYhY= go.elastic.co/apm/module/apmot v1.5.0/go.mod h1:d2KYwhJParTpyw2WnTNy8geNlHKKFX+4oK3YLlsesWE= go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= +go.mongodb.org/mongo-driver v1.3.2/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -807,54 +935,49 @@ 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.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200422194213-44a606286825/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ= -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.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -867,6 +990,7 @@ 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/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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= @@ -879,8 +1003,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -889,10 +1011,11 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +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.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= 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= @@ -923,6 +1046,7 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -930,6 +1054,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -939,50 +1064,41 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -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-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 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-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -999,11 +1115,14 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190425145619-16072639606e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1016,65 +1135,64 @@ golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 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= @@ -1086,17 +1204,19 @@ golang.org/x/text v0.3.4/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.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +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 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1110,14 +1230,17 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 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-20190617190820-da514acc4774/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-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1127,16 +1250,19 @@ golang.org/x/tools v0.0.0-20190918214516-5a1a30219888/go.mod h1:b+2E5dAYhXwXZwtn 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-20191029041327-9cc4af7d6b2c/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-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191111182352-50fa39b762bc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1148,6 +1274,7 @@ golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1158,25 +1285,27 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +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.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1194,13 +1323,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.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1223,6 +1347,7 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= @@ -1232,7 +1357,7 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200420144010-e5e8543f8aeb/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1242,23 +1367,12 @@ 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-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 h1:NHN4wOCScVzKhPenJ2dt+BTs3X/XkBVI/Rh4iDt55T8= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1272,20 +1386,15 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 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.31.1/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.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= 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= @@ -1299,28 +1408,30 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= 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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= 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.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.1.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1328,6 +1439,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -1339,8 +1451,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C 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 v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 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= @@ -1350,28 +1460,25 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -k8s.io/api v0.23.1 h1:ncu/qfBfUoClqwkTGbeRqqOqBCRoUAflMuOaOD7J0c8= -k8s.io/api v0.23.1/go.mod h1:WfXnOnwSqNtG62Y1CdjoMxh7r7u9QXGCkA1u0na2jgo= +k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= +k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= k8s.io/apiextensions-apiserver v0.17.3/go.mod h1:CJbCyMfkKftAd/X/V6OTHYhVn7zXnDdnkUjS1h0GTeY= -k8s.io/apiextensions-apiserver v0.23.5 h1:5SKzdXyvIJKu+zbfPc3kCbWpbxi+O+zdmAJBm26UJqI= -k8s.io/apiextensions-apiserver v0.23.5/go.mod h1:ntcPWNXS8ZPKN+zTXuzYMeg731CP0heCTl6gYBxLcuQ= -k8s.io/apimachinery v0.23.1 h1:sfBjlDFwj2onG0Ijx5C+SrAoeUscPrmghm7wHP+uXlo= -k8s.io/apimachinery v0.23.1/go.mod h1:SADt2Kl8/sttJ62RRsi9MIV4o8f5S3coArm0Iu3fBno= +k8s.io/apiextensions-apiserver v0.26.3 h1:5PGMm3oEzdB1W/FTMgGIDmm100vn7IaUP5er36dB+YE= +k8s.io/apiextensions-apiserver v0.26.3/go.mod h1:jdA5MdjNWGP+njw1EKMZc64xAT5fIhN6VJrElV3sfpQ= +k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= +k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= -k8s.io/apiserver v0.23.5/go.mod h1:7wvMtGJ42VRxzgVI7jkbKvMbuCbVbgsWFT7RyXiRNTw= -k8s.io/client-go v0.23.1 h1:Ma4Fhf/p07Nmj9yAB1H7UwbFHEBrSPg8lviR24U2GiQ= -k8s.io/client-go v0.23.1/go.mod h1:6QSI8fEuqD4zgFK0xbdwfB/PthBsIxCJMa3s17WlcO0= +k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= +k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/code-generator v0.20.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= k8s.io/code-generator v0.23.3/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= k8s.io/component-base v0.17.3/go.mod h1:GeQf4BrgelWm64PXkIXiPh/XS0hnO42d9gx9BtbZRp8= -k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -1387,28 +1494,33 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf h1:M9XBsiMslw2lb2ZzglC0TOkBPK5NQi0/noUrdnoFwUg= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -kubevirt.io/api v0.0.0-20221013011232-17665f214e18 h1:/BE1VmdwiTu9hVSDBzM0N2yJoHT2yODzkkxMX83X8zk= -kubevirt.io/api v0.0.0-20221013011232-17665f214e18/go.mod h1:U0CQlZR0JoJCaC+Va0wz4dMOtYDdVywJ98OT1KmOkzI= -kubevirt.io/client-go v0.58.0 h1:O7d0Tvd1pCmP02eTjIWgmmeRXkOpiH7gQvlhcHX9ssQ= -kubevirt.io/client-go v0.58.0/go.mod h1:ub/ysUi/FiuLLh6cv97Q0D9TVby/B4JpRJP0Dj9EAsw= -kubevirt.io/containerized-data-importer-api v1.50.0 h1:O01F8L5K8qRLnkYICIfmAu0dU0P48jdO42uFPElht38= -kubevirt.io/containerized-data-importer-api v1.50.0/go.mod h1:yjD8pGZVMCeqcN46JPUQdZ2JwRVoRCOXrTVyNuFvrLo= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= +k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +kubevirt.io/api v0.0.0-20230706190111-5527663af491 h1:4s0pebOHddx2bzzCoZwIg0d53dLmlh3Evi4QQ2V/+nc= +kubevirt.io/api v0.0.0-20230706190111-5527663af491/go.mod h1:CJ4vZsaWhVN3jNbyc9y3lIZhw8nUHbWjap0xHABQiqc= +kubevirt.io/client-go v1.0.0 h1:MMn41j/lFd+lJ7gWn7yuIZYW/aT9fI3bUimAuxAQ+Xk= +kubevirt.io/client-go v1.0.0/go.mod h1:zvYQ/L5OmTP2Pn7XcawtoR07p8VhgviADWtgdGCniWA= +kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 h1:IWo12+ei3jltSN5jQN1xjgakfvRSF3G3Rr4GXVOOy2I= +kubevirt.io/containerized-data-importer-api v1.57.0-alpha1/go.mod h1:Y/8ETgHS1GjO89bl682DPtQOYEU/1ctPFBz6Sjxm4DM= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 h1:QMrd0nKP0BGbnxTqakhDZAUhGKxPiPiN5gSDqKUmGGc= kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90/go.mod h1:018lASpFYBsYN6XwmA2TIrPCx6e0gviTd/ZNtSitKgc= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -1417,21 +1529,23 @@ modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03 modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/controller-tools v0.2.4/go.mod h1:m/ztfQNocGYBgTTCmFdnK94uVvgxeZeE3LtJvd/jIzA= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +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/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +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/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= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/pkg/internal/client/client.go b/pkg/internal/client/client.go index 8b7a1cc6..bc4ba771 100644 --- a/pkg/internal/client/client.go +++ b/pkg/internal/client/client.go @@ -33,11 +33,6 @@ type Client struct { kubecli.KubevirtClient } -type resultWrapper struct { - vmi *kvcorev1.VirtualMachineInstance - err error -} - func New() (*Client, error) { config, err := rest.InClusterConfig() if err != nil { @@ -55,51 +50,15 @@ func New() (*Client, error) { func (c *Client) CreateVirtualMachineInstance(ctx context.Context, namespace string, vmi *kvcorev1.VirtualMachineInstance) (*kvcorev1.VirtualMachineInstance, error) { - resultCh := make(chan resultWrapper, 1) - - go func() { - createdVMI, err := c.KubevirtClient.VirtualMachineInstance(namespace).Create(vmi) - resultCh <- resultWrapper{createdVMI, err} - }() - - select { - case result := <-resultCh: - return result.vmi, result.err - case <-ctx.Done(): - return nil, ctx.Err() - } + return c.KubevirtClient.VirtualMachineInstance(namespace).Create(ctx, vmi) } func (c *Client) GetVirtualMachineInstance(ctx context.Context, namespace, name string) (*kvcorev1.VirtualMachineInstance, error) { - resultCh := make(chan resultWrapper, 1) - - go func() { - vmi, err := c.KubevirtClient.VirtualMachineInstance(namespace).Get(name, &metav1.GetOptions{}) - resultCh <- resultWrapper{vmi, err} - }() - - select { - case result := <-resultCh: - return result.vmi, result.err - case <-ctx.Done(): - return nil, ctx.Err() - } + return c.KubevirtClient.VirtualMachineInstance(namespace).Get(ctx, name, &metav1.GetOptions{}) } func (c *Client) DeleteVirtualMachineInstance(ctx context.Context, namespace, name string) error { - resultCh := make(chan error, 1) - - go func() { - err := c.KubevirtClient.VirtualMachineInstance(namespace).Delete(name, &metav1.DeleteOptions{}) - resultCh <- err - }() - - select { - case err := <-resultCh: - return err - case <-ctx.Done(): - return ctx.Err() - } + return c.KubevirtClient.VirtualMachineInstance(namespace).Delete(ctx, name, &metav1.DeleteOptions{}) } func (c *Client) VMISerialConsole(namespace, name string, timeout time.Duration) (kubecli.StreamInterface, error) { diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go index 913d690c..805cc912 100644 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go +++ b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/bindata.go @@ -82,7 +82,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdc\xb8\x95\x28\x0e\xff\x9f\x4f\x81\xf2\xa4\x4a\x76\x3d\xdd\x2d\x3b\xc9\xcd\xdd\xeb\x9b\xda\x5b\x8a\xa5\x49\xf4\x64\x2c\xab\x2c\x8d\xe7\xe6\xf7\x52\xb3\x68\x12\xdd\x8d\x15\x09\x30\x00\xd8\x72\xcf\xdd\xfd\xee\xbf\xc2\x39\x00\x5f\xba\x49\x10\x6c\xb5\x6c\x6f\x86\xdc\xaa\xcd\xb8\x45\x1e\x00\x07\x07\x07\xe7\xfd\xfc\x66\x3e\x9f\xff\x86\x16\xfc\x13\x53\x9a\x4b\xf1\x96\xd0\x82\xb3\xcf\x86\x09\xfb\x2f\xbd\x78\xf8\x17\xbd\xe0\xf2\x7c\xfb\x66\xc9\x0c\x7d\xf3\x9b\x07\x2e\xd2\xb7\xe4\x5d\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x4b\xb6\xe2\x82\x1b\x2e\xc5\x6f\x72\x66\x68\x4a\x0d\x7d\xfb\x1b\x42\xa8\x10\xd2\x50\xfb\xb3\xb6\xff\x24\x24\x91\xc2\x28\x99\x65\x4c\xcd\xd7\x4c\x2c\x1e\xca\x25\x5b\x96\x3c\x4b\x99\x82\x11\xfc\xf8\xdb\xd7\x8b\xdf\x2d\xfe\xf0\x1b\x42\x12\xc5\xe0\xf3\x7b\x9e\x33\x6d\x68\x5e\xbc\x25\xa2\xcc\xb2\xdf\x10\x22\x68\xce\xde\x12\x9a\x31\x65\x72\x2a\xe8\x9a\x29\xbd\xc8\xa5\xe0\x46\x2a\x2e\xd6\x8b\x44\x2a\x26\xf5\x22\x91\xf9\x6f\x74\xc1\x12\x98\x4c\x9a\xc2\x0c\x69\x76\xab\xb8\x30\x4c\xbd\x93\x59\x99\xe3\xcc\xe6\xe4\xff\x7f\xf7\xe1\xe6\x96\x9a\xcd\x5b\xb2\xb0\x1f\x2c\xdc\x5c\x60\xd6\x29\xd3\x89\xe2\x85\x81\xb9\xdd\x6f\x18\x71\x7f\x24\x72\x45\x2e\x1a\x33\x80\x97\x71\x62\x9f\x1a\x9f\x9b\x5d\xc1\xde\x12\x6d\xec\xc4\x3a\xc7\x52\xac\xc8\x78\x42\x75\xf7\x60\x29\xd3\x5c\xb1\x94\xf8\xb7\x88\x28\xf3\x25\x53\xfb\x83\xeb\xc6\xe8\x1f\x9b\x00\x71\x78\xbb\x62\x9c\x62\x6b\x7c\xbf\x5b\x8b\x03\x4c\x37\xc0\x5d\xac\x59\x03\x52\x4a\x8d\xfd\xe7\x5a\xc9\xb2\x78\x4b\xba\x71\x8e\x5f\xba\x4d\x47\x82\x39\x40\x54\xc6\xb5\xf9\xdb\xc1\x9f\x7e\xe0\xda\xc0\x9f\x8b\xac\x54\x34\xdb\xdb\x62\xf8\x8b\xe6\x62\x5d\x66\x54\xb5\xff\xf6\x1b\x42\x0a\xc5\x34\x53\x5b\xf6\xa3\x78\x10\xf2\x51\x7c\xcf\x59\x96\xea\xb7\x64\x45\x33\x6d\x67\xac\x13\x69\xe7\x7f\x63\x67\x56\xd0\x84\xa5\xf6\xb7\x72\xa9\x1c\x0d\xeb\xb7\xe4\xff\xfc\xe7\x6f\x08\xd9\xd2\x8c\xa7\x80\x0b\x9c\xbe\x2c\x98\xb8\xb8\xbd\xfe\xf4\xfb\xbb\x64\xc3\x72\x8a\x3f\xee\xed\x53\x73\x05\xee\x2f\x4b\xa6\x09\x15\xed\xbf\x24\x59\xa9\x0d\x53\x0b\x07\xa2\x50\xb2\x60\xca\x70\x8f\x28\xfb\x34\x8e\x61\xf5\xdb\xde\x60\x67\x76\x36\x8e\x02\x53\x7b\xf0\x98\x26\xa6\xa6\x4a\x96\x12\x0d\x33\xb5\x14\x62\x36\x5c\x5b\xca\xb1\x98\x11\x78\x14\x1b\x60\x89\x7d\x85\x0a\x22\x97\xff\xce\x12\xb3\x20\x77\x16\x7b\x4a\x13\xbd\x91\x65\x96\xda\xd3\xba\x65\xca\x10\xc5\x12\xb9\x16\xfc\x97\x0a\xb2\x26\x46\xc2\x90\x19\x35\xcc\xed\x97\x7f\xe0\x68\x09\x9a\x59\x3c\x96\x6c\x46\xa8\x48\x49\x4e\x77\x44\x31\x3b\x06\x29\x45\x03\x1a\xbc\xa2\x17\xe4\xbd\x54\x8c\x70\xb1\x92\x6f\xc9\xc6\x98\x42\xbf\x3d\x3f\x5f\x73\xe3\x19\x4f\x22\xf3\xbc\x14\xdc\xec\xce\x81\x7d\xf0\x65\x69\xa4\xd2\xe7\x29\xdb\xb2\xec\x5c\xf3\xf5\x9c\xaa\x64\xc3\x0d\x4b\x4c\xa9\xd8\x39\x2d\xf8\x1c\x26\x2e\x80\xef\x2c\xf2\xf4\xbb\x6a\x87\xcf\x1a\x33\xdd\x3b\x95\xf8\x00\xa9\xf6\xe2\xdd\x52\x2b\xe1\x9a\x50\xf7\x19\xce\xbf\x46\xaf\xfd\xc9\x62\xe5\xe3\xd5\xdd\x3d\xf1\x83\xc2\x16\xb4\x71\x0e\xd8\xae\x3f\xd3\x35\xe2\x2d\xa2\xb8\x58\x31\x85\x1b\xb7\x52\x32\x07\x88\x4c\xa4\x85\xe4\xc2\xc0\x3f\x92\x8c\x33\xd1\x46\xba\x2e\x97\x39\x37\x76\xa7\xff\x51\x32\x6d\xec\xfe\x2c\xc8\x3b\x60\xbf\x64\xc9\x48\x59\xd8\x43\x9b\x2e\xc8\xb5\x20\xef\x68\xce\xb2\x77\x54\xb3\x67\x47\xbb\xc5\xb0\x9e\x5b\x94\x0e\x23\xbe\x79\x6b\xb4\x5f\x44\x6c\x55\x3f\x7b\x6e\xde\xbd\x43\x77\x05\x4b\xf8\x8a\x27\x40\xe8\x48\xff\x35\x03\x5d\xb2\x0d\xdd\x72\xa9\xfc\xef\x07\x1c\xc9\x3f\xfe\x98\xf6\x20\x68\x53\x2e\x2d\x93\x3b\xb7\xb7\x97\x12\xcc\x30\xdd\xc0\xd5\x32\x93\xcb\xf3\x9c\xda\xef\x8f\xc5\x9b\x5d\xe2\x9c\x8a\x74\xae\x0d\x35\x65\x0b\x77\x5d\x1c\x03\xb8\x46\x7d\xb7\x31\xa6\xf6\xfe\xb8\xcf\xab\xda\xef\x12\x9a\x65\xf2\x51\x13\x2e\x2c\x9e\x2d\x09\x53\xa2\x99\x01\xce\x50\xbd\xd9\x71\xd3\x34\x1f\x23\x49\xc1\x98\x22\x8f\xdc\x6c\xec\x3f\x56\x52\xe5\x84\x92\x0d\x5f\x6f\xb2\x1d\xa1\x5b\xca\x33\xba\xcc\xd8\x3e\xff\xab\x58\x86\x61\xf9\xc1\x9c\x7b\x08\xa5\xf9\x27\xaa\x14\xdd\xb5\xf1\xb0\x02\x39\x64\x17\x44\xc0\xf5\x0a\xa8\x88\xaf\x38\x4b\x67\x40\x09\x85\x4c\xcf\x34\xf0\xb6\xb4\xcc\x2c\x0a\x12\x29\xb4\x51\x94\xdb\xc3\xb9\x07\xaa\x6f\x0b\xec\x23\x64\xca\x2e\x7a\xa6\x70\x30\x8d\xcb\xea\x9a\xb0\x9f\x55\x53\x6f\x4e\x43\x95\x19\xd3\x16\x9b\x7e\x96\xfb\x93\x19\x9a\x10\xfe\x9d\xad\x98\x52\x2c\xbd\x2c\x2d\x26\xef\x2a\xf0\xd7\x6b\x21\xab\x9f\xaf\x3e\xb3\xa4\x34\x7b\xd7\x4e\xef\xdc\xad\x5c\xe2\xe6\x09\xdb\x9e\x65\x6e\x18\xbb\xfb\xfe\x0f\x76\xc2\x70\x53\xd8\xf5\x1d\x12\x8d\x7f\xcc\x86\x1a\xa2\xa9\xe1\x7a\xb5\x83\x75\x56\x98\x60\x9f\x2d\x87\x04\x21\xb4\xde\x31\xb2\xdc\x39\xe6\x68\xaf\xf7\x59\x2f\xd8\x65\x69\x08\x37\xc0\x51\x93\x8d\x94\x9a\x11\x8a\x88\x86\xf1\xb6\x5c\xc2\xdd\x45\xa4\x60\x44\x2a\x92\xdb\x93\x8e\x7c\xa1\x17\x62\x63\x3a\x0b\xc0\x40\x0d\x8e\x6b\x92\x4b\x6d\x6a\x5c\xdb\x5f\xec\x5a\x2c\x78\x7b\x2a\x02\xab\x67\x64\x6d\x65\x2f\xa6\x0d\xd1\x65\x6e\x27\xf1\xc8\xf8\x7a\x63\xf4\x8c\xf0\x05\x5b\xc0\xf6\x33\x9a\x6c\x1a\xc3\xe5\x8c\x99\x7e\x84\xd2\x2c\xf3\x2c\xae\x49\x4b\xec\x1f\x25\x57\x2c\xb7\x17\x0e\x79\x59\xdd\x4e\xee\xc6\x98\xf9\xbf\x1f\x50\x49\xff\x30\x1d\xdb\x34\x23\xcc\x24\x8b\x57\x33\x92\xc8\xbc\x28\x8d\xc5\xb9\x5d\xd3\x72\x67\xcf\xb8\xa2\xee\x86\x54\xb2\x5c\x87\x31\xc2\x32\x37\x51\x2f\xc2\xc0\x66\x83\x2c\x61\x99\x92\x58\x93\x17\x88\xa4\x17\x5e\x12\xd1\x65\xde\x0b\x91\x23\x32\x00\x7f\x39\x35\xc9\xc6\x09\x4c\x89\x54\x8a\xe9\x42\x0a\x80\x08\x7f\xb9\xaa\xd7\xf2\x3f\x83\xc4\x60\x81\xbd\xd4\xaf\x1c\xcb\xdb\x30\x60\x76\x7e\x0f\xa9\x62\xf0\x5b\x9b\x26\xba\x0e\x2f\xe9\x67\x7f\xfe\x69\x33\x6f\x41\x58\x5e\x98\x5d\x83\xd2\x1a\x7b\x6c\x98\xca\xab\x15\x52\xd0\x93\xfa\x1e\xbc\x56\x35\xce\x9f\xe7\x56\x5f\xe0\xc6\x51\x1e\x79\x4d\x5e\x02\xe9\x71\x73\xa6\xe1\xd8\xcc\x65\xf1\x6a\x41\x2e\xbc\xf2\xd5\xf7\x0c\x4f\x4a\xc8\x6a\x64\x37\x84\x9d\xa8\x96\x01\xa0\xd5\xf8\xbd\xef\x0c\x71\xc0\xe6\xe4\x98\x48\x58\xe8\xad\x7d\x7c\x23\xd5\x68\x96\xb1\xc4\x58\x3e\xcc\x54\x3e\x23\x54\x6b\x99\x70\x2b\x52\x55\xfb\x1f\x04\x49\xf6\x48\x0d\xd1\xdc\xbf\xa0\xf8\x45\xd9\x67\x9f\x70\x87\xde\x3f\x58\xa2\xd5\xc4\xec\x49\x6b\x2f\xb5\xc9\x30\x06\x21\x12\x7b\xc6\xed\xf7\x67\x9a\x64\x74\xc9\xb2\x83\x7b\xf3\xf0\x19\xa0\xfb\xde\xe9\xf6\x4e\xd3\xc9\xe6\xee\x2f\x11\x80\xdd\xe5\x63\xe5\x34\xca\x85\x76\xfa\xc8\x8c\x50\xf2\xc0\x76\xa8\xba\x58\xed\xa8\xb0\xac\x0b\x2e\x61\x6a\xa2\xa0\x2a\x86\x97\x8b\xe5\x01\x0f\x6c\x07\x80\x9c\xae\x13\xf1\x7d\xfc\xce\xe3\xf3\xc0\x3a\x85\x8d\xae\xe7\xe0\x12\x87\xbd\x82\x39\x02\x26\x80\x93\x8e\xc1\x1f\x01\x95\xb5\xc8\x38\x03\x9d\x23\xf2\x9b\x80\x64\xd7\xfd\xf8\x2d\x38\x6a\x9d\x1f\x2b\x45\x0b\x37\xf6\x4c\xe3\x06\xd9\xb3\xb2\xe1\x45\xf4\x3a\x8d\xac\x45\x63\xaf\xb9\x7e\xa2\x19\x4f\xab\xe9\x69\xe0\xfc\xd7\xa2\x5f\x2a\xd9\x7f\x6e\xa4\xb9\x16\x33\x72\xf5\x99\x6b\x7b\xe1\x5f\x4a\xa6\x6f\xa4\x81\x7f\x2e\xc8\x5f\x0c\xd2\xe0\x0f\x03\xac\xa2\x31\xc5\xb1\x88\xc5\x75\x1c\x85\xd6\x0b\x81\x02\xb8\x45\x47\x53\x1f\xd6\x0b\x2b\x61\x0f\xb3\xc4\xfa\xa9\x0e\x18\xd7\x56\x43\x95\xca\xa3\x05\xac\x1a\x00\xb3\x43\xd6\x0f\x3d\x79\xa9\x41\xf1\x15\x52\xcc\xe1\xbe\xf4\x73\x6a\x8d\x85\x58\x8f\x9f\xa6\x6a\xed\xcf\xe1\xf4\xfc\xb0\xd1\x10\xfb\xa7\xf6\x17\x63\x87\xfb\xa1\x35\x48\xfc\x81\xac\x27\xb3\xa1\x5b\x10\xc2\xb8\x58\x67\x95\x58\x35\x23\x8f\x1b\x9e\x6c\x40\x6e\x8f\x06\xba\x64\x68\xda\x29\x14\xb3\xf7\x1e\x05\xeb\x96\xb3\x2a\x5a\x71\x98\x7b\x24\xf0\xf8\x89\x2a\x56\x64\x34\x61\x29\x49\x41\xe8\x44\xc3\x0a\x35\x6c\xcd\x13\x92\x33\xb5\x66\xa4\xb0\x77\x5b\x2c\xf5\x47\x5f\x28\xf8\x8c\x3e\x2c\xfd\x7a\x67\xf7\xe3\x45\xea\x98\x29\xcd\x2d\x67\x8a\x7a\xcf\x93\x49\xc4\xcb\x9d\x16\x94\xf0\xcb\x31\x6b\x03\x81\xc3\x59\x57\xbf\xb2\xac\x01\x7a\xc1\x24\x6b\x4c\xb2\x46\xef\x33\xc9\x1a\xfe\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\xf8\x2f\x24\x6b\x44\x02\x45\x7b\xca\x08\xb3\xce\x4f\x68\xe7\xda\xb7\xe3\x80\x60\xe3\xbd\x78\x2d\x93\xcd\xc0\x8a\xac\x98\x70\xe7\xee\xb2\x7b\x30\x11\x71\x01\x40\x14\x15\x6b\x46\xde\xcc\xdf\xbc\x7e\x1d\xa6\xac\x95\x54\x39\x35\xe0\xa7\xff\xfd\xef\x22\x70\x52\xfb\xf3\xbb\x9f\x61\x7a\x98\x37\x2c\x62\x81\x97\x10\xb7\xfd\xd6\xda\xe1\x1d\x1a\xda\xec\x3e\xcb\xf3\x13\xfc\x13\x8e\xcb\x55\x26\xea\x96\xf1\xfb\xc0\x95\xd0\xbb\x38\x67\x75\x56\x96\xb9\x1b\x92\x33\x43\xa8\x69\x99\x36\x79\xce\x2a\x0f\x12\xba\x41\xd0\xe3\xda\x0b\xd1\xfb\x46\x52\x22\x85\xb3\x5c\x5b\xda\x59\x44\xce\xb8\xdf\xdb\xd1\x74\x8a\x90\x84\x51\xcd\xac\x0c\xb1\x64\xd5\xac\x65\x6e\x67\xc9\x85\xf1\x0c\xd0\x4e\x99\x79\xac\xf6\x02\x7e\xc9\x16\xeb\x05\x49\x4b\x00\x47\x85\x73\x25\xbf\xc2\x55\xeb\x9d\x36\x2c\x07\x1f\x8b\x54\xf0\x3f\x76\xf9\x46\xed\x88\xe9\xb7\xe8\xb2\x2d\x13\xa6\xa4\x59\xb6\x23\x6c\xcb\x13\x53\xe1\x0f\xbc\xdd\xdc\xa0\x3f\xac\xef\xb4\xc4\x08\xac\xfb\xa7\x31\xc8\xa7\xf7\xc4\x37\x24\xc5\x45\xaf\xa6\x62\x2c\x3c\x70\xff\x84\x0f\xa9\x7d\x0d\x28\xe7\xc3\xc7\x7e\xcb\x3f\x89\xbb\x48\xf6\x75\x92\x32\xcb\x2c\xbe\xd1\x11\x70\x38\x3d\x6f\x6c\x1f\xe4\x59\xde\x14\x8f\xde\xac\x16\xc5\xa1\xff\x08\x3d\x19\x17\x37\x97\x16\x23\x43\x4b\x26\xe4\x5e\x16\x32\x93\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\xe0\x20\x53\xa2\xcb\xa5\x93\x6c\x87\x05\xb7\x9b\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf5\x4c\x7a\xec\xc1\x33\xe9\xb1\x91\x53\x9c\xf4\x58\x78\x26\x3d\x76\xd2\x63\x07\x9f\x49\x8f\xed\x78\x79\xb2\x99\x4f\xb2\x46\xe0\x99\x64\x8d\x83\x67\x92\x35\x26\x59\x63\x92\x35\x26\x59\x23\xf8\x4c\xb2\x46\xc7\xcb\x27\xb3\x99\x0f\x83\x1b\x42\xcf\xfc\xd0\xd0\x16\xb4\x00\xf7\x4e\x29\xf8\xe7\x42\xa6\x47\x84\xd4\x17\x32\x0d\x44\xd4\xa3\x51\x33\x91\xf3\x4c\x26\x98\xcd\xd6\x31\x29\x7b\x62\x2c\x18\x67\xc9\xd7\x34\x47\x5b\xed\x8c\xfc\x22\x05\xc3\x48\x67\x7b\xcc\xc0\xb2\x2a\xcd\x86\x29\xfb\xfa\x4b\xfd\xaa\x33\x52\x75\x8a\xd2\xef\x7c\xa6\x28\xfd\x29\x4a\xdf\x3d\xcd\x28\xfd\x0d\xd5\x48\x97\x78\x11\xf6\x07\xed\x37\xb8\x83\x65\x40\xff\x33\x38\xdf\xaf\x14\xb3\x6f\x89\xd0\x11\x0b\x64\x55\xd5\x1b\x8f\xeb\x4a\x9d\x3b\x92\xa5\xb7\xed\xd5\x04\xb8\x37\xea\x70\x30\x69\x9a\xa6\x2c\x25\x05\x53\x73\x24\x3d\x49\x56\x5c\xa4\x1d\x6b\xf1\xeb\xef\x05\x1b\x19\x47\xdf\x9e\xe4\x08\xd7\x45\xd3\xbb\xd2\x62\xd0\xfb\x51\xf5\x03\x77\x61\xb5\x7f\xcf\x19\x55\x0f\x9a\x97\xbf\xdc\xc6\xab\xec\xa0\xb7\xfd\xa3\x64\x6a\x47\xe4\x96\xa9\x5a\x33\xa9\x92\x51\x63\x94\x10\xb8\x7b\xb8\x26\x09\xd5\xc8\xa8\x87\x45\xad\x71\xda\xe9\x78\x3f\xc8\xc1\x62\xf7\x41\xa0\x96\xef\x6d\x16\x80\x88\x48\xe9\xad\xd3\xb4\xd1\xe1\x9c\xa2\x2a\x56\x84\x47\xd7\x55\xd4\xcb\xa3\x84\xd3\xce\xdd\xee\x31\x79\xc4\xab\x05\x0d\x37\xde\x80\xd9\x23\x1e\xe6\x9e\x79\xe4\x89\xa6\x0f\x72\x84\xf9\x83\x8c\x33\x81\x90\x7d\xf4\xda\x59\xba\x7b\xfa\xd0\x1a\x32\x02\x68\x83\xbe\xc6\x5b\x44\xc8\x71\xfa\xc8\x78\xcb\x08\xd9\x5f\x7e\xb5\x7d\xea\xc0\x4c\x32\x6a\xf1\x4d\x93\x4a\xbf\xa9\x64\x14\xc8\x03\xb3\x4a\xdb\x5c\x02\xb4\xd5\xb2\x98\x3c\x37\xb2\xc7\x59\x4b\xc8\x3e\xaa\x9d\xad\x80\x83\xea\xbc\x67\x3b\x19\x85\x98\xb6\x9d\xa5\xd7\x7e\x32\x0a\x66\x9f\x31\xa3\x6d\x43\x19\x0d\xf2\xd0\xde\x72\x60\x47\x39\xcd\x34\xdd\x14\x6b\x43\xc4\x28\xb0\x58\xc5\xe2\x94\xc6\x08\x32\xde\x20\x41\x8e\xa5\xcb\xb1\x86\x09\x32\xd2\x38\x41\x46\x18\x28\xc8\x58\x23\x05\x19\x6b\xa8\x20\xa3\xd7\x0b\x22\xc4\x0f\x10\x02\x11\xb7\xdc\x66\x2d\x9f\xb1\xb7\xd1\xe8\x1d\x3c\x94\x76\x70\xaa\x28\xe8\xe4\xb4\xb0\x5c\xe2\xff\xd8\xab\x19\x08\xff\x3f\x63\xef\x51\xca\x95\xb6\xa2\xb0\x33\xfe\x35\x20\x78\x9b\x43\x63\xb0\x48\xa0\x76\x36\x5c\x13\x4b\x3b\x5b\x9a\x59\x01\x04\xc3\xb6\x9c\xaa\x66\x67\xba\x2f\xaf\xc5\x9e\xef\xc7\x8d\x55\xcf\xed\xe5\x8b\x6a\x1e\xd7\xe4\xc5\x03\xdb\xbd\x98\x1d\xf0\x91\x17\xd7\xe2\x45\x2c\x54\xea\x54\x95\x16\xcf\xa8\x24\x1f\x29\xb2\x1d\x79\x01\x7f\x7b\x11\x7b\xb0\xbb\xc4\xc5\x31\x82\xe0\x11\x46\xb9\xa8\x97\x85\xaf\x3b\x34\xd6\x01\x58\x7f\x58\xd9\x57\xbc\x62\x5c\xff\x29\xc6\xda\xe8\x25\xa8\xbb\x43\x39\x88\xbc\xac\xd2\xc6\xd7\x16\xf3\xe6\x55\xbf\x2a\xdd\x58\x52\x2b\x12\x0d\x44\xfe\x9c\x51\xa1\xc9\x0b\x6f\x3d\x3b\xd3\xf5\x1c\x5f\x9c\xce\xe3\x38\xea\x0c\xc7\xf3\x22\xe3\x02\xd8\xfe\x16\x23\xae\xee\xe9\xf8\xce\x5a\xe8\x4a\x27\x2d\x59\x6d\x5e\x4c\xc9\x4b\xaf\xe9\xf6\xeb\xde\xf5\x23\x15\x44\x51\xb6\x3e\x17\x86\xcf\x2b\x18\xb5\xfe\x6b\x35\xc2\x58\xf6\xea\xc3\x9a\xdb\x14\xe0\x8d\x9b\x95\xdd\xae\xa6\xa8\x98\x13\xfc\xb8\x61\xaa\xb5\x52\xae\x5d\x49\x2a\xf0\x40\xa8\x52\x08\x3b\xae\x14\xce\xac\x17\x05\xd2\xb2\x19\xac\xac\xe4\xcc\x24\x28\xf6\xc3\xaa\x41\xf6\xaf\x77\x29\x32\xd4\x91\x78\x03\x26\x94\xbb\x72\x31\x93\x52\xb8\x43\x64\x7f\xf1\x96\x38\xc0\x0b\x4b\x63\x31\xcb\xab\x35\x2e\xc8\x15\x1c\x82\xe6\xe4\xb8\x86\x9d\x84\x02\x3b\x31\xdc\x27\x9a\xaa\xe3\x64\x83\x79\x73\x32\xa7\x70\x19\x8c\x0e\xb3\x7f\x3c\x71\x98\xfd\x9e\xe9\xe9\xbf\x48\x94\x7d\xa4\x51\x6f\x0a\xb5\x9f\x42\xed\x1b\xa1\xf6\xf0\x11\x72\xbe\xe1\x98\xfb\x7e\x9a\x81\x58\xfc\xd8\x98\x7b\xf2\xd3\x86\xc1\x89\x0a\x18\xd8\xec\x16\xe5\x65\x66\x78\x51\x3b\xac\x35\x4e\x2d\x43\xf5\x11\x03\x95\xf4\x9e\x75\x36\x94\x11\x40\x93\xcd\xfe\x31\x81\x71\xc0\xa1\xad\x81\x23\x3b\x37\x0b\xcd\x32\x17\x5b\x6f\xf5\xca\xfe\x3d\x62\xce\x57\xc5\x4f\x63\xc2\xbf\x74\x65\x16\x2b\xa3\x09\x38\x27\x5e\xda\xcb\x32\xb3\xe4\x60\xaf\x2c\xcf\xd5\x42\x3e\xd7\x83\xfb\x17\xad\x32\x5b\xe6\x1d\x24\x6b\xbe\x65\xa2\xbe\x84\x5f\xea\x57\xaf\x86\xc2\x9a\x4c\xa4\xe8\x71\x28\x58\x04\x80\x76\x89\x1c\xb3\xc8\xeb\x3e\x00\xb6\x12\x04\x22\xae\xf9\x3f\x35\x6e\xaf\x7f\x0d\xc0\xac\x9d\x43\xbd\x17\x3c\xa0\xa7\xba\xe2\xab\x0d\x0c\x00\xe5\xc3\xab\x89\xb3\x83\x8e\x70\x23\x1c\xe1\x42\x20\xbc\x9f\x9d\xe0\x33\xc6\x7d\xf0\xc5\xd2\x27\x22\x5c\x06\x63\xc2\xdc\x86\xdd\x05\xb1\xfa\xdf\xb1\x21\x8f\x41\x07\xc0\x14\xf3\x18\x7c\xe2\x8d\xfd\xff\x7c\xa1\x8f\x01\xe3\xfe\x37\x1a\x03\x79\xb4\x51\xff\x4b\x86\x3e\x86\x0c\xf9\x23\xbd\x5d\x64\xc8\x88\xff\xc4\x00\xc0\xa1\x20\xc8\x68\x98\x3d\xc6\xfb\x6e\x83\x7c\x34\xd4\x2e\xc3\x7d\xa7\x31\x3e\x1a\xe2\x14\x41\x38\xf8\xde\xd7\x8e\x20\x1c\x69\x90\x3f\xd6\x18\x3f\x6a\x77\xc6\x1a\xe1\x9d\x79\x3d\x62\x1a\x91\x06\xf8\x43\xd3\x7a\xcc\x12\x07\x8d\xef\xfb\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x69\x52\x8f\x00\xdb\x6d\x74\x7f\x92\x38\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xc7\x9b\xcf\x23\x62\x09\x46\x98\xce\xbd\x61\x7c\x00\xe2\x29\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\x73\x98\xc8\x47\x9a\xc7\x63\xd4\x72\xd2\xa9\x9a\x87\x4c\xe3\xa8\x09\x0f\x80\x8c\x37\x8b\x37\xb5\xe1\xa1\xe5\xc7\x9a\xc4\x9b\xfa\xf0\x90\x67\x2a\xca\x1c\x7e\x68\xec\x8e\xf7\xa6\x8c\x32\x85\x47\x51\x6b\x8c\xe5\x35\xc6\xfc\xfd\x64\xa3\xea\x60\xf0\xba\x30\xfc\xd8\x00\xf6\x26\x5d\xf7\x44\xb1\x77\xce\x99\x6e\x25\x4f\x49\x51\x1a\x17\xca\x3b\x3a\x92\xbd\x13\xea\xaf\x2a\xba\xbd\x85\xfa\x60\x88\x7b\xd8\xa4\x3d\x3b\x22\xc4\xbd\x17\xa2\x3b\x96\x47\x84\xb8\xf7\x83\x74\xa1\xef\x47\x85\xb8\xf7\x42\x85\xd0\xf7\xe3\x42\xdc\x07\x4f\xfc\x3e\x09\xf5\xef\x95\x8f\x73\xef\x05\x39\x1c\xff\x1e\x88\x73\xef\xb7\x90\x07\xe3\xdf\x03\x71\xee\xfd\xe8\x8c\x8e\x7f\x3f\x88\x73\x0f\x90\xfc\x14\xff\xbe\xf7\x4c\xf1\xef\x8d\x67\x8a\x7f\x8f\x5c\xec\x14\xff\x3e\xc5\xbf\x0f\x3d\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\xde\xf1\x4c\xf1\xef\x53\xfc\xfb\x14\xff\xde\x78\xa6\xf8\xf7\x81\xa5\x4c\xf1\xef\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x1d\xaf\x7c\x95\xf8\xf7\x96\x11\xba\x37\x08\x3e\x60\x8e\xad\xeb\xa7\x8c\x0c\x82\xef\x85\xb9\x64\xc3\x41\xf0\xbd\xd3\xee\x85\xda\x53\xe3\x27\x2a\x12\xbe\xdf\xf4\xda\x8c\x90\x1f\x15\x09\x1f\x30\x9a\x77\x54\xa5\x7f\x62\xf5\x79\xd2\x88\x90\x3f\x36\x12\xbe\x9f\x04\xe4\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x8f\xcf\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x7f\xf0\x4c\x91\xf0\x9d\xd3\x9d\x22\xe1\xa7\x48\xf8\x29\x12\xbe\x7e\xa6\x48\xf8\xf6\x33\x45\xc2\x4f\x91\xf0\x81\x67\x8a\x84\x7f\x9e\x48\xf8\xde\x3f\x2d\xa9\x66\xd7\x39\x5d\xb3\xfd\xd9\xb7\x0e\xcc\x9f\xad\xd6\xce\xed\x6b\x55\x94\x73\xa9\x59\x6a\x59\x4e\xca\x8a\x4c\xee\x60\x5b\x66\x40\x05\xb2\x34\xc4\xd0\x83\xc0\xf8\x5e\x54\x26\x52\xac\xf8\xfa\x3d\x2d\x0e\x78\x47\x6b\x0a\xef\xaa\xd7\xda\x2a\x7a\xf3\xf7\x66\x78\xbd\x3f\x21\x07\x78\xa2\xa8\xd3\x5d\x64\x4c\x99\x9c\x0a\xba\x66\xca\x21\xc6\xb7\x7d\xd0\x1b\x9a\x65\x60\x45\x95\xa5\x80\x33\xe3\x4d\xb7\xcd\x8f\x0e\x00\xdf\xca\xd4\xe9\xfc\x8d\x39\x81\x8d\xb2\x09\xe6\x9c\x99\xe4\x9c\x36\xe0\x9c\x23\x02\x72\x5a\xe8\xf3\x3f\x55\xff\x3d\xb7\x0b\xf8\xd7\x7d\x24\xf6\xb0\xd8\x00\x99\xf6\x51\x0c\x0e\x74\xc7\x12\xc5\x0e\x1c\x2a\x1d\x78\xc7\x17\xbd\x3e\x6c\xe7\x06\xe7\x99\xfc\xad\x5c\x32\x25\x98\xd5\xe6\xfd\x2b\xa2\xf3\x02\x6b\x6f\x4a\xc4\x26\x54\x32\x00\xce\xb4\x54\xb4\xb3\x76\xcb\x0a\x0c\x0f\x5c\xb7\x41\xd9\xbb\x8f\x8a\x84\x2d\xc8\x25\x5b\xd1\x32\x33\x70\x3b\x9e\x35\xd1\x3e\xff\x53\xeb\x5f\x80\xee\xb3\x03\xf0\x90\xe3\x50\xad\x3d\x6a\x23\xc7\x10\xbe\x5d\x21\x53\x83\x84\xef\x5e\x43\x9e\x65\xe9\xdc\x22\x0a\x74\x9d\x4a\xde\x6d\x40\x43\x05\xe9\x60\x29\x76\xfe\x8c\xba\x80\x0c\x0b\xc8\xc7\xc8\x5b\xc5\xb4\x34\x1b\x26\x0c\x4f\x00\xc9\xa4\x50\xf2\xf3\xce\x49\x8c\x41\x92\x2f\xe4\x01\x03\xed\x21\xd1\x3d\x2b\x95\x93\x73\x41\x74\x71\x83\x56\x0b\x40\x16\xb3\x93\x25\x79\x74\xd3\x55\xa5\x00\xd6\xd2\x69\x62\xa4\x5d\xb3\x18\x32\x13\x51\xb5\xee\x11\x55\x5a\x13\x3d\xbb\x50\xeb\x12\x65\x4d\xc7\x01\x98\x30\x6a\x07\x1e\x15\x3c\xea\xa9\x4c\x1e\x2c\xc1\x59\xde\x78\xd6\x1b\x11\xf9\xee\xfd\x65\xc5\x33\xb9\xcb\x61\x70\xf7\x50\xa1\xe4\x96\xa7\x2c\x5d\x90\x4f\x54\x71\xba\xcc\xac\x8c\xeb\xba\x42\x6b\xf2\xdb\x97\x9f\x2e\x3e\xfe\x7c\x73\xf1\xfe\xaa\x4f\x18\xb1\x0c\x86\x7d\x2e\xa8\x48\x59\x4a\x4a\x5d\x7b\x35\x1d\x36\xcf\xce\x34\x61\x62\xcb\x95\x14\x76\x21\xa0\xd8\x53\xb2\x75\x63\xf5\x00\x4d\xa8\xc0\xe2\x4e\x60\xe0\xcd\xb6\x2c\x45\x09\xbf\x9a\x99\xe7\xb5\x5c\x14\xa5\xf1\xe6\x0c\xf0\x87\xf5\x16\x84\x2a\x45\xb2\xa1\x62\xed\x3a\xd9\x36\x57\x46\xf4\x4e\x18\xfa\xd9\x8e\x0a\x5a\xbe\x4e\x68\xe1\x5d\xb5\x94\xa4\xb2\xec\x9f\xe8\x6f\x7f\x3b\x23\x9c\xbd\x25\xbf\x6d\x80\x5b\x90\x2b\x07\xa1\x81\x48\xf4\xd5\xb1\x2d\x53\x30\x84\x43\x58\x9f\xe5\x49\xb1\x35\x55\x69\xc6\x34\xf8\x90\x1e\x37\x0c\xba\x8b\xa0\x26\xe3\x36\x89\x55\x46\x0e\x21\xcd\x82\xbc\xf3\x18\xeb\x5b\x3d\x38\xce\xd2\x05\x79\x2f\xc1\x9b\xb4\x92\x6f\xc9\xc6\x98\x42\xbf\x3d\x3f\x7f\xa8\x98\xe8\x82\xcb\xf3\x54\x26\xfa\xdc\x50\xfd\xa0\xcf\xf1\xa0\xcf\x53\x6a\xe8\xbc\x71\x54\xce\x51\x80\x9b\x27\x32\xcf\xa9\x48\xe7\xd4\x11\xe9\xbc\xda\xf4\xf3\xef\x9c\x78\x34\xa7\xd5\x5b\x5c\xcc\xe9\x5c\x6f\x58\x96\x1d\xb2\x39\x32\x24\xbe\x0f\x0a\x42\x61\xc9\xc4\xcd\x21\xe6\xc4\x5d\x55\x07\x0c\xa1\x2d\xc8\x8d\x34\xce\x35\xe9\x88\x82\x5b\x61\x15\x56\x12\x6a\x8a\xbc\x77\x32\xc9\xd5\xcd\xfd\xc7\xbf\xdf\x7e\xb8\xbe\xb9\x1f\x3c\x8a\x3d\x10\x07\x0e\x68\xcc\x51\xec\x81\xdc\x7f\x40\x87\x8f\x62\x9f\x4f\xb1\xff\x80\x0e\x1f\xc5\x7e\xb6\xd0\x7b\x40\xa3\x8f\x62\x0f\xec\x9e\x03\x1a\x7f\x14\x7b\xe0\x1e\x1c\xd0\x5f\xf9\x51\x64\x62\x1b\x71\x0c\x7f\x70\xd2\x75\x83\x30\x2b\x7c\xc3\x5d\xa8\x2b\x51\xaf\xa6\xef\xbe\x73\x73\x88\xfa\xf1\xab\x6e\xcd\xee\x4a\x6c\x3f\xd1\xb6\xa7\x42\x74\x4e\x95\xb8\x17\x7a\x75\x2e\x60\x25\xef\x86\x16\x10\xd5\xf3\x9e\xe6\x07\x3a\x54\xef\x02\x6e\x9c\x00\x8d\x12\xc5\xe1\xbc\x17\xe4\xbd\xb3\xc8\x87\xad\xd9\xef\x7e\xbe\xbe\xbc\xba\xb9\xbf\xfe\xfe\xfa\xea\x63\x48\x93\x8d\xd2\x63\x41\xe7\x8f\x5e\xc2\xd9\x18\x6e\x18\x5c\x44\xcd\x29\x0b\xc5\xb6\x5c\x96\xb5\x85\xa2\x9b\xfc\x7a\x54\x8c\xe6\x53\x0b\x93\xe8\xa5\xdc\x11\xcd\xd4\x96\x27\xdd\xe8\xc6\x4c\x89\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x8e\x01\x07\x61\x3e\x0b\x73\xc6\xe7\x78\x16\x1d\x9e\x71\x5b\x92\x6a\x6a\x6c\x2f\x5e\x2c\xba\x39\x24\x3e\xf1\x64\xfd\xbd\x92\xc1\x44\xd1\x16\x69\xdf\x61\x42\x34\xaa\x96\xdd\x14\x73\xe6\xbc\xe1\x61\xf3\x51\x83\xf1\x39\x71\x03\xa3\x4c\x9c\xbc\x81\xee\xac\x00\x84\x58\x57\x77\x65\x42\xf9\x1b\xdb\x7d\x64\xab\x21\x1b\x6c\x7b\xb1\x60\x58\x73\xbe\x5e\x54\xea\x2b\xf3\xc5\x90\x59\x7d\x8c\x2b\x3e\xd2\x0d\x7f\x90\xb8\x8c\x36\x45\x67\xff\x8b\x71\xa2\x8c\xf2\xe5\x0c\x71\xed\xce\x69\x9d\x35\xd9\xb7\x3b\x3b\x26\x56\x9c\x48\xa4\x48\x58\x61\xf4\xb9\xdc\x5a\x8e\xc4\x1e\xcf\x1f\xa5\x7a\xb0\xf2\x81\x3d\xb1\x73\x34\x82\xe8\x73\x30\x95\x9c\x7f\x07\xff\x13\xe5\x2f\xbc\xff\x70\xf9\xe1\x2d\xb9\x48\x53\xd7\x0a\xb1\xd4\x6c\x55\x66\xbe\xd7\x34\xa1\x05\xff\xc4\x94\xe6\x52\xcc\xc8\x03\x17\x81\x8e\x80\xcd\xa7\xe4\xe9\xff\x0a\x1d\x40\xff\x8c\xc2\xb9\x2c\xd0\x64\x31\x1a\xef\x77\x60\xff\xde\xb5\x38\x4c\x45\xab\x96\x7f\xf0\xc8\x66\xb5\x96\xa6\xbc\xcb\xdb\x5d\x35\xd1\x8b\x5c\x4a\x99\x31\x3a\x14\xeb\x14\xeb\x8d\x8d\xf1\xc4\x46\xbb\xae\x60\xaf\xc7\x9e\xff\xb3\x9a\x01\x60\x18\xa9\xa3\xeb\x42\xa6\x6f\x89\x2e\x8b\x42\x2a\xa3\x49\xce\x0c\xb5\xb2\xef\xc2\x12\xe4\x30\xed\xb4\x5e\x07\x8b\xdf\xac\xfe\x0d\x1c\x06\xba\xf1\x03\x70\x49\x0c\x30\x19\x06\xad\x0b\x96\x2c\x84\x4c\x99\x3d\x84\x33\xfc\xa7\xbb\xdb\x2f\x92\x44\x96\xc2\xb8\x3f\x18\x6a\x4a\xbd\xd8\x48\x6d\xae\x6f\x23\xc0\xe2\xeb\x85\x4c\xaf\x6f\x67\xad\x7f\xe9\xe0\x15\x44\x46\xb2\xc1\xfa\x1c\x8e\x26\x7f\xf7\x5d\xb3\xa2\x47\x4e\xe1\x3f\xa1\xad\xfd\x2d\x0d\x14\x9b\x68\x3e\x5c\x93\x47\xc5\x8d\x61\x02\x24\x15\x08\x61\x95\xab\x99\x3d\x09\xf5\xc5\xbb\x7d\x13\x95\xef\x34\xea\xe0\xaf\xfc\x34\x47\x2f\xdd\x7e\xe4\xd7\x8d\x54\x5a\x5d\x09\x31\xd2\xa0\x7f\x6a\x07\xda\xc5\xed\x35\xd9\x22\x3e\x4f\xbc\xcc\xf8\x93\xbf\x8a\xdc\xb5\xe8\xf3\xef\x83\x31\xbf\x7f\x22\x1f\xa8\x4a\xc2\x38\x8c\x57\xc2\xf4\x5b\x70\xc8\x0f\xe2\xab\x0a\x0a\x25\x19\xcf\xb9\x0b\xd4\x72\xe5\x65\x34\x79\x89\x3f\x2e\x92\xa2\x9c\xb9\x17\x16\x39\xcb\xa5\xda\x0d\x9f\x52\xf7\x3a\x2b\x36\x2c\x67\x8a\x66\x73\x6d\xa4\xa2\x6b\x36\xab\xc0\x23\xd8\xea\x5f\x08\x78\xf8\x54\x36\x26\x78\x08\x1d\x75\x99\xa4\x54\xf6\x9e\xcf\x76\x9e\x2b\xb2\xf4\xa4\x9c\xa1\xc2\xf2\xcd\x51\x32\x49\xa5\xc4\xa2\x4c\x53\xd1\x21\x88\xb1\x5b\x99\x95\x79\x5c\x46\x55\x7d\x3f\x63\xbd\x21\xb1\xb5\x42\xaf\x3e\xb9\x14\x90\xf2\x2d\xd7\x71\xb1\x8a\x1d\x42\x00\x77\xe1\xa3\xb2\x34\x45\x69\x5c\x5a\xcd\x50\x67\xe2\xe6\xc3\x3e\x17\x52\x83\xea\x53\x05\x30\xb7\xf8\xdf\x9b\xe1\x64\xc1\x91\x0b\xf6\x23\x8d\xdf\x5a\x5f\xb6\xe6\x6d\x7d\x32\x2b\xf6\x77\xe2\x7d\x89\xe7\x5e\x7e\x2a\xa7\x62\x5e\xe8\x65\x3b\x8d\x02\xa3\x9b\xae\x48\x0c\x62\x89\xd2\x04\xba\x1d\xc6\xed\xe7\x4b\xe9\x3c\x55\xdc\x03\x2c\xa5\xbe\xee\x56\x4a\xe6\x0b\x02\xf6\xa1\x28\x42\x5f\x32\xb0\x26\x67\x3c\xf5\xb0\x1e\x58\x50\xe9\xf4\xcf\xa4\x47\xfd\x9a\xf4\x28\xe7\xbd\x47\x25\x2a\xba\x92\xc3\x3f\x9d\x12\x15\xf1\xda\xd0\xac\xe6\x70\x18\x82\xc6\xfb\x00\xfc\x41\xe3\x7d\xbf\x25\xab\xd3\x80\xef\x25\x31\x23\x49\x21\x8b\x32\xa3\xa6\xc7\x04\x1a\x76\x23\xd5\x36\x7e\xcf\xa0\x6a\x23\x6d\xed\x92\xc3\xbb\x29\x1f\x30\x5d\xb7\x8c\xd6\xe4\x22\xcb\x08\x17\xc8\xa0\x00\xac\xb7\x86\x2a\x86\x42\x16\xa1\x68\xde\xdf\xf6\xdb\xf1\x1f\x5d\x4e\x60\xc3\xec\xcb\xb5\x55\xe2\x94\x81\x10\x31\xc8\x19\xc4\xfb\xc1\x19\x1b\xb9\xa8\x32\x07\x7b\x60\x56\x62\x41\x15\xbf\x7a\x90\x46\x8c\xd1\x6f\xda\xf8\x85\xc3\xcc\x0d\x7d\xe8\x03\x59\x28\x96\xb0\x94\x41\x5c\xca\x27\x8c\x88\xf5\x38\x5c\xee\xec\x1a\xaf\xc4\xb6\xb2\xdb\x96\xe8\x63\xc2\xcb\xc0\x42\xee\xa3\x28\xfa\xc0\x5a\x90\x9f\xc3\xdb\x62\x89\xee\xce\x97\x89\xac\x9c\x2e\x70\x3f\x55\x9a\x82\x4f\xf6\xe8\x3d\x5d\x75\x54\xd4\x13\xdc\x2c\x95\xa9\x73\x40\x4c\x38\xb8\x53\x6b\x43\x51\xfb\x2e\x3d\x81\xf9\x35\xe6\xf2\xfb\xb6\x2f\xbe\xb1\x97\x5e\xd4\x85\x16\x7d\x99\xc5\x5e\x64\x23\x8c\x81\xe3\x2e\xa6\xd8\x4b\x29\xea\x12\x29\x14\x5b\xf1\xcf\xd1\xb4\x79\x21\x6a\x85\x8b\xa7\x4c\x18\xab\xdc\x40\x09\xdd\x42\xb1\x82\x89\xb4\x4a\x4b\x1e\xba\xe4\x1c\xab\xae\xad\xf7\xb5\x13\xf1\xb4\x8e\x42\x94\x23\xc7\x1e\xc0\xbb\x2e\x49\x76\x3a\x7d\xff\x3c\xa7\xcf\x6d\xf0\x57\x3b\x7a\x4f\x94\xad\x78\x57\x14\x74\xc7\xd2\xcf\x2e\x1b\x81\x45\x40\x7d\xa3\x69\xa7\x8e\xd5\x3c\x07\x28\x7d\x24\x72\x5f\x17\x77\xe0\xba\x66\x13\x55\x00\x27\x94\x0f\x56\x24\x63\x5b\x96\xb9\x9b\x91\x60\xa8\x66\xde\x2f\x2c\x41\xcc\x36\x58\x3a\xac\xb4\x6f\xc9\x58\xf1\xb4\x25\x3a\xc1\x94\x2c\x3b\xb1\xa4\x9d\x49\x9a\xc2\x1f\x95\xcc\x32\xa6\xfa\xa6\x9a\xf1\x07\x46\x2e\x21\x16\xdc\xe5\xe6\x88\x94\xdc\x19\x6a\x2c\x29\xdf\x31\xd3\x67\x45\x1f\x20\x53\x98\xcb\x6d\x99\x65\xb7\x32\xe3\x49\x8f\x36\xdd\xde\x1e\x88\x66\x27\x45\x99\x65\xa4\x80\x8f\x16\xe4\x83\x80\xf3\x7e\x91\x3d\xd2\x9d\x9e\x91\x1b\xb6\x65\x6a\x46\xae\x57\x37\xd2\xdc\xa2\x30\xd3\xc7\x13\x9b\xce\x68\xfc\x9c\xf0\x15\x79\x9b\x61\x95\x6e\x43\xd7\x20\x68\x7a\xb3\xf2\xcc\x62\xb4\x09\xb6\x07\x2a\x1c\xf3\x47\xae\x3b\xa5\xb5\x27\x13\xd3\x77\x00\xc9\xb2\x24\xfc\xf7\x51\x88\xcf\xf8\x8a\x25\xbb\x24\x8b\x39\x11\x17\x09\xf8\x6e\xea\xe4\xe8\x9a\x06\x7d\xb7\x4c\x97\x68\x03\xc2\x6a\x6f\xa1\x00\x2c\xd1\x81\x35\x4c\x6a\x72\xac\x66\x82\x2a\x80\x8e\x96\x70\x87\x2f\x90\x42\x6a\x73\x67\xb5\x84\xc8\xda\x1b\x67\xb7\xfe\x03\x02\xa5\x0c\xb2\x8c\xa5\x84\xe7\x39\x4b\xad\x56\x90\xed\x08\x5d\x19\xa8\x8e\x50\xcd\x3e\xc0\xd1\x2c\x04\x28\xf7\x9e\x56\xc9\xb6\x1b\x2a\xd2\x8c\x29\xb2\xa2\x3c\x73\x9a\x47\x4b\xa3\x31\x4c\xe5\x5c\x0c\xd4\xcb\x40\x5b\x36\x28\x3f\x56\x79\x4a\x12\xa9\x5c\xff\x4f\x50\xed\xdd\x9f\xea\xb3\x01\xfc\x7b\x90\x6b\x90\x3a\xe1\xa7\x9e\xd2\x32\x93\xc9\x83\x26\xa5\x30\x3c\xc3\x05\x48\xf9\x00\x45\xdd\x33\xa0\xd5\x06\x29\x07\xc0\x8e\x24\xf2\xea\x3f\xe7\x15\x65\xcc\xed\xb8\xfa\xfc\xbb\xfa\x4f\xf0\x43\xff\x15\x19\x27\x5b\xb0\xcf\x2c\x19\x91\x55\x66\xb9\x8c\x45\x3e\x24\x2d\x4a\x51\x89\x18\x2b\x69\x99\xb5\xdd\x02\x3c\x05\x03\x37\xe2\xb2\x91\xe8\xb5\x20\x57\x9f\x59\xd2\x48\x16\x84\x92\x41\x70\xdc\x20\x20\x9d\x3e\x0c\x44\xa0\xc4\x5b\x2b\x83\x21\xba\xbd\x6b\x7e\x87\x5f\xf9\xc4\x10\x07\x84\x64\x5c\xc0\x29\x76\x61\xbb\x11\x76\x21\x2e\x34\x4f\x59\x9b\xbe\xf0\x04\x38\xf9\x8a\xa4\x5c\x41\x36\xdc\x8e\xac\xe2\xf2\x91\x1b\xf3\x81\x84\x31\x29\x0d\x79\x79\x76\x7e\xf6\xea\xc0\xa8\x71\x66\x6f\xd9\x8c\x21\xaf\x8a\xb1\x8d\xde\x37\x60\xdb\x0b\x80\xe7\x45\xb6\x83\xd5\x9e\xa5\x33\xc2\x8d\x8f\xf0\x51\xa5\x70\x2b\x8b\x00\xea\x62\x9a\x67\x44\x4b\x62\x14\xad\x32\x3b\xe0\x57\x48\x69\x51\xa5\xe3\xb4\x2f\xcf\xfe\xe3\x2c\xc6\xf2\xc8\x4c\xf2\x8a\x3c\x4a\x71\x66\x00\x8d\x0b\x72\x2f\xad\x74\x59\x0f\xb5\x93\x25\x11\x0c\x33\xb9\xd8\xe7\x22\xe3\x09\x37\x11\x1e\x3e\x02\xcc\x8f\x40\xaa\x97\x74\xcd\x3b\x30\x1e\xfb\xea\x33\x37\xce\x7d\x6e\xe9\xff\x35\x50\x06\xb2\xb9\x18\x14\x68\x92\xf1\x2d\x3b\xdf\x30\x9a\x99\x0d\x56\x06\x11\x52\xcc\x7f\x61\x4a\x42\xd4\xb6\x70\x7f\x39\x61\xfd\x94\x67\x29\xe5\x18\x69\x6e\xb4\xac\xef\x2f\x87\x09\x58\xed\xa7\x75\xe0\xfe\x7a\x7f\x7f\xfb\x17\x66\xf6\x58\x82\x85\xe3\x1d\x98\xa0\x3a\x32\xb5\x92\x6a\x80\x94\xe3\x79\xc3\x46\xea\x81\x39\x1e\xce\x53\x6a\x83\x79\x62\x78\x99\x0b\xab\xf1\x19\xd9\xf2\xb2\x45\x1e\xe2\x42\xa6\xe4\xfa\x76\x41\xfe\x2e\x4b\x3b\xe7\x25\x5d\x66\xbb\x2a\x35\x48\x33\x43\x5e\xd8\xc1\x5e\xd8\x53\x6d\xf1\xf0\x57\x46\xd3\x7e\x39\xb5\xf9\xd8\x23\xc5\xe8\x29\xeb\x22\x92\xe6\x0c\xc6\xb2\xd2\x52\x1b\x99\x93\x0d\x7e\xbc\x17\x63\xed\xf6\x36\x86\x37\x59\x0a\xf1\x99\x62\x8a\x15\x70\xf4\x3c\xd4\xe7\x2a\x3b\x64\xc7\xc4\x55\xbb\xdf\x97\x50\xa1\x2c\x69\x2e\x29\xca\xa1\x80\xd5\xeb\x30\x5a\x52\xe0\x52\xec\x96\x47\xf9\x6e\xc6\x16\x06\x8a\xf5\x59\x91\x2e\x6b\x06\xae\xc9\x29\x67\x01\x83\xff\xfe\x73\x5c\xed\x99\xd3\x4c\x33\x26\xa9\xfb\xc8\x79\x8e\xab\x3e\x12\x89\xaf\x79\xf4\x8c\x9f\xa9\xf6\x48\x11\x15\xab\x74\x18\xa9\x64\x15\xf4\x24\x81\x78\x68\x3c\xbe\x40\xc8\x9a\xa9\x6d\x7f\x8e\xc1\xfe\xfc\xa2\x50\x5f\xc8\x90\xee\xe2\x1f\x2a\x76\x1f\x06\x7d\xea\x90\xa5\x1e\x55\x73\x74\xff\xfd\x63\xca\xa6\xa0\x09\x4e\x11\x51\xe6\x4b\xa6\xea\x98\x43\x65\x6a\xe4\x45\xec\xbb\x3c\xf0\x4e\xdd\x20\x40\x6f\x84\x6a\xd7\x67\x8d\xa1\x24\x49\xfe\xf8\xdf\xfe\xdb\xef\xff\xdb\x02\xa7\x58\xf9\xb2\x04\xb9\xbe\xb8\xb9\xf8\xf9\xee\xd3\x3b\x08\x9e\x1f\xde\xc5\xcf\xf3\x5a\x9f\x99\x73\x61\xe6\x52\xcd\x11\x53\x6f\x89\x51\x83\x54\x0d\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\xec\x1a\xac\x90\xb7\x92\xca\xdf\xbc\x4e\xff\x43\x15\x2d\xee\x1a\x69\x5a\x3e\x2c\xf9\x7e\x85\xea\xc1\x96\x1c\x4e\x21\x65\x99\xa4\xb8\x93\xc9\xc3\x28\x39\xeb\xec\xfe\xdd\x2d\x7e\xd4\x10\xb5\xa8\xf0\xca\x17\x17\x5b\x99\x6d\x87\xc9\x9e\x92\xfb\x77\xb7\xb0\x90\x05\xfc\x17\xe8\xa5\xa0\x1a\xec\x2c\x64\x1f\x48\xe6\x4c\xc0\x56\x8d\x18\x52\xc2\x11\xaa\x62\x34\xe3\xda\xf0\x04\xa0\xd6\x26\x12\x0b\x3f\x6c\x19\x7e\x56\xa9\xef\xec\x83\x37\x26\x0f\x0b\x80\x71\x87\xb1\x21\x00\x0e\x07\x50\xfc\x2a\x38\xa7\xe3\x98\xaa\xaa\xc2\x30\x71\xce\xc6\xf3\x65\x79\x4b\xc4\x4b\x85\x62\x77\x46\x16\xd1\x16\x46\x7c\xbd\xc7\xbe\xb8\x64\x2b\xa9\x58\xbc\x81\xb1\x36\x18\x56\xc5\x9c\x05\xc4\x3e\x7b\x5d\x51\x36\x4d\x7f\xc1\x18\x0b\xfb\xe8\x32\xd9\x78\x1d\x5d\x30\xad\xcf\xc1\x94\x58\x16\x28\xa3\x83\xd9\xb2\x54\x6c\x66\xd7\xcc\x72\x58\xd1\x2c\x26\x4e\xd0\x2e\x86\x09\x7c\x1d\x5a\xa1\xde\x37\x6c\xa1\xce\x92\xe2\x91\xb1\x67\x82\x0c\x41\x55\x54\x6f\x18\xe4\x95\xb1\xcf\xbc\x2e\xc7\x4a\xb5\x14\x98\xdb\xe5\x90\x03\xfc\x5c\x93\x82\x6a\x2c\x69\x13\xba\x49\xea\x89\x21\xb8\x5b\x99\x9e\x9d\xe9\x16\xa8\xb5\xa2\x09\xb3\x1a\x38\x97\x29\x81\x84\x84\x54\x3e\x86\x5c\x5b\x4b\xb6\xe6\x42\xfb\xbd\xb5\x43\x78\x22\xb0\xdc\x1c\x4b\x36\xf9\xfc\xf7\x05\xf9\x58\x25\xdb\x0d\x5b\x6a\x65\x69\x12\x59\x33\x09\x37\xf3\x7d\xc3\x32\x84\xad\xd4\x65\xb9\x43\xcb\xf7\xe4\xe4\x63\x7e\xcc\x30\x0a\x9c\x85\x39\x00\xb5\x41\x80\x63\x2d\xcc\x21\x14\xa8\xc6\x57\xbd\xfb\x03\xf5\x23\x69\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xce\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe3\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf3\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xde\xea\x7b\x6b\x65\xdc\x98\x48\xec\x5b\xb0\xb1\xf1\xc4\x99\x87\xe5\xaa\x15\xd5\x8b\xc0\x16\x75\xf5\xbd\x9e\x89\xd7\xf9\x80\x3e\xa6\xd5\x19\x81\x6b\xa3\x73\x67\x4c\x30\xd8\xf3\x7a\x60\xc6\x47\x57\xfb\x10\x78\x7d\x5e\x48\xfc\x7f\xb5\x25\xaf\x61\xc2\x43\xb9\xbf\xfb\xd0\x0f\x33\xb1\xb0\xed\xee\x28\xbb\x5d\xdb\x32\x17\x20\x9e\x27\xd8\xec\xe2\xb8\x73\x94\xad\xee\x08\x3b\x5d\x9c\xad\x2a\xd6\x46\xb7\x6f\x81\x1b\x00\x1b\x6d\x9f\x6b\x5a\xdf\x06\x60\xc6\xd9\xe6\xfa\x2c\x6f\x43\x22\x5a\x8f\x5d\x6e\xd0\xea\x36\x00\xb7\xdb\x26\x17\xb4\xb8\x0d\xcd\xb4\xd3\x1e\x17\xb4\xb6\x0d\x23\x36\xd2\x16\xf7\xe5\x5b\x98\x44\x70\x6e\xe7\x56\xbb\xdf\x28\xa6\x37\x32\x0b\x9c\xa4\xd6\x29\x7a\xcf\x05\xcf\xcb\xdc\x12\xa6\x86\xbe\xae\xdb\xca\x43\xa7\x2b\x8a\x47\x1e\x1a\xb4\x6e\x41\x73\x14\x20\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\x36\x74\x0b\x1c\xa7\x4c\x12\xc6\xa0\x86\xf9\x65\x94\xc1\xec\xf7\x8b\x6a\x76\x55\x41\xc4\x37\xfd\x3b\x13\xd7\x34\x39\x46\xaa\x19\x34\x61\x3e\x87\xf9\x32\x8e\x4d\x0e\x0b\xb0\xa3\x4d\x96\x11\xc5\x70\x9e\xc5\x5c\x19\x65\xaa\x8c\x3c\x45\xd1\x26\xca\xf1\xe6\x49\xd8\xdf\x21\xe5\xe5\x18\xd3\x64\x14\x17\x19\x6d\x92\x8c\xb1\x41\x1f\x65\x8e\x1c\x63\x8a\x3c\xaa\xce\xcb\xb1\x26\xc8\x51\x7a\x47\xb4\xe9\xf1\x34\x66\xc7\x67\xa9\xa9\x14\x81\x97\x38\x33\xe3\xc8\x6e\x67\x43\xe6\xc5\x61\xd3\xe2\x29\xcd\x8a\x91\xa8\x1d\x56\x8a\x23\x14\xe2\x31\xca\xf0\x08\x45\x78\xb4\xf9\xd0\x21\x69\x60\x5b\x63\x15\xe0\x3d\xf5\x76\x00\xea\x71\xca\xef\x13\x14\xdf\x18\x73\xe1\xb3\x98\x0a\xc7\x99\x09\x4f\xd6\xfc\x2b\xa8\xbe\x47\x1c\x55\x2e\xb8\xe1\x34\xbb\x64\x19\xdd\xdd\xb1\x44\x8a\x34\xb6\x59\xfc\xd9\x4d\x45\x73\x1a\x3f\x74\x92\x5b\x3b\xca\x66\x43\x5d\xb5\x9c\xa0\xdf\xdb\x05\x28\x79\xcd\xdd\x5d\x2e\xae\x3b\xbe\x9d\xe1\x31\xd9\xcb\x27\xd0\xaf\xc9\x49\x45\x44\x0c\x0c\x1a\x87\xe6\xbf\xca\x47\x22\x57\x86\x09\xf2\x92\x0b\x8f\xe9\x57\x0d\xe1\xb0\x96\xb5\x43\x24\xe7\xc8\xd3\x7e\xf7\xe6\xb5\x07\xf3\xb5\x44\x65\x10\xea\xb5\x3e\x85\xd6\xe1\x40\x3d\x45\xed\x70\x20\x56\x65\xd6\x56\x3d\x50\x1d\x89\xd5\x3b\xde\xd4\x25\x51\xde\xc0\x5c\x2a\x5a\xb6\xda\xa4\x0b\x66\x3c\x44\x78\x10\xe2\x17\xd8\x8a\x08\x97\xc0\x51\xee\x00\x34\xf8\x0f\x5c\xb1\xa3\x5c\x01\x4d\x63\x7f\x00\xee\x18\x37\xc0\xb3\x68\x4f\x27\x34\xfd\x8f\x31\xfb\xff\xd3\x49\x36\x11\xe6\xfd\x5f\x91\x64\xf3\x25\x64\x01\xc3\x73\x26\x4b\x73\x22\x31\x00\x5b\x2d\x36\x38\x32\x0f\xd7\x2b\x92\xe5\x5e\x83\x8e\x37\x0e\x60\xe7\x2d\x75\xba\x88\xda\x6f\x4c\x4a\x18\xd8\xa7\x7e\x25\xb9\xb7\x09\x50\x2d\x8b\xd5\x35\xca\xa9\x26\x94\x5c\xde\xdc\xfd\xfc\xc3\xc5\x9f\xaf\x7e\x58\x90\x2b\x9a\xf4\x95\x0a\x6f\x54\x09\x11\xd8\x10\x11\x69\x7f\x43\xb7\x8c\x50\x52\x0a\xfe\x8f\xd2\xb5\xed\x7c\x59\x41\x7c\xe5\xbd\x26\x3d\x40\x87\xea\xab\x0c\xf0\x0c\x68\x1c\x30\xa2\x52\x25\x36\x1a\x40\x33\xb2\xb4\x62\xbe\x92\xf9\xbe\xdb\xef\xca\xfe\xa9\x9f\x45\x51\xe4\x3d\x1b\xa6\x18\x59\xf3\xad\x33\xd8\xb9\x12\x34\x8d\x5e\x99\x96\x24\x2d\x25\xd8\xdb\x90\x2e\xc1\x4c\xdd\xcb\xa1\x04\x33\x96\xfa\x2a\x8d\x43\x0a\xdd\xcc\xbf\xb0\x1a\x89\x9e\x91\x65\x09\xa6\xfa\x42\xf1\x9c\x2a\x9e\xed\x9a\x43\xd0\xac\x8f\xdf\xdc\x48\x7f\x43\xef\xf0\x3a\xae\xa7\x7f\xf9\xe1\xea\x8e\xdc\x7c\xb8\x87\x9e\x48\xf6\x66\x05\x2b\x3a\xfc\x1d\x10\xb3\x64\xfd\x68\x70\xb5\xad\x17\xe4\x42\xec\xf0\x13\x3c\xe7\x5c\x43\xd7\x5c\xe6\x3b\x3e\x5b\xe4\xf8\x52\x50\x2f\x5e\x2f\xe0\xff\xfa\xca\x5e\xd3\x34\x55\x96\x9b\x57\x4e\x88\xbd\xfc\x01\xcb\x65\x81\xdf\xf3\x65\xd6\xd8\x3b\x87\xbd\x2f\xd6\x19\xac\x72\x26\xde\xda\x65\x37\x1b\x84\x55\x1b\x09\x08\xc1\x7a\xa5\xd0\x84\xb4\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xfd\x65\xea\x0e\x85\x6c\x94\xb4\x26\xd7\xb7\x7e\x5b\xc2\x17\x1a\x94\x11\xab\xee\x42\x57\x0c\x1a\x00\xa3\x49\x62\x46\x5e\x93\x3f\x91\xcf\xe4\x4f\x70\xb5\xfe\x31\x04\x2c\x8e\x83\xc6\x89\xb5\x28\xb5\x5d\xdf\x46\x63\xe5\x27\x7b\x04\xec\x37\x76\xe5\x46\x92\x25\x17\x29\x76\x68\xfa\x6c\x98\xb2\x07\xdb\x61\xeb\xc9\x15\x0e\xed\x20\x27\xdd\x30\xb0\x4e\x90\xeb\x55\xa3\x56\x58\x58\x52\x1c\xb9\x65\x16\xb4\x95\x64\x6f\x90\xc8\xc3\xe6\xe9\x56\xc5\xb2\x7a\x24\xe8\xd6\xde\x3e\x41\xf6\x0a\xd7\xa6\xd1\x5b\x38\x2c\x1b\x4a\xd0\x10\xd0\x1d\xb8\xe1\x41\xaa\x3c\x2d\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6f\xd6\x46\x3a\x54\x21\x53\xbc\xaa\x61\x52\x69\x83\xdd\xf8\x5b\x39\x08\xf4\xf0\xc6\x76\x21\x2a\x95\xea\x0c\xf4\x65\x4f\x82\xeb\xc6\x09\x15\x2c\xd5\x40\xc6\x82\x3d\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x49\x23\x13\x19\xac\x19\xd9\x36\x09\xbb\x0f\x60\x19\xa8\x56\x7a\x4d\xfc\xc7\xcb\xdb\x99\xd5\x08\xa1\x78\xde\xdd\xbb\x21\xab\x5c\xab\x3d\xdc\xfd\xbb\xdb\x60\x9b\x9a\x88\xc5\x0c\x97\xf3\x6e\xb1\xf0\x3e\xb1\xfc\x69\xb5\x27\x15\xa3\x29\x3f\x59\x6c\x8d\x6f\x75\x58\x41\x1d\x13\x64\x93\xcb\x2d\x4b\xf1\x02\xaf\x5b\x26\xa6\xd0\x90\x57\x07\x22\x6f\x86\x65\xc8\xaf\x60\x19\x9c\x22\x6f\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x09\xbc\x33\x45\xde\x4c\x91\x37\x53\xe4\x4d\x27\x5a\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x69\xbc\x34\x45\xde\xb8\x49\xfd\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\x39\x18\x65\x8a\xbc\xf9\x36\x7c\x6a\x53\xe4\x8d\x7f\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\x99\x22\x6f\xf6\x9e\x29\xf2\x66\x8a\xbc\x99\x22\x6f\xc2\xfb\x54\x75\xf3\x8e\x71\xa1\xbc\x93\x79\x51\x1a\x46\x3e\x56\xed\xea\xab\x9e\xe9\xcb\x1d\xfa\x05\x1b\x87\xe3\xb9\xdc\x1c\xd8\xb6\xab\x54\x10\x2a\x72\x8e\xb5\x10\xe7\x09\x4e\x6d\x5e\xad\x67\x5e\xcd\xe4\xfc\x58\x57\x07\xf6\xce\xef\xa7\x87\x3a\x3e\xe6\x36\x8a\xf1\x47\x31\xae\x36\xc6\x7f\x80\x29\x34\x0c\x2d\xd8\x2c\xea\x33\x90\x2f\xcd\x65\x89\x25\x20\xdd\xea\x03\x63\x57\x78\x41\x33\xd1\xd7\x43\x3b\x89\xef\x19\xcc\xf4\x57\xc6\xfe\x47\x37\x89\x7d\xfc\x3b\xf6\x71\x1c\xfe\xfd\x91\x81\x08\x84\x6a\x04\xae\x89\xcc\xb9\xb1\x72\x8a\x15\xf6\x1a\xd1\x42\x21\xaf\x06\x37\x2d\x1b\xaa\xa3\x16\xf0\x39\x52\x83\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xef\xa6\x16\x42\x17\x54\xbe\xad\xa4\x25\xd8\xf5\xb9\x6f\xbe\x0b\x8c\xf3\x9b\xa6\xa0\x81\x17\xac\xbc\xaf\xb8\xd9\xbd\x93\xc2\xb0\xcf\x3d\x12\x4c\x9b\x18\xee\xdc\x27\xae\xab\xa0\xae\x44\x29\xe7\xc4\x54\xa5\x80\xa8\x86\x88\xab\x24\x06\x59\xd8\x6d\xec\xdc\x4f\x14\xb0\xc2\x3e\x9b\xf3\x1e\x90\x71\x5b\x61\xa8\x7e\xa8\xf7\x81\xcd\xed\xe5\x54\xa3\xfb\x60\xac\x63\x19\x27\xb0\x98\x5b\xc5\xb7\x3c\x63\x6b\x76\xa5\x13\x9a\xc1\x9e\xc7\x8a\x00\x17\x3d\xdf\xfb\xae\x8a\xba\xea\xa2\xd9\xd7\x31\xdb\xcd\x13\x84\xba\x84\x0a\xb2\xa6\x5c\x90\xdc\xe2\xa8\xf0\x60\xa1\xfb\x9e\x80\x0e\x6f\x05\x55\x56\x21\x70\x1f\x84\x24\x2e\x08\x0c\x5b\x4a\x99\x39\x8f\x6c\xb6\xab\xe7\xe4\x5c\xfd\x42\xfe\x2c\xd8\xe3\xcf\x76\x1c\x4d\x56\x19\x5d\x87\x7a\x51\x13\x57\x11\x96\x99\x83\x92\x2d\xd5\x74\x48\x1f\x3a\x42\x8c\x41\x83\xf8\x47\x28\x76\x60\xec\x6c\xf7\xfd\x96\xbc\x79\x05\x54\x4b\x35\xa9\xa0\x87\x8c\x2a\xbf\x7b\x05\xd6\x97\x77\x17\xb7\x3f\xdf\xfd\xfd\xee\xe7\x8b\xcb\xf7\xd7\x37\x43\x47\x34\xdc\xa7\x34\xa1\x05\x5d\xf2\x8c\x87\x79\xf7\x81\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4f\x95\x2c\x70\x9d\xaa\x14\x10\xaf\x59\xc7\x60\x45\x18\x32\xbc\x0f\xaa\x0a\xef\xc4\xd6\xdc\xed\xa1\xd6\x8a\x0a\xe3\x85\x9d\xa1\xfa\xdc\x88\x66\x55\x0a\x2b\xa8\x3e\xd5\xe3\x46\xd3\x31\x41\x09\x17\x69\xca\xd2\xd6\xd4\x4f\xec\x03\x7a\xe7\x41\xef\xea\x88\x51\x72\xfb\xe1\xee\xfa\x7f\xc7\x8f\x4a\x1c\x8d\x44\xb9\x07\x4e\xe4\xc1\x26\xc4\x92\xc9\x08\x4c\x7e\x74\xd1\x3d\x13\x2e\x7b\xde\x19\xa8\xe4\xef\xb9\x4a\xe4\xe1\xfe\x58\x8a\x76\x64\x7e\x0d\x81\xe4\x32\x65\x0b\x72\x8b\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\x6b\x3f\x16\x86\xd3\x2c\xdb\x11\x2b\x89\x6d\x69\xc6\xd0\x85\xac\x64\xaf\xb6\x42\xea\x92\x5a\x18\x97\xda\xe4\x1a\x2b\x9a\xe9\xc0\x01\x8f\xe1\x83\x96\xd5\xbf\xb7\xc2\x64\x24\x9e\xaa\xf7\x49\xca\x84\x34\x4e\x2e\xb5\x23\x41\x40\xad\x92\x09\x41\xd9\x14\xdd\x10\x81\x55\xd5\xe1\x44\x15\xb3\x04\x16\xeb\xd9\x20\xd7\x7e\xad\xb7\xd5\x98\xa0\x89\x07\x60\x96\x9a\xe9\xbd\xdb\xc6\xb1\xc1\x5a\x5a\xb5\xe3\x2a\x46\x53\x88\x0d\x2b\xa8\xd9\x80\x5d\x33\x00\x34\xa7\xfa\x81\xa5\xf8\xea\x02\xef\x61\x27\x49\x6b\xd7\x01\xc0\x4d\xef\xde\x62\x61\xc5\xa8\x29\x15\x83\xfb\x37\x2c\xe4\x2e\x19\x61\x82\x2e\xb3\x50\xe4\x59\x54\x50\x24\x4d\x3f\x88\x6c\xf7\x51\x4a\xf3\x7d\x15\x52\x15\xb9\x9d\x3f\x55\x3d\xc1\x9b\x1a\x34\x5c\xb6\x60\xa4\x4c\xe7\x80\x26\x08\xe4\x8a\xab\x64\x7e\x59\x6f\xdf\x09\xc8\x53\x95\xe2\x42\xff\x45\xc9\x32\xb6\x29\x87\xa5\xa0\xbf\x5c\x5f\xc2\xa9\x2a\xf1\xdc\x30\x61\xd4\x0e\x82\x22\x0f\x32\x78\x86\x65\xb8\x05\xf9\xd1\xd2\xd4\x1e\x15\x59\x89\xab\x14\x9a\x99\x05\x79\x4f\x77\x84\x66\x5a\x3a\x61\x2a\x24\x19\x09\x72\x0b\x3e\x93\xa6\xfc\xbf\x20\x10\xe3\x8c\x71\x17\x4b\x69\x36\x64\xef\x85\x01\xe2\x3c\x84\x88\xe1\x7b\x68\x60\xaa\x13\x94\xb8\xd8\x07\x1c\x22\x4e\xfa\xc0\x34\x29\x14\x4b\x58\xca\x44\x12\xd8\xc3\x86\xad\xe8\x8f\x7f\x78\x92\xf9\x1e\x76\xfa\x46\x0a\x4b\xc6\x91\x7b\x7d\x2d\x52\x9e\x50\xe4\x41\xae\x9b\x75\x4d\xc2\x60\xd5\x74\x32\x26\x85\x18\xb8\x01\x2e\x5b\x6a\xa6\xb0\xbb\xb3\x2a\x19\x22\xf1\x6f\xe5\x92\x65\xcc\x60\xc4\x2d\xc4\xf5\x53\x83\xad\x04\xb0\xa1\x3c\x35\x9e\x30\xc2\x27\x9d\x09\x5d\x42\xbb\x10\xab\x1a\x1b\x92\x4a\x56\xc7\x2b\x52\x4d\x7e\xbc\xbe\x24\xaf\xc9\x4b\x3b\xbf\x57\xe0\x63\x59\x51\x1e\x12\xdb\x8d\x44\x2f\xcc\xbe\x5c\xbd\xf2\xc0\x61\x19\x40\x9f\x44\x2a\x3c\x86\x33\x22\x42\x3e\x1f\xe8\x16\xe3\x56\x68\xd5\x1d\x1f\x63\xec\x3c\x73\x60\xb4\x69\x13\x7a\x80\x9c\x43\xe3\x84\x09\xbd\x8f\x9c\x03\x10\x87\x09\x7d\x04\x39\x47\xb3\xa4\x1f\x35\x53\x23\x38\xd2\x8f\x27\xe5\x48\x4d\x11\xc0\x52\x6d\x7b\xf5\x48\x9a\x39\x33\x34\xa5\x86\x12\x1e\xda\x8e\x52\x34\x3a\x82\xfc\x1a\x36\xf8\x74\xfc\x4a\xb3\x1f\xb8\x28\x3f\xa3\x8b\x6c\x8c\x0a\x79\x77\x05\x1f\x92\xc4\x4f\x1e\x10\x4e\x8b\x22\xe3\x18\x20\xdc\xce\xa3\x0c\x60\x06\x0f\x79\x33\x3d\xa6\x4b\xf0\x81\xa3\x4c\xb3\x4c\x5a\x56\x69\x6f\x75\x2a\x52\x99\x07\xc0\xee\x4f\xd0\x0a\x4c\x8c\x26\x9b\xa6\x85\xbd\x83\x58\x46\x5d\x52\xff\xc5\xaf\xbd\x38\xd5\x39\x63\x5b\x16\x4c\xbb\xd9\xcf\xae\xb5\xef\x5b\xc1\xc9\xef\x00\x00\x20\x19\x5d\xb2\x0c\x2f\x0f\xa4\x92\x48\x67\x6b\x14\x0d\x45\xab\x66\x4a\x66\x63\x82\x91\x3e\xca\x0c\xfc\x5b\xb4\x5a\x8c\x05\xf0\x8d\xac\x05\x5e\x8b\x5f\x0b\xc8\xf5\xad\xb5\x80\xbe\xf3\x6d\xac\xa5\x0c\xde\x44\x07\x6b\xb1\x17\x57\x7b\x2d\x70\x83\x7c\x0b\x6b\x89\x50\xeb\x1f\xb9\x48\xe5\xa3\x1e\xcf\x74\x7f\xc2\x0f\x3d\x67\x48\x2c\xeb\x31\x5c\xac\x75\x93\xf1\xd2\xa0\xb1\xb4\xa9\xa7\x76\x71\x5e\x6f\x9c\xaf\xf2\xa9\x0f\x79\x54\x00\xba\x17\xb8\x4a\xed\xfc\x33\x47\x5c\xa4\x21\x8a\x8f\xe2\x8d\x27\xe7\x80\xeb\x5c\xd3\x77\xca\xc2\x32\x9c\x66\x77\xc5\xa8\xb6\x67\x7f\x79\x7f\x77\xd1\xfe\xd8\x12\xee\x23\xa4\xdc\xdb\xf5\xd8\xbf\x13\x9a\xe6\x5c\xeb\xb0\x49\x1a\xf0\xcb\x96\xd0\x8e\xee\xa5\xf7\x51\xac\xb9\xd9\x94\xcb\x45\x22\xf3\x86\xbb\x62\xae\xf9\x5a\x9f\x3b\x2a\x9b\xdb\xd9\xbf\x1a\x80\xcb\x45\xc6\x45\xc3\xe8\x00\x09\xec\x4e\xa8\x83\x09\x26\xd5\x0a\x00\xf5\x98\x69\x3a\x00\x14\xad\xbc\x1d\x08\xc0\xec\x52\xce\xb2\xd4\x19\x22\x30\x1c\xdb\x9e\xe7\xac\xd8\xd0\x39\x5c\x18\x03\xc0\x5d\xce\x18\xe8\xf5\x1b\x29\xa4\xf3\xa1\x63\xcc\xb1\x53\xa5\xd0\x2e\x01\x93\x70\x27\xc7\xce\x65\x00\x70\xd3\xf2\x71\x12\xd6\x76\x48\x3d\x37\x83\x81\xf5\x03\x14\x04\x08\x74\x19\x73\x8d\x68\x9c\x81\x95\x75\x6e\x24\x0a\xdf\xbf\x86\x7d\xa8\x34\x9e\x91\xe8\x07\xcd\xc7\x7d\x66\xb9\x8d\x67\xc2\x9d\x9a\xd0\xc0\xa2\x0e\x6a\xaf\x74\x6a\x43\xf6\x95\xb6\x46\x34\x78\x7c\x0f\xf5\xa5\x21\xad\x68\x00\x64\x97\xb0\xfb\x24\x59\xb7\x1b\xe8\x09\xe4\x5d\xd2\x25\xf3\xee\xd1\xf3\x92\x19\x47\xce\x40\xb0\x39\xdd\x91\xe5\xd0\x71\x49\xb9\x06\xb3\x26\x38\xa5\x9b\xc4\xfb\xb1\x49\x48\xa7\xa6\xd3\x27\x3b\xe6\x31\xb0\x35\x3a\xab\xfb\xae\xf1\x3e\xe1\x87\xa6\xa8\x5b\x99\x62\xc8\x78\x15\x94\xdb\xdb\xff\xd0\x85\xae\xf3\x5f\xfc\xdd\x5f\x4b\x16\x42\x62\xcc\x44\x33\x8e\xdc\x37\x98\xc5\xa6\xa9\x3d\x30\x9d\x45\xd7\x35\x5f\x6d\xcd\x02\xad\x5c\x1b\xae\x9b\xc9\xe1\xb3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x8c\xfc\x7b\xa9\x0d\xa1\x95\xfb\xb9\xd5\x73\xa2\x8a\x39\x06\x72\x4a\x7a\xad\x29\x3e\x17\xcb\x48\x3b\x99\x2d\x4f\x19\x49\xf9\x6a\xc5\xbc\x5b\x7c\xc9\x48\x41\x15\xcd\x99\x01\x37\x0a\xa2\x16\xba\xf0\x8a\x7e\x62\x90\x2b\x42\x7d\xaf\xdb\x2a\x02\x6e\x86\x3e\x5a\x6e\x48\xce\xd7\x1b\x94\x75\x08\x25\x99\x14\x6b\x88\xe8\xb3\x53\xc8\x24\xed\x3b\x89\xc0\x1c\xa4\x22\x8f\x54\xe5\x84\x92\x84\x26\x1b\xb0\x12\x52\x41\xd2\x52\x41\x82\xa7\x61\x34\xdd\xcd\xb5\xb1\x7a\xb6\x95\x8e\xc0\x94\x86\x18\xe8\xf5\x42\x1f\x74\xc2\x00\x7c\x71\x8c\x44\xb6\x77\x49\x75\x4c\x9c\xaf\xc0\x0b\x07\x4d\xf2\xeb\x81\xde\x3a\x60\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xbf\x7f\x73\x4a\xe9\x3f\x78\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xe1\x99\x52\xfa\xc7\xcf\x6d\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\xc6\x33\xa5\xf4\x1f\x8c\x32\xa5\xf4\x7f\x1b\xc9\x7a\x53\x4a\xbf\x7f\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xf7\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\x87\x5c\x68\x29\xef\x49\xb5\x8c\xc9\x3a\x70\x06\xfc\x46\xac\xe2\xb2\x5c\xad\xac\x86\x2a\x7b\x2f\x6b\x3b\xe2\x81\x25\xba\xca\x7d\xab\x1c\x5d\xce\x9a\xac\x99\x99\x41\x5a\x03\x86\xe9\x8c\x03\xea\x02\x29\x21\xad\x51\x31\x0d\x69\x00\x82\x5c\x7d\xf8\x7e\xd1\x48\x7a\xe8\x35\x65\xf6\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\x88\x24\xc6\x29\x59\x23\xb6\x2b\x12\xd4\xe1\x37\xc9\xa4\xc6\x98\x02\x00\xdd\xe7\x9a\xda\x50\x21\x98\x97\x3a\xb8\x01\x59\x79\xc9\x98\x20\xb2\x60\x02\xfd\x50\xbe\x2d\x03\xa1\xc6\xd0\x64\xb3\xb0\xe3\x8b\x20\x54\x9f\x1d\x5a\x8d\x6e\x59\x2f\xa3\x39\x22\x57\xb1\x9c\x72\x1c\x80\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\xd5\x10\x7d\x3b\xc6\x20\x06\x08\x23\xb3\x2a\x84\x81\x63\x81\xa1\x29\x1e\x62\xfa\xdd\xc6\x6a\xbf\x04\x29\x06\x03\xaf\x41\x36\x9a\x41\x42\x7b\x5e\x98\x1d\xba\x5c\xd1\xf1\xc4\x95\x36\x24\xc9\x38\x5c\xff\x30\x3b\xcc\x09\x85\x51\x66\x01\xa7\xbe\x81\x5c\x51\x58\xab\x76\x8b\x15\x29\xdc\x1a\x85\xd1\xe8\x68\xac\x87\x71\x03\xa4\x5c\xbb\x3b\x5a\xf7\x79\x26\xa8\xef\x1d\x82\x9b\xed\xd7\x0a\xdb\x9d\xc2\x10\x7e\x4c\xf7\x53\x63\x90\x01\x2c\x40\xca\x93\x53\x94\xea\x43\x05\x29\xc6\x3e\xcf\x67\xd6\xea\x33\x52\x54\xc9\x72\x66\x43\xfb\x2b\x2d\xf8\x83\xe8\x66\x0b\x44\x20\xd8\xd6\xd2\x2c\x4b\x98\x15\xa1\xe9\xc1\x09\xc3\xe1\x8e\x3a\x4a\x86\xa9\x9c\x0b\x70\xcb\xbe\x67\x5a\xd3\x35\xbb\xed\x35\xf0\xf4\x89\x4d\x60\xe3\xa9\x51\x0d\x84\x90\x81\x0c\x55\xff\x52\xbb\xc4\xce\xfa\x18\x42\x63\x2a\x24\xc7\xb9\x54\x31\x80\x8f\x8a\x1b\xab\x53\x71\x8d\xb9\x74\x60\xd7\xdc\x0f\xb8\xec\x07\xdd\x74\xc2\xbd\xf7\xa0\x6b\x90\x96\xbf\x8b\x14\x1d\x57\x4b\x46\x96\x8a\xb3\x15\x59\x71\x41\x33\xe7\x81\xea\xa3\x2f\xc8\x11\xa1\x28\x50\x6b\x6d\x45\x53\x29\xbc\x63\xc5\xaf\x61\x41\x7e\x72\x8b\x30\xaa\x14\x09\x1d\xcc\x59\x16\x32\x65\x84\xaf\xc8\x1a\xbc\x5d\x0a\x1d\xea\x7f\x78\xfd\x3f\xfe\x48\x96\x3b\x7b\x23\x82\xa1\xd2\x48\x43\xb3\x0a\x4d\x19\x13\x6b\xbb\x07\xc0\x20\xfa\xce\x42\x96\x35\xd3\x2f\x3d\x66\xa1\xae\x0a\x2e\xfd\xcd\xef\x1e\x96\xed\x2b\xfd\x3c\x65\xdb\xf3\xc6\xbe\xcc\x33\xd9\x1b\x97\x72\xd8\x0c\xa7\xfb\xf2\x1d\x10\x2f\x3b\x08\x12\x8a\x2f\x44\x90\xa4\x4f\x7e\x22\x1b\xf9\x88\x39\x98\x1d\x14\x55\xbb\xc4\x0b\x59\x94\x59\x7f\xd7\x1e\x42\xbe\xb7\x54\x0c\x78\x2a\xdd\xed\xd0\x0a\x67\xec\x3c\x39\xa0\xe8\x3b\xc0\xfd\xbc\xae\x79\xc3\xa3\x8b\xd3\x4f\x4f\xba\x78\x28\xa7\xe4\x56\xb9\x4f\xa5\x62\x0b\xf2\x3d\xcd\xb2\x25\x4d\x1e\xee\xe5\x0f\x72\xad\x3f\x88\x2b\xa5\x7a\xc5\x80\xd6\xbc\x33\x6a\xf9\xf2\xa6\x14\x0f\xed\x56\x0b\x99\x5c\x5b\x39\xae\x28\x8d\x8f\x58\x69\xac\xaa\x07\xb0\x9f\x29\x9c\xf1\xea\x12\xa0\xae\x97\x4d\x0d\x9b\x7d\x06\xba\x82\x80\x27\x2a\x08\xb3\x73\xed\xc3\xb4\xa5\xe8\xe6\x5c\x74\x93\x2c\x7f\xf7\xfa\x0f\xff\x82\xa4\x6f\xb5\x8b\x7f\x79\x0d\xce\x7f\x3d\x43\xe6\x62\x39\x63\x3f\x87\xd6\x39\xcd\x32\xab\x48\x34\x89\xda\x6e\xeb\x22\xb6\x77\xd3\x10\xb5\x9a\x18\xc2\x8c\x16\xee\xee\xef\xff\x1e\x90\xec\xb8\xd1\x2c\x5b\xcd\x30\xf6\xae\xca\xb7\x3d\x83\x8b\xe2\xcc\xf1\x2e\x7b\xab\x1f\x5e\x0d\xc7\x89\x59\x5b\x99\x95\x39\xbb\x64\xd0\x74\x25\x62\x99\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\x2d\x33\x99\x3c\x90\xd4\xfd\x11\x26\xdb\xb3\x4c\xf0\x5a\xb9\x90\x9e\x86\x2e\x58\x45\x01\x41\x00\x9e\x8f\xe4\x79\x6a\xc7\xad\xe6\x9c\x5b\xfe\xb6\x9c\x16\x05\x34\x1a\x5b\x41\x82\xd0\x23\x2e\x20\xa0\x63\x01\x04\xd7\x49\x87\x9e\xa6\xfb\x16\x02\xed\xbf\x90\x3b\xd6\x53\x7f\xe2\x37\xa0\x80\xff\xc6\x78\x91\x11\xa9\x75\xa4\x0e\xdb\xab\xd6\x86\x37\x86\xc5\x0c\x9c\xcc\x27\xf7\xe1\x19\xd5\xf7\x08\xcc\x0a\x8d\x4e\x4f\xcd\x78\x65\x4a\x0a\xa6\x34\x34\x87\x33\x9f\x60\x47\xdf\x65\x94\x87\x32\xba\x08\xa9\x1b\x1e\x3d\x6d\x19\xc3\x1d\x78\xea\x3d\xe9\x7d\x25\xe0\xed\x7b\x62\x6f\x1e\x24\x70\x48\xc6\x8f\x39\xc3\xb7\x32\x75\x9f\xc0\x21\xc5\xc2\x05\x1d\xa2\x96\x8e\xc8\x7d\x3f\x79\x7b\xbc\x4f\xf5\x5a\xda\x67\xd5\xfe\x52\x1d\x56\x7c\xcb\x1d\xc5\xde\xbd\x3d\xd1\x11\x85\xa1\x47\x9d\x50\x38\x9b\x8d\x8e\x5b\xf5\x7d\xd0\x12\xa1\x71\x13\x82\x14\x5c\x8b\x32\x4e\x26\x5e\x10\xb4\x69\x5b\xac\x3b\xb0\xe4\xec\xed\xd9\x93\xcf\x29\x2e\x52\xc9\x82\xae\x07\x4a\x47\xed\xad\x75\xff\x43\x92\x32\x14\x30\x98\x06\x21\x0d\xfe\x0e\x6e\xa3\xe0\x42\x0b\x07\xc1\x77\x76\xf2\x3e\x3e\x67\xa6\xf5\xe8\x73\x22\x08\x06\x07\x3f\x06\xbd\xd8\x84\x50\x25\x4b\x91\x3a\xfd\xbc\x32\x84\xbc\xdf\x9b\xf0\x8d\x14\x20\xe4\x60\x0e\x52\x20\x6c\x15\x9f\x56\x8c\xb8\xe5\x30\x6f\x16\x6f\x5e\x7f\x59\x36\x79\xbf\xd7\x10\xcf\x62\xe4\xa6\x62\x93\x78\x36\x9e\x3c\x23\x5f\x60\x23\x7a\x56\xef\x9d\xd2\x56\xd7\xcf\xe0\xbe\xaa\x00\xfc\x64\x95\x31\x16\x55\x0a\x8f\x90\x97\x20\xd2\x58\x59\xb0\x91\x95\xf0\x6a\x54\x19\x98\xb8\xb4\x76\xab\xdf\x2d\x9f\x74\xb6\xf1\x10\x23\xd1\x76\xe9\xc2\x61\x6a\x72\x5f\x77\x1c\xf3\x56\x17\xb9\x17\xe4\x25\xbe\x79\xa6\x21\x16\xf5\xd5\x93\xb7\xd7\x2d\xfb\xea\x73\x11\xcc\xa3\x6c\x2d\xfd\xea\x73\x41\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x99\x7e\x1c\xfc\x99\x6d\xe8\x96\x41\x9c\x2c\xcf\xa8\xea\xcd\x24\x70\x70\x25\xb9\xc3\x55\x41\xb3\x5b\x26\xb6\x5c\x49\x01\x7e\xaa\x2d\x55\x1c\x72\x8a\xa0\x15\x21\x13\x56\x3e\xfd\xed\xcb\x4f\x17\x1f\xc1\x3f\x10\xce\x76\xc3\xdc\x03\xb7\xf2\x52\x43\x0c\xc2\xde\x0a\x1a\x43\xd5\x1b\x37\x34\xd7\x8e\x4d\xf5\xf3\xb7\xbb\x02\xbc\xce\xaf\xc7\xce\x21\x2f\x4d\x49\xfb\xb3\x29\xf0\x61\x9f\x93\xac\xd4\x7c\xfb\xd4\xf3\x3f\x2c\xf1\x54\xb7\xe2\x57\x10\x78\x5c\x48\xf7\x25\xef\xa1\xdd\xee\x86\xbb\x67\xfa\x30\x16\x1c\xcc\x7a\x42\x9a\xe1\xae\xa7\x9d\xc6\xe5\x33\x5d\xd5\xc6\x69\xa6\xb2\x3a\xc5\xd5\xa5\x5c\xf4\x6a\x41\x55\x5d\xc8\xf4\xd0\xec\x0e\xf9\x59\xa7\x51\x61\xfb\xf7\xb2\x67\x8f\x02\xbb\xd3\xb7\x2f\xbe\xbf\xed\x8f\xea\x20\xf5\xff\x20\x00\xaf\xea\x85\xfb\xe3\xc7\x1f\x60\xd5\x17\x19\x53\x06\xcb\x93\x2a\x88\x26\xa5\x70\x40\xab\xae\xcd\x5b\xca\x33\x7b\x7a\x0f\x26\x5a\x8a\xb4\xa9\x36\x0a\x96\x30\xad\xa9\xda\xd9\xe3\xb5\x66\x82\x29\xab\x72\x27\x52\xd9\xcd\xb6\xa3\xe9\x8e\x77\x0f\x80\xf2\xd5\xde\x84\xbc\x13\x45\x55\x6d\x27\x21\x1d\x00\x2e\xdb\xcb\x9b\x3b\x6c\x81\xda\x89\xa7\x8e\x0d\x81\x7d\x0d\xa2\xe8\x1a\x32\xf3\x78\x23\x1f\x0a\x9c\x10\x75\xb2\x1a\x91\x5b\xa6\xc8\x92\x6a\x06\xaf\xce\x88\xa1\xeb\x4e\xbb\xbb\xde\x58\x09\x38\x5f\x3a\x63\x8f\x5e\x90\xbb\xba\x95\x37\xf0\x6d\xab\x51\x49\xb0\x8f\x6a\x83\x56\xe8\x06\x06\xb1\x7e\xcf\x21\x75\x60\xf1\xaf\x9c\x99\x0d\x2b\x35\xf9\x00\x29\x3f\x52\x91\x07\x21\x1f\x35\x79\xb4\x1a\xa5\x87\x2b\x0f\x51\xd9\xdd\x15\xbc\x3e\x09\xe3\x10\x79\x5b\x66\xd9\x1d\x4b\x14\x3b\x54\x7c\xda\x05\x1a\x85\x4b\x54\xa7\x59\x65\xad\x68\x5c\x05\x10\x30\x0c\x50\xfc\x41\xd4\x56\x9c\xb2\x1b\xab\x0b\x9a\x74\xe0\xa0\x0e\x4d\x2b\xca\x2c\xb3\xf8\x2c\x6a\x94\x80\x5f\xa3\xb5\x6e\x3b\x57\x67\xf3\x57\x6c\xcd\xed\x72\x3a\x1c\xaf\x9a\x61\xb8\x79\xb7\x77\xb4\xd4\x4c\xcd\xd7\x25\x4f\xd9\x39\xc2\xfb\xae\x6e\xcc\x3e\x87\x5f\xec\x54\xdc\x3a\xe6\x52\xcc\xe9\xfc\x50\xf1\xed\x51\xc4\xda\x05\x39\x64\x42\xb3\x0f\x70\xfa\x3f\x7a\x1c\x79\xce\x64\xef\x3a\x59\xae\x37\xad\x06\xf5\x46\x92\xac\xb3\x06\xd8\x4e\x96\xc4\x19\xbe\x30\x12\xdb\x41\x4b\x1d\x73\xf1\x36\x8b\x43\x8c\x1f\xb2\xb9\xb0\xa6\xd6\x2f\x3f\xef\x79\xc6\x1b\x81\x0b\x6e\x3a\x66\x74\x10\x9b\x3d\x7f\x5b\xce\x1e\xcf\xdd\x75\x32\xb7\xa2\xd0\x1c\x97\xa4\xcf\x61\x0d\xe7\xdf\xc1\xff\xf4\xd9\x42\x21\x8c\xe6\x22\x4d\x9d\x22\x53\x6a\xb6\x2a\x33\x54\x2d\xf4\x82\xd0\x82\x7f\xc2\x13\x34\x23\x0f\x5c\xa4\x33\x52\xf2\xf4\x7f\x1d\x61\x6a\x3f\x82\x91\x73\xc1\x4d\x75\x63\x86\x0f\xd5\xd9\x75\xeb\x5d\x1f\x3c\x4f\xd3\xd4\x9e\x87\x36\xa0\x46\xdc\x4c\x07\xf1\xad\x20\xa0\x10\xb3\x06\xa5\x66\xbe\x6f\xb4\x4f\x91\x64\x8b\xf5\x82\xac\x98\x55\x75\xfc\x31\xb5\x27\x8f\x0b\xbb\xae\x2e\x2b\x76\x65\xcc\x68\x71\x9f\x56\x39\x6c\x3c\x8c\xd5\x55\xe4\x6a\x61\x2f\xc8\x85\xd8\xa1\x1d\xfb\x70\xef\x5c\xc2\x23\x24\x70\x43\x4e\x9a\x63\x71\x54\xb4\x17\x8b\x17\x57\xc6\x28\x96\xd7\xf0\x3e\x44\x22\x0f\x2b\x48\xb9\xe4\xd3\xa7\x86\x51\xda\xe1\xeb\xba\xd2\xfa\xb0\x66\xf5\x8f\xba\x63\x4b\xa0\xee\xb9\xd8\x01\x27\x4b\xa8\xf6\x5a\x35\xf8\x69\x11\xcf\x88\x74\xf8\xf4\x10\x1d\x4c\x18\xae\x58\xb6\x23\xb2\x34\xf5\x29\x4e\x24\xd6\xc4\x7c\xf4\x96\xc5\x9c\xf2\xb6\x43\xca\x45\x93\x75\xde\x58\xcb\x1d\x49\x25\xe4\x18\xc9\x19\x70\x0f\x74\x0f\x7b\x3b\x25\xdc\x1f\x1b\xba\xe5\xb2\x54\x98\x94\xad\x18\x7d\x20\xd4\xc0\x3a\x3a\x2b\xd2\xd9\xa3\x29\x4b\xb0\x97\xf0\x84\x1d\xf8\xab\x62\xf8\xe1\x45\xe5\xef\x2f\x8a\x8c\x27\x75\x65\x6c\xdc\x6d\x98\x9b\x9d\xab\xcf\xa3\xf1\x85\xc9\x3b\x2d\x53\xd0\x64\x7d\x2c\x77\xa3\x6a\x1d\xd5\x2f\xe2\x42\xad\xcb\x1c\x9c\x57\x8e\xfe\xeb\x42\x03\xae\xca\xa8\x4c\x1e\xfc\x7d\xd4\xef\x4a\x7d\xf7\xfe\xd2\x1b\x44\xd0\x67\x54\x87\x92\xb8\x6c\xe5\x74\x41\x3e\x1d\xa5\x52\x0d\x2a\x53\xfb\xda\xd4\xb5\x95\xb2\xbc\xfa\xd6\x27\x47\x57\x42\xb2\x62\x5a\x66\x5b\x5f\x9b\xa6\x9a\x99\xbf\xd5\xb9\x28\x4a\xe3\x98\xa5\x17\x2f\xfb\x3c\x14\x22\xd9\x50\xb1\x46\x93\x10\x6b\xae\x8c\xe8\x9d\x30\xf4\xb3\x67\x52\x4c\x27\xb4\xa8\x9c\x60\x24\x95\x65\xff\x44\x7f\xfb\xdb\x19\xe1\xec\x2d\xf9\x6d\x03\xdc\x82\x5c\x39\x08\x0d\x44\x36\x42\x02\x96\x35\xc2\xfa\x54\x13\xc5\xd6\x54\xa5\x19\x44\xdf\xad\xaa\x52\xed\x58\x28\xc1\x6d\x12\xfb\xcc\xb5\x01\xe7\x9a\x90\xa6\xa1\x56\xf4\xad\x7e\x5c\xab\x10\x2c\x73\x8f\xfc\x78\x9e\x52\x43\xe7\x8d\xa3\x72\x8e\x4d\x0c\xe6\x2e\x2b\x76\x4e\x1d\x91\x36\x0a\xe1\x7f\xe7\x4a\x88\xcf\x69\xf5\x16\xb7\xf2\x0b\x64\x91\x76\xdf\x7b\x41\x8b\xf2\xa0\x82\x1b\x56\x2f\x83\x29\xcc\xed\x13\x77\x55\xd7\x34\x04\x68\x0b\x72\x23\x4d\x5d\xaa\xa0\xf2\x15\xb9\x7c\xd8\xfb\xde\x88\x80\xbd\x93\x49\xae\x6e\xee\x3f\xfe\xfd\xf6\xc3\xf5\xcd\xfd\xe0\x51\xec\x81\x38\x70\x40\x63\x8e\x62\x0f\xe4\xfe\x03\x3a\x7c\x14\xfb\xfc\x9e\xfd\x07\x74\xf8\x28\xf6\xb3\x85\xde\x03\x1a\x7d\x14\x7b\x60\xf7\x1c\xd0\xf8\xa3\xd8\x03\xf7\xe0\x80\xfe\xca\x8f\x22\x13\xdb\x88\x63\xf8\x83\x53\xe9\xba\x4c\x7e\xfb\xe9\xa0\x83\x2e\xa1\x93\xbb\xb4\xae\xc4\xf6\x13\x55\x75\xb1\x79\x88\x25\xea\xb4\x4e\xba\x17\x7a\x4d\x77\xc0\x4a\xde\x9d\xc2\xa7\x35\xca\xdf\xd0\x54\x9a\xba\xe6\x5d\xa7\x59\x84\xda\x83\x10\xf2\xee\xe7\xeb\xcb\xab\x9b\xfb\xeb\xef\xaf\xaf\x3e\x3e\xd9\x80\x3d\x98\x00\xda\x66\xd4\x63\xb8\x61\x70\x11\x35\xa7\x2c\x14\xb3\x92\xa8\x26\xbe\x4b\x4f\x37\xf9\xf1\xe1\x80\xf8\xb6\x83\xcb\xca\xb2\xda\x6a\x98\x49\x37\xba\x31\xde\x33\x8c\xea\x78\x86\xdc\x62\xbd\x61\x5f\xe4\x48\xb6\xec\x18\x70\xd8\x5e\xfd\x1c\xcc\x19\x9f\xe3\x59\xf4\x80\x85\xbd\x25\x49\xb5\xdd\x34\xc1\x84\x90\x78\xb2\xfe\x5e\xc9\x40\x29\xfb\xfd\x6c\x49\x50\x5d\xab\x5c\xab\x2e\x8a\x39\xd3\xae\x83\x54\xf8\x78\xd6\x8c\xcf\x89\x1b\x55\x70\xbf\xfd\x1d\x82\xc0\x42\x10\x62\x13\xcb\x51\x0f\x7f\x4f\x8b\xbf\xb1\xdd\x47\x36\x90\xd7\xb2\xbf\x58\x96\xb1\xc4\x72\x50\xf2\xc0\x76\x68\x82\x7d\xe7\xc1\x0d\xa5\x83\x8e\x49\x7c\x7f\x60\x41\xc7\x67\xe7\xdc\xec\x29\xb0\xb3\x82\xfb\xc6\x4e\x73\x68\x42\x64\x6c\xd2\xfb\x51\xe9\xf8\xdf\x88\xcd\xab\xfd\x8c\xb5\x80\x45\x01\xed\xb7\x92\xb5\x9f\x51\x38\xf7\x76\xe3\xd1\x78\x77\xb6\xf6\x16\x87\xa9\x68\xd5\xf2\x0f\x3e\x98\x6c\x86\x8f\xa5\x29\x9f\xda\xe4\xae\x9a\xe8\x45\x0e\x79\xbf\xf1\x89\x2f\x59\xf0\xc0\xc2\xfe\xc7\x11\xb5\x08\x60\xaf\xc7\x9e\xff\xb3\x9a\x01\x60\x20\x46\x95\x84\x96\xbe\xf5\x96\x25\x5d\x95\x35\x5c\x58\x82\x1c\xa6\x9d\xd6\xeb\x60\x7e\x9e\xd5\xbf\x41\x8d\x60\xdd\xf8\x01\xb8\x24\x3a\x54\x86\x41\xeb\x82\x25\x0b\x21\x53\x66\x0f\xe1\x0c\xff\xe9\xee\xf6\x8b\x24\x91\xa5\x30\xee\x0f\x10\x22\xbc\xd8\x48\x6d\xae\x6f\x23\xc0\xe2\xeb\x85\x4c\xaf\x6f\x67\xad\x7f\xe9\x81\x9c\xc4\x71\x6c\xb0\x3e\x87\xa3\xc9\xff\x53\xed\x03\x42\xc3\xe0\x86\xe5\x14\xfe\xf3\x7b\xbb\x71\x01\xcf\x71\xfb\xe1\xba\x0e\xe3\x17\x10\xbb\x6c\xef\xed\x76\xe1\x9b\x17\xdb\x37\x2f\x4e\xce\x6c\x57\x7e\x9a\xa3\x97\x0e\x2e\x7b\x5f\xa8\x0d\xa8\xb4\xba\x12\x62\xa4\x41\xff\xd4\xfe\xbf\x8b\xdb\x6b\xef\x53\x3b\xf1\x32\xe3\x4f\xfe\x2a\x72\xd7\xa2\xcf\xbf\x6f\x40\xf9\xfd\x13\xf9\x80\x87\x73\x10\xf9\xfa\x16\xaa\xe6\x0d\xe2\xab\xee\x14\x8a\xfd\x67\x5d\xce\x90\xeb\x13\xfa\x12\x7f\x5c\x24\x45\x39\x73\x2f\x2c\x72\x96\x4b\xb5\x1b\x3e\xa5\xee\x75\x56\x6c\x58\xce\x14\xcd\xe6\xda\x48\x05\x1e\x5b\x0f\x1e\xc1\x56\xff\x42\xc0\xc3\xa7\xb2\x31\xc1\x43\xe8\xa8\xcb\x24\xa5\xb2\xf7\x7c\xb6\xab\xb3\xb7\x4f\xca\x19\x2a\x2c\x0f\x57\xc7\xc5\x67\xbf\xb3\xb1\xd7\x78\x40\xa6\xa9\xfb\x1a\x5b\x31\xd6\x05\xa7\xc6\x5d\xfa\x95\x5f\x17\x1a\x36\x88\xad\x15\x7a\x03\x39\xa1\xf5\x33\x8a\x19\xa4\x7c\xcb\xb5\x1c\x28\x39\xdf\xb1\xd0\xbb\x56\x2d\x31\x97\xfb\x80\x9e\xd3\xb8\x22\xcc\xf8\xb0\xcf\x05\xe4\xae\x55\xb4\xba\xc7\xff\xde\xbc\x38\xf5\x82\xfd\x48\xe3\xb7\xf6\xa3\x67\x29\xf5\xc9\xac\xd8\xdf\x89\xf7\x25\x9e\x7b\xf9\xa9\x9c\x8a\x79\xa1\x7f\xec\x34\x0a\x8c\xf3\xb5\xd5\xc1\xea\x03\x31\x83\xc4\x69\x02\xdd\xa1\x09\xed\xe7\x4b\xe9\x3c\xfe\x96\xc7\xa5\xd4\xd7\xdd\x4a\xc9\xdc\x85\x2c\x47\x11\xfa\x92\x81\x35\x39\xe3\xa9\x87\xf5\xc0\x06\x8a\x38\xe2\x33\xe9\x51\xbf\x26\x3d\x0a\x63\x7e\x9c\x12\x15\xa1\x94\xe0\xf3\x4f\xa7\x44\x45\xf6\x75\x0f\x07\x72\x3e\x5f\x98\x26\x13\xdb\x7e\x4b\x56\xa7\x01\xdf\x4b\x62\x8d\x0c\xcb\x6e\x13\x68\xd8\x8d\xd4\x4a\x29\x03\x06\x55\x1b\x69\x6b\x97\x1c\xde\x4d\xf9\x80\xe9\xba\x65\xb4\x26\x17\x50\x55\x17\x19\x14\x80\xf5\xd6\x50\xc5\x5c\x89\x1c\x4c\x15\x66\xdb\x7e\x3b\x7e\x67\x73\x68\x4c\xb9\xe7\x62\xed\xd2\x15\xf0\x7e\x70\xc6\x46\x2e\xaa\x8a\x00\x3d\x30\x2b\xb1\xa0\x2e\x8f\x4f\xb5\x96\x09\x54\xe9\xaa\x2b\xd2\x43\x92\xa8\x5b\x38\xcc\xdc\xd0\x87\x3e\x90\xcd\xea\xf8\x9f\x2c\xc4\x1a\x87\xcb\x1d\x64\xa8\x8b\x6d\x65\xb7\x2d\xd1\xc7\x84\x97\x41\xa0\x94\x3a\x94\x1f\x6f\x42\x7e\x0e\x6f\x8b\x25\x3a\x67\x15\x6d\x38\x5d\xe0\x7e\xaa\x34\x05\xea\x1a\x4e\xf7\x9e\xae\xca\x54\xd3\x47\x6b\x31\x57\x6b\x65\xea\x1c\x10\x13\x0e\xee\xd4\xda\x50\xd4\xbe\x4b\x4f\x60\x7e\x8d\xb9\xfc\xbe\xed\x8b\xef\x84\xe1\x73\xf5\x13\x7d\x99\xc5\x5e\x64\x23\x8c\x81\xe3\x2e\xa6\xd8\x4b\x29\xea\x12\x29\x14\x5b\xf1\xcf\xd1\xb4\xd9\x0c\xa4\xe5\xd0\x18\x66\xc5\xa1\x56\xad\x05\x54\x30\x81\xf1\x7a\x34\xd9\x0c\x5e\x72\x8e\x55\xd7\xd6\xfb\xda\x89\x78\x5a\x47\x21\xca\x91\x63\x0f\xe0\x5d\x97\x24\x3b\x9d\xbe\x7f\x9e\xd3\xe7\x36\xf8\xab\x1d\xbd\x27\xca\x56\x9d\x79\x04\x1d\x4b\x3f\xbb\x6c\x04\x16\x61\xaa\xc2\x58\xda\x69\x04\x96\x62\xe0\x79\xcf\x8a\xda\x2d\x74\x2a\x36\x81\x2d\xe6\xe4\x23\xd9\xf0\xb5\x45\x3e\xb6\xd5\xc1\x9b\x91\x60\x6c\x6e\xde\x2f\x2c\x19\x59\x65\xd8\x48\x05\x99\x0f\x8a\xa7\x07\x89\x32\x20\x22\xf9\xa0\x58\xf8\xa3\x92\x59\xd6\x5f\xba\x3c\xe3\x0f\x8c\x5c\xb2\x22\x93\xbb\xdc\x45\x64\xa4\xe4\xce\x50\x63\x49\xf9\x8e\x99\x3e\x2b\xfa\x00\x99\x56\x39\x09\xd1\xf5\x4c\xce\x30\xdb\xa3\x28\xb3\x8c\x14\xf0\xd1\x02\x7a\x7e\x40\xe6\xc4\x23\xdd\xe9\x19\xb9\x61\x5b\xa6\x66\xe4\x7a\x75\x23\xcd\x2d\x0a\x33\x7d\x3c\xb1\xe9\x8c\xc6\xcf\x09\x5f\x91\xb7\x56\x8c\xd6\x06\xd2\x44\xb8\x6e\xb6\xd9\x91\xaa\x05\xb6\x07\x6a\x95\xb2\xf9\x84\xb0\xa4\x7e\x62\xfa\x0e\x20\x55\x39\x0c\x3d\xa6\xbb\x01\xc4\x57\xd5\xe1\x22\x50\x7e\xe1\xfa\x61\x98\x3a\x42\xd9\xd3\x20\xc1\x64\x77\x9f\x8a\x08\xc2\x6a\x6f\x7e\xb9\x62\xba\x90\x42\xb3\x76\x86\x72\x5d\xe7\x12\x54\x00\x1d\x2d\xe1\x0e\x5f\x20\x85\xd4\x06\xfa\xdf\xc4\x96\x01\xbc\xf5\x1f\x40\x41\x2c\x9a\x65\x2c\x25\x3c\xcf\x59\x6a\xb5\x82\x6c\xe7\x8a\x9c\xd1\xa8\x5a\x11\x16\x02\xb6\xe6\x70\x95\xb0\x18\xd9\x50\x91\x66\x4c\x35\x1b\x29\xb5\x34\x1a\x5f\x67\x26\xc8\x55\xd1\x96\xed\x8a\x6c\x11\x9a\x24\x52\xa5\xae\xcc\xb3\x55\xed\x7d\xec\x7c\x75\x36\x80\x7f\x0f\x72\x0d\xd2\xd5\x3b\x0d\xaa\x7b\xe8\x46\xfd\x2f\x68\x8d\x58\x35\x8b\x3a\x61\xfd\xc2\x06\x91\xd7\xd5\x0a\x2b\xca\x98\x43\x75\xd5\xf3\x46\x21\x43\xf8\xe1\xa9\x35\x51\xc3\x5d\x85\xc8\xb1\x9d\x85\x06\x6e\xc4\x56\xdf\xa1\xa7\x74\x17\x8a\x5f\x28\x89\xed\x32\x74\xb0\xe6\xb8\x4e\x43\x11\x76\xa1\x46\xde\x52\x4c\xb7\xa1\x18\x4b\x53\xbb\x1f\x51\x7c\xc7\xa1\x08\xd8\x8d\x9e\x44\x91\x5d\x87\x22\x80\xf6\xf4\x25\xea\xed\x3c\x14\x01\x72\xa8\x37\x51\x4f\xf7\xa1\x08\xc8\xa1\xfe\x44\x3d\x1d\x88\x62\x50\x10\xe8\x51\x34\xa2\x0b\x11\x89\xed\x21\x42\xc6\xda\x5c\xe3\xda\x3d\x44\x9b\x1b\x07\xdb\xe9\x90\x67\x6a\xa9\x43\x46\xf1\x86\xe1\xe2\xd0\x87\xf3\x8c\x68\xaf\x13\x79\x88\x9f\xa5\xc5\x0e\x89\x6d\xb3\x43\xc6\x91\x48\x74\xbb\x1d\x72\x54\xcb\x9d\x88\x55\x41\x9b\x90\xa3\xda\xee\x90\x31\xc7\x66\x74\xfb\x9d\x28\x87\x02\xd6\x63\x1b\xdf\x82\x87\x8c\xf4\xcc\x91\x11\x3e\x2b\x72\xaa\x76\x3c\x64\x2c\xb7\x21\x63\xda\xf2\x0c\x4f\x33\xb6\x35\xcf\x11\xf3\x8c\x75\xd5\x90\xd8\x36\x3d\x24\xba\x55\x0f\x19\xe3\x65\x26\x23\x78\x78\x4c\xdb\x1e\x72\xe2\xd6\x3d\x64\x1c\xea\x87\x0b\xdd\x93\xb8\x62\xf7\x64\x64\xc1\x7b\x32\xae\xe8\x3d\x39\xa6\xa5\x4f\xc4\xbe\xcb\x03\xef\x54\xb0\xf8\x7d\x0c\x25\xb5\xca\xe3\x1f\x59\x00\x9f\x3c\xad\xbd\x0f\x89\x6c\xf1\x43\x9e\xab\xcd\x0f\x19\xdd\xea\x87\x8c\xa1\xdb\x38\x66\x31\x50\xea\x9f\x8c\x70\xea\x0e\xb7\xff\x20\xc7\xb6\x00\x19\xc0\x0a\x34\x08\x19\xdf\x06\x64\x10\x6a\xd5\x24\x64\x54\x2b\x10\xf2\xdc\x52\xdf\x09\xdb\x82\x90\x91\xad\x41\xc8\xaf\x85\x73\x46\xb4\x0c\xf9\x15\x73\xce\x2f\xcb\x5b\x22\x5e\x2a\x14\xbb\x33\xb2\x88\xb6\x30\xe2\xeb\x3d\xf6\x45\xd7\x41\x2c\xda\xc0\x58\x1b\x0c\x49\x5a\xc2\x49\xa4\x02\x62\x9f\xbd\xae\x28\x9b\xa6\xbf\x60\x8c\x05\x69\x54\x6e\xf7\x5d\x9f\xce\x5d\xc7\xa7\x46\xff\xf7\x52\xb1\x99\x5d\x33\xcb\x61\x45\xb3\x98\x38\x41\x57\x20\x1c\x5e\x67\x26\xc1\x10\x13\x6f\x0b\x75\x96\x14\x8f\x8c\xf8\x5a\xbc\x89\xa2\x7a\x83\xe5\xaf\xd9\x67\x6e\x5c\x09\x78\xc5\xa8\x96\x02\x73\xbb\x1a\x85\xce\xb9\x26\x05\xd5\x58\x1d\x25\x74\x93\xd4\x13\x43\x70\xae\x39\x7c\x13\xd4\x5a\xd1\x84\xb9\x2e\x68\x04\x12\x12\x52\xf9\x18\x72\x6d\x41\x17\x7a\xed\xf7\x16\x8b\x41\x21\x11\x58\x6e\xce\xc0\xc2\xe4\xf3\xdf\x17\xe4\x63\x95\x6c\x37\x6c\xa9\x95\xa5\x49\x64\xcd\x24\xdc\xcc\xf7\x0d\xcb\x10\xb6\x02\x5b\x3f\x54\x0d\xaf\x22\xa7\x66\xa9\xc2\x01\x14\x38\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x50\x8d\xaf\x7a\xf7\x07\x1a\x52\xd0\x64\xd3\xf6\xbb\x4c\xc6\xea\xc9\x58\x1d\x7a\x26\x63\xf5\x64\xac\x9e\x8c\xd5\x9d\xcf\x64\xac\x9e\x8c\xd5\x93\xb1\x7a\xf8\xdb\xc9\x58\x3d\x19\xab\x27\x63\x75\xc7\xf3\x2d\x9a\x5c\x26\x63\x75\xf8\xf3\xc9\x58\x3d\x19\xab\x03\x50\x27\x63\x75\xe7\xfb\xbf\x06\xce\x39\x19\xab\x43\x1f\x7f\x63\xc6\xea\x81\x17\xbc\xd5\xf7\xd6\xca\xb8\x31\x91\xd8\xb7\x60\x63\xe3\x89\x33\x0f\xb7\x9b\x28\x3a\x60\x8b\xba\xfa\x5e\xcf\xc4\xeb\x7c\x40\x1f\xd3\xea\x8c\xc0\xb5\xd1\xb9\x33\x26\x18\xec\x79\x3d\x30\x8f\xae\x0b\x7d\x4c\xe3\xec\x61\x26\x16\xb6\xdd\x1d\x65\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x1d\x61\xa7\x8b\xb3\x55\xc5\xda\xe8\xf6\x2d\x70\x03\x60\xa3\xed\x73\x4d\xeb\xdb\x00\xcc\x38\xdb\x5c\x9f\xe5\x6d\x48\x44\xeb\xb1\xcb\x0d\x5a\xdd\x06\xe0\x76\xdb\xe4\x82\x16\xb7\xa1\x99\x76\xda\xe3\x82\xd6\xb6\x61\xc4\x46\xda\xe2\xa2\x0c\x0a\xd1\xd7\x61\x8c\xee\x16\xc1\xb9\x9d\x5b\xed\x7e\xa3\x98\xde\xc8\x2c\x70\x92\xda\xdd\xc3\xb8\xe0\x79\x99\x5b\xc2\xd4\x50\x5b\x7f\x5b\x79\xe8\x74\x45\xf1\xc8\x43\x83\xd6\xad\x25\xd0\xb6\x25\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\x36\x74\x0b\x1c\xa7\x4c\x12\xc6\xd2\xbd\x1e\x5b\x01\x90\xbf\x5f\x54\xb3\xab\x0a\x22\xbe\xe9\xdf\x19\xac\xee\x02\x12\xcb\xef\x7f\x37\x80\xc9\xb0\x54\x33\x68\xc2\x7c\x0e\xf3\x65\x1c\x9b\x1c\x16\x60\x47\x9b\x2c\x23\x8a\xe1\x3c\x8b\xb9\x32\xca\x54\x19\x79\x8a\xa2\x4d\x94\xe3\xcd\x93\xb0\xbf\x43\xca\xcb\x31\xa6\xc9\x28\x2e\x32\xda\x24\x19\x63\x83\x3e\xca\x1c\x39\xc6\x14\x79\x54\x9d\x97\x63\x4d\x90\xa3\xf4\x8e\x68\xd3\xe3\x69\xcc\x8e\xcf\x52\x53\x29\x02\x2f\x71\x66\xc6\x68\x13\x63\x9c\x79\x71\xd8\xb4\x78\x4a\xb3\x62\x24\x6a\x87\x95\xe2\x08\x85\x78\x8c\x32\x3c\x42\x11\x1e\x6d\x3e\x74\x48\x1a\xd8\xd6\x58\x05\x78\x4f\xbd\x1d\x80\x7a\x9c\xf2\xfb\x04\xc5\x37\xc6\x5c\xf8\x2c\xa6\xc2\x71\x66\xc2\xc8\xa6\xae\x43\x87\x7b\x40\x7d\x8f\x38\xaa\xd0\xcb\x89\x66\x97\x2c\xa3\xbb\x3b\x96\x48\x91\x06\xdb\x9f\xb7\x4a\x1d\x54\x34\xa7\xf1\x43\x27\xb9\xb5\xa3\x6c\x36\xd4\x55\xcb\x09\xfa\xbd\x5d\x80\x92\xd7\xdc\xdd\xe5\x02\xb5\x11\x71\x86\xc7\x64\x2f\x9f\x40\xbf\x26\x27\x15\x11\x31\x30\x68\x1c\x9a\xff\x2a\x1f\x89\x5c\x19\x26\xc8\x4b\x2e\x3c\xa6\x5f\x35\x84\xc3\x5a\xd6\x0e\x91\x9c\x23\x4f\xfb\xdd\x9b\xd7\x1e\xcc\xd7\x12\x95\x41\xa8\xd7\xfa\x14\x5a\x87\x03\xf5\x14\xb5\xc3\x81\x58\x95\x59\x5b\xf5\x40\x75\x24\x56\xef\x78\x53\x97\x44\x79\x03\x73\xa9\x68\xd9\x6a\x93\x2e\x98\xf1\x10\xe1\x41\x88\x5f\x60\x2b\x22\x5c\x02\x47\xb9\x03\xd0\xe0\x3f\x70\xc5\x8e\x72\x05\x34\x8d\xfd\x01\xb8\x63\xdc\x00\xcf\xa2\x3d\x9d\xd0\xf4\x3f\xc6\xec\xff\x4f\x27\xd9\x44\x98\xf7\x7f\x45\x92\xcd\x97\x90\x05\x0c\xcf\x99\x2c\xcd\x89\xc4\x80\xba\xbd\xba\xe3\xc8\x3c\x5c\xaf\x48\x96\x7b\x0d\x3a\xde\x38\x80\x9d\xb7\xd4\xe9\x22\x6a\xbf\x31\x29\x61\x60\x9f\x22\x5b\xa7\x36\xcb\x50\xd5\xb2\x58\x5d\xa3\x9c\x6a\x6c\x87\xfc\xf3\x0f\x17\x7f\xbe\xfa\x61\x41\xae\x68\x6f\x1b\xf8\x46\x95\x10\x81\x0d\x11\x91\xf6\x37\x74\xcb\x08\x25\xa5\xe0\xff\x28\xb1\x56\x11\x79\x59\x41\x7c\xe5\xbd\x26\x3d\x40\x9f\xd4\x22\x1b\xb9\x58\x4c\x8f\x45\x5f\xa9\x12\x1b\x0d\xa0\x19\x59\x6a\xd7\xfb\x7e\xcf\xed\x77\x65\xff\xd4\xcf\xa2\x28\xf2\x9e\x0d\x53\x8c\xac\xf9\xd6\x19\xec\x5c\x09\x1a\x9a\x56\x41\xaa\xcd\x56\xbb\x74\x09\x66\xea\x5e\x0e\x25\x98\xb1\xd4\x57\x69\x1c\x52\xe8\x66\xfe\x85\xd5\x48\xf4\x0c\xda\xe3\x73\x2b\x12\xf3\x9c\x2a\x9e\xed\x9a\x43\xd0\xac\x8f\xdf\xdc\x54\x6d\xd2\x77\x78\x1d\xd7\xd3\xbf\xfc\x70\x75\x47\x6e\x3e\xdc\x43\x4f\x24\x7b\xb3\x82\x15\x1d\xfe\x0e\x88\xe9\xee\xfa\x8c\x8f\xab\x6d\x8d\xad\x57\xe1\x13\x3c\xe7\x5c\x43\xab\x66\x26\xec\x60\x4e\x2b\xf7\xa5\xa0\x5e\xbc\x5e\xc0\xff\xf5\x95\xbd\xa6\x69\xaa\x2c\x37\xaf\x9c\x10\x7b\xf9\x03\x96\xcb\x02\xbf\xe7\xcb\xac\xb1\x77\x0e\x7b\x5f\xac\x33\x58\xe5\x4c\xbc\xb5\xcb\x6e\x36\x08\xab\x36\x12\x10\x82\xf5\x4a\xa1\x09\x69\x2f\x1f\x18\xec\x6b\x16\x59\xaf\xb2\x9e\x50\x74\xbd\xbc\x9a\x5f\xfb\xcb\xd4\x1d\x0a\xd9\x28\x69\x4d\xae\x6f\xfd\xb6\x84\x2f\x34\x28\x23\x56\xdd\x85\xae\x18\x34\x00\x46\x93\xc4\x8c\xbc\x26\x7f\x22\x9f\xc9\x9f\xe0\x6a\xfd\x63\x08\x58\x1c\x07\x8d\x13\x6b\x51\x6a\xbb\xbe\x8d\xc6\xca\x4f\xf6\x08\xd8\x6f\xec\xca\x8d\x24\x4b\x2e\x52\xec\xd0\xe4\x9b\x0e\x3b\x6c\x3d\xb9\xc2\xa1\x1d\xe4\xa4\x1b\x06\xd6\x09\x72\xdd\x68\x41\x1f\x76\xac\x99\x91\x5b\x66\x41\x5b\x49\xf6\x06\x89\x3c\x6c\x9e\x6e\x55\x2c\xab\x47\xca\xa9\x49\x36\xed\x13\x64\xaf\x70\x6d\x6a\x22\x0e\x0b\xc3\xa9\x04\x0d\x01\xdd\x81\x1b\x1e\xa4\xca\xd3\x12\xd2\xa8\xe6\x7b\xad\x5d\xd8\xc3\xf4\x9e\xa0\x38\x20\x84\xa7\xfe\x66\x6d\xa4\x43\x15\x32\xc5\xab\x1a\x26\x95\x36\xd8\x8d\xbf\x95\x83\x40\x0f\x6f\x6c\x17\xa2\x52\xa9\xce\x40\x5f\xf6\x24\xb8\x6e\x9c\x50\xc1\x52\x0d\x64\x2c\xd8\xd3\x52\xf5\xc0\x0b\x6e\x4c\xd4\xf9\x28\x94\x34\x32\x91\xc1\x9a\x91\x6d\x93\xb0\xfb\x00\x1b\xfc\x23\x65\x39\x9c\xff\x78\x79\x3b\xb3\x1a\x21\x14\xcf\xbb\x7b\x37\x64\x95\x6b\xb5\x87\xbb\x7f\x77\x1b\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xde\x27\x96\x3f\xad\xf6\xa4\x62\x34\xe5\x27\x8b\xad\xf1\xad\x0e\x2b\xa8\x63\x82\x6c\x72\xb9\x65\x29\x5e\xe0\x75\xcb\xc4\x14\x1a\xf2\xea\x40\xe4\xcd\xb0\x0c\xf9\x15\x2c\x83\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x81\x77\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\xe9\x44\xcb\x14\x79\x33\x45\xde\x4c\x91\x37\x8d\x97\xa6\xc8\x1b\x37\xa9\xff\x32\xfe\xa9\x29\xf2\xa6\xfd\x4c\x91\x37\x07\xa3\x4c\x91\x37\xdf\x86\x4f\x6d\x8a\xbc\xf1\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\x53\xe4\xcd\xde\x33\x45\xde\x4c\x91\x37\x53\xe4\x4d\x78\x9f\xaa\x6e\xde\x31\x2e\x94\x77\x32\x2f\x4a\xc3\xc8\xc7\xaa\x5d\x7d\xd5\x33\x7d\xb9\x43\xbf\x60\xe3\x70\x3c\x97\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb1\x16\xe2\x3c\xc1\xa9\xcd\xab\xf5\xcc\xab\x99\x9c\x1f\xeb\xea\xc0\xde\xf9\xfd\xf4\x50\xc7\xc7\xdc\x46\x31\xfe\x28\xc6\xd5\xc6\xf8\x0f\x30\x85\x86\xa1\x05\x9b\x45\x7d\x06\xf2\xa5\xb9\x2c\xb1\x04\xa4\x5b\x7d\x60\xec\x0a\x2f\x68\x26\xfa\x7a\x68\x27\xf1\x3d\x83\x99\xfe\xca\xd8\xff\xe8\x26\xb1\x8f\x7f\xc7\x3e\x8e\xc3\xbf\x3f\x32\x10\x81\x50\x8d\xc0\x35\x91\x39\x37\x56\x4e\xb1\xc2\x5e\x23\x5a\x28\xe4\xd5\xe0\xa6\x65\x43\x75\xd4\x02\x3e\x47\x6a\xb0\x0a\x6a\xe5\xe6\x68\xf6\x5c\xf3\xdd\xd4\x42\xe8\x82\xca\xb7\x95\xb4\x04\xbb\x3e\xf7\xcd\x77\x81\x71\x7e\xd3\x14\x34\xf0\x82\x95\xf7\x15\x37\xbb\x77\x52\x18\xf6\xb9\x47\x82\x69\x13\xc3\x9d\xfb\xc4\x75\x15\xd4\x95\x28\xe5\x9c\x98\xaa\x14\x10\xd5\x10\x71\x95\xc4\x20\x0b\xbb\x8d\x9d\xfb\x89\x02\x56\xd8\x67\x73\xde\x03\x32\x6e\x2b\x0c\xd5\x0f\xf5\x3e\xb0\xb9\xbd\x9c\x6a\x74\x1f\x8c\x75\x2c\xe3\x04\x16\x73\xab\xf8\x96\x67\x6c\xcd\xae\x74\x42\x33\xd8\xf3\x58\x11\xe0\xa2\xe7\x7b\xdf\x55\x51\x57\x5d\x34\xfb\x3a\x66\xbb\x79\x82\x50\x97\x50\x41\xd6\x94\x0b\x92\x5b\x1c\x15\x1e\x2c\x74\xdf\x13\xd0\xe1\xad\xa0\xca\x2a\x04\xee\x83\x90\xc4\x05\x81\x61\x4b\x29\x33\xe7\x91\xcd\x76\xf5\x9c\x9c\xab\x5f\xc8\x9f\x05\x7b\xfc\xd9\x8e\xa3\xc9\x2a\xa3\xeb\x50\x2f\x6a\xe2\x2a\xc2\x32\x73\x50\xb2\xa5\x9a\x0e\xe9\x43\x47\x88\x31\x68\x10\xff\x08\xc5\x0e\x8c\x9d\xed\xbe\xdf\x92\x37\xaf\x80\x6a\xa9\x26\x15\xf4\x90\x51\xe5\x77\xaf\xc0\xfa\xf2\xee\xe2\xf6\xe7\xbb\xbf\xdf\xfd\x7c\x71\xf9\xfe\xfa\x66\xe8\x88\x86\xfb\x94\x26\xb4\xa0\x4b\x9e\xf1\x30\xef\x3e\xb0\x82\x37\x3f\x03\x46\x95\xa6\xe7\xa9\x92\x05\xae\x53\x95\x02\xe2\x35\xeb\x18\xac\x08\x43\x86\xf7\x41\x55\xe1\x9d\xd8\x9a\xbb\x3d\xd4\x5a\x51\x61\xbc\xb0\x33\x54\x9f\x1b\xd1\xac\x4a\x61\x05\xd5\xa7\x7a\xdc\x68\x3a\x26\x28\xe1\x22\x4d\x59\xda\x9a\xfa\x89\x7d\x40\xef\x3c\xe8\x5d\x1d\x31\x4a\x6e\x3f\xdc\x5d\xff\xef\xf8\x51\x89\xa3\x91\x28\xf7\xc0\x89\x3c\xd8\x84\x58\x32\x19\x81\xc9\x8f\x2e\xba\x67\xc2\x65\xcf\x3b\x03\x95\xfc\x3d\x57\x89\x3c\xdc\x1f\x4b\xd1\x8e\xcc\xaf\x21\x90\x5c\xa6\x6c\x41\x6e\x91\x29\x42\xb7\xdd\x20\xef\xaf\xbe\xab\xd9\x00\x98\x7f\xed\xc7\xc2\x70\x9a\x65\x3b\x62\x25\xb1\x2d\xcd\x18\xba\x90\x95\xec\xd5\x56\x48\x5d\x52\x0b\xe3\x52\x9b\x5c\x63\x45\x33\x1d\x38\xe0\x31\x7c\xd0\xb2\xfa\xf7\x56\x98\x8c\xc4\x53\xf5\x3e\x49\x99\x90\xc6\xc9\xa5\x76\x24\x08\xa8\x55\x32\x21\x28\x9b\xa2\x1b\x22\xb0\xaa\x3a\x9c\xa8\x62\x96\xc0\x62\x3d\x1b\xe4\xda\xaf\xf5\xb6\x1a\x13\x34\xf1\x00\xcc\x52\x33\xbd\x77\xdb\x38\x36\x58\x4b\xab\x76\x5c\xc5\x68\x0a\xb1\x61\x05\x35\x1b\xb0\x6b\x06\x80\xe6\x54\x3f\xb0\x14\x5f\x5d\xe0\x3d\xec\x24\x69\xed\x3a\x00\xb8\xe9\xdd\x5b\x2c\xac\x18\x35\xa5\x62\x70\xff\x86\x85\xdc\x25\x23\x4c\xd0\x65\x16\x8a\x3c\x8b\x0a\x8a\xa4\xe9\x07\x91\xed\x3e\x4a\x69\xbe\xaf\x42\xaa\x22\xb7\xf3\xa7\xaa\x27\x78\x53\x83\x86\xcb\x16\x8c\x94\xe9\x1c\xd0\x04\x81\x5c\x71\x95\xcc\x2f\xeb\xed\x3b\x01\x79\xaa\x52\x5c\xe8\xbf\x28\x59\xc6\x36\xe5\xb0\x14\xf4\x97\xeb\x4b\x38\x55\x25\x9e\x1b\x26\x8c\xda\x41\x50\xe4\x41\x06\xcf\xb0\x0c\xb7\x20\x3f\x5a\x9a\xda\xa3\x22\x2b\x71\x95\x42\x33\xb3\x20\xef\xe9\x8e\xd0\x4c\x4b\x27\x4c\x85\x24\x23\x41\x6e\xc1\x67\xd2\x94\xff\x17\x04\x62\x9c\x31\xee\x62\x29\xcd\x86\xec\xbd\x30\x40\x9c\x87\x10\x31\x7c\x0f\x0d\x4c\x75\x82\x12\x17\xfb\x80\x43\xc4\x49\x1f\x98\x26\x85\x62\x09\x4b\x99\x48\x02\x7b\xd8\xb0\x15\xfd\xf1\x0f\x4f\x32\xdf\xc3\x4e\xdf\x48\x61\xc9\x38\x72\xaf\xaf\x45\xca\x13\x8a\x3c\xc8\x75\xb3\xae\x49\x18\xac\x9a\x4e\xc6\xa4\x10\x03\x37\xc0\x65\x4b\xcd\x14\x76\x77\x56\x25\x43\x24\xfe\xad\x5c\xb2\x8c\x19\x8c\xb8\x85\xb8\x7e\x6a\xb0\x95\x00\x36\x94\xa7\xc6\x13\x46\xf8\xa4\x33\xa1\x4b\x68\x17\x62\x55\x63\x43\x52\xc9\xea\x78\x45\xaa\xc9\x8f\xd7\x97\xe4\x35\x79\x69\xe7\xf7\x0a\x7c\x2c\x2b\xca\x43\x62\xbb\x91\xe8\x85\xd9\x97\xab\x57\x1e\x38\x2c\x03\xe8\x93\x48\x85\xc7\x70\x46\x44\xc8\xe7\x03\xdd\x62\xdc\x0a\xad\xba\xe3\x63\x8c\x9d\x67\x0e\x8c\x36\x6d\x42\x0f\x90\x73\x68\x9c\x30\xa1\xf7\x91\x73\x00\xe2\x30\xa1\x8f\x20\xe7\x68\x96\xf4\xa3\x66\x6a\x04\x47\xfa\xf1\xa4\x1c\xa9\x29\x02\x58\xaa\x6d\xaf\x1e\x49\x33\x67\x86\xa6\xd4\x50\xc2\x43\xdb\x51\x8a\x46\x47\x90\x5f\xc3\x06\x9f\x8e\x5f\x69\xf6\x03\x17\xe5\x67\x74\x91\x8d\x51\x21\xef\xae\xe0\x43\x92\xf8\xc9\x03\xc2\x69\x51\x64\x1c\x03\x84\xdb\x79\x94\x01\xcc\xe0\x21\x6f\xa6\xc7\x74\x09\x3e\x70\x94\x69\x96\x49\xcb\x2a\xed\xad\x4e\x45\x2a\xf3\x00\xd8\xfd\x09\x5a\x81\x89\xd1\x64\xd3\xb4\xb0\x77\x10\xcb\xa8\x4b\xea\xbf\xf8\xb5\x17\xa7\x3a\x67\x6c\xcb\x82\x69\x37\xfb\xd9\xb5\xf6\x7d\x2b\x38\xf9\x1d\x00\x00\x24\xa3\x4b\x96\xe1\xe5\x81\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xc9\x6c\x4c\x30\xd2\x47\x99\x81\x7f\x8b\x56\x8b\xb1\x00\xbe\x91\xb5\xc0\x6b\xf1\x6b\x01\xb9\xbe\xb5\x16\xd0\x77\xbe\x8d\xb5\x94\xc1\x9b\xe8\x60\x2d\xf6\xe2\x6a\xaf\x05\x6e\x90\x6f\x61\x2d\x11\x6a\xfd\x23\x17\xa9\x7c\xd4\xe3\x99\xee\x4f\xf8\xa1\xe7\x0c\x89\x65\x3d\x86\x8b\xb5\x6e\x32\x5e\x1a\x34\x96\x36\xf5\xd4\x2e\xce\xeb\x8d\xf3\x55\x3e\xf5\x21\x8f\x0a\x40\xf7\x02\x57\xa9\x9d\x7f\xe6\x88\x8b\x34\x44\xf1\x51\xbc\xf1\xe4\x1c\x70\x9d\x6b\xfa\x4e\x59\x58\x86\xd3\xec\xae\x18\xd5\xf6\xec\x2f\xef\xef\x2e\xda\x1f\x5b\xc2\x7d\x84\x94\x7b\xbb\x1e\xfb\x77\x42\xd3\x9c\x6b\x1d\x36\x49\x03\x7e\xd9\x12\xda\xd1\xbd\xf4\x3e\x8a\x35\x37\x9b\x72\xb9\x48\x64\xde\x70\x57\xcc\x35\x5f\xeb\x73\x47\x65\x73\x3b\xfb\x57\x03\x70\xb9\xc8\xb8\x68\x18\x1d\x20\x81\xdd\x09\x75\x30\xc1\xa4\x5a\x01\xa0\x1e\x33\x4d\x07\x80\xa2\x95\xb7\x03\x01\x98\x5d\xca\x59\x96\x3a\x43\x04\x86\x63\xdb\xf3\x9c\x15\x1b\x3a\x87\x0b\x63\x00\xb8\xcb\x19\x03\xbd\x7e\x23\x85\x74\x3e\x74\x8c\x39\x76\xaa\x14\xda\x25\x60\x12\xee\xe4\xd8\xb9\x0c\x00\x6e\x5a\x3e\x4e\xc2\xda\x0e\xa9\xe7\x66\x30\xb0\x7e\x80\x82\x00\x81\x2e\x63\xae\x11\x8d\x33\xb0\xb2\xce\x8d\x44\xe1\xfb\xd7\xb0\x0f\x95\xc6\x33\x12\xfd\xa0\xf9\xb8\xcf\x2c\xb7\xf1\x4c\xb8\x53\x13\x1a\x58\xd4\x41\xed\x95\x4e\x6d\xc8\xbe\xd2\xd6\x88\x06\x8f\xef\xa1\xbe\x34\xa4\x15\x0d\x80\xec\x12\x76\x9f\x24\xeb\x76\x03\x3d\x81\xbc\x4b\xba\x64\xde\x3d\x7a\x5e\x32\xe3\xc8\x19\x08\x36\xa7\x3b\xb2\x1c\x3a\x2e\x29\xd7\x60\xd6\x04\xa7\x74\x93\x78\x3f\x36\x09\xe9\xd4\x74\xfa\x64\xc7\x3c\x06\xb6\x46\x67\x75\xdf\x35\xde\x27\xfc\xd0\x14\x75\x2b\x53\x0c\x19\xaf\x82\x72\x7b\xfb\x1f\xba\xd0\x75\xfe\x8b\xbf\xfb\x6b\xc9\x42\x48\x8c\x99\x68\xc6\x91\xfb\x06\xb3\xd8\x34\xb5\x07\xa6\xb3\xe8\xba\xe6\xab\xad\x59\xa0\x95\x6b\xc3\x75\x33\x39\x7c\x56\x4d\x3a\xe0\x34\x6e\xb6\x76\x98\x91\x7f\x2f\xb5\x21\xb4\x72\x3f\xb7\x7a\x4e\x54\x31\xc7\x40\x4e\x49\xaf\x35\xc5\xe7\x62\x19\x69\x27\xb3\xe5\x29\x23\x29\x5f\xad\x98\x77\x8b\x2f\x19\x29\xa8\xa2\x39\x33\xe0\x46\x41\xd4\x42\x17\x5e\xd1\x4f\x0c\x72\x45\xa8\xef\x75\x5b\x45\xc0\xcd\xd0\x47\xcb\x0d\xc9\xf9\x7a\x83\xb2\x0e\xa1\x24\x93\x62\x0d\x11\x7d\x76\x0a\x99\xa4\x7d\x27\x11\x98\x83\x54\xe4\x91\xaa\x9c\x50\x92\xd0\x64\x03\x56\x42\x2a\x48\x5a\x2a\x48\xf0\x34\x8c\xa6\xbb\xb9\x36\x56\xcf\xb6\xd2\x11\x98\xd2\x10\x03\xbd\x5e\xe8\x83\x4e\x18\x80\x2f\x8e\x91\xc8\xf6\x2e\xa9\x8e\x89\xf3\x15\x78\xe1\xa0\x49\x7e\x3d\xd0\x5b\x07\x6c\x4a\xe9\xdf\x7b\xa6\x94\xfe\x29\xa5\x7f\x4a\xe9\xf7\x6f\x4e\x29\xfd\x07\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\x3f\x3c\x53\x4a\xff\xf8\xb9\x4d\x29\xfd\x53\x4a\xff\x94\xd2\xdf\x78\xa6\x94\xfe\x83\x51\xa6\x94\xfe\x6f\x23\x59\x6f\x4a\xe9\xf7\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\x90\x0b\x2d\xe5\x3d\xa9\x96\x31\x59\x07\xce\x80\xdf\x88\x55\x5c\x96\xab\x95\xd5\x50\x65\xef\x65\x6d\x47\x3c\xb0\x44\x57\xb9\x6f\x95\xa3\xcb\x59\x93\x35\x33\x33\x48\x6b\xc0\x30\x9d\x71\x40\x5d\x20\x25\xa4\x35\x2a\xa6\x21\x0d\x40\x90\xab\x0f\xdf\x2f\x1a\x49\x0f\xbd\xa6\xcc\xde\x54\x88\xa1\x98\x63\x98\xcd\x07\x91\xc4\x38\x25\x6b\xc4\x76\x45\x82\x3a\xfc\x26\x99\xd4\x18\x53\x00\xa0\xfb\x5c\x53\x1b\x2a\x04\xf3\x52\x07\x37\x20\x2b\x2f\x19\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\x6c\x16\x76\x7c\x11\x84\xea\xb3\x43\xab\xd1\x2d\xeb\x65\x34\x47\xe4\x2a\x96\x53\x8e\x03\x10\x9a\x28\xa9\x35\xc9\xcb\xcc\xf0\xa2\x1a\xa2\x6f\xc7\x18\xc4\x00\x61\x64\x56\x85\x30\x70\x2c\x30\x34\xc5\x43\x4c\xbf\xdb\x58\xed\x97\x20\xc5\x60\xe0\x35\xc8\x46\x33\x48\x68\xcf\x0b\xb3\x43\x97\x2b\x3a\x9e\xb8\xd2\x86\x24\x19\x87\xeb\x1f\x66\x87\x39\xa1\x30\xca\x2c\xe0\xd4\x37\x90\x2b\x0a\x6b\xd5\x6e\xb1\x22\x85\x5b\xa3\x30\x1a\x1d\x8d\xf5\x30\x6e\x80\x94\x6b\x77\x47\xeb\x3e\xcf\x04\xf5\xbd\x43\x70\xb3\xfd\x5a\x61\xbb\x53\x18\xc2\x8f\xe9\x7e\x6a\x0c\x32\x80\x05\x48\x79\x72\x8a\x52\x7d\xa8\x20\xc5\xd8\xe7\xf9\xcc\x5a\x7d\x46\x8a\x2a\x59\xce\x6c\x68\x7f\xa5\x05\x7f\x10\xdd\x6c\x81\x08\x04\xdb\x5a\x9a\x65\x09\xb3\x22\x34\x3d\x38\x61\x38\xdc\x51\x47\xc9\x30\x95\x73\x01\x6e\xd9\xf7\x4c\x6b\xba\x66\xb7\xbd\x06\x9e\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\x59\x1f\x43\x68\x4c\x85\xe4\x38\x97\x2a\x06\xf0\x51\x71\x63\x75\x2a\xae\x31\x97\x0e\xec\x9a\xfb\x01\x97\xfd\xa0\x9b\x4e\xb8\xf7\x1e\x74\x0d\xd2\xf2\x77\x91\xa2\xe3\x6a\xc9\xc8\x52\x71\xb6\x22\x2b\x2e\x68\xe6\x3c\x50\x7d\xf4\x05\x39\x22\x14\x05\x6a\xad\xad\x68\x2a\x85\x77\xac\xf8\x35\x2c\xc8\x4f\x6e\x11\x46\x95\x22\xa1\x83\x39\xcb\x42\xa6\x8c\xf0\x15\x59\x83\xb7\x4b\xa1\x43\xfd\x0f\xaf\xff\xc7\x1f\xc9\x72\x67\x6f\x44\x30\x54\x1a\x69\x68\x56\xa1\x29\x63\x62\x6d\xf7\x00\x18\x44\xdf\x59\xc8\xb2\x66\xfa\xa5\xc7\x2c\xd4\x55\xc1\xa5\xbf\xf9\xdd\xc3\xb2\x7d\xa5\x9f\xa7\x6c\x7b\xde\xd8\x97\x79\x26\x7b\xe3\x52\x0e\x9b\xe1\x74\x5f\xbe\x03\xe2\x65\x07\x41\x42\xf1\x85\x08\x92\xf4\xc9\x4f\x64\x23\x1f\x31\x07\xb3\x83\xa2\x6a\x97\x78\x21\x8b\x32\xeb\xef\xda\x43\xc8\xf7\x96\x8a\x01\x4f\xa5\xbb\x1d\x5a\xe1\x8c\x9d\x27\x07\x14\x7d\x07\xb8\x9f\xd7\x35\x6f\x78\x74\x71\xfa\xe9\x49\x17\x0f\xe5\x94\xdc\x2a\xf7\xa9\x54\x6c\x41\xbe\xa7\x59\xb6\xa4\xc9\xc3\xbd\xfc\x41\xae\xf5\x07\x71\xa5\x54\xaf\x18\xd0\x9a\x77\x46\x2d\x5f\xde\x94\xe2\xa1\xdd\x6a\x21\x93\x6b\x2b\xc7\x15\xa5\xf1\x11\x2b\x8d\x55\xf5\x00\xf6\x33\x85\x33\x5e\x5d\x02\xd4\xf5\xb2\xa9\x61\xb3\xcf\x40\x57\x10\xf0\x44\x05\x61\x76\xae\x7d\x98\xb6\x14\xdd\x9c\x8b\x6e\x92\xe5\xef\x5e\xff\xe1\x5f\x90\xf4\xad\x76\xf1\x2f\xaf\xc1\xf9\xaf\x67\xc8\x5c\x2c\x67\xec\xe7\xd0\x3a\xa7\x59\x66\x15\x89\x26\x51\xdb\x6d\x5d\xc4\xf6\x6e\x1a\xa2\x56\x13\x43\x98\xd1\xc2\xdd\xfd\xfd\xdf\x03\x92\x1d\x37\x9a\x65\xab\x19\xc6\xde\x55\xf9\xb6\x67\x70\x51\x9c\x39\xde\x65\x6f\xf5\xc3\xab\xe1\x38\x31\x6b\x2b\xb3\x32\x67\x97\x0c\x9a\xae\x44\x2c\xb3\xf5\xbe\x8f\xd8\xc8\x5c\x7f\xb4\x65\x26\x93\x07\x92\xba\x3f\xc2\x64\x7b\x96\x09\x5e\x2b\x17\xd2\xd3\xd0\x05\xab\x28\x20\x08\xc0\xf3\x91\x3c\x4f\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xd3\xa2\x80\x46\x63\x2b\x48\x10\x7a\xc4\x05\x04\x74\x2c\x80\xe0\x3a\xe9\xd0\xd3\x74\xdf\x42\xa0\xfd\x17\x72\xc7\x7a\xea\x4f\xfc\x06\x14\xf0\xdf\x18\x2f\x32\x22\xb5\x8e\xd4\x61\x7b\xd5\xda\xf0\xc6\xb0\x98\x81\x93\xf9\xe4\x3e\x3c\xa3\xfa\x1e\x81\x59\xa1\xd1\xe9\xa9\x19\xaf\x4c\x49\xc1\x94\x86\xe6\x70\xe6\x13\xec\xe8\xbb\x8c\xf2\x50\x46\x17\x21\x75\xc3\xa3\xa7\x2d\x63\xb8\x03\x4f\xbd\x27\xbd\xaf\x04\xbc\x7d\x4f\xec\xcd\x83\x04\x0e\xc9\xf8\x31\x67\xf8\x56\xa6\xee\x13\x38\xa4\x58\xb8\xa0\x43\xd4\xd2\x11\xb9\xef\x27\x6f\x8f\xf7\xa9\x5e\x4b\xfb\xac\xda\x5f\xaa\xc3\x8a\x6f\xb9\xa3\xd8\xbb\xb7\x27\x3a\xa2\x30\xf4\xa8\x13\x0a\x67\xb3\xd1\x71\xab\xbe\x0f\x5a\x22\x34\x6e\x42\x90\x82\x6b\x51\xc6\xc9\xc4\x0b\x82\x36\x6d\x8b\x75\x07\x96\x9c\xbd\x3d\x7b\xf2\x39\xc5\x45\x2a\x59\xd0\xf5\x40\xe9\xa8\xbd\xb5\xee\x7f\x48\x52\x86\x02\x06\xd3\x20\xa4\xc1\xdf\xc1\x6d\x14\x5c\x68\xe1\x20\xf8\xce\x4e\xde\xc7\xe7\xcc\xb4\x1e\x7d\x4e\x04\xc1\xe0\xe0\xc7\xa0\x17\x9b\x10\xaa\x64\x29\x52\xa7\x9f\x57\x86\x90\xf7\x7b\x13\xbe\x91\x02\x84\x1c\xcc\x41\x0a\x84\xad\xe2\xd3\x8a\x11\xb7\x1c\xe6\xcd\xe2\xcd\xeb\x2f\xcb\x26\xef\xf7\x1a\xe2\x59\x8c\xdc\x54\x6c\x12\xcf\xc6\x93\x67\xe4\x0b\x6c\x44\xcf\xea\xbd\x53\xda\xea\xfa\x19\xdc\x57\x15\x80\x9f\xac\x32\xc6\xa2\x4a\xe1\x11\xf2\x12\x44\x1a\x2b\x0b\x36\xb2\x12\x5e\x8d\x2a\x03\x13\x97\xd6\x6e\xf5\xbb\xe5\x93\xce\x36\x1e\x62\x24\xda\x2e\x5d\x38\x4c\x4d\xee\xeb\x8e\x63\xde\xea\x22\xf7\x82\xbc\xc4\x37\xcf\x34\xc4\xa2\xbe\x7a\xf2\xf6\xba\x65\x5f\x7d\x2e\x82\x79\x94\xad\xa5\x5f\x7d\x2e\x28\xe8\xd0\xc5\x10\x0e\x06\x84\x8e\xf6\x2d\xd3\x8f\x83\x3f\xb3\x0d\xdd\x32\x88\x93\xe5\x19\x55\xbd\x99\x04\x0e\xae\x24\x77\xb8\x2a\x68\x76\xcb\xc4\x96\x2b\x29\xc0\x4f\xb5\xa5\x8a\x43\x4e\x11\xb4\x22\x64\xc2\xca\xa7\xbf\x7d\xf9\xe9\xe2\x23\xf8\x07\xc2\xd9\x6e\x98\x7b\xe0\x56\x5e\x6a\x88\x41\xd8\x5b\x41\x63\xa8\x7a\xe3\x86\xe6\xda\xb1\xa9\x7e\xfe\x76\x57\x80\xd7\xf9\xf5\xd8\x39\xe4\xa5\x29\x69\x7f\x36\x05\x3e\xec\x73\x92\x95\x9a\x6f\x9f\x7a\xfe\x87\x25\x9e\xea\x56\xfc\x0a\x02\x8f\x0b\xe9\xbe\xe4\x3d\xb4\xdb\xdd\x70\xf7\x4c\x1f\xc6\x82\x83\x59\x4f\x48\x33\xdc\xf5\xb4\xd3\xb8\x7c\xa6\xab\xda\x38\xcd\x54\x56\xa7\xb8\xba\x94\x8b\x5e\x2d\xa8\xaa\x0b\x99\x1e\x9a\xdd\x21\x3f\xeb\x34\x2a\x6c\xff\x5e\xf6\xec\x51\x60\x77\xfa\xf6\x05\xbb\x36\xff\x20\x13\x7a\x90\xfa\x7f\xd0\x4a\xdb\xbd\x47\x72\x48\xc2\xb2\xcb\xbe\xc8\x98\x32\x58\x9f\x54\xb9\x98\x31\x07\x91\x48\x41\x32\x29\x8b\x25\x4d\x1e\x0e\x77\x46\xcb\xc3\xea\x32\xd0\x72\x97\xae\x29\x17\xba\xce\x48\xba\xbe\x5d\x90\x1b\x09\x55\x6c\x50\xc3\x84\xfb\xa9\x4b\x0d\x3f\x98\xce\x8f\xd7\x33\x80\x6b\xff\xb0\x96\x5a\xf3\x02\xe2\xfb\x4b\xc1\x13\xcc\x74\xe9\xc4\x50\xd7\xad\x93\xc9\xf5\xf7\xe8\x91\x0a\x62\x48\xae\x9d\xe3\x0a\x42\x16\x5a\x73\x41\xfd\xbf\x41\x36\x50\xff\xb4\x73\x02\x1d\xb4\x90\xc9\xf5\x0f\x5d\xb5\x19\x0e\x86\xc7\xc4\xb7\x13\x8f\x2e\x64\xca\xee\x58\x06\xc7\x6e\x7f\x06\x71\xa5\x85\x03\x44\xde\x5a\xc2\x25\x14\xcd\x75\x47\xf0\x46\xa6\xbe\x60\x99\x4c\x31\x7a\x49\x27\x1b\x96\x96\x19\x78\x42\xba\xa7\xdf\x41\xfa\x05\xb5\x07\x3b\x88\x3a\x97\xee\xe8\xfc\x2e\x60\x8c\xa5\x2e\xf7\xc2\xc5\x44\x96\x22\x65\x2a\xa3\xd0\x4a\x1d\xb1\x9a\xba\xb1\x0e\x6f\x0b\x3b\x53\x4b\x77\x6b\x28\x98\x83\xb8\xaf\xea\x12\xcd\x2c\xa3\x67\x05\x92\x48\xca\x32\x66\x7c\x1a\xcf\x41\xac\x72\x3f\x3d\x16\x32\x7d\xef\xf2\x3f\x83\xeb\xba\xad\xdf\xab\x77\x5f\x93\x1f\xe8\x92\x65\x68\xbd\xbc\xb0\x4c\x8a\xe2\x52\x11\xed\x5d\xe2\x7e\x43\xc4\x77\xba\x26\x6d\x92\x57\x21\xd3\x83\xc9\x87\xd4\x33\x5a\x0f\xda\x75\x0b\xc4\x97\xab\x1e\xb8\x0e\xf7\x4a\xe5\x36\x96\x8a\xf9\x6a\xa5\x4b\xb2\x81\x23\xf1\xc0\x76\xce\x25\x9e\xd3\x82\x68\x23\xfb\xda\x1e\xa3\xcd\xb4\x2a\x53\x8d\x7c\x0c\xf3\x4c\x81\x8a\x96\xbb\xba\x67\xb8\x91\x32\x73\x3e\x36\xa9\x58\xaf\x8b\x4d\x31\xa3\x38\xdb\x32\x42\xd5\x92\x1b\x45\xd5\xae\xca\xef\x05\x87\xc2\xae\xa2\xa9\x7f\x94\x4c\xed\x40\x1e\x82\x40\x28\x10\xbc\x3a\x41\x5a\x9a\x53\x0c\x38\x72\x8a\x89\x84\xb9\x4c\xf9\x0a\x08\xd8\x11\xee\x41\x08\x60\xb7\x6f\xbf\xd4\x4c\xcd\xd7\x25\x4f\xd9\x79\x63\xe3\xba\xdc\x07\x41\xd9\x00\x2a\x76\x7c\xc9\xfd\x7e\x4f\x0b\x88\xa3\x80\xb7\xed\xf6\x22\xc5\xc3\x1e\xeb\x56\x97\x6b\x97\xd0\xd9\x39\xa4\x54\x6b\x2a\xf8\x2f\x88\xef\x84\x1a\xb6\x96\xca\xfe\xf3\xa5\x4e\x64\xe1\x76\x01\x78\xe3\xab\x06\x5a\xe9\x0e\xf5\xbb\x4e\x88\xda\xb1\x52\xf0\x53\x28\x56\x64\xee\x3a\xf2\xe5\x91\x33\x48\x1c\x05\xb8\xae\xa3\xf6\x50\x78\x46\xd4\xde\x21\xfe\x47\x6e\x5b\x3f\x53\x95\xca\x74\x65\xd7\xef\xb1\x1f\xe5\x22\xb6\x00\xc3\x75\x97\xf1\x14\x17\xb8\x96\x5b\xa6\xa0\x00\xb1\x5b\x6a\x8f\x12\xdf\xcc\x94\x79\x64\xcb\xd8\x7b\xab\x50\x5c\x42\x62\x79\x46\xb5\x1e\x9e\xac\x7b\x9b\x24\xf6\x75\x42\xb5\xe6\x6b\x51\x33\x3c\x7b\x07\xc5\x0e\xec\x36\xf5\x80\x88\xdb\xa1\xd2\x96\x8a\x9c\x15\x98\x7d\x2e\x58\x62\xb9\xab\xb6\x3f\x3a\x3b\x70\x8b\xc5\x5a\xdd\xc0\x74\x19\xc3\xee\x9d\xec\x89\x84\x83\xb2\x2c\xdb\x32\x81\x1a\x07\x48\x6a\x18\xbc\xd0\x80\x5c\x95\x7d\x46\xa0\x07\x30\xd9\x3f\x4a\xe0\x5d\x87\x73\xdb\x1f\x3f\x14\xa7\xd3\x1f\x9d\xd3\xdb\x49\xa3\x4b\x18\x68\xb7\x03\x80\x0e\x00\x98\x63\x0a\x05\xfc\x2d\x4d\xb9\x98\x8e\xdb\x91\xb7\x50\x7f\xcf\x8a\x67\x62\x48\xe3\x3a\x54\xd4\x0b\xef\x1c\xf9\xab\xf6\xa6\x08\x32\xfa\x50\x3f\x8a\x67\xc2\xec\xd8\xee\x13\x03\xb8\x1d\xdd\x77\xa2\xd9\x5d\xa2\x7b\x35\x47\x74\x9c\x08\xf6\x95\xe8\x1c\xe5\x2b\xf6\x9a\x38\xe6\x0e\x51\xcc\x30\xd1\x65\xb1\x6e\x9b\x4c\xa1\x8c\xad\x9b\xde\x9e\xbe\xb9\xa1\x10\x84\x05\xa6\x74\x10\x72\x57\xb2\x76\x27\x1f\xcc\x92\x6b\x72\xf6\xe6\x77\xaf\x37\x67\x33\x2c\x0d\xd2\x36\xc3\x2a\xb6\x2e\x33\xaa\xec\xae\x28\x8c\xce\x22\xff\xf6\x7f\xbf\x9e\xff\x8f\xff\xf7\xff\xf7\x32\xd7\xff\xa1\xff\x23\xff\x8f\xcd\xab\x7f\x3b\x80\xf9\x32\xe7\x59\xc6\x7d\xac\xa6\xff\xdf\x9c\x8b\xd2\x80\x15\xbd\x54\xfa\xc0\xe2\xd7\x7f\x6f\xc8\xd2\xb0\x5b\xc5\x56\xfc\x73\x18\x25\x76\xba\xf6\x5d\x2b\xe2\xad\xf8\xe7\x36\x56\x14\x5b\x5b\x05\x5c\x69\x4c\xe4\xda\x50\x91\x82\x48\xb1\xea\xf2\xf0\x7b\xbf\x6d\xa9\xd9\xaa\xcc\x66\x50\x4d\x06\x0c\x65\x57\x4e\x84\xfd\xf1\xe3\x0f\x18\xed\x65\x79\xe9\xe7\x1d\x46\x56\x3d\x2a\x0e\x1e\x9d\xce\xbc\x4c\x98\x99\x76\xae\x59\x3c\x3c\xb3\xca\xfc\x4f\x13\x7b\x31\xb5\xa0\x73\x4d\xb4\xb1\xd7\x16\x5a\x9c\x97\xe5\xe1\xce\xc1\x05\x86\xc6\x05\xf8\x9f\xc6\x5d\x00\x8a\x19\xa1\x8d\x22\x1c\x4d\xcc\x2c\xc8\xf7\xd2\x6e\x29\xb5\x87\xe8\x00\xac\x3d\xc6\xa5\x46\x67\x14\xf9\x37\x7b\x46\x12\x93\xe1\x3a\xff\x2d\x7a\xd3\x34\x4b\x14\x3b\xe4\x76\xed\xbb\x1e\xdf\x41\x07\xb9\xf7\xb9\x57\x3f\xa2\x86\xa9\xad\x9c\x64\x85\x25\x5d\xd0\x84\x11\xaa\x3b\x83\x90\x5a\x3b\x8d\x67\xca\x9b\xac\xf0\x34\xd4\x46\xd8\xda\x31\xd8\xfc\xe8\x00\x22\x5c\x9b\x58\xe8\xd3\x4d\x08\x4c\x96\x4d\x18\xe7\xcc\x24\xe7\x4d\x71\xe4\xdc\x2d\xfa\xfc\x4f\xf8\x1f\x73\x3b\xef\x7f\xdd\x47\x59\x8f\xeb\x30\xc0\xd9\xfb\x6c\x54\x03\x3d\x68\xf6\x71\xdd\xaa\x55\xb4\x91\x59\xaa\x09\x04\x22\x83\x71\xc4\xc3\x22\xd4\x18\xc5\x97\x40\xab\x5d\x7a\x59\x22\xf3\xbc\x19\x6f\x59\x55\xe0\x73\xc1\x0e\x69\x4f\x37\x8c\x8e\x72\x4a\x23\x84\x92\x55\x7f\xf1\xf0\xd6\x2a\x5f\x5c\xe0\x9d\x41\x33\xc8\xf1\x70\x37\x44\x46\xd6\xf6\xeb\x56\x5d\x44\x57\x28\xb0\x11\x5d\xd6\x79\x77\x40\x5c\x44\x21\xd3\x05\xb9\x93\x79\xe5\x17\xb0\x1b\xe2\xfa\x60\xb5\x0a\x4c\x1b\x09\xf1\xb6\x6b\x94\x2d\xe5\xa3\x05\xbb\xe1\x45\xb7\x06\xe5\x6e\x3c\x0f\x12\xec\x21\xf6\x93\x2a\x8e\xa4\x90\xe9\x5b\xf2\xff\x08\xf2\x06\xe9\x50\x3e\x82\x74\xfa\x97\xeb\xcb\xfe\xd2\x3e\x4b\x1c\xf9\xfb\x3b\x40\x17\xf9\x1d\x7e\xa9\x99\x59\xf3\x94\x2c\xb1\x1c\x87\x55\xc6\x5f\x0a\xf6\x88\xce\x70\x92\xb8\xfa\x14\x3d\x6e\xe7\x86\x37\xc4\x1b\x84\xab\x49\xba\x61\x5e\x91\xdf\xe3\x38\x05\x53\xae\x8a\x9f\x1d\xab\xdf\x45\xfa\xe1\xe3\x99\x8b\xb1\x52\x8f\x73\xf5\x38\x9f\xcf\xe7\x76\x9d\xbe\xd8\x75\x47\xd1\x6e\xab\xe3\xa3\xa2\xde\x1b\x83\x58\x61\x1b\x98\x6a\x3d\x15\x64\xb9\x62\xe7\x56\xb1\x78\xd1\xf1\xf5\x50\x39\xe1\x70\x44\x7d\xb8\xb8\xfd\x13\xca\xda\x87\xfb\x09\x8d\x2b\x68\xdf\x51\x52\xac\xbf\x06\xf4\x91\xd5\x9f\x03\xa9\xdd\xa3\xca\x55\x3a\x95\x98\x9a\x70\xb8\xc3\x09\x76\x2d\x50\xa8\xfe\x59\x4a\xd4\x9f\xbe\x38\xfd\x91\x65\xe9\xab\xe2\xf3\xbd\x87\x7e\x44\x41\xfa\xfd\xb2\xf3\x3d\xf6\xc1\x98\x52\xf4\x7d\xf5\xa5\xfb\x98\xf3\x71\x24\x3a\x50\x57\xf0\xc8\x8a\xaa\x61\xf7\x7c\xb0\xde\xfc\x13\x2a\xcd\x87\x99\xc4\xc8\x1a\xf3\x07\x35\x13\x7b\x94\xec\xa8\x3d\xeb\xdb\x9f\x6e\x98\xf1\x7b\x16\x5b\x1d\xf1\xab\xb0\x95\xe1\x7a\xf2\xe3\x2b\xc9\xb7\xe5\x94\xee\x8d\x7e\x4a\x11\x79\x3f\x83\x4e\xc0\x23\xcb\xc7\xff\xb3\x5d\x32\x43\xf1\x74\xc1\xe2\xf0\xc7\x95\x85\x1f\xaa\x7c\x34\x18\x03\x38\x18\x0e\x11\x2a\x02\x7f\x5c\xf9\xf7\xe7\x9f\x73\xa8\xd8\xfb\x71\x65\xde\x9f\x7f\xce\xa1\xa2\xee\xc7\x95\x73\x7f\xee\x39\x07\x4d\x98\x4d\x95\x0a\xe4\xdd\x61\xfe\x76\x51\xe9\xf5\xa0\x82\xe9\xfd\x06\x19\x98\x7d\xe7\x1b\x6d\x62\x95\xc0\xce\x99\xb7\x59\xcf\x0c\x14\x33\x67\x35\x3d\x28\x62\x7f\x66\xcf\x39\xcf\xa9\xda\x59\x61\xbb\x9f\x03\xb5\x18\xa6\x90\x7e\x8a\x5e\x52\xa1\xa9\x4b\xaf\xb2\xda\x43\x10\xb1\x81\x68\xe0\xe1\x4e\x25\x43\xe9\xba\xa1\xc8\x21\xbd\xd3\x89\xe9\x76\x1f\xb6\xb5\x7f\x7c\x0f\xb4\xfe\x86\xad\xa5\xb2\xab\xa4\x1e\x52\xe5\x92\xea\x95\x0b\x41\x19\x86\xd0\x03\xd0\xe0\x4a\x51\x17\x53\xf0\x30\x5e\xee\x27\x42\xf8\xfb\xa7\x3b\x2e\x0d\x83\x8a\xbc\x54\x9a\xd1\x52\x24\x07\x51\x18\x03\x58\xee\x58\x2c\x41\x93\xb0\x3d\x53\x0f\x4c\x09\x96\xd5\x05\x68\xdd\x0d\xdb\x27\x56\x0e\x87\x50\x87\x83\x5b\x3b\x8a\x27\xad\xd0\x50\x68\xc1\xee\x5c\x35\xb7\xde\xcf\x23\x82\xd9\x06\x6a\x85\xb5\xe3\xcf\x41\x78\x3a\xed\x0c\xc2\xc1\x74\x81\x40\xb9\x50\xf5\xaf\x81\x10\xba\xd0\x31\x18\xee\x27\x71\x74\x27\x89\xa3\x04\x2f\xdf\x43\xe2\x30\xb3\xe6\x4c\x47\x89\xae\xcf\xd6\x46\xe2\x84\x0d\x24\x86\x8e\x49\x7c\xd3\x88\xe7\x68\x17\x71\xfa\x46\x11\xc7\xb5\x88\x20\xcb\x40\xed\xd4\x67\x68\x0e\xf1\x0c\xed\x08\x62\x0a\xbc\x0f\xb2\x8c\x71\x4d\x20\x8e\x6b\xff\x40\x82\xcb\x18\xdd\xf8\xa1\x89\xcb\x5e\xa8\xe3\x70\x7c\x1a\x5c\x46\x35\x72\x38\xbe\x85\x03\x91\xfd\x9d\xe1\x8e\x6a\xde\x50\x99\x1a\x7a\xc1\x8e\x68\xdb\x10\xe1\x49\xa8\x9f\xe3\x38\x67\x50\xc2\x3e\x86\x7b\x86\x93\x70\xc2\x4d\x1a\x22\xdb\x30\x3c\xe7\xe9\x3d\xc6\x8b\xed\x42\x97\x2e\x92\x44\x96\x62\x38\x26\xea\xee\xe0\xf5\xae\xf3\xdd\x7e\xab\x2b\x36\xad\xc4\x00\x01\x4f\xd4\xb7\x4a\xe6\xcc\x6c\x58\xa9\x3b\xe3\x60\xfa\xbd\x97\x9b\x70\x04\xe9\xdd\x5f\x2f\xec\x9c\x5a\x6e\xc7\xbd\x50\x77\x27\x64\xa6\xac\xc8\xe4\xae\x99\xff\x72\xe8\xf9\x93\x8d\x6b\x59\xae\xc8\xbf\x59\x2e\xc2\xa5\xf8\xb7\x05\xb9\xc3\x3c\x11\x90\x45\x88\xa1\x6b\xf0\x03\x23\x2a\xfe\x7a\xd1\x88\x94\x38\x80\x89\xc3\x6a\x8c\x94\xc8\x4b\x03\xcc\xe8\x20\x18\xff\x13\x0e\x04\xd4\x76\x4f\xd7\x58\x0a\x71\x2d\x3a\x63\x3c\xf9\x0a\xc6\x44\x07\x52\x3c\x22\x8d\x54\x74\x3d\xb0\xf7\xf8\x8e\xdf\x70\x90\xdb\x51\xb1\x93\x2b\xc8\xb8\x73\x40\x5a\x52\x51\xd7\xbd\x7a\x10\xea\xce\x85\x36\x54\x24\x6c\x54\x00\x14\xd4\x06\xe8\xc9\xc4\x68\xc7\xd7\x5c\xb9\x37\x31\x41\xed\xce\xc5\xbd\xca\xc6\x14\xf7\x88\xb0\xf3\xf8\xdd\x19\x6a\xd8\xaa\xcc\xee\x98\xd1\xfb\x6d\x43\x7c\x31\xe4\x22\xa3\x09\x6b\x3b\xb2\x20\x59\xf8\x9e\xe5\x45\x46\x4d\x4f\x72\xcc\xc8\x88\x17\x87\xe6\x73\x97\x4a\x7b\xfe\x1d\x60\x22\xe5\xaa\x2b\xb2\x65\x48\xfa\xcb\x59\xca\xcb\xde\xf6\xd5\x6d\x3c\xfe\x04\x3e\x15\xd7\x7b\xdc\x6f\x36\x02\xa8\x92\xa8\x68\xf2\x80\xb9\x0e\x75\xa6\x4b\x2f\xcb\xdb\x6b\x3f\xfe\xe2\x85\xcf\x5e\x61\x54\x78\x4b\x38\xf2\x16\x99\xb2\xb3\x46\xca\x0b\x8e\xd9\x0f\xf8\x7d\x5d\x8f\x0d\x2b\x48\xb8\x28\xda\x97\x0e\xc0\x2b\x22\x15\x79\xcf\x72\xc8\xc3\x79\x1a\xf6\x83\xc8\x27\x31\x52\x82\xe6\xbf\x30\x88\xae\x8a\xdb\x84\x7b\x28\xce\x52\xc7\x84\x65\x90\xd2\xe2\x77\xc3\x6b\x7c\xce\x6a\x1a\xb8\xcd\xfc\xa1\xf0\xfe\x56\xf4\x40\xf3\x5f\x5c\xd5\x16\x94\xb1\xb4\x44\x35\x2b\x01\xbe\x64\x61\xe6\x80\xb5\x80\x80\x00\x3b\x03\xc0\x7c\x6c\x60\xe9\x8b\x8f\xe0\xb7\x9e\x62\xaa\x09\x3c\xf6\x46\x81\x93\xda\x55\x9e\xb7\xca\xbe\x2d\x99\x79\x64\x0c\xef\x8e\x3b\x8f\xbf\xc6\x65\x6f\xb5\x90\xa0\xe8\x0d\x21\x2b\x65\x6e\x11\xe8\x66\xe5\x22\x32\xed\xd9\x6d\x17\xb3\xa9\x43\x0b\xee\x03\xe2\x46\x83\x8e\x05\xcf\xda\x84\xec\x5d\x91\x15\x62\x4b\xe1\xe2\xe0\x90\xfa\x02\xaa\x4c\x74\x6c\xfb\x89\xc8\x31\xa8\xdc\x77\x30\xb4\x08\xc3\xe2\xed\xa7\x77\x95\x20\xdf\xcb\x71\xdb\xdc\xf5\x08\x3e\x46\x0b\xee\x6e\xc9\xb8\x63\x74\x71\x7b\xed\x6f\x55\x6f\x80\x82\xcb\x1d\x7f\x63\x29\x16\x8f\xa6\x28\xd1\x04\x8e\x91\x62\x90\xa7\xe0\xe2\x1b\x91\xf5\x3b\xfc\x2d\x40\x0e\xb2\x24\xe4\x2b\xc1\x49\xb1\x65\xca\x10\xc5\x12\xb9\x16\xfc\x97\x40\x15\x64\x1c\xbd\x92\xd3\x2d\xaa\x35\xd4\x4a\xc0\xc4\x0c\x38\x05\xb3\x4a\xfa\x54\xcc\x8e\x47\x4a\x11\x01\x19\x13\x08\x3a\xd9\xde\x9a\x9b\xc5\xc3\xbf\x00\x79\xb9\x4c\x33\xb3\x3b\x87\xe8\x6c\xbe\x2c\x8d\x54\xfa\x3c\xb5\x42\xef\xb9\xe6\xeb\x39\x55\xc9\x86\x1b\x06\xd9\x27\xe7\xb4\xe0\x73\x58\x9c\xc0\x4c\xa0\x3c\xfd\xae\x8a\xbc\x3c\x9a\x2f\x3e\xf0\xfe\x66\x3e\xed\xbd\xfc\x1b\x47\x05\x90\x7a\x3e\x8f\x4c\xa2\xda\x1a\x9f\x39\xfb\xf1\xea\xee\xbe\x8a\x9d\x0d\xa8\x4e\x56\x97\x84\x1d\xac\x41\xe8\x7a\x33\x2d\xc2\xb9\x58\xf9\x92\x3b\x55\xd1\x00\x26\xd2\x70\x67\xbd\x46\x79\x39\x5d\x2e\x81\xdb\x54\x71\x80\x46\x76\xa5\x5c\x92\x6b\x41\xde\xd1\x9c\x65\xef\x68\x28\xe3\xfc\x99\xb7\x12\xa2\xa8\xe6\x76\x3b\x8e\xdf\xcc\xbc\x27\xdf\xab\x7b\x43\xef\x0c\x15\x29\x55\x3e\x47\xcd\x5e\xfd\x75\x42\xd1\x33\xaf\xd6\x0f\x14\x5e\x6a\x20\x83\x58\xc7\x5a\xd0\xce\xc0\x68\xd6\xe4\x3e\x29\xd3\x70\x79\x27\x1b\xaa\x68\x62\x98\x82\x02\xc7\x78\x29\xf5\x1f\x68\x8c\xfa\x72\xa4\xe4\x2b\x45\x16\x32\x25\xb4\x34\x1b\xa9\x8e\x96\x70\xea\xb2\x37\x73\x7f\xbb\xd4\x3f\xe1\x2f\x89\xbd\x0b\x7a\xa9\x22\xa6\xc6\x09\x16\xef\x7d\x2f\xd3\x70\xdd\xe5\x3d\xe6\x5d\x7f\xe4\x6f\xea\x36\x02\x5d\x49\xe0\xdc\xbe\x11\x80\xda\x0a\x9b\x73\x4c\x7a\x43\xb7\xe3\x83\xd0\x03\x28\xc3\xa9\xcc\x61\x2a\xf3\x37\xa1\xba\xcd\x11\xed\x5c\xc6\x34\xdc\x1e\xe8\xb6\x61\x69\x1c\x55\xa1\x71\xe5\x3f\xd0\x0a\x52\x55\x08\xb3\x08\x74\x7a\x95\xa0\x85\xde\x48\x73\x59\x01\x0e\x2e\xa5\xdd\x6d\x6f\x0d\xc1\x54\x20\x20\xf8\xc6\x7b\x90\xb1\x56\x2a\xc5\x84\xc9\x76\x7b\x63\x04\x21\x3b\xfd\x14\x4c\xab\xb5\xd3\x0b\xcc\x56\xc8\xfa\x5d\x49\x4d\x86\x2d\x10\xe1\xbe\x0f\x57\xab\x4a\xa8\xf0\x90\xf6\x26\xd2\x04\x0b\x79\x14\xa0\xfb\x62\xac\x66\x78\xf9\x44\xb0\x47\x4f\x7a\x76\xa9\x00\xc8\x6b\xce\x8a\x61\x06\x67\x65\x73\x70\xef\x0d\x34\x59\xf1\x71\xd8\x8d\x62\xbc\xad\x45\xd6\x31\x67\xdd\xab\x09\x42\x6f\xad\xb4\x19\x6a\xea\x2e\x2d\x1f\xa0\xea\xc5\x6b\x57\x59\x30\x08\xb3\x5e\xaf\xdb\x25\xac\x77\x09\x19\x60\x70\xfb\x01\xa0\xd2\x92\xc8\x8c\x3c\x32\xab\x5f\x8b\xa1\xfe\x44\x7e\x69\xb9\x3d\xc2\x8d\x49\xfb\x68\x60\x37\xbd\x25\xdb\xd0\x2d\x97\x2a\xa6\x25\x71\x13\x85\xf6\xfa\xc7\xe0\xe1\x50\xa5\x8b\xd8\x5e\x47\xb4\xe0\xbd\x11\xa9\xcd\xa7\x2d\x53\xdf\x5e\x63\xdc\xb0\xa3\x74\x8c\x9a\xf6\xf9\x89\x83\x02\x8e\x7f\x96\xcc\x0a\x46\x55\x61\x12\x74\x60\x35\x61\xb7\xcb\x53\x0c\x62\x89\xb4\x42\x7b\x40\x28\xdb\x2b\xae\x9e\xd8\x2d\xb9\xb8\xbd\xc6\x19\x43\x76\xc3\x20\x44\x2a\x76\xae\xea\x92\xd9\x70\x95\xce\x0b\x0a\x9e\x51\xbb\x97\xb3\xd6\x6c\xab\xb4\xa7\x01\x90\xd1\x25\xe8\x43\x02\xa8\x7f\x5a\xfb\xe2\xe5\x50\xa8\x75\xe9\xcc\x24\x55\x9e\xf5\x3e\xb6\x4f\x35\xcb\x98\x4e\x59\x87\x9e\xee\x3d\xa3\xed\x33\xcf\x32\xa6\x33\xd5\x1c\xf0\x1d\x7c\x61\xa0\x6d\x55\x54\x33\xaa\xde\xe4\xcd\xe6\xb3\x9f\x9e\x57\xa7\x70\x7a\x75\xa0\x65\x93\x08\xa7\xe3\x55\xd3\x7b\x76\x51\x63\x50\xe7\x22\x23\x38\x53\x7f\x7e\x69\xf3\x89\xcf\x88\x6c\xa1\x22\xbe\xa9\xd9\x31\x39\xa8\x83\xe3\x1f\xe4\x51\x7e\xdd\x7c\xd4\x43\xd4\x44\x74\x54\x0b\xe5\xa9\x36\x9f\x2f\xbc\x43\x51\xb9\xac\x83\xc3\x77\xe5\xba\x0e\xe6\xb5\x0e\x42\x0d\xe5\xbd\x76\xe6\xb8\x0e\x42\x3c\x79\x0e\x6c\xf3\xf9\x8a\xf9\xb0\xcd\x27\x92\x22\xa3\x5e\xd3\x3d\x75\x78\x9a\xcf\x7e\x5c\x22\xc4\x56\x42\xe1\x10\x22\xb7\x4c\x35\x2b\x88\xfa\xc6\x4d\x81\xba\xc6\xf8\x2c\xb9\x48\xb9\x08\xb6\xbd\x8f\xe5\x8b\x90\x72\x7b\x55\x65\xd9\x8e\xeb\xbf\xb9\xff\x71\x3b\xa5\x12\x97\xea\x71\x34\x48\x1f\xee\x3c\xe4\x68\x9e\xba\xdf\xb0\xd6\x2f\xe0\x24\xbc\xb8\xb9\x1c\x16\x88\xa2\xda\x88\xf6\xec\x8b\x9f\x6c\x73\x68\x67\x8a\x8b\x5d\x06\x69\x45\x77\x6b\x67\xa0\x9c\x41\x3c\xe0\x0e\x6d\x9c\x54\xb8\x06\xef\x2e\x14\x3c\x02\xa6\x62\x99\xcb\x03\x62\x50\x1b\xa7\xae\x9d\x32\x84\x8e\x71\x8d\x4a\x89\x85\x1e\xf3\xda\x1e\x02\xed\x9c\x7c\x15\x6b\xc0\xa4\xfd\xa1\xf2\x14\x8c\x40\x1e\x01\x2d\xc2\x07\x1d\x0f\x2f\x8e\x8c\xe3\xee\xf6\xf1\xb8\x3f\x62\x99\xd5\xb6\x35\x44\x27\xd8\xd8\x33\x8d\x5b\x64\x4f\x41\x5f\xea\x65\xc7\xc4\x25\x50\x16\x9c\x16\x6f\xc8\xfe\x44\x33\x9e\x56\x03\x21\xdd\x5f\x8b\xa1\x7e\xe2\xfe\xb9\x91\xe6\x5a\xcc\xc8\xd5\x67\xee\x4b\x73\x5c\x4a\xa6\x6f\xa4\x81\x5f\x9e\x05\x9d\x38\xf1\x23\x90\xe9\x6a\xff\x60\xf5\x27\xb0\xee\x34\x2a\x04\xc5\x12\x37\x3e\xce\x36\x50\x6d\x0f\xd7\x56\xdb\x96\xca\xe3\xa3\x0a\x74\xd0\x83\x4d\x5b\x9b\x8f\xd7\xf7\x84\x14\x73\xf0\x44\x2d\xba\x46\x42\x64\x47\x82\x94\xaa\xb5\x23\x87\x53\xab\x06\xc5\x01\x23\xc1\x82\x2d\x0b\xbf\x07\xdd\x11\x3c\xf7\x29\x49\x4b\x85\x0d\xeb\xb4\x51\xd4\xb0\x35\x4f\x48\xce\x54\x20\x22\xaa\xfd\x14\x96\xbf\xc7\x4d\x21\x92\xeb\xe2\x33\x92\xc2\x62\xfb\xed\xe2\x13\xdb\x37\x18\x74\x34\x36\x0c\x6f\x5e\x6d\x76\xa4\x98\x19\x21\xed\xc6\xaf\x08\xae\xd8\x1f\x7a\xab\x75\x35\x9f\x2f\x2b\x1a\x37\x26\x86\x37\x64\x8e\x15\xbe\xfe\x8f\xbd\xe6\x80\xa0\xff\x93\x14\x94\x0f\x35\xfd\xb6\xcf\x85\x2f\x1a\xd4\xfc\xd6\xd9\x58\x9a\xc3\xd8\x11\xb8\x26\x76\x7f\xb7\x34\x63\x11\x82\x37\x0a\xac\xcc\x75\x59\x94\xab\x03\x89\x65\x46\x1e\x37\x52\xe3\x9d\x0a\xa6\xe0\x41\x90\x5c\x93\x17\x0f\x6c\xf7\x62\x76\xc0\x07\x5e\x5c\x8b\x17\x75\x6d\x8d\x51\xec\xa6\x92\x16\xc0\xca\xfb\x02\xbe\x7d\xf1\x14\x21\xe8\xa4\x52\x2e\xaa\xe8\xbd\x85\xbb\x9a\xcf\x5e\xff\xbc\x66\x10\x5d\x03\x4a\x1d\xd7\xe1\x53\x36\x32\xca\x03\x01\x30\xe4\xf8\xa8\xa2\x0e\xbb\x02\x94\x14\x0b\xfb\x2e\xa2\x0e\x85\x6f\x17\x90\xc6\x63\xa4\xfe\xa4\x72\x94\x3d\x36\xa3\x90\x9c\x41\xa5\x61\xfe\x0b\xeb\x01\x4d\xec\xd5\x29\x17\xdf\x57\xed\x06\xa0\x63\x53\x8e\x89\x05\x8f\xae\x7a\x7b\xd8\xd9\x20\x92\xac\x4c\x31\xfa\x0b\xc0\x82\x22\x38\xae\xa3\xc8\x68\x14\x8e\x22\xaa\x4f\xd5\x27\x5e\xe0\x74\xda\x50\x6d\xe6\x1b\xca\x56\xb3\xcf\xed\x5e\x13\x0c\x08\xf5\x42\xcf\x3a\x74\x3d\x1b\xa0\xc7\x88\xd5\x0d\x7b\x56\xa1\x9d\x51\xb4\x0b\xd9\x94\x07\x16\x3b\xe7\x4f\x82\x63\xa1\x72\x54\x91\x11\x6a\xef\xd4\xf7\x3a\x80\x78\x8a\x73\x24\xf4\xd1\xd7\x9c\xff\x35\x79\x59\x5d\x15\xa4\x63\x9c\xac\x35\xd1\x30\x08\x0c\xda\xd0\xee\x50\x94\x7f\x32\x67\x6b\x42\x0b\x9a\xf0\xbe\x7e\x4e\xf8\x8c\x97\x46\x22\x27\xd8\xce\x14\x6e\x1f\x08\xb7\x95\xb5\x91\xcd\x5d\x3e\x58\x30\x78\x37\x24\xe2\x6c\x23\x5b\x3e\x0c\x5c\x98\x89\x14\xb8\xf6\x78\xea\x7c\xe7\x4e\xf2\x3b\xff\xa9\x9d\x79\xdf\x31\x0d\xae\x01\x12\xc3\xfc\x6a\x3b\x40\x40\xc0\x3f\xb2\x4b\xcd\x7f\x61\x20\xac\xf4\xe7\x33\x11\x47\xef\xf5\xbc\xbc\x8f\xd3\x95\x68\x3e\xfb\x08\x60\xee\xb0\xbb\x63\xb0\x7f\x4a\x04\x8d\xb6\x6b\x80\x76\xf5\x29\xaa\x27\x82\x67\x38\xd3\x24\x65\xf0\xbf\x43\xd2\xf1\x52\x96\x06\x78\x2e\xdc\x91\xc5\x36\xd4\x69\x7b\x8c\xd1\x24\xa3\xda\xdc\x2a\xb9\x64\xf7\x7c\xd8\x75\xb5\x9f\x9c\x4f\xb5\xc1\x86\x9b\x8f\xae\x97\x70\xd5\x1a\x0e\x57\x39\x2c\x3c\xfb\x4c\xdf\x94\x1a\x36\xef\xad\xd7\xd2\x7c\x46\x48\xfc\x76\x6d\xf7\x8a\x0a\x0d\x93\x79\xd2\x02\x5b\xcb\x22\xa6\x02\x1a\x61\x39\x26\x18\x95\x26\x05\xf3\x2d\x00\x41\xae\x07\xbb\xf4\x57\x46\x90\xeb\xf0\x37\x12\x2b\x7f\x2d\x73\x2a\xe6\x8a\xd1\x14\x02\x91\x7d\x9b\x40\x8e\xe5\x7e\xa0\xb1\x42\x14\x4d\x93\x8a\xae\xa1\x6b\x61\x8d\xd4\x61\xac\x8c\x58\xa3\x62\x54\x87\x1b\x19\x75\x2c\xf1\x47\xc1\xff\x81\xb5\x86\xb8\x6e\xb4\x24\xa1\xf6\xbf\x95\x99\x91\x9c\x26\x1b\x2e\x62\x0c\x11\xc0\xcd\x34\x84\xd0\x59\x64\x39\xfb\x10\xd8\x16\xd7\x7c\xeb\x6c\xa2\x38\xc7\x41\xc3\x39\x3e\x15\x19\x9e\xe9\x03\xc4\x59\xfe\xc9\x8d\x8b\xe0\xd0\xe4\x45\x8b\xbd\x75\x15\xf1\xda\x7f\xb0\x00\xb9\x8b\x94\x66\x71\xbc\x38\xca\x00\x0c\xdc\xfa\xa4\x1b\x1b\x16\x40\x8f\x02\x19\x2a\x97\x51\x3f\x23\xd8\xbc\x2b\xab\x11\x73\x10\xb0\x14\x54\x9d\xd0\x14\x06\xbc\xb0\x90\x4f\xb7\xf4\x38\xab\xd3\x9c\x0c\x88\xe7\xf8\x92\x19\x9a\xda\x28\xf5\x3e\x2c\xcb\x15\x1b\xaa\xe3\xb5\xaf\x5b\xfb\x76\x9f\x1a\x02\xa0\x7a\x31\xff\xbc\xea\xd4\x31\xc9\x82\x86\xae\xc3\x95\x5d\xe9\xfa\x8b\xa4\xdb\xf9\xc8\x7d\xab\x62\x63\x1a\x1c\xe1\x2b\x18\x7d\x64\xda\x9b\x91\x19\x53\xdd\xad\x1c\x0e\x3a\x6c\xb4\x4b\x07\x14\x32\x3d\xd3\xcd\xef\x23\xcb\x87\x1e\xa4\xfb\x16\x32\x45\x9e\x7f\x5f\xc1\x02\xbb\x01\x76\x38\xc7\x08\x40\xfc\x0b\x04\xaf\x75\xd1\xa5\xc5\xaf\xf1\x8d\x1c\x0c\xf6\x45\xdf\x30\x62\x14\x74\x72\xff\x53\x65\x23\x9c\xb1\xd5\x8a\x25\xe6\x5f\x1b\xcd\xa4\xe0\xfd\x6e\x1a\xaa\x2c\x75\x7f\xf2\xff\x75\x50\x22\x75\x48\xea\xc3\xf1\x22\x4a\x81\x5c\xc1\x8b\xfe\x3e\xf7\xf3\x87\x65\x21\x0c\xe8\x17\x09\xc6\x75\xcc\x1b\xea\xa1\x79\xbc\x46\xb0\x2a\x32\xcd\xb2\x16\x08\xed\xfb\xe5\xd7\x1b\xe9\xa2\x3e\x9c\xe9\xb1\x07\x26\x55\x8c\xdc\xc8\x3b\xd7\xbb\x65\x46\x6e\xc1\x6c\x52\xff\x02\x06\xcc\x1b\x79\xf5\x99\x25\x65\x5f\x86\xdf\xc0\x71\xed\x75\x21\xb6\xc3\xcb\x6a\x97\x21\xae\xab\xe5\x32\xac\x49\xd1\xbb\x03\xfb\xf8\x82\x74\x38\xec\xc1\xd6\x03\xdb\xe9\xca\x6d\xe3\xdc\x94\xe0\x5a\x99\x0d\xd9\xf5\xbd\x23\x06\xfd\x3b\xff\xd3\xb7\x24\xce\x97\x75\x9f\x6c\x97\xd8\x57\x8f\xe9\xad\xbe\xbd\xa1\x5f\xf6\x25\x98\xd2\x31\x88\x0d\x7b\x2e\x5b\xd8\xfd\x10\xe9\xa9\x6c\xf1\xa5\x3e\x16\xdd\xe5\x93\x6c\xb8\x18\xaf\xfe\x51\xd2\xac\x9d\x8d\xef\x7e\x0a\xba\xc6\x5a\xa6\x7c\xe8\x26\xc1\xb3\x34\xa1\x0a\xb3\xfd\x5c\x4e\x90\x6f\x4d\x85\x29\x00\x09\xc4\xcb\x22\xfb\x08\x20\x18\x76\xde\x15\xbd\x2e\xa8\x32\x3c\x81\x62\xe2\xae\x61\x48\x8f\x53\x6d\x28\x95\xac\x22\xc8\x3b\xac\x2b\x1e\xb1\x09\xf7\xfb\xdf\xec\xdf\x9c\x05\x53\x5c\xa6\x60\xa5\x70\x3a\x52\x2f\x95\x57\xc7\xe1\xa5\x4b\xc6\x73\xd4\x29\x57\x9e\xa7\x54\x87\xb6\x15\xb2\xd3\x9f\xed\x55\x15\x00\x70\x97\xce\xab\x06\x67\xae\x4e\xe5\x82\xfc\x79\xe7\xa3\x8a\x20\xc2\x08\x03\x69\x7b\x40\x42\x19\xdd\x76\xd6\x2b\x42\x6c\x1c\xf3\x95\x54\x6c\xcb\x14\x79\x99\x4a\x08\xc9\x65\x5b\x9e\xf4\x37\x62\xfc\xbf\x98\x92\x40\x64\x82\xad\xa9\xe1\xdb\xca\xb1\xe2\xed\x10\xc6\xc7\x69\x6b\xf2\x9a\xbc\x04\x60\x84\xe7\x39\x4b\x39\x35\x2c\xdb\xf5\x15\x56\x71\xa6\xf3\x50\x57\xde\xa7\xd7\xd0\x0a\x14\x4c\xea\x28\x96\xd4\x62\x86\x28\x27\xec\x71\xc2\xea\x3a\xec\x0d\x8c\xe8\x75\x4f\xb7\x4a\x5a\x56\xea\x98\x67\x84\x03\xcd\x44\xff\xdd\xd2\x1a\xad\x8a\xf2\xe3\x19\x39\xe2\x14\x1d\xd1\x10\x6f\xdb\x9d\x05\xd9\x46\x9f\x93\x9f\xd0\x17\x02\x5d\x54\x1a\x6b\xec\x6b\x4e\xd6\x31\xc7\x50\x03\xe8\xbe\xee\xca\x2e\xd8\x52\x93\x56\xa4\x1a\xf0\x9e\xca\x02\xda\x7a\xff\x00\x2b\x6e\xe6\xae\xa1\x7f\x23\x73\xb4\x51\x93\x60\xd1\x1e\xb2\x8e\x4b\xef\xac\xc9\x8d\x75\x3c\x99\x70\x85\xe4\x30\xde\xbc\x05\xc0\x79\x57\x69\xa7\x68\x3b\xeb\x8e\x4a\xb2\x5c\x7f\xcd\x04\x9c\x67\x4c\x6d\xb0\x5a\x69\x99\x61\xfd\x7c\xb4\x62\x43\x0e\x98\x6f\xbd\x74\x84\x08\x79\x44\xdb\xea\xce\x5c\xb2\x40\xdd\xbc\xb0\x8c\x37\xd0\xa4\xfa\xf8\xf6\xd4\xa1\xf6\x60\xe4\xd8\xc6\xd4\x03\x77\x56\x5c\x33\xea\x23\xdb\x50\x37\xfa\xd0\xf5\x5d\x30\x23\x1a\x50\x1f\x34\x99\x0e\xdd\x30\xc3\xad\xa7\xc7\xb4\x97\x1e\x40\x62\x7f\x46\xc2\x89\x9a\x49\x0f\x8c\x1f\x6e\x20\xfd\x94\xd6\xd1\xae\x3d\x74\x0f\xa6\x8f\x6d\x1a\x3d\xd4\x2e\x3a\xd8\x28\xfa\x59\x5a\x44\x9f\xb6\x39\xf4\xc0\x76\x0d\x36\x84\x3e\xb2\x15\xf4\x93\xd7\x7a\xd0\x04\x3a\xd0\xe8\xb9\x0f\x78\xb8\xfd\x73\x44\x8b\xe7\x1e\xc0\x9d\x8d\x9f\x23\x9b\x3b\xf7\x80\xec\x6a\xf9\x3c\xd4\xd6\xf9\xe8\xf6\xbf\xfd\x4d\x9c\x4f\xd7\x1a\xd8\x39\x85\x23\xe4\x92\x28\x91\xc4\xc7\x9d\xa3\xf4\x71\x28\x94\xc4\x48\x23\xfb\x82\x48\x53\xf0\xe8\x32\x80\x21\xb7\xaf\x22\xde\x41\xaf\xfb\x62\x42\x45\x5b\x13\xc6\x2a\x89\xde\x0e\xef\x6a\xa2\x34\xbb\x87\x76\x10\x08\xba\xe3\x5d\x4a\x7a\xb3\x38\xaf\x17\xa7\x0a\xd9\x61\xa0\x0f\xcb\x1b\xf4\x51\x5f\x65\x54\x1b\x9e\xfc\x39\x93\xc9\x83\x5d\x71\xcc\x6d\x73\x76\xf1\xd3\xdd\xc1\x77\xad\x15\x0a\x72\xf1\xd3\x1d\xb9\xe4\xfa\x61\x28\x85\xd2\x77\x40\x6b\xda\xe8\x28\x79\xc0\x06\x11\x67\x67\x1a\xaf\x6f\xe7\xb0\xf1\x37\xb7\xb0\x07\x5d\xea\xde\xbb\xdf\x99\x15\xa0\xd0\xcc\x13\x4b\x12\xd1\x47\xcd\x70\xa9\x4b\xbb\x54\x48\x25\xee\x8e\x85\x18\x76\xda\xae\xf4\x7d\xd0\x43\xd1\x46\x72\x23\x90\xca\x47\x68\x35\x78\x33\xe0\x6d\x27\x4b\xf2\x48\x83\xa1\x88\x46\x22\x7f\x58\x90\x7b\x5e\xbc\x25\x57\x8d\xbe\x19\x58\x8b\xba\x3d\x08\xd7\x75\x9a\x77\x00\xaa\x53\x60\x61\x6f\x50\xdd\x83\xd6\x9d\xa8\xcf\x92\x2b\x6c\xb2\xa5\xdf\x92\x17\xec\xb3\xf9\xc3\x8b\x19\x79\xf1\x79\xa5\xed\xff\x08\xb3\xd2\x2f\x42\xb6\xf8\xeb\xbc\x4a\x02\x82\xba\x20\x2e\x6f\x7b\xc9\x1c\xa8\xc3\x62\x89\xe1\x7e\xa8\xf8\x9c\x6a\xe3\x03\x43\xdc\x7f\xb8\xfc\xf0\x16\x84\xd4\x54\xa2\x3f\x1d\x12\xaf\x09\x53\x4a\xaa\x4a\xe5\x69\xa0\x1b\x2e\xd7\x44\xe6\x85\x92\x39\xd7\x03\x61\x31\x60\x5d\x86\x23\xd0\x1f\x87\x13\xe1\xc6\x00\x73\x54\xbf\x2c\x4e\x0e\x0b\x64\xd9\x53\xe4\x3f\x22\x6d\xe9\xa0\x45\x81\xe1\x44\x72\x47\x81\xd7\x2b\x9f\x5e\x36\xf3\x55\xef\x7c\x9d\x27\x4f\xa6\x96\xb2\x1c\x7c\xcb\x24\x43\xa4\x52\x53\xd9\xf7\xd2\xf3\x75\x72\x9e\xb2\xed\xb9\x4e\xe9\x9b\x19\x4c\x0d\x09\xc5\xb5\x96\xf2\xeb\x08\xc0\xa4\x9a\xbc\x78\xf3\xa2\xaa\x41\x98\xed\x66\xcd\x15\xd7\x98\x58\x49\x55\x0d\x15\x76\x10\xbe\x78\xfd\x82\xbc\x94\x0a\x66\x93\x50\x41\x32\x46\xb7\xcc\xd7\x12\xc0\xca\xd4\x60\x07\x79\xb5\xe8\xdf\xd9\x50\x6b\xd5\xfa\x19\xb2\x07\x91\x41\x71\x9e\x74\x56\x55\xb1\xf8\x7b\x61\xe5\xf8\x17\x20\x7b\x4b\x95\xf8\x5e\xc7\xc8\x42\x3e\x3a\x98\x01\x24\x54\x4b\xe5\xa2\x6d\x09\xb0\x42\x16\x80\xee\x25\x8e\x00\x54\xae\xc9\x0b\x50\x05\x5e\x7c\x41\x2e\x4f\x22\x94\x0c\x52\x09\x4c\xd7\x97\xb1\x98\xc6\x90\x05\x72\x7d\xe9\xf9\x7c\xc3\x61\x9f\x36\xef\xd1\xbe\x66\x01\xf8\xd8\x6b\xf7\xe5\x45\x4e\x7f\x91\x82\x5c\xfd\xf9\xce\x4d\xe3\xd5\x57\x41\xd0\x13\x8a\xa9\x7b\xec\x05\x04\xe5\x5e\x67\x2c\xfd\xa5\x54\xcc\x8a\x1e\x11\x92\xcc\x85\x7f\x77\x5f\x7a\xb1\xbf\x93\x4b\x6a\x28\x0a\x31\x2e\x1b\xba\x0f\xf3\xd5\x5d\x68\xcf\xc5\x12\x8a\x35\xb8\x62\xad\xfd\x92\x19\x89\x12\x19\x12\xe0\xfa\xeb\x70\x9c\x77\x9b\x92\xfe\x6a\x27\xf2\x0e\xbf\x83\x80\xd2\xb7\xe4\x46\x0a\x36\x83\x83\x4a\xec\x49\x75\xff\xf9\x93\x55\xc8\x03\x6c\x27\xe2\x42\xb1\x94\x19\x0e\xa0\x3e\xf0\xd1\x36\xc3\xf2\xa1\xa2\x08\x50\xb7\xbb\x5a\x96\x99\x5c\xfa\x90\xff\xa7\xce\xeb\xc7\x8f\xd7\x23\xa6\xf5\xe3\xc7\xeb\xe7\x9d\xd2\x28\xe1\x6f\x5f\xf6\xab\xa5\xb8\xaa\x1c\x67\x43\x96\x08\x49\x0e\xf6\xeb\xba\x70\xcf\x90\xdc\xb6\xf0\x12\x5b\xe8\x46\x6b\xc9\x72\xa3\x25\xb6\xa7\xe0\x30\x5c\x45\x64\xaf\x50\xad\x6f\x56\xee\x5c\x36\x77\x1b\x6a\x19\x0e\xc9\xcb\xcc\x80\x2f\x1f\x36\xd6\xee\x74\xe8\xfa\x2e\x98\xaa\xea\x81\x52\x57\x82\x99\x5c\x32\x74\xad\xa7\x6f\x7d\xee\x50\x05\xab\xf9\x41\x48\xce\xf0\xa0\xde\x83\xf9\x3b\x7d\x8b\x5c\x8b\xa0\x35\x3c\x6d\x50\xe1\x4b\xb4\xa4\x09\xff\xa7\x10\xd0\x2d\xe5\x19\x5d\xf2\x8c\x9b\x9d\xbd\x9d\x5f\x2d\x5a\x19\xf9\x1a\x10\xf0\xa4\xe3\x3e\x52\x7c\x38\xb0\xd9\x91\x97\x16\xc2\x39\x58\x02\x5f\x2d\x2a\xc9\x21\x5c\x62\xd4\x55\x36\x42\xc1\xa3\x29\x70\xf8\xf6\x15\xfb\x52\xc5\x10\x89\x85\x2e\xee\xa1\x8b\xc9\x33\xbc\xc0\x9f\x7f\xfc\x78\x7d\xf4\xb5\x65\xcf\x7d\xec\xb5\x65\xdf\xed\xbc\xb6\xe0\x0f\xae\x6c\x38\x09\xd5\x88\x70\xbe\x9f\xe7\xb9\xb9\xfe\xf9\x69\xc5\x37\x7c\x1e\x71\x01\x36\xeb\x04\xe1\xc7\x7b\x09\xfb\xb8\x83\x77\x83\x0c\xc4\x97\x83\x87\xdb\xd4\xee\xdd\xdf\x02\xc9\xa4\x11\x27\x1b\x98\xc3\x88\x85\x00\x37\x25\xc1\x22\xfc\x4f\x16\x02\x6b\xec\xf6\xbd\xe0\x27\x7d\xcc\x79\x4b\x58\xb1\x59\xc5\xc4\x51\xbc\x63\xc5\xe6\xfb\xbb\xb6\x01\xcf\xfe\x46\xbe\xbf\xab\xe4\xc2\x86\xa3\xa9\xbf\xa4\x02\x4c\x57\xa3\xb1\xef\x4c\x93\x8c\xaf\x58\x6f\x44\xf8\xf0\xf9\xca\xa5\xe0\x46\xaa\x40\x04\xed\x61\x31\x19\xc0\x36\x79\xef\xbe\xc4\x94\xba\x44\x66\x19\x4b\xbc\x8d\x16\x16\xe6\x41\x07\xe8\xaf\x43\x9d\x70\xad\xd5\xb5\xaf\x1e\xea\x4b\xaa\x23\xa2\xcf\x3f\x5e\x5d\x5c\xbe\xbf\x5a\xe4\xe9\x77\x1b\xf9\x38\x37\x72\x5e\x6a\x36\xe7\xa6\xff\x3e\x1a\xcc\xd8\x88\x0a\x8f\x1d\x8e\x42\x2d\x7a\xfd\x41\x87\x48\xc4\x6e\x4b\x34\x83\xee\x75\xa9\xeb\xcc\x5e\x75\x48\x57\x52\x9a\x19\x51\xd4\x55\x58\xeb\x65\x1b\xc4\xa9\x0c\xab\x32\xcb\x10\xe3\x46\x31\x36\x6b\xda\x43\x02\x95\x64\x4e\x7f\x4f\x37\x96\x15\xcb\x86\x43\xc6\x36\xa6\xd8\x68\x36\x1c\xae\xdd\x4d\x9e\x99\xd4\xe2\x79\x7d\xff\x05\x1d\xc2\xea\x5d\xf5\xad\x8f\xb3\x01\x8f\x9b\x91\x10\x13\x38\x10\xde\xbd\x92\x0a\xfa\xd8\xb4\xe9\x83\x99\x04\x96\x0b\x75\xcb\x17\xee\x2e\xf9\x02\xa7\x32\xe6\x2e\x81\xc9\x7c\x64\xab\x63\x11\xf5\x91\xad\x30\x0b\xb9\x9d\x52\x0b\x35\x78\x99\x30\x90\xa6\x12\x34\xe3\x39\x74\x74\x62\xce\x95\xd2\xf8\x02\xa8\x8a\xcb\xe2\x1a\xae\x39\xd8\x9f\xd6\xee\x30\x64\x46\x9b\x77\xe4\xd6\x8a\x87\xec\xf1\xfc\x51\xaa\x07\x2e\xd6\xf3\x47\x6e\x36\x73\xe7\xe5\x3a\x87\x16\x89\xe7\xdf\xc1\xff\x04\x67\xe6\xcd\xde\x17\x69\xea\xdc\x6b\xa5\x66\xab\x32\xc3\x00\x08\xbd\x68\x54\x92\x9f\x81\xf2\x36\x23\x25\x4f\xff\x57\xb8\x4a\xd6\x08\xb6\x1e\xcc\x41\x08\x35\x22\x0d\xf2\x75\xe5\x0f\xa9\xa2\xa9\xd4\xd8\xd7\xc9\xe2\x62\x16\x67\x93\xa4\x69\xce\xc5\x37\x71\x14\x87\x04\xac\xe0\x3d\x3f\x24\x3e\x71\x91\xf6\xe1\xb7\x8d\xdb\x77\xf0\x66\x5b\x7e\xc2\xaf\xeb\x52\xbc\xce\xf7\x47\xbd\xfe\xd1\xab\xe7\x4a\xe1\x7d\x83\x6d\xcf\x60\xd4\x81\xce\x77\xfa\x1f\xd9\x1c\xc7\x9e\x17\x69\x8d\xf1\xaf\xe3\xd0\xfb\x52\x46\x9d\x3d\x67\xdc\x57\x30\xed\x44\xc9\x8b\x23\x77\x87\x4c\xa2\xd0\x49\xb1\x18\x23\xfd\x1c\x75\xa7\x43\x23\x07\xed\xcb\x8d\xc1\xc5\xec\x3a\x42\x38\xad\x37\x2c\xfe\x54\x1d\x6c\x5d\x9f\x5e\x8c\xe4\x13\x2e\x8f\xe5\x43\xc1\xc4\x9d\xa1\xc9\x43\xc0\x8e\x3d\xdd\xc3\x5f\xf5\x1e\x1e\xeb\x09\xf3\x61\x31\x69\xb5\xdf\x1c\x7a\x58\x3a\x37\x6e\x1d\x35\x83\x44\xfe\x0d\x72\x9d\xe7\xf4\x6e\x61\x54\xd5\x7b\xda\x53\xe5\xbc\x6d\xb9\xf0\xef\xee\x5d\xbe\xd5\xcf\x60\x7b\x72\xd1\x7a\x85\x2c\xca\xac\x3f\xb3\x05\xf2\x8f\x70\xe2\x47\x5e\x96\x4e\x78\x1a\xe3\xca\xaa\x99\x48\x2e\x53\x46\x96\xdc\x54\xad\xcc\xa4\xa8\x8a\xe4\xc3\x9d\x19\xa0\x82\x65\x95\x43\xd2\xbc\x69\xdb\xcd\xaf\x5e\x83\xec\xf1\xfa\xbf\xff\xf7\xff\x1e\xc8\xa2\x6c\x60\x43\x92\xd7\x7f\xfc\xc3\x1f\x16\xe4\xd2\x75\x66\xe3\x4c\x37\x03\x28\x0b\x1f\xfc\x27\xa4\x21\x14\x32\x64\xc2\x6d\x71\x1d\x82\xdd\x9d\xe0\xc2\x88\xb1\x49\x38\x96\x7c\xb7\x9b\x96\xf1\xc4\x60\x47\x4c\x3c\xe4\xae\xe5\x72\x10\x28\xf5\xe3\x57\xf1\x27\x80\xcb\x19\xc9\xf8\x03\x23\x2b\x0d\x25\xdf\xeb\xc2\x61\x18\xfe\x16\x80\x98\x50\x01\x79\x0d\x30\x81\x7a\x57\x34\x33\x5f\x24\x80\x61\xc0\x28\xb4\x9f\x68\xda\xea\x52\x0d\xed\xf4\x1f\xd8\x6e\x8e\x5b\x5f\x50\x5e\xc5\xce\x5d\x52\xd3\xdf\x14\xc6\x27\x2b\xb5\x99\x7d\xc2\xd2\xc6\x01\xf3\x01\x88\x85\x92\xff\x8e\x9b\xcd\x45\x30\x24\xa6\xd9\x89\x42\x3b\xc1\xcf\x95\x83\x13\x8d\xf2\x52\xbe\xdc\xaa\x6b\xbe\x1c\x8e\x35\xa9\x53\xe9\x3a\x92\x6c\x33\x0e\x0d\x6d\x1e\xd8\x4e\x1f\xce\x36\x28\x6e\x38\xed\xbb\x8e\xb6\xb4\xd4\xad\x91\x66\x4a\x71\x00\x17\x5b\x58\x84\x6e\x74\x64\x45\x30\x49\xea\xb3\x22\x1b\xb1\x9c\x10\x70\xec\x5a\x26\xb8\x77\xdd\x3e\x05\x80\x56\x5b\xd1\x8a\xd8\xd1\xcc\x94\x6e\x73\x20\x10\xcb\xce\x97\x69\xed\x52\xc9\x72\xaa\x1e\x82\x6b\x97\x8e\xff\x2c\x20\x1a\x5c\x57\x69\x6f\x98\xc3\xb8\x65\x55\xd3\xb0\x66\xbe\x44\x78\x9e\x67\x8b\xc5\x19\xb2\x07\xa9\x88\x36\x54\xb9\x13\x6d\x7f\xef\xbf\xca\x06\x6d\xa1\xed\x48\x7c\x5a\x34\x1a\x78\x41\x66\xab\x84\x64\xc4\x3a\xca\x9b\x46\x94\x1b\x8a\xad\x42\x13\x51\xb4\xf7\xc0\xdd\xee\x26\xe5\x08\xf0\x64\x6d\x26\xf2\x81\x7a\x78\x07\x73\x19\xb8\x62\xb0\x2b\x19\xcf\xd8\x70\x09\xdc\x3c\xe2\x66\xb9\x5e\xed\xf5\x01\x19\x84\xda\xa0\xe5\xc6\xfd\xb9\xd7\x2b\xbf\x75\x59\x0c\x82\x0c\x5f\x26\x9d\x57\xc6\xf0\xe2\x07\xaf\x94\xc3\x8b\x63\x10\x68\xc4\xc5\x82\x4f\xdc\xf5\x82\x4f\xcc\x25\x83\x4f\xd8\x2f\x80\xcf\x01\x5d\x57\x9c\x01\x8f\xf8\xaa\xbe\x75\x21\x53\xbb\x88\x6a\xfc\x82\x87\x03\x1b\x81\xbb\x86\x40\x54\x10\xba\xd4\x32\x2b\x0d\x82\xae\xff\xe8\xd8\x4e\x14\x25\xc1\xa4\x7c\x41\x52\xe0\x38\x15\x98\x06\x2b\x02\x66\x1f\x57\x1e\x37\xcc\xb5\xdc\xc0\x27\xed\x6b\x12\xac\x99\x3b\x87\x15\x0e\xba\x8c\x06\x4a\x97\x0c\xbb\x8c\xc2\xba\xe2\xb7\xaa\x27\x9e\x58\x47\x8c\xd8\x57\x7f\x7f\xc6\x3a\x95\x5d\xb4\xe9\xe3\x86\x39\x17\x1a\x6b\x88\x58\x52\x11\xcb\x10\x40\xd0\xb0\xcc\x36\x24\xf1\xfb\x0a\xa7\xfd\x97\xfb\xb0\xd1\x63\x48\x11\xd3\x3c\x46\x05\xbb\xbb\x26\x2f\xdf\x55\xa9\x1a\xbe\xed\xf7\xb5\x30\x4c\xad\x68\xc2\x5e\x35\x55\xb3\x70\xdc\x90\xcf\x94\xd8\x50\x91\x66\x3e\x0f\x84\xb0\xcf\xae\x8d\xa9\x1d\x29\x55\x1c\x92\xdb\x2f\x9a\xfd\xe0\x7a\x32\xc9\x22\x14\x36\x80\x16\x1b\xbf\x81\x43\x77\x34\xb0\x6f\x4c\x0c\x96\x80\xf3\x0f\xcb\xb1\x95\xae\xb9\xb0\x04\x00\xf7\x07\xb0\xa6\x9d\x2c\x95\x33\xb0\xfb\x16\x5d\x89\x54\x56\x05\x1b\x6a\x68\x44\x35\x51\x6c\x6d\x65\x55\x85\x05\x66\x1b\xf9\xda\x4f\x8a\x49\x3b\x51\x5c\x5f\x23\xf6\xce\x99\x61\x43\x76\x5a\x6f\xa0\xfd\xff\xd8\xbb\xba\xdf\xc6\x6d\x6c\xff\xbe\x7f\x05\xd1\x7d\xc8\x0c\x10\x27\xed\xde\xa2\x28\x06\x8b\x02\x99\x24\xd3\x1b\xec\x34\xf5\x8e\xd3\xce\xc3\xc5\xc5\x82\x96\x18\x9b\x1b\x59\x54\x45\xc9\x19\xdf\xbf\xfe\x82\x3c\xfc\x92\x2c\xf1\xc3\x76\x92\xc9\xd6\x7a\x99\x89\x2d\x1d\x93\x14\x79\x78\x78\x3e\x7e\xbf\x7b\x65\x24\xb3\x35\xcd\xb5\xa1\x0f\x2c\xdd\x6b\x5d\xd5\x5f\x61\xce\x0d\xf9\x9d\x77\x80\x38\xcb\xa8\x3c\x50\x3b\x6f\x0c\x8c\x71\x69\x6e\x98\x5a\xdc\x4e\xee\x7e\x9c\xc3\x1a\xa8\xaf\x3d\x80\xf2\x11\x03\x5d\xb2\x9c\x4c\xdb\x79\x41\xf9\x72\x96\xe8\x8d\xbc\x1d\x78\x14\xb2\x1f\xb6\x62\x8c\xe0\xa1\xf4\x9d\x09\xfa\xbe\x4b\xc4\x89\xc4\x6f\x5b\x13\x17\x0a\x57\x5a\xb7\x98\x1b\xd6\xe1\xcb\xd9\x70\x56\x98\x6a\xad\x5a\x1f\x4c\x56\x84\x14\x44\x61\x56\x88\x17\xe1\xb4\xfd\x77\xcb\x70\x28\x3e\xfd\xad\xac\xdc\xcf\xbd\x87\xf6\xa2\xe0\xfd\xda\x64\xad\x9c\xc1\x52\x53\x85\x67\x6a\xf6\x50\x31\xb1\xc2\x63\x41\x7b\x44\x42\x76\x00\x7b\xc3\xc4\x81\x41\xb0\x59\xe2\x12\x31\x2f\xf0\x1e\x3c\x2e\xe1\x84\xb4\x28\xa7\xde\x53\x56\x7e\xcb\x09\x3d\x3e\x95\x8e\xee\xde\x17\x75\xf7\x26\x06\x5c\x66\xea\x2c\x04\x8b\x51\x57\x8e\x77\x6b\x47\xb5\xaa\x0f\x1f\x59\x03\x31\x9b\xbd\x42\x20\xf0\xeb\x17\x0d\x10\x21\x7b\x11\xa2\x13\xd1\x87\xa3\x86\x7e\xa0\xa8\xd4\xb6\x45\x9a\x0e\x84\x2b\x3d\x32\x51\x07\xcc\xcc\x59\x0b\x41\x27\xa1\x59\x59\x8e\xc6\x52\xf2\xec\x26\x2c\xf7\x5f\xf8\x70\xb4\x9c\x5a\x36\x96\x65\xad\x21\xe9\x92\xef\xcf\x86\x2b\x43\xe4\x2a\xc1\x39\x16\xcc\xd1\x95\xed\xdb\xc5\xa6\xcb\xd9\x63\xf9\x88\xeb\xfc\x62\x3a\x52\x3a\xd0\x35\x79\xec\xdd\xae\x15\xa7\x85\x48\x72\x4e\x00\x48\x55\xa9\xb4\x3e\xc3\xae\xe7\x85\x3f\xfa\xdb\xbb\x43\x74\xf4\xb7\xbf\x02\x7f\xbb\xb8\xb7\xcb\xc2\xd6\x59\x0b\x1a\x55\xc2\xe7\x50\x4a\x73\x74\x3a\x2b\x10\x34\x62\x3f\x27\xde\x31\xc8\xfc\x9b\x1f\x53\xb3\xdb\xbe\x35\xc7\xc0\x53\xcb\x37\xc8\xd1\x12\xeb\x30\x95\x72\xbc\xd6\xeb\x40\x5f\x9d\x04\xde\x99\x64\x34\x83\xa8\x81\x13\x98\xa8\x58\x04\xed\x90\xdc\x5e\x71\x59\x32\xd0\xcd\xfc\x14\x28\xd3\xf8\x29\x9c\xd9\x24\xd8\x99\x30\x40\x2a\x9c\x11\xb9\xa2\x8c\xe2\x0e\xba\xe1\x52\xa8\xde\xac\x85\x12\x43\xdb\x34\x08\xb8\xa5\x7a\xcd\xb3\x25\x59\x61\xf9\xdf\x0f\x62\x34\x06\x81\x30\x86\x2e\xca\x91\x30\x0b\x1a\x02\x85\xcd\xa4\x5e\x71\xc4\xee\x4f\x3b\x35\x33\xdf\xac\xbf\xf3\x96\xab\xeb\x2b\x89\x53\xea\x5e\x37\x33\xb9\xeb\xd3\x8e\x53\x51\xbc\xfa\x86\x29\x7e\xbb\x70\x84\xc4\x5e\x36\xd6\x22\x97\x25\x8c\xe7\x81\xbb\x19\x4b\x84\x35\xb1\xc3\x11\xe5\x47\x8c\xe0\xb7\x3a\x06\x01\x8e\x41\x00\xff\xbd\x4f\x18\x04\x70\xd4\xb4\x5c\xad\x94\x23\x35\x00\x6e\x60\x20\xe0\xac\x82\xab\x17\x3d\x98\x13\x6d\x81\x9d\x59\x90\x36\x31\xd7\x74\x5c\x20\x02\x7e\xde\x89\x51\xa2\x93\x93\xb3\xb3\x93\x13\x1d\x4d\x50\x13\xb7\x6d\xee\x27\x3f\x22\x52\x66\x2c\x87\x49\x15\x6e\xe6\x3d\xad\x79\x23\x37\x6e\x7b\x3e\x76\xfb\xba\xd2\x6d\xb5\x21\x86\x70\x5c\x41\xb6\x2d\x8e\x4d\x37\x0a\x1f\x1d\x6a\xe7\x3f\xec\xb4\xf1\xda\xed\xd6\xd4\xe0\xab\x8e\x1a\x0c\x9e\x77\x72\x5f\x0d\x76\xcb\x52\xc3\x00\x23\xb8\x5c\x1e\x9a\x7c\x1a\xbd\x81\x0f\xcf\xb2\xaa\x3d\x55\x37\x9c\xad\xc8\x8a\xd5\x9b\xb0\x8a\xd0\x42\xc4\xc3\x1d\xa9\x4a\x02\xc0\x63\x29\xac\xf4\x62\xf3\x44\xbb\xba\x19\x8f\x10\xa9\x96\xbe\x7a\x99\xc2\xc6\x4f\x2e\xbd\x33\x96\xa8\xed\xde\x00\x7c\xf0\x38\x2e\x52\xed\xdb\x92\x4f\x92\x72\x8d\xd6\xb8\xf6\x32\xb9\xeb\x2b\x69\x23\xcf\xe9\x9a\xf2\x38\x2a\xd7\x11\x9f\x87\x03\xbd\x09\xfa\x4b\xcd\xac\xa8\x4e\x2a\x0c\x24\x3b\xab\x7a\xb6\xcb\x77\x51\x8c\x11\x29\x1d\xd6\xbf\x94\xfe\x6a\xad\x56\x34\x6b\xc8\x98\x2e\x07\x7e\x2f\xf1\x96\x47\x00\x9a\xaa\xfb\xdb\x41\xc3\x23\x2e\x80\xf9\x1c\x01\xca\x80\x10\xe9\xe2\xbd\xa2\x51\xc9\xfb\xd7\xea\xde\x6e\x06\x61\x43\x56\x15\xab\x71\xbd\x41\xb9\x3a\x8f\x6f\xb4\x17\x03\xd7\xe3\xe0\xef\xb2\xf0\xd1\xa9\x7c\xdc\x1b\x95\x44\xf6\x24\xa7\xf5\xae\xf9\xfb\x2b\x92\xd3\x76\x15\xeb\x1d\xf9\xec\x92\x25\x6a\x50\x00\x10\x61\x20\x0f\x71\xf6\xe0\x43\xbd\x96\x42\xf5\x90\x01\xc5\xa6\x53\x9a\xf4\xcd\x37\x3d\xf8\x6a\x69\x81\xca\x78\x1a\xcb\xc9\x89\xdf\xe3\xa6\xc4\x40\x7b\x1c\xc7\x4b\xa9\x5c\xfa\x2a\x1b\xe8\x8d\xba\xf1\x2d\x62\x35\xfa\x45\xee\x0d\x89\x19\xb4\x87\x7b\x41\x28\xb2\x9e\x8c\xfe\x1f\xf9\x28\xb6\xc3\x68\xd4\x2a\xd6\xe0\x02\x61\x55\x9c\x7b\x8f\x0a\x96\xe1\xc2\xbc\xb1\xce\xae\x12\x78\x57\x66\xfa\xeb\x68\xa4\x78\x63\xa2\x3d\xb0\x3f\x4b\x67\x47\xc1\x21\xba\x45\x33\x89\x4e\x29\xa4\xc2\x9e\xeb\x91\xab\xdf\xd2\x9d\x04\xf6\xfa\x42\x57\xed\x0a\xb5\x92\x86\x49\x22\xfb\x8b\xa7\xf5\xcc\x32\x4d\x78\xf4\x20\xf8\x22\x08\x7a\xcb\x62\x54\x5a\x4a\x71\xdd\x03\x88\xf8\x66\xa6\xc7\xd1\x39\x00\x06\xaa\xe9\xb5\xf9\xce\x5b\x69\xdc\xa9\x96\x29\xe3\x85\xdd\xcb\x28\x8d\xd9\xf4\xb9\x81\x32\xf4\xcd\xa8\xde\x9c\x2f\x69\xd1\x9d\xf4\x1a\x99\xce\x0c\x70\x5b\xaa\x58\x7e\xc2\x3c\x1d\x9e\xa6\x2d\x27\xf5\x64\xd1\xd2\xfc\xa0\x13\x34\xa0\x6d\xef\xb3\x08\x3d\xfb\xe1\xb2\xab\x60\x3f\xd0\x79\x4d\xd0\xe5\x12\x97\x25\x29\x9c\x2d\xb3\x07\x96\x38\xe6\x50\x76\x21\x14\x03\x08\x8a\x07\x40\x7a\x78\x1d\x55\x50\x2f\x09\x6d\xf3\x4a\xe0\x01\x8b\x36\x1a\x18\xd0\x7a\x4c\x3e\x5c\xa2\x06\xd7\x0b\xd2\x88\xc7\x51\xd9\xae\xe6\xc4\xb3\x9a\x5e\x0e\xca\xee\xe5\x0b\xbb\xf6\xab\xc0\x82\x41\xfe\xfc\xf9\x36\x1a\xf1\x61\xe8\x1d\x3d\xb2\xba\xc8\x1f\x69\x0e\x29\x3a\x1c\xbd\x11\x02\xdf\xbe\x3c\x08\xc3\xe3\x23\x1d\x23\x35\x09\x74\x4c\x39\xc6\x64\xc7\x90\xec\x99\x2a\x17\xa2\x62\x47\x7a\x23\x05\x8f\xf1\x70\x88\xeb\x9a\x02\x0a\xbc\xb8\x4f\xd8\x44\x2e\xc7\x8e\x38\x8c\x99\x61\x97\xaa\x53\xcc\x71\xe5\xe4\xf3\xc8\x94\x38\xf1\xf3\x56\xb9\x68\x58\xb3\x44\x9c\xae\xda\xa2\xc1\x25\x61\x2d\x2f\x36\x9e\xa9\xf0\x3c\x03\x1e\xda\xb3\x0a\xf2\x05\xa6\x6e\xcc\xde\x65\x6e\xee\xee\x61\x12\x58\x99\x66\xfa\x05\x75\x36\xb1\xb1\x68\x13\x87\x5c\x26\x2e\xa9\x39\xcf\x4d\x5d\x30\xa0\x79\xcb\x6c\x37\x92\xa1\x39\x16\xfb\x56\x55\xb4\x0b\x3a\xe2\xb5\x7e\xb6\xdc\x36\x9b\xb7\x23\x2c\xf5\x08\x83\x32\x94\xc2\xf0\x27\x06\x92\xbb\x1b\xcc\x2a\x43\x39\xa9\x48\x99\x4b\xa8\x70\x3b\xd3\x7c\x6b\x4f\x76\x7e\xaf\x11\x56\x5e\xf0\x97\x4c\xf0\x70\x74\xdc\xf5\x97\xa6\xc6\x42\x2d\xad\x84\x02\xd2\x1e\x7a\x7a\x8f\x70\xe9\x53\x24\x87\x4f\xd5\x79\xf5\x5b\xe8\x93\x01\x93\x3c\x55\xd2\x20\xe8\xb8\xe0\x64\xd7\xa9\x7d\xa3\x29\x7c\xfa\xf7\xdd\x3a\x2b\x2f\x0a\x77\x7c\x2a\x9f\x9b\xb0\xe7\xdd\x11\xc5\x5d\x7c\x20\xcd\x08\xfa\x68\x7a\x72\x2c\xe3\xfe\x2a\xf3\xfa\x9e\x2e\xe7\xea\xbe\x60\xd9\x43\x14\x92\xc8\x07\xb8\xb3\x77\x52\x56\x1f\xf6\xa1\x44\xc4\x19\x78\xa4\xbb\xc3\x27\x63\xb5\x86\x9c\xed\x46\xa6\x14\x28\xf1\x62\xf2\xd7\x6c\x6c\x86\x73\x05\xb6\xa8\xb8\xed\xdb\x72\x14\xd3\x20\xc2\x32\xc1\x0d\xe6\x49\xa0\x82\x7d\x44\x5d\x4e\x1a\xc8\x07\x94\x00\x65\x2b\xd2\x60\x09\x27\x3a\xf9\x29\x14\x76\x54\x7d\xd6\x32\x84\x39\xa3\xfb\x6f\x29\x5d\x32\x56\x72\x9a\x13\x25\x3d\x17\xef\x22\xf3\xd0\x30\xc5\xc1\xf5\xc2\x2f\xfe\xf6\x5b\x34\x4a\x80\xb8\xb5\xd7\x67\xf5\x02\xa5\xc7\x48\x62\x69\xdb\x73\x80\xaf\xcf\xf7\xce\x24\x52\x92\x9e\xcc\x17\xb4\xc8\x88\x65\x27\x8e\x84\xa8\x3e\xf9\xf9\xf2\xba\xfb\x50\x77\x01\xfc\x7c\x79\xfd\x1f\x41\xb4\xb1\xc8\x88\x85\x3c\xcf\x29\x7f\x38\xb2\x6c\xfc\x09\x58\x36\xb6\xde\xfa\x6b\xf7\xa1\x1d\x29\x36\xbe\x62\x8a\x8d\x67\xd2\x51\xe8\xa0\x8e\xce\x2a\x4f\xb0\x05\x34\x8f\x84\xeb\xa4\x98\x5e\xb9\xe4\x11\x62\xc3\x38\x93\xf0\xa5\x7e\x7d\xd6\x01\xdd\xd1\x80\xf8\xf2\xd9\xe7\x1b\xc4\x27\xc0\xf7\xea\xe0\x48\x87\xce\x9f\x9e\x11\xda\x42\xed\xda\x26\x28\x7c\xf6\x81\xda\x07\xd8\x1c\x66\xd9\x4e\x46\x0d\x6d\x3e\x91\x6a\x64\x67\xe8\x99\x32\x70\x6b\xcf\x4f\x48\x1b\xf1\x01\xe3\x54\xe6\x11\x00\xdd\xb6\xe1\xcd\x1e\x7d\xed\xe0\x25\x3c\x43\x57\xd7\xd3\x4f\xd7\x97\x17\x77\xd7\x57\xef\x90\x96\x4f\x5d\xc3\xf4\x0c\xdd\x31\xeb\x56\x1c\x3d\x15\x58\x3e\x35\x99\x0f\x69\xdb\x75\xaa\xd4\x26\x2e\x6d\x2c\x56\x82\xa2\xe0\x12\xdd\x94\xb4\x31\x59\x4b\x3e\xc3\x2b\x2b\x58\xa9\xf2\x7d\x84\x4c\xe5\xd1\x5c\xd0\xe6\x14\xcc\x2c\x85\xba\xbe\x24\xdd\xdf\x18\x15\x49\xd0\x14\x72\x29\x2c\xd7\xec\xae\xf6\x92\xc9\x47\x88\x65\xcb\x80\x48\x82\xcd\xfc\x90\xbb\xc8\x36\x6f\xac\xc6\x37\xf1\x2c\x22\x8b\x7c\x22\x7d\x0e\x27\x67\x27\xda\x34\x2a\x0c\x6e\x8d\x4e\x7c\x35\x3f\x37\x48\x3a\x6c\x2f\x15\x06\xef\xce\xaa\x33\x84\x7e\xd5\xc4\xa3\xa7\xc2\xba\xe9\x81\xe3\x78\x0a\x6d\x74\x4b\x6d\xa4\x7b\x40\xbe\xde\xb7\x79\x3b\x77\x1b\xea\x4f\xf5\x91\x52\xd6\xa4\x0c\x6c\xc3\x51\x4a\x50\x37\x24\xf2\x1d\x7e\xb2\x2d\xff\xed\xd3\xc7\xfd\x7e\x1a\xd6\x55\xe4\x0f\x5f\xb2\xd5\x8a\x36\x68\x89\xf9\xd2\x94\xf5\xd9\x6c\x04\xb3\xaa\x77\x6f\x51\x48\xcf\xd9\xa1\xda\x49\xd7\x41\xc1\x78\x14\x6e\xfc\xc9\xcf\xfa\xe6\xde\x81\xcd\x7c\xbc\x85\x1e\xef\xd3\x20\x1d\xf4\xf8\x50\x12\xd5\x18\xd4\xac\x69\xff\xfe\xd8\xa7\xa4\xcc\x01\xd9\x31\x9a\x90\x45\x3f\x70\xeb\xe0\x5b\x69\x29\x60\xb0\xc8\x8e\xe6\xa4\xc1\xb4\xf0\x19\x7c\x76\x04\x1b\x56\xb1\x82\x2d\xd2\xf0\x9c\x07\x06\xe1\xaf\x90\x59\x3d\xc1\x13\x31\xba\xfb\xd9\xff\xf1\x68\xf2\x3a\x41\x5c\x0c\x84\xed\x93\xb1\x84\x65\x5e\x76\xca\xc1\xeb\x45\x3a\x7c\x50\x03\xac\x3f\x0a\x7e\x13\xd5\x12\x0c\xc3\x4e\x62\xeb\x87\x2b\x52\xaf\x28\x17\xaa\x64\xd0\x32\xf3\x88\x7d\xc6\x79\xb4\x8f\xb9\x66\x56\xdf\x98\x39\x37\x96\x66\x1a\x50\x70\x42\x0b\x45\x12\x64\x4b\xa2\x31\x39\x85\x3b\xea\xad\xaa\xc9\x84\x7c\xa1\x5c\xfa\x2a\x64\xed\x02\xab\xed\xee\x3d\x16\x71\x73\x18\x34\xb4\x0b\x4a\x3b\xac\xe0\x59\xc9\x9f\xdc\xc9\x58\xf2\xb0\xec\xc3\xa5\xdd\x81\xc0\xf0\x5b\x14\x1b\x00\x14\x95\xd5\xc8\xe0\x20\xc0\x0b\xd9\x68\x56\x2b\x77\x7b\x55\xd3\x35\x2d\xc8\x38\xcd\x52\xb3\xa4\xe5\xc2\x21\x0f\x96\x54\xc7\x44\x95\x61\x91\xad\x3e\x88\xf5\xcb\x1b\x27\x43\x6e\x44\xac\x5c\x05\xb7\xbf\xde\xa1\x92\x08\x61\x4b\xca\xf7\x3e\x3c\x88\x66\x78\x72\x8d\x27\x93\x89\xf4\xa7\xbc\xf9\xb7\xb0\x4b\xf3\xe2\x2d\xfa\x4c\xd4\xaf\x0b\xf3\x5c\xac\xf8\xac\x41\x8f\x4b\x26\x4f\xd4\x2d\x57\xfd\x0a\xbd\x47\x4d\xd0\x5f\xe6\xfa\xd9\x73\xf1\xbc\x30\x0b\x61\xb3\xeb\x48\x91\x55\xff\x1c\xd9\xc8\xe1\xce\x36\x6c\xb2\xd6\xd5\xae\x63\x63\xac\x39\x33\xd0\x40\x59\x04\x72\xb5\x65\xa5\x2b\xdf\xac\x0a\x5a\x3e\x9c\x22\xda\x68\x65\x26\xe6\x84\x4a\x61\x2c\x1f\xf4\x6c\xad\x09\x2e\x40\xa7\xa7\x29\x9f\x5d\xde\xf9\x5e\xfa\xbc\x49\x70\x9e\xde\x6d\x2a\xc8\x7a\x30\xaa\x40\x25\x82\xf4\x58\xd4\x93\x10\xad\x9f\xb9\xc7\xc1\x83\xf1\x8e\x9a\x94\xf2\x38\x84\xa8\x93\x9b\xd9\xe5\xec\xa6\x47\xe4\x05\x9f\x75\xdc\xfa\x5a\x1f\x8e\xf4\x74\x37\xb7\xbe\x1f\x16\x68\xcc\xad\x3f\xb6\x21\xca\x2e\xef\x6f\x59\x66\x4b\x5c\x5d\xb4\xcd\xf2\x8a\xf2\x8c\xad\x49\xf4\xa1\x46\xc3\x86\x29\xd7\x3a\xa2\x7a\x10\x41\x0a\xba\xfc\xef\x8b\x69\x2c\x87\x48\x4c\x3a\x81\x6e\xe7\x8c\xf0\x84\x13\xd0\x70\x2b\x95\x8c\x83\xb7\xf1\x18\x0c\x79\x45\xc1\x10\xb9\x7e\x5e\x7b\x00\x84\x96\xb4\xa1\xb8\x61\x81\x1a\xc0\xae\x57\xa0\xe5\x0d\x5b\xa9\xa5\x70\xa3\x05\xc8\xc0\xb6\xdc\x8c\x3b\x32\xfd\x3b\xb2\x83\x23\x4c\xe5\xe9\x2a\xe3\xd4\xa0\xed\xf5\xd2\x30\x4f\x51\x49\x1e\xe1\x57\xbd\xbb\x93\x7e\xfa\xef\x2a\x89\x56\xcc\x55\x5c\xfc\xf4\xee\xef\x4e\x18\xe5\x27\x53\x8e\xad\x8a\x74\x3d\x12\x2d\x74\x9d\xe4\x31\xd8\xcf\xe1\x81\x10\xfd\x23\x56\xf7\x28\xd7\x1d\x8c\xf3\x3f\x5b\x5c\xc0\x48\xdd\xee\xeb\x7f\xea\x8e\x72\x64\x63\xf4\xdb\xd6\xa3\x7b\x6b\x3c\x00\x2d\x27\x72\x17\x84\x3b\x9a\x1a\x97\x5c\x0c\x79\x2c\xf0\xd3\x89\x0a\x7a\x9d\xa0\x37\x4d\x56\x05\x51\x9f\x0e\x94\x12\x0f\x8d\x55\x23\xfc\xd1\xa4\xc2\x8f\xff\xfa\x01\x23\x44\x72\x3e\xc6\x3a\x62\x3a\x0d\x9d\xca\x47\xd1\x47\xca\x1b\xc8\xc0\x04\x59\x92\x28\x4b\x26\x46\xfb\x22\x79\x25\xba\x99\x4a\x58\xce\xea\x5f\x38\xcf\xeb\x77\xb0\x9f\x69\x30\x92\x5a\x9e\xde\x98\x21\xc3\x8b\x60\x4f\x7a\xd3\x6c\x2a\x9a\xc9\xa3\xda\xdd\xe5\x54\xca\xe0\xe8\xc7\x1f\x00\x3d\xe1\xbf\xfe\xf6\xc3\xb7\x9e\x97\xf9\x5c\x99\xea\x89\xfe\x8e\x67\x8c\x37\xed\x65\x28\xa4\xe6\x46\x4a\x43\x65\x66\x79\xd6\xd4\x5a\x85\x59\x25\x5e\x97\xd1\xd9\xb1\xe6\xcc\x31\xbf\xef\x45\x71\xfb\xe0\xd5\x81\x3e\xd8\x5d\x93\x80\x12\x99\xf6\x94\x08\xf2\x52\x61\xee\xa2\x44\x1c\x55\xe1\x33\x98\x52\x95\xc8\xde\xa7\x45\xfa\xc7\x70\x4f\x27\x62\x27\x19\xf9\xc6\x1d\xf9\x5d\x4e\x9a\xe3\x4b\xa2\xbb\x14\x40\x7f\x88\x33\xa1\x13\xb1\x93\x15\x00\x57\xb7\xb3\x7f\x7d\xbc\x78\x7f\xfd\x51\x71\x3a\xc8\x14\x02\x80\x57\xf3\x44\x20\x77\xc9\xfa\x8a\x5f\x49\xc3\xb3\x3e\xf0\x82\xca\xb8\xc8\xcc\x6d\x8f\xcf\xb7\x44\xb7\xa3\x64\xbe\x89\x35\xed\xfb\xfa\x70\xca\xfb\x91\x9e\x3f\x81\x13\x4c\x7b\x58\xc9\x97\x6e\x55\x87\x18\x0c\x4e\x6a\x89\xfc\xf8\x64\xae\x9b\xd1\x8e\xa2\x17\x88\x3b\x88\x1e\xc3\x28\xc0\xd1\xcf\xd3\xe3\xdd\x22\x0e\x2f\x3a\x8e\xa1\x9d\xbf\x8e\x2f\x85\x3a\x99\xc9\xbb\x75\xd4\x4a\xac\x12\x48\x35\xaa\x85\x1a\x17\x0a\x9c\x70\x1e\x06\x31\xe9\xcf\xb0\x17\x9b\x47\x3b\x7b\xff\x26\xaa\xfd\xbb\x28\x6c\x9b\xd5\x03\x2a\xf9\xb2\xc0\x74\x04\x85\xa2\xb7\x6a\x87\x1e\x84\xff\xce\xc0\x49\xd8\x09\xc5\x98\x3a\x95\x31\x25\xce\x10\x46\x83\x32\x4d\x3e\x03\x56\xc7\x5b\x89\x07\x18\xe1\xfa\x48\x79\x83\x76\x18\x26\xfa\x65\xda\x8f\xe0\x93\x4c\x34\x66\x67\x85\x28\x9f\x4e\x49\x9e\xbb\xd4\x0f\xf4\x6b\xfd\x46\x86\xc9\x6f\xaf\x6f\x0f\xa0\x26\x0c\xaf\x98\xae\x69\xec\x40\xdd\x1f\x5c\x47\xec\x39\xc2\xe8\x49\x34\xf1\xe7\xc4\x9a\xaf\xf0\xa9\x7f\xff\xf3\x4f\x48\x0d\x98\x99\xb4\xd3\x72\x5f\xb2\x86\x95\xc9\x89\xff\xd3\x81\xc7\xba\xeb\x1b\xee\xb8\x84\xd2\x94\x62\xdc\x3d\x60\x44\x40\x1e\xe7\x10\xdd\xee\x28\xb1\xee\x8e\x4b\xef\x3f\xb5\x48\xf5\x60\x90\x10\x31\xa9\x24\x79\x74\x39\xcc\xcd\x95\x32\xe6\x74\xc9\x0b\x57\x93\x03\xd9\xd9\xe1\xcc\x03\x4f\x7f\xbd\x39\xf8\xfb\x6f\xa7\xf9\x6e\xac\x97\xe2\x85\x3e\xb2\x3a\xbe\x28\x7d\xda\x79\xa0\x97\xa1\xa0\xbe\xeb\xd7\x8c\x8d\x99\xf8\x5f\xcb\x2a\x99\xc9\x70\xab\xd3\x95\xa1\x68\x8a\x5e\x3b\x9e\x57\x3c\xb4\xa8\xa2\x96\x8e\x47\xe6\xc0\xa2\x82\xa5\x13\x5e\x32\xbe\x1d\xef\x70\x8b\x29\x71\x93\x8a\x2d\x70\x0e\x01\x28\xa5\x16\x38\xef\x65\xc9\x27\x32\xed\xfe\xae\x6e\x57\x07\x7e\xf1\x7e\xac\xfa\xc0\x66\x09\x85\x52\xb1\x5e\x94\x0e\xd7\x30\x58\x46\xe8\x04\xc0\x27\xbf\x67\xb5\x84\xad\xa2\x50\xbe\x6c\x21\x39\x55\x89\xf2\xa9\x22\x9f\x58\xe1\x6a\x14\x6c\x52\xa8\x04\x17\xda\x7c\xc7\xe5\x9f\x8e\xd0\xff\x4b\x08\x96\xdf\x05\xdf\x8f\x52\x01\x1e\x58\xfe\x41\xa8\x7d\x8f\xd0\x31\x10\xfe\x00\xd4\xbe\x47\x62\x2a\x44\xb1\x03\x41\xec\x91\x1a\x0d\x4e\x6c\xc1\x87\x9f\x21\x88\xa3\xa6\x61\xe4\x44\xd0\x00\xfb\x3a\x59\x14\x96\x81\x97\x9d\x20\x0d\x5a\x7f\x6a\x24\xc2\x48\x2b\x6c\x01\xcb\x6f\x8b\x0b\x56\x2e\xc2\x68\xbe\xcc\x4d\x76\x20\xb9\xc9\x25\xd8\x54\x5e\x67\x79\x2c\xea\x6c\x80\x0e\x7b\xa4\x73\x2e\xe4\x82\x65\xe8\xb0\xbc\xd8\xb2\x5e\xda\x5b\x6e\x67\x5a\x19\x44\x23\x4f\x43\xd0\x0d\xbe\xa4\xc1\xfe\x44\x30\x1d\x47\x88\x44\x2e\x1b\x72\x98\xf3\x38\x4a\xe2\x30\x2f\xb2\x9b\x55\xd2\x63\x3f\x8e\x92\xea\x67\x48\x06\xe9\x03\x3c\xc8\x51\xb2\x9b\x10\x57\xf2\x00\x23\x72\x94\xe0\x18\xd6\x64\xc3\x8d\x1c\x25\x31\x89\x3f\x39\xba\xf3\x49\x4c\xca\x71\xd3\xca\x61\x5b\x0e\x72\x2a\x47\x49\x1c\xe1\x5d\x1e\x63\x57\x8e\x92\x19\xc3\x65\x8a\x52\x96\x68\x32\x2b\x73\x94\x4c\x14\xc5\xdd\x6c\xaf\x14\xed\x03\x57\x04\x9f\xb3\xbd\xf6\x64\x76\xb6\x57\x12\x10\x35\x5c\x31\x44\x0f\x23\x2d\xf5\x53\x3e\x44\xcb\x44\x0e\x39\x84\x9f\xfc\x21\x41\xe4\x08\x4d\xc4\x08\x0d\x44\x82\x60\x0f\x61\x84\x4b\x08\x91\x24\xf1\x30\xd4\x11\xf6\x8a\x26\x91\x48\x90\x99\x46\x9e\xd4\xbf\x52\x88\x25\xec\x15\x4f\x31\x61\xaf\x18\xb2\x09\x7b\xc5\x73\x4f\xa7\x4c\x67\xc3\x52\x1d\x60\xa1\x4e\x90\x39\xc8\x57\x6d\x69\xbb\x3a\x7c\xd4\x09\x62\xbd\xcc\xd5\x89\xd2\x92\x95\x4f\x2c\xc8\x3c\x5c\x21\xde\x6a\xf7\xce\x40\xd1\x81\xbd\xa2\xf9\x70\xdc\xdb\x7d\x99\x4d\xf6\x0a\x27\xd9\xc0\xf5\x35\xa7\xda\xc0\x95\x9a\x70\x13\x25\x34\x9c\x94\x03\x57\xd2\xac\x0a\x73\x65\xdb\x2b\x99\x35\x3b\xaa\x5b\x86\x59\x3b\x86\x3f\xbb\xdf\x4b\xbf\x67\xaa\x7b\x6f\xc4\x9c\x0d\x32\x31\x3a\xb7\x86\x4f\x76\x8e\x34\x79\xb6\x0b\xf6\xca\x1a\x30\x2f\x7f\xb6\xdb\x66\xd5\xdb\xa2\xbd\x8b\x7a\xbd\x91\x3b\xc1\xae\xe6\x6d\x88\x8b\x2f\x52\x17\xf7\xd0\x10\xfd\xac\x7c\xb1\xfb\x6a\x04\x77\x9f\x73\x77\xb2\xc1\x1c\xcb\xe7\x67\xaf\x78\x66\xbf\x24\x53\x14\x38\x00\x03\x1c\x7f\x09\x12\xf7\x61\x03\xb4\x57\xfa\x80\xa2\x64\x86\x40\x7b\xc5\x71\x05\x26\x89\x44\x96\x59\x30\xc8\x1a\x98\x28\x38\x81\x63\xd0\x79\x28\xfd\xa8\x84\x52\x79\x07\xed\x15\xcb\x40\x98\xd8\x73\x9d\x20\xb1\x2b\x17\xa1\xbd\x76\x1a\x8e\x34\x03\x0e\x25\x31\x15\xf6\x9b\x16\x6d\xa3\xa1\xe3\xa1\xf6\x78\xa8\x8d\xbc\xfe\x04\x87\xda\x10\x97\x62\xe2\x19\xb4\x03\x8a\x36\xc6\xaa\x98\x20\x73\x9b\x7f\x71\x94\x5f\x31\xe5\x58\x3b\xca\xc4\xd8\x65\x5a\x4c\x34\x0c\x82\x9c\x8c\x91\x9c\x8b\x8e\xd4\x74\xb5\x9b\xca\xc3\x68\xaf\x74\x46\xc6\x94\xa5\x24\xec\xa5\x78\x6e\xc6\x04\xc9\x5d\x16\xc7\x30\x4b\x63\x8a\x7d\xb4\x23\x9f\xa3\xbd\x76\xb3\xcb\x92\x39\x1e\xed\x15\xc7\xf6\x98\x68\x47\xb8\xdc\x90\xbb\xf3\x3e\xda\x6b\x47\xe3\x2a\x81\x0b\xd2\x79\x28\x92\x15\x32\x71\x48\xd4\x5a\xf0\xf3\x43\x26\xca\x8c\x63\x93\xb4\xd7\x8e\xc3\x98\xc2\x30\x69\xaf\xc3\x72\x4d\xee\xd9\x89\x5d\x2c\xcb\x48\x26\xca\x7e\xcb\x12\x0c\xcb\x54\x87\xe5\xcb\xbb\x21\xa3\x05\x43\xe2\xce\x01\xdc\x44\x8a\xef\x40\x45\xff\xbf\x1e\x0f\xd0\x33\x46\xf7\x55\x45\x67\x00\x63\xd1\x5e\x29\xa1\xfd\x78\xef\xc3\x31\xb4\xff\x34\xa1\xfd\x99\xe2\xea\x38\xc6\xf5\x07\x7b\x73\x8c\xeb\xdb\xeb\x18\xd7\x3f\xba\x40\x8e\x2e\x90\xed\xeb\x18\xd7\xef\x74\xeb\x18\xd7\x3f\xc6\xf5\x8f\x71\x7d\xdf\x75\xd0\xb8\xbe\x32\xcf\x21\xa8\x1f\x3d\xf9\xbe\x92\x98\xbe\x62\xc9\xba\xc8\x32\xd6\x96\xcd\x1d\x7b\x20\xc1\xd0\x5e\xd4\xa1\x6d\x4b\x6a\xb0\x83\x4f\x77\xc2\xc3\x6d\x4e\xc5\x49\x2a\xf9\x6d\x5f\xa8\x07\xf5\x21\x47\xec\x30\x65\x4e\x72\x23\x31\xd6\xe5\x2b\x1e\x6e\xc4\x28\x9c\xa1\x0b\x54\x93\x8c\x56\x94\x00\x0d\x3e\x86\xcf\x61\x3a\x68\x7a\x8f\x48\x43\x9f\x93\xe2\x5e\x11\x23\x94\x0e\xb1\x96\x73\x36\x51\xaa\x5f\x37\x37\x4a\xae\x52\x2a\xb2\x59\x60\x0e\x30\x8d\xd2\xaf\x19\xc7\x6a\xf2\x6f\x65\x71\xc4\xf5\x1e\x7a\x7e\xe7\xb4\xc4\x75\x7a\xc1\xd0\xc6\xf0\x82\x6d\x35\x12\x57\x54\x21\x16\x1c\x5a\x43\x90\x2f\x15\xad\xe5\xb4\x9e\x91\x8c\x95\x3e\x1e\x64\x7b\x75\x26\xcf\x75\x5f\x82\x9e\x45\xca\xbf\x1c\x79\x8c\xcd\xdb\xda\xf0\x1e\xaf\x71\x41\x73\xda\x6c\x4c\xe8\x5c\x51\xdc\x61\x58\x67\x6a\xa0\xa3\xc4\x5e\x70\xfb\x96\x11\xae\xaa\x9a\xe1\x6c\x49\xb8\xd3\x6f\xb0\x81\x55\x65\x65\x94\x4c\x5d\xf7\x02\xe4\x91\xd2\x00\x96\x72\x85\x9d\x54\x6c\x50\xcd\x1a\x9d\x36\xa2\x1a\x1e\x77\xfc\xec\x74\x0e\x8e\x3d\xd0\x28\xf8\x09\x30\x49\x9a\x7a\x23\xf3\x4f\xe2\x5c\xa8\x4e\x53\x60\x04\xe8\xbd\xfb\x07\x47\xac\xc8\x35\xb8\xd1\x8f\xdf\xc6\x1d\xfd\x48\x9d\xa9\x35\x2d\x8f\x37\x74\x25\x3d\x9c\x85\xb0\x11\xc5\xd6\xd0\xfd\x81\xb8\x49\x6e\x1b\xf1\xb7\xef\xd1\x92\xb5\x35\x3f\x73\x6b\x20\xbf\x93\x9f\xc1\xf9\x3c\x36\x4a\x26\x0c\xcb\x06\x15\x04\xf3\x06\x7d\xf7\x2d\x5a\xd1\xb2\x15\xa6\x41\xc4\xb3\x8e\x69\xfe\xc3\xf7\xd1\xcb\x2d\xd6\x28\x8f\x35\xc7\xb7\x13\x1f\xd4\xaa\xaa\x00\xf4\x5c\x59\xe5\x4a\xab\x84\xaa\x6e\x9d\xdf\x97\x84\x07\xbd\x38\xa4\xda\x8a\xdc\x37\x57\x36\xec\xc0\xba\x26\xd6\xba\x8d\xb2\x56\x23\xf7\xfd\xa8\xdb\x42\x46\x6c\xa8\x84\x54\x05\x38\x06\xbf\x0d\x34\xe0\x8f\x96\xcd\x37\x4d\x4c\x4d\xf9\x3f\xe1\xce\x6e\x31\xb9\xfe\x70\x18\x3c\x6a\xa4\xc3\x1d\x2e\x0f\x8b\x1d\x35\x78\x77\xd8\xfa\x58\x88\xd3\x74\x64\xdd\xa0\x3c\x79\xeb\xd3\xa0\x76\xd3\x66\x19\x01\xce\xe1\x2b\xcb\x16\x57\x32\x90\x1b\x78\x65\x87\xac\xb9\xf6\x22\x34\xe9\x71\xd6\xf5\x83\x3e\xe5\x7b\x78\x5e\x88\x18\x7b\xb8\x26\x0b\xca\x9b\x04\x0a\x1e\xb8\xbd\x3b\x9d\x38\x2d\x17\x40\x99\xb0\x6a\x8b\x86\x56\x85\xe9\xb9\xa7\xbf\x46\x94\xda\xeb\x5c\x97\x31\x76\x7c\x93\x18\x40\x0b\x00\x62\x2f\x10\x36\x78\x63\x7e\x9f\x94\x0d\x20\xf5\xd7\x62\x33\xad\x70\x8d\xcd\xc0\x4a\x52\x72\xfe\x56\xf9\xa5\x71\xe6\x4d\x7f\x53\xd8\x37\x62\xe7\xaa\x71\x61\x86\xcb\x0d\xe0\xee\x33\xd9\x1a\x52\xe2\xd2\x13\x05\xea\xba\x55\xe4\xcd\x88\x3d\xea\x4c\x52\xc5\xc4\xd4\x9b\x65\xc1\x92\xe7\xf7\x38\x7b\x20\x65\x2e\xe9\xf4\x60\x48\xf2\x4d\x89\x57\x0a\xc3\xd4\x90\x8e\x91\xbc\x27\x79\xb4\xb2\x5c\x5c\xe0\x65\x84\x92\x69\x0d\xc4\x10\x60\x02\x8f\x18\x9f\x96\x47\x83\x7c\xfd\xc6\x85\x2d\xe0\xd7\x11\x1c\x62\xaa\x35\x5d\x67\x44\x99\x4d\x9e\x2e\x89\x1f\xdf\xa7\xf1\x6b\x0f\xee\xc7\x56\xf3\x15\xe6\x07\x75\x66\xbe\x74\x5e\x9a\x30\x97\x44\xfc\xc3\x85\x50\x0b\xbe\xf3\x8f\x2e\xac\xef\x4d\x8a\xf9\x66\x5f\xc2\xae\x30\x47\x15\x2c\x8d\x91\xaf\x3d\x78\x0c\x81\xbd\xae\x9e\xc7\xe0\x24\x9c\x7c\x7a\x7f\xd5\xd5\x4a\x9f\x70\xce\x38\x7a\x5f\xb0\xec\x01\x5d\x11\x79\x0e\x70\xf7\xbb\x91\x91\xe8\x43\x28\xee\xc9\x5d\x55\xcf\xf3\xfd\xb9\x05\x8e\x78\xf8\xaf\x08\x0f\xbf\x9e\xfb\x06\xe0\x75\xa0\xe1\xaf\xf0\x22\x9e\x4e\x45\x9c\xd8\xe5\x52\x93\x8f\x69\x98\xd6\x1d\x97\xc8\x5f\x97\xec\x71\xd2\xb0\x49\xcb\xc9\x84\x7a\x12\x5f\x22\x7a\xf1\x40\x36\xe2\xdb\xd8\x7e\xfc\x03\x6e\xef\x1c\x97\x1a\x26\x03\x0f\xf2\x73\xb1\xe3\x7f\x7a\x7f\x25\xb6\x99\x18\x74\x37\xca\xd1\x39\x69\xb2\xf3\x8c\x54\xcb\x73\xd5\x94\xaf\x62\x58\x56\xac\xa4\x0d\xab\xa3\x19\xf0\x2e\x50\xc6\x8a\x42\xa1\x6a\xb0\x7b\x74\x49\xaa\xa5\x11\xf2\xf4\x3d\x7a\x2e\x84\xf4\x8a\xb1\x58\x04\x69\x67\xca\x8b\xa7\xd4\x8c\x77\x5e\x7c\x3d\x4f\x55\x30\xcf\x3d\x09\x5e\x19\x01\xf1\x13\x0c\xcf\x61\x81\xe5\x4f\x66\xfa\x01\x79\x0c\x75\x62\x4f\x5d\x1c\x79\x25\xd8\x33\x42\xae\x9a\x41\x37\xf7\x60\x8e\xe7\x24\x47\x6c\x4d\xea\x9a\xe6\x84\x23\xa3\x4d\xdc\x93\x2f\x2d\x0e\x44\x10\xb8\xd3\x98\x1e\x61\xf0\x5f\x14\x06\x3f\xe1\x98\xe4\x28\x2f\xf1\xd4\xb6\xf2\xc2\xf9\x8a\x96\x89\xb0\xae\xcf\xab\xbe\x82\x70\xf6\xc2\x0e\x19\xf9\x4e\x6f\x5c\xbb\x1c\x44\x78\x86\x0b\x72\xf3\x6b\xc4\x61\x64\x06\x77\x76\xcf\x23\xfa\x43\x07\xd9\x74\x27\x2c\xc7\x7f\x98\xc9\x8e\x4a\x96\x8f\xf9\xa6\xff\xbc\x68\xa7\xce\x5c\x06\x30\xc7\x7d\x36\xca\x05\x6e\xc8\x23\x8e\x66\x19\xd7\x5d\xe9\x62\x8a\x9b\x57\x7f\x31\xbd\x41\x3f\x83\xc4\xfd\x40\x56\x6b\xd6\x80\x45\x76\xc5\x56\x98\x46\x33\x29\x39\xe0\xd0\x6e\xb3\xa6\x46\x1c\x02\x79\x62\x17\x0a\x9c\x33\x00\x77\xac\x15\xe7\x2c\x75\x02\x3a\x22\x5d\x1e\xd8\xa8\xb0\x36\x85\xe3\x04\xd2\xa9\xbe\x96\xc4\x46\xbd\xc5\x80\x23\xcb\x06\xaa\x11\x27\x25\xa7\x32\x0a\xe4\x24\x27\x28\xfe\x50\x20\x9f\x85\x4c\x5d\x30\x3c\x7c\x2b\xef\x23\x5b\xd0\x52\xaf\x5b\xa6\x42\x9a\xf7\xd8\x67\x8b\x1c\x2d\x85\x17\xb5\x14\x38\x2f\xae\x4b\x3c\x2f\x7c\xe1\xb4\xae\xe2\x2f\xf0\x42\x4c\x3a\x22\x9f\x3a\xcf\x29\x17\xff\xa2\xd9\xec\xa3\x74\xa4\xb7\xa5\xb6\x6c\x03\xa9\xcd\x4a\xed\x99\x6a\x1e\x58\xb6\xfb\xad\x27\xd0\x3b\x09\x48\xa4\x37\x65\x2e\x9a\x4b\x78\x27\x3f\x49\xc9\x01\x90\x55\x93\x62\x2e\x33\x39\xfc\xf1\x9a\xbb\x25\xcd\x1e\xa6\x8e\xbf\x9c\xd5\xe2\xb3\xd2\xf9\xa8\xb3\x1d\xf5\xbf\xdb\x47\x61\xaa\x46\x4f\xe3\x8f\xad\x77\x8e\xc6\x9f\xa9\x2e\x8b\xc7\x11\xe6\x9c\x65\xd4\x06\x48\x02\x80\xa9\x76\xb3\xc8\xe5\x66\xb1\x5f\x37\xe4\x4e\xbf\xe3\xfe\xa5\x5f\x9c\x26\xc6\xe6\xce\xae\xe4\x3f\x84\xaa\x71\xd8\xab\xe9\x30\x51\x12\x98\x1a\xee\x3a\xdc\x0c\xda\xf6\x03\x8f\xbe\xf1\xdb\x2b\x0f\x60\x58\xa9\x6b\x6b\x4c\xd1\xe1\x6c\xbf\x44\xc3\xd1\xa0\x02\xcd\x4f\xe8\xfb\x57\x56\xd2\xc8\xb7\x66\xdf\x1b\xfb\x7e\xdc\x66\x0c\x59\xe4\x9e\x22\xaa\xa1\xf3\x79\x2f\x6c\x09\x9f\x29\x67\xbf\x4c\xdc\xaa\x58\xd5\x16\x78\x34\x6e\xb9\x45\x7c\xb1\x07\x05\x0c\xfc\xfa\xae\x21\x81\x74\x14\x66\x7f\x91\x41\x17\x90\xd9\xef\xc1\xd7\x50\xcd\x71\x80\xcc\x61\x88\x91\x86\xa1\x6f\x7f\xf8\xfe\xfb\x31\xf0\xe6\x51\x88\x66\xaf\x85\xea\x03\x6f\xf6\x41\x34\x7b\x85\x7a\xc1\x9b\xc7\x4a\x04\x7c\xc1\xba\x71\xf0\xe6\x71\x73\xe0\x70\xe8\xcd\x01\xdf\x6a\x6a\x3d\x9f\x5b\xab\xe7\xf3\x70\x85\xab\xf8\x86\xeb\xdb\x3c\x32\x3d\xb5\x7b\xfe\xba\x3c\x9f\xcc\x81\x8a\xbd\xc8\x6a\xbc\xc0\xd9\xc9\x26\x3a\x1c\xaa\x06\x2f\xa9\xf2\xce\xad\xaa\x0b\xb4\xd4\x5f\x6f\x37\x52\x4b\xe7\x91\x39\x5c\x65\x17\xae\xa0\xf3\x88\xec\xd4\xd6\x05\x2a\x2d\xd2\xd0\xc4\xc3\x35\x72\x51\xd5\x6f\xb1\x99\xd8\x11\x95\x6e\x7b\xd6\xb7\x45\x27\xdd\xc5\xd4\xb2\xa5\x6c\x2e\xb6\x2e\x2d\x20\x14\xf9\xeb\xd6\xc6\xaa\xd1\x82\x52\x87\xab\xd5\x7c\x35\x68\x41\x91\xfe\x6d\x64\xb7\xca\xb3\xe8\x7a\x33\x67\xcb\x08\x0a\x8d\xae\x32\x4b\xa9\x2d\x8b\x4f\x5e\x8d\x49\x5c\x8d\xaf\x1e\x73\x6a\xc2\x82\x1d\xf7\xd7\x8c\x0d\x57\x82\x45\xcd\xa4\xed\x4a\x31\x7f\xfd\x57\x50\x68\x4c\x7d\x58\xe4\xe2\x8d\xc9\x96\x0d\x55\x80\x05\x33\x69\x0f\x92\x1e\x1b\x53\x65\x94\x5e\x5b\x64\x76\x17\xaf\x96\xf7\x97\x14\xc5\x3b\xf3\x52\x78\xfa\x5c\x1f\x95\x3a\x7a\x68\x03\x17\x12\x8c\x2c\x68\xa1\xd7\x82\x68\x47\x82\xa4\x87\x3a\x7c\xa0\x98\xc9\x16\x3a\x98\xc1\xef\xb1\x18\x62\x5b\xe5\x8b\xf8\x75\xd6\x0b\x97\x98\x8f\x8f\x51\x92\x57\xce\x09\x77\x74\xee\x6f\x77\xd2\x3a\xf7\x79\x07\x42\x49\x3b\x25\xc0\x76\xba\x67\x35\x62\x73\x05\x1e\x1b\xb0\xd5\xed\x82\xb9\x98\xde\x88\xf3\xbc\xac\x18\xc3\x05\x3f\x43\x03\xf5\xfb\xca\x0c\x0a\x9d\x7f\xec\x09\x07\x37\x0d\x59\x55\x8d\x6f\x2a\x1c\x7d\xfb\x2f\xea\xdb\x4f\x76\x48\xfe\x6e\x1e\x30\xd4\xc8\xed\x0a\x97\x13\xb1\xda\xa4\x97\xdf\x71\xb6\x7a\x7a\xd0\xd7\xd4\x67\x48\x67\x33\xcb\x01\x95\xae\x1b\x59\xc8\xd0\xe1\x68\x47\x3e\x1f\x81\x65\xef\x3d\x8c\x87\x56\xca\x4a\x1e\x15\xd8\x8c\x7b\xeb\x33\x63\xfd\x9c\x5a\xaf\x0a\x92\x5d\x35\x23\xa4\x97\xa2\xb3\xd7\x77\x4e\xec\xcd\x92\x84\xb2\xf7\xa7\xb2\xfa\xc6\x3e\xdf\x3d\xc3\xc0\x21\x06\x17\x05\x7b\x84\xf6\xda\x7d\x30\x30\xdc\xb2\x67\x50\x22\x28\x6b\x51\xa8\x38\xe8\x2b\x6f\xb2\xdb\x05\xa9\x93\x1a\x71\x4a\xf2\x1a\xfe\xf2\x68\x50\xab\xd0\xe2\x8c\x34\xee\x64\x13\xc7\xe8\x12\x12\xd2\xc5\xff\x75\x66\x53\xa0\xe3\x3a\x70\x34\x27\x4b\xbc\xa6\xac\xad\x41\x6e\xc3\xd0\x37\xea\x2b\xb9\x69\x6d\x58\x6b\x9c\x85\x6d\x20\x61\xd6\x8c\x22\x1f\x78\x53\xb7\xf6\x4b\x79\x98\xcb\x99\xf6\xa3\x4c\xc8\x17\xea\x2d\x27\xdc\x1a\x33\xfd\x92\x34\x6a\xe7\x93\x19\x5e\x6b\x5e\x89\x5d\x31\x9a\x72\xf4\x77\xf7\xfe\xae\x01\xb6\x9e\xc9\xaf\x5e\x1b\xe1\xe8\xd1\x04\x1b\xba\x4c\xb8\xb0\xa0\xd9\x26\x9a\x6c\xd3\x86\x09\xc5\x63\xe8\x3d\xe6\x24\x47\xbf\xe0\x12\x2f\xe0\xec\xfb\x66\x36\x7d\xff\xcb\x5b\xf1\x0a\x03\xee\x8d\x9b\xab\xa1\x28\xa3\x96\x0f\xe2\x6f\xf7\xab\x4f\xe9\xf5\x31\x61\x1b\x3c\x58\x2f\xf7\xac\xb0\xd1\x1b\x96\x1f\xed\x7c\xbb\xc0\xb7\x4f\xa2\xdc\x5b\xb8\xeb\x55\xfe\x84\xe4\xc8\xb6\xc9\xe9\xea\x6a\x5c\xf6\x64\x18\x76\xcf\x23\x6d\xd8\xdb\x30\xf8\x00\x6f\x70\xd3\x76\xb4\x4d\xd7\xe0\xfc\x45\xac\xf1\x9a\x40\xb5\xfa\x5c\xe2\x27\xe4\xea\x21\xbd\xf1\x5f\x14\xa4\x6e\x56\x72\x8a\xd4\x28\x2b\x5a\xde\x90\x1a\x0e\x26\xb2\x64\xb3\x3b\x09\x6e\x99\x38\xe9\x67\x45\x9b\x4b\x9f\x3c\x29\x35\xc2\x81\x2c\x2b\xa8\xd9\xaa\x0b\xd5\x70\x0a\xc6\x92\xf9\x62\x5a\xb3\x15\x69\x96\xa4\xed\xee\xe0\xbf\x4a\x25\xc4\x6a\x69\xed\x03\xd6\xc5\xa0\x55\xbc\xa0\xcd\xb2\x9d\x9f\x65\x6c\xe5\x18\xc8\xe7\x2a\x77\xa3\xd9\x9c\xcf\x0b\x36\x3f\x5f\x61\xd1\x03\x61\x2e\x37\x35\x9d\xb7\x0d\xab\xf9\x79\x4e\xd6\xa4\x38\xe7\x74\x31\xc1\x75\xb6\xa4\x0d\xc9\x9a\xb6\x26\xe7\xb8\xa2\x93\x8c\x95\x6b\x31\xdd\x58\xc9\xcf\x56\xf9\x5f\x85\x8a\x9a\xe0\x32\x9f\xc0\x20\xb9\xd6\xee\x98\x76\xc7\x6b\x4c\x0b\x61\x63\x7e\x22\x42\x09\xe2\x2d\xe5\xdf\x75\x09\xb2\x06\x17\xa8\x6c\x57\x73\x52\xcb\xe8\xb9\x7e\x1a\x55\x2c\xe7\x70\x3c\x84\x9a\x4c\x53\xbb\xbf\xa2\xa5\x78\x1d\x1b\x85\x2d\xb1\x0d\x52\xdc\xe0\x7a\x41\x5c\xae\xd7\xc1\x77\xda\x7b\xcc\xe7\x22\x1d\x77\x89\x56\x58\x18\x67\xde\x1e\x7e\xb2\x3b\xaf\x76\x6f\x09\x13\x09\x03\x3d\xaa\x2e\xd1\x6e\xcb\x9c\xd4\x05\x96\x48\x0e\xd0\xd2\xed\xed\x58\x9d\x69\xa4\x0d\x34\x27\xe2\xce\x8a\xd4\xa2\xdd\xc2\x3c\x94\xe7\xdf\x5c\xec\xcc\xc4\xc8\x36\x21\x2c\x73\xdb\x60\xc7\x86\x8e\xbf\xf5\x2e\x2f\xaf\x64\xe5\xa4\x21\xf5\x8a\x96\x72\x33\x90\x6f\xd0\xfb\x32\xb6\xba\xa8\x5e\x0e\x7a\xd3\x2c\x09\xad\x15\x4f\x08\x5a\xe1\x26\x53\x5e\x57\x89\x9a\xcb\xea\xb7\x87\x79\x7d\x6d\xb9\xdf\x6c\x75\x9e\xdf\xa3\xb7\x07\xea\x4b\x95\x8b\x51\xdf\xa9\x1f\x87\x7b\x71\x72\xc7\x5a\xe2\x35\x38\x66\x72\xc2\xc5\x2e\xa0\x79\x34\xe4\x71\xe8\x10\xbd\x1d\xda\x5e\x26\xdb\x9a\xa7\xf3\x2d\x2c\xd5\xce\x47\xf5\xd0\x7d\x03\x73\xa2\xfb\x7d\x77\x9c\xfd\x5b\x52\xbf\xa1\x13\x39\x04\x7f\x19\xbc\x5f\x0d\xd2\x3b\xb4\xfe\xce\xfe\x25\xdf\xe3\x44\x41\x92\xcb\x2f\x00\xb8\x8a\xe4\xef\x50\x53\xb7\xb0\x91\x2a\xf3\x48\x7d\x62\x37\x41\x9c\x65\xa4\x6a\x48\x2e\xcf\x3b\xd0\x84\x07\x5a\xe6\xef\xd0\x37\x00\x9e\x5d\x15\x6d\x8d\x0b\xf5\xa7\x50\xa6\x54\xea\x8d\x77\xe8\x7f\xfe\xf7\x2f\x20\x95\xe4\xbf\xeb\x76\x88\x0f\xff\x3f\x00\x00\xff\xff\xf5\x63\xc4\xb9\xbe\x0f\x04\x00") +var _examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdc\xb8\x95\x28\x0e\xff\x9f\x4f\x81\xd2\xa4\x4a\x76\x3d\xdd\x2d\x3b\xc9\xcd\xcd\xf5\x4d\xed\x96\x62\xc9\x89\x9e\x8c\x65\x95\xa4\xf1\xdc\xfc\x5e\x6a\x82\x26\xd1\xdd\x58\x91\x00\x03\x80\x2d\xf5\xec\xee\x77\xff\x15\x0e\x00\xbe\x34\x09\x10\x6c\xb5\x6c\x27\x43\x6e\xd5\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x7e\x7e\x35\x9f\xcf\x7f\x85\x0b\xfa\x99\x08\x49\x39\x7b\x87\x70\x41\xc9\x93\x22\x4c\xff\x4b\x2e\x1e\xfe\x20\x17\x94\x9f\x6d\xdf\x2e\x89\xc2\x6f\x7f\xf5\x40\x59\xfa\x0e\xbd\x2f\xa5\xe2\xf9\x2d\x91\xbc\x14\x09\xb9\x20\x2b\xca\xa8\xa2\x9c\xfd\x2a\x27\x0a\xa7\x58\xe1\x77\xbf\x42\x08\x33\xc6\x15\xd6\x3f\x4b\xfd\x4f\x84\x12\xce\x94\xe0\x59\x46\xc4\x7c\x4d\xd8\xe2\xa1\x5c\x92\x65\x49\xb3\x94\x08\x18\xc1\x8d\xbf\x7d\xb3\xf8\xcd\xe2\x77\xbf\x42\x28\x11\x04\x3e\xbf\xa7\x39\x91\x0a\xe7\xc5\x3b\xc4\xca\x2c\xfb\x15\x42\x0c\xe7\xe4\x1d\xc2\x19\x11\x2a\xc7\x0c\xaf\x89\x90\x8b\x9c\x33\xaa\xb8\xa0\x6c\xbd\x48\xb8\x20\x5c\x2e\x12\x9e\xff\x4a\x16\x24\x81\xc9\xa4\x29\xcc\x10\x67\x37\x82\x32\x45\xc4\x7b\x9e\x95\xb9\x99\xd9\x1c\xfd\xff\xef\x3e\x5d\xdf\x60\xb5\x79\x87\x16\xfa\x83\x85\x9d\x0b\xcc\x3a\x25\x32\x11\xb4\x50\x30\xb7\xfb\x0d\x41\xf6\x8f\x88\xaf\xd0\x79\x63\x06\xf0\xb2\x99\xd8\xe7\xc6\xe7\x6a\x57\x90\x77\x48\x2a\x3d\xb1\xde\xb1\x04\x29\x32\x9a\x60\xd9\x3f\x58\x4a\x24\x15\x24\x45\xee\x2d\xc4\xca\x7c\x49\xc4\xfe\xe0\xb2\x31\xfa\x6d\x13\xa0\x19\x5e\xaf\xd8\x4c\xb1\x35\xbe\xdb\xad\x45\x07\xd3\x0d\x70\xe7\x6b\xd2\x80\x94\x62\xa5\xff\xb9\x16\xbc\x2c\xde\xa1\x7e\x9c\x9b\x2f\xed\xa6\x1b\x82\xe9\x20\x2a\xa3\x52\xfd\xb5\xf3\xa7\xef\xa9\x54\xf0\xe7\x22\x2b\x05\xce\xf6\xb6\x18\xfe\x22\x29\x5b\x97\x19\x16\xed\xbf\xfd\x0a\xa1\x42\x10\x49\xc4\x96\xfc\xc0\x1e\x18\x7f\x64\x1f\x28\xc9\x52\xf9\x0e\xad\x70\x26\xf5\x8c\x65\xc2\xf5\xfc\xaf\xf5\xcc\x0a\x9c\x90\x54\xff\x56\x2e\x85\xa5\x61\xf9\x0e\xfd\xe7\x7f\xff\x0a\xa1\x2d\xce\x68\x0a\xb8\x30\xd3\xe7\x05\x61\xe7\x37\x57\x9f\x7f\x7b\x97\x6c\x48\x8e\xcd\x8f\x7b\xfb\xd4\x5c\x81\xfd\xcb\x92\x48\x84\x59\xfb\x2f\x49\x56\x4a\x45\xc4\xc2\x82\x28\x04\x2f\x88\x50\xd4\x21\x4a\x3f\x8d\x63\x58\xfd\xb6\x37\xd8\xa9\x9e\x8d\xa5\xc0\x54\x1f\x3c\x22\x91\xaa\xa9\x92\xa4\x48\xc2\x4c\x35\x85\xa8\x0d\x95\x9a\x72\x34\x66\x98\x39\x8a\x0d\xb0\x48\xbf\x82\x19\xe2\xcb\xff\x20\x89\x5a\xa0\x3b\x8d\x3d\x21\x91\xdc\xf0\x32\x4b\xf5\x69\xdd\x12\xa1\x90\x20\x09\x5f\x33\xfa\x73\x05\x59\x22\xc5\x61\xc8\x0c\x2b\x62\xf7\xcb\x3d\x70\xb4\x18\xce\x34\x1e\x4b\x32\x43\x98\xa5\x28\xc7\x3b\x24\x88\x1e\x03\x95\xac\x01\x0d\x5e\x91\x0b\xf4\x91\x0b\x82\x28\x5b\xf1\x77\x68\xa3\x54\x21\xdf\x9d\x9d\xad\xa9\x72\x8c\x27\xe1\x79\x5e\x32\xaa\x76\x67\xc0\x3e\xe8\xb2\x54\x5c\xc8\xb3\x94\x6c\x49\x76\x26\xe9\x7a\x8e\x45\xb2\xa1\x8a\x24\xaa\x14\xe4\x0c\x17\x74\x0e\x13\x67\xc0\x77\x16\x79\xfa\x5d\xb5\xc3\xa7\x8d\x99\xee\x9d\x4a\xf3\x00\xa9\x7a\xf1\xae\xa9\x15\x51\x89\xb0\xfd\xcc\xcc\xbf\x46\xaf\xfe\x49\x63\xe5\xf6\xf2\xee\x1e\xb9\x41\x61\x0b\xda\x38\x07\x6c\xd7\x9f\xc9\x1a\xf1\x1a\x51\x94\xad\x88\x30\x1b\xb7\x12\x3c\x07\x88\x84\xa5\x05\xa7\x4c\xc1\x3f\x92\x8c\x12\xd6\x46\xba\x2c\x97\x39\x55\x7a\xa7\xff\x51\x12\xa9\xf4\xfe\x2c\xd0\x7b\x60\xbf\x68\x49\x50\x59\xe8\x43\x9b\x2e\xd0\x15\x43\xef\x71\x4e\xb2\xf7\x58\x92\x17\x47\xbb\xc6\xb0\x9c\x6b\x94\x0e\x23\xbe\x79\x6b\xb4\x5f\x34\xd8\xaa\x7e\x76\xdc\xbc\x7f\x87\xee\x0a\x92\xd0\x15\x4d\x80\xd0\x0d\xfd\xd7\x0c\x74\x49\x36\x78\x4b\xb9\x70\xbf\x77\x38\x92\x7b\xdc\x31\xf5\x20\x68\x53\x2e\x35\x93\x3b\xd3\xb7\x97\x60\x44\x11\xd9\xc0\xd5\x32\xe3\xcb\xb3\x1c\xeb\xef\x0f\xc5\x9b\x5e\xe2\x1c\xb3\x74\x2e\x15\x56\x65\x0b\x77\x7d\x1c\x03\xb8\x46\x7d\xb7\x11\x22\xf6\xfe\xb8\xcf\xab\xda\xef\x22\x9c\x65\xfc\x51\x22\xca\x34\x9e\x35\x09\x63\x24\x89\x02\xce\x50\xbd\xd9\x73\xd3\x34\x1f\xc5\x51\x41\x88\x40\x8f\x54\x6d\xf4\x3f\x56\x5c\xe4\x08\xa3\x0d\x5d\x6f\xb2\x1d\xc2\x5b\x4c\x33\xbc\xcc\xc8\x3e\xff\xab\x58\x86\x22\x79\x67\xce\x1e\x42\x69\xfe\x09\x0b\x81\x77\x6d\x3c\xac\x40\x0e\xd9\x05\x11\x70\xb5\x02\x2a\xa2\x2b\x4a\xd2\x19\x50\x42\xc1\xd3\x53\x09\xbc\x2d\x2d\x33\x8d\x82\x84\x33\xa9\x04\xa6\xfa\x70\xee\x81\xf2\x6d\x81\x7e\x18\x4f\xc9\xb9\x67\x0a\x9d\x69\x5c\x54\xd7\x84\xfe\xac\x9a\x7a\x73\x1a\xa2\xcc\x88\xd4\xd8\x74\xb3\xdc\x9f\xcc\xd0\x84\xcc\xdf\xc9\x8a\x08\x41\xd2\x8b\x52\x63\xf2\xae\x02\x7f\xb5\x66\xbc\xfa\xf9\xf2\x89\x24\xa5\xda\xbb\x76\xbc\x73\xd7\x72\x89\x9d\x27\x6c\x7b\x96\xd9\x61\xf4\xee\xbb\x3f\xe8\x09\xc3\x4d\xa1\xd7\xd7\x25\x1a\xf7\xa8\x0d\x56\x48\x62\x45\xe5\x6a\x07\xeb\xac\x30\x41\x9e\x34\x87\x04\x21\xb4\xde\x31\xb4\xdc\x59\xe6\xa8\xaf\xf7\x99\x17\xec\xb2\x54\x88\x2a\xe0\xa8\xc9\x86\x73\x49\x10\x36\x88\x86\xf1\xb6\x94\xc3\xdd\x85\x38\x23\x88\x0b\x94\xeb\x93\x6e\xf8\x82\x17\x62\x63\x3a\x0b\xc0\x40\x0d\x8e\x4a\x94\x73\xa9\x6a\x5c\xeb\x5f\xf4\x5a\x34\x78\x7d\x2a\x02\xab\x27\x68\xad\x65\x2f\x22\x15\x92\x65\xae\x27\xf1\x48\xe8\x7a\xa3\xe4\x0c\xd1\x05\x59\xc0\xf6\x13\x9c\x6c\x1a\xc3\xe5\x84\x28\x3f\x42\x71\x96\x39\x16\xd7\xa4\x25\xf2\x8f\x92\x0a\x92\xeb\x0b\x07\xbd\xaa\x6e\x27\x7b\x63\xcc\xdc\xdf\x3b\x54\xe2\x1f\xa6\x67\x9b\x66\x88\xa8\x64\xf1\x7a\x86\x12\x9e\x17\xa5\xd2\x38\xd7\x6b\x5a\xee\xf4\x19\x17\xd8\xde\x90\x82\x97\xeb\x30\x46\x48\x66\x27\xea\x44\x18\xd8\x6c\x90\x25\x34\x53\x62\x6b\x74\x62\x90\x74\xe2\x24\x11\x59\xe6\x5e\x88\xd4\x20\x03\xf0\x97\x63\x95\x6c\xac\xc0\x94\x70\x21\x88\x2c\x38\x03\x88\xf0\x97\xcb\x7a\x2d\xff\x3b\x48\x0c\x1a\xd8\x2b\xf9\xda\xb2\xbc\x0d\x01\x66\xe7\xf6\x10\x0b\x02\xbf\xb5\x69\xa2\xef\xf0\x22\x3f\xfb\x73\x4f\x9b\x79\x33\x44\xf2\x42\xed\x1a\x94\xd6\xd8\x63\x45\x44\x5e\xad\x10\x83\x9e\xe4\x7b\xcc\xb5\x2a\xcd\xfc\x69\xae\xf5\x05\xaa\x2c\xe5\xa1\x37\xe8\x15\x90\x1e\x55\xa7\x12\x8e\xcd\x9c\x17\xaf\x17\xe8\xdc\x29\x5f\xbe\x67\x78\x52\x8c\x57\x23\xdb\x21\xf4\x44\x25\x0f\x00\xad\xc6\xf7\xbe\x33\xc4\x01\x9b\x93\x23\x2c\x21\xa1\xb7\xf6\xf1\x6d\xa8\x46\x92\x8c\x24\x4a\xf3\x61\x22\xf2\x19\xc2\x52\xf2\x84\x6a\x91\xaa\xda\xff\x20\x48\xb4\x47\x6a\x06\xcd\xfe\x05\xc5\x2f\x4a\x3f\xfb\x84\x3b\xf4\x7e\x67\x89\x5a\x13\xd3\x27\xad\xbd\xd4\x26\xc3\x18\x84\x88\xf4\x19\xd7\xdf\x9f\x4a\x94\xe1\x25\xc9\x3a\xf7\x66\xf7\x19\xa0\x7b\xef\x74\xbd\xd3\xb4\xb2\xb9\xfd\x4b\x04\x60\x7b\xf9\x68\x39\x0d\x53\x26\xad\x3e\x32\x43\x18\x3d\x90\x9d\x51\x5d\xb4\x76\x54\x68\xd6\x05\x97\x30\x56\x51\x50\x05\x31\x97\x8b\xe6\x01\x0f\x64\x07\x80\xac\xae\x13\xf1\x7d\xfc\xce\x9b\xe7\x81\xf4\x0a\x1b\x7d\x4f\xe7\x12\x87\xbd\x82\x39\x02\x26\x80\x93\x8e\xc1\x1f\x02\x95\xb5\xc8\x28\x01\x9d\x23\xf2\x9b\x80\x64\xd7\xff\xb8\x2d\x38\x68\x9d\xb7\x95\xa2\x65\x36\xf6\x54\x9a\x0d\xd2\x67\x65\x43\x8b\xe8\x75\x2a\x5e\x8b\xc6\x4e\x73\xfd\x8c\x33\x9a\x56\xd3\x93\xc0\xf9\xaf\x98\x5f\x2a\xd9\x7f\xae\xb9\xba\x62\x33\x74\xf9\x44\xa5\xbe\xf0\x2f\x38\x91\xd7\x5c\xc1\x3f\x17\xe8\xcf\xca\xd0\xe0\xf7\x03\xac\xa2\x31\xc5\xb1\x88\x35\xeb\x38\x08\xad\xe7\xcc\x08\xe0\x1a\x1d\x4d\x7d\x58\x2e\xb4\x84\x3d\xcc\x12\xeb\xa7\x3a\x60\x54\x6a\x0d\x95\x0b\x87\x16\xb0\x6a\x00\xcc\x1e\x59\x3f\xf4\xe4\xa5\x04\xc5\x97\x71\x36\x87\xfb\xd2\xcd\xa9\x35\x96\xc1\x7a\xfc\x34\x45\x6b\x7f\xba\xd3\x73\xc3\x46\x43\xf4\x4f\xed\xcf\x4a\x0f\xf7\x7d\x6b\x90\xf8\x03\x59\x4f\x66\x83\xb7\x20\x84\x51\xb6\xce\x2a\xb1\x6a\x86\x1e\x37\x34\xd9\x80\xdc\x1e\x0d\x74\x49\x8c\x69\xa7\x10\x44\xdf\x7b\x18\xac\x5b\xd6\xaa\xa8\xc5\x61\xea\x90\x40\xe3\x27\x2a\x48\x91\xe1\x84\xa4\x28\x05\xa1\xd3\x18\x56\xb0\x22\x6b\x9a\xa0\x9c\x88\x35\x41\x85\xbe\xdb\x62\xa9\x3f\xfa\x42\x31\xcf\xe8\xc3\xe2\xd7\x3b\xfb\x1f\x27\x52\xc7\x4c\x69\xae\x39\x53\xd4\x7b\x8e\x4c\x22\x5e\xee\xb5\xa0\x84\x5f\x8e\x59\x1b\x08\x1c\xd6\xba\xfa\x95\x65\x0d\xd0\x0b\x26\x59\x63\x92\x35\xbc\xcf\x24\x6b\xb8\x67\x92\x35\x26\x59\x63\x92\x35\x26\x59\xe3\x9f\x48\xd6\x88\x04\x6a\xec\x29\x23\xcc\x3a\x3f\x1a\x3b\xd7\xbe\x1d\x07\x04\x1b\xe7\xc5\x6b\x99\x6c\x06\x56\xa4\xc5\x84\x3b\x7b\x97\xdd\x83\x89\x88\x32\x00\x22\x30\x5b\x13\xf4\x76\xfe\xf6\xcd\x9b\x30\x65\xad\xb8\xc8\xb1\x02\x3f\xfd\x6f\x7f\x13\x81\x93\xda\x9f\xdf\xff\x0c\xd3\xc3\xbc\x61\x11\x0b\xbc\x64\x70\xeb\xb7\xd6\x0e\xef\xd0\xd0\x66\xfb\x2c\xcf\xcf\xf0\x4f\x58\x2e\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\xc1\xbb\x38\x6b\x75\x16\x9a\xb9\x2b\x94\x13\x85\xb0\x6a\x99\x36\x69\x4e\x2a\x0f\x92\x71\x83\x18\x8f\xab\x17\xa2\xf3\x8d\xa4\x88\x33\x6b\xb9\xd6\xb4\xb3\x88\x9c\xb1\xdf\xdb\xd1\x74\x8a\xa0\x84\x60\x49\xb4\x0c\xb1\x24\xd5\xac\x79\xae\x67\x49\x99\x72\x0c\x50\x4f\x99\x38\xac\x7a\x01\xbf\x22\x8b\xf5\x02\xa5\x25\x80\xc3\xcc\xba\x92\x5f\x9b\x55\xcb\x9d\x54\x24\x07\x1f\x0b\x17\xf0\x3f\x7a\xf9\x4a\xec\x90\xf2\x5b\x74\xc9\x96\x30\x55\xe2\x2c\xdb\x21\xb2\xa5\x89\xaa\xf0\x07\xde\x6e\xaa\x8c\x3f\xcc\x77\x5a\x62\x04\xd6\xfd\xd3\x18\xe4\xd3\x7b\xe2\x9b\x21\xc5\x85\x57\x53\x51\x1a\x1e\xb8\x7f\xc2\x87\x54\xbf\x06\x94\xf3\xe9\xd6\x6f\xf9\x47\x71\x17\xc9\xbe\x4e\x52\x66\x99\xc6\xb7\x71\x04\x74\xa7\xe7\x8c\xed\x83\x3c\xcb\x99\xe2\x8d\x37\xab\x45\x71\xc6\x7f\x64\x3c\x19\xe7\xd7\x17\x1a\x23\x43\x4b\x46\xe8\x9e\x17\x3c\xe3\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\x60\x21\x63\x24\xcb\xa5\x95\x6c\x87\x05\xb7\xeb\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf7\x4c\x7a\x6c\xe7\x99\xf4\xd8\xc8\x29\x4e\x7a\x2c\x3c\x93\x1e\x3b\xe9\xb1\x83\xcf\xa4\xc7\xf6\xbc\x3c\xd9\xcc\x27\x59\x23\xf0\x4c\xb2\x46\xe7\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\x08\x3e\x93\xac\xd1\xf3\xf2\xd1\x6c\xe6\xc3\xe0\x86\xd0\x33\xef\x1a\xda\x82\x16\x60\xef\x94\x82\x7f\x2e\x78\x7a\x40\x48\x7d\xc1\xd3\x40\x44\xbd\x31\x6a\x26\x7c\x9e\xf1\xc4\x64\xb3\xf5\x4c\x4a\x9f\x18\x0d\xc6\x5a\xf2\x25\xce\x8d\xad\x76\x86\x7e\xe6\x8c\x98\x48\x67\x7d\xcc\xc0\xb2\xca\xd5\x86\x08\xfd\xfa\x2b\xf9\xba\x37\x52\x75\x8a\xd2\xef\x7d\xa6\x28\xfd\x29\x4a\xdf\x3e\xcd\x28\xfd\x0d\x96\x86\x2e\xcd\x45\xe8\x0f\xda\x6f\x70\x07\xcd\x80\xfe\x77\x70\xbe\x5f\x29\x66\x5f\x13\xa1\x25\x16\xc8\xaa\xaa\x37\xde\xac\x2b\xb5\xee\x48\x92\xde\xb4\x57\x13\xe0\xde\x46\x87\x83\x49\xe3\x34\x25\x29\x2a\x88\x98\x1b\xd2\xe3\x68\x45\x59\xda\xb3\x16\xb7\x7e\x2f\xd8\xc8\x38\xfa\xf6\x24\x47\xb8\x2e\x9a\xde\x95\x16\x83\xde\x8f\xaa\x1f\xb8\x0b\xab\xfd\x7b\xc9\xa8\x7a\xd0\xbc\xdc\xe5\x36\x5e\x65\x07\xbd\xed\x1f\x25\x11\x3b\xc4\xb7\x44\xd4\x9a\x49\x95\x8c\x1a\xa3\x84\xc0\xdd\x43\x25\x4a\xb0\x34\x8c\x7a\x58\xd4\x1a\xa7\x9d\x8e\xf7\x83\x74\x16\xbb\x0f\xc2\x68\xf9\xce\x66\x01\x88\x88\x94\xde\x7a\x4d\x1b\x3d\xce\x29\x2c\x62\x45\x78\xe3\xba\x8a\x7a\x79\x94\x70\xda\xbb\xdb\x1e\x93\x47\xbc\x5a\xd0\x70\xe3\x0d\x98\x3d\xe2\x61\xee\x99\x47\x9e\x69\xfa\x40\x07\x98\x3f\xd0\x38\x13\x08\xda\x47\xaf\x9e\xa5\xbd\xa7\xbb\xd6\x90\x11\x40\x1b\xf4\x35\xde\x22\x82\x0e\xd3\x47\xc6\x5b\x46\xd0\xfe\xf2\xab\xed\x13\x1d\x33\xc9\xa8\xc5\x37\x4d\x2a\x7e\x53\xc9\x28\x90\x1d\xb3\x4a\xdb\x5c\x02\xb4\xd5\xb2\x98\xbc\x34\xb2\xc7\x59\x4b\xd0\x3e\xaa\xad\xad\x80\x82\xea\xbc\x67\x3b\x19\x85\x98\xb6\x9d\xc5\x6b\x3f\x19\x05\xd3\x67\xcc\x68\xdb\x50\x46\x83\xec\xda\x5b\x3a\x76\x94\xe3\x4c\xd3\x4e\xb1\x36\x44\x8c\x02\x6b\xaa\x58\x1c\xd3\x18\x81\xc6\x1b\x24\xd0\xa1\x74\x39\xd6\x30\x81\x46\x1a\x27\xd0\x08\x03\x05\x1a\x6b\xa4\x40\x63\x0d\x15\x68\xf4\x7a\x41\x84\xf8\x1e\x42\x20\xe2\x96\xdb\xac\xe5\x33\xf6\x36\x1a\xbd\x83\x5d\x69\xc7\x4c\xd5\x08\x3a\x39\x2e\x34\x97\xf8\x4f\x7d\x35\x03\xe1\xff\x77\xec\x3d\x8a\xa9\x90\x5a\x14\xb6\xc6\xbf\x06\x04\x67\x73\x68\x0c\x16\x09\x54\xcf\x86\x4a\xa4\x69\x67\x8b\x33\x2d\x80\x98\xb0\x2d\xab\xaa\xe9\x99\xee\xcb\x6b\xb1\xe7\xfb\x71\xa3\xd5\x73\x7d\xf9\x1a\x35\x8f\x4a\x74\xf2\x40\x76\x27\xb3\x0e\x1f\x39\xb9\x62\x27\xb1\x50\xb1\x55\x55\x5a\x3c\xa3\x92\x7c\x38\xcb\x76\xe8\x04\xfe\x76\x12\x7b\xb0\xfb\xc4\xc5\x31\x82\xe0\x01\x46\xb9\xa8\x97\x99\xab\x3b\x34\xd6\x01\x58\x7f\x58\xd9\x57\x9c\x62\x5c\xff\x29\xc6\xda\xe8\x24\xa8\xbb\xae\x1c\x84\x5e\x55\x69\xe3\x6b\x8d\x79\xf5\xda\xaf\x4a\x37\x96\xd4\x8a\x44\x03\x91\x3f\x27\x98\x49\x74\xe2\xac\x67\xa7\xb2\x9e\xe3\xc9\xf1\x3c\x8e\xa3\xce\x70\x3c\x2f\x52\x36\x80\xed\xaf\x31\xe2\xea\x9e\x8e\x6f\xad\x85\xb6\x74\xd2\x92\xd4\xe6\xc5\x14\xbd\x72\x9a\xae\x5f\xf7\xae\x1f\x2e\x20\x8a\xb2\xf5\x39\x53\x74\x5e\xc1\xa8\xf5\x5f\xad\x11\xc6\xb2\x57\x17\xd6\xdc\xa6\x00\x67\xdc\xac\xec\x76\x35\x45\xc5\x9c\xe0\xc7\x0d\x11\xad\x95\x52\x69\x4b\x52\x81\x07\x42\x94\x8c\xe9\x71\x39\xb3\x66\xbd\x28\x90\x9a\xcd\x98\xca\x4a\xd6\x4c\x62\xc4\x7e\x58\x35\xc8\xfe\xf5\x2e\x45\x86\x3a\x22\x67\xc0\x84\x72\x57\x36\x66\x92\x33\x7b\x88\xf4\x2f\xce\x12\x07\x78\x21\x69\x2c\x66\x69\xb5\xc6\x05\xba\x84\x43\xd0\x9c\x1c\x95\xb0\x93\x50\x60\x27\x86\xfb\x44\x53\x75\x9c\x6c\x30\x6f\x4e\xe6\x18\x2e\x83\xd1\x61\xf6\x8f\x47\x0e\xb3\xdf\x33\x3d\xfd\x93\x44\xd9\x47\x1a\xf5\xa6\x50\xfb\x29\xd4\xbe\x11\x6a\x0f\x1f\x19\xce\x37\x1c\x73\xef\xa7\x19\x88\xc5\x8f\x8d\xb9\x47\x3f\x6e\x08\x9c\xa8\x80\x81\x4d\x6f\x51\x5e\x66\x8a\x16\xb5\xc3\x5a\x9a\xa9\x65\x46\x7d\x34\x81\x4a\x72\xcf\x3a\x1b\xca\x08\xc0\xc9\x66\xff\x98\xc0\x38\xe0\xd0\x96\xc0\x91\xad\x9b\x05\x67\x99\x8d\xad\xd7\x7a\xa5\x7f\x8f\x88\xf5\x55\xd1\xe3\x98\xf0\x2f\x6c\x99\xc5\xca\x68\x02\xce\x89\x57\xfa\xb2\xcc\x34\x39\xe8\x2b\xcb\x71\xb5\x90\xcf\xb5\x73\xff\x1a\xab\xcc\x96\x38\x07\xc9\x9a\x6e\x09\xab\x2f\xe1\x57\xf2\xf5\xeb\xa1\xb0\x26\x15\x29\x7a\x74\x05\x8b\x00\xd0\x3e\x91\x63\x16\x79\xdd\x07\xc0\x56\x82\x40\xc4\x35\xff\xc7\xc6\xed\xf5\x6f\x01\x98\xb5\x73\xc8\x7b\xc1\x03\x7a\xaa\x2b\xbe\xda\xc0\x00\x50\x3a\xbc\x9a\x38\x3b\xe8\x08\x37\xc2\x01\x2e\x04\x44\xfd\xec\xc4\x3c\x63\xdc\x07\x5f\x2c\x7d\x22\xc2\x65\x30\x26\xcc\x6d\xd8\x5d\x10\xab\xff\x1d\x1a\xf2\x18\x74\x00\x4c\x31\x8f\xc1\x27\xde\xd8\xff\xaf\x17\xfa\x18\x30\xee\x7f\xa3\x31\x90\x07\x1b\xf5\xbf\x64\xe8\x63\xc8\x90\x3f\xd2\xdb\x85\x86\x8c\xf8\xcf\x0c\x00\x1c\x0a\x82\x8c\x86\xe9\x31\xde\xf7\x1b\xe4\xa3\xa1\xf6\x19\xee\x7b\x8d\xf1\xd1\x10\xa7\x08\xc2\xc1\xf7\xbe\x76\x04\xe1\x48\x83\xfc\xa1\xc6\xf8\x51\xbb\x33\xd6\x08\x6f\xcd\xeb\x11\xd3\x88\x34\xc0\x77\x4d\xeb\x31\x4b\x1c\x34\xbe\xef\x9b\xd5\xe3\x8c\x4e\x21\xc3\x7b\xaf\x49\x3d\x02\x6c\xbf\xd1\xfd\x59\xe2\x54\x34\x75\x46\xbe\x18\x6b\x42\x1f\x6f\x3e\x8f\x88\x25\x18\x61\x3a\x77\x86\xf1\x01\x88\xc7\x30\x9b\x47\x71\xc4\xe8\x93\x16\xc7\x21\xa2\xcd\xe4\x2f\x61\x22\x1f\x69\x1e\x8f\x51\xcb\x51\xaf\x6a\x1e\x32\x8d\x1b\x4d\x78\x00\x64\xbc\x59\xbc\xa9\x0d\x0f\x2d\x3f\xd6\x24\xde\xd4\x87\x87\x3c\x53\x51\xe6\xf0\xae\xb1\x3b\xde\x9b\x32\xca\x14\x1e\x45\xad\x31\x96\xd7\x18\xf3\xf7\xb3\x8d\xaa\x83\xc1\xeb\x4c\xd1\x43\x03\xd8\x9b\x74\xed\x89\x62\xef\x9d\x33\xde\x72\x9a\xa2\xa2\x54\x36\x94\x77\x74\x24\x7b\x2f\xd4\x5f\x54\x74\x7b\x0b\xf5\xc1\x10\xf7\xb0\x49\x7b\x76\x40\x88\xbb\x17\xa2\x3d\x96\x07\x84\xb8\xfb\x41\xda\xd0\xf7\x83\x42\xdc\xbd\x50\x21\xf4\xfd\xb0\x10\xf7\xc1\x13\xbf\x4f\x42\xfe\xbd\x72\x71\xee\x5e\x90\xc3\xf1\xef\x81\x38\x77\xbf\x85\x3c\x18\xff\x1e\x88\x73\xf7\xa3\x33\x3a\xfe\xbd\x13\xe7\x1e\x20\xf9\x29\xfe\x7d\xef\x99\xe2\xdf\x1b\xcf\x14\xff\x1e\xb9\xd8\x29\xfe\x7d\x8a\x7f\x1f\x7a\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x29\xfe\xbd\xe7\x99\xe2\xdf\xa7\xf8\xf7\x29\xfe\xbd\xf1\x4c\xf1\xef\x03\x4b\x99\xe2\xdf\xa7\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\x7b\x5e\xf9\x2a\xf1\xef\x2d\x23\xb4\x37\x08\x3e\x60\x8e\xad\xeb\xa7\x8c\x0c\x82\xf7\xc2\x5c\x92\xe1\x20\x78\xef\xb4\xbd\x50\x3d\x35\x7e\xa2\x22\xe1\xfd\xa6\xd7\x66\x84\xfc\xa8\x48\xf8\x80\xd1\xbc\xa7\x2a\xfd\x33\xab\xcf\xa3\x46\x84\xfc\xa1\x91\xf0\x7e\x12\xe0\x53\x24\xfc\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xbc\x79\xa6\x48\xf8\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\xce\x33\x45\xc2\xf7\x4e\x77\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\xfa\x99\x22\xe1\xdb\xcf\x14\x09\x3f\x45\xc2\x07\x9e\x29\x12\xfe\x65\x22\xe1\xbd\x7f\x5a\x62\x49\xae\x72\xbc\x26\xfb\xb3\x6f\x1d\x98\x3f\x69\xad\x9d\xea\xd7\xaa\x28\xe7\x52\x92\x54\xb3\x9c\x94\x14\x19\xdf\xc1\xb6\xcc\x80\x0a\x78\xa9\x90\xc2\x9d\xc0\x78\x2f\x2a\x13\xce\x56\x74\xfd\x11\x17\x1d\xde\xd1\x9a\xc2\xfb\xea\xb5\xb6\x8a\xde\xfc\xbd\x19\x5e\xef\x4e\x48\x07\x4f\xd8\xe8\x74\xe7\x19\x11\x2a\xc7\x0c\xaf\x89\xb0\x88\x71\x6d\x1f\xe4\x06\x67\x19\x58\x51\x79\xc9\xe0\xcc\x38\xd3\x6d\xf3\xa3\x0e\xe0\x1b\x9e\x5a\x9d\xbf\x31\x27\xb0\x51\x36\xc1\x9c\x11\x95\x9c\xe1\x06\x9c\x33\x83\x80\x1c\x17\xf2\xec\x8f\xd5\x7f\xcf\xf5\x02\xfe\x6d\x1f\x89\x1e\x16\x1b\x20\x53\x1f\xc5\x98\x81\xee\x48\x22\x48\xc7\xa1\xd2\x83\x77\xf3\xa2\xd3\x87\xf5\xdc\xe0\x3c\xa3\xbf\x96\x4b\x22\x18\xd1\xda\xbc\x7b\x85\xf5\x5e\x60\xed\x4d\x89\xd8\x84\x4a\x06\x30\x33\x2d\x05\xee\xad\xdd\xb2\x02\xc3\x03\x95\x6d\x50\xfa\xee\xc3\x2c\x21\x0b\x74\x41\x56\xb8\xcc\x14\xdc\x8e\xa7\x4d\xb4\xcf\xff\xd8\xfa\x17\xa0\xfb\xb4\x03\x1e\x72\x1c\xaa\xb5\x47\x6d\xe4\x18\xc2\xd7\x2b\x24\x62\x90\xf0\xed\x6b\x86\x67\x69\x3a\xd7\x88\x02\x5d\xa7\x92\x77\x1b\xd0\x8c\x82\xd4\x59\x8a\x9e\x3f\xc1\x36\x20\x43\x03\x72\x31\xf2\x5a\x31\x2d\xd5\x86\x30\x45\x13\x40\x32\x2a\x04\x7f\xda\x59\x89\x31\x48\xf2\x05\xef\x30\x50\x0f\x89\xee\x59\xa9\xac\x9c\x0b\xa2\x8b\x1d\xb4\x5a\x80\x61\x31\x3b\x5e\xa2\x47\x3b\x5d\x51\x32\x60\x2d\xbd\x26\x46\xdc\x37\x8b\x21\x33\x11\x16\x6b\x8f\xa8\xd2\x9a\xe8\xe9\xb9\x58\x97\x46\xd6\xb4\x1c\x80\x30\x25\x76\xe0\x51\x31\x47\x3d\xe5\xc9\x83\x26\x38\xcd\x1b\x4f\xbd\x11\x91\xef\x3f\x5e\x54\x3c\x93\xda\x1c\x06\x7b\x0f\x15\x82\x6f\x69\x4a\xd2\x05\xfa\x8c\x05\xc5\xcb\x4c\xcb\xb8\xb6\x2b\xb4\x44\xbf\x7e\xf5\xf9\xfc\xf6\xa7\xeb\xf3\x8f\x97\x3e\x61\x44\x33\x18\xf2\x54\x60\x96\x92\x14\x95\xb2\xf6\x6a\x5a\x6c\x9e\x9e\x4a\x44\xd8\x96\x0a\xce\xf4\x42\x40\xb1\xc7\x68\x6b\xc7\xf2\x00\x4d\x30\x33\xc5\x9d\xc0\xc0\x9b\x6d\x49\x6a\x24\xfc\x6a\x66\x8e\xd7\x52\x56\x94\xca\x99\x33\xc0\x1f\xe6\x2d\x08\x55\xb2\x64\x83\xd9\xda\x76\xb2\x6d\xae\x0c\xc9\x1d\x53\xf8\x49\x8f\x0a\x5a\xbe\x4c\x70\xe1\x5c\xb5\x18\xa5\xbc\xf4\x4f\xf4\xd7\xbf\x9e\x21\x4a\xde\xa1\x5f\x37\xc0\x2d\xd0\xa5\x85\xd0\x40\xa4\xf1\xd5\x91\x2d\x11\x30\x84\x45\x98\xcf\xf2\x24\xc8\x1a\x8b\x34\x23\x12\x7c\x48\x8f\x1b\x02\xdd\x45\x8c\x26\x63\x37\x89\x54\x46\x0e\xc6\xd5\x02\xbd\x77\x18\xf3\xad\x1e\x1c\x67\xe9\x02\x7d\xe4\xe0\x4d\x5a\xf1\x77\x68\xa3\x54\x21\xdf\x9d\x9d\x3d\x54\x4c\x74\x41\xf9\x59\xca\x13\x79\xa6\xb0\x7c\x90\x67\xe6\xa0\xcf\x53\xac\xf0\xbc\x71\x54\xce\x8c\x00\x37\x4f\x78\x9e\x63\x96\xce\xb1\x25\xd2\x79\xb5\xe9\x67\xdf\x59\xf1\x68\x8e\xab\xb7\x28\x9b\xe3\xb9\xdc\x90\x2c\xeb\xb2\x39\x34\x24\xbe\x0f\x0a\x42\x61\xc9\xc4\xce\x21\xe6\xc4\x5d\x56\x07\xcc\x40\x5b\xa0\x6b\xae\xac\x6b\xd2\x12\x05\xd5\xc2\x2a\xac\x24\xd4\x14\x79\xef\x64\xa2\xcb\xeb\xfb\xdb\xbf\xdd\x7c\xba\xba\xbe\x1f\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\xf9\x14\xfd\x07\x74\xf8\x28\xfa\xd9\x82\xf7\x80\x46\x1f\x45\x0f\x6c\xcf\x01\x8d\x3f\x8a\x1e\xb8\x9d\x03\xfa\x0b\x3f\x8a\x84\x6d\x23\x8e\xe1\xf7\x56\xba\x6e\x10\x66\x85\x6f\xb8\x0b\x65\x25\xea\xd5\xf4\xed\x3b\x37\x5d\xd4\x8f\x5f\x75\x6b\x76\x97\x6c\xfb\x19\xb7\x3d\x15\xac\x77\xaa\xc8\xbe\xe0\xd5\xb9\x80\x95\xbc\x1f\x5a\x40\x54\xcf\x7b\x9c\x77\x74\x28\xef\x02\xae\xad\x00\x6d\x24\x8a\xee\xbc\x17\xe8\xa3\xb5\xc8\x87\xad\xd9\xef\x7f\xba\xba\xb8\xbc\xbe\xbf\xfa\x70\x75\x79\x1b\xd2\x64\xa3\xf4\x58\xd0\xf9\xa3\x97\x70\x3a\x86\x1b\x06\x17\x51\x73\xca\x42\x90\x2d\xe5\x65\x6d\xa1\xe8\x27\x3f\x8f\x8a\xd1\x7c\x6a\x61\xd2\x78\x29\x77\x48\x12\xb1\xa5\x49\x3f\xba\x4d\xa6\x44\x18\xd5\xf1\x0c\xb9\xc5\x7a\x83\x30\xc7\xb2\x65\xcb\x80\x83\x30\x5f\x84\x39\x9b\xe7\x70\x16\x1d\x9e\x71\x5b\x92\x6a\x6a\x6c\x27\x27\x8b\x7e\x0e\x69\x9e\x78\xb2\xfe\x20\x78\x30\x51\xb4\x45\xda\x77\x26\x21\xda\xa8\x96\xfd\x14\x73\x6a\xbd\xe1\x61\xf3\x51\x83\xf1\x59\x71\xc3\x44\x99\x58\x79\xc3\xb8\xb3\x02\x10\x62\x5d\xdd\x95\x09\xe5\xaf\x64\x77\x4b\x56\x43\x36\xd8\xf6\x62\xc1\xb0\x66\x7d\xbd\x46\xa9\xaf\xcc\x17\x43\x66\xf5\x31\xae\xf8\x48\x37\x7c\x27\x71\xd9\xd8\x14\xad\xfd\x2f\xc6\x89\x32\xca\x97\x33\xc4\xb5\x7b\xa7\x75\xda\x64\xdf\xf6\xec\xa8\x58\x71\x22\xe1\x2c\x21\x85\x92\x67\x7c\xab\x39\x12\x79\x3c\x7b\xe4\xe2\x41\xcb\x07\xfa\xc4\xce\x8d\x11\x44\x9e\x81\xa9\xe4\xec\x3b\xf8\x9f\x28\x7f\xe1\xfd\xa7\x8b\x4f\xef\xd0\x79\x9a\xda\x56\x88\xa5\x24\xab\x32\x73\xbd\xa6\x11\x2e\xe8\x67\x22\x24\xe5\x6c\x86\x1e\x28\x0b\x74\x04\x6c\x3e\x25\x4d\xff\x3d\x74\x00\xdd\x33\x0a\xe7\xbc\x30\x26\x8b\xd1\x78\xbf\x03\xfb\xf7\xae\xc5\x61\x2a\x5a\xd5\xfc\x83\x46\x36\xab\xd5\x34\xe5\x5c\xde\xf6\xaa\x89\x5e\xe4\x92\xf3\x8c\xe0\xa1\x58\xa7\x58\x6f\x6c\x8c\x27\x36\xda\x75\x05\x7b\x3d\xf6\xfc\x9f\xd6\x0c\xc0\x84\x91\x5a\xba\x2e\x78\xfa\x0e\xc9\xb2\x28\xb8\x50\x12\xe5\x44\x61\x2d\xfb\x2e\x34\x41\x0e\xd3\x4e\xeb\x75\xb0\xf8\xcd\xea\xdf\xc0\x61\x20\x1b\x3f\x00\x97\x34\x01\x26\xc3\xa0\x65\x41\x92\x05\xe3\x29\xd1\x87\x70\x66\xfe\x69\xef\xf6\xf3\x24\xe1\x25\x53\xf6\x0f\x0a\xab\x52\x2e\x36\x5c\xaa\xab\x9b\x08\xb0\xe6\xf5\x82\xa7\x57\x37\xb3\xd6\xbf\x64\xf0\x0a\x42\x23\xd9\x60\x7d\x0e\x47\x93\xbf\xfd\xae\x59\xd1\x23\xc7\xf0\x9f\xd0\xd6\xfe\x06\x07\x8a\x4d\x34\x1f\x2a\xd1\xa3\xa0\x4a\x11\x06\x92\x0a\x84\xb0\xf2\xd5\x4c\x9f\x84\xfa\xe2\xdd\xbe\x8d\xca\x77\x1a\x75\xf0\x57\x6e\x9a\xa3\x97\xae\x3f\x72\xeb\x36\x54\x5a\x5d\x09\x31\xd2\xa0\x7b\x6a\x07\xda\xf9\xcd\x15\xda\x1a\x7c\x1e\x79\x99\xf1\x27\x7f\x15\xb9\x6b\xd1\xe7\xdf\x05\x63\x7e\x78\x26\x1f\xa8\x4a\xc2\x58\x8c\x57\xc2\xf4\x3b\x70\xc8\x0f\xe2\xab\x0a\x0a\x45\x19\xcd\xa9\x0d\xd4\xb2\xe5\x65\x24\x7a\x65\x7e\x5c\x24\x45\x39\xb3\x2f\x2c\x72\x92\x73\xb1\x1b\x3e\xa5\xf6\x75\x52\x6c\x48\x4e\x04\xce\xe6\x52\x71\x81\xd7\x64\x56\x81\x37\x60\xab\x7f\x19\xc0\xc3\xa7\xb2\x31\xc1\x2e\x74\xa3\xcb\x24\xa5\xd0\xf7\x7c\xb6\x73\x5c\x91\xa4\x47\xe5\x0c\x15\x96\xaf\x0f\x92\x49\x2a\x25\xd6\xc8\x34\x15\x1d\x82\x18\xbb\xe5\x59\x99\xc7\x65\x54\xd5\xf7\xb3\xa9\x37\xc4\xb6\x5a\xe8\x95\x47\x97\x02\x52\xba\xa5\x32\x2e\x56\xb1\x47\x08\xa0\x36\x7c\x94\x97\xaa\x28\x95\x4d\xab\x19\xea\x4c\xdc\x7c\xc8\x53\xc1\x25\xa8\x3e\x55\x00\x73\x8b\xff\xbd\x1d\x4e\x16\x1c\xb9\x60\x37\xd2\xf8\xad\x75\x65\x6b\xde\xd5\x27\xb3\x62\x7f\x47\xde\x97\x78\xee\xe5\xa6\x72\x2c\xe6\x65\xbc\x6c\xc7\x51\x60\x64\xd3\x15\x69\x82\x58\xa2\x34\x81\x7e\x87\x71\xfb\xf9\x52\x3a\x4f\x15\xf7\x00\x4b\xa9\xaf\xbb\x95\xe0\xf9\x02\x81\x7d\x28\x8a\xd0\x97\x04\xac\xc9\x19\x4d\x1d\xac\x07\x12\x54\x3a\xdd\x33\xe9\x51\xbf\x24\x3d\xca\x7a\xef\x8d\x12\x15\x5d\xc9\xe1\x5f\x4e\x89\x8a\x78\x6d\x68\x56\x73\x38\x0c\x41\xe3\x7d\x00\xfe\xa0\xf1\xde\x6f\xc9\xea\x35\xe0\x3b\x49\x4c\x71\x54\xf0\xa2\xcc\xb0\xf2\x98\x40\xc3\x6e\xa4\xda\xc6\xef\x18\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\xcf\x32\x44\x99\x61\x50\x00\xd6\x59\x43\x05\x31\x42\x16\xc2\xc6\xbc\xbf\xf5\xdb\xf1\x1f\x6d\x4e\x60\xc3\xec\x4b\xa5\x56\xe2\x84\x82\x10\x31\xc8\x19\x34\xf7\x83\x35\x36\x52\x56\x65\x0e\x7a\x60\x56\x62\x41\x15\xbf\xda\x49\x23\x36\xd1\x6f\x52\xb9\x85\xc3\xcc\x15\x7e\xf0\x81\x2c\x04\x49\x48\x4a\x20\x2e\xe5\xb3\x89\x88\x75\x38\x5c\xee\xf4\x1a\x2f\xd9\xb6\xb2\xdb\x96\xc6\xc7\x64\x2e\x03\x0d\xd9\x47\x51\xf8\x81\xb4\x20\xbf\x84\xb7\x45\x13\xdd\x9d\x2b\x13\x59\x39\x5d\xe0\x7e\xaa\x34\x05\x97\xec\xe1\x3d\x5d\x75\x54\xd4\x33\xdc\x2c\x95\xa9\x73\x40\x4c\xe8\xdc\xa9\xb5\xa1\xa8\x7d\x97\x1e\xc1\xfc\x1a\x73\xf9\x7d\xdb\x17\xdf\xd8\x4b\x2f\xea\x42\x8b\xbe\xcc\x62\x2f\xb2\x11\xc6\xc0\x71\x17\x53\xec\xa5\x14\x75\x89\x14\x82\xac\xe8\x53\x34\x6d\x9e\xb3\x5a\xe1\xa2\x29\x61\x4a\x2b\x37\x50\x42\xb7\x10\xa4\x20\x2c\xad\xd2\x92\x87\x2e\x39\xcb\xaa\x6b\xeb\x7d\xed\x44\x3c\xae\xa3\xd0\xc8\x91\x63\x0f\xe0\x5d\x9f\x24\x3b\x9d\xbe\x7f\x9d\xd3\x67\x37\xf8\xab\x1d\xbd\x67\xca\x56\xb4\x2f\x0a\xba\x67\xe9\xa7\x17\x8d\xc0\x22\xa0\xbe\xd1\xb4\x53\xc7\x6a\x9e\x01\x14\x1f\x89\xdc\xd7\xc5\x1d\xa8\xac\xd9\x44\x15\xc0\x09\xe5\x83\x05\xca\xc8\x96\x64\xf6\x66\x44\x26\x54\x33\xf7\x0b\x4b\x10\xb3\x0d\x96\x0e\x2d\xed\x6b\x32\x16\x34\x6d\x89\x4e\x30\x25\xcd\x4e\x34\x69\x67\x1c\xa7\xf0\x47\xc1\xb3\x8c\x08\xdf\x54\x33\xfa\x40\xd0\x05\xc4\x82\xdb\xdc\x1c\x96\xa2\x3b\x85\x95\x26\xe5\x3b\xa2\x7c\x56\xf4\x01\x32\x85\xb9\xdc\x94\x59\x76\xc3\x33\x9a\x78\xb4\xe9\xf6\xf6\x40\x34\x3b\x2a\xca\x2c\x43\x05\x7c\xb4\x40\x9f\x18\x9c\xf7\xf3\xec\x11\xef\xe4\x0c\x5d\x93\x2d\x11\x33\x74\xb5\xba\xe6\xea\xc6\x08\x33\x3e\x9e\xd8\x74\x46\x9b\xcf\x11\x5d\xa1\x77\x99\xa9\xd2\xad\xf0\x1a\x04\x4d\x67\x56\x9e\x69\x8c\x36\xc1\x7a\xa0\xc2\x31\x7f\xa4\xb2\x57\x5a\x7b\x36\x31\x7d\x07\x90\x34\x4b\x32\xff\x3e\x08\xf1\x19\x5d\x91\x64\x97\x64\x31\x27\xe2\x3c\x01\xdf\x4d\x9d\x1c\x5d\xd3\xa0\xeb\x96\x69\x13\x6d\x40\x58\xf5\x16\x0a\x30\x25\x3a\x4c\x0d\x93\x9a\x1c\xab\x99\x18\x15\x40\x46\x4b\xb8\xc3\x17\x48\xc1\xa5\xba\xd3\x5a\x42\x64\xed\x8d\xd3\x1b\xf7\x01\x82\x52\x06\x59\x46\x52\x44\xf3\x9c\xa4\x5a\x2b\xc8\x76\x08\xaf\x14\x54\x47\xa8\x66\x1f\xe0\x68\x1a\x02\x94\x7b\x4f\xab\x64\xdb\x0d\x66\x69\x46\x04\x5a\x61\x9a\x59\xcd\xa3\xa5\xd1\x28\x22\x72\xca\x06\xea\x65\x18\x5b\x36\x28\x3f\x5a\x79\x4a\x12\x2e\x6c\xff\x4f\x50\xed\xed\x9f\xea\xb3\x01\xfc\x7b\x90\x6b\xa0\x3a\xe1\xa7\x9e\xd2\x32\xe3\xc9\x83\x44\x25\x53\x34\x33\x0b\xe0\xfc\x01\x8a\xba\x67\x40\xab\x0d\x52\x0e\x80\x1d\x49\xe4\xd5\x7f\xce\x2b\xca\x98\xeb\x71\xe5\xd9\x77\xf5\x9f\xe0\x07\xff\x15\x19\x27\x5b\x90\x27\x92\x8c\xc8\x2a\xd3\x5c\x46\x23\x1f\x92\x16\x39\xab\x44\x8c\x15\xd7\xcc\x5a\x6f\x81\x39\x05\x03\x37\xe2\xb2\x91\xe8\xb5\x40\x97\x4f\x24\x69\x24\x0b\x42\xc9\x20\x38\x6e\x10\x90\x8e\x1f\x06\x22\x50\xe2\xad\x95\xc1\x10\x5d\xef\x9a\xdf\x9b\xaf\x5c\x62\x88\x05\x82\x32\xca\xe0\x14\xdb\xb0\xdd\x08\xbb\x10\x65\x92\xa6\xa4\x4d\x5f\xe6\x04\x58\xf9\x0a\xa5\x54\x40\x36\xdc\x0e\xad\xe2\xf2\x91\x1b\xf3\x81\x84\x31\xce\x15\x7a\x75\x7a\x76\xfa\xba\x63\xd4\x38\xd5\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x37\x60\xeb\x0b\x80\xe6\x45\xb6\x83\xd5\x9e\xa6\x33\x44\x95\x8b\xf0\x11\x25\xb3\x2b\x8b\x00\x6a\x63\x9a\x67\x48\x72\xa4\x04\xae\x32\x3b\xe0\x57\x48\x69\x11\xa5\xe5\xb4\xaf\x4e\xff\xeb\x34\xc6\xf2\x48\x54\xf2\x1a\x3d\x72\x76\xaa\x00\x8d\x0b\x74\xcf\xb5\x74\x59\x0f\xb5\xe3\x25\x62\xc4\x64\x72\x91\xa7\x22\xa3\x09\x55\x11\x1e\x3e\x04\xcc\x0f\x41\xaa\x17\xb7\xcd\x3b\x4c\x3c\xf6\xe5\x13\x55\xd6\x7d\xae\xe9\xff\x0d\x50\x86\x61\x73\x31\x28\x90\x28\xa3\x5b\x72\xb6\x21\x38\x53\x1b\x53\x19\x84\x71\x36\xff\x99\x08\x0e\x51\xdb\xcc\xfe\xe5\x88\xf5\x53\x5e\xa4\x94\x63\xa4\xb9\x51\xb3\xbe\x3f\x77\x13\xb0\xda\x4f\xeb\xc0\xfd\xe5\xfe\xfe\xe6\xcf\x44\xed\xb1\x04\x0d\xc7\x39\x30\x41\x75\x24\x62\xc5\xc5\x00\x29\xc7\xf3\x86\x0d\x97\x03\x73\xec\xce\x93\x4b\x65\xf2\xc4\xcc\x65\xce\xb4\xc6\xa7\x78\xcb\xcb\x16\x79\x88\x0b\x9e\xa2\xab\x9b\x05\xfa\x1b\x2f\xf5\x9c\x97\x78\x99\xed\xaa\xd4\x20\x49\x14\x3a\xd1\x83\x9d\xe8\x53\xad\xf1\xf0\x17\x82\x53\xbf\x9c\xda\x7c\xf4\x91\x22\xf8\x98\x75\x11\x51\x73\x06\x63\x59\x69\x29\x15\xcf\xd1\xc6\x7c\xbc\x17\x63\x6d\xf7\x36\x86\x37\x69\x0a\x71\x99\x62\x82\x14\x70\xf4\x1c\xd4\x97\x2a\x3b\xa4\xc7\x34\xab\xb6\xbf\x2f\xa1\x42\x59\xd2\x5c\x52\x94\x43\xc1\x54\xaf\x33\xd1\x92\xcc\x2c\x45\x6f\x79\x94\xef\x66\x6c\x61\xa0\x58\x9f\x15\xea\xb3\x66\x98\x35\x59\xe5\x2c\x60\xf0\xdf\x7f\x0e\xab\x3d\x73\x9c\x69\xc6\x24\x75\x1f\x38\xcf\x71\xd5\x47\x22\xf1\x35\x8f\x9e\xf1\x0b\xd5\x1e\x29\xa2\x62\x95\xba\x91\x4a\x5a\x41\x4f\x12\x88\x87\x36\xc7\x17\x08\x59\x12\xb1\xf5\xe7\x18\xec\xcf\x2f\x0a\xf5\x05\x0f\xe9\x2e\xee\xc1\x6c\xf7\x69\xd0\xa7\x0e\x59\xea\x51\x35\x47\xf7\xdf\x3f\xa4\x6c\x8a\x31\xc1\x09\xc4\xca\x7c\x49\x44\x1d\x73\x28\x54\x8d\xbc\x88\x7d\xe7\x1d\xef\xd4\xb5\x01\xe8\x8c\x50\xed\xfa\xac\x31\x94\xc4\xd1\xef\xff\xc7\xff\xf8\xed\xff\x58\x98\x29\x56\xbe\x2c\x86\xae\xce\xaf\xcf\x7f\xba\xfb\xfc\x1e\x82\xe7\x87\x77\xf1\x69\x5e\xeb\x33\x73\xca\xd4\x9c\x8b\xb9\xc1\xd4\x3b\xa4\xc4\x20\x55\x43\x74\x5f\xc4\xb9\x6f\x5b\xe5\xe0\x23\xbd\x06\x2d\xe4\xad\xb8\x70\x37\xaf\xd5\xff\x8c\x8a\x16\x77\x8d\x34\x2d\x1f\x9a\x7c\xbf\x42\xf5\x60\x4d\x0e\xc7\x90\xb2\x54\x52\xdc\xf1\xe4\x61\x94\x9c\x75\x7a\xff\xfe\xc6\x7c\xd4\x10\xb5\x30\x73\xca\x17\x65\x5b\x9e\x6d\x87\xc9\x1e\xa3\xfb\xf7\x37\xb0\x90\x05\xfc\x17\xe8\xa5\xa0\x1a\xec\x34\x64\x17\x48\x66\x4d\xc0\x5a\x8d\x18\x52\xc2\x0d\x54\x41\x70\x46\xa5\xa2\x09\x40\xad\x4d\x24\x1a\x7e\xd8\x32\xfc\xa2\x52\xdf\xe9\x27\x67\x4c\x1e\x16\x00\xe3\x0e\x63\x43\x00\x1c\x0e\xa0\xf8\x45\x70\x4e\xcb\x31\x45\x55\x85\x61\xe2\x9c\x8d\xe7\xcb\xf2\x96\x88\x97\x0a\x41\xee\x14\x2f\xa2\x2d\x8c\xe6\x75\x8f\x7d\x71\x49\x56\x5c\x90\x78\x03\x63\x6d\x30\xac\x8a\x39\x33\x88\x7d\x76\xba\x22\x6f\x9a\xfe\x82\x31\x16\xfa\x91\x65\xb2\x71\x3a\x3a\x23\x52\x9e\x81\x29\xb1\x2c\x8c\x8c\x0e\x66\xcb\x52\x90\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\xbd\x18\xc2\xcc\xeb\xd0\x0a\xf5\xbe\x61\x0b\xb5\x96\x14\x87\x8c\x3d\x13\x64\x08\xaa\xc0\x72\x43\x20\xaf\x8c\x3c\xd1\xba\x1c\x2b\x96\x9c\x99\xdc\x2e\x8b\x1c\xe0\xe7\x12\x15\x58\x9a\x92\x36\xa1\x9b\xa4\x9e\x98\x01\x77\xc3\xd3\xd3\x53\xd9\x02\xb5\x16\x38\x21\x5a\x03\xa7\x3c\x45\x90\x90\x90\xf2\xc7\x90\x6b\x6b\x49\xd6\x94\x49\xb7\xb7\x7a\x08\x47\x04\x9a\x9b\x9b\x92\x4d\x2e\xff\x7d\x81\x6e\xab\x64\xbb\x61\x4b\x2d\x2f\x55\xc2\x6b\x26\x61\x67\xbe\x6f\x58\x86\xb0\x95\xba\x2c\x77\x68\xf9\x8e\x9c\x5c\xcc\x8f\x1a\x46\x81\xb5\x30\x07\xa0\x36\x08\x70\xac\x85\x39\x84\x02\xd1\xf8\xca\xbb\x3f\x50\x3f\x12\x27\x9b\xb6\xdf\x65\x32\x56\x4f\xc6\xea\xd0\x33\x19\xab\x27\x63\xf5\x64\xac\xee\x7d\x26\x63\xf5\x64\xac\x9e\x8c\xd5\xc3\xdf\x4e\xc6\xea\xc9\x58\x3d\x19\xab\x7b\x9e\x6f\xd1\xe4\x32\x19\xab\xc3\x9f\x4f\xc6\xea\xc9\x58\x1d\x80\x3a\x19\xab\x7b\xdf\xff\x25\x70\xce\xc9\x58\x1d\xfa\xf8\x1b\x33\x56\x0f\xbc\xe0\xac\xbe\x37\x5a\xc6\x8d\x89\xc4\xbe\x01\x1b\x1b\x4d\xac\x79\x98\xaf\x5a\x51\xbd\x06\xd8\xa2\xae\xbe\xe7\x99\x78\x9d\x0f\xe8\x62\x5a\xad\x11\xb8\x36\x3a\xf7\xc6\x04\x83\x3d\xcf\x03\x33\x3e\xba\xda\x85\xc0\xcb\xb3\x82\x9b\xff\x57\x5b\xf2\x1a\x26\x3c\x23\xf7\xf7\x1f\xfa\x61\x26\x16\xb6\xdd\x1d\x64\xb7\x6b\x5b\xe6\x02\xc4\xf3\x0c\x9b\x5d\x1c\x77\x8e\xb2\xd5\x1d\x60\xa7\x8b\xb3\x55\xc5\xda\xe8\xf6\x2d\x70\x03\x60\xa3\xed\x73\x4d\xeb\xdb\x00\xcc\x38\xdb\x9c\xcf\xf2\x36\x24\xa2\x79\xec\x72\x83\x56\xb7\x01\xb8\xfd\x36\xb9\xa0\xc5\x6d\x68\xa6\xbd\xf6\xb8\xa0\xb5\x6d\x18\xb1\x91\xb6\xb8\x2f\xdf\xc2\x24\x82\x73\x5b\xb7\xda\xfd\x46\x10\xb9\xe1\x59\xe0\x24\xb5\x4e\xd1\x47\xca\x68\x5e\xe6\x9a\x30\x25\xf4\x75\xdd\x56\x1e\x3a\x59\x51\xbc\xe1\xa1\x41\xeb\x16\x34\x47\x01\xd2\x83\x6a\x32\x98\x66\x7a\x37\x20\xd1\x61\x83\xb7\xc0\x71\xca\x24\x21\x04\x6a\x98\x5f\x44\x19\xcc\x7e\xbb\xa8\x66\x57\x15\x44\x7c\xeb\xdf\x99\xb8\xa6\xc9\x31\x52\xcd\xa0\x09\xf3\x25\xcc\x97\x71\x6c\x72\x58\x80\x1d\x6d\xb2\x8c\x28\x86\xf3\x22\xe6\xca\x28\x53\x65\xe4\x29\x8a\x36\x51\x8e\x37\x4f\xc2\xfe\x0e\x29\x2f\x87\x98\x26\xa3\xb8\xc8\x68\x93\x64\x8c\x0d\xfa\x20\x73\xe4\x18\x53\xe4\x41\x75\x5e\x0e\x35\x41\x8e\xd2\x3b\xa2\x4d\x8f\xc7\x31\x3b\xbe\x48\x4d\xa5\x08\xbc\xc4\x99\x19\x47\x76\x3b\x1b\x32\x2f\x0e\x9b\x16\x8f\x69\x56\x8c\x44\xed\xb0\x52\x1c\xa1\x10\x8f\x51\x86\x47\x28\xc2\xa3\xcd\x87\x16\x49\x03\xdb\x1a\xab\x00\xef\xa9\xb7\x03\x50\x0f\x53\x7e\x9f\xa1\xf8\xc6\x98\x0b\x5f\xc4\x54\x38\xce\x4c\x78\xb4\xe6\x5f\x41\xf5\x3d\xe2\xa8\x52\x46\x15\xc5\xd9\x05\xc9\xf0\xee\x8e\x24\x9c\xa5\xb1\xcd\xe2\x4f\xaf\x2b\x9a\x93\xe6\x43\x2b\xb9\xb5\xa3\x6c\x36\xd8\x56\xcb\x09\xfa\xbd\x6d\x80\x92\xd3\xdc\xed\xe5\x62\xbb\xe3\xeb\x19\x1e\x92\xbd\x7c\x04\xfd\x1a\x1d\x55\x44\x34\x81\x41\xe3\xd0\xfc\x17\xfe\x88\xf8\x4a\x11\x86\x5e\x51\xe6\x30\xfd\xba\x21\x1c\xd6\xb2\x76\x88\xe4\x2c\x79\xea\xef\xde\xbe\x71\x60\xbe\x96\xa8\x0c\x42\xbd\x94\xc7\xd0\x3a\x2c\xa8\xe7\xa8\x1d\x16\xc4\xaa\xcc\xda\xaa\x87\x51\x47\x62\xf5\x8e\xb7\x75\x49\x94\xb7\x30\x97\x8a\x96\xb5\x36\x69\x83\x19\xbb\x08\x0f\x42\xfc\x02\x5b\x11\xe1\x12\x38\xc8\x1d\x60\x0c\xfe\x03\x57\xec\x28\x57\x40\xd3\xd8\x1f\x80\x3b\xc6\x0d\xf0\x22\xda\xd3\x11\x4d\xff\x63\xcc\xfe\xff\x72\x92\x4d\x84\x79\xff\x17\x24\xd9\x7c\x09\x59\x40\xd1\x9c\xf0\x52\x1d\x49\x0c\x30\xad\x16\x1b\x1c\x99\x86\xeb\x15\xf1\x72\xaf\x41\xc7\x5b\x0b\xb0\xf7\x96\x3a\x5e\x44\xed\x37\x26\x25\x0c\xec\x93\x5f\x49\xf6\x36\x01\xaa\x65\xb1\xba\x46\x39\x96\x08\xa3\x8b\xeb\xbb\x9f\xbe\x3f\xff\xd3\xe5\xf7\x0b\x74\x89\x13\x5f\xa9\xf0\x46\x95\x10\x66\x1a\x22\x1a\xda\xdf\xe0\x2d\x41\x18\x95\x8c\xfe\xa3\xb4\x6d\x3b\x5f\x55\x10\x5f\x3b\xaf\x89\x07\xe8\x50\x7d\x95\x01\x9e\x01\x8d\x03\x46\x54\xaa\x34\x8d\x06\x8c\x19\x99\x6b\x31\x5f\xf0\x7c\xdf\xed\x77\xa9\xff\xe4\x67\x51\xd8\xf0\x9e\x0d\x11\x04\xad\xe9\xd6\x1a\xec\x6c\x09\x9a\x46\xaf\x4c\x4d\x92\x9a\x12\xf4\x6d\x88\x97\x60\xa6\xf6\x72\x28\x46\x94\xa6\xbe\x4a\xe3\xe0\x4c\x36\xf3\x2f\xb4\x46\x22\x67\x68\x59\x82\xa9\xbe\x10\x34\xc7\x82\x66\xbb\xe6\x10\x38\xf3\xf1\x9b\x6b\xee\x6e\xe8\x9d\xb9\x8e\xeb\xe9\x5f\x7c\xba\xbc\x43\xd7\x9f\xee\xa1\x27\x92\xbe\x59\xc1\x8a\x0e\x7f\x07\xc4\x2c\x89\x1f\x0d\xb6\xb6\xf5\x02\x9d\xb3\x9d\xf9\xc4\x9c\x73\x2a\xa1\x6b\x2e\x71\x1d\x9f\x35\x72\x5c\x29\xa8\x93\x37\x0b\xf8\x3f\x5f\xd9\x6b\x9c\xa6\x42\x73\xf3\xca\x09\xb1\x97\x3f\xa0\xb9\x2c\xf0\x7b\xba\xcc\x1a\x7b\x67\xb1\xf7\xc5\x3a\x83\x55\xce\xc4\x1b\xbd\xec\x66\x83\xb0\x6a\x23\x01\x21\xa6\x5e\x29\x34\x21\xf5\xf2\x81\xc1\xbe\x66\x91\xf5\x2a\xeb\x09\x45\xd7\xcb\xab\xf9\xb5\xbb\x4c\xed\xa1\xe0\x8d\x92\xd6\xe8\xea\xc6\x6d\x4b\xf8\x42\x83\x32\x62\xd5\x5d\x68\x8b\x41\x03\x60\x63\x92\x98\xa1\x37\xe8\x8f\xe8\x09\xfd\x11\xae\xd6\xdf\x87\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x51\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\x3d\x29\x22\xf4\xc1\xb6\xd8\x7a\x76\x85\x43\x3d\xc8\x51\x37\x0c\xac\x13\xe8\x6a\xd5\xa8\x15\x16\x96\x14\x47\x6e\x99\x06\xad\x25\xd9\x6b\x43\xe4\x61\xf3\x74\xab\x62\x59\x3d\x12\x74\x6b\x6f\x9f\x20\x7d\x85\x4b\xd5\xe8\x2d\x1c\x96\x0d\x39\x68\x08\xc6\x1d\xb8\xa1\x41\xaa\x3c\x2e\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6e\xd6\x46\x3a\x54\xc1\x53\x73\x55\xc3\xa4\xd2\x06\xbb\x71\xb7\x72\x10\x68\xf7\xc6\xb6\x21\x2a\x95\xea\x0c\xf4\xa5\x4f\x82\xed\xc6\x09\x15\x2c\xc5\x40\xc6\x82\x3e\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x70\xc5\x13\x1e\xac\x19\xd9\x36\x09\xdb\x0f\x60\x19\x46\xad\x74\x9a\xf8\x0f\x17\x37\x33\xad\x11\x42\xf1\xbc\xbb\xf7\x43\x56\xb9\x56\x7b\xb8\xfb\xf7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\xa7\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xde\xf3\xbc\x28\x15\x41\xb7\x55\xbb\xfa\xaa\x67\xfa\x72\x67\xfc\x82\x8d\xc3\xf1\x52\x6e\x0e\xd3\xb6\xab\x14\x10\x2a\x72\x66\x6a\x21\xce\x13\x33\xb5\x79\xb5\x9e\x79\x35\x93\xb3\x43\x5d\x1d\xa6\x77\xbe\x9f\x1e\xea\xf8\x98\x9b\x28\xc6\x1f\xc5\xb8\xda\x18\xff\x1e\xa6\xd0\x30\xb4\x98\x66\x51\x4f\x40\xbe\x38\xe7\xa5\x29\x01\x69\x57\x1f\x18\xbb\xc2\x8b\x31\x13\x7d\x3d\xb4\xa3\xf8\x9e\xc1\x44\x7e\x65\xec\xdf\xda\x49\xec\xe3\xdf\xb2\x8f\xc3\xf0\xef\x8e\x0c\x44\x20\x54\x23\x50\x89\x78\x4e\x95\x96\x53\xb4\xb0\xd7\x88\x16\x0a\x79\x35\xa8\x6a\xd9\x50\x2d\xb5\x80\xcf\x11\x2b\x53\x05\xb5\x72\x73\x34\x7b\xae\xb9\x6e\x6a\x21\x74\x41\xe5\xdb\x4a\x5a\x82\x5d\x9f\xbb\xe6\xbb\xc0\x38\xbf\x69\x0a\x1a\x78\x41\xcb\xfb\x82\xaa\xdd\x7b\xce\x14\x79\xf2\x48\x30\x6d\x62\xb8\xb3\x9f\xd8\xae\x82\xb2\x12\xa5\xac\x13\x53\x94\x0c\xa2\x1a\x22\xae\x92\x18\x64\x99\x6e\x63\x67\x6e\xa2\x80\x15\xf2\xa4\xce\x3c\x20\xe3\xb6\x42\x61\xf9\x50\xef\x03\x99\xeb\xcb\xa9\x46\x77\x67\xac\x43\x19\x27\xb0\x98\x1b\x41\xb7\x34\x23\x6b\x72\x29\x13\x9c\xc1\x9e\xc7\x8a\x00\xe7\x9e\xef\x5d\x57\x45\x59\x75\xd1\xf4\x75\xcc\xb6\xf3\x04\xa1\x2e\xc1\x0c\xad\x31\x65\x28\xd7\x38\x2a\x1c\x58\xe8\xbe\xc7\xa0\xc3\x5b\x81\x85\x56\x08\xec\x07\x21\x89\x0b\x02\xc3\x96\x9c\x67\xd6\x23\x9b\xed\xea\x39\x59\x57\x3f\xe3\x3f\x31\xf2\xf8\x93\x1e\x47\xa2\x55\x86\xd7\xa1\x5e\xd4\xc8\x56\x84\x25\xaa\x53\xb2\xa5\x9a\x0e\xf2\xa1\x23\xc4\x18\x24\x88\x7f\x08\x9b\x0e\x8c\xbd\xed\xbe\xdf\xa1\xb7\xaf\x81\x6a\xb1\x44\x15\xf4\x90\x51\xe5\x37\xaf\xc1\xfa\xf2\xfe\xfc\xe6\xa7\xbb\xbf\xdd\xfd\x74\x7e\xf1\xf1\xea\x7a\xe8\x88\x86\xfb\x94\x26\xb8\xc0\x4b\x9a\xd1\x30\xef\xee\x58\xc1\x9b\x9f\x01\xa3\x4a\xd3\xb3\x54\xf0\xc2\xac\x53\x94\x0c\xe2\x35\xeb\x18\xac\x08\x43\x86\xf3\x41\x55\xe1\x9d\xa6\x35\x77\x7b\xa8\xb5\xc0\x4c\x39\x61\x67\xa8\x3e\xb7\x41\xb3\x28\x99\x16\x54\x9f\xeb\x71\xc3\xe9\x98\xa0\x84\xf3\x34\x25\x69\x6b\xea\x47\xf6\x01\xbd\x77\xa0\x77\x75\xc4\x28\xba\xf9\x74\x77\xf5\x7f\xe2\x47\x45\x96\x46\xa2\xdc\x03\x47\xf2\x60\x23\xa4\xc9\x64\x04\x26\x6f\x6d\x74\xcf\x84\x4b\xcf\x3b\x03\x95\xfc\x1d\x57\x89\x3c\xdc\xb7\x25\x6b\x47\xe6\xd7\x10\x50\xce\x53\xb2\x40\x37\x86\x29\x42\xb7\xdd\x20\xef\xaf\xbe\xab\xd9\x00\x98\x7f\xf5\xc7\x4c\x51\x9c\x65\x3b\xa4\x25\xb1\x2d\xce\x88\x71\x21\x0b\xee\xd5\x56\x50\x5d\x52\xcb\xc4\xa5\x36\xb9\xc6\x0a\x67\x32\x70\xc0\x63\xf8\xa0\x66\xf5\x1f\xb5\x30\x19\x89\xa7\xea\x7d\x94\x12\xc6\x95\x95\x4b\xf5\x48\x10\x50\x2b\x78\x82\x8c\x6c\x6a\xdc\x10\x81\x55\xd5\xe1\x44\x15\xb3\x04\x16\xeb\xd8\x20\x95\x6e\xad\x37\xd5\x98\xa0\x89\x07\x60\x96\x92\xc8\xbd\xdb\xc6\xb2\xc1\x5a\x5a\xd5\xe3\x0a\x82\x53\x88\x0d\x2b\xb0\xda\x80\x5d\x33\x00\x34\xc7\xf2\x81\xa4\xe6\xd5\x85\xb9\x87\xad\x24\x2d\x6d\x07\x00\x3b\xbd\x7b\x8d\x85\x15\xc1\xaa\x14\x04\xee\xdf\xb0\x90\xbb\x24\x88\x30\xbc\xcc\x42\x91\x67\x51\x41\x91\x38\xfd\xc4\xb2\xdd\x2d\xe7\xea\x43\x15\x52\x15\xb9\x9d\x3f\x56\x3d\xc1\x9b\x1a\x34\x5c\xb6\x60\xa4\x4c\xe7\x80\x26\x08\xe4\x8a\xab\x64\x7e\x51\x6f\xdf\x11\xc8\x53\x94\xec\x5c\xfe\x59\xf0\x32\xb6\x29\x87\xa6\xa0\x3f\x5f\x5d\xc0\xa9\x2a\xcd\xb9\x21\x4c\x89\x1d\x04\x45\x76\x32\x78\x86\x65\xb8\x05\xfa\x41\xd3\xd4\x1e\x15\x69\x89\xab\x64\x92\xa8\x05\xfa\x88\x77\x08\x67\x92\x5b\x61\x2a\x24\x19\x31\x74\x03\x3e\x93\xa6\xfc\xbf\x40\x10\xe3\x6c\xe2\x2e\x96\x5c\x6d\xd0\xde\x0b\x03\xc4\xd9\x85\x68\xc2\xf7\x8c\x81\xa9\x4e\x50\xa2\x6c\x1f\x70\x88\x38\xf1\x03\x91\xa8\x10\x24\x21\x29\x61\x49\x60\x0f\x1b\xb6\xa2\xdf\xff\xee\x59\xe6\x7b\xd8\xe9\x6b\xce\x34\x19\x47\xee\xf5\x15\x4b\x69\x82\x0d\x0f\xb2\xdd\xac\x6b\x12\x06\xab\xa6\x95\x31\x31\xc4\xc0\x0d\x70\xd9\x52\x12\x61\xba\x3b\x8b\x92\x18\x24\xfe\xb5\x5c\x92\x8c\x28\x13\x71\x0b\x71\xfd\x58\x99\x56\x02\xa6\xa1\x3c\x56\x8e\x30\xc2\x27\x9d\x30\x59\x42\xbb\x10\xad\x1a\x2b\x94\x72\x52\xc7\x2b\x62\x89\x7e\xb8\xba\x40\x6f\xd0\x2b\x3d\xbf\xd7\xe0\x63\x59\x61\x1a\x12\xdb\x15\x37\x5e\x98\x7d\xb9\x7a\xe5\x80\xc3\x32\x80\x3e\x11\x17\xe6\x18\xce\x10\x0b\xf9\x7c\xa0\x5b\x8c\x5d\xa1\x56\x77\x5c\x8c\xb1\xf5\xcc\x81\xd1\xa6\x4d\xe8\x01\x72\x0e\x8d\x13\x26\x74\x1f\x39\x07\x20\x0e\x13\xfa\x08\x72\x8e\x66\x49\x3f\x48\x22\x46\x70\xa4\x1f\x8e\xca\x91\x9a\x22\x80\xa6\xda\xf6\xea\x0d\x69\xe6\x44\xe1\x14\x2b\x8c\x68\x68\x3b\x4a\xd6\xe8\x08\xf2\x4b\xd8\xe0\xe3\xf1\x2b\x49\xbe\xa7\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\x25\x7c\x88\x12\x37\x79\x40\x38\x2e\x8a\x8c\x9a\x00\xe1\x76\x1e\x65\x00\x33\xe6\x90\x37\xd3\x63\xfa\x04\x1f\x38\xca\x38\xcb\xb8\x66\x95\xfa\x56\xc7\x2c\xe5\x79\x00\xec\xfe\x04\xb5\xc0\x44\x70\xb2\x69\x5a\xd8\x7b\x88\x65\xd4\x25\xf5\x4f\x7e\xed\xc5\xa9\xce\x19\xd9\x92\x60\xda\xcd\x7e\x76\xad\x7e\x5f\x0b\x4e\x6e\x07\x00\x00\xca\xf0\x92\x64\xe6\xf2\x30\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xf0\x6c\x4c\x30\xd2\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\xbf\x17\x1a\x96\xa2\x38\xbb\x2b\x46\xb5\x3d\xfb\xf3\xc7\xbb\xf3\xf6\xc7\x9a\x70\x1f\x21\xe5\x5e\xaf\x47\xff\x1d\xe1\x34\xa7\x52\x86\x4d\xd2\x80\x5f\xb2\x84\x76\x74\xaf\x9c\x8f\x62\x4d\xd5\xa6\x5c\x2e\x12\x9e\x37\xdc\x15\x73\x49\xd7\xf2\xcc\x52\xd9\x5c\xcf\xfe\xf5\x00\x5c\xca\x32\xca\x1a\x46\x07\x48\x60\xb7\x42\x1d\x4c\x30\xa9\x56\x00\xa8\x37\x99\xa6\x03\x40\x8d\x95\xb7\x07\x01\x26\xbb\x94\x92\x2c\xb5\x86\x08\x13\x8e\xad\xcf\x73\x56\x6c\xf0\x1c\x2e\x8c\x01\xe0\x36\x67\x0c\xf4\xfa\x0d\x67\xdc\xfa\xd0\x4d\xcc\xb1\x55\xa5\x8c\x5d\x02\x26\x61\x4f\x8e\x9e\xcb\x00\xe0\xa6\xe5\xe3\x28\xac\xad\x4b\x3d\xd7\x83\x81\xf5\x03\x14\x04\x08\xb4\x19\x73\x8d\x68\x9c\x81\x95\xf5\x6e\xa4\x11\xbe\x7f\x09\xfb\x50\x69\x3c\x23\xd1\x0f\x9a\x8f\xfd\x4c\x73\x1b\xc7\x84\x7b\x35\xa1\x81\x45\x75\x6a\xaf\xf4\x6a\x43\xfa\x95\xb6\x46\x34\x78\x7c\xbb\xfa\xd2\x90\x56\x34\x00\xb2\x4f\xd8\x7d\x96\xac\xdb\x0f\xf4\x08\xf2\x2e\xea\x93\x79\xf7\xe8\x79\x49\x94\x25\x67\x20\xd8\x1c\xef\xd0\x72\xe8\xb8\xa4\x54\x82\x59\x13\x9c\xd2\x4d\xe2\xbd\x6d\x12\xd2\xb1\xe9\xf4\xd9\x8e\x79\x13\xd8\x1a\x9d\xd5\x7d\xd7\x78\x1f\xd1\xae\x29\xea\x86\xa7\x26\x64\xbc\x0a\xca\xf5\xf6\x3f\xb4\xa1\xeb\xf4\x67\x77\xf7\xd7\x92\x05\xe3\x26\x66\xa2\x19\x47\xee\x1a\xcc\x9a\xa6\xa9\x1e\x98\xd6\xa2\x6b\x9b\xaf\xb6\x66\x61\xac\x5c\x1b\x2a\x9b\xc9\xe1\xb3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x0c\xfd\x47\x29\x15\xc2\x95\xfb\xb9\xd5\x73\xa2\x8a\x39\x06\x72\x4a\xbc\xd6\x14\x97\x8b\xa5\xb8\x9e\xcc\x96\xa6\x04\xa5\x74\xb5\x22\xce\x2d\xbe\x24\xa8\xc0\x02\xe7\x44\x81\x1b\xc5\xa0\x16\xba\xf0\x32\x3f\x31\xf0\x15\xc2\xae\xd7\x6d\x15\x01\x37\x33\x3e\x5a\xaa\x50\x4e\xd7\x1b\x23\xeb\x20\x8c\x32\xce\xd6\x10\xd1\xa7\xa7\x90\x71\xec\x3b\x89\xc0\x1c\xb8\x40\x8f\x58\xe4\x08\xa3\x04\x27\x1b\xb0\x12\x62\x86\xd2\x52\x40\x82\xa7\x22\x38\xdd\xcd\xa5\xd2\x7a\xb6\x96\x8e\xc0\x94\x66\x30\xe0\xf5\x42\x77\x3a\x61\x00\xbe\xa8\x89\x44\xd6\x77\x49\x75\x4c\xac\xaf\xc0\x09\x07\x4d\xf2\xf3\x40\x6f\x1d\xb0\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\xdf\xbd\x39\xa5\xf4\x77\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xa7\x94\x7e\x78\xa6\x94\xfe\xf1\x73\x9b\x52\xfa\xa7\x94\xfe\x29\xa5\xbf\xf1\x4c\x29\xfd\x9d\x51\xa6\x94\xfe\x6f\x23\x59\x6f\x4a\xe9\x77\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\x90\x0b\x2d\xa5\x9e\x54\xcb\x98\xac\x03\x6b\xc0\x6f\xc4\x2a\x2e\xcb\xd5\x4a\x6b\xa8\xdc\x7b\x59\xeb\x11\x3b\x96\xe8\x2a\xf7\xad\x72\x74\x59\x6b\xb2\x24\x6a\x06\x69\x0d\x26\x4c\x67\x1c\x50\x1b\x48\x09\x69\x8d\x82\x48\x48\x03\x60\xe8\xf2\xd3\x87\x45\x23\xe9\xc1\x6b\xca\xf4\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\xb1\x24\xc6\x29\x59\x23\xb6\x2f\x12\xd4\xe2\x37\xc9\xb8\x34\x31\x05\x00\xda\xe7\x9a\xda\x60\xc6\x88\x93\x3a\xa8\x02\x59\x79\x49\x08\x43\xbc\x20\xcc\xf8\xa1\x5c\x5b\x06\x84\x95\xc2\xc9\x66\xa1\xc7\x67\x41\xa8\x2e\x3b\xb4\x1a\x5d\xb3\x5e\x82\x73\x83\x5c\x41\x72\x4c\xcd\x00\x08\x27\x82\x4b\x89\xf2\x32\x53\xb4\xa8\x86\xf0\xed\x18\x81\x18\x20\x13\x99\x55\x21\x0c\x1c\x0b\xc4\x98\xe2\x21\xa6\xdf\x6e\xac\x74\x4b\xe0\x6c\x30\xf0\x1a\x64\xa3\x19\x24\xb4\xe7\x85\xda\x19\x97\xab\x71\x3c\x51\x21\x15\x4a\x32\x0a\xd7\x3f\xcc\xce\xe4\x84\xc2\x28\xb3\x80\x53\x5f\x41\xae\x28\xac\x55\xda\xc5\xb2\x14\x6e\x8d\x42\x49\xe3\x68\xac\x87\xb1\x03\xa4\x54\xda\x3b\x5a\xfa\x3c\x13\xd8\xf5\x0e\x31\x9b\xed\xd6\x0a\xdb\x9d\xc2\x10\x6e\x4c\xfb\x53\x63\x90\x01\x2c\x40\xca\x93\x55\x94\xea\x43\x05\x29\xc6\x2e\xcf\x67\xd6\xea\x33\x52\x54\xc9\x72\x6a\x83\xfd\x95\x16\xdc\x41\xb4\xb3\x05\x22\x60\x64\xab\x69\x96\x24\x44\x8b\xd0\xb8\x73\xc2\xcc\x70\x07\x1d\x25\x45\x44\x4e\x19\xb8\x65\x3f\x12\x29\xf1\x9a\xdc\x78\x0d\x3c\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\xa9\x8f\x21\x34\xa6\x82\x72\x33\x97\x2a\x06\xf0\x51\x50\xa5\x75\x2a\x2a\x4d\x2e\x1d\xd8\x35\xf7\x03\x2e\xfd\xa0\x9b\x4e\xb8\x8f\x0e\x74\x0d\x52\xf3\x77\x96\x1a\xc7\xd5\x92\xa0\xa5\xa0\x64\x85\x56\x94\xe1\xcc\x7a\xa0\x7c\xf4\x05\x39\x22\xd8\x08\xd4\x52\x6a\xd1\x94\x33\xe7\x58\x71\x6b\x58\xa0\x1f\xed\x22\x94\x28\x59\x82\x07\x73\x96\x19\x4f\x09\xa2\x2b\xb4\x06\x6f\x97\x30\x0e\xf5\xdf\xbd\xf9\x5f\xbf\x47\xcb\x9d\xbe\x11\xc1\x50\xa9\xb8\xc2\x59\x85\xa6\x8c\xb0\xb5\xde\x03\x60\x10\xbe\xb3\x90\x65\xcd\xf4\x4b\x87\x59\xa8\xab\x62\x96\xfe\xf6\x37\x0f\xcb\xf6\x95\x7e\x96\x92\xed\x59\x63\x5f\xe6\x19\xf7\xc6\xa5\x74\x9b\xe1\xf4\x5f\xbe\x03\xe2\x65\x0f\x41\x42\xf1\x85\x08\x92\x74\xc9\x4f\x68\xc3\x1f\x4d\x0e\x66\x0f\x45\xd5\x2e\xf1\x82\x17\x65\xe6\xef\xda\x83\xd0\x07\x4d\xc5\x80\xa7\xd2\xde\x0e\xad\x70\xc6\xde\x93\x03\x8a\xbe\x05\xec\xe7\x75\xcd\x1b\xde\xb8\x38\xdd\xf4\xb8\x8d\x87\xb2\x4a\x6e\x95\xfb\x54\x0a\xb2\x40\x1f\x70\x96\x2d\x71\xf2\x70\xcf\xbf\xe7\x6b\xf9\x89\x5d\x0a\xe1\x15\x03\x5a\xf3\xce\xb0\xe6\xcb\x9b\x92\x3d\xb4\x5b\x2d\x64\x7c\xad\xe5\xb8\xa2\x54\x2e\x62\xa5\xb1\x2a\x0f\x60\x37\x53\x38\xe3\xd5\x25\x80\x6d\x2f\x9b\x1a\x36\x79\x02\xba\x82\x80\x27\xcc\x10\xd1\x73\xf5\x61\x5a\x53\x74\x73\x2e\xb2\x49\x96\xbf\x79\xf3\xbb\x3f\x18\xd2\xd7\xda\xc5\x1f\xde\x80\xf3\x5f\xce\x0c\x73\xd1\x9c\xd1\xcf\xa1\x65\x8e\xb3\x4c\x2b\x12\x4d\xa2\xd6\xdb\xba\x88\xed\xdd\x34\x44\xad\x2a\x86\x30\xa3\x85\xbb\xfb\xfb\xbf\x05\x24\x3b\xaa\x24\xc9\x56\x33\x13\x7b\x57\xe5\xdb\x9e\xc2\x45\x71\x6a\x79\x97\xbe\xd5\xbb\x57\xc3\x61\x62\xd6\x96\x67\x65\x4e\x2e\x08\x34\x5d\x89\x58\x66\xeb\x7d\x17\xb1\x91\xd9\xfe\x68\xcb\x8c\x27\x0f\x28\xb5\x7f\x84\xc9\x7a\x96\x09\x5e\x2b\x1b\xd2\xd3\xd0\x05\xab\x28\x20\x08\xc0\x73\x91\x3c\xcf\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xe3\xa2\x80\x46\x63\x2b\x48\x10\x7a\x34\x0b\x08\xe8\x58\x00\xc1\x76\xd2\xc1\xc7\xe9\xbe\x65\x80\xfa\x2f\xe4\x9e\xf5\xd4\x9f\xb8\x0d\x28\xe0\xbf\x4d\xbc\xc8\x88\xd4\x3a\x54\x87\xed\x55\x6b\x33\x37\x86\xc6\x0c\x9c\xcc\x67\xf7\xe1\x19\xd5\xf7\x08\xcc\x0a\x8d\x4e\x4f\xcd\x78\x65\x8c\x0a\x22\x24\x34\x87\x53\x9f\x61\x47\xdf\x67\x98\x86\x32\xba\x10\xaa\x1b\x1e\x3d\x6f\x19\xc3\x1d\x78\xea\x3d\xf1\xbe\x12\xf0\xf6\x3d\xb3\x37\x8f\x21\x70\x48\xc6\x8f\x39\xc3\x37\x3c\xb5\x9f\xc0\x21\x35\x85\x0b\x7a\x44\x2d\x19\x91\xfb\x7e\xf4\xf6\x78\x9f\xeb\xb5\xb4\xcf\xaa\xfe\xa5\x3a\xac\xe6\x2d\x7b\x14\xbd\x7b\x7b\xa4\x23\x0a\x43\x8f\x3a\xa1\x70\x36\x1b\x1d\xb7\xea\xfb\xa0\x25\x42\x9b\x4d\x08\x52\x70\x2d\xca\x58\x99\x78\x81\x8c\x4d\x5b\x63\xdd\x82\x45\xa7\xef\x4e\x9f\x7d\x4e\xcd\x22\x05\x2f\xf0\x7a\xa0\x74\xd4\xde\x5a\xf7\x3f\x44\x29\x31\x02\x06\x91\x20\xa4\xc1\xdf\xc1\x6d\x14\x5c\x68\x61\x21\xb8\xce\x4e\xce\xc7\x67\xcd\xb4\x0e\x7d\x56\x04\x31\xc1\xc1\x8f\x41\x2f\x36\x42\x58\xf0\x92\xa5\x56\x3f\xaf\x0c\x21\x1f\xf7\x26\x7c\xcd\x19\x08\x39\x26\x07\x29\x10\xb6\x6a\x9e\x56\x8c\xb8\xe6\x30\x6f\x17\x6f\xdf\x7c\x59\x36\x79\xbf\xd7\x10\x4f\x63\xe4\xba\x62\x93\xe6\x6c\x3c\x7b\x46\xae\xc0\x46\xf4\xac\x3e\x5a\xa5\xad\xae\x9f\x41\x5d\x55\x01\xf8\x49\x2b\x63\x24\xaa\x14\x1e\x42\xaf\x40\xa4\xd1\xb2\x60\x23\x2b\xe1\xf5\xa8\x32\x30\x71\x69\xed\x5a\xbf\x5b\x3e\xeb\x6c\x9b\x43\x6c\x88\xb6\x4f\x17\x0e\x53\x93\xfd\xba\xe7\x98\xb7\xba\xc8\x9d\xa0\x57\xe6\xcd\x53\x09\xb1\xa8\xaf\x9f\xbd\xbd\x76\xd9\x97\x4f\x45\x30\x8f\xb2\xb5\xf4\xcb\xa7\x02\x83\x0e\x5d\x0c\xe1\x60\x40\xe8\x68\xdf\x32\x7e\x1c\xfc\x89\x6c\xf0\x96\x40\x9c\x2c\xcd\xb0\xf0\x66\x12\x58\xb8\x1c\xdd\x99\x55\x41\xb3\x5b\xc2\xb6\x54\x70\x06\x7e\xaa\x2d\x16\x14\x72\x8a\xa0\x15\x21\x61\x5a\x3e\xfd\xf5\xab\xcf\xe7\xb7\xe0\x1f\x08\x67\xbb\x99\xdc\x03\xbb\xf2\x52\x42\x0c\xc2\xde\x0a\x1a\x43\xd5\x1b\x37\x34\xd7\x9e\x4d\x75\xf3\xd7\xbb\x02\xbc\xce\xad\x47\xcf\x21\x2f\x55\x89\xfd\xd9\x14\xe6\x21\x4f\x49\x56\x4a\xba\x7d\xee\xf9\x1f\x96\x78\xaa\x5b\xf1\x2b\x08\x3c\x36\xa4\xfb\x82\x7a\x68\xb7\xbf\xe1\xee\xa9\xec\xc6\x82\x83\x59\x8f\x71\x35\xdc\xf5\xb4\xd7\xb8\x7c\x2a\xab\xda\x38\xcd\x54\x56\xab\xb8\xda\x94\x0b\xaf\x16\x54\xd5\x85\x4c\xbb\x66\x77\xc8\xcf\x3a\x8e\x0a\xeb\xdf\x4b\xcf\x1e\x05\x76\xc7\xb7\x2f\xae\xbf\xed\x0f\xa2\x93\xfa\xdf\x09\xc0\xab\x7a\xe1\xfe\x70\xfb\x3d\xac\xfa\x3c\x23\x42\x99\xf2\xa4\x02\xa2\x49\x31\x1c\xd0\xaa\x6b\xf3\x16\xd3\x4c\x9f\xde\xce\x44\x4b\x96\x36\xd5\x46\x46\x12\x22\x25\x16\x3b\x7d\xbc\xd6\x84\x11\xa1\x55\xee\x84\x0b\xbd\xd9\x7a\x34\xd9\xf3\x6e\x07\x28\x5d\xed\x4d\xc8\x39\x51\x44\xd5\x76\x12\xd2\x01\xe0\xb2\xbd\xb8\xbe\x33\x2d\x50\x7b\xf1\xd4\xb3\x21\xb0\xaf\x41\x14\x5d\x41\x66\x1e\x6d\xe4\x43\x81\x13\xa2\x4e\x56\x43\x7c\x4b\x04\x5a\x62\x49\xe0\xd5\x19\x52\x78\xdd\x6b\x77\x97\x1b\x2d\x01\xe7\x4b\x6b\xec\x91\x0b\x74\x57\xb7\xf2\x06\xbe\xad\x35\x2a\x0e\xf6\x51\xa9\x8c\x15\xba\x81\x41\x53\xbf\xa7\x4b\x1d\xa6\xf8\x57\x4e\xd4\x86\x94\x12\x7d\x82\x94\x1f\x2e\xd0\x03\xe3\x8f\x12\x3d\x6a\x8d\xd2\xc1\xe5\x5d\x54\xf6\x77\x05\xaf\x4f\xc2\x38\x44\xde\x94\x59\x76\x47\x12\x41\xba\x8a\x4f\xbb\x40\x23\xb3\x89\xea\x38\xab\xac\x15\x8d\xab\x00\x02\x86\x01\x8a\x3b\x88\x52\x8b\x53\x7a\x63\x65\x81\x93\x1e\x1c\xd4\xa1\x69\x45\x99\x65\x1a\x9f\x45\x8d\x12\xf0\x6b\xb4\xd6\xad\xe7\x6a\x6d\xfe\x82\xac\xa9\x5e\x4e\x8f\xe3\x55\x12\x13\x6e\xde\xef\x1d\x2d\x25\x11\xf3\x75\x49\x53\x72\x66\xe0\x7d\x57\x37\x66\x9f\xc3\x2f\x7a\x2a\x76\x1d\x73\xce\xe6\x78\xde\x55\x7c\x3d\x8a\x58\xbb\x20\x07\x4f\x70\xf6\x09\x4e\xff\xad\xc3\x91\xe3\x4c\xfa\xae\xe3\xe5\x7a\xd3\x6a\x50\xaf\x38\xca\x7a\x6b\x80\xed\x78\x89\xac\xe1\xcb\x44\x62\x5b\x68\xa9\x65\x2e\xce\x66\xd1\xc5\x78\x97\xcd\x85\x35\x35\xbf\xfc\xbc\xe7\x19\x6f\x04\x2e\xd8\xe9\xa8\xd1\x41\x6c\xfa\xfc\x6d\x29\x79\x3c\xb3\xd7\xc9\x5c\x8b\x42\x73\xb3\x24\x79\x06\x6b\x38\xfb\x0e\xfe\xc7\x67\x0b\x85\x30\x9a\xf3\x34\xb5\x8a\x4c\x29\xc9\xaa\xcc\x8c\x6a\x21\x17\x08\x17\xf4\xb3\x39\x41\x33\xf4\x40\x59\x3a\x43\x25\x4d\xff\xfd\x00\x53\xfb\x01\x8c\x9c\x32\xaa\xaa\x1b\x33\x7c\xa8\x4e\xaf\x5a\xef\xba\xe0\x79\x9c\xa6\xfa\x3c\xb4\x01\x35\xe2\x66\x7a\x88\x6f\x05\x01\x85\x26\x6b\x90\x4b\xe2\xfa\x46\xbb\x14\x49\xb2\x58\x2f\xd0\x8a\x68\x55\xc7\x1d\x53\x7d\xf2\x28\xd3\xeb\xea\xb3\x62\x57\xc6\x8c\x16\xf7\x69\x95\xc3\x36\x87\xb1\xba\x8a\x6c\x2d\xec\x05\x3a\x67\x3b\x63\xc7\xee\xee\x9d\x4d\x78\x84\x04\x6e\xc8\x49\xb3\x2c\x0e\xb3\xf6\x62\xcd\xc5\x95\x11\x6c\xca\x6b\x38\x1f\x22\xe2\xdd\x0a\x52\x36\xf9\xf4\xb9\x61\x94\x7a\xf8\xba\xae\xb4\xec\xd6\xac\xfe\x41\xf6\x6c\x09\xd4\x3d\x67\x3b\xe0\x64\x09\x96\x4e\xab\x06\x3f\xad\xc1\xb3\x41\x3a\x7c\xda\x45\x07\x61\x8a\x0a\x92\xed\x10\x2f\x55\x7d\x8a\x13\x6e\x6a\x62\x3e\x3a\xcb\x62\x8e\x69\xdb\x21\x65\xa3\xc9\x7a\x6f\xac\xe5\x0e\xa5\x1c\x72\x8c\xf8\x0c\xb8\x87\x71\x0f\x3b\x3b\x25\xdc\x1f\x1b\xbc\xa5\xbc\x14\x26\x29\x5b\x10\xfc\x80\xb0\x82\x75\xf4\x56\xa4\xd3\x47\x93\x97\x60\x2f\xa1\x09\xe9\xf8\xab\x62\xf8\xe1\x79\xe5\xef\x2f\x8a\x8c\x26\x75\x65\x6c\xb3\xdb\x30\x37\x3d\x57\x97\x47\xe3\x0a\x93\xf7\x5a\xa6\xa0\xc9\xfa\x58\xee\x86\xc5\x3a\xaa\x5f\xc4\xb9\x58\x97\x39\x38\xaf\x2c\xfd\xd7\x85\x06\x6c\x95\x51\x9e\x3c\xb8\xfb\xc8\xef\x4a\x7d\xff\xf1\xc2\x19\x44\x8c\xcf\xa8\x0e\x25\xb1\xd9\xca\xe9\x02\x7d\x3e\x48\xa5\x1a\x54\xa6\xf6\xb5\xa9\x2b\x2d\x65\x39\xf5\xcd\x27\x47\x57\x42\xb2\x20\x92\x67\x5b\x57\x9b\xa6\x9a\x99\xbb\xd5\x29\x2b\x4a\x65\x99\xa5\x13\x2f\x7d\x1e\x0a\x96\x6c\x30\x5b\x1b\x93\x10\x69\xae\x0c\xc9\x1d\x53\xf8\xc9\x31\x29\x22\x13\x5c\x54\x4e\x30\x94\xf2\xd2\x3f\xd1\x5f\xff\x7a\x86\x28\x79\x87\x7e\xdd\x00\xb7\x40\x97\x16\x42\x03\x91\x8d\x90\x80\x65\x8d\x30\x9f\x6a\x22\xc8\x1a\x8b\x34\x83\xe8\xbb\x55\x55\xaa\xdd\x14\x4a\xb0\x9b\x44\x9e\xa8\x54\xe0\x5c\x63\x5c\x35\xd4\x0a\xdf\xea\xc7\xb5\x0a\x31\x65\xee\x0d\x3f\x9e\xa7\x58\xe1\x79\xe3\xa8\x9c\x99\x26\x06\x73\x9b\x15\x3b\xc7\x96\x48\x1b\x85\xf0\xbf\xb3\x25\xc4\xe7\xb8\x7a\x8b\x6a\xf9\x05\xb2\x48\xfb\xef\xbd\xa0\x45\x79\x50\xc1\x0d\xab\x97\xc1\x14\xe6\xf6\x89\xbb\xac\x6b\x1a\x02\xb4\x05\xba\xe6\xaa\x2e\x55\x50\xf9\x8a\x6c\x3e\xec\xbd\x37\x22\x60\xef\x64\xa2\xcb\xeb\xfb\xdb\xbf\xdd\x7c\xba\xba\xbe\x1f\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\xf9\x3d\xfd\x07\x74\xf8\x28\xfa\xd9\x82\xf7\x80\x46\x1f\x45\x0f\x6c\xcf\x01\x8d\x3f\x8a\x1e\xb8\x9d\x03\xfa\x0b\x3f\x8a\x84\x6d\x23\x8e\xe1\xf7\x56\xa5\xeb\x33\xf9\xed\xa7\x83\x0e\xba\x84\x8e\xee\xd2\xba\x64\xdb\xcf\x58\xd4\xc5\xe6\x21\x96\xa8\xd7\x3a\x69\x5f\xf0\x9a\xee\x80\x95\xbc\x3f\x86\x4f\x6b\x94\xbf\xa1\xa9\x34\xf5\xcd\xbb\x4e\xb3\x08\xb5\x07\x41\xe8\xfd\x4f\x57\x17\x97\xd7\xf7\x57\x1f\xae\x2e\x6f\x9f\x6d\xc0\x1e\x4c\x00\x6d\x33\xea\x31\xdc\x30\xb8\x88\x9a\x53\x16\x82\x68\x49\x54\x22\xd7\xa5\xa7\x9f\xfc\xe8\x70\x40\x7c\xdb\xc1\xa5\x65\x59\xa9\x35\xcc\xa4\x1f\xdd\x26\xde\x33\x8c\xea\x78\x86\xdc\x62\xbd\x61\x5f\xe4\x48\xb6\x6c\x19\x70\xd8\x5e\xfd\x12\xcc\xd9\x3c\x87\xb3\xe8\x01\x0b\x7b\x4b\x92\x6a\xbb\x69\x82\x09\x21\xf1\x64\xfd\x41\xf0\x40\x29\xfb\xfd\x6c\x49\x50\x5d\xab\x5c\xab\x3e\x8a\x39\x95\xb6\x83\x54\xf8\x78\xd6\x8c\xcf\x8a\x1b\x55\x70\xbf\xfe\x1d\x82\xc0\x42\x10\x62\x13\xcb\x8d\x1e\xfe\x11\x17\x7f\x25\xbb\x5b\x32\x90\xd7\xb2\xbf\x58\x92\x91\x44\x73\x50\xf4\x40\x76\xc6\x04\xfb\xde\x81\x1b\x4a\x07\x1d\x93\xf8\xfe\x40\x82\x8e\xcf\xde\xb9\xe9\x53\xa0\x67\x05\xf7\x8d\x9e\xe6\xd0\x84\xd0\xd8\xa4\xf7\x83\xd2\xf1\xbf\x11\x9b\x57\xfb\x19\x6b\x01\x8b\x02\xea\xb7\x92\xb5\x9f\x51\x38\x77\x76\xe3\xd1\x78\xb7\xb6\xf6\x16\x87\xa9\x68\x55\xf3\x0f\x3a\x98\x6c\x66\x1e\x4d\x53\x2e\xb5\xc9\x5e\x35\xd1\x8b\x1c\xf2\x7e\x9b\x27\xbe\x64\xc1\x03\x09\xfb\x1f\x47\xd4\x22\x80\xbd\x1e\x7b\xfe\x4f\x6b\x06\x60\x02\x31\xaa\x24\xb4\xf4\x9d\xb3\x2c\xc9\xaa\xac\xe1\x42\x13\xe4\x30\xed\xb4\x5e\x07\xf3\xf3\xac\xfe\x0d\x6a\x04\xcb\xc6\x0f\xc0\x25\x8d\x43\x65\x18\xb4\x2c\x48\xb2\x60\x3c\x25\xfa\x10\xce\xcc\x3f\xed\xdd\x7e\x9e\x24\xbc\x64\xca\xfe\x01\x42\x84\x17\x1b\x2e\xd5\xd5\x4d\x04\x58\xf3\x7a\xc1\xd3\xab\x9b\x59\xeb\x5f\x72\x20\x27\x71\x1c\x1b\xac\xcf\xe1\x68\xf2\xff\x5c\xfb\x80\x8c\x61\x70\x43\x72\x0c\xff\xf9\x41\x6f\x5c\xc0\x73\xdc\x7e\xa8\xac\xc3\xf8\x19\xc4\x2e\xeb\x7b\xbb\x5d\xf8\xe6\x64\xfb\xf6\xe4\xe8\xcc\x76\xe5\xa6\x39\x7a\xe9\xe0\xb2\x77\x85\xda\x80\x4a\xab\x2b\x21\x46\x1a\x74\x4f\xed\xff\x3b\xbf\xb9\x72\x3e\xb5\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\x06\x94\x1f\x9e\xc9\x07\x1c\x9c\x4e\xe4\xeb\x3b\xa8\x9a\x37\x88\xaf\xba\x53\xa8\xe9\x3f\x6b\x73\x86\x6c\x9f\xd0\x57\xe6\xc7\x45\x52\x94\x33\xfb\xc2\x22\x27\x39\x17\xbb\xe1\x53\x6a\x5f\x27\xc5\x86\xe4\x44\xe0\x6c\x2e\x15\x17\xe0\xb1\x75\xe0\x0d\xd8\xea\x5f\x06\xf0\xf0\xa9\x6c\x4c\xb0\x0b\xdd\xe8\x32\x49\x29\xf4\x3d\x9f\xed\xea\xec\xed\xa3\x72\x86\x0a\xcb\xc3\xd5\x71\xcd\xb3\xdf\xd9\xd8\x69\x3c\x20\xd3\xd4\x7d\x8d\xb5\x18\x6b\x83\x53\xe3\x2e\xfd\xca\xaf\x0b\x0d\x1b\xd8\x56\x0b\xbd\x81\x9c\xd0\xfa\x19\xc5\x0c\x52\xba\xa5\x92\x0f\x94\x9c\xef\x59\xe8\x5d\xab\x96\x98\xcd\x7d\x30\x9e\xd3\xb8\x22\xcc\xe6\x21\x4f\x05\xe4\xae\x55\xb4\xba\xc7\xff\xde\x9e\x1c\x7b\xc1\x6e\xa4\xf1\x5b\x7b\xeb\x58\x4a\x7d\x32\x2b\xf6\x77\xe4\x7d\x89\xe7\x5e\x6e\x2a\xc7\x62\x5e\xc6\x3f\x76\x1c\x05\xc6\xfa\xda\xea\x60\xf5\x81\x98\x41\x64\x35\x81\xfe\xd0\x84\xf6\xf3\xa5\x74\x1e\x77\xcb\x9b\xa5\xd4\xd7\xdd\x4a\xf0\xdc\x86\x2c\x47\x11\xfa\x92\x80\x35\x39\xa3\xa9\x83\xf5\x40\x06\x8a\x38\x9a\x67\xd2\xa3\x7e\x49\x7a\x94\x89\xf9\xb1\x4a\x54\x84\x52\x62\x9e\x7f\x39\x25\x2a\xb2\xaf\x7b\x38\x90\xf3\xe5\xc2\x34\x09\xdb\xfa\x2d\x59\xbd\x06\x7c\x27\x89\x35\x32\x2c\xfb\x4d\xa0\x61\x37\x52\x2b\xa5\x0c\x18\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\x87\xaa\xba\x86\x41\x01\x58\x67\x0d\x15\xc4\x96\xc8\x31\xa9\xc2\x64\xeb\xb7\xe3\xf7\x36\x87\x36\x29\xf7\x94\xad\x6d\xba\x82\xb9\x1f\xac\xb1\x91\xb2\xaa\x22\x80\x07\x66\x25\x16\xd4\xe5\xf1\xb1\x94\x3c\x81\x2a\x5d\x75\x45\x7a\x48\x12\xb5\x0b\x87\x99\x2b\xfc\xe0\x03\xd9\xac\x8e\xff\x59\x43\xac\x71\xb8\xdc\x41\x86\x3a\xdb\x56\x76\xdb\xd2\xf8\x98\xcc\x65\x10\x28\xa5\x0e\xe5\xc7\x9b\x90\x5f\xc2\xdb\xa2\x89\xce\x5a\x45\x1b\x4e\x17\xb8\x9f\x2a\x4d\x01\xdb\x86\xd3\xde\xd3\x55\x99\x6a\x7c\xb4\x16\x73\xb5\x56\xa6\xce\x01\x31\xa1\x73\xa7\xd6\x86\xa2\xf6\x5d\x7a\x04\xf3\x6b\xcc\xe5\xf7\x6d\x5f\x7c\x47\x0c\x9f\xab\x9f\xe8\xcb\x2c\xf6\x22\x1b\x61\x0c\x1c\x77\x31\xc5\x5e\x4a\x51\x97\x48\x21\xc8\x8a\x3e\x45\xd3\x66\x33\x90\x96\x42\x63\x98\x15\x85\x5a\xb5\x1a\x50\x41\x98\x89\xd7\xc3\xc9\x66\xf0\x92\xb3\xac\xba\xb6\xde\xd7\x4e\xc4\xe3\x3a\x0a\x8d\x1c\x39\xf6\x00\xde\xf5\x49\xb2\xd3\xe9\xfb\xd7\x39\x7d\x76\x83\xbf\xda\xd1\x7b\xa6\x6c\xd5\x9b\x47\xd0\xb3\xf4\xd3\x8b\x46\x60\x91\x49\x55\x18\x4b\x3b\x8d\xc0\x52\x13\x78\xee\x59\x51\xbb\x85\x4e\xc5\x26\x4c\x8b\x39\xfe\x88\x36\x74\xad\x91\x6f\xda\xea\x98\x9b\x11\x99\xd8\xdc\xdc\x2f\x2c\x29\x5e\x65\xd8\x70\x01\x99\x0f\x82\xa6\x9d\x44\x19\x10\x91\x5c\x50\x2c\xfc\x51\xf0\x2c\xf3\x97\x2e\xcf\xe8\x03\x41\x17\xa4\xc8\xf8\x2e\xb7\x11\x19\x29\xba\x53\x58\x69\x52\xbe\x23\xca\x67\x45\x1f\x20\xd3\x2a\x27\x21\xba\x9e\xc9\xa9\xc9\xf6\x28\xca\x2c\x43\x05\x7c\xb4\x80\x9e\x1f\x90\x39\xf1\x88\x77\x72\x86\xae\xc9\x96\x88\x19\xba\x5a\x5d\x73\x75\x63\x84\x19\x1f\x4f\x6c\x3a\xa3\xcd\xe7\x88\xae\xd0\x3b\x2d\x46\x4b\x05\x69\x22\x54\x36\xdb\xec\x70\xd1\x02\xeb\x81\x5a\xa5\x6c\x3e\x23\x2c\xc9\x4f\x4c\xdf\x01\xa4\x2a\x87\xc1\x63\xba\x1b\x40\x7c\x55\x1d\x2e\x02\xe5\xe7\xb6\x1f\x86\xaa\x23\x94\x1d\x0d\x22\x93\xec\xee\x52\x11\x41\x58\xf5\xe6\x97\x0b\x22\x0b\xce\x24\x69\x67\x28\xd7\x75\x2e\x41\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\xa0\xff\x4d\x6c\x19\xc0\x1b\xf7\x01\x14\xc4\xc2\x59\x46\x52\x44\xf3\x9c\xa4\x5a\x2b\xc8\x76\xb6\xc8\x19\x8e\xaa\x15\xa1\x21\x98\xd6\x1c\xb6\x12\x16\x41\x1b\xcc\xd2\x8c\x88\x66\x23\xa5\x96\x46\xe3\xea\xcc\x04\xb9\xaa\xb1\x65\xdb\x22\x5b\x08\x27\x09\x17\xa9\x2d\xf3\xac\x55\x7b\x17\x3b\x5f\x9d\x0d\xe0\xdf\x83\x5c\x03\xf5\xf5\x4e\x83\xea\x1e\xb2\x51\xff\x0b\x5a\x23\x56\xcd\xa2\x8e\x58\xbf\xb0\x41\xe4\x75\xb5\xc2\x8a\x32\xe6\x50\x5d\xf5\xac\x51\xc8\x10\x7e\x78\x6e\x4d\xd4\x70\x57\x21\x74\x68\x67\xa1\x81\x1b\xb1\xd5\x77\xe8\x39\xdd\x85\xe2\x17\x8a\x62\xbb\x0c\x75\xd6\x1c\xd7\x69\x28\xc2\x2e\xd4\xc8\x5b\x8a\xe9\x36\x14\x63\x69\x6a\xf7\x23\x8a\xef\x38\x14\x01\xbb\xd1\x93\x28\xb2\xeb\x50\x04\x50\x4f\x5f\x22\x6f\xe7\xa1\x08\x90\x43\xbd\x89\x3c\xdd\x87\x22\x20\x87\xfa\x13\x79\x3a\x10\xc5\xa0\x20\xd0\xa3\x68\x44\x17\x22\x14\xdb\x43\x04\x8d\xb5\xb9\xc6\xb5\x7b\x88\x36\x37\x0e\xb6\xd3\x41\x2f\xd4\x52\x07\x8d\xe2\x0d\xc3\xc5\xa1\xbb\xf3\x8c\x68\xaf\x13\x79\x88\x5f\xa4\xc5\x0e\x8a\x6d\xb3\x83\xc6\x91\x48\x74\xbb\x1d\x74\x50\xcb\x9d\x88\x55\x41\x9b\x90\x83\xda\xee\xa0\x31\xc7\x66\x74\xfb\x9d\x28\x87\x82\xa9\xc7\x36\xbe\x05\x0f\x1a\xe9\x99\x43\x23\x7c\x56\xe8\x58\xed\x78\xd0\x58\x6e\x83\xc6\xb4\xe5\x19\x9e\x66\x6c\x6b\x9e\x03\xe6\x19\xeb\xaa\x41\xb1\x6d\x7a\x50\x74\xab\x1e\x34\xc6\xcb\x8c\x46\xf0\xf0\x98\xb6\x3d\xe8\xc8\xad\x7b\xd0\x38\xd4\x0f\x17\xba\x47\x71\xc5\xee\xd1\xc8\x82\xf7\x68\x5c\xd1\x7b\x74\x48\x4b\x9f\x88\x7d\xe7\x1d\xef\x54\xb0\xf8\x7d\x0c\x25\xb5\xca\xe3\x1f\x58\x00\x1f\x3d\xaf\xbd\x0f\x8a\x6c\xf1\x83\x5e\xaa\xcd\x0f\x1a\xdd\xea\x07\x8d\xa1\xdb\x38\x66\x31\x50\xea\x1f\x8d\x70\xea\x0e\xb7\xff\x40\x87\xb6\x00\x19\xc0\x0a\x34\x08\x19\xdf\x06\x64\x10\x6a\xd5\x24\x64\x54\x2b\x10\xf4\xd2\x52\xdf\x11\xdb\x82\xa0\x91\xad\x41\xd0\x2f\x85\x73\x46\xb4\x0c\xf9\x05\x73\xce\x2f\xcb\x5b\x22\x5e\x2a\x04\xb9\x53\xbc\x88\xb6\x30\x9a\xd7\x3d\xf6\x45\xdb\x41\x2c\xda\xc0\x58\x1b\x0c\x51\x5a\xc2\x49\xc4\x0c\x62\x9f\x9d\xae\xc8\x9b\xa6\xbf\x60\x8c\x05\x6a\x54\x6e\x77\x5d\x9f\xce\x6c\xc7\xa7\x46\xff\xf7\x52\x90\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\x5b\x20\x1c\x5e\x27\x2a\x31\x21\x26\xce\x16\x6a\x2d\x29\x0e\x19\xf1\xb5\x78\x13\x81\xe5\xc6\x94\xbf\x26\x4f\x54\xd9\x12\xf0\x82\x60\xc9\x99\xc9\xed\x6a\x14\x3a\xa7\x12\x15\x58\x9a\xea\x28\xa1\x9b\xa4\x9e\x98\x01\x67\x9b\xc3\x37\x41\xad\x05\x4e\x88\xed\x82\x86\x20\x21\x21\xe5\x8f\x21\xd7\x16\x74\xa1\x97\x6e\x6f\x4d\x31\x28\x43\x04\x9a\x9b\x13\xb0\x30\xb9\xfc\xf7\x05\xba\xad\x92\xed\x86\x2d\xb5\xbc\x54\x09\xaf\x99\x84\x9d\xf9\xbe\x61\x19\xc2\x56\x60\xeb\x87\xaa\xe1\x55\xe4\xd4\x2c\x55\x38\x80\x02\x6b\x61\x0e\x40\x6d\x10\xe0\x58\x0b\x73\x08\x05\xa2\xf1\x95\x77\x7f\xa0\x21\x05\x4e\x36\x6d\xbf\xcb\x64\xac\x9e\x8c\xd5\xa1\x67\x32\x56\x4f\xc6\xea\xc9\x58\xdd\xfb\x4c\xc6\xea\xc9\x58\x3d\x19\xab\x87\xbf\x9d\x8c\xd5\x93\xb1\x7a\x32\x56\xf7\x3c\xdf\xa2\xc9\x65\x32\x56\x87\x3f\x9f\x8c\xd5\x93\xb1\x3a\x00\x75\x32\x56\xf7\xbe\xff\x4b\xe0\x9c\x93\xb1\x3a\xf4\xf1\x37\x66\xac\x1e\x78\xc1\x59\x7d\x6f\xb4\x8c\x1b\x13\x89\x7d\x03\x36\x36\x9a\x58\xf3\x70\xbb\x89\xa2\x05\xb6\xa8\xab\xef\x79\x26\x5e\xe7\x03\xba\x98\x56\x6b\x04\xae\x8d\xce\xbd\x31\xc1\x60\xcf\xf3\xc0\x3c\xb8\x2e\xf4\x21\x8d\xb3\x87\x99\x58\xd8\x76\x77\x90\xdd\xae\x6d\x99\x0b\x10\xcf\x33\x6c\x76\x71\xdc\x39\xca\x56\x77\x80\x9d\x2e\xce\x56\x15\x6b\xa3\xdb\xb7\xc0\x0d\x80\x8d\xb6\xcf\x35\xad\x6f\x03\x30\xe3\x6c\x73\x3e\xcb\xdb\x90\x88\xe6\xb1\xcb\x0d\x5a\xdd\x06\xe0\xf6\xdb\xe4\x82\x16\xb7\xa1\x99\xf6\xda\xe3\x82\xd6\xb6\x61\xc4\x46\xda\xe2\xa2\x0c\x0a\xd1\xd7\x61\x8c\xee\x16\xc1\xb9\xad\x5b\xed\x7e\x23\x88\xdc\xf0\x2c\x70\x92\xda\xdd\xc3\x28\xa3\x79\x99\x6b\xc2\x94\x50\x5b\x7f\x5b\x79\xe8\x64\x45\xf1\x86\x87\x06\xad\x5b\x4b\xa0\x6d\x4d\x7a\x50\x4d\x06\xd3\x4c\xef\x06\x24\x3a\x6c\xf0\x16\x38\x4e\x99\x24\x84\xa4\x7b\x3d\xb6\x02\x20\x7f\xbb\xa8\x66\x57\x15\x44\x7c\xeb\xdf\x19\x53\xdd\x05\x24\x96\xdf\xfe\x66\x00\x93\x61\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb0\x69\xf1\x98\x66\xc5\x48\xd4\x0e\x2b\xc5\x11\x0a\xf1\x18\x65\x78\x84\x22\x3c\xda\x7c\x68\x91\x34\xb0\xad\xb1\x0a\xf0\x9e\x7a\x3b\x00\xf5\x30\xe5\xf7\x19\x8a\x6f\x8c\xb9\xf0\x45\x4c\x85\xe3\xcc\x84\x91\x4d\x5d\x87\x0e\xf7\x80\xfa\x1e\x71\x54\xa1\x97\x13\xce\x2e\x48\x86\x77\x77\x24\xe1\x2c\x0d\xb6\x3f\x6f\x95\x3a\xa8\x68\x4e\x9a\x0f\xad\xe4\xd6\x8e\xb2\xd9\x60\x5b\x2d\x27\xe8\xf7\xb6\x01\x4a\x4e\x73\xb7\x97\x0b\xd4\x46\x34\x33\x3c\x24\x7b\xf9\x08\xfa\x35\x3a\xaa\x88\x68\x02\x83\xc6\xa1\xf9\x2f\xfc\x11\xf1\x95\x22\x0c\xbd\xa2\xcc\x61\xfa\x75\x43\x38\xac\x65\xed\x10\xc9\x59\xf2\xd4\xdf\xbd\x7d\xe3\xc0\x7c\x2d\x51\x19\x84\x7a\x29\x8f\xa1\x75\x58\x50\xcf\x51\x3b\x2c\x88\x55\x99\xb5\x55\x0f\xa3\x8e\xc4\xea\x1d\x6f\xeb\x92\x28\x6f\x61\x2e\x15\x2d\x6b\x6d\xd2\x06\x33\x76\x11\x1e\x84\xf8\x05\xb6\x22\xc2\x25\x70\x90\x3b\xc0\x18\xfc\x07\xae\xd8\x51\xae\x80\xa6\xb1\x3f\x00\x77\x8c\x1b\xe0\x45\xb4\xa7\x23\x9a\xfe\xc7\x98\xfd\xff\xe5\x24\x9b\x08\xf3\xfe\x2f\x48\xb2\xf9\x12\xb2\x80\xa2\x39\xe1\xa5\x3a\x92\x18\x50\xb7\x57\xb7\x1c\x99\x86\xeb\x15\xf1\x72\xaf\x41\xc7\x5b\x0b\xb0\xf7\x96\x3a\x5e\x44\xed\x37\x26\x25\x0c\xec\x53\x64\xeb\xd4\x66\x19\xaa\x5a\x16\xab\x6b\x94\x63\x69\xda\x21\xff\xf4\xfd\xf9\x9f\x2e\xbf\x5f\xa0\x4b\xec\x6d\x03\xdf\xa8\x12\xc2\x4c\x43\x44\x43\xfb\x1b\xbc\x25\x08\xa3\x92\xd1\x7f\x94\xa6\x56\x11\x7a\x55\x41\x7c\xed\xbc\x26\x1e\xa0\xcf\x6a\x91\x6d\xb8\x58\x4c\x8f\x45\x57\xa9\xd2\x34\x1a\x30\x66\x64\x2e\x6d\xef\xfb\x3d\xb7\xdf\xa5\xfe\x93\x9f\x45\x61\xc3\x7b\x36\x44\x10\xb4\xa6\x5b\x6b\xb0\xb3\x25\x68\x70\x5a\x05\xa9\x36\x5b\xed\xe2\x25\x98\xa9\xbd\x1c\x8a\x11\xa5\xa9\xaf\xd2\x38\x38\x93\xcd\xfc\x0b\xad\x91\xc8\x19\xb4\xc7\xa7\x5a\x24\xa6\x39\x16\x34\xdb\x35\x87\xc0\x99\x8f\xdf\x5c\x57\x6d\xd2\x77\xe6\x3a\xae\xa7\x7f\xf1\xe9\xf2\x0e\x5d\x7f\xba\x87\x9e\x48\xfa\x66\x05\x2b\x3a\xfc\x1d\x10\xd3\xdf\xf5\xd9\x3c\xb6\xb6\xb5\x69\xbd\x0a\x9f\x98\x73\x4e\x25\xb4\x6a\x26\x4c\x0f\x66\xb5\x72\x57\x0a\xea\xe4\xcd\x02\xfe\xcf\x57\xf6\x1a\xa7\xa9\xd0\xdc\xbc\x72\x42\xec\xe5\x0f\x68\x2e\x0b\xfc\x9e\x2e\xb3\xc6\xde\x59\xec\x7d\xb1\xce\x60\x95\x33\xf1\x46\x2f\xbb\xd9\x20\xac\xda\x48\x40\x88\xa9\x57\x0a\x4d\x48\xbd\x7c\x60\xb0\xaf\x59\x64\xbd\xca\x7a\x42\xd1\xf5\xf2\x6a\x7e\xed\x2e\x53\x7b\x28\x78\xa3\xa4\x35\xba\xba\x71\xdb\x12\xbe\xd0\xa0\x8c\x58\x75\x17\xda\x62\xd0\x00\xd8\x98\x24\x66\xe8\x0d\xfa\x23\x7a\x42\x7f\x84\xab\xf5\xf7\x21\x60\x71\x1c\x34\x4e\xac\x35\x52\xdb\xd5\x4d\x34\x56\x7e\xd4\x47\x40\x7f\xa3\x57\xae\x38\x5a\x52\x96\x9a\x0e\x4d\xae\xe9\xb0\xc5\xd6\xb3\x2b\x1c\xea\x41\x8e\xba\x61\x60\x9d\x40\x57\x8d\x16\xf4\x61\xc7\x9a\x1a\xb9\x65\x1a\xb4\x96\x64\xaf\x0d\x91\x87\xcd\xd3\xad\x8a\x65\xf5\x48\x39\x56\xc9\xa6\x7d\x82\xf4\x15\x2e\x55\x4d\xc4\x61\x61\x38\xe5\xa0\x21\x18\x77\xe0\x86\x06\xa9\xf2\xb8\x84\x34\xaa\xf9\x5e\x6b\x17\xf6\x30\xbd\x27\x28\x0e\x08\xe1\xa9\xbb\x59\x1b\xe9\x50\x05\x4f\xcd\x55\x0d\x93\x4a\x1b\xec\xc6\xdd\xca\x41\xa0\xdd\x1b\xdb\x86\xa8\x54\xaa\x33\xd0\x97\x3e\x09\xb6\x1b\x27\x54\xb0\x14\x03\x19\x0b\xfa\xb4\x54\x3d\xf0\x82\x1b\x13\x75\x3e\x0a\xc1\x15\x4f\x78\xb0\x66\x64\xdb\x24\x6c\x3f\x30\x0d\xfe\x0d\x65\x59\x9c\xff\x70\x71\x33\xd3\x1a\x21\x14\xcf\xbb\x7b\x3f\x64\x95\x6b\xb5\x87\xbb\x7f\x7f\x13\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xee\x13\xcb\x9f\x57\x7b\x52\x10\x9c\xd2\xa3\xc5\xd6\xb8\x56\x87\x15\xd4\x31\x41\x36\x39\xdf\x92\xd4\x5c\xe0\x75\xcb\xc4\x14\x1a\xf2\xca\x40\xe4\xcd\xb0\x0c\xf9\x15\x2c\x83\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x81\x77\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\xe9\x45\xcb\x14\x79\x33\x45\xde\x4c\x91\x37\x8d\x97\xa6\xc8\x1b\x3b\xa9\x7f\x1a\xff\xd4\x14\x79\xd3\x7e\xa6\xc8\x9b\xce\x28\x53\xe4\xcd\xb7\xe1\x53\x9b\x22\x6f\xdc\x33\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\xb3\xf7\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\xde\xa7\xaa\x9b\x77\x8c\x0b\xe5\x3d\xcf\x8b\x52\x11\x74\x5b\xb5\xab\xaf\x7a\xa6\x2f\x77\xc6\x2f\xd8\x38\x1c\x2f\xe5\xe6\x30\x6d\xbb\x4a\x01\xa1\x22\x67\xa6\x16\xe2\x3c\x31\x53\x9b\x57\xeb\x99\x57\x33\x39\x3b\xd4\xd5\x61\x7a\xe7\xfb\xe9\xa1\x8e\x8f\xb9\x89\x62\xfc\x51\x8c\xab\x8d\xf1\xef\x61\x0a\x0d\x43\x8b\x69\x16\xf5\x04\xe4\x8b\x73\x5e\x9a\x12\x90\x76\xf5\x81\xb1\x2b\xbc\x18\x33\xd1\xd7\x43\x3b\x8a\xef\x19\x4c\xe4\x57\xc6\xfe\xad\x9d\xc4\x3e\xfe\x2d\xfb\x38\x0c\xff\xee\xc8\x40\x04\x42\x35\x02\x95\x88\xe7\x54\x69\x39\x45\x0b\x7b\x8d\x68\xa1\x90\x57\x83\xaa\x96\x0d\xd5\x52\x0b\xf8\x1c\xb1\x32\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xeb\xa6\x16\x42\x17\x54\xbe\xad\xa4\x25\xd8\xf5\xb9\x6b\xbe\x0b\x8c\xf3\x9b\xa6\xa0\x81\x17\xb4\xbc\x2f\xa8\xda\xbd\xe7\x4c\x91\x27\x8f\x04\xd3\x26\x86\x3b\xfb\x89\xed\x2a\x28\x2b\x51\xca\x3a\x31\x45\xc9\x20\xaa\x21\xe2\x2a\x89\x41\x96\xe9\x36\x76\xe6\x26\x0a\x58\x21\x4f\xea\xcc\x03\x32\x6e\x2b\x14\x96\x0f\xf5\x3e\x90\xb9\xbe\x9c\x6a\x74\x77\xc6\x3a\x94\x71\x02\x8b\xb9\x11\x74\x4b\x33\xb2\x26\x97\x32\xc1\x19\xec\x79\xac\x08\x70\xee\xf9\xde\x75\x55\x94\x55\x17\x4d\x5f\xc7\x6c\x3b\x4f\x10\xea\x12\xcc\xd0\x1a\x53\x86\x72\x8d\xa3\xc2\x81\x85\xee\x7b\x0c\x3a\xbc\x15\x58\x68\x85\xc0\x7e\x10\x92\xb8\x20\x30\x6c\xc9\x79\x66\x3d\xb2\xd9\xae\x9e\x93\x75\xf5\x33\xfe\x13\x23\x8f\x3f\xe9\x71\x24\x5a\x65\x78\x1d\xea\x45\x8d\x6c\x45\x58\xa2\x3a\x25\x5b\xaa\xe9\x20\x1f\x3a\x42\x8c\x41\x82\xf8\x87\xb0\xe9\xc0\xd8\xdb\xee\xfb\x1d\x7a\xfb\x1a\xa8\x16\x4b\x54\x41\x0f\x19\x55\x7e\xf3\x1a\xac\x2f\xef\xcf\x6f\x7e\xba\xfb\xdb\xdd\x4f\xe7\x17\x1f\xaf\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4b\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4f\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\x7b\x07\x7a\x57\x47\x8c\xa2\x9b\x4f\x77\x57\xff\x27\x7e\x54\x64\x69\x24\xca\x3d\x70\x24\x0f\x36\x42\x9a\x4c\x46\x60\xf2\xd6\x46\xf7\x4c\xb8\xf4\xbc\x33\x50\xc9\xdf\x71\x95\xc8\xc3\x7d\x5b\xb2\x76\x64\x7e\x0d\x01\xe5\x3c\x25\x0b\x74\x63\x98\x22\x74\xdb\x0d\xf2\xfe\xea\xbb\x9a\x0d\x80\xf9\x57\x7f\xcc\x14\xc5\x59\xb6\x43\x5a\x12\xdb\xe2\x8c\x18\x17\xb2\xe0\x5e\x6d\x05\xd5\x25\xb5\x4c\x5c\x6a\x93\x6b\xac\x70\x26\x03\x07\x3c\x86\x0f\x6a\x56\xff\x51\x0b\x93\x91\x78\xaa\xde\x47\x29\x61\x5c\x59\xb9\x54\x8f\x04\x01\xb5\x82\x27\xc8\xc8\xa6\xc6\x0d\x11\x58\x55\x1d\x4e\x54\x31\x4b\x60\xb1\x8e\x0d\x52\xe9\xd6\x7a\x53\x8d\x09\x9a\x78\x00\x66\x29\x89\xdc\xbb\x6d\x2c\x1b\xac\xa5\x55\x3d\xae\x20\x38\x85\xd8\xb0\x02\xab\x0d\xd8\x35\x03\x40\x73\x2c\x1f\x48\x6a\x5e\x5d\x98\x7b\xd8\x4a\xd2\xd2\x76\x00\xb0\xd3\xbb\xd7\x58\x58\x11\xac\x4a\x41\xe0\xfe\x0d\x0b\xb9\x4b\x82\x08\xc3\xcb\x2c\x14\x79\x16\x15\x14\x89\xd3\x4f\x2c\xdb\xdd\x72\xae\x3e\x54\x21\x55\x91\xdb\xf9\x63\xd5\x13\xbc\xa9\x41\xc3\x65\x0b\x46\xca\x74\x0e\x68\x82\x40\xae\xb8\x4a\xe6\x17\xf5\xf6\x1d\x81\x3c\x45\xc9\xce\xe5\x9f\x05\x2f\x63\x9b\x72\x68\x0a\xfa\xf3\xd5\x05\x9c\xaa\xd2\x9c\x1b\xc2\x94\xd8\x41\x50\x64\x27\x83\x67\x58\x86\x5b\xa0\x1f\x34\x4d\xed\x51\x91\x96\xb8\x4a\x26\x89\x5a\xa0\x8f\x78\x87\x70\x26\xb9\x15\xa6\x42\x92\x11\x43\x37\xe0\x33\x69\xca\xff\x0b\x04\x31\xce\x26\xee\x62\xc9\xd5\x06\xed\xbd\x30\x40\x9c\x5d\x88\x26\x7c\xcf\x18\x98\xea\x04\x25\xca\xf6\x01\x87\x88\x13\x3f\x10\x89\x0a\x41\x12\x92\x12\x96\x04\xf6\xb0\x61\x2b\xfa\xfd\xef\x9e\x65\xbe\x87\x9d\xbe\xe6\x4c\x93\x71\xe4\x5e\x5f\xb1\x94\x26\xd8\xf0\x20\xdb\xcd\xba\x26\x61\xb0\x6a\x5a\x19\x13\x43\x0c\xdc\x00\x97\x2d\x25\x11\xa6\xbb\xb3\x28\x89\x41\xe2\x5f\xcb\x25\xc9\x88\x32\x11\xb7\x10\xd7\x8f\x95\x69\x25\x60\x1a\xca\x63\xe5\x08\x23\x7c\xd2\x09\x93\x25\xb4\x0b\xd1\xaa\xb1\x42\x29\x27\x75\xbc\x22\x96\xe8\x87\xab\x0b\xf4\x06\xbd\xd2\xf3\x7b\x0d\x3e\x96\x15\xa6\x21\xb1\x5d\x71\xe3\x85\xd9\x97\xab\x57\x0e\x38\x2c\x03\xe8\x13\x71\x61\x8e\xe1\x0c\xb1\x90\xcf\x07\xba\xc5\xd8\x15\x6a\x75\xc7\xc5\x18\x5b\xcf\x1c\x18\x6d\xda\x84\x1e\x20\xe7\xd0\x38\x61\x42\xf7\x91\x73\x00\xe2\x30\xa1\x8f\x20\xe7\x68\x96\xf4\x83\x24\x62\x04\x47\xfa\xe1\xa8\x1c\xa9\x29\x02\x68\xaa\x6d\xaf\xde\x90\x66\x4e\x14\x4e\xb1\xc2\x88\x86\xb6\xa3\x64\x8d\x8e\x20\xbf\x84\x0d\x3e\x1e\xbf\x92\xe4\x7b\xca\xca\x27\xe3\x22\x1b\xa3\x42\xde\x5d\xc2\x87\x28\x71\x93\x07\x84\xe3\xa2\xc8\xa8\x09\x10\x6e\xe7\x51\x06\x30\x63\x0e\x79\x33\x3d\xa6\x4f\xf0\x81\xa3\x8c\xb3\x8c\x6b\x56\xa9\x6f\x75\xcc\x52\x9e\x07\xc0\xee\x4f\x50\x0b\x4c\x04\x27\x9b\xa6\x85\xbd\x87\x58\x46\x5d\x52\xff\xe4\xd7\x5e\x9c\xea\x9c\x91\x2d\x09\xa6\xdd\xec\x67\xd7\xea\xf7\xb5\xe0\xe4\x76\x00\x00\xa0\x0c\x2f\x49\x66\x2e\x0f\x43\x25\x91\xce\xd6\x28\x1a\x8a\x56\xcd\x04\xcf\xc6\x04\x23\xdd\xf2\x0c\xfc\x5b\xb8\x5a\x8c\x06\xf0\x8d\xac\x05\x5e\x8b\x5f\x0b\xc8\xf5\xad\xb5\x80\xbe\xf3\x6d\xac\xa5\x0c\xde\x44\x9d\xb5\xe8\x8b\xab\xbd\x16\xb8\x41\xbe\x85\xb5\x44\xa8\xf5\x8f\x94\xa5\xfc\x51\x8e\x67\xba\x3f\x9a\x0f\x1d\x67\x48\x34\xeb\x51\x94\xad\x65\x93\xf1\xe2\xa0\xb1\xb4\xa9\xa7\xf6\x71\x5e\x67\x9c\xaf\xf2\xa9\xbb\x3c\x2a\x00\xdd\x09\x5c\xa5\xb4\xfe\x99\x03\x2e\xd2\x10\xc5\x47\xf1\xc6\xa3\x73\xc0\x75\x2e\xf1\x7b\xa1\x61\x29\x8a\xb3\xbb\x62\x54\xdb\xb3\x3f\x7f\xbc\x3b\x6f\x7f\xac\x09\xf7\x11\x52\xee\xf5\x7a\xf4\xdf\x11\x4e\x73\x2a\x65\xd8\x24\x0d\xf8\x25\x4b\x68\x47\xf7\xca\xf9\x28\xd6\x54\x6d\xca\xe5\x22\xe1\x79\xc3\x5d\x31\x97\x74\x2d\xcf\x2c\x95\xcd\xf5\xec\x5f\x0f\xc0\xa5\x2c\xa3\xac\x61\x74\x80\x04\x76\x2b\xd4\xc1\x04\x93\x6a\x05\x80\x7a\x93\x69\x3a\x00\xd4\x58\x79\x7b\x10\x60\xb2\x4b\x29\xc9\x52\x6b\x88\x30\xe1\xd8\xfa\x3c\x67\xc5\x06\xcf\xe1\xc2\x18\x00\x6e\x73\xc6\x40\xaf\xdf\x70\xc6\xad\x0f\xdd\xc4\x1c\x5b\x55\xca\xd8\x25\x60\x12\xf6\xe4\xe8\xb9\x0c\x00\x6e\x5a\x3e\x8e\xc2\xda\xba\xd4\x73\x3d\x18\x58\x3f\x40\x41\x80\x40\x9b\x31\xd7\x88\xc6\x19\x58\x59\xef\x46\x1a\xe1\xfb\x97\xb0\x0f\x95\xc6\x33\x12\xfd\xa0\xf9\xd8\xcf\x34\xb7\x71\x4c\xb8\x57\x13\x1a\x58\x54\xa7\xf6\x4a\xaf\x36\xa4\x5f\x69\x6b\x44\x83\xc7\xb7\xab\x2f\x0d\x69\x45\x03\x20\xfb\x84\xdd\x67\xc9\xba\xfd\x40\x8f\x20\xef\xa2\x3e\x99\x77\x8f\x9e\x97\x44\x59\x72\x06\x82\xcd\xf1\x0e\x2d\x87\x8e\x4b\x4a\x25\x98\x35\xc1\x29\xdd\x24\xde\xdb\x26\x21\x1d\x9b\x4e\x9f\xed\x98\x37\x81\xad\xd1\x59\xdd\x77\x8d\xf7\x11\xed\x9a\xa2\x6e\x78\x6a\x42\xc6\xab\xa0\x5c\x6f\xff\x43\x1b\xba\x4e\x7f\x76\x77\x7f\x2d\x59\x30\x6e\x62\x26\x9a\x71\xe4\xae\xc1\xac\x69\x9a\xea\x81\x69\x2d\xba\xb6\xf9\x6a\x6b\x16\xc6\xca\xb5\xa1\xb2\x99\x1c\x3e\xab\x26\x1d\x70\x1a\x37\x5b\x3b\xcc\xd0\x7f\x94\x52\x21\x5c\xb9\x9f\x5b\x3d\x27\xaa\x98\x63\x20\xa7\xc4\x6b\x4d\x71\xb9\x58\x8a\xeb\xc9\x6c\x69\x4a\x50\x4a\x57\x2b\xe2\xdc\xe2\x4b\x82\x0a\x2c\x70\x4e\x14\xb8\x51\x0c\x6a\xa1\x0b\x2f\xf3\x13\x03\x5f\x21\xec\x7a\xdd\x56\x11\x70\x33\xe3\xa3\xa5\x0a\xe5\x74\xbd\x31\xb2\x0e\xc2\x28\xe3\x6c\x0d\x11\x7d\x7a\x0a\x19\xc7\xbe\x93\x08\xcc\x81\x0b\xf4\x88\x45\x8e\x30\x4a\x70\xb2\x01\x2b\x21\x66\x28\x2d\x05\x24\x78\x2a\x82\xd3\xdd\x5c\x2a\xad\x67\x6b\xe9\x08\x4c\x69\x06\x03\x5e\x2f\x74\xa7\x13\x06\xe0\x8b\x9a\x48\x64\x7d\x97\x54\xc7\xc4\xfa\x0a\x9c\x70\xd0\x24\x3f\x0f\xf4\xd6\x01\x9b\x52\xfa\xf7\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xdd\x9b\x53\x4a\x7f\xe7\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\x4a\xe9\x87\x67\x4a\xe9\x1f\x3f\xb7\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\x1b\xcf\x94\xd2\xdf\x19\x65\x4a\xe9\xff\x36\x92\xf5\xa6\x94\x7e\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\xef\x3d\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\x0f\xb9\xd0\x52\xea\x49\xb5\x8c\xc9\x3a\xb0\x06\xfc\x46\xac\xe2\xb2\x5c\xad\xb4\x86\xca\xbd\x97\xb5\x1e\xb1\x63\x89\xae\x72\xdf\x2a\x47\x97\xb5\x26\x4b\xa2\x66\x90\xd6\x60\xc2\x74\xc6\x01\xb5\x81\x94\x90\xd6\x28\x88\x84\x34\x00\x86\x2e\x3f\x7d\x58\x34\x92\x1e\xbc\xa6\x4c\x6f\x2a\xc4\x50\xcc\x31\xcc\xe6\x13\x4b\x62\x9c\x92\x35\x62\xfb\x22\x41\x2d\x7e\x93\x8c\x4b\x13\x53\x00\xa0\x7d\xae\xa9\x0d\x66\x8c\x38\xa9\x83\x2a\x90\x95\x97\x84\x30\xc4\x0b\xc2\x8c\x1f\xca\xb5\x65\x40\x58\x29\x9c\x6c\x16\x7a\x7c\x16\x84\xea\xb2\x43\xab\xd1\x35\xeb\x25\x38\x37\xc8\x15\x24\xc7\xd4\x0c\x80\x70\x22\xb8\x94\x28\x2f\x33\x45\x8b\x6a\x08\xdf\x8e\x11\x88\x01\x32\x91\x59\x15\xc2\xc0\xb1\x40\x8c\x29\x1e\x62\xfa\xed\xc6\x4a\xb7\x04\xce\x06\x03\xaf\x41\x36\x9a\x41\x42\x7b\x5e\xa8\x9d\x71\xb9\x1a\xc7\x13\x15\x52\xa1\x24\xa3\x70\xfd\xc3\xec\x4c\x4e\x28\x8c\x32\x0b\x38\xf5\x15\xe4\x8a\xc2\x5a\xa5\x5d\x2c\x4b\xe1\xd6\x28\x94\x34\x8e\xc6\x7a\x18\x3b\x40\x4a\xa5\xbd\xa3\xa5\xcf\x33\x81\x5d\xef\x10\xb3\xd9\x6e\xad\xb0\xdd\x29\x0c\xe1\xc6\xb4\x3f\x35\x06\x19\xc0\x02\xa4\x3c\x59\x45\xa9\x3e\x54\x90\x62\xec\xf2\x7c\x66\xad\x3e\x23\x45\x95\x2c\xa7\x36\xd8\x5f\x69\xc1\x1d\x44\x3b\x5b\x20\x02\x46\xb6\x9a\x66\x49\x42\xb4\x08\x8d\x3b\x27\xcc\x0c\x77\xd0\x51\x52\x44\xe4\x94\x81\x5b\xf6\x23\x91\x12\xaf\xc9\x8d\xd7\xc0\xe3\x13\x9b\xc0\xc6\x53\xa3\x1a\x08\x21\x03\x19\xaa\xfe\xa5\x76\x89\x9d\xfa\x18\x42\x63\x2a\x28\x37\x73\xa9\x62\x00\x1f\x05\x55\x5a\xa7\xa2\xd2\xe4\xd2\x81\x5d\x73\x3f\xe0\xd2\x0f\xba\xe9\x84\xfb\xe8\x40\xd7\x20\x35\x7f\x67\xa9\x71\x5c\x2d\x09\x5a\x0a\x4a\x56\x68\x45\x19\xce\xac\x07\xca\x47\x5f\x90\x23\x82\x8d\x40\x2d\xa5\x16\x4d\x39\x73\x8e\x15\xb7\x86\x05\xfa\xd1\x2e\x42\x89\x92\x25\x78\x30\x67\x99\xf1\x94\x20\xba\x42\x6b\xf0\x76\x09\xe3\x50\xff\xdd\x9b\xff\xf5\x7b\xb4\xdc\xe9\x1b\x11\x0c\x95\x8a\x2b\x9c\x55\x68\xca\x08\x5b\xeb\x3d\x00\x06\xe1\x3b\x0b\x59\xd6\x4c\xbf\x74\x98\x85\xba\x2a\x66\xe9\x6f\x7f\xf3\xb0\x6c\x5f\xe9\x67\x29\xd9\x9e\x35\xf6\x65\x9e\x71\x6f\x5c\x4a\xb7\x19\x4e\xff\xe5\x3b\x20\x5e\xf6\x10\x24\x14\x5f\x88\x20\x49\x97\xfc\x84\x36\xfc\xd1\xe4\x60\xf6\x50\x54\xed\x12\x2f\x78\x51\x66\xfe\xae\x3d\x08\x7d\xd0\x54\x0c\x78\x2a\xed\xed\xd0\x0a\x67\xec\x3d\x39\xa0\xe8\x5b\xc0\x7e\x5e\xd7\xbc\xe1\x8d\x8b\xd3\x4d\x8f\xdb\x78\x28\xab\xe4\x56\xb9\x4f\xa5\x20\x0b\xf4\x01\x67\xd9\x12\x27\x0f\xf7\xfc\x7b\xbe\x96\x9f\xd8\xa5\x10\x5e\x31\xa0\x35\xef\x0c\x6b\xbe\xbc\x29\xd9\x43\xbb\xd5\x42\xc6\xd7\x5a\x8e\x2b\x4a\xe5\x22\x56\x1a\xab\xf2\x00\x76\x33\x85\x33\x5e\x5d\x02\xd8\xf6\xb2\xa9\x61\x93\x27\xa0\x2b\x08\x78\xc2\x0c\x11\x3d\x57\x1f\xa6\x35\x45\x37\xe7\x22\x9b\x64\xf9\x9b\x37\xbf\xfb\x83\x21\x7d\xad\x5d\xfc\xe1\x0d\x38\xff\xe5\xcc\x30\x17\xcd\x19\xfd\x1c\x5a\xe6\x38\xcb\xb4\x22\xd1\x24\x6a\xbd\xad\x8b\xd8\xde\x4d\x43\xd4\xaa\x62\x08\x33\x5a\xb8\xbb\xbf\xff\x5b\x40\xb2\xa3\x4a\x92\x6c\x35\x33\xb1\x77\x55\xbe\xed\x29\x5c\x14\xa7\x96\x77\xe9\x5b\xbd\x7b\x35\x1c\x26\x66\x6d\x79\x56\xe6\xe4\x82\x40\xd3\x95\x88\x65\xb6\xde\x77\x11\x1b\x99\xed\x8f\xb6\xcc\x78\xf2\x80\x52\xfb\x47\x98\xac\x67\x99\xe0\xb5\xb2\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x17\xc9\xf3\xdc\x8e\x5b\xcd\x39\xb7\xfc\x6d\x39\x2e\x0a\x68\x34\xb6\x82\x04\xa1\x47\xb3\x80\x80\x8e\x05\x10\x6c\x27\x1d\x7c\x9c\xee\x5b\x06\xa8\xff\x42\xee\x59\x4f\xfd\x89\xdb\x80\x02\xfe\xdb\xc4\x8b\x8c\x48\xad\x43\x75\xd8\x5e\xb5\x36\x73\x63\x68\xcc\xc0\xc9\x7c\x76\x1f\x9e\x51\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xc6\xa8\x20\x42\x42\x73\x38\xf5\x19\x76\xf4\x7d\x86\x69\x28\xa3\x0b\xa1\xba\xe1\xd1\xf3\x96\x31\xdc\x81\xa7\xde\x13\xef\x2b\x01\x6f\xdf\x33\x7b\xf3\x18\x02\x87\x64\xfc\x98\x33\x7c\xc3\x53\xfb\x09\x1c\x52\x53\xb8\xa0\x47\xd4\x92\x11\xb9\xef\x47\x6f\x8f\xf7\xb9\x5e\x4b\xfb\xac\xea\x5f\xaa\xc3\x6a\xde\xb2\x47\xd1\xbb\xb7\x47\x3a\xa2\x30\xf4\xa8\x13\x0a\x67\xb3\xd1\x71\xab\xbe\x0f\x5a\x22\xb4\xd9\x84\x20\x05\xd7\xa2\x8c\x95\x89\x17\xc8\xd8\xb4\x35\xd6\x2d\x58\x74\xfa\xee\xf4\xd9\xe7\xd4\x2c\x52\xf0\x02\xaf\x07\x4a\x47\xed\xad\x75\xff\x43\x94\x12\x23\x60\x10\x09\x42\x1a\xfc\x1d\xdc\x46\xc1\x85\x16\x16\x82\xeb\xec\xe4\x7c\x7c\xd6\x4c\xeb\xd0\x67\x45\x10\x13\x1c\xfc\x18\xf4\x62\x23\x84\x05\x2f\x59\x6a\xf5\xf3\xca\x10\xf2\x71\x6f\xc2\xd7\x9c\x81\x90\x63\x72\x90\x02\x61\xab\xe6\x69\xc5\x88\x6b\x0e\xf3\x76\xf1\xf6\xcd\x97\x65\x93\xf7\x7b\x0d\xf1\x34\x46\xae\x2b\x36\x69\xce\xc6\xb3\x67\xe4\x0a\x6c\x44\xcf\xea\xa3\x55\xda\xea\xfa\x19\xd4\x55\x15\x80\x9f\xb4\x32\x46\xa2\x4a\xe1\x21\xf4\x0a\x44\x1a\x2d\x0b\x36\xb2\x12\x5e\x8f\x2a\x03\x13\x97\xd6\xae\xf5\xbb\xe5\xb3\xce\xb6\x39\xc4\x86\x68\xfb\x74\xe1\x30\x35\xd9\xaf\x7b\x8e\x79\xab\x8b\xdc\x09\x7a\x65\xde\x3c\x95\x10\x8b\xfa\xfa\xd9\xdb\x6b\x97\x7d\xf9\x54\x04\xf3\x28\x5b\x4b\xbf\x7c\x2a\x30\xe8\xd0\xc5\x10\x0e\x06\x84\x8e\xf6\x2d\xe3\xc7\xc1\x9f\xc8\x06\x6f\x09\xc4\xc9\xd2\x0c\x0b\x6f\x26\x81\x85\xcb\xd1\x9d\x59\x15\x34\xbb\x25\x6c\x4b\x05\x67\xe0\xa7\xda\x62\x41\x21\xa7\x08\x5a\x11\x12\xa6\xe5\xd3\x5f\xbf\xfa\x7c\x7e\x0b\xfe\x81\x70\xb6\x9b\xc9\x3d\xb0\x2b\x2f\x25\xc4\x20\xec\xad\xa0\x31\x54\xbd\x71\x43\x73\xed\xd9\x54\x37\x7f\xbd\x2b\xc0\xeb\xdc\x7a\xf4\x1c\xf2\x52\x95\xd8\x9f\x4d\x61\x1e\xf2\x94\x64\xa5\xa4\xdb\xe7\x9e\xff\x61\x89\xa7\xba\x15\xbf\x82\xc0\x63\x43\xba\x2f\xa8\x87\x76\xfb\x1b\xee\x9e\xca\x6e\x2c\x38\x98\xf5\x18\x57\xc3\x5d\x4f\x7b\x8d\xcb\xa7\xb2\xaa\x8d\xd3\x4c\x65\xb5\x8a\xab\x4d\xb9\xf0\x6a\x41\x55\x5d\xc8\xb4\x6b\x76\x87\xfc\xac\xe3\xa8\xb0\xfe\xbd\xf4\xec\x51\x60\x77\x7c\xfb\x62\xba\x36\x7f\xcf\x13\xdc\x49\xfd\xef\xb4\xd2\xb6\xef\xa1\x1c\x92\xb0\xf4\xb2\xcf\x33\x22\x94\xa9\x4f\x2a\x6c\xcc\x98\x85\x88\x38\x43\x19\xe7\xc5\x12\x27\x0f\xdd\x9d\x91\xbc\x5b\x5d\x06\x5a\xee\xe2\x35\xa6\x4c\xd6\x19\x49\x57\x37\x0b\x74\xcd\xa1\x8a\x8d\xd1\x30\xe1\x7e\xea\x53\xc3\x3b\xd3\xf9\xe1\x6a\x06\x70\xf5\x1f\xd6\x5c\x4a\x5a\x40\x7c\x7f\xc9\x68\x62\x32\x5d\x7a\x31\xd4\x77\xeb\x64\x7c\xfd\xc1\x78\xa4\x82\x18\xe2\x6b\xeb\xb8\x82\x90\x85\xd6\x5c\x8c\xfe\xdf\x20\x1b\xa8\x7f\xda\x3b\x81\x1e\x5a\xc8\xf8\xfa\xfb\xbe\xda\x0c\x9d\xe1\x4d\xe2\xdb\x91\x47\x67\x3c\x25\x77\x24\x83\x63\xb7\x3f\x83\xb8\xd2\xc2\x01\x22\x6f\x2d\xe1\x02\x8a\xe6\xda\x23\x78\xcd\x53\x57\xb0\x8c\xa7\x26\x7a\x49\x26\x1b\x92\x96\x19\x78\x42\xfa\xa7\xdf\x43\xfa\x05\xd6\x07\x3b\x88\x3a\x9b\xee\x68\xfd\x2e\x60\x8c\xc5\x36\xf7\xc2\xc6\x44\x96\x2c\x25\x22\xc3\xd0\x4a\xdd\x60\x35\xb5\x63\x75\x6f\x0b\x3d\x53\x4d\x77\x6b\x28\x98\x63\x70\x5f\xd5\x25\x9a\x69\x46\x4f\x0a\x43\x22\x29\xc9\x88\x72\x69\x3c\x9d\x58\x65\x3f\x3d\x16\x3c\xfd\x68\xf3\x3f\x83\xeb\xba\xa9\xdf\xab\x77\x5f\xa2\xef\xf1\x92\x64\xc6\x7a\x79\xae\x99\x14\x36\x4b\x35\x68\xef\x13\xf7\x1b\x22\xbe\xd5\x35\x71\x93\xbc\x0a\x9e\x76\x26\x1f\x52\xcf\x70\x3d\x68\xdf\x2d\x10\x5f\xae\x7a\xe0\x3a\xdc\x2b\x95\xdb\x58\xaa\xc9\x57\x2b\x6d\x92\x0d\x1c\x89\x07\xb2\xb3\x2e\xf1\x1c\x17\x48\x2a\xee\x6b\x7b\x6c\x6c\xa6\x55\x99\x6a\xc3\xc7\x4c\x9e\x29\x50\xd1\x72\x57\xf7\x0c\x57\x9c\x67\xd6\xc7\xc6\x05\xf1\xba\xd8\x04\x51\x82\x92\x2d\x41\x58\x2c\xa9\x12\x58\xec\xaa\xfc\x5e\x70\x28\xec\x2a\x9a\xfa\x47\x49\xc4\x0e\xe4\x21\x08\x84\x02\xc1\xab\x17\xa4\xa6\x39\x41\x80\x23\xa7\x26\x91\x30\xe7\x29\x5d\x01\x01\x5b\xc2\xed\x84\x00\xf6\xfb\xf6\x4b\x49\xc4\x7c\x5d\xd2\x94\x9c\x35\x36\xae\xcf\x7d\x10\x94\x0d\xa0\x62\xc7\x97\xdc\xef\x8f\xb8\x80\x38\x0a\x78\x5b\x6f\xaf\xa1\x78\xd8\x63\xd9\xea\x72\x6d\x13\x3a\x7b\x87\xe4\x62\x8d\x19\xfd\xd9\xe0\x3b\xc1\x8a\xac\xb9\xd0\xff\x7c\x25\x13\x5e\xd8\x5d\x00\xde\xf8\xba\x81\x56\xbc\x33\xfa\x5d\x2f\x44\x69\x59\x29\xf8\x29\x04\x29\x32\x7b\x1d\xb9\xf2\xc8\x19\x24\x8e\x02\x5c\xdb\x51\x7b\x28\x3c\x23\x6a\xef\x0c\xfe\x47\x6f\x9b\x4f\xbd\xdd\x0b\x5b\xa9\xcc\x7f\x1a\x9d\xad\xbe\xe5\x18\x40\xc8\x02\x27\x64\x81\xae\xea\xa2\xee\xfd\x67\x4b\x13\x6a\x22\x08\x06\x83\x51\x55\xe8\x7c\x86\x70\xa6\x36\xbc\x5c\x6f\x90\xe4\x39\x69\x94\x88\xcf\x21\xdb\x3d\xe3\x8f\x08\x5b\xcf\x73\x3f\xe1\xf0\x3a\x11\x48\x4b\x03\x84\xd9\x6c\x57\x50\xbc\x19\xc2\x85\xe6\x57\x82\x62\x65\xcd\x96\xb8\x54\x3c\xc7\x8a\x26\x5a\x6e\xef\x97\xdc\x5c\x69\x86\x42\xd0\x1c\x0b\xaa\xb5\x66\xe7\xa9\x84\xc0\x67\x58\x05\x67\x88\xa6\x24\x2f\xb8\xd2\xaa\x8b\x21\xa2\x66\x6d\x77\x8f\x10\xbc\x82\x38\x5d\xce\xfa\xc4\xc8\xd1\xa7\x96\x42\x19\x88\x15\x25\x42\x7e\x07\x7b\xe1\x27\x82\xde\xa3\xe5\xbf\x59\xb9\x50\x7d\x25\x16\xf6\xee\x20\x61\xc3\xf6\xe0\x98\xd5\xad\xe6\x53\x43\xe5\x6b\xbe\x25\x02\xaa\x50\x5b\x7a\xf7\x58\x72\x9a\xe9\x52\x8f\x64\x19\x2b\xbc\x14\x82\x72\xa8\x2e\x90\x61\x29\x87\x27\x6b\xdf\x46\x89\x7e\x1d\x61\x29\xe9\x9a\xd5\xb7\x9e\x16\x44\x62\x07\xb6\x27\xbb\xc3\xc9\xda\xf1\xf2\x9a\x95\x58\x57\x00\x79\x2a\x48\xa2\xaf\x58\xa9\x7f\xb4\xce\x80\xd6\x3d\xab\x15\x44\xd5\x67\x11\xbd\xb7\x0a\x88\xe1\x1e\x46\xa1\x21\x5b\xc2\x8c\xda\x09\xe2\xba\x89\x60\x69\x40\xae\x6a\x7f\x1b\xa0\x1d\x98\xe4\x1f\x25\x5c\x60\xdd\xb9\xed\x8f\x1f\x0a\xd6\xf2\x87\x68\x79\xdb\xa9\xf4\x49\x84\xed\x9e\x10\xd0\x06\xc2\x24\x1a\x43\x17\x07\x4d\x53\x36\xb0\xe7\x66\xa4\x28\xe2\x6f\x5c\xf2\x42\xb7\xd2\xb8\x36\x25\xf5\xc2\x7b\x47\xfe\xaa\x0d\x4a\x82\xd7\x46\xa8\x29\xc9\x0b\x61\x76\x6c\x0b\x92\x01\xdc\x8e\x6e\x3e\xd2\x6c\x31\xe2\xbb\x84\x46\xb7\x1d\x09\x36\x17\xe9\x1d\xe5\x2b\x36\x1c\x19\xb4\x3e\xf4\xfc\x49\x10\xa5\x6f\xa7\xae\xdb\xa2\x6d\x37\x87\x5a\xc6\x76\x7a\x7b\x46\x87\x0d\x86\x48\x3c\xf0\xa7\x80\xa6\xb3\xe2\x75\x4c\x41\x67\x96\x54\xa2\xd3\xb7\xbf\x79\xb3\x39\x9d\x99\xfa\x30\x6d\x5b\xbc\x20\xeb\x32\xc3\x42\xef\x8a\x30\x21\x7a\xe8\xef\xff\xf7\x9b\xf9\xff\xfa\x7f\xff\x7f\xaf\x72\xf9\x5f\xf2\xbf\xf2\xff\xda\xbc\xfe\x7b\x07\xe6\xab\x9c\x66\x19\x75\x01\xbb\xee\x7f\x73\xca\x4a\x05\xae\x94\x52\xc8\x8e\xd9\xd7\x7f\x6f\xf0\x52\x91\x1b\x41\x56\xf4\x29\x8c\x12\x3d\x5d\xfd\xae\x96\xf3\x57\xf4\xa9\x8d\x15\x41\xd6\x54\x42\x09\x12\xc8\xe6\xdb\x60\x96\x82\x5c\xb9\xea\x0b\xf3\x70\xce\xfb\x52\x92\x55\x99\xcd\xa0\xa4\x10\x58\x4b\x2f\xad\x1e\xf3\xc3\xed\xf7\x26\xe4\x4f\xf3\xd2\xa7\x9d\x09\xaf\x7b\x14\x14\xa4\xb4\xde\xe4\x5c\x98\x99\xb4\xfe\x79\x73\x78\x66\x95\x0f\x08\x27\xfa\x62\x6a\x41\xa7\x12\x49\xa5\xaf\x2d\xe3\x76\x58\x96\xdd\x9d\x83\x0b\xcc\x58\x98\xe0\x7f\x1a\x77\x01\x68\xe7\x08\x37\x2a\xb1\x34\x31\xb3\x40\x1f\xb8\xde\x52\xac\x0f\x51\x07\xac\x3e\xc6\xa5\x34\xe2\x2a\xfa\xbb\x3e\x23\x89\xca\xcc\x3a\xff\x1e\xbd\x69\x92\x24\x82\x74\xb9\x5d\xfb\xae\x37\xef\x98\x28\x09\x17\x78\x51\xfd\x68\xcc\x0c\x52\xcb\x49\x95\xbc\x8c\xb0\xec\x8d\x44\x6b\xed\xb4\x39\x53\xce\x6e\x69\x4e\x43\x6d\x89\xaf\xbd\xc3\xcd\x8f\x3a\x10\xe1\xda\x34\xd5\x5e\xed\x84\xc0\x6e\xdd\x84\x71\x46\x54\x72\xd6\x14\x47\xce\xec\xa2\xcf\xfe\x68\xfe\x63\xae\xe7\xfd\x6f\xfb\x28\xf3\xf8\x8f\x07\xc5\xcd\xae\xa1\x72\xa0\x11\xd1\x3e\xae\x5b\x05\xab\x36\x3c\x4b\x25\x82\x68\x74\xb0\x90\x39\x58\x08\x2b\x25\xe8\x12\x68\xb5\x4f\x39\x4f\x78\x9e\x37\x83\x6e\xab\x32\x8c\x36\xe2\x25\xf5\xb4\x44\xe9\xa9\xa9\x35\x42\x28\x59\xf9\x2b\xc8\xb7\x56\x79\x72\x6e\xee\x0c\x9c\x41\xa2\x8f\xbd\x21\x32\xb4\xd6\x5f\xb7\x8a\x63\xda\x6a\x91\x8d\x10\xc3\xde\xbb\x03\xd4\xb5\x82\xa7\x0b\x74\xa7\xd5\x2c\xeb\xde\xd1\x1b\x62\x9b\xa1\xb5\xaa\x8c\x2b\x0e\x41\xd7\x6b\x23\x5b\xf2\x47\x0d\x76\x43\x8b\x7e\x35\xda\xde\x78\x0e\x24\x18\xc5\xf4\x27\x55\x30\x51\xc1\xd3\x77\xe8\xff\x61\xe8\xad\xa1\x43\xfe\x08\xd2\xe9\x9f\xaf\x2e\xfc\xf5\x9d\x96\x66\xe4\x0f\x77\x80\x2e\xf4\x1b\xf3\xa5\x24\x6a\x4d\x53\xb4\x34\x35\x59\x24\x51\xe8\x15\x23\x8f\x26\x22\xc2\x68\x65\x40\xd2\xfd\x57\x74\xed\x12\x73\x5e\x81\x6a\x92\x76\x98\xd7\xe8\xb7\x66\x9c\x82\x08\x5b\xca\x51\x8f\xe5\xf7\x93\x7f\xba\x3d\xb5\x81\x76\xe2\x71\x2e\x1e\xe7\xf3\xf9\x5c\xaf\xd3\x55\x3c\xef\xa9\xdc\xae\x15\x3e\x63\xad\xf1\x06\xa2\x56\xd8\x06\xa6\x5a\x4f\xc5\xb0\x5c\xb6\xb3\xab\x58\x9c\xf4\x7c\x3d\x54\x53\x3a\x9c\x56\x11\xee\x70\xf0\x8c\xde\x06\xe1\xa6\x52\xe3\xba\x1a\xf4\xd4\x95\xf3\x17\x02\x3f\xb0\x04\x78\x20\xbf\x7f\x54\xcd\x52\xab\x12\x63\x15\x8e\x79\x39\xc2\xae\x05\xba\x15\xbc\x48\x9f\x82\xe3\x77\x28\x38\xb0\x37\x41\xd5\x81\xc0\x7b\xe8\x47\x74\x25\xd8\xef\x3d\xe0\x31\x12\xc7\xf4\x23\xf0\x15\x19\xf7\x31\xe7\xc3\x48\x74\xa0\xb8\xe4\x81\x65\x75\xc3\x31\x1a\xc1\xa6\x03\xcf\x68\x37\x10\x66\x12\x23\x1b\x0d\x74\x0a\x67\x7a\x94\xec\xa8\x3d\xf3\xed\x4f\x3f\xcc\xf8\x3d\x8b\x2d\x91\xf9\x55\xd8\xca\x70\x53\x81\xf1\xed\x04\xda\x72\x4a\xff\x46\x3f\xa7\x93\x80\x9b\x41\x2f\xe0\x91\x3d\x04\xfe\xd5\x2e\x99\xa1\xa0\xca\x60\x87\x80\xc3\x7a\x03\x0c\x95\xbf\x1a\x0c\x04\x1d\x8c\x89\x09\x75\x02\x38\xac\x07\xc0\xcb\xcf\x39\x54\xf1\xff\xb0\x5a\xff\x2f\x3f\xe7\x50\x65\xff\xc3\x6a\xfa\xbf\xf4\x9c\x83\x26\xcc\xa6\x4a\x05\xf2\xee\x30\x7f\x3b\xaf\xf4\x7a\x50\xc1\xe4\x7e\x97\x14\x93\x82\xe9\xba\xad\x9a\x52\x91\xbd\x33\x6f\xb3\x9e\x19\x28\x66\xd6\x6a\xda\xe9\x64\x70\xea\x5c\x50\x3b\x2d\x6c\xfb\x39\x50\x8b\x61\x32\xee\xa6\xe8\x24\x15\x9c\xda\x1c\x3b\xad\x3d\x04\x11\x1b\x08\x09\x1f\x6e\x57\x33\x94\xb3\x1d\x0a\x1f\x93\x3b\x99\xa8\x7e\x1f\x72\x5b\xfb\x37\xef\x81\xd6\xdf\xb0\xb5\x54\x76\x95\xd4\x41\xaa\x5c\x52\x5e\xb9\x10\x94\x61\x88\x3f\x01\x0d\xae\x64\x75\x45\x0d\x07\xe3\xd5\x7e\x36\x8c\xbb\x7f\xfa\x83\x13\x4d\x64\x99\x93\x4a\x33\x5c\xb2\xa4\x13\x8a\x33\x80\xe5\x9e\xc5\x1a\x9f\x21\xc4\xdb\x3f\x10\xc1\x48\x56\x57\x21\xb6\x37\xac\x4f\xac\x1c\x8e\xa3\x0f\x47\x38\xf7\x54\xd0\x5a\x19\x43\xa1\x06\xbb\xb3\x25\xfd\xbc\x9f\x47\x44\x34\x0e\x14\x8c\x6b\x27\x21\x80\xf0\x74\xdc\x19\x84\x23\x2a\x03\xd1\x92\xa1\x12\x70\x03\x71\x94\xa1\x63\x30\xdc\x54\xe4\xe0\x76\x22\x07\x09\x5e\xae\x91\x48\x37\xbd\xea\x54\x46\x89\xae\x2f\xd6\x4b\xe4\x88\x5d\x44\x86\x8e\x49\x7c\xe7\x90\x97\xe8\x19\x72\xfc\x6e\x21\x87\xf5\x09\x41\xcb\x40\x01\xdd\x17\xe8\x10\xf2\x02\x3d\x29\x62\xaa\xfc\x0f\xb2\x8c\x71\x9d\x40\x0e\xeb\x01\x82\x82\xcb\x18\xdd\xfd\xa3\x89\x4b\x2f\xd4\x71\x38\x3e\x0e\x2e\xa3\xba\x79\x1c\xde\xc7\x03\x71\x7f\x7b\xc0\x83\x3a\x78\x54\xa6\x06\x2f\xd8\x11\xbd\x3b\x22\x3c\x09\xf5\x73\x18\xe7\x0c\x4a\xd8\x87\x70\xcf\x70\x26\x56\xb8\x53\x47\x64\x2f\x8e\x97\x3c\xbd\x87\x78\xb1\x6d\xe8\xd2\x79\x92\xf0\x92\x0d\xc7\x44\xdd\x75\x5e\xef\x3b\xdf\xed\xb7\xfa\x02\x14\x4b\x13\x20\xe0\x88\xfa\x46\xf0\x9c\xa8\x0d\x29\x65\x6f\x1c\x8c\xdf\x7b\xb9\x09\x87\x11\xdf\xfd\xe5\x5c\xcf\xa9\xe5\x76\xdc\xcb\x77\xb0\x42\x66\x4a\x8a\x8c\xef\x9a\x49\x50\x5d\xcf\x1f\x6f\x5c\xcb\x7c\x85\xfe\xae\xb9\x08\xe5\xec\xef\x0b\x74\x67\x92\x85\x40\x16\x41\x0a\xaf\xc1\x0f\x6c\x50\xf1\x97\xf3\x46\xa4\x44\x07\xa6\x19\x56\x9a\x48\x89\xbc\x54\xc0\x8c\x3a\x19\x19\x9f\xcd\x40\x40\x6d\xf7\x78\x6d\xea\x61\xae\x59\x6f\xa0\x2f\x5d\xc1\x98\xc6\x81\x14\x8f\x48\xc5\x05\x5e\x0f\xec\xbd\x79\xc7\x6d\x78\x1d\xeb\xa7\x91\xb1\xe1\x8f\x0e\x48\x4b\x2a\xea\xbb\x57\x3b\xf9\x0e\x94\x49\x85\x59\x42\x46\x05\x40\x41\x81\x08\x4f\x3a\x4e\x3b\xbe\xe6\xd2\xbe\x69\xb2\x14\xef\x6c\xf0\x33\x6f\x4c\x71\x8f\x08\x7b\x8f\xdf\x9d\xc2\x8a\xac\xca\xec\x8e\x28\xb9\xdf\x3b\xc6\x55\xc4\x2e\x32\x9c\x90\xb6\x23\x0b\x32\xc6\xef\x49\x5e\x64\x58\x79\x32\xa4\x46\x46\xbc\x58\x34\x9f\xd9\x7c\xea\xb3\xef\x00\x13\x29\x15\x7d\x91\x2d\x43\xd2\x5f\x4e\x52\x5a\x7a\x7b\x98\xb7\xf1\xf8\x23\xf8\x54\x6c\x03\x7a\xb7\xd9\x06\x40\x95\x49\x87\x93\x07\x93\xf0\x52\xa7\x3b\x79\x59\xde\x5e\x0f\xfa\x93\x13\x97\xc2\x44\x30\x73\x96\x70\xc3\x5b\x78\x4a\x4e\x1b\x79\x4f\x66\x4c\x3f\xe0\x8f\x75\x51\x3e\x53\x46\xc4\x86\x52\xbf\xb2\x00\x5e\x23\x2e\xd0\x47\x92\x43\x32\xd6\xf3\xb0\x1f\x44\x3e\x8a\x91\x12\x24\xfd\x99\x40\x74\x55\xdc\x26\xdc\x43\x85\x9e\x3a\x26\x2c\x83\xbc\x26\xb7\x1b\x4e\xe3\xb3\x56\xd3\xc0\x6d\xe6\x0e\x85\xf3\xb7\x1a\x0f\x34\xfd\xd9\x96\xee\x31\x32\x96\xe4\x46\xcd\x4a\x80\x2f\x69\x98\x39\x60\x2d\x20\x20\xc0\xce\x00\x30\x17\x1b\x58\xba\x0a\x34\xe6\x5b\x47\x31\xd5\x04\x1e\xbd\xa9\x00\xa8\x76\x95\xe7\xad\xda\x7f\x4b\xa2\x1e\x09\x31\x77\xc7\x9d\xc3\x5f\xe3\xb2\xd7\x5a\x48\x50\xf4\x86\x90\x95\x32\xd7\x08\xb4\xb3\xb2\x11\x99\xfa\xec\xb6\x2b\x1a\xd5\xa1\x05\xf7\x01\x71\xa3\x41\xc7\x8c\x66\x6d\x42\x76\xae\xc8\x0a\xb1\x25\xb3\x71\x70\x86\xfa\x02\xaa\x4c\x74\xa8\xf4\x91\xc8\x31\xa8\xdc\xf7\x30\xb4\x08\xc3\xe2\xcd\xe7\xf7\x95\x20\xef\xe5\xb8\x6d\xee\x7a\x00\x1f\xc3\x05\xb5\xb7\x64\xdc\x31\x3a\xbf\xb9\x72\xb7\xaa\x33\x40\xc1\xe5\x6e\x7e\x23\xa9\xa9\x20\x8e\x8d\x44\x13\x38\x46\x82\x40\xb2\x8a\x8d\x6f\xb4\x41\xf9\x06\x7f\x0b\x90\x83\x34\x09\xb9\x72\x80\x9c\x6d\x89\x50\x48\x90\x84\xaf\x19\xfd\x39\x50\x0a\xdb\x8c\x5e\xc9\xe9\x1a\xd5\x12\x0a\x66\x98\xec\x1c\x38\x05\xb3\x4a\xfa\x14\x44\x8f\x87\x4a\x16\x01\xd9\x64\x91\xf4\xb2\xbd\x35\x55\x8b\x87\x3f\x00\x79\xd9\x74\x43\xb5\x3b\x83\xe8\x6c\xba\x2c\x15\x17\xf2\x2c\xd5\x42\xef\x99\xa4\xeb\x39\x16\xc9\x86\x2a\x02\x29\x48\x67\xb8\xa0\x73\x58\x1c\x33\xe9\x60\x79\xfa\x5d\x15\x79\x79\x30\x5f\x7c\xa0\xfe\x8e\x4e\xed\xbd\xfc\x2b\x35\x0a\x20\x76\x7c\xde\x30\x89\x6a\x6b\x5c\xfa\xf4\xed\xe5\xdd\x7d\x15\x3b\x1b\x50\x9d\xb4\x2e\x09\x3b\x58\x83\x90\xf5\x66\x6a\x84\x53\xb6\x72\x75\x97\xaa\xca\x11\x84\xa5\xe1\xf6\x8a\x8d\x1a\x83\xb2\x5c\x02\xb7\xa9\xe2\x00\x15\xef\x4d\x98\xb8\x62\xe8\x3d\xce\x49\xf6\x1e\x87\xca\x0e\xbc\xf0\x56\x42\x14\xd5\x5c\x6f\xc7\xe1\x9b\x99\x7b\x92\xfe\x7a\x37\xf4\x32\x5f\x92\x34\x25\xad\x0c\x40\x05\xe5\x14\x2b\xfd\x53\x90\x8c\x6c\x71\xbf\x6e\xe1\x1e\xcc\x2a\x48\xb7\x76\xd3\x9f\x53\x92\x65\x20\xf7\xaf\x7a\x2d\x3a\x46\xdc\x3d\x91\x85\x91\x0f\xcf\x09\x0c\x8e\x6e\xf2\x05\xc7\xe7\x06\x86\x97\xd4\xc8\x1b\x8c\xcf\x11\x0c\x82\xec\xcb\x1f\x8c\xca\x15\x0c\x42\x3d\x72\x1e\x61\xb5\xfe\x98\xe6\x28\xfe\xbc\x42\xf7\x7c\x21\x5a\x8a\xce\x37\x0c\x0e\xed\x9a\x4b\x1e\x90\x77\x18\xde\x22\x97\x93\x78\x40\xfe\xe1\x51\xf7\xde\x9f\x87\xd8\xc6\xfe\xc0\xb6\x8f\x2a\xbb\x33\x22\x3f\x31\xb8\xd6\x4a\x2f\x18\x9b\xa7\x18\x84\xda\xcd\x61\x1c\x93\xaf\x18\x04\xdd\x93\xcb\x18\x9b\xb7\x18\x84\x1b\xcc\x69\x1c\xc8\x5f\x3c\x2a\x35\x45\xe5\x36\xba\x27\xe2\x58\x0f\xd2\x9e\x8c\xf5\xec\x9c\x82\x33\xa7\x29\x15\xa7\x44\x02\xf1\x24\x1b\x2c\x70\xa2\x88\x80\xee\x0b\x46\x59\xf2\x0b\x9a\x26\x1a\xd9\x52\x83\x2b\x63\x5d\xf0\x54\x6f\xeb\x86\x8b\x83\x35\xef\xba\x26\xdf\xdc\x69\x3d\xf5\x4f\xe6\x97\x44\xeb\x28\x5e\x8c\x46\xdd\xf6\x50\x27\xf5\x23\x4f\xc3\x1c\x77\xef\x52\xae\x3f\xaa\x65\x96\x26\x02\x6d\xbf\x82\x5c\xbf\x11\xe6\xe3\x75\x38\xb7\xbd\xea\x36\x78\x3b\x3e\x39\x2a\x80\x32\x33\x95\x39\x4c\x65\xfe\x36\x44\x7c\x11\xbd\xe6\x22\xaf\x9d\x98\x56\x60\x5a\x2c\x30\x26\xba\x71\xb5\xc9\x8c\x75\xbe\x2a\x5f\xaa\x11\x68\xed\x7d\x0c\x17\x72\xc3\xd5\x45\x05\x38\xb8\x94\x76\x2b\xe0\x35\x04\xf9\x82\xe2\xea\xba\x02\x03\xd7\x28\x85\x20\x4c\x65\xbb\xbd\x31\xc2\xac\xc7\xcc\x0a\x5c\x7e\x75\x30\x06\x88\xb3\x56\x3a\x35\xf5\xbe\x89\xe9\xcf\x0c\x7a\x68\xb8\x94\xa6\xbe\x95\x2d\xa4\xbd\x89\x34\xc1\x42\x7e\x1f\xd8\x64\x4d\x0e\x41\x78\xf9\x88\x91\x47\x47\x7a\x7a\xa9\x00\xc8\x59\x74\x05\xb1\xe2\xa2\xb3\x85\xdb\xf7\x06\x3a\xc0\xb9\xfc\xa0\x46\xa7\x80\xd6\x22\xeb\x58\xe8\xfe\xd5\x04\xa1\xb7\x56\xda\x4c\x81\xb0\xdc\xdb\x25\x4e\x38\xb3\x8f\x2d\x7b\x1c\x84\x59\xaf\xd7\xee\x92\x29\xc6\x0d\x99\xc9\xa0\x95\x01\xa0\x52\x93\xc8\x0c\x3d\x12\x54\x64\x98\x0d\x35\x4f\x74\x4b\xcb\xf5\x11\x6e\x4c\xda\x65\xa9\xd8\xe9\x2d\xc9\x06\x6f\x29\x77\x4d\xdc\x82\x20\x9b\x28\xd4\x77\xb1\x49\x6a\x09\xdd\x53\xb1\x8d\x18\x71\x41\xbd\x99\x12\xcd\xa7\x6d\xeb\xb9\xb9\x32\xf9\x2c\x96\xd2\x4d\x36\x8f\xcb\x9b\x1f\x54\xbc\xdd\xb3\x24\x46\x34\xb1\x55\xd3\x4c\x60\x45\x13\x76\xbb\x76\xd6\x20\x96\x50\x2b\xe4\x14\x8c\x05\x7b\x9d\x5f\x12\xbd\x25\xe7\x37\x57\x66\xc6\x90\x75\x37\x08\x11\xb3\x9d\x2d\x09\xa9\x36\x54\xa4\xf3\x02\x43\xc4\x8e\xde\xcb\x59\x6b\xb6\x55\x3a\xee\x00\xc8\xe8\xfe\x38\x21\xc3\x88\x7b\x5a\xfb\xe2\xec\x23\x50\x88\xdb\x9a\xef\x2b\x45\x6f\x1f\xdb\xc7\x9a\x65\x4c\x1b\xcf\x6e\x04\xd6\x9e\x33\xf1\x85\x67\x19\xd3\x36\x73\x0e\xf8\x0e\xbe\x30\xd0\x53\x33\x4a\x2b\xf0\x16\x15\x68\x3e\xfb\x69\xe3\x75\x69\x01\x67\xa6\x6a\xd9\xca\xe3\x84\xf8\x97\x17\x35\x06\x6d\x81\x68\x04\x67\xf2\xd7\x3d\x68\x3e\xe3\x35\x67\x34\x86\xb8\x0f\xab\x8d\x30\x38\x7e\x27\xbf\xff\xeb\xd6\x49\xe8\xa2\x26\xa2\xdd\x6b\xa8\x7e\x42\xf3\xf9\xc2\x3b\x14\x55\x63\x61\x70\xf8\xbe\x1a\x0c\x83\xf5\x16\x06\xa1\x86\xea\x31\xf4\xd6\x5e\x18\x84\x78\xf4\xda\x0c\xcd\xe7\x2b\xd6\x69\x68\x3e\x91\x14\x19\xf5\x9a\xf4\x14\x09\x6c\x3e\xfb\xf1\xf2\x10\xf3\x0f\x56\x49\xc4\xb7\x44\x34\xcb\x9b\xbb\xae\x92\x81\xa6\x0b\xe6\x59\x52\x96\x52\xe6\x8d\xf7\x41\x23\xf8\x22\x98\xc8\x2e\xab\xea\x0f\xe3\x9a\x83\xef\x7f\xdc\x4e\xf5\x37\x4b\x75\x38\x1a\xa4\x0f\x7b\x1e\x72\xe3\x36\xb9\xdf\x90\xd6\x2f\x60\xec\x3d\xbf\xbe\x18\x16\x88\xa2\x7a\x9c\x7b\xf6\xc5\x4d\xb6\x39\xb4\x75\x11\xc5\x2e\x03\xb5\xb2\x8e\xa4\x35\x87\xce\x20\x4e\x7d\x67\x7c\x6f\x18\x3a\x68\x09\xac\x6c\x8a\x52\x04\x4c\x41\x32\x9b\x9f\x4a\xc0\x48\x5f\x1b\x5a\x87\xd0\x31\xae\x8b\x3a\xd2\xd0\x63\x5e\xdb\x43\xa0\x9e\x93\x6b\xb1\x01\x98\xd4\x3f\x54\x1e\xec\x11\xc8\x43\xa0\x45\xb8\x64\x98\xe1\xc5\xa1\x71\xdc\x5d\x3f\x0e\xf7\x07\x2c\xb3\xda\xb6\x86\xe8\x04\x1b\x7b\x2a\xcd\x16\xe9\x53\xe0\x2b\x09\xd0\x33\x71\x0e\x94\x05\xa7\xc5\x39\x58\x3f\xe3\x8c\xa6\xd5\x40\x86\xee\xaf\x98\xaf\xd4\xef\xfe\x73\xcd\xd5\x15\x9b\xa1\xcb\x27\xea\x4a\x46\x5d\x70\x22\xaf\xb9\x82\x5f\x5e\x04\x9d\x66\xe2\x07\x20\xd3\x3a\x0a\x8c\x1b\x0a\xac\x3b\x0d\x77\x42\x2c\x71\x9b\xc7\xda\x06\xaa\xed\xa1\x52\x6b\xdb\x5c\x38\x7c\x54\x01\x78\x72\xb0\xa3\x7c\xf3\x71\xfa\x1e\xe3\x6c\x0e\x11\x12\x8b\xbe\x91\x0c\xb2\x23\x41\x72\xd1\xda\x91\xee\xd4\xaa\x41\xcd\x80\x91\x60\xc1\x96\x65\xbe\x07\xdd\x11\x22\xca\x52\x94\x96\xc2\x74\xd3\x95\x4a\x60\x45\xd6\x34\x41\x39\x11\x81\x48\xdd\xf6\x53\x68\xfe\x1e\x37\x85\x48\xae\x6b\x9e\x91\x14\x16\x67\x01\x74\x4f\x8c\x76\x66\x9e\xb9\x3e\xb9\x11\x6f\xb9\xcd\x8e\x14\x33\x23\xa4\xdd\xf8\x15\xc1\x15\xfb\xfd\xa0\xcb\x0f\x7d\x71\xd1\xb8\x31\x31\x73\x43\xe6\xc6\x1d\xf8\x9f\xfa\x9a\x03\x82\xfe\x6f\x54\x60\xea\xcb\xab\x69\x3e\xe7\xae\x98\x5d\xf3\x5b\x6b\x63\x69\x0e\xa3\x47\xa0\x12\xe9\xfd\xdd\xe2\xcc\x57\xfa\xb2\xb5\x38\x10\x58\x89\x6d\x01\xcd\x57\x1d\x89\x65\x86\x1e\x37\x5c\x9a\x3b\x15\x4c\xc1\x83\x20\xa9\x44\x27\x0f\x64\x77\x32\xeb\xf0\x81\x93\x2b\x76\x52\xd7\x7c\x1a\xc5\x6e\x2a\x69\x01\xac\xbc\x27\xf0\xed\xc9\x73\x84\xa0\xa3\x4a\xb9\x46\x45\xf7\x16\x94\x6c\x3e\x3d\x5e\x48\x17\xdc\xdd\x80\x52\xfb\x15\x5d\x2a\x61\x86\x69\x20\x30\x13\x1d\x1e\xed\xda\x63\x57\x80\x52\x97\x61\xdf\x45\xd4\xa1\x70\xbd\x8c\xd2\x78\x8c\xd4\x9f\x54\x8e\xb2\xc7\x66\x74\xac\x35\xa8\xd0\x81\xaa\xb1\xee\x69\x61\xaf\x4e\x05\xfc\x50\xf5\x42\x82\x76\x92\xb9\x49\x78\x7b\xb4\xad\x65\xc2\xce\x06\x96\x64\x65\x6a\xa2\x92\x01\x2c\x28\x82\xe3\xda\x9d\x8d\x46\xe1\x28\xa2\xfa\x5c\x7d\xe2\x04\x4e\xab\x0d\xd5\x66\xbe\xa1\x2c\x6a\xfd\xdc\xec\x75\xe8\x82\x10\x64\x13\xf1\x05\x2d\x59\x07\xe8\xf1\x28\x9e\x55\xe8\xb5\x18\xe9\x5b\x35\x7d\x19\xf7\x2c\x76\xd6\x9f\x04\xc7\x42\xe4\x46\x45\x36\x50\xbd\x53\xdf\x6b\x4f\xe6\x28\xce\x92\xd0\xad\x6b\x88\xf3\x4b\xf2\xb2\xda\xea\x7c\x87\x38\x59\x6b\xa2\x21\x10\xb0\xba\xc1\xfd\x21\x92\xff\x62\xce\xd6\x04\x17\x38\xa1\xbe\x66\x93\xe6\xf9\x32\x41\x48\xb7\xed\x03\x61\xb7\xb2\x36\xb2\xd9\xcb\xc7\x74\x33\xd8\x0d\x89\x38\xdb\xc8\x7e\x54\x03\x17\x66\xc2\x99\x59\x7b\x3c\x75\xbe\xb7\x27\xf9\xbd\xfb\x54\xcf\xdc\x77\x4c\x83\x6b\x80\x84\x65\xb7\xda\x1e\x10\x90\x88\x66\x83\x78\xe8\xcf\x04\x84\x95\x70\xec\x8b\x46\x60\x3d\x2f\xe7\xe3\xb4\xfd\x23\x4e\x6f\x01\xcc\x9d\x69\x3d\x1d\x6c\xee\x16\x41\xa3\xed\xda\xd4\x7d\x4d\x14\xeb\x89\x98\x33\x9c\x49\x94\x12\xf8\xdf\x21\xe9\x78\xc9\x4b\x05\x3c\x17\xee\xc8\x62\x9b\x0c\xf9\x48\x23\x45\xe8\x0c\x4b\x75\x23\xf8\x92\xdc\xd3\x61\xd7\xd5\x7e\xd1\x18\x2c\x95\xe9\x06\xfe\x08\x9e\xed\x25\xa9\xfa\xd6\x9a\x55\x0e\x0b\xcf\xae\x02\x45\x8a\x15\x99\x7b\xeb\x88\x35\x9f\x11\x12\xbf\x5e\xdb\xbd\xc0\x4c\xc2\x64\x9e\xb5\xc0\xd6\xb2\x90\xaa\x80\x46\x58\x8e\x91\x89\x96\xe6\x8c\xb8\xfe\xc4\x20\xd7\x83\x5d\xfa\x2b\x23\xc8\xb6\x1f\x1e\x89\x95\xbf\x94\x39\x66\x73\x41\x70\x0a\x91\xa9\xae\x87\x31\x35\x65\xe8\xa0\xeb\x53\x14\x4d\xa3\x8a\xae\xa1\xa5\x72\x8d\xd4\x61\xac\x8c\x58\xa3\x20\x58\x86\xbb\x2c\xf6\x2c\xf1\x07\x88\x39\x9c\x19\x71\xaa\x0e\xbb\xc5\xfa\xbf\x85\x9a\xa1\x1c\x27\x1b\xca\x62\x0c\x11\xc0\xcd\xa4\xc2\xcc\x20\xcb\xda\x87\xc0\xb6\xb8\xa6\x5b\x6b\x13\x35\x73\x1c\x34\x9c\x9b\xa7\x22\xc3\x53\xd9\x41\x9c\xe6\x9f\x54\xd9\x08\x0e\x89\x4e\x5a\xec\xad\xaf\xb8\xe4\xfe\x63\x22\xa0\x6d\x06\x0f\x89\xe3\xc5\x51\x06\x60\xe0\xd6\x47\xdd\xd8\xb0\x00\x7a\x10\xc8\x50\x19\xa7\xfa\x19\xc1\xe6\x6d\xb9\xa7\x98\x83\x60\x4a\x14\xd6\x89\xb6\x61\xc0\x0b\x0d\xf9\x78\x4b\x8f\xb3\x3a\xcd\xd1\x80\x78\x6e\x5e\x52\x43\x53\x1b\xa5\xde\x87\x65\xb9\x62\x83\x65\xbc\xf6\x75\xa3\xdf\xf6\xa9\x21\x00\xca\x8b\xf9\x97\x55\xa7\x0e\x49\x62\x57\x78\x1d\xae\x38\x8e\xd7\x5f\x24\x0d\xdc\x65\x94\x69\x15\xdb\xa4\x67\x23\xba\x82\xd1\x47\xa6\x63\x2b\x9e\xd9\xb0\xe9\x70\x65\xee\x76\x16\xb2\x2d\xfb\x74\x2a\x9b\xdf\x47\x96\xb5\xee\x94\xa1\x28\x78\x6a\x78\xfe\x7d\x05\x0b\xec\x06\x4a\xe1\x64\x63\x23\x00\xcd\x5f\x20\x78\xad\x8f\x2e\x35\x7e\x95\xcb\x24\x51\xc9\xc6\xb2\x78\x25\x68\x91\x11\xf4\xc7\xca\x46\x38\x23\xab\x15\x49\xd4\xbf\x35\x3a\x5d\xc2\xfb\xfd\x34\x54\x59\xea\xfe\xe8\xfe\xab\x53\xba\x7b\x48\xea\x33\xe3\x45\x94\xa8\xba\x84\x17\xdd\x7d\xee\xe6\x0f\xcb\x32\x30\xa0\x99\x35\x18\xd7\x4d\x3e\xab\x87\xe6\xcd\x35\x62\xb2\x18\x70\x96\xb5\x40\x48\xdb\x2c\xb8\xb1\x91\x36\xea\xc3\x9a\x1e\x3d\x30\xb1\x20\xe8\x9a\xdf\xd9\xc6\x72\x33\x74\x03\x66\x93\xfa\x17\x30\x60\x5e\xf3\xcb\x27\x92\x94\xbe\xcc\xf3\x81\xe3\xea\x75\x21\xb6\xc3\xcb\x6a\x97\xa1\x59\x57\xcb\x65\x58\x93\xa2\x73\x07\xfa\xf8\x02\xb7\x38\xf4\x60\xeb\x81\xec\x64\xe5\xb6\xb1\x6e\x4a\x70\xad\xcc\x86\xec\xfa\xce\x11\x63\xfc\x3b\xff\xdb\x5a\x86\x78\xbe\xa4\xcc\x4c\xac\x4a\x38\xaf\xc7\x74\x56\x5f\x6f\xe8\x97\x7e\x09\xa6\x74\x08\x62\xc3\x9e\xcb\x16\x76\x3f\x45\x7a\x2a\x5b\x7c\xc9\xc7\xa2\xfb\x7c\x92\x0d\x17\xe3\xe5\x3f\x4a\x9c\xb5\xab\xc4\xd8\x9f\x82\xae\xb1\x96\x29\x1f\xba\x1c\xd1\x2c\x4d\xb0\x30\x69\x19\x36\x57\xd5\xf5\xcd\x34\x29\x00\x09\xc4\xcb\x1a\xf6\x11\x40\x30\xec\xbc\x6d\xc6\x50\x60\xa1\x68\x02\x4d\x2e\x6c\x56\x91\xc7\xa9\x36\x94\xe2\x5c\x11\xe4\x9d\xe9\x77\x11\xb1\x09\xf7\xfb\xdf\xec\xdf\x9c\x05\x11\x94\xa7\x60\xa5\xb0\x3a\x92\x97\xca\xab\xe3\xf0\xca\x26\x89\x5b\xea\xe4\x2b\xc7\x53\xaa\x43\xdb\x0a\xd9\xf1\x67\x21\x57\x85\x69\xec\xa5\xf3\xba\xc1\x99\xab\x53\xb9\x40\x7f\xda\xb9\xa8\x22\x88\x30\x32\x81\xb4\x1e\x90\x50\xde\xbd\x5d\x8d\xc1\x40\x6c\x1c\xf3\x15\x17\x64\x4b\x04\x7a\x95\x72\x08\xc9\x25\x5b\x9a\xf8\xbb\x44\xff\x5f\x44\x70\x20\x32\x46\xd6\x58\xd1\x6d\xe5\x58\x71\x76\x08\xe5\xe2\xb4\x25\x7a\x83\x5e\x01\x30\x44\xf3\x9c\xa4\x14\x2b\x92\xed\x7c\x05\xbf\xac\xe9\xdc\x98\xc9\xfb\x07\x7f\x7e\x6d\xc7\x40\x21\xbf\x9e\x22\x7e\x2d\x66\x68\xe4\x84\x3d\x4e\x58\x5d\x87\xde\xc0\x08\xaf\x7b\xba\x55\x6a\xb9\x52\xc7\x1c\x23\x1c\xe8\x74\xfe\x1f\x9a\xd6\x70\xd5\x2c\xc6\x9c\x91\x03\x4e\xd1\x01\xdd\x7a\xb7\xfd\xd9\xf9\x6d\xf4\x59\xf9\xc9\xf8\x42\xa0\xbb\x57\x63\x8d\xbe\xce\xa9\x3d\x73\x74\xee\x99\x92\x0d\xb4\x36\xf9\xdc\x78\xd1\x5c\xbb\x72\x2f\x25\x4c\xf3\x9e\xca\x02\xda\x7a\xbf\x83\x15\x3b\x73\x5e\xaa\xa2\x54\xcd\x8a\x06\xad\xbc\xb2\xd6\x90\x75\x5c\x7a\x6f\xaf\x08\x53\x5f\xda\xa4\xb8\x29\x6e\xe3\xcd\x5b\x00\xac\x77\x15\xf7\x8a\xb6\xb3\xfe\xa8\x24\xcd\xf5\x6d\x62\x9e\x4d\x6d\xd0\x5a\x69\x99\x99\xbe\x2e\xc6\x8a\x0d\x39\x60\x9e\xfc\xcc\x18\x11\xb2\x31\xc9\x46\xc8\x25\x36\x9d\x59\x20\x3d\x57\xf3\xf4\xcf\x2e\x5d\xc3\x24\x34\xf6\x10\x62\xa0\x9e\x6b\x58\xc6\xab\x7a\x85\x47\x1c\xdb\xfd\xfe\xfa\xb5\x6e\x80\x55\xa3\xc1\x7e\x2b\x4a\xda\xc7\x8e\x1a\xad\xe4\x4d\x1d\x1a\xcd\x1a\x2d\x40\x74\xfa\xce\x63\x58\x1d\xb8\xb3\xcc\x62\x6c\x2f\x5b\x6f\x8d\x8b\xb6\x5b\x7f\xef\x13\x94\x12\x45\x44\x0e\xae\xca\x0d\x7f\x34\x7f\x37\x12\x40\xdd\x24\xd7\x77\xc1\xb8\x1a\x07\x1b\x2e\x95\x0d\x70\x74\x08\xb2\x5e\x72\x43\x9a\x8f\x78\x87\xb0\xe0\x25\x4b\xad\x50\x3b\x70\xc3\x7c\xdc\x9b\xe4\x35\x67\xc4\xf6\x73\xea\x54\x55\x04\x7f\x25\x65\xe8\xed\xe2\xed\x9b\x83\x90\xe8\xcf\x48\xe8\x66\x93\xed\x75\xd7\xaa\xab\xc3\x7e\x0e\x78\x16\x06\xc6\x17\x04\xa7\x9f\x58\x16\x23\x52\x7f\xb4\xfd\x8b\x84\x73\xe3\x41\xf0\x2f\xf4\xa2\x80\x9f\x1e\x05\x55\xa4\x21\x1c\xbc\x82\x1e\x0f\x1e\x4c\x73\xd1\xac\xd5\xf7\xba\x2d\xdf\xc1\x87\xa1\xe5\xf8\xfa\x24\x20\x24\xcb\xe5\x81\xe7\xcb\x1e\x24\x20\xab\xfa\x78\x35\x8a\xaf\x7a\x56\xd2\x4e\x53\x68\x1e\xb5\xe6\x92\x4e\x4e\xd0\x2b\xf3\xa6\x16\x91\x39\xf7\xc9\x24\x03\xdb\x65\x97\x77\xf9\x54\xc4\x88\xe9\x97\x4f\x05\x06\x36\x5d\xbc\xf8\x5a\xff\x44\x36\x78\x4b\x24\x92\xa6\xe8\x5c\x06\x75\x82\xef\xcc\x6c\xa1\xee\x1c\x61\x5b\x2a\x38\xcb\xfd\x81\x35\x5b\x2c\x28\x18\x61\x2b\x57\xbb\x44\xbf\x7e\xf5\xf9\xfc\xf6\xa7\xeb\xf3\x8f\x97\xaf\x81\x2b\x10\xb7\xa2\x5a\x2b\x1f\x9e\x75\x63\xe8\xc1\x4d\x71\x73\xd6\x18\x0e\x28\x5a\x6e\x65\xd0\xd7\xab\xb4\x8d\x41\xc9\x93\x96\x0f\xe8\xf6\x90\x93\xe8\xb7\xf0\xcd\xeb\x5b\xa3\xe7\x6f\xbd\x69\x3e\x87\x48\x42\xc6\x29\x1c\x21\x97\x44\x89\x24\x2e\xee\xdc\x48\x1f\x5d\xa1\x24\x46\x1a\xd9\x17\x44\x9a\x82\x47\x9f\x01\xcc\x70\xfb\x2a\xe2\x1d\xf4\xba\x2f\x26\x54\xb4\x35\x61\x53\xbd\xd7\xd9\xe1\x6d\xad\xae\x66\xf9\x92\x1e\x02\x31\xee\x78\x9b\x92\xde\x2c\x1a\xef\xc4\xa9\x82\xf7\x18\xe8\xc3\xf2\x06\x7e\x94\x97\x19\x96\x8a\x26\x7f\xca\x78\xf2\xa0\x57\x1c\x73\xdb\x9c\x9e\xff\x78\xd7\xf9\xae\xb5\x42\x86\xce\x7f\xbc\x43\x17\x54\x3e\x0c\xa5\x50\xba\xce\x9c\x4d\x1b\x1d\x46\x0f\xa6\x71\xd1\xe9\xa9\x34\xd7\xb7\x75\xd8\xb8\x9b\x9b\xe9\x83\xce\xa5\xf7\xee\xb7\x66\x05\x28\x80\xf6\xcc\x52\x79\xf8\x51\x12\xb3\xd4\xa5\x5e\x2a\xa4\x12\xf7\xc7\x42\x0c\x3b\x6d\x57\xf2\x3e\xe8\xa1\x68\x23\xb9\x11\x48\xe5\x22\xb4\x1a\xbc\x19\xf0\xb6\xe3\x25\x7a\xc4\xc1\x50\x44\xc5\x0d\x7f\x58\xa0\x7b\x5a\xbc\x43\x97\x8d\x7e\x4e\xa6\x47\x42\x7b\x10\x2a\xeb\x34\xef\x00\x54\xab\xc0\xc2\xde\x18\x75\x0f\x5a\x4a\x1b\x7d\x16\x5d\x9a\xe6\x8f\xf2\x1d\x3a\x21\x4f\xea\x77\x27\x33\x74\xf2\xb4\x92\xfa\x7f\x98\x5a\xc9\x93\x90\x2d\xfe\x2a\xaf\x92\x80\xa0\x5e\x95\xcd\xdb\x5e\x12\x0b\xaa\x5b\xc4\x37\xdc\xac\xdd\x3c\xc7\xda\xf8\xc0\x10\xf7\x9f\x2e\x3e\xbd\x03\x21\x35\xe5\xc6\x9f\x0e\x89\xd7\x88\x08\xc1\x45\xa5\xf2\x34\xd0\x0d\x97\x6b\xc2\xf3\x42\xf0\x9c\xca\x81\xb0\x18\xb0\x2e\xc3\x11\xf0\xc7\xe1\x44\xb8\x31\xc0\x1c\xe5\x97\xc5\x51\xb7\x70\xa3\x3e\x45\xee\x23\xd4\x96\x0e\x5a\x14\x18\x4e\x24\xb7\x14\x78\xb5\x72\xe9\x65\x33\x57\x8d\xd5\xd5\x1f\x74\x64\xaa\x29\xcb\xc2\xd7\x4c\x32\x44\x2a\x35\x95\x7d\xe0\x8e\xaf\xa3\xb3\x94\x6c\xcf\x64\x8a\xdf\xce\x60\x6a\x86\x50\x6c\xcb\x43\xb7\x8e\x00\x4c\x2c\xd1\xc9\xdb\x93\xaa\x36\x6e\xb6\x9b\x35\x57\x5c\x63\x62\xc5\x45\x35\x54\xd8\x41\x78\xf2\xe6\x04\xbd\xe2\x02\x66\x93\x60\x86\x32\x82\xb7\xc4\xd5\x12\x30\x1d\x13\xc0\x0e\xf2\x7a\xe1\xdf\xd9\x50\xcb\xef\xfa\x19\xb2\x07\xa1\x41\x71\x1e\xf5\x56\x55\xd1\xf8\x3b\xd1\x72\xfc\x09\xc8\xde\x5c\x24\xae\x20\x92\x61\x21\xb7\x16\x66\x00\x09\xd5\x52\x29\x6b\x5b\x02\xb4\x90\x05\xa0\xbd\xc4\x11\x80\x4a\x25\x3a\x01\x55\xe0\xe4\x0b\x72\x79\x14\xa1\x64\xa0\x4a\x60\xba\xba\x88\xc5\xb4\x09\x59\x40\x57\x17\x8e\xcf\x37\x1c\xf6\x69\xf3\x1e\xf5\x35\xb1\x31\x8f\xbe\x76\x5f\x9d\xe7\xf8\x67\xce\xd0\xe5\x9f\xee\xec\x34\x5e\x7f\x15\x04\x3d\xa3\xc9\x87\xc3\x5e\x40\x50\xf6\x3a\x63\xf1\xcf\xa5\x20\x5a\xf4\x88\x90\x64\xce\xdd\xbb\xfb\xd2\x8b\xfe\x1d\x5d\x60\x85\x8d\x10\x63\xb3\xa1\x7d\x98\xaf\xee\x42\x7d\x2e\x96\x50\xac\xc1\x16\x11\xf7\x4b\x66\x28\x4a\x64\x48\x80\xeb\xaf\xc3\x71\xde\x6d\x4a\xfa\x8b\x9e\xc8\x7b\xf3\x1d\x04\x94\xbe\x43\xd7\x9c\x91\x19\x1c\x54\xa4\x4f\xaa\xfd\xcf\x1f\xb5\x42\x1e\x60\x3b\x11\x17\x8a\xa6\xcc\x70\x00\x75\xc7\x47\xdb\x0c\xcb\x87\x8a\x22\x40\xdd\xf6\x6a\x59\x66\x7c\xe9\x42\xfe\x9f\x3b\xaf\x1f\x6e\xaf\x46\x4c\xeb\x87\xdb\xab\x97\x9d\xd2\x28\xe1\x6f\x5f\xf6\xab\xa5\xb8\xaa\x4c\x74\x43\x96\x08\x49\x0e\xfa\xeb\xba\x70\xcf\x90\xdc\xb6\x70\x12\x5b\xe8\x46\x6b\xc9\x72\xa3\x25\xb6\xe7\xe0\x30\x5c\x45\x64\xaf\x80\xfa\x53\x41\x12\x55\x39\xa4\xd1\xdd\x06\x6b\x86\x83\xf2\x32\x53\xe0\xcb\x87\x8d\xd5\x3b\x1d\xba\xbe\x0b\x22\xaa\x3a\xd5\xd8\xb6\x06\x40\x17\xc4\xb8\xd6\xd3\x77\x2e\x77\xa8\x82\xd5\xfc\x20\x24\x67\x38\x50\x1f\xc1\xfc\x9d\xbe\x33\x5c\x0b\x19\x6b\x78\xda\xa0\xc2\x57\xc6\x92\xc6\xdc\x9f\x42\x40\xb7\x98\x66\x78\x49\x33\xaa\x76\xfa\x76\x7e\xbd\x68\x65\xe4\x4b\x40\xc0\xb3\x8e\xfb\x48\xf1\xa1\x63\xb3\x43\xaf\x34\x84\x33\xb0\x04\xbe\x5e\x54\x92\x43\xb8\xf4\xb5\xad\x6c\x64\x04\x8f\xa6\xc0\xe1\xda\x2a\xed\x4b\x15\x43\x24\x16\xba\xb8\x87\x2e\x26\xc7\xf0\x02\x7f\xfe\xe1\xf6\xea\xe0\x6b\x4b\x9f\xfb\xd8\x6b\x4b\xbf\xdb\x7b\x6d\xc1\x1f\x6c\x3b\x0b\x14\xaa\x11\x61\x7d\x3f\x2f\x73\x73\xfd\xeb\xd3\x0a\x34\xc9\x17\xa4\xb7\x01\x89\x67\x95\xcd\x3a\x41\xe6\xe3\xbd\x84\x7d\xb3\x83\x77\x83\x0c\xc4\xb5\x29\x81\xdb\x54\xef\xdd\x5f\x03\xc9\xa4\x11\x27\x1b\x98\xc3\x88\x85\x00\x37\x45\xc1\xe6\x30\xcf\x16\x02\x6b\xec\xfa\x5e\x70\x93\x3e\xe4\xbc\x25\xa4\xd8\xac\x62\xe2\x28\xde\x93\x62\xf3\xe1\xae\x6d\xc0\xd3\xbf\xa1\x0f\x77\x95\x5c\xd8\x70\x34\xf9\x4b\x2a\xc0\x74\xa5\x31\xf6\x9d\x4a\x94\xd1\x15\xf1\x46\x84\x0f\x9f\xaf\x9c\x33\xaa\xb8\x08\x44\xd0\x76\x8b\xc9\x00\xb6\xd1\x47\xfb\xa5\x49\xa9\x4b\x78\x96\x91\xc4\xd9\x68\x61\x61\x0e\x74\x80\xfe\x7a\xd4\x09\x62\xf5\x71\x57\xc3\xdb\xb5\xfa\x30\x88\x3e\xbb\xbd\x3c\xbf\xf8\x78\xb9\xc8\xd3\xef\x36\xfc\x71\xae\xf8\xbc\x94\x64\x4e\x95\xff\x3e\x1a\xcc\xd8\x88\x0a\x8f\x1d\x8e\x42\x2d\xbc\xfe\xa0\x2e\x12\x4d\x17\x40\x9c\x41\x57\x55\xb0\x18\x83\x69\xc6\x79\xbe\x38\x57\x33\x24\xb0\xad\xb0\xe6\x65\x1b\xc8\xaa\x0c\xab\x32\xcb\x0c\xc6\x95\x20\x64\xd6\xb4\x87\x04\x2a\xc9\x1c\xff\x9e\x6e\x2c\x2b\x96\x0d\x87\x8c\x6d\x44\x90\xd1\x6c\x38\xdc\x53\x02\xbd\x30\xa9\xc5\xf3\x7a\xff\x05\x1d\xc2\xea\x5d\xf5\xad\x8b\xb3\x01\x8f\x9b\xe2\x10\x13\x38\x10\xde\xbd\xe2\x02\xfa\xab\xb5\xe9\x83\xa8\x04\x96\x0b\xe5\x79\x17\xf6\x2e\xf9\x02\xa7\x32\xe6\x2e\x81\xc9\xdc\x92\xd5\xa1\x88\xba\x25\x2b\x93\x85\xdc\x4e\xa9\x85\x1a\xbc\x84\x29\x5b\x41\x3b\x80\x32\x8b\x8e\x5e\xcc\xd9\x52\x1a\x5f\x00\x55\x71\x59\x5c\xc3\x35\x07\xfd\x69\xed\x16\x43\x6a\xb4\x79\x87\x6f\xb5\x78\x48\x1e\xcf\x1e\xb9\x78\xa0\x6c\x3d\x7f\xa4\x6a\x33\xb7\x5e\xae\x33\x28\xed\x7c\x66\x2a\x3c\x07\x67\xe6\xcc\xde\xe7\x69\x6a\xdd\x6b\xa5\x24\xab\x32\x33\x01\x10\x72\xd1\xe8\x70\x32\x03\xe5\x6d\x86\x4a\x9a\xfe\x7b\xb8\x4a\xd6\x08\xb6\x1e\xcc\x41\x08\x35\xc8\x0e\xf2\x75\xe1\x0e\xa9\xc0\x29\x97\xa6\xdf\xa0\xc6\xc5\x2c\xce\x26\x89\xd3\x9c\xb2\x6f\xe2\x28\x0e\x09\x58\xc1\x7b\x7e\x48\x7c\xa2\x2c\xf5\xe1\xb7\x8d\xdb\xf7\xf0\x66\x5b\x7e\x32\x5f\xd7\xa5\x78\xad\xef\x0f\x3b\xfd\xc3\xab\xe7\x72\xe6\x7c\x83\x6d\xcf\x60\xd4\x81\xce\x77\xf2\x1f\xd9\xdc\x8c\x3d\x2f\xd2\x1a\xe3\x5f\xc7\xa1\xf7\xa5\x8c\x3a\x7b\xce\xb8\xaf\x60\xda\x89\x92\x17\x47\xee\x0e\x9a\x44\xa1\xa3\x62\x31\x46\xfa\x39\xe8\x4e\x87\x06\x43\xd2\x95\x1b\x83\x8b\xd9\x76\x2a\xb2\x5a\x6f\x58\xfc\xa9\x3a\xab\xcb\xaa\x5b\x47\xc2\x19\xb3\x79\x2c\x9f\x0a\xc2\xee\x14\x4e\x1e\x02\x76\xec\xe9\x1e\xfe\xaa\xf7\xf0\x58\x4f\x98\x0b\x8b\x49\xab\xfd\xb6\x6d\x27\x76\x4d\x5f\x2c\x65\xf6\x12\xf9\x06\xb9\xce\x4b\x7a\xb7\x4c\x54\xd5\x47\xec\xa9\x72\xde\xb6\x5c\xb8\x77\xf7\x2e\xdf\xea\x67\xb0\x3d\xd9\x68\xbd\x82\x17\x65\xe6\xcf\x6c\x81\xfc\x23\x33\xf1\x03\x2f\x4b\x2b\x3c\x8d\x71\x65\xd5\x4c\x24\xe7\x29\x41\x4b\xaa\xaa\x16\x9b\x9c\x55\x45\xf2\xe1\xce\x0c\x50\xc1\xb2\xca\x21\x69\xde\xb4\xed\xa6\x8c\x6f\x40\xf6\x78\xf3\x3f\xff\xe7\xff\x0c\x64\x51\x36\xb0\xc1\xd1\x9b\xdf\xff\xee\xff\x63\xef\xda\x7a\xe3\x36\xb2\xf4\xfb\xfc\x8a\x42\xe6\x41\x36\xa0\x96\x93\xd9\x20\x18\x18\x83\x01\x64\xc9\xce\x0a\xe3\x38\x1a\xcb\x49\x1e\x16\x8b\x41\x35\x59\x52\xd7\x88\xcd\x62\x58\xa4\x64\xed\xaf\x5f\xd4\x39\x75\x23\x9b\xac\x4b\x77\x4b\xb2\x27\xcd\x97\xc4\xad\xe6\xe9\xba\x9e\x3a\x75\x2e\xdf\xf7\xfd\x09\x39\xd7\x8c\xa1\x9c\x49\x3f\x81\xb2\x31\xc9\x7f\xb5\xe8\x08\x85\x0a\x99\x30\x5d\xbb\x1e\x60\x7d\x26\xe8\x34\xe2\x35\xbf\x59\x19\xc8\x77\x35\x69\x15\x2f\x3a\x24\xbd\xc2\x4d\x2e\x60\x78\x82\xed\x84\x2c\x37\x5d\xf5\xa7\xf3\x4f\x60\x2c\x8f\x49\xc5\x6f\x19\xb9\x96\x00\xf9\xee\x80\xc3\x30\xfd\x2d\x20\x11\x49\x95\x74\x03\xdc\xac\x48\xd6\x3d\x49\x02\x43\xc4\x29\x34\x2e\x34\xf5\xac\x93\x63\xc2\x68\xb1\x52\x17\xee\x05\x4e\x7d\x43\xb9\xcd\x9d\x3b\xa7\xdd\x3c\x29\x8c\x29\x56\x1a\x2a\xfb\x82\x95\xde\x06\x33\x09\x88\x4d\x2b\xfe\x8d\x93\xcd\xeb\x60\x4a\x8c\xcf\x44\x21\xb5\xe1\xa7\xe1\xe0\x6a\x0f\x5e\xca\xc0\xad\xaa\xa3\x12\xe1\x60\x63\x32\x11\xe8\x78\xb3\xc8\xb6\xe2\x40\x68\x03\x4c\x59\x1b\xad\x0d\x9a\x1b\xfa\xf6\xed\xb2\x2d\xd5\xea\x96\xb8\x66\xfa\x7a\x43\x2e\x52\x58\x84\x4e\x74\x54\x45\xd0\x48\x6a\xaa\x22\xbd\x5c\x4e\x48\x38\xd6\x94\x09\xfa\xbb\x7a\x9e\x02\x42\xed\x54\x0c\x32\x76\x24\xeb\x7a\x3d\x39\x90\x88\xa5\xda\xcb\xa4\xd4\xa5\x64\x6b\xda\xde\x06\xfb\x2e\xb4\xfe\x39\x81\x6c\x70\x69\xcb\xde\xb0\x86\xf1\x8e\x59\x32\x4b\xbf\x5e\x22\xdc\xce\xa3\x93\x93\x23\x54\x0f\xa2\x25\xb2\xa3\xad\xde\xd1\xea\xf3\xf9\xa3\x2c\xea\x0b\x1d\x66\xe2\xd3\xc6\x23\x96\x84\xca\x56\x01\xc5\x88\x2e\xcb\x9b\x26\xc0\x0d\xa5\xa2\xd0\x24\x80\xf6\x6e\x84\xdb\x75\xa3\xf4\x02\xdc\x1b\xcd\xc4\x3a\x82\x87\xb7\xd1\x96\xc8\x11\x83\x6c\x99\xbc\x62\x71\x08\xdc\x75\xc2\xc9\x72\x71\x3d\xe2\x01\x89\x4a\xf5\xd6\xb2\x77\x7e\x0e\xd8\xca\x47\x87\x45\x54\x64\xf8\x30\x99\x3c\x32\xe2\x9d\x8f\x1e\x29\x9b\x07\x47\x54\x68\xc2\xc1\x82\x4f\xda\xf1\x82\x4f\xca\x21\x83\x4f\x38\x2e\x80\xcf\xc6\xba\xb6\x9a\x01\xb7\xf8\xb5\x3b\x75\xa1\x52\xbb\x49\x22\x7e\xc1\xcd\x71\x02\x2c\x82\x9a\x10\x88\xd6\x84\x2e\xa5\xa8\xfa\x0e\x45\xbb\x3f\x6a\xb5\x93\xb4\x92\xa0\x51\x06\x90\x14\x34\x8e\x15\xe3\xa9\x22\x50\xf6\x69\xf0\xb8\x61\xad\xa5\x7f\x78\xaf\xbc\x26\x41\xcc\xdc\x05\xf4\x30\x1a\x32\x8a\x40\x97\xc4\x43\x46\xe1\xbb\xe2\x97\x7a\x4f\xdc\xf3\x1d\x31\x61\x5e\xcd\xf9\x99\x1a\x54\xd6\xd9\xa6\xf7\x2b\xa6\x43\x68\xcc\x33\xb1\x44\x4b\x94\x42\x00\x43\x43\x29\xdb\x90\xc5\x6f\x10\x4e\xe7\x0f\xf7\xb8\xd3\x23\x76\x11\x93\x3c\xe5\x0a\x76\x75\x41\x5e\x9c\xd9\x52\x0d\x1d\xd8\x27\x17\x75\xc7\xda\x6b\x5a\xb0\x97\xfe\xd5\x2c\x9c\x37\x64\x2a\x25\x56\xb4\x2e\x2b\x53\x07\xe2\x08\x6e\xd5\x2f\x95\x2d\x87\xe2\xf6\x53\x9f\x0f\x6e\xa6\x92\x2c\xe1\xc2\x06\xd2\x52\xf3\x37\xf0\xa7\x47\x5c\x48\x30\x83\xae\x61\xd0\x05\x6c\x7f\xd8\x8e\xb5\x77\xcd\x13\xb5\x00\xe0\xfc\x00\xd5\xf4\x20\xfa\x56\x3b\xd8\x0d\x45\x57\x21\x5a\x75\x05\x8b\x11\x1a\x51\x49\x5a\x76\xa3\x6c\xd5\x16\x01\x66\xbd\x7a\xed\x9d\x72\xd2\xf6\x94\xd7\xe7\xe5\xde\x69\x37\x6c\xc8\x4f\x6b\x1c\xb4\xd7\xda\x48\x16\x77\xbc\x34\x86\x3e\x04\xb8\xb4\x11\xc2\x25\x69\xa8\x94\x96\xfc\x2e\x38\x40\x52\x14\x1c\x2e\xd4\xde\x8c\xa1\x31\x0e\xe6\x86\xad\xc5\x1d\xe4\xee\xa7\x39\xac\x05\xe0\xa8\x04\x00\xe5\x13\x06\xba\x16\x25\xbb\xec\x97\x15\x97\xab\xab\x4c\x6f\xe4\x87\x89\x57\x31\xfb\x61\x23\xc6\x88\x1e\xca\xd0\x9d\x60\xec\xbb\x24\x92\x01\x7e\xdb\x1d\xf3\xa1\x70\xc1\xba\xa5\xd2\xb2\xe1\x9f\x5d\x4d\x67\x85\xe9\xd6\xea\xfd\x21\xa0\x22\xa4\x62\x1a\xb3\x42\x4d\x84\xd7\xf6\x5f\x1d\xc3\xa1\xfa\xf4\x97\xba\xf1\x3f\x0f\x5e\xda\xab\x4a\x8e\x6b\x93\x8d\x72\x46\x4b\xcd\xf0\x66\xe3\xea\xe1\x6a\x61\xc5\xc7\x82\x8f\x88\x84\xdc\x00\x8e\x86\x49\x22\x83\x60\xb7\xa2\x35\x11\x41\xe0\x3d\x7c\x1d\xe0\x84\x8c\x28\xaf\xde\x13\x2a\xbf\x61\x41\xcf\x2f\xa5\x83\xbb\xf7\x59\xdd\xbd\x99\x01\x97\x2b\x7d\x17\xc2\xcd\x68\x2a\xc7\x87\xb5\xa3\x46\xd5\xc7\xaf\xac\x91\x98\xcd\x4e\x21\x10\xfc\xf5\xd3\xae\x6b\xf9\xb2\xef\x82\x08\xd1\x99\xe8\xc3\x49\x43\x3f\x51\x54\xea\xda\x82\xcc\xf5\x52\xeb\x91\x85\xbe\x60\x16\xde\x5e\x88\x3a\x09\xed\xce\xf2\x34\x96\x96\xe7\x0e\x61\x38\x7f\xf1\xc3\xd9\x72\x6a\x68\xac\x28\x7a\x4b\xd2\x05\xf3\xe7\xc2\x95\x31\x72\x95\xe8\x1a\x8b\xe6\xe8\x42\xfb\xb6\xb1\xe9\x4a\x71\x5f\xdf\xd3\xb6\x3c\xbd\x9c\x29\x1d\x18\x9a\x3c\xee\xdb\xbe\x15\x67\x84\x00\x39\x27\x02\xa4\xea\x54\xda\x90\x61\x37\xf2\xc2\x1f\xfc\xed\xc3\x21\x3a\xf8\xdb\xbf\x02\x7f\xbb\xfa\xee\x90\x85\x6d\xb0\x17\x0c\xaa\x44\xc8\xa1\x94\xe7\xe8\xf4\x76\x20\x6a\xc4\x71\x4e\xbc\x67\x90\x85\x0f\x3f\xa1\x57\xb7\x9b\x35\xcf\xc0\xd3\xdb\x37\xca\xd1\x92\xea\x30\x05\x39\x41\xeb\x75\xa2\xaf\x5e\x02\xef\x15\x30\x9a\x61\xd4\xc0\x0b\x4c\x34\x22\x81\x76\x08\x8e\x57\x5a\xd7\x02\x75\xb3\x3c\x46\xca\x34\x79\x8c\x77\x36\x00\x3b\x53\x06\x48\x43\x0b\x06\x3b\xca\x2a\xee\xa8\x1b\x2e\x87\xea\xcd\x59\x28\x29\xb4\x4d\x93\x80\x5b\xba\xd7\xb2\x58\xb1\x35\x85\xff\x7d\xa7\x46\x63\x12\x08\x63\xea\xe1\x92\x28\xb3\xa0\x63\x58\xd8\xcc\xda\xb5\x24\xe2\xfa\x78\x50\x33\xf3\xcd\xdd\x77\xc1\x72\x75\xf3\x64\x71\x4a\x5d\x9b\x66\x66\x77\xfd\x72\xe0\x54\x54\x53\xdf\x09\xcd\x6f\x17\x8f\x90\xb8\xc7\xc5\x5a\x60\x5b\xe2\x78\xee\xb9\x9b\xa9\x44\x58\x0b\x37\x1c\x49\x7e\xc4\x04\x7e\xab\x43\x10\xe0\x10\x04\x08\x7f\xf7\x11\x83\x00\x9e\x9a\x86\xdd\xca\x25\xd1\x03\xe0\x07\x06\x22\xce\x2a\x7c\x46\xd1\x83\x25\x33\x16\xd8\x89\x03\x69\x53\x6b\xcd\xc4\x05\x12\xe0\xe7\xbd\x18\x25\x39\x3a\x3a\x39\x39\x3a\x32\xd1\x04\xbd\x70\xfb\xee\x7a\xf1\x57\xc2\xea\x42\x94\xb8\xa8\xe2\xcd\xbc\xe6\xad\xec\xe0\xe0\x76\xf7\x63\xbf\xaf\x6b\xd3\x56\x17\x62\x88\xc7\x15\xa0\x6d\x69\x6c\xba\x49\xf8\xe8\x58\x3b\xff\x6e\xab\x83\xd7\x1d\xb7\xb6\x06\x5f\x77\xd4\x62\xf0\xbc\x86\x73\x35\xda\x2d\x47\x0d\x83\x8c\xe0\xb0\x3d\x0c\xf9\x34\x79\x81\x1f\x9e\x14\x4d\x7f\xac\xbf\x70\xb2\x66\x6b\xd1\x3e\xc4\x55\x84\x11\xa2\x5e\x1e\x48\xd5\x12\x10\x1e\x4b\x63\xa5\x57\x0f\x8f\x74\xaa\xdb\xf1\x88\x91\x6a\x99\x67\x94\x29\x6c\xfd\xe4\xe0\x9d\x71\x44\x6d\xd7\x16\xe0\x43\xa6\x71\x91\x1a\xdf\x16\xbc\xc9\xea\x3b\x72\x47\xdb\x20\x93\xbb\x79\xb2\x0e\xf2\x92\xdf\x71\x99\x46\xe5\x3a\xe3\xf3\xf0\xa0\x37\x51\x7f\xe9\x95\x95\xd4\x49\x8d\x81\xe4\x56\xd5\xc8\x76\xf9\x2e\x89\x31\x22\xa7\xc3\xe6\x97\xf2\xa7\xd6\x69\x45\xbb\x87\xac\xe9\xb2\xe7\x79\x49\xb7\x3c\x22\xd0\x54\xc3\xdf\x8e\x1a\x1e\x69\x01\xcc\xa7\x08\x50\x46\x84\x80\x8b\xf7\x9c\x27\x25\xef\xbf\xd5\xdf\x1d\x66\x10\x76\x6c\xdd\x88\x96\xb6\x0f\xa4\xd4\xf7\xf1\x07\xe3\xc5\xa0\xed\x3c\xf8\x3b\x14\x3e\x7a\x95\x8f\x3b\xa3\x92\x40\x4f\x4a\xde\x6e\x9b\xbf\xbf\x66\x25\xef\xd7\xa9\xde\x91\xdf\x7c\xb2\x44\x03\x0a\x80\x22\x2c\xe4\x21\x2d\x6e\x43\xa8\xd7\x20\xd4\x0c\x19\x52\x6c\x7a\xa5\x49\xdf\x7c\x33\x82\xaf\x06\x0b\x14\xe2\x69\xa2\x64\x47\x61\x8f\x9b\x16\x83\xed\xf1\x1c\x2f\xb5\x76\xe9\xeb\x6c\xa0\x17\xfa\x8b\x2f\x89\x68\xc9\x4f\x70\x36\x64\x66\xd0\xee\x6f\x82\x48\x62\x3d\x19\xff\x3f\xf6\x5e\x1d\x87\xc9\xa8\x55\xa2\xa3\x15\xa1\xba\x38\xf7\x9a\x54\xa2\xa0\x95\x9d\xb1\xc1\xa9\x12\x99\x2b\xbb\xfc\x4d\x34\x52\xcd\x98\x6a\x0f\x9e\xcf\xe0\xec\xa8\x24\x46\xb7\x78\x01\xe8\x94\x4a\x2a\x9e\xb9\x01\xb9\x66\x96\x3e\x01\xb0\xd7\x67\xbe\xee\xd7\xa4\x07\x1a\x26\x40\xf6\x57\x6f\x9b\x95\x65\x9b\x70\x1f\x40\xf0\x25\x18\xf4\x86\x62\x54\x5e\x83\xb8\xe1\x05\x44\xfd\xe5\xca\x8c\xa3\x77\x01\x8c\x54\xd3\x1b\xf3\x5d\xf6\x60\xdc\xe9\x96\x69\xe3\x45\x5c\x43\x94\xc6\x1e\xfa\xd2\x42\x19\x86\x56\xd4\x68\xcd\xd7\xbc\x1a\x2e\x7a\x83\x4c\x67\x07\xb8\xaf\x75\x2c\x3f\x63\x9d\x4e\x2f\xd3\x5e\xb2\x76\x71\xd3\xf3\x72\xaf\x0b\x34\xa2\x6d\xaf\x8b\x04\x3d\xfb\xee\x6c\xa8\x60\xdf\xf1\x65\xcb\xc8\xd9\x8a\xd6\x35\xab\xbc\x23\x73\x04\x96\x38\xe7\x50\xf6\x21\x14\x23\x08\x8a\x7b\x40\x7a\xf8\x3a\xaa\xa0\x9e\x13\xda\xe6\x2b\x81\x07\xac\xfa\x64\x60\x40\xe7\x31\x79\x77\x46\x3a\xda\xde\xb0\x4e\xbd\x4e\xea\x7e\xbd\x64\x81\xdd\xf4\x7c\x50\x76\xcf\x5f\xd8\xb5\x5b\x05\x16\x0e\xf2\x6f\xbf\x7d\x48\x46\x7c\x98\x9a\xa3\x7b\xd1\x56\xe5\x3d\x2f\x31\x45\x47\x92\x17\x4a\xe0\xcb\xe7\x07\x61\xb8\xbf\xe7\x73\xa4\x26\x91\x8e\x69\xc7\x18\x74\x8c\x40\xcf\x74\xb9\x10\x57\x27\xd2\x0b\x10\x3c\xc7\xc3\xa1\x9e\xb7\x1c\x51\xe0\xd5\xf7\x94\x4d\xe4\x73\xec\xa8\xcb\x98\x1d\x76\x50\x9d\x6a\x8d\x6b\x27\x5f\x40\x26\xe0\xc4\x2f\x7b\xed\xa2\x11\xdd\x8a\x48\xbe\xee\xab\x8e\xd6\x4c\xf4\xb2\x7a\x08\x2c\x85\xa7\x19\xf0\xd8\x99\x55\xb1\xcf\xb8\x74\x53\xce\x2e\xfb\xe5\xe1\x19\x06\xc0\xca\xbc\x30\x13\x34\x38\xc4\xe6\xa2\x4d\x12\x73\x99\x24\x50\x73\xbe\xb2\x75\xc1\x88\xe6\x0d\xd9\x6e\xac\x20\x4b\xaa\xce\xad\xa6\xea\x6f\xf8\x8c\xd7\xfa\xc9\x72\xdb\x5c\xde\x8e\xb2\xd4\x13\x0c\xca\x58\x0a\xc3\x1f\x18\x48\xee\xd3\x64\x56\x19\x29\x59\xc3\xea\x12\xa0\xc2\xdd\x4a\x0b\xed\x3d\xe8\xfc\x4e\x23\xac\xbd\xe0\xcf\x99\xe0\xe1\xe9\xb8\xb7\x9f\xbb\x96\x2a\xb5\xb4\x56\x0a\xc8\x78\xe8\xf9\x35\xa1\x75\x48\x91\xec\x3f\x55\xe7\xab\x3f\x42\x1f\x0d\x98\xe4\xb1\x92\x06\x51\xc7\x45\x17\xbb\x49\xed\x9b\x4d\xe1\x33\xbf\xef\xd7\x59\x05\x51\xb8\xd3\x53\xf9\xfc\x84\xbd\xe0\x89\xa8\xbe\x25\x27\xd2\x8c\xb0\x8f\xb6\x27\x87\x32\xee\x2f\x32\xaf\xef\xf1\x72\xae\xae\x2b\x51\xdc\x26\x21\x89\xbc\xc3\x6f\x8e\x6e\xca\xfa\xc3\x31\x94\x88\xba\x03\xcf\x74\x77\xfa\x66\xac\xf7\x90\x77\xdc\x40\x4a\x81\x16\xaf\x16\x7f\x2b\xe6\x56\xb8\xd4\x60\x8b\x9a\xdb\xbe\xaf\x67\x31\x0d\x12\x2c\x13\xda\x51\x99\x05\x2a\x38\x46\xd4\x95\xac\xc3\x7c\x40\x00\x28\x5b\xb3\x8e\x02\x9c\xe8\xe2\xef\xb1\xb0\xa3\xee\xb3\x91\xa1\xcc\x19\xd3\x7f\x47\xe9\x52\x88\x5a\xf2\x92\x69\xe9\xa5\x9a\x8b\x22\x40\xc3\x94\x06\xd7\x8b\xbf\xf8\xcb\x2f\xc9\x28\x01\xea\xab\xa3\x3e\xeb\x09\x04\x8f\x11\x60\x69\xbb\x7b\x40\xa8\xcf\xd7\xde\x22\xd2\x92\x1e\xcd\x17\x74\x53\x30\xc7\x4e\x9c\x08\x51\x7d\xf4\xe3\xd9\xdb\xe1\x4b\xc3\x0d\xf0\xe3\xd9\xdb\xff\x08\xa2\x8d\x9b\x82\x39\xc8\xf3\x92\xcb\xdb\x03\xcb\xc6\x1f\x80\x65\x63\x63\xd6\xbf\x76\x1f\xda\x81\x62\xe3\x0b\xa6\xd8\x78\x22\x1d\x45\xf6\xea\xe8\x6c\xca\x0c\x5b\xc0\xf0\x48\xf8\x4e\x8a\xcb\x73\x9f\x3c\x42\x1d\x18\x27\x00\x5f\x1a\xd6\x67\x03\xd0\x1d\x03\x88\x0f\xef\x3e\xdd\x20\x3e\x02\xbe\xd7\x00\x47\x3a\x76\xff\x0c\x8c\xd0\x06\x6a\xd7\x26\x41\xe1\x93\x0f\xd4\x2e\xc0\xe6\xb8\xca\xb6\x32\x6a\x78\xf7\x91\x35\x33\x27\xc3\xc8\x94\xc1\xaf\x8e\xfc\x84\xbc\x53\x1f\x08\xc9\x21\x8f\x00\xe9\xb6\x2d\x6f\xf6\xec\xb4\xa3\x97\xf0\x84\x9c\xbf\xbd\xfc\xf8\xf6\xec\xf4\xd3\xdb\xf3\xd7\xc4\xc8\xe7\xbe\x61\x7a\x42\x3e\x09\xe7\x56\x9c\xbd\x15\x38\x3e\x35\xc8\x87\x74\xed\x3a\xd6\x6a\x93\xd6\x2e\x16\x0b\xa0\x28\xb4\x26\x17\x35\xef\x6c\xd6\x52\xc8\xf0\x2a\x2a\x51\xeb\x7c\x1f\x25\x53\x7b\x34\x6f\x78\x77\x8c\x66\x96\x46\x5d\x5f\xb1\xe1\x6f\xcc\x8a\x64\xe4\x12\x73\x29\x1c\xd7\xec\xb6\xf6\x92\xcd\x47\x48\x65\xcb\xc0\x48\x82\xcb\xfc\x80\x53\x64\x93\x37\xd6\xe0\x9b\x04\x36\x91\x43\x3e\x01\x9f\xc3\xd1\xc9\x91\x31\x8d\x2a\x8b\x5b\x63\x12\x5f\xed\xcf\x4d\x92\x0e\xbb\x47\x87\xc1\x87\xab\xea\x84\x90\x9f\x0d\xf1\xe8\xb1\xb2\x6e\x46\xe0\x38\x81\x42\x1b\xd3\x52\x17\xe9\x9e\x90\x6f\xce\x6d\xd9\x2f\xfd\x86\x86\x53\x7d\x40\xca\x1d\xab\x23\xc7\x70\x92\x12\x34\x0d\x49\x9c\xc3\x8f\xae\xe5\xbf\x7c\x7c\xbf\xdb\x4f\xe3\xbe\x4a\xfc\xe1\x33\xb1\x5e\xf3\x8e\xac\xa8\x5c\xd9\xb2\x3e\x97\x8d\x60\x77\xf5\xf6\x2d\x8a\xe9\x39\x37\x54\x5b\xe9\x3a\x2c\x18\x4f\xc2\x8d\x3f\xfa\xd1\x7c\x79\x74\x61\xb3\x1f\x6f\xa0\xc7\x87\x34\xc8\x00\x3d\x3e\x96\x44\x35\x07\x35\x6b\xdb\xbf\x3b\xf6\x29\xab\x4b\x44\x76\x4c\x26\x64\x31\x2f\x7c\xf0\xf0\xad\x8c\x14\x34\x58\xa0\xa3\x25\xeb\x28\xaf\x42\x06\x9f\x1b\xc1\x4e\x34\xa2\x12\x37\x79\x78\xce\x13\x83\xf0\x67\xcc\xac\x5e\xd0\x85\x1a\xdd\xdd\xec\xff\x74\x34\x79\x93\x20\xae\x06\xc2\xf5\xc9\x5a\xc2\x90\x97\x9d\x73\xf1\x7a\x96\x0e\xef\xd5\x00\x1b\x8f\x42\xd8\x44\x75\x04\xc3\x78\x92\xb8\xfa\xe1\x86\xb5\x6b\x2e\x95\x2a\x99\xb4\xcc\x02\x62\x9f\x70\x1d\xed\x62\xae\xd9\xdd\x37\x67\xce\xcd\xa5\x99\x46\x14\x9c\xd2\x42\x89\x04\xd9\x40\x34\x06\x4b\x78\xa0\xde\x9a\x96\x2d\xd8\x67\x2e\xc1\x57\x01\xb5\x0b\xa2\x75\xa7\xf7\x5c\xc4\xcd\x63\xd0\x30\x2e\x28\xe3\xb0\xc2\x77\x81\x3f\x79\x90\xb1\x14\x60\xd9\xc7\xc7\xb8\x03\x91\xe1\xb7\xaa\x1e\x10\x50\x14\xaa\x91\xd1\x41\x40\x6f\xa0\xd1\xa2\xd5\xee\xf6\xa6\xe5\x77\xbc\x62\xf3\x34\x4b\xdd\x8a\xd7\x37\x1e\x79\x30\x50\x1d\x33\x5d\x86\xc5\x36\xfa\xa0\xf6\xaf\xec\xbc\x0c\xb9\x19\xb1\xb0\x0b\x3e\xfc\xfc\x89\xd4\x4c\x09\x5b\x71\xb9\xf3\xe5\x41\x35\x23\x90\x6b\xbc\x58\x2c\xc0\x9f\xf2\xe2\xdf\xca\x2e\x2d\xab\x97\xe4\x37\xa6\x7f\x5d\x99\xe7\x6a\xc7\x17\x1d\xb9\x5f\x09\xb8\x51\xf7\x52\xf7\x2b\x36\x8f\x86\xa0\xbf\x2e\xcd\xbb\xaf\xd4\xfb\xca\x2c\xc4\xc3\x6e\x20\x05\xaa\xfe\x25\x71\x91\xc3\xad\x6d\xd8\x6c\xad\x6b\x5c\xc7\xd6\x58\xf3\x56\xa0\x85\xb2\x88\xe4\x6a\x43\xa5\xab\x7c\x58\x57\xbc\xbe\x3d\x26\xbc\x33\xca\x4c\xad\x09\x9d\xc2\x58\xdf\x9a\xd5\xda\x32\x5a\xa1\x4e\xcf\x53\x3e\xdb\xcc\xf9\x4e\xfa\xbc\xcb\x70\x9e\x7e\x7a\x68\x30\xeb\xc1\xaa\x02\x9d\x08\x32\x62\x51\xcf\x42\xb4\x7e\xe2\x1e\x47\x2f\xc6\x5b\x6a\x52\x2e\xd3\x10\xa2\x8e\x2e\xae\xce\xae\x2e\x46\x44\x5e\xf8\xd9\xc0\xad\x6f\xf4\xe1\x4c\x4f\xb7\x73\xeb\x87\x61\x81\xe6\xdc\xfa\x73\x07\x22\x74\x79\x77\xcb\xb2\x58\xd1\xe6\xb4\xef\x56\xe7\x5c\x16\xe2\x8e\x25\x5f\x6a\x0c\x6c\x98\x76\xad\x13\x6e\x06\x11\xa5\x90\xb3\xff\x3e\xbd\x4c\xe5\x10\x49\x49\x27\x30\xed\xbc\x62\x32\xe3\x06\x34\xdd\x4a\x2d\x63\xef\x6d\x3c\x04\x43\xbe\xa2\x60\x08\xec\x9f\xaf\x3d\x00\xc2\x6b\xde\x71\xda\x89\x48\x0d\xe0\xd0\x2b\xd0\xcb\x4e\xac\xf5\x56\xb8\x30\x02\x20\xb0\x0d\x87\xf1\x40\x66\xf8\x44\xf6\x70\x84\x39\xdc\xae\x0a\xc9\x2d\xda\xde\x28\x0d\xf3\x98\xd4\xec\x1e\x7f\x35\x78\x3a\x99\xb7\xff\xa6\x93\x68\xd5\x5a\xa5\xd5\xdf\x5f\xff\xcd\x0b\xa3\xfc\xdd\x96\x63\xeb\x22\xdd\x80\x44\x07\x5d\x07\x3c\x06\xbb\x39\x3c\x08\xe1\xbf\xa7\xea\x1e\xed\xba\xc3\x71\xfe\x67\x4f\x2b\x1c\xa9\x0f\xbb\xfa\x9f\x86\xa3\x9c\xd8\x18\x33\xdb\x66\x74\x3f\x58\x0f\x40\x2f\x19\x9c\x82\xf8\x8d\xae\xa5\xb5\x54\x43\x9e\x0a\xfc\x74\xa4\x83\x5e\x47\xe4\x45\x57\x34\x51\xd4\xa7\x3d\xa5\xc4\x63\x63\xf5\x08\xbf\xb7\xa9\xf0\xf3\xbf\xbe\xc7\x08\x11\xac\xc7\x54\x47\xcc\xa0\xa1\x97\xf0\x2a\x79\xcf\x65\x87\x19\x98\x28\x0b\x88\xb2\x20\x31\x3a\x14\xc9\xab\xc9\xc5\x25\xc0\x72\x36\xff\xa2\x65\xd9\xbe\xc6\xf3\xcc\x80\x91\xb4\x70\x7b\x13\x96\x0c\x2f\x81\x3d\xe9\x45\xf7\xd0\xf0\x02\xae\x6a\x9f\xce\x2e\x41\x86\x24\x7f\xfd\x01\xd1\x13\xfe\xeb\x2f\x3f\x7c\x1b\x98\xcc\xa7\xca\x54\xcf\xf4\x77\x3c\x61\xbc\x69\x27\x43\x21\x37\x37\x12\x0c\x95\x2b\xc7\xb3\xa6\xf7\x2a\xae\x2a\x35\x5d\x56\x67\xa7\x9a\x33\x87\xfc\xbe\x67\xc5\xed\xc3\xa9\x43\x7d\xb0\xbd\x26\x41\x25\x72\x39\x52\x22\x24\x48\x85\xb9\x8d\x12\xf1\x54\x45\xc8\x60\xca\x55\x22\x3b\xdf\x16\xf9\xef\xd3\x3d\x5d\xa8\x93\x64\xe6\x2f\xfe\xc8\x6f\x73\xd3\x9c\xdf\x12\xc3\xad\x80\xfa\x43\xdd\x09\xbd\x88\x1d\x54\x00\x9c\x7f\xb8\xfa\xd7\xfb\xd3\x37\x6f\xdf\x6b\x4e\x07\x48\x21\x40\x78\xb5\x40\x04\x72\x9b\xac\xaf\xf4\x9d\x34\xbd\xea\x23\x13\x54\xa7\x45\x66\x3e\x8c\xf8\x7c\x6b\xf2\x61\x96\xcc\x37\xb3\xa6\x7d\x57\x1f\x4e\x7d\x3d\xd3\xf3\x47\x70\x82\x19\x0f\x2b\xfb\x3c\xac\xea\x50\x83\x21\x59\x0b\xc8\x8f\x8f\xe6\xba\x99\xed\x28\x79\x86\xb8\x83\xea\x31\x8e\x02\x5e\xfd\x02\x3d\xde\x2e\xe2\xf0\xac\xe3\x18\x3b\xf9\xdb\xf4\x52\xa8\xa3\x2b\xf8\xb6\x89\x5a\xa9\x5d\x82\xa9\x46\xad\x52\xe3\x4a\x81\x33\x29\xe3\x20\x26\xe3\x15\xf6\x6c\xeb\x68\x6b\xef\xdf\x42\xb7\x7f\x1b\x85\xed\xb2\x7a\x50\x25\x9f\x55\x94\xcf\xa0\x50\x8c\x76\xed\xd4\x8b\xf8\xbf\x57\xe8\x24\x1c\x84\x62\x6c\x9d\xca\x9c\x12\x17\x84\x92\x49\x99\x36\x9f\x81\xea\xeb\x2d\xe0\x01\x26\xb8\x3e\x72\x66\xd0\x0d\xc3\xc2\x4c\xa6\xfb\x08\x3f\x29\x54\x63\xb6\x56\x88\xf0\x76\x4e\xf2\xdc\x99\x79\x61\x5c\xeb\x37\x33\x4c\x61\x7b\x7d\x73\x00\x0d\x61\x78\x23\x4c\x4d\xe3\x00\xea\x7e\xef\x3a\x62\xc7\x11\x26\x8f\xa2\x89\x7f\xcb\xac\xf9\x8a\xdf\xfa\x77\xbf\xff\xc4\xd4\x80\x5d\x49\x5b\x6d\xf7\x95\xe8\x44\x9d\x9d\xf8\x7f\x39\xf1\xda\x70\x7f\xe3\x37\xce\xb0\x34\xa5\x9a\x77\x0f\x58\x11\x98\xc7\x39\x45\xb7\x3b\x4b\xac\xbb\xe5\xd6\xfb\x4f\x2d\x52\xdd\x1b\x24\x44\x4a\x2a\x49\x99\x5c\x0e\x73\x71\xae\x8d\x39\x53\xf2\x22\xf5\xe2\x20\x6e\x75\x78\xeb\x20\xd0\xdf\x60\x0e\xfe\xee\xc7\x69\xb9\x1d\xeb\xa5\x9a\xd0\x7b\xd1\xa6\x17\xa5\x5f\x0e\x5e\x18\x65\x28\xe8\xbf\x8d\x6b\xc6\xe6\x4c\xfc\x2f\x65\x97\x5c\x41\xb8\xd5\xeb\xca\x54\x34\xc5\xec\x9d\xc0\x14\x4f\x6d\xaa\xa4\xad\x13\x90\x39\xb1\xa9\x70\xeb\xc4\xb7\x4c\xe8\xc4\xdb\xdf\x66\xca\x3c\xa4\x52\x0b\x9c\x63\x00\x4a\xb9\x05\xce\x3b\x59\xf2\x99\x4c\xbb\xbf\xea\xaf\xeb\x0b\xbf\x9a\x1f\xa7\x3e\xa8\xdd\x42\xb1\x54\xac\x67\xa5\xc3\xb5\x0c\x96\x09\x3a\x01\xf1\xc9\xaf\x45\x0b\xb0\x55\x1c\xcb\x97\x1d\x24\xa7\x2e\x51\x3e\xd6\xe4\x13\x6b\xda\xcc\x82\x4d\x2a\x95\xe0\x43\x9b\x6f\xb9\xfd\xf3\x11\xfa\x7f\x8a\xc1\xf2\xfb\xe0\xfb\x49\x2a\x20\x00\xcb\x3f\x09\xb5\x1f\x10\x3a\x07\xc2\x1f\x81\xda\x0f\x48\xcc\x85\x28\xf6\x20\x88\x03\x52\x93\xc1\x89\x1d\xf8\xf0\x13\x04\x71\xf4\x32\x4c\x5c\x08\x06\x60\xdf\x24\x8b\xe2\x36\x08\xb2\x13\xe4\x41\xeb\x5f\x5a\x89\x38\xd2\x1a\x5b\xc0\xf1\xdb\xd2\x4a\xd4\x37\x71\x34\x5f\xe1\x27\x3b\xb0\xd2\xe6\x12\x3c\x34\x41\x67\x79\x2a\xea\x6c\x84\x0e\x7b\xa6\x73\x3e\xe4\x82\x63\xe8\x70\xbc\xd8\x50\x2f\x1d\x2c\xb7\xb3\xad\x8c\xa2\x91\xe7\x21\xe8\x46\x27\x69\xb2\x3f\x09\x4c\xc7\x09\x22\x89\xcf\x86\x1c\xe7\x3c\x4e\x92\x38\xcd\x8b\xec\x67\x95\x8c\xd8\x8f\x93\xa4\x86\x19\x92\x51\xfa\x04\x0f\x72\x92\xec\x2e\xc6\x95\x3c\xc1\x88\x9c\x24\x38\x85\x35\xd9\x72\x23\x27\x49\xcc\xe2\x4f\x4e\xee\x7c\x16\x93\x72\xda\xb2\xf2\xd8\x96\xa3\x9c\xca\x49\x12\x67\x78\x97\xe7\xd8\x95\x93\x64\xa6\x70\x99\x92\x9c\x2d\x9a\xcd\xca\x9c\x24\x93\x24\x71\x37\xbb\x27\x47\xfb\xe0\x93\xc0\xe7\xec\x9e\x1d\x99\x9d\xdd\x93\x05\x44\x8d\x4f\x0a\xd1\xc3\x4c\x4b\xc3\x94\x0f\xc9\x32\x89\x47\x0e\x11\x26\x7f\xc8\x10\x39\x43\x13\x31\x43\x03\x91\x21\x38\x40\x18\xe1\x13\x42\x64\x49\xdc\x0f\x75\x84\x7b\x92\x49\x24\x32\x64\xe6\x91\x27\x8d\x9f\x1c\x62\x09\xf7\xa4\x53\x4c\xb8\x27\x85\x6c\xc2\x3d\xe9\xdc\xd3\x39\xcb\xd9\xb2\x54\x47\x58\xa8\x33\x64\x4e\xf2\x55\x3b\xda\xae\x01\x1f\x75\x86\xd8\x20\x73\x75\xa6\xb4\x6c\xe5\x93\x0a\x32\x8f\x4f\x8c\xb7\xda\xff\x66\xa4\xe8\xc0\x3d\xc9\x7c\x38\xfe\xd7\x43\x99\x4d\xee\x89\x27\xd9\xe0\xf3\x25\xa7\xda\xe0\x93\x9b\x70\x93\x24\x34\x9e\x94\x83\x4f\xd6\xaa\x8a\x73\x65\xbb\x27\x9b\x35\x3b\xa9\x5b\x96\x59\x3b\x85\x3f\x7b\xdc\xcb\xb0\x67\x6a\xf8\xdd\x84\x35\x1b\x65\x62\xf4\xbe\x1a\xbf\xd9\x79\xd2\xe0\x6e\x17\xed\x95\x33\x60\x9e\xff\x6e\xb7\xc9\xaa\xb7\x41\x7b\x97\x34\xbd\x89\x27\xc1\xb6\xe6\x6d\x8c\x8b\x2f\x51\x17\x8f\xd0\x10\xc3\xac\x7c\xa9\xe7\x6a\x02\x77\x9f\xf7\xed\x6c\x83\x39\x95\xcf\xcf\x3d\xe9\xcc\x7e\x59\xa6\x28\x72\x00\x46\x38\xfe\x32\x24\xee\xc2\x06\xe8\x9e\xfc\x01\x25\xd9\x0c\x81\xee\x49\xe3\x0a\xcc\x12\x49\x1c\xb3\x60\x94\x35\x30\x53\x70\x06\xc7\xa0\xf7\x52\xfe\x55\x89\xe4\xf2\x0e\xba\x27\x95\x81\x30\xb3\xe7\x26\x41\x62\x5b\x2e\x42\xf7\x6c\x35\x1c\x79\x06\x1c\xc9\x62\x2a\x1c\x37\x2d\xd9\x46\x23\x87\x4b\xed\xe1\x52\x9b\xf8\xfc\x01\x2e\xb5\x31\x2e\xc5\xcc\x3b\xe8\x00\x14\x6d\x8e\x55\x31\x43\xe6\x26\xff\xe2\x2c\xbf\x62\xce\xb5\x76\x96\x89\x71\xc8\xb4\x98\x69\x18\x44\x39\x19\x13\x39\x17\x3d\xa9\xf9\x6a\x37\x97\x87\xd1\x3d\xf9\x8c\x8c\x39\x5b\x49\xd9\x4b\xe9\xdc\x8c\x19\x92\x87\x2c\x8e\x71\x96\xc6\x1c\xfb\x68\x4b\x3e\x47\xf7\x6c\x67\x97\x65\x73\x3c\xba\x27\x8d\xed\x31\xd3\x8e\xf0\xb9\x21\xb7\xe7\x7d\x74\xcf\x96\xc6\x55\x06\x17\xa4\xf7\x52\x22\x2b\x64\xe6\x90\xe8\xbd\x10\xe6\x87\xcc\x94\x99\xc6\x26\xe9\x9e\x2d\x87\x31\x87\x61\xd2\x3d\xfb\xe5\x9a\xdc\xb1\x13\xdb\x58\x96\x89\x4c\x94\xe3\x96\x65\x18\x96\xb9\x0e\xcb\xe7\x77\x43\x26\x0b\xc6\xc4\x9d\x3d\xb8\x89\x34\xdf\x81\x8e\xfe\x7f\x39\x1e\xa0\x27\x8c\xee\xeb\x8a\xce\x08\xc6\xa2\x7b\x72\x42\xfb\xe9\xde\x87\x43\x68\xff\x71\x42\xfb\x57\x9a\xab\xe3\x10\xd7\x9f\xec\xcd\x21\xae\xef\x9e\x43\x5c\xff\xe0\x02\x39\xb8\x40\x36\x9f\x43\x5c\x7f\xd0\xad\x43\x5c\xff\x10\xd7\x3f\xc4\xf5\x43\xcf\x5e\xe3\xfa\xda\x3c\xc7\xa0\x7e\xf2\xe2\xfb\x42\x62\xfa\x9a\x25\xeb\xb4\x28\x44\x5f\x77\x9f\xc4\x2d\x8b\x86\xf6\x92\x2e\x6d\x1b\x52\xa3\x1d\x7c\xbc\x1b\x1e\xed\x4b\xae\x6e\x52\xd9\xb3\x7d\xaa\x5f\x34\x97\x1c\x75\xc2\xd4\x25\x2b\xad\xc4\x54\x97\xaf\x7a\xb9\x53\xa3\x70\x42\x4e\x49\xcb\x0a\xde\x70\x86\x34\xf8\x14\x3f\xc7\xe5\x60\xe8\x3d\x12\x0d\x7d\xc9\xaa\x6b\x4d\x8c\x50\x7b\xc4\x5a\xde\xdd\x44\xab\x7e\xd3\xdc\x24\xb9\x5a\xa9\x40\xb3\xd0\x1c\x10\x06\xa5\xdf\x30\x8e\xb5\xec\xdf\xda\xe2\x48\xeb\x3d\xf6\xfc\x93\xd7\x12\xdf\xe9\x85\x43\x9b\xc2\x0b\xb6\xd1\x48\xda\x70\x8d\x58\xb0\x6f\x0d\xc1\x3e\x37\xbc\x85\x65\x7d\xc5\x0a\x51\x87\x78\x90\xdd\x33\x58\x3c\x6f\xc7\x12\xcc\x2a\xd2\xfe\xe5\xc4\x6b\x6c\xd9\xb7\x96\xf7\xf8\x8e\x56\xbc\xe4\xdd\x83\x0d\x9d\x6b\x8a\x3b\x8a\xfb\x4c\x0f\x74\x92\xd8\x53\xe9\x66\x99\xd0\xa6\x69\x05\x2d\x56\x4c\x7a\xfd\x46\x1b\x58\x57\x56\x26\xc9\x34\x75\x2f\x48\x1e\x09\x06\x30\xc8\x55\x76\x52\xf5\x40\x5a\xd1\x99\xb4\x11\xdd\xf0\xb4\xeb\xe7\xa0\x73\x78\xed\xc1\x46\xe1\x4f\xa0\x49\xd2\xb5\x0f\x90\x7f\x92\xe6\x42\xf5\x9a\x82\x23\xc0\xaf\xfd\x7f\x48\x22\xaa\xd2\x80\x1b\xfd\xf5\xdb\xb4\xab\x1f\x6b\x0b\xbd\xa7\xe1\x7a\xc3\xd7\xe0\xe1\xac\x94\x8d\xa8\x8e\x86\xe1\x0f\xa4\x2d\x72\xd7\x88\xbf\x7c\x4f\x56\xa2\x6f\xe5\x89\x5f\x03\xf9\x1d\x7c\x86\xf7\xf3\xd4\x28\x99\x32\x2c\x3b\x52\x31\x2a\x3b\xf2\xdd\xb7\x64\xcd\xeb\x5e\x99\x06\x09\xef\x7a\xa6\xf9\x0f\xdf\x27\x6f\xb7\x54\xa3\x3c\xd5\x1c\xdf\x4c\x7c\xd0\xbb\xaa\x41\xd0\x73\x6d\x95\x6b\xad\x12\xab\xba\xf5\x7e\x1f\x08\x0f\x46\x71\x48\x7d\x14\xf9\x33\x57\x77\x62\xcf\xba\x26\xd5\xba\x4d\xb2\x56\x13\xcf\xfd\xa4\xaf\xc5\x8c\xd8\x58\x09\xa9\x0e\x70\x4c\xfe\x35\xd2\x80\xdf\x7b\xb1\x7c\xe8\x52\x6a\xca\xff\x89\xdf\x1c\x16\x93\x9b\x0f\xa7\xc1\xa3\x66\x3a\x3c\xe0\xf2\x70\xd8\x51\x93\xdf\x8e\x5b\x1f\x37\xea\x36\x9d\x58\x37\x08\x37\x6f\x73\x1b\x34\x6e\xda\xa2\x60\xc8\x39\x7c\xee\xd8\xe2\x6a\x81\x72\x23\x53\xb6\xcf\x9a\xeb\x20\x42\x93\x19\x67\x53\x3f\x18\x52\xbe\xfb\xe7\x85\x48\xb1\x87\x5b\x76\xc3\x65\x97\x41\xc1\x83\x5f\x1f\x2e\x27\xc9\xeb\x1b\xa4\x4c\x58\xf7\x55\xc7\x9b\xca\xf6\x3c\xd0\x5f\x2b\x4a\x9f\x75\xbe\xcb\x98\x7a\xbe\x49\x8a\xa0\x05\x08\xb1\x17\x09\x1b\xbc\xb0\xbf\xcf\xea\x0e\x91\xfa\x5b\x75\x98\x36\xb4\xa5\x76\x60\x81\x94\x5c\xbe\xd4\x7e\x69\x5a\x04\xd3\xdf\x34\xf6\x8d\x3a\xb9\x5a\x5a\xd9\xe1\xf2\x03\xb8\xbb\x2c\xb6\x8e\xd5\xb4\x0e\x44\x81\x86\x6e\x15\xf8\x32\x11\xf7\x26\x93\x54\x33\x31\x8d\x56\x59\xb4\xe4\xf9\x0d\x2d\x6e\x59\x5d\x02\x9d\x1e\x0e\x49\xf9\x50\xd3\xb5\xc6\x30\xb5\xa4\x63\xac\x1c\x49\x9e\xad\x2c\x57\x0f\x7a\x19\xb1\x64\xda\x00\x31\x44\x98\xc0\x13\xc6\xa7\x97\xc9\x20\x5f\xbf\x48\x65\x0b\x84\x75\x84\xc4\x98\x6a\xcb\xef\x0a\xa6\xcd\xa6\x40\x97\xd4\x8f\xef\xd2\xf8\xbb\x00\xee\xc7\x46\xf3\x35\xe6\x07\xf7\x56\x3e\x38\x2f\x6d\x98\x0b\x10\xff\x68\xa5\xd4\x42\xe8\xfe\x63\x0a\xeb\x47\x8b\x62\xf9\xb0\x2b\x61\x57\x9c\xa3\x0a\xb7\xc6\xcc\x9f\x03\x78\x0c\x91\xb3\xae\x5d\xa6\xe0\x24\x1c\x7d\x7c\x73\x3e\xd4\x4a\x1f\x69\x29\x24\x79\x53\x89\xe2\x96\x9c\x33\xb8\x07\xf8\xe7\xdd\xcc\x48\x8c\x21\x14\x77\xe4\xae\x6a\x97\xe5\xee\xdc\x02\x07\x3c\xfc\xaf\x08\x0f\xbf\x5d\x86\x06\xe0\xeb\x40\xc3\x5f\xd3\x9b\x74\x3a\x15\x75\x63\x87\xad\x06\xaf\x19\x98\xd6\x2d\xb7\xc8\x9f\x57\xe2\x7e\xd1\x89\x45\x2f\xd9\x82\x07\x12\x5f\x12\x7a\x71\xcb\x1e\xd4\x5f\x53\xfb\xf1\x0f\xfc\xfa\xe0\xba\xd4\x09\x08\x3c\xc0\xe7\xea\xc4\xff\xf8\xe6\x5c\x1d\x33\x29\xe8\x6e\x5c\x92\x57\xac\x2b\x5e\x15\xac\x59\xbd\xd2\x4d\xf9\x22\x86\x65\x2d\x6a\xde\x89\x36\x99\x01\xef\x94\x14\xa2\xaa\x34\xaa\x86\xb8\x26\x67\xac\x59\x59\x21\x8f\xdf\xa3\xa7\x42\x48\x6f\x84\x48\x45\x90\xf6\x96\xbc\x7a\x4b\xaf\x78\x6f\xe2\xdb\x65\xae\x82\x79\xea\x45\xf0\x95\x11\x10\x3f\xc2\xf0\xec\x17\x58\xfe\xe8\xca\xbc\x00\xd7\x50\x2f\xf6\x34\xc4\x91\xd7\x82\x03\x23\xe4\xab\x19\x72\x71\x8d\xe6\x78\xc9\x4a\x22\xee\x58\xdb\xf2\x92\x49\x62\xb5\x89\x7f\xf3\xe5\xd5\x9e\x08\x02\xb7\x1a\xd3\x03\x0c\xfe\xb3\xc2\xe0\x67\x5c\x93\x3c\xe5\xa5\xde\xda\x54\x5e\xb4\x5c\xf3\x3a\x13\xd6\xf5\x69\xd5\x57\x14\xce\x5e\xd9\x21\x33\x7f\x33\x07\xd7\x36\x17\x11\x59\xd0\x8a\x5d\xfc\x9c\x70\x19\xb9\xc2\x6f\x0e\xef\x23\xe6\x43\x0f\xd9\x74\x2b\x2c\xc7\x7f\xd8\xc5\x4e\x6a\x51\xce\xf9\xa6\xff\xb8\x68\xa7\xde\x5a\x46\x30\xc7\x5d\x0e\xca\x1b\xda\xb1\x7b\x9a\xcc\x32\x6e\xba\x32\xc4\x14\xb7\x53\x7f\x7a\x79\x41\x7e\x44\x89\xbb\x81\xac\xb6\xa2\x43\x8b\xec\x5c\xac\x29\x4f\x66\x52\xf2\xc0\xa1\xfd\x66\x5d\x5a\x71\x04\xe5\xa9\x53\x28\x72\xcf\x40\xdc\xb1\x5e\xdd\xb3\xf4\x0d\xe8\x80\x74\xb9\x67\xa3\xc2\xd9\x14\x9e\x13\xc8\xa4\xfa\x3a\x12\x1b\x3d\x8b\x11\x47\x96\x0b\x54\x13\xc9\x6a\xc9\x21\x0a\xe4\x25\x27\x68\xfe\x50\x24\x9f\xc5\x4c\x5d\x34\x3c\x42\x3b\xef\xbd\xb8\xe1\xb5\xd9\xb7\x42\x87\x34\xaf\x69\xc8\x16\x39\x58\x0a\xcf\x6a\x29\x48\x59\xbd\xad\xe9\xb2\x0a\x85\xd3\x86\x8a\xbf\xa2\x37\x6a\xd1\x31\x78\xeb\x55\xc9\xa5\xfa\x2f\xb9\xba\x7a\x0f\x8e\xf4\xbe\x36\x96\x6d\x24\xb5\x59\xab\x3d\x5b\xcd\x83\xdb\x76\xb7\xfd\x84\x7a\x27\x03\x89\xf4\xa2\x2e\x55\x73\x99\x1c\xe4\x27\x69\x39\x08\xb2\x6a\x53\xcc\x21\x93\x23\x1c\xaf\xf9\xb4\xe2\xc5\xed\xa5\xe7\x2f\x17\xad\xfa\xac\xf6\x3e\x1a\x1c\x47\xe3\xbf\xed\xa2\x30\x75\xa3\x2f\xd3\xaf\xad\x9f\x3c\x8d\x7f\xa5\xbb\xac\x5e\x27\x54\x4a\x51\x70\x17\x20\x89\x00\xa6\xba\xc3\xa2\x84\xc3\x62\xb7\x6e\xc0\x49\xbf\xe5\xf9\x65\x26\xce\x10\x63\x4b\xef\x54\x0a\x5f\x42\xf5\x38\xec\xd4\x74\x5c\x28\x19\x4c\x0d\x9f\x06\xdc\x0c\xc6\xf6\x43\x8f\xbe\xf5\xdb\x6b\x0f\x60\x5c\xa9\x1b\x6b\x4c\xd3\xe1\x6c\x4e\xa2\xe5\x68\xd0\x81\xe6\x47\xf4\xfd\x6b\x2b\x69\xe6\xaf\xf6\xdc\x9b\xfb\xfb\xbc\xcd\x18\xb3\xc8\x03\x45\x54\x53\xf7\xf3\x51\xd8\x12\x3f\xd3\xce\x7e\x48\xdc\x6a\x44\xd3\x57\x74\x36\x6e\xb9\x41\x7c\xb1\x03\x05\x0c\xfe\xfa\xb6\x21\x81\x7c\x14\xe6\x70\x91\xc1\x10\x90\x39\xec\xc1\x37\x50\xcd\x69\x80\xcc\x71\x88\x91\x4e\x90\x6f\x7f\xf8\xfe\xfb\x39\xf0\xe6\x59\x88\xe6\xa0\x85\x1a\x02\x6f\x0e\x41\x34\x07\x85\x06\xc1\x9b\xe7\x4a\x04\x42\xc1\xba\x79\xf0\xe6\x79\x73\x60\x7f\xe8\xcd\x11\xdf\x6a\x6e\x3d\x9f\x5f\xab\x17\xf2\x70\xc5\xab\xf8\xa6\xeb\xdb\x02\x32\x03\xb5\x7b\xe1\xba\xbc\x90\xcc\x89\x8a\xbd\xc4\x6a\xbc\xc8\xdd\xc9\x25\x3a\xec\xab\x06\x2f\xab\xf2\xce\xaf\xaa\x8b\xb4\x34\x5c\x6f\x37\x53\x4b\x17\x90\x39\x5d\x65\x17\xaf\xa0\x0b\x88\x1c\xd4\xd6\x45\x2a\x2d\xf2\xd0\xc4\xe3\x35\x72\x49\xd5\x6f\xa9\x99\xd8\x09\x95\x6e\x3b\xd6\xb7\x25\x27\xdd\xa5\xd4\xb2\xe5\x1c\x2e\xae\x2e\x2d\x22\x94\x84\xeb\xd6\xe6\xaa\xd1\xa2\x52\xa7\xab\xd5\x42\x35\x68\x51\x91\xe1\x63\x64\xbb\xca\xb3\xe4\x7a\x33\xef\xc8\x88\x0a\x4d\xae\x32\xcb\xa9\x2d\x4b\x4f\x5e\x4d\x49\x5c\x4d\xaf\x1e\xf3\x6a\xc2\xa2\x1d\x0f\xd7\x8c\x4d\x57\x82\x25\xad\xa4\xcd\x4a\xb1\x70\xfd\x57\x54\x68\x4a\x7d\x58\xe2\xe6\x4d\xc9\x96\x8d\x55\x80\x45\x33\x69\xf7\x92\x1e\x9b\x52\x65\x94\x5f\x5b\x64\x4f\x97\xa0\x96\x0f\x97\x14\xa5\x3b\xf3\x72\x78\xfa\x7c\x1f\x95\xbe\x7a\x18\x03\x17\x13\x8c\x1c\x68\x61\xd0\x82\xe8\x67\x82\xa4\xfb\xba\x7c\x90\x94\xc5\x16\xbb\x98\xe1\xef\x89\x14\x62\x5b\xed\x8b\xf8\xf9\x6a\x14\x2e\xb1\x1f\x1f\xa2\x24\x5f\x39\x27\xdc\xc1\xb9\xbf\xd9\x49\xe7\xdc\x97\x03\x08\x25\xe3\x94\x40\xdb\xe9\x5a\xb4\x44\x2c\x35\x78\x6c\xc4\x56\x77\x1b\xe6\xf4\xf2\x42\xdd\xe7\xa1\x62\x8c\x56\xf2\x84\x4c\xd4\xef\x6b\x33\x28\x76\xff\x71\x37\x1c\xda\x75\x6c\xdd\x74\xa1\xa5\x70\xf0\xed\x3f\xab\x6f\x3f\xdb\x21\xf9\xab\x7d\xc1\x52\x23\xf7\x6b\x5a\x2f\xd4\x6e\x03\x2f\xbf\xe7\x6c\x0d\xf4\x60\xac\xa9\x4f\x88\xc9\x66\x86\x01\x05\xd7\x0d\x14\x32\x0c\x38\xda\x49\xc8\x47\xe0\xd8\x7b\xf7\xe3\xa1\x05\x59\xd9\xa3\x82\x87\xf1\x68\x7f\x16\x62\x9c\x53\x1b\x54\x41\xd0\x55\x3b\x42\x66\x2b\x7a\x67\xfd\xe0\xc6\xde\xad\x58\x2c\x7b\xff\x12\xaa\x6f\xdc\xfb\xc3\x3b\x0c\x5e\x62\x68\x55\x89\x7b\x6c\xaf\x3b\x07\x23\xc3\x0d\x3d\xc3\x12\x41\xa8\x45\xe1\xea\xa2\xaf\xbd\xc9\x7e\x17\x40\x27\x75\xea\x96\x14\x34\xfc\xe1\x6a\xd0\xea\xd0\xe2\x15\xeb\xfc\xc5\xa6\xae\xd1\x35\x26\xa4\xab\xff\x37\x99\x4d\x91\x8e\x9b\xc0\xd1\x92\xad\xe8\x1d\x17\x7d\x8b\x72\x3b\x41\xbe\xd1\x7f\x82\x43\xeb\x41\xf4\xd6\x59\xd8\x47\x12\x66\xed\x28\xca\x89\x99\xfa\xe0\xfe\x08\x97\xb9\x52\x18\x3f\xca\x82\x7d\xe6\xc1\x72\xc2\x8d\x31\x33\x93\x64\x50\x3b\x1f\xcd\xf0\xba\x93\x8d\x3a\x15\x93\x29\x47\x7f\xf5\xbf\x3f\x34\xc0\xee\xae\xe0\x4f\x5f\x1b\xe1\xe8\xc1\x04\x9b\x7a\x6c\xb8\xb0\xe2\xc5\x43\x32\xd9\xa6\x0b\x13\xaa\xd7\xc8\x1b\x2a\x59\x49\x7e\xa2\x35\xbd\xc1\xbb\xef\x8b\xab\xcb\x37\x3f\xbd\x54\x53\x18\x71\x6f\x5c\x9c\x4f\x45\x19\x8d\x7c\x14\xff\x61\xb7\xfa\x94\x51\x1f\x33\x8e\xc1\xbd\xf5\x72\xc7\x0a\x1b\x73\x60\x85\xd1\xce\x37\x0b\x7c\xc7\x24\xca\xa3\x8d\x7b\xb7\x2e\x1f\x91\x1c\xd9\x35\x39\x5f\x5d\xcd\xcb\x5e\x4c\xc3\xee\x05\xa4\x4d\x7b\x1b\x26\x5f\x90\x1d\xed\xfa\x81\xb6\x19\x1a\x9c\x3f\xa9\x3d\xde\x32\xac\x56\x5f\x02\x7e\x42\xa9\x5f\x32\x07\xff\x69\xc5\xda\x6e\x0d\x4b\xa4\x25\x45\xd5\xcb\x8e\xb5\x78\x31\x81\x92\xcd\xe1\x22\xf8\x20\xd4\x4d\xbf\xa8\xfa\x12\x7c\xf2\xac\x36\x08\x07\x50\x56\xd0\x8a\xf5\x10\xaa\xe1\x18\x8d\x25\xfb\x87\xcb\x56\xac\x59\xb7\x62\xfd\xf0\x04\xff\x19\x94\x90\x68\xc1\xda\x47\xac\x8b\x49\xab\xf8\x86\x77\xab\x7e\x79\x52\x88\xb5\x67\x20\xbf\xd2\xb9\x1b\xdd\xc3\xab\x65\x25\x96\xaf\xd6\x54\xf5\x40\x99\xcb\x5d\xcb\x97\x7d\x27\x5a\xf9\xaa\x64\x77\xac\x7a\x25\xf9\xcd\x82\xb6\xc5\x8a\x77\xac\xe8\xfa\x96\xbd\xa2\x0d\x5f\x14\xa2\xbe\x53\xcb\x4d\xd4\xf2\x64\x5d\xfe\x59\xa9\xa8\x05\xad\xcb\x05\x0e\x92\x6f\xed\xce\x69\x77\x7a\x47\x79\xa5\x6c\xcc\x8f\x4c\x29\x41\xba\xa1\xfc\x87\x2e\x41\xd1\xd1\x8a\xd4\xfd\x7a\xc9\x5a\x88\x9e\x9b\xb7\x49\x23\x4a\x89\xd7\x43\xac\xc9\xb4\xb5\xfb\x6b\x5e\xab\xe9\x78\xd0\xd8\x12\x9b\x20\xc5\x1d\x6d\x6f\x98\xcf\xf5\x3a\x39\xa7\xa3\xd7\x42\x2e\xd2\x79\x97\x68\x43\x95\x71\x16\xec\xe1\x47\x77\xf2\x1a\xf7\x96\x32\x91\x28\xd2\xa3\x9a\x12\xed\xbe\x2e\x59\x5b\x51\x40\x72\xc0\x96\x6e\x1e\xc7\xfa\x4e\x03\x36\xd0\x92\xa9\x6f\x36\xac\x55\xed\x56\xe6\x21\xdc\x7f\x4b\x75\x32\x33\x2b\xdb\x86\xb0\xec\xd7\x26\x3b\x36\x75\xfd\x6d\xb7\x99\xbc\x5a\xd4\x8b\x8e\xb5\x6b\x5e\xc3\x61\x00\x33\x18\x9c\x8c\x8d\x2e\xea\xc9\x21\x2f\xba\x15\xe3\xad\xe6\x09\x21\x6b\xda\x15\xda\xeb\x0a\xa8\xb9\xa2\x7d\xb9\x9f\xe9\xeb\xeb\xdd\x56\xab\xf7\xfe\x0e\xbd\xdd\x53\x5f\x9a\x52\x8d\xfa\x56\xfd\xd8\xdf\xc4\xc1\x89\xb5\xa2\x77\xe8\x98\x29\x99\x54\xa7\x80\xe1\xd1\x80\xeb\xd0\x3e\x7a\x3b\x75\xbc\x2c\x36\x35\xcf\xe0\xaf\xb8\x55\x07\x1f\xb5\x53\xdf\x9b\x58\x13\xc3\xbf\x0f\xc7\x39\x7c\x24\x8d\x1b\xba\x80\x21\xf8\xd3\xe4\xf7\xf5\x20\xbd\x26\x77\xdf\xb9\x7f\xc1\x3c\x2e\x34\x24\x39\xfc\x01\x81\xab\x58\xf9\x9a\x74\x6d\x8f\x07\xa9\x36\x8f\xf4\x27\xee\x10\xa4\x45\xc1\x9a\x8e\x95\x70\xdf\xc1\x26\xdc\xf2\xba\x7c\x4d\xbe\x41\xf0\xec\xa6\xea\x5b\x5a\xe9\x7f\x2a\x65\xca\x41\x6f\xbc\x26\xff\xf3\xbf\x7f\x42\xa9\xac\xfc\xd5\xb4\x43\x7d\xf8\xff\x01\x00\x00\xff\xff\x40\xb7\x3b\xba\x5b\x18\x04\x00") func examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYamlBytes() ([]byte, error) { return bindataRead( @@ -97,7 +97,7 @@ func examplePrometheusOperatorCrdMonitoringCoreosCom_alertmanagersYaml() (*asset return nil, err } - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml", size: 266174, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml", size: 268379, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -122,7 +122,7 @@ func examplePrometheusOperatorCrdMonitoringCoreosCom_podmonitorsYaml() (*asset, return a, nil } -var _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7f\x73\xdc\x38\x92\x20\xfa\x7f\x7f\x0a\x84\x7b\x22\x64\xdf\x53\x95\xda\x3d\x73\x13\x7b\xbe\x89\xdb\xd0\x58\xee\x1e\xdd\xd8\xb2\xce\x52\xbb\x6f\xe2\xc5\x8b\x6e\x14\x89\xaa\xc2\x8a\x04\x38\x00\x58\x52\xcd\xce\x7e\xf7\x17\xc8\x04\xf8\xa3\x48\x82\xa0\x54\x6e\x7b\xba\xc9\x8d\xd8\x69\xab\xc8\x04\x90\x48\x64\x26\xf2\xe7\x57\x8b\xc5\xe2\x2b\x5a\xf0\x8f\x4c\x69\x2e\xc5\x2b\x42\x0b\xce\x1e\x0c\x13\xf6\x5f\x7a\x79\xf7\x6f\x7a\xc9\xe5\xd9\xee\xe5\x8a\x19\xfa\xf2\xab\x3b\x2e\xd2\x57\xe4\x75\xa9\x8d\xcc\x3f\x30\x2d\x4b\x95\xb0\x0b\xb6\xe6\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\xbe\xfa\x8a\x10\x2a\x84\x34\xd4\xfe\x59\xdb\x7f\x12\x92\x48\x61\x94\xcc\x32\xa6\x16\x1b\x26\x96\x77\xe5\x8a\xad\x4a\x9e\xa5\x4c\xc1\x08\x7e\xfc\xdd\x37\xcb\x6f\x97\x7f\xf8\x8a\x90\x44\x31\xf8\xfc\x96\xe7\x4c\x1b\x9a\x17\xaf\x88\x28\xb3\xec\x2b\x42\x04\xcd\xd9\x2b\x52\x28\x99\x33\xb3\x65\xa5\x66\x7a\x99\x4b\xc1\x8d\x54\x5c\x6c\x96\x89\x54\x4c\xea\x65\x22\xf3\xaf\x74\xc1\x12\x98\x4b\x9a\xc2\x04\x69\x76\xad\xb8\x30\x4c\xbd\x96\x59\x99\xe3\xc4\x16\xe4\x7f\xdf\xbc\xbf\xba\xa6\x66\xfb\x8a\x2c\xed\x07\x4b\x37\x15\x98\x74\xca\x74\xa2\x78\x61\x60\x6a\xb7\x5b\x46\xdc\x8f\x44\xae\xc9\x75\x35\x01\x78\x15\x67\xf5\xb1\xf1\xb1\xd9\x17\xec\x15\xd1\xc6\x4e\xab\x77\x24\xc5\x8a\x8c\x27\x54\xf7\x0f\x95\x32\xcd\x15\x4b\x89\x7f\x8b\x88\x32\x5f\x31\xd5\x1e\x9a\x35\x07\xff\xd0\x84\x87\xa3\xdb\xe5\x6e\x98\x3a\x1c\xde\xef\xd4\xb2\x83\xe5\x06\xb8\xf3\x0d\x6b\x40\x4a\xa9\xb1\xff\xdc\x28\x59\x16\xaf\x48\x3f\xc2\xf1\x4b\xb7\xe1\x48\x2c\x07\x58\xca\xb8\x36\x7f\x3d\xf8\xe1\x2d\xd7\x06\x7e\x2c\xb2\x52\xd1\xac\xbd\xb5\xf0\x83\xe6\x62\x53\x66\x54\x35\x7f\xfa\x8a\x90\x42\x31\xcd\xd4\x8e\xfd\x20\xee\x84\xbc\x17\xdf\x71\x96\xa5\xfa\x15\x59\xd3\x4c\xdb\xa9\xea\x44\xda\x89\x5f\xd9\x29\x15\x34\x61\xa9\xfd\x5b\xb9\x52\x8e\x70\xf5\x2b\xf2\x9f\xff\xf5\x15\x21\x3b\x9a\xf1\x14\x90\x80\xf3\x96\x05\x13\xe7\xd7\x97\x1f\x7f\x7f\x93\x6c\x59\x4e\xf1\x8f\x07\xfb\x53\x4f\x9e\xa4\x96\xfe\x99\x26\xb4\xfd\xc7\x22\x93\xfb\x9c\x09\xb3\x74\x9f\x17\x4a\x16\x4c\x19\xee\xb1\x63\x9f\xc6\xb9\xab\xfe\x76\x30\xd0\x89\x9d\x89\xa3\x39\x3f\x92\xa9\xe9\x90\xa5\x44\xc3\x2c\x2d\x55\x98\x2d\xd7\x96\x5a\x2c\x56\x04\x9e\xbd\x06\x58\x62\x5f\xa1\x82\xc8\xd5\x7f\xb0\xc4\x2c\xc9\x8d\xc5\x9c\xd2\x44\x6f\x65\x99\xa5\xf6\x78\xee\x98\x32\x44\xb1\x44\x6e\x04\xff\x47\x05\x59\x13\x23\x61\xc8\x8c\x1a\xe6\x36\xca\x3f\x70\x98\x04\xcd\x2c\x0e\x4b\x76\x4a\xa8\x48\x49\x4e\xf7\x44\x31\x3b\x06\x29\x45\x03\x1a\xbc\xa2\x97\xe4\x9d\x54\x8c\x70\xb1\x96\xaf\xc8\xd6\x98\x42\xbf\x3a\x3b\xdb\x70\xe3\x39\x4d\x22\xf3\xbc\x14\xdc\xec\xcf\x80\x5f\xf0\x55\x69\xa4\xd2\x67\x29\xdb\xb1\xec\x4c\xf3\xcd\x82\xaa\x64\xcb\x0d\x4b\x4c\xa9\xd8\x19\x2d\xf8\x02\x26\x2e\x80\xd1\x2c\xf3\xf4\xeb\x6a\x77\x4f\x1a\x33\x3d\x38\x89\xf8\x00\x7d\x0e\xe2\xdd\x12\x29\xe1\x76\x5b\xf1\x33\x9c\x7f\x8d\x5e\xfb\x27\x8b\x95\x0f\x6f\x6e\x6e\x89\x1f\x14\xb6\xa0\x8d\x73\xc0\x76\xfd\x99\xae\x11\x6f\x11\xc5\xc5\x9a\x29\xdc\xb8\xb5\x92\x39\x40\x64\x22\x2d\x24\x17\x06\xfe\x91\x64\x9c\x89\x36\xd2\x75\xb9\xca\xb9\xb1\x3b\xfd\xf7\x92\x69\x63\xf7\x67\x49\x5e\x03\xbf\x25\x2b\x46\xca\xc2\x9e\xd4\x74\x49\x2e\x05\x79\x4d\x73\x96\xbd\xa6\x9a\x7d\x72\xb4\x5b\x0c\xeb\x85\x45\xe9\x38\xe2\x9b\x62\xa2\xfd\x22\x62\xab\xfa\xb3\xe7\xdf\xfd\x3b\x74\x53\xb0\x84\xaf\x79\x02\x84\x8e\xf4\x5f\x33\xcd\x15\xdb\xd2\x1d\x97\xca\xff\xbd\x71\x36\x93\xac\xd4\x86\xa9\x65\x0b\xa9\xfd\xe8\xd9\x96\x2b\xcb\xd7\xce\xac\xb0\x52\x82\x19\xa6\x1b\x98\x5a\x65\x72\x75\x96\x53\x0b\xeb\xb1\x58\xb3\x0b\x5c\x50\x91\x2e\xb4\xa1\xa6\x6c\x61\xae\x8f\x5f\x00\xcf\xa8\x64\xd9\x79\xc6\x94\x79\x47\x05\xdd\x58\x81\x26\xd6\x7c\x73\xf0\x6a\x87\x95\x84\x3e\x25\x34\xcb\xe4\xbd\x06\x9c\xf3\xf5\xde\x92\x37\x25\x77\x6c\x7f\x00\x11\xb9\x08\xb9\x61\x89\x62\x06\x64\x3a\xe5\x02\x5e\xae\x80\x37\x71\xdd\x1c\xc8\xbe\xbd\xe6\x9b\x52\xa1\x56\xb0\xec\x40\x0e\xbc\xec\xa6\xc5\x59\x4a\xa8\x62\x84\x16\x05\x13\x29\x4b\x3d\x6b\x6a\xbf\xdc\x01\xbc\x61\x82\x29\x7b\x28\xc8\x6a\x7f\x48\x0d\xef\x0b\xfb\x93\x54\x4b\xf2\xbf\xe5\x6a\x70\xd4\x0e\xc8\xbc\xd4\x86\x6c\xe9\x8e\x01\xbc\xb5\x54\x39\xa1\xcd\x59\x72\x01\x3f\xc8\xf5\x9a\x27\xbc\x8d\x93\x54\x26\x65\xee\x19\xf4\xe1\x8e\x91\x8a\xfc\x6a\x49\x67\x0f\x68\x2a\x13\xdd\xf8\xd3\x19\x32\xe3\xb3\xd6\x7c\x0f\xfe\xf5\x35\xb5\xf8\xcc\x11\x9f\x3f\xe1\x6f\x3d\x48\xef\xdd\x24\xdd\x42\xf3\x29\xac\xa5\xd4\x4c\x11\x90\x30\xba\x90\x42\xf3\x55\xc6\x2c\xfe\x73\x7a\xc7\x3a\x50\x75\x69\x8f\x93\xb1\xaf\x83\x78\x5d\x92\x2b\x69\x2c\xae\xa8\x21\xa5\x46\xde\x69\x79\x1e\xa3\xf6\x68\x00\x2b\x64\x0f\x85\xd4\x88\xce\x42\x6a\xcd\x57\x3c\xe3\xa6\x4b\x7e\x46\x92\x95\x62\xf4\x8e\x94\xc5\x46\xd1\x94\xe9\xb6\x3e\xb4\x24\x97\x30\x2a\x4d\x77\x5c\x23\x81\x28\xb6\xe3\xec\xfe\x50\x11\x69\x3e\x8a\x65\x8c\x6a\x46\x84\x34\x0c\xc4\x1d\x13\xb0\x00\x98\xae\x90\x84\x8b\x44\xe6\x05\x35\xb0\xe4\x3e\x6c\x75\x20\x5a\xec\x6d\x24\xac\xd3\xcf\xb7\x41\x01\x74\x6d\x80\xeb\x33\xbf\x88\xe5\xc9\x01\x84\xa1\xd3\x6f\x9f\x3b\xb6\xef\xfe\xb1\x47\x7f\xbc\x63\x7b\xcf\xfd\x34\x1e\x57\x23\x89\x66\x99\x95\x47\x56\xd8\x2c\x09\x79\x67\xa9\x78\xc5\x08\xc5\x5d\xea\x81\x4a\xfc\xb7\x77\x6c\xdf\x25\x9e\x01\x06\xef\x1f\x50\x23\xc7\xa6\x7a\x62\xf5\x33\x3f\x51\xc5\xd6\x4c\x59\xad\xa9\x8f\x21\xd7\x5c\xb8\x3a\x11\x89\x14\x09\x2b\x8c\x3e\x93\x3b\xa6\xec\x36\x9f\xdd\x4b\x75\xc7\xc5\x66\x71\xcf\xcd\x76\x81\xf2\x44\x9f\x81\x56\x7a\xf6\x35\xfc\x4f\xef\x22\x6f\xdf\x5f\xbc\x7f\x45\xce\xd3\x94\x48\xb3\x65\xca\xd2\xfa\xba\xcc\xc8\x1a\x34\xca\x65\x43\x51\x3b\x05\xb5\xe1\x94\x94\x3c\xfd\xf7\xc3\x4d\x1b\xc5\x87\x2c\x90\x43\x8e\xe2\x04\x45\xdb\x9e\xdc\x6f\x19\x4c\xc7\xa2\xc6\xb1\x5c\xa9\x88\x15\xfe\x76\x73\x73\xb7\x7b\xa8\x17\xf6\xed\x1e\xce\x66\x25\x65\xc6\xa8\x38\xf8\xdd\xaa\x0f\x56\x54\x1e\x4e\x66\xd1\xc3\xf5\x7b\xa5\x33\xe9\x4a\xa3\x0f\x2c\xa3\x2b\x96\x3d\x46\x1a\xb5\x3f\xfd\x34\xd2\x08\x18\xa2\x3d\xed\x76\xa4\x38\x71\x34\xf0\xf6\x2f\x21\x8f\x42\xe3\x77\x19\x6e\x35\x9f\xc7\x4b\xa6\x0e\xd0\xb6\xa4\x3a\xb6\x64\xfa\xc9\x2d\xcd\x89\xa6\xbe\x1d\xe8\xdf\xb2\x78\xe1\xd4\x15\xdb\xf4\x8e\x3d\x4d\x38\x75\x40\x36\x84\xd5\xa3\x85\x53\x07\x68\x83\x20\x26\x09\xa7\x16\xba\x3a\x50\x9b\xe8\x9b\xa5\xd3\x2c\x9d\xda\xcf\xaf\x59\x3a\xdd\x24\x8a\x16\x6c\xa2\x5c\x6a\x7d\x34\x24\x91\x9a\x12\xa8\xef\xc0\x85\x25\x92\x86\x21\x0e\x45\x11\xb9\xe9\xfb\x73\x80\xe7\x8f\xcb\xa0\x90\xcc\xe9\x00\x8e\xbb\x13\x8d\x49\x9a\x0e\xd8\xe8\x3b\xd1\x11\x25\x0d\x22\x38\x74\xfb\x69\x6d\xc1\xc4\x7b\x0f\x88\x92\xee\x3a\x7f\x95\xf7\x9e\x1e\x3c\x81\x0c\x19\x9e\xe9\x2c\x53\xfa\xa7\x3a\xcb\x94\x2e\x4e\xfe\x75\x64\xca\x1a\xdc\x5d\x1d\x82\x6c\xad\xe6\x72\x5d\xb3\xc1\x53\x77\xb4\xd3\x13\x0d\x16\xf5\xb4\xcc\x2c\x1f\x48\xa4\xd0\x46\x51\x2e\x4c\x47\xf1\x0d\x1d\x05\x21\x53\x76\x3e\x30\x85\xce\x34\x2e\xe0\x1f\x2b\xa6\xe1\xb3\x6a\xea\xcd\x69\xa8\x32\x63\xda\xf2\x6e\x3f\xcb\x3e\x92\x0f\x4d\x08\x7f\xb7\x44\xac\x58\x7a\x51\x5a\x2a\xb8\xa9\xc0\x5f\x6e\x84\xac\xfe\xfc\xe6\x81\x25\x65\xbf\xcd\xab\x67\xee\xf6\x3c\xbb\x79\x32\x45\xee\x79\x96\xb9\x61\xe0\x4c\xbb\x1f\xec\x84\x81\x71\xd9\xf5\xf5\xd3\xb9\x7d\x80\x9f\x69\x6a\xb8\x5e\xa3\xec\xab\x30\xc1\x1e\x0a\xc5\xb4\x3e\x10\x6c\x20\x21\x2d\x9b\xb6\x87\xe1\x74\x10\xec\xaa\x34\x96\xd7\x5b\x26\x9e\x6c\xa5\x65\xe2\x14\x11\x0d\xe3\xed\xb8\x04\x01\x45\xa4\x60\x96\x86\x73\x7b\xbc\xf1\xd0\x0f\x42\x6c\x4c\x67\x09\x18\xa8\xc1\x71\x4d\x72\xa9\x4d\x8d\x6b\xfb\x17\x10\xa7\x82\x11\x7b\xf4\x03\xab\x67\x64\xa3\x18\x08\x4b\xa2\xcb\xdc\x4e\xe2\x9e\xf1\xcd\xd6\xe8\x53\xc2\x97\x6c\x09\xdb\xcf\x68\xb2\x6d\x0c\x97\x33\x66\x86\x11\x4a\xb3\xac\x62\xb4\x0d\x5a\xc2\xf3\x65\xe5\xb8\x26\xcf\x2b\x9f\x88\xf3\x53\x9c\x56\xe7\xef\x90\x4a\x86\x87\xe9\xd9\xa6\x53\xc2\x4c\xb2\x7c\x71\x4a\xac\x68\x2a\x8d\xc5\xb9\x5d\xd3\x6a\x4f\xb8\xb1\x5a\x0b\xca\x58\x25\xcb\x4d\x18\x23\x2c\x73\x13\xf5\x8e\x33\xd8\x6c\xf0\x60\x59\x55\x4d\x6c\xc8\x33\x44\xd2\x33\xaf\x50\xe9\x32\x1f\x84\xc8\x11\x19\x80\xbf\x9c\x9a\x64\xeb\xdc\x74\x89\x54\xa8\x36\x00\x44\xf8\xe5\x4d\xbd\x96\xff\x19\x24\x06\x0b\xec\xb9\x7e\x01\x9b\x0b\xc0\xb6\x7c\xb3\xf5\x7b\x48\x15\xaa\x0c\x6d\x9a\xe8\x3b\xbc\x30\x3d\xc3\xf2\x81\xb3\x4b\x0e\x0f\xde\xb9\x20\x2c\x2f\xcc\xbe\x41\x69\x8d\x3d\x36\x4c\xe5\xd5\x0a\x69\xd6\xbd\x63\xd6\x8f\x13\x45\x38\x7f\x9e\x17\x19\x4f\xb8\x71\x94\x47\xbe\x21\xcf\x81\xf4\xb8\x39\xd1\x70\x6c\x16\xb2\x78\xb1\x24\xe7\xde\xc7\x3f\xf4\x8c\x4f\x4a\xc8\x6a\x64\x37\x84\x9d\xa8\xee\xda\x02\xea\xa7\x1a\x7f\xf0\x9d\x31\x0e\xd8\x9c\x1c\x13\x49\xaf\x0e\x50\x3f\x6d\x7c\x23\xd5\xa0\x9a\x62\xf9\x30\x53\xf9\x29\xa1\x5a\xcb\x84\x83\xbe\xee\xf7\x3f\x08\x92\x1c\x90\x1a\xa2\x79\x78\x41\xf1\x8b\x22\x60\x36\x69\x13\xee\xd8\xfb\x9d\x25\x66\x5c\x1b\x7b\xd2\xda\x4b\x6d\x32\x8c\x51\x88\xc4\x9e\x71\xfb\xfd\x89\x26\x60\xde\xe8\x31\x18\x1d\x3e\x23\x74\x3f\x38\xdd\xc1\x69\x3a\x8f\xb0\xfb\x25\x02\xb0\x13\x3e\xee\x22\xa8\x9d\x17\xfc\x14\xef\x8e\xe8\x30\xa7\x82\x48\x77\xe1\x82\x97\xa3\xa0\x2a\x86\xc2\xc5\x38\xb5\xd7\x02\x72\x1e\xf6\x88\xef\xe3\x77\x1e\x9f\x01\x05\xbc\xef\xe9\x08\x71\xb4\xdc\xd9\x39\x02\x26\x50\x39\x9f\x80\x3f\x02\x81\x12\x45\xc6\xe1\x8a\x12\xb3\x3a\x32\xa6\x95\xf6\x3d\x7e\x0b\x1e\xb5\xce\x0f\x95\x7b\x1f\x37\xf6\x44\xe3\x06\xd9\xb3\xb2\xe5\x45\xf4\x3a\x8d\x04\xea\x82\xa3\xe2\xe3\x25\x3e\xda\x7b\x4a\x35\x3d\xbc\x78\x5d\x8a\x61\xad\xe4\xf0\xb9\x92\xe6\x52\x9c\x92\x37\x0f\x5c\x5b\x81\x7f\x21\x99\xbe\x92\x06\xfe\xb9\x24\xdf\x1b\xa4\xc1\xb7\x23\xac\xa2\x31\xc5\xa9\x88\xc5\x75\x3c\x0a\xad\xe7\x82\x50\xa5\x28\x5c\xea\x9a\x51\x18\xf6\xb6\x1b\x56\xa4\x0e\x9f\xea\x80\x71\x4d\x2e\x85\x55\xc7\x1c\x5a\x20\x96\x06\x60\xe2\x50\xd1\x10\xfd\x55\x44\x48\xb1\x00\x79\xe9\xe7\xd4\x1a\x0b\xb1\x1e\x3f\x4d\xd5\xda\x9f\xee\xf4\xfc\xb0\xd1\x10\x87\xa7\xf6\x3d\xdc\xac\xde\xb6\x06\x89\x3f\x90\xf5\x64\xc0\x00\x44\x21\x44\x2b\xab\xd4\xaa\x53\x72\xbf\xe5\xc9\x16\xf4\xf6\x68\xa0\x2b\x86\x01\x45\x85\x62\x56\xee\x51\x6d\x59\xa3\x0b\x60\xb3\xea\x30\xf7\x48\xe0\xf1\x13\x55\xac\xc8\x68\xc2\x52\x92\x82\xd2\x89\xe1\x3c\xd4\xb0\x0d\x4f\x48\xce\xd4\x86\x91\xc2\xca\xb6\x58\xea\x8f\x16\x28\xf8\x4c\x3e\x2c\xfe\x93\x58\x5a\x1c\xba\xd2\xf6\x3d\x7d\xd7\xdc\xfe\xf7\x3c\x99\x44\xbc\x3c\x78\x4f\x1e\x7e\x39\x66\x6d\xa0\x70\xb8\x78\xbe\xcf\xac\x6b\x38\x8b\xc8\xac\x6b\xcc\xba\xc6\xc0\x33\xeb\x1a\xfe\x99\x75\x8d\x59\xd7\x98\x75\x8d\x59\xd7\xf8\x17\xd2\x35\x22\x81\xa2\x3d\x65\x82\x59\xe7\x47\xb4\x73\x1d\xda\x71\x40\xb1\xf1\xb1\xe3\x2d\x93\xcd\xc8\x8a\xac\x9a\x70\xe3\x64\xd9\x2d\x98\x88\x9c\x3b\x55\x51\xb1\x61\xe4\xe5\xe2\xe5\x37\xdf\x84\x29\x6b\x2d\x55\x4e\x0d\xa4\x84\xfc\xfe\xdb\x08\x9c\xd4\xa9\x23\xfd\xcf\x38\x3d\x2c\x1a\x16\xb1\xc0\x4b\x88\xdb\x61\x6b\xed\xf8\x0e\x8d\x6d\xf6\x90\xe5\xf9\x09\xfe\x09\xc7\xe5\x2a\x13\x75\xcb\xf8\xdd\x71\x25\x0c\x2e\xce\x59\x9d\x15\x38\x61\x49\xce\x0c\xa1\xa6\x65\xda\xe4\x39\xab\x3c\x48\xe8\x06\xc1\x38\xff\x41\x88\xde\x37\x92\x12\x29\x9c\xe5\xda\xd2\xce\x32\x72\xc6\xc3\xde\x8e\xa6\x53\x84\x24\xe0\x38\x36\xd2\x32\x52\x3f\x6b\x99\xdb\x59\x72\x61\x3c\x03\xb4\x53\x66\x1e\xab\x83\x80\x9f\xb3\xe5\x66\x49\xd2\x12\xc0\x51\xe1\x12\x18\x5e\xe0\xaa\xf5\x5e\x1b\x96\x83\x8f\x45\x2a\xf8\x1f\xbb\x7c\xa3\xf6\x7d\xd1\x5d\xfe\x61\x3b\x26\x4c\x49\xb3\x6c\x4f\xd8\x8e\x27\xa6\xc2\x1f\xe4\x58\x70\x83\xfe\xb0\xa1\xd3\x12\xa3\xb0\x1e\x9e\xc6\x20\x9f\x3e\x50\xdf\x90\x14\x97\x83\x37\x15\x63\xe1\x81\xfb\x27\x7c\x48\xed\x6b\x40\x39\xef\x3f\x0c\x5b\xfe\x49\x9c\x20\x39\xbc\x93\x94\x59\x66\xf1\x8d\x8e\x80\xee\xf4\xbc\xb1\x7d\x94\x67\x79\x53\x3c\x7a\xb3\x5a\x14\x87\xfe\x23\xf4\x64\x9c\x5f\x5d\x58\x8c\x8c\x2d\x99\x90\x5b\x59\xc8\x4c\x6e\xf6\x4d\xdc\xc3\xe9\x07\x07\x83\x83\x4c\x89\x2e\x57\x4e\xb3\x1d\x57\xdc\xae\x0e\xb6\x72\xb6\x99\xcf\xf7\xd8\xbe\x67\xbe\xc7\x76\x9e\xf9\x1e\x1b\x39\xc5\xf9\x1e\x0b\xcf\x7c\x8f\x9d\xef\xb1\xa3\xcf\x7c\x8f\xed\x79\x79\xb6\x99\xcf\xba\x46\xe0\x99\x75\x8d\xce\x33\xeb\x1a\xb3\xae\x31\xeb\x1a\xb3\xae\x11\x7c\x66\x5d\xa3\xe7\xe5\xa3\xd9\xcc\xc7\xc1\x8d\xa1\x67\xd1\x35\xb4\x05\x2d\xc0\x83\x53\x0a\xfe\x5c\xc8\xf4\x11\x21\xf5\x85\x4c\x03\x11\xf5\x68\xd4\x4c\xe4\x22\x93\x09\x16\x4e\xea\x99\x94\x3d\x31\x16\x8c\xb3\xe4\x6b\x9a\xa3\xad\xf6\x94\xfc\x43\x0a\x86\x91\xce\x90\x52\x25\x73\xe6\xd2\x34\x0a\x99\x3e\xd7\x2f\x7a\x23\x55\xe7\x28\xfd\xde\x67\x8e\xd2\x9f\xa3\xf4\xdd\xd3\x8c\xd2\xdf\x52\x8d\x74\x89\x82\x70\x38\x68\xbf\xc1\x1d\x2c\x03\xfa\x9f\xc1\xf9\x7e\xa6\x98\x7d\x4b\x84\x8e\x58\x20\x1f\xb5\xde\x78\x5c\x57\xea\xdc\x91\x2c\xbd\x6e\xaf\x26\xc0\xbd\xf1\x0e\x87\xf9\x90\x69\xca\x52\x52\x30\xb5\x40\xd2\x93\x64\xcd\x45\xda\xb3\x16\xbf\xfe\x41\xb0\x91\x71\xf4\xed\x49\x4e\x70\x5d\x34\xbd\x2b\x2d\x06\x7d\x18\x55\x3f\x22\x0b\xab\xfd\xfb\x94\x51\xf5\x70\xf3\xf2\xc2\x6d\xfa\x95\x1d\xee\x6d\x7f\x2f\x99\xda\x13\xb9\x63\xaa\xbe\x99\x54\x25\xd0\x62\x2e\x21\x20\x7b\xb8\x26\x09\xd5\xc8\xa8\xc7\x55\xad\x69\xb7\xd3\xe9\x7e\x90\xce\x62\x0f\x41\xe0\x2d\xdf\xdb\x2c\xfa\x6b\x1d\xf4\x3f\xbd\xa6\x8d\x1e\xe7\x14\xed\x49\xeb\xed\x7f\xd0\x75\x15\xf5\xf2\x24\xe5\xb4\x77\xb7\x07\x4c\x1e\xf1\xd7\x82\x86\x1b\x6f\xc4\xec\x11\x0f\xf3\xc0\x3c\xf2\x44\xd3\x07\x79\x84\xf9\x83\x4c\x33\x81\x90\x43\xf4\xda\x59\x3a\x39\xdd\xb5\x86\x4c\x00\xda\xa0\xaf\xe9\x16\x11\xf2\xb8\xfb\xc8\x74\xcb\x08\x39\x5c\x7e\xb5\x7d\xaa\x63\x26\x99\xb4\xf8\xa6\x49\x65\xd8\x54\x32\x09\x64\xc7\xac\xd2\x36\x97\x00\x6d\xb5\x2c\x26\x9f\x1a\xd9\xd3\xac\x25\xe4\x10\xd5\xce\x56\xc0\xe1\xea\x7c\x60\x3b\x99\x84\x98\xb6\x9d\x65\xd0\x7e\x32\x09\xe6\x90\x31\xa3\x6d\x43\x99\x0c\xb2\x6b\x6f\xe9\xd8\x51\x8e\x33\x4d\x37\xc5\xda\x10\x31\x09\x2c\xd6\x4e\x3d\xa6\x31\x82\x4c\x37\x48\x90\xc7\xd2\xe5\x54\xc3\x04\x99\x68\x9c\x20\x13\x0c\x14\x64\xaa\x91\x82\x4c\x35\x54\x90\xc9\xeb\x05\x15\xe2\x2d\x84\x40\xc4\x2d\xb7\x59\x33\x7a\xaa\x34\x9a\xbc\x83\x5d\x6d\x07\xa7\x8a\x8a\x4e\x4e\x0b\xcb\x25\xfe\xd3\x8a\x66\x20\xfc\xff\x8a\x95\xa3\x94\x2b\x6d\x55\x61\x67\xfc\x6b\x40\xf0\x36\x87\xc6\x60\x91\x40\xed\x6c\xb8\x26\x96\x76\x76\x34\xb3\x0a\x08\x86\x6d\xb9\xab\x9a\x9d\xe9\xa1\xbe\x16\x7b\xbe\xef\xb7\xf6\x7a\x6e\x85\x2f\x5e\xf3\xb8\x26\xcf\xee\xd8\xfe\xd9\x69\x87\x8f\x3c\xbb\x14\xcf\x62\xa1\x52\x77\x55\x69\xf1\x8c\x4a\xf3\x91\x22\xdb\x93\x67\xf0\xdb\xb3\xd8\x83\xdd\xa7\x2e\x4e\x51\x04\x1f\x61\x94\x8b\x7a\x59\xf8\x4a\xd7\x53\x1d\x80\xf5\x87\x95\x7d\xc5\x5f\x8c\xeb\x9f\x62\xac\x8d\x5e\x83\xba\xe9\xea\x41\xe4\x79\x95\x36\xbe\xb1\x98\x37\x2f\x86\xaf\xd2\x8d\x25\xb5\x22\xd1\x40\xe5\xcf\x19\x15\x9a\x3c\xf3\xd6\xb3\x13\x5d\xcf\xf1\xd9\xf1\x3c\x8e\x93\xce\x70\x3c\x2f\x32\x2e\x80\xed\xaf\x31\xea\xea\xc1\x1d\xdf\x59\x0b\x5d\xc1\xee\x15\xab\xcd\x8b\x29\x79\xee\x6f\xba\xc3\x77\xef\xfa\x91\x0a\xa2\x28\x5b\x9f\x0b\xc3\x17\x15\x8c\xfa\xfe\x6b\x6f\x84\xb1\xec\xd5\x87\x35\xb7\x29\xc0\x1b\x37\x2b\xbb\x5d\x4d\x51\x31\x27\xf8\x7e\xcb\x54\x6b\xa5\xdc\x97\x5c\x07\x0f\x84\x2a\x05\x94\xd7\x92\xc2\x99\xf5\xa2\x40\x5a\x36\x83\xf5\xbc\x9d\x99\x04\xd5\x7e\x58\x35\xe8\xfe\xf5\x2e\x45\x86\x3a\x12\x6f\xc0\x84\x22\xeb\x2e\x66\x52\x0a\x77\x88\xec\x5f\xaa\xc2\x44\x16\x2f\x2c\x8d\xc5\x2c\xaf\xd6\xb8\x24\x6f\xe0\x10\x34\x27\xc7\x35\xec\x24\xd4\x26\x8b\xe1\x3e\xd1\x54\x1d\xa7\x1b\x2c\x9a\x93\x39\x86\xcb\x60\x72\x98\xfd\xfd\x91\xc3\xec\x0f\x4c\x4f\xff\x22\x51\xf6\x91\x46\xbd\x39\xd4\x7e\x0e\xb5\x6f\x84\xda\xc3\x47\xc8\xf9\xc6\x63\xee\x87\x69\x06\x62\xf1\x63\x63\xee\xc9\x8f\x5b\x06\x27\x2a\x60\x60\xb3\x5b\x94\x97\x99\xe1\x45\xed\xb0\xd6\x38\xb5\x0c\xaf\x8f\x18\xa8\xa4\x0f\xac\xb3\xa1\x8c\x00\x9a\x6c\x0f\x8f\x09\x8c\x03\x0e\x6d\x0d\x1c\xd9\xb9\x59\x68\x96\xb9\xd8\x7a\x7b\xaf\x1c\xde\x23\xe6\x7c\x55\xfc\x38\x26\xfc\x8b\xaa\x8d\x88\x33\x9a\x80\x73\xe2\xb9\x15\x96\x99\x25\x07\x2b\xb2\x3c\x57\x0b\xf9\x5c\x3b\xf2\x17\xad\x32\x3b\xe6\x1d\x24\x1b\xbe\x63\xa2\x16\xc2\xcf\xf5\x8b\x17\x63\x61\x4d\x26\x52\xf5\xe8\x2a\x16\x01\xa0\x7d\x2a\xc7\x69\xa4\xb8\x0f\x80\xad\x14\x81\x08\x31\xff\xa7\x86\xf4\xfa\x5f\x01\x98\xb5\x73\x68\x50\xc0\x03\x7a\x2a\x11\x5f\x6d\x60\x00\x28\x1f\x5f\x4d\x9c\x1d\x74\x82\x1b\xe1\x11\x2e\x04\xc2\x87\xd9\x09\x3e\x53\xdc\x07\xbf\x58\xfa\x44\x84\xcb\x60\x4a\x98\xdb\xb8\xbb\x20\xf6\xfe\xf7\xd8\x90\xc7\xa0\x03\x60\x8e\x79\x0c\x3e\xf1\xc6\xfe\x5f\x5f\xe8\x63\xc0\xb8\xff\x85\xc6\x40\x3e\xda\xa8\xff\x4b\x86\x3e\x86\x0c\xf9\x13\xbd\x5d\x64\xcc\x88\xff\xc4\x00\xc0\xb1\x20\xc8\x68\x98\x03\xc6\xfb\x7e\x83\x7c\x34\xd4\x3e\xc3\x7d\xaf\x31\x3e\x1a\xe2\x1c\x41\x38\xfa\xde\xe7\x8e\x20\x9c\x68\x90\x7f\xac\x31\x7e\xd2\xee\x4c\x35\xc2\x3b\xf3\x7a\xc4\x34\x22\x0d\xf0\x5d\xd3\x7a\xcc\x12\x47\x8d\xef\x87\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x6b\x52\x8f\x00\xdb\x6f\x74\x7f\x92\x3a\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xa7\x9b\xcf\x23\x62\x09\x26\x98\xce\xbd\x61\x7c\x04\xe2\x31\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\xa7\x30\x91\x4f\x34\x8f\xc7\x5c\xcb\x49\xef\xd5\x3c\x64\x1a\xc7\x9b\xf0\x08\xc8\x78\xb3\x78\xf3\x36\x3c\xb6\xfc\x58\x93\x78\xf3\x3e\x3c\xe6\x99\x8a\x32\x87\x77\x8d\xdd\xf1\xde\x94\x49\xa6\xf0\x28\x6a\x8d\xb1\xbc\xc6\x98\xbf\x9f\x6c\x54\x1d\x0d\x5e\x17\x86\x3f\x36\x80\xbd\x49\xd7\x03\x51\xec\xbd\x73\xa6\x3b\xc9\x53\x52\x94\xc6\x54\x4d\x2d\xa6\x45\xb2\xf7\x42\xfd\x4d\x45\xb7\xb7\x50\x1f\x0c\x71\x0f\x9b\xb4\x4f\x1f\x11\xe2\x3e\x08\xd1\x1d\xcb\x47\x84\xb8\x0f\x83\x74\xa1\xef\x8f\x0a\x71\x1f\x84\x0a\xa1\xef\x8f\x0b\x71\x1f\x3d\xf1\x87\x24\x34\xbc\x57\x3e\xce\x7d\x10\xe4\x78\xfc\x7b\x20\xce\x7d\xd8\x42\x1e\x8c\x7f\x0f\xc4\xb9\x0f\xa3\x33\x3a\xfe\xbd\x13\xe7\x1e\x20\xf9\x39\xfe\xfd\xe0\x99\xe3\xdf\x1b\xcf\x1c\xff\x1e\xb9\xd8\x39\xfe\x7d\x8e\x7f\x1f\x7b\xe6\xf8\xf7\x39\xfe\x7d\x8e\x7f\x9f\xe3\xdf\xe7\xf8\xf7\x39\xfe\xbd\xe7\x99\xe3\xdf\xe7\xf8\xf7\x39\xfe\xbd\xf1\xcc\xf1\xef\x23\x4b\x99\xe3\xdf\xe7\xf8\xf7\x39\xfe\x7d\x8e\x7f\x9f\xe3\xdf\x7b\x5e\xf9\x2c\xf1\xef\x2d\x23\xf4\x60\x10\x7c\xc0\x1c\x5b\xd7\x4f\x99\x18\x04\x3f\x08\x73\xc5\xc6\x83\xe0\x07\xa7\x3d\x08\x75\xa0\xc6\x4f\x54\x24\xfc\xb0\xe9\xb5\x19\x21\x3f\x29\x12\x3e\x60\x34\xef\xa9\x4a\xff\xc4\xea\xf3\xa4\x11\x21\xff\xd8\x48\xf8\x61\x12\x90\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xcf\x91\xf0\x73\x24\x3c\x3e\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xcf\x91\xf0\x73\x24\x7c\xe7\x99\x23\xe1\x7b\xa7\x3b\x47\xc2\xcf\x91\xf0\x73\x24\x7c\xfd\xcc\x91\xf0\xed\x67\x8e\x84\x9f\x23\xe1\x03\xcf\x1c\x09\xff\x69\x22\xe1\x07\x7f\xa2\x99\x95\x92\x62\x73\x38\xf9\x1e\x9b\x13\x49\x99\xa1\x3c\xb3\x1a\xd7\x86\x2a\x88\x78\xf4\x5f\x1f\x62\x31\x74\x47\x83\x6f\x72\x2a\xe8\x86\xa9\x5e\x76\xd1\xbe\xd0\x36\xde\x7e\x23\x52\xb0\x65\x6a\x72\xad\x64\xce\xcc\x96\x95\xda\x1f\xe1\x35\x57\x0c\x41\xf7\xeb\xa9\x8e\x21\xf6\x6d\x77\x80\x6f\x45\x4c\x25\x6d\xd8\xe3\x2c\x89\x72\x29\x80\xd4\x9d\x28\x1f\xd8\xc8\xfa\x7b\xdc\x13\x2f\xf2\x2a\xa4\xba\x71\xc8\xe5\xb5\xc6\x88\xda\xf0\xf2\x82\x0b\x8c\xb9\x33\xd3\x82\x7f\x64\x4a\x07\x8c\xee\x07\xd8\x70\x6f\xfb\xf3\xd9\x44\x0e\x39\xbf\xbe\xc4\x33\x5f\xef\x53\xe0\x98\x95\x1a\x85\x97\x66\x22\x75\x6b\x5c\x92\x4b\x43\x12\x2a\x2c\x67\x7e\xb6\x7b\xf9\xcc\xb2\xda\x67\xbb\x6f\x03\x2e\xf8\x88\x93\xba\x62\x54\x31\x75\x2b\xef\x98\xf8\x8e\x67\x2c\x72\x9d\x7f\x6e\x7f\x65\x27\xaa\x18\x75\xe6\xea\x35\xcf\x98\xab\x07\x63\xa4\x5d\x48\xc8\x79\xb5\x65\x82\xd0\xd2\x6c\x99\x30\x3c\x71\x41\xee\xb2\x85\xb8\x27\x2d\xcf\xca\x84\xc8\x35\x5d\xd1\x1c\x4c\x9d\x1d\x2a\xe4\x02\x7e\x03\xd1\xf2\xe4\xc9\x00\x94\x09\x33\x82\xf7\xfb\xa6\xf5\xa4\x99\x14\xd4\x6c\xaf\x15\x5b\xf3\x87\xc8\xa9\xe0\xcb\x90\x6c\x61\x09\xfb\x2f\xb7\xb7\xd7\x00\xc4\x91\x26\x28\x9d\x45\xa9\xb7\x2c\x0d\xda\x72\x62\xa6\x26\x55\xc0\x99\x49\xc5\xfe\xfd\x3a\x28\x53\xa2\x3c\x84\x8b\x38\x21\xd6\x46\x81\x54\xa6\xff\x54\xdb\x5b\xc7\x43\x21\x35\xf8\xb3\x86\x17\xff\xb0\xb8\x2b\x57\x4c\x09\x66\x98\x5e\x70\x61\x16\x52\x2d\x70\x02\xaf\x88\x51\x83\x9a\x85\x4e\xb6\x2c\x9a\x88\x6f\xe0\x65\x77\xee\xf0\x74\xad\xb9\xaa\x18\x68\xe0\xc2\x15\x81\x10\x93\xe9\xd7\x52\xac\x79\x47\x2e\x0e\x4c\xe6\xf6\xed\x0d\xc1\x0f\xfc\x84\x2c\xfd\xb4\x38\x79\x22\x85\x40\xf9\x30\x3c\xb3\x38\xdb\x66\x42\x27\xe8\xba\x37\xa6\x6c\x8b\x17\xbb\xaf\xaf\xcf\x49\xc2\x94\x69\xce\x75\xfc\xd6\x61\xa8\xda\xb0\x10\x5e\xe3\x57\x40\xf0\x92\xb7\xe6\x9b\x77\xb4\x98\x68\xb1\x7f\xed\xbf\x6b\x2e\x2a\xa5\x86\x36\x56\x13\x73\x1f\xde\xb2\xb8\x15\x4d\x5b\x15\x99\x62\x71\xee\x64\xe9\xa0\x02\xed\x34\x89\x29\xd1\x62\xd1\x86\xa5\xb0\x94\x18\x9c\xdc\x89\x17\x19\x10\xed\x80\x5d\xeb\xcd\x92\xbc\x93\xe0\x1a\x5d\xcb\x58\x43\xd8\xd6\x98\x42\xbf\x3a\x3b\xab\xd9\xc3\x92\xcb\xb3\x54\x26\xfa\x2c\x91\x22\x61\x85\xd1\x67\x72\xc7\xd4\x8e\xb3\xfb\xb3\x7b\xa9\xee\xb8\xd8\x2c\xec\xdd\x62\xe1\x5a\x65\x9f\x81\x64\x39\xfb\x1a\xfe\x27\x72\xd0\xdb\xf7\x17\xef\x5f\x91\xf3\x34\x75\x5d\x82\x4a\xcd\xd6\x65\xe6\xdb\x30\x36\x54\x9f\x53\x72\xc7\x45\xa0\x59\x4e\xfb\x29\x79\xfa\xef\x27\x9f\x62\x8f\x64\x81\x36\xac\x47\xec\xd3\x0d\x5c\x11\xf7\x96\x1d\xc2\x52\xe1\xb0\x57\x07\x26\xda\x5d\xc1\x8d\x06\x5a\xf4\x76\x61\x77\x63\x9c\xb0\xd8\x95\x94\x19\xa3\x63\x2e\xc1\x29\x66\xcb\x38\xa3\xe5\x04\x2b\xa4\x66\x89\x62\x23\xd1\x44\xa4\x83\x60\xf8\x28\xc0\x7a\x22\x93\x42\xbe\x48\xd6\x53\xdd\xb5\x61\x8d\x15\x23\x02\x5d\x77\x49\xc8\xbb\x78\x73\xfd\x8a\x11\x4a\x76\xe0\xed\x71\xd0\xee\xd8\x7e\x66\x68\x33\x43\x8b\x78\x46\x19\x9a\x3b\x83\x52\x59\x3e\x15\xb9\xb6\x5f\x39\x37\x8b\x7c\x31\xa1\xe1\x9b\x2f\xe9\xdc\x04\xec\xc5\xc7\x05\x04\x79\xa5\xd1\x59\x23\x1b\x36\x18\xc7\x0d\x03\xb7\x10\x37\xcb\x16\x97\x8c\xe3\x81\x91\xa4\x66\x67\x36\x49\x2b\x56\x3d\x6a\x71\x92\x71\x26\x0c\xae\xd2\x5e\xed\x23\x54\xc9\xe8\x75\xcc\x8a\xf1\xac\x18\x07\x9e\x59\x8e\xcc\x8a\x71\xeb\x99\x15\xe3\x91\x67\x56\x8c\xc3\xcf\xcc\xd0\x7e\x73\x0c\x6d\x56\x8c\x1f\xfb\xa2\x55\xf9\x9e\xa0\x1a\x77\x14\xc7\x8e\x8e\x3c\xae\xf3\xa1\x06\xfd\x49\x94\x63\x2e\x34\x4b\x4a\xc5\x6e\xee\x78\xf1\x91\x29\xbe\x9e\x12\x2c\x71\xc1\x35\x5d\x65\x7e\x42\xb0\x46\xbe\xe6\x09\x35\x0c\xf9\x18\x0d\x9b\xb4\xc9\x04\x5a\xb9\x63\xfb\xa7\x6f\x02\xc6\x2f\x7d\x71\x7b\x70\xc7\xf6\x37\x11\x72\x75\x44\xa6\xf6\xad\xf3\xb3\x5c\x52\xa2\xe4\xe9\x27\x94\xa5\x8f\x94\xa3\x13\xf8\x73\x9c\xfc\x9c\x26\x3b\x7f\x79\xa9\xf8\x09\x24\x62\x9c\x34\x9c\x80\xe9\x78\x29\x38\x4d\x02\x46\x46\xb9\x4e\x95\x7e\xf1\x92\x2f\x36\x4d\x76\x6c\x9e\x91\x42\x4c\x33\xb5\x63\xea\x6a\x94\x6e\x5b\x58\xfc\x41\x83\x23\x9b\xec\x40\x2e\x60\x55\x3a\xa9\x8d\xa5\xaf\x4f\xc0\x07\x47\x57\x12\x46\xd9\x02\x4e\x65\xe0\x27\x88\x21\x18\xf8\xbd\x90\xaa\x7f\xcc\x91\x49\x0d\x07\x5d\x0d\x4d\x76\xd1\x0e\x72\xfa\x2a\x72\x38\x5a\x70\xdc\xc2\x7e\xd7\x73\x3b\x18\xe9\xfa\xf2\xa6\xf1\x2e\x86\xb3\xf9\xb0\xd2\x3d\x96\xa7\xb1\xfb\x88\x59\x3a\xa5\xd9\x12\x2b\x04\xfb\x32\xcd\x8c\x24\x34\x49\x98\xd6\xf5\xf8\x10\xfd\x9f\xb1\xb5\xc1\xb8\xd0\xd3\xa6\xad\x8f\x6b\x42\xb5\x2e\x73\xa4\x1a\x55\x0a\xab\x5d\xf0\x9e\xcc\x7a\xc7\x06\x93\xac\xd4\x86\x29\x98\x07\x24\xcc\xa6\x5c\x27\x90\x44\x76\x7e\x7d\xe9\x48\x56\xdb\x19\xca\x9c\x1a\x9e\x40\x62\xa8\x7d\xb7\x2f\x98\xc6\x45\x52\x9e\x68\x6f\x8b\xf4\x8a\x88\xfd\x00\xc3\x7b\x88\x91\x77\x10\x09\x90\x31\x42\x0d\x39\xdb\x51\x75\xa6\x4a\x71\x86\x42\x42\x1f\x30\x5e\x3b\x3c\x4f\x18\x4d\x12\x59\x0a\x73\x36\x25\x8c\x6d\x45\x35\x4f\xce\x4b\xb3\x1d\x0d\x61\xfb\xb3\x7f\x13\x37\x09\xc2\xb0\x5d\x84\x0b\x20\xbf\x0e\x09\x62\x98\x5d\x07\xa0\x7b\x29\xb5\x19\x3e\xd4\xdb\xc8\x6a\xb4\x0e\x2c\xd5\xfa\x5e\xaa\x41\x8e\xd4\x2d\xf0\x8a\x0c\xd5\x47\xa0\x22\xbe\x48\x2e\x05\x37\x52\xd5\x47\x2e\x9c\xfc\x55\xc5\x73\xc3\x06\xba\x29\x60\x84\x44\x6b\x41\x43\x0c\x26\x46\x2d\x19\x51\x48\x3e\x89\x2a\x32\x59\x09\x89\xe2\x91\x63\x8a\xc7\x97\xab\x72\x4c\x55\x36\x46\x55\x89\x28\x7c\xc5\xa8\x0f\xd3\x15\x87\xf1\xe4\xa4\x28\x95\x21\x46\x59\x18\x53\x13\x42\x0a\xc2\xa8\x40\x2d\x35\x53\x21\x8a\xfa\x05\x4e\xbc\x9f\xc2\x7c\xe2\x07\x9e\xf9\xc4\x4f\xc3\xd7\x7c\xe2\xc7\xb4\xd5\x81\x9f\x1b\x21\xd0\xe3\x6a\x4b\x4b\x9f\xb2\x27\x17\xb4\x44\x50\x2d\x2b\x45\x71\x70\x02\x03\x3b\x18\x11\x83\xdd\x9a\x44\x2b\xe4\x7a\xf5\x29\x66\x64\x95\xe4\xd1\x69\xfc\x45\x62\x3d\x80\x86\x86\x7c\xee\xd9\x00\xa6\xf2\x26\x52\x68\xae\x21\xa8\x1b\xa2\xff\xfd\x1d\xaa\x77\x13\xa5\x22\x97\xd7\x64\x2d\x31\x05\x85\xac\xf6\x98\x47\x8f\x44\x0d\xf7\x14\x22\xca\x7c\xd5\xeb\x4f\x0f\x2e\x26\x18\xb6\x1a\x13\xb0\x1a\x87\xd0\x31\xee\x3c\x1c\xa0\xfa\xd8\xd0\xd4\xb1\x2b\x68\x8c\xbc\x88\xf2\xab\x4f\xf6\xa8\xc7\x5e\x90\x63\x4d\x6b\x11\x86\xb5\xa7\x79\xc7\xa3\x0d\x33\x31\x06\xb0\x2f\x57\x32\x91\x4f\x21\x9d\x26\xe1\x2f\xd6\xac\x35\xc9\x4f\x1d\x6d\xd7\x9a\x66\xd5\x8a\xb5\x69\xc5\x58\xb4\xc6\xec\x59\x51\xd6\xac\x71\x1f\xf4\x74\xef\xf3\x97\x70\x4c\x8f\x61\xfd\x7e\x94\xed\x7b\x3e\xf6\xff\x6a\xc7\xfe\x11\x0a\x2a\x89\x55\x52\xc9\x97\x77\xe6\x47\x5f\x09\x07\x2f\x7e\x92\xb0\xc5\x69\xfc\x63\x94\x44\x42\x41\x8a\x8f\x0c\x4f\x0c\x46\xd5\xcc\x4a\xd3\xc0\x1c\x67\xa5\x69\xf8\xf9\x95\x70\xcf\x59\x69\xea\x7b\x66\xa5\x69\x56\x9a\xfa\x9f\x5f\xc9\xb1\x9f\x95\xa6\xf6\x33\x16\xd8\xf6\x29\x42\xda\x26\x07\x52\x8d\x92\x49\x7c\x00\xdb\xf1\x42\xd7\xc6\x77\x7a\x24\x5c\xed\xf1\x81\x6a\x11\x9a\xe9\xb1\x30\x3b\x1a\x96\xf6\xb8\x80\xb4\x63\xd9\xec\x66\x1f\xcf\xe7\x97\x0e\xb3\x8f\x67\x60\x05\x9f\xd1\xab\x3b\x1e\xea\x75\xec\x20\xaf\x91\x4d\x0b\xcc\x78\x38\x4a\xca\xce\xe1\xab\x48\x38\x54\xad\xb8\x51\x54\xed\xbf\xbb\x39\x07\x2f\xc5\x2d\x36\x88\xbd\x79\xd7\x61\x1f\xed\x40\xa9\xe1\xef\xdc\xe5\xb6\x54\x50\x85\x0f\xa9\xc6\xff\xa9\x3f\xc0\x66\x45\xb1\xf2\x09\x54\x7b\x6a\x3b\xc6\x13\x2a\xaa\x38\x2a\x3f\x24\xd6\x07\xb2\xef\x5b\x04\xdb\x7f\x74\x20\xba\xea\x41\xee\xa8\xf7\x89\x00\x02\xb5\xf8\x3b\xd1\x4d\x9d\x8d\x0a\xb1\xd3\x94\x89\x5e\x3e\x1a\xa2\xe3\xc1\x9d\xb0\x48\xb8\xcc\xe9\xa6\x43\x7a\x87\x51\x4f\x8c\x70\xfb\x5a\xcb\xc1\xd4\x5c\x62\xca\x8a\x4c\xee\x73\xcb\xda\x7a\xc7\xee\x21\xb6\xca\x1c\x11\xde\xf4\xea\xf2\x77\x50\xcf\xbb\xf9\xf7\x66\x2f\xee\xc1\xc8\x41\xaa\x0f\xf7\x05\x11\x72\xea\x2a\xd4\xe9\x2d\xcd\x32\x68\xb8\x20\x4b\x01\xe5\xf5\x7c\x97\x87\x80\x9e\x74\x2d\x53\x57\x1c\xbc\x31\x1f\x68\x66\xd0\x04\x72\xc6\x4c\x72\x56\x54\x50\xce\x70\xe9\x39\x2d\xf4\xd9\x9f\xaa\xff\x5e\xd8\xa9\xff\xaf\x43\xf4\x0d\x54\x34\x0b\x1c\xe1\xa1\x18\xc7\x8a\x0a\xc3\xf8\x3e\x79\x5d\xbd\xe7\x23\x11\xb9\xb0\x78\x02\x57\x62\x55\x94\xb5\x01\x0e\x5b\x6d\xa7\x18\xab\xd8\x99\x69\x55\x49\x74\xc3\x84\xfd\x2f\x96\x36\x3e\x75\x05\x80\x5d\x79\xb0\xd2\xb1\x36\x17\x5b\x87\x6d\x9f\x7b\x98\x72\x3b\xee\xc4\x9e\x96\x87\x3d\xd6\xa8\x6e\x6c\x2e\x14\xe7\x87\xfe\xe5\xc9\x16\x5a\xba\xd8\x9d\x5c\xb1\x2d\xdd\xf1\x9e\x20\x7b\xa8\x68\x18\x9c\xeb\x92\x34\x10\x93\xba\xde\xf2\x29\x81\xde\x05\xb8\xfa\xee\x3c\xc3\x10\x5d\xf7\xea\xbd\xa5\x3c\xd7\x30\xba\x22\x61\x08\x83\x04\xb0\x6e\x95\x5d\xd2\xb3\xdf\xa4\x52\x30\xb2\xe3\x74\xb0\x81\x21\x90\x66\x52\x2a\x05\x17\x80\x6a\xe4\x7e\x4d\x81\x2a\xf6\x8a\xfc\x5c\xd3\xe9\xcf\xa7\xcd\x7f\x2d\x90\x52\x17\x8a\x65\x92\xa6\x4c\xd9\x5f\xa1\x79\xfe\xa2\x26\xe1\xfa\xb7\x1e\x64\xa4\xe4\x67\xb3\xa5\x42\xea\x85\xe6\x29\x4b\xa8\xfa\x79\x49\xde\xef\x98\x52\x3c\x75\x6e\x77\x8f\x5e\xae\x89\xdd\x5f\xc5\xb2\x3d\x91\xa5\xb1\xaf\xf7\x1a\x47\x75\x22\x0b\xd0\xad\xee\x7d\x2d\xf7\x9c\xf2\x0a\x0a\x84\xa8\xea\xb2\x00\x27\x3c\x84\x95\xee\x49\x2a\xed\x50\x5a\x9e\x92\xbd\x2c\x81\xc9\x17\x5d\xa9\xec\x2a\xc3\x73\xed\xe9\xa5\xc4\xd6\x27\x2b\xc5\xe8\x1d\xa1\x06\x8a\x59\x1a\x9e\x63\xb7\x77\x59\x1a\x22\xa4\xe1\x09\x5b\x1e\x6a\x4a\x03\x87\xf7\xa0\xcc\xbf\x2b\x14\x0c\xb5\x5f\x1d\x49\xd7\x3b\x05\x73\xb1\x73\xbd\xa7\x18\x63\xaa\x4a\x01\xc3\xf6\xf6\x68\x80\x9e\x14\x5d\xb1\x1f\x56\xcf\xa9\xda\xc4\xd4\x4c\x3c\x39\x57\x9b\x12\x8b\xf5\x3a\xbe\xc8\x84\x51\x7b\x08\x7e\x45\x3a\x4b\x65\x72\x67\xc9\xda\x4a\x8a\x93\xc1\x96\xb2\xaf\xdf\x5d\xd8\x0d\x86\xc3\xce\x5d\x13\x78\x57\xc8\xb3\x50\x72\xc7\x53\x96\x2e\xc9\x47\xaa\x38\xdc\xf7\x9c\xc6\x9c\x30\x4d\x7e\xf7\xfc\xe3\xf9\x87\x9f\xae\xce\xdf\xbd\x19\xaa\xe6\x6a\x8f\x04\x7b\x28\xa8\x48\x59\x4a\x4a\x5d\xb7\x85\x72\xd8\x3c\x39\xb1\x84\xb5\xe3\x4a\x0a\x10\x55\xe4\x72\x0d\xf7\x03\x1c\x6b\x00\x68\x42\x85\x9d\xdb\x8a\x41\x87\x8c\x6c\xc7\xd2\xd3\xa6\x2e\x9f\x54\x97\x3e\x2e\x8a\xd2\xf8\x20\x12\x20\xbe\xd5\x10\xcc\x52\x20\x53\x4a\x11\x71\x8d\x95\x11\xbd\x17\x86\x3e\x78\x96\xc8\x74\x42\x0b\xdf\xeb\x8a\x92\x54\x96\xc3\x13\xfd\xdd\xef\x4e\x09\x67\xaf\xc8\xef\x1a\xe0\x96\xe4\x8d\x83\xd0\x40\x24\x36\x3b\x62\x10\x9f\x5c\x23\x6c\x28\x5f\x04\x4b\x84\x66\x56\x1b\x82\x93\x56\xab\xe4\x1e\x71\x84\x55\x55\xe2\x85\x34\x4b\xf2\xda\x63\x6c\x68\xf5\xd0\x79\x28\x8d\xbd\x04\x19\xaa\xef\xf4\x19\x0a\xa1\x45\x4a\x0d\x5d\x34\x8e\xca\x19\x6a\xf8\x8b\x44\xe6\x39\x15\xe9\x82\x3a\x22\x5d\x54\x9b\x7e\xf6\xb5\xab\x2f\xbb\xa0\xd5\x5b\x5c\x2c\xe8\x42\x6f\x59\x96\xf5\x5f\x6e\x82\xf5\x8f\x47\xef\x3c\xe1\xd2\xae\x6e\x0e\x31\x27\xee\x4d\x75\xc0\x10\xda\x92\x5c\x49\xe3\x7a\x3b\x39\xa2\xe0\xa0\xc0\xda\x95\x00\x29\x0d\xdd\x20\xda\x27\x93\xbc\xb9\xba\xfd\xf0\xb7\xeb\xf7\x97\x57\xb7\xa3\x47\x71\x00\xe2\xc8\x01\x8d\x39\x8a\x03\x90\x87\x0f\xe8\xf8\x51\x1c\x00\x19\x38\xa0\xe3\x47\x71\x98\x2d\x0c\x1e\xd0\xe8\xa3\x38\x00\x7b\xe0\x80\xc6\x1f\xc5\x01\xb8\x9d\x03\xfa\x1b\x3f\x8a\x4c\xec\x22\x8e\xe1\x5b\x77\xe3\x68\x10\x66\x85\x6f\x57\xed\xb6\x72\x49\xd7\xea\xe2\x90\xf4\xeb\xa0\x7e\xfa\xaa\x5b\xb3\x7b\x23\x76\x1f\x69\xbb\xd5\x8b\xe8\x9d\x2a\x71\x2f\x0c\xda\x42\x80\x95\xbc\x1e\x5b\x40\x8c\xa9\x6f\x92\x81\xac\x69\x1f\xeb\x9b\xf7\x12\xcc\x7c\x60\xca\x0b\x5a\x7b\x5e\xff\x74\x79\xf1\xe6\xea\xf6\xf2\xbb\xcb\x37\x1f\x9e\x6c\xe2\x83\xa2\xe9\xf1\x36\xbe\x29\xdc\x30\xb8\x88\x9a\x53\x16\x8a\x59\xcd\xb3\x2e\xf1\xde\x4f\x7e\x48\x77\x41\x98\xb5\x32\x89\x6d\x9e\xf6\x95\xc1\xa3\x17\x24\x32\xdd\x20\xc4\x78\x86\xdc\x62\xbd\x41\x98\x53\xd9\xb2\x63\xc0\x41\x98\x9f\x84\x39\xe3\xf3\x78\x16\x1d\x9e\x71\x5b\x93\xba\x60\x6b\x5a\x66\xa8\x71\x3f\x7b\xd6\xb9\x5f\x34\x9f\x78\xb2\xfe\x4e\xc9\x3c\xde\x14\x0b\x3d\xe1\x2a\xcb\x62\x1f\xc5\x9c\xb8\x76\x62\x61\x0f\x6c\x83\xf1\x39\x75\x03\xdb\xf4\x39\x7d\x03\xfb\x01\x05\x20\xc4\x3a\xa6\x2b\xb3\xd2\x5f\xd9\xfe\x03\x0b\x54\x5d\xee\x5b\x2c\x78\x17\x5c\xb3\x2c\x0c\xfe\xae\xcc\x3a\x63\xfe\xe5\x29\x35\x6c\x22\x2b\xd8\x3c\xbd\x74\xd6\xa4\x1a\x26\xb1\x55\x66\xbe\x5c\xf7\x86\x7f\x3e\x49\xed\x98\xd8\xca\x31\x93\x70\x3e\xa5\x6a\xcc\xe4\x38\x99\xa8\x65\x3d\xae\x68\xcc\x94\x92\x31\xb1\x05\x63\x62\xca\xc5\x44\x17\x8b\x81\xbd\x9e\x7a\xfe\x4f\x6a\x06\x80\x7d\x78\x1d\x5d\x17\x32\x7d\xe5\x2d\x49\x9a\xe4\xcc\x50\xab\xfb\x2e\x2d\x41\x8e\xd3\x4e\xeb\x75\x30\x4d\x9f\xd6\x7f\x83\x8e\x2b\xba\xf1\x07\xe0\x92\x68\xf1\x1b\x07\xad\x0b\x96\x2c\x85\x4c\x99\x3d\x84\xa7\xf8\x4f\x27\xdb\xcf\x31\x0f\xda\xfd\x60\xa8\x29\xf5\x72\x2b\xb5\xb9\xbc\x8e\x00\x8b\xaf\x17\x32\xbd\xbc\x3e\x6d\xfd\x4b\x07\x45\x10\x99\xc8\x06\x63\x1a\x55\xd4\x4f\xa8\x65\x05\x54\x9b\xa7\xf0\x9f\xdf\xd9\x8d\xbb\xa6\x66\x1b\x45\xfd\x5c\x93\x7b\xc5\x8d\x61\x02\x34\x15\xe8\x01\x2c\xd7\xa7\xf6\x24\xd4\x82\x77\xf7\x32\xd0\xad\xa2\x7e\x26\x1d\xfc\xb5\x9f\xe6\xe4\xa5\x43\xf8\x81\x5b\x37\x52\x69\xed\x17\x8f\xd0\x06\xfd\x53\x77\x20\x3a\xbf\xbe\x24\x3b\xc4\xe7\x91\x97\x19\x7f\xf2\xd7\x91\xbb\x16\x7d\xfe\x7d\x37\xdb\xef\x9e\xc8\x07\x3c\x9c\xaa\x06\x82\x57\xa6\x5f\x41\x47\xb3\x51\x7c\x55\x5d\x75\x49\xc6\x73\xee\x3a\x5d\x5a\xbc\x30\xab\xe7\x3d\xc7\x3f\x2e\x93\xa2\x3c\x75\x2f\x2c\x73\x96\x4b\xb5\x1f\x3f\xa5\xee\x75\x56\x6c\x59\xce\x14\xcd\x16\xda\x48\x45\x37\xec\xb4\x02\x8f\x60\xab\x7f\x21\xe0\xf1\x53\xd9\x98\x60\x17\x3a\xde\x65\x9c\x47\x21\xdb\x7b\xae\xc8\xd2\xa3\x72\x86\x0a\xcb\xe3\x15\x50\xf0\x19\x70\x61\xa1\x4e\x53\xd1\x21\xa8\xb1\x3b\x99\x95\x39\x8b\xe0\xae\xa4\x21\x9f\xe1\x4b\x26\x76\x56\xe9\xd5\x47\xd7\x02\x52\xbe\xe3\x3a\xae\xd9\x6b\x8f\x12\xc0\x5d\xff\x5d\x59\x9a\xa2\x34\x76\xa6\x39\xf6\xe8\x8a\x65\x05\xbe\x0d\x48\xa3\x03\x74\x8b\xff\xbd\x0c\x37\x8b\x7b\xc4\x82\xfd\x48\xd3\xb7\xf6\x83\x67\x29\xf5\xc9\xac\xd8\xdf\x91\xf7\x25\x9e\x7b\xf9\xa9\x1c\x8b\x79\x61\xac\xd2\x71\x2e\x30\xed\x1a\x00\x50\x72\x25\xea\x26\x30\x5c\x7e\xa7\x7e\x7e\xa9\x3b\xcf\xb1\x6a\x76\x3e\xba\x62\xe7\x7c\x8f\xfa\x2d\xdd\xa3\x1e\x53\x79\x6c\x7a\xed\xb1\x2f\xfe\x12\x15\xf1\xda\x78\x60\xdc\x60\xe2\x7c\x04\xfc\x51\xe3\xfd\xb0\x25\xab\xd7\x80\xef\x35\x31\x23\x49\x21\x8b\x32\xa3\x66\xc0\x04\x1a\x76\x23\x35\x42\x42\x1c\x83\xaa\x8d\xb4\xb5\x4b\x0e\x65\x53\x3e\x62\xba\x6e\x19\xad\xc9\x79\x96\x11\x2e\x90\x41\x01\x58\x6f\x0d\x55\x0c\x95\x2c\x42\xd1\xbc\xbf\x1b\xb6\xe3\x43\xf7\xac\xd6\x34\xed\x25\x47\x1b\x8a\xdd\x1d\xc9\x8f\xd0\xbb\x0e\xd8\xaa\x33\x36\x72\x41\xf2\x32\x33\xbc\x18\xb4\x4d\x56\x6a\x41\xd5\x00\x98\x50\xad\x65\xc2\xa9\x77\x43\x12\x6c\x1f\xaa\x8d\x5f\x38\xcc\xdc\xd0\xbb\x21\x90\x85\x62\x09\x4b\x99\x48\x18\xb4\x92\x2f\x59\x8d\x43\xac\xa1\xf0\x46\xec\x2a\xbb\x6d\x89\x3e\x26\x14\x06\x16\xf2\x10\x45\xd1\x3b\xd6\x82\xfc\x29\xbc\x2d\x96\xe8\x9c\x55\xb4\xe1\x74\x01\xf9\x54\xdd\x14\x7c\xb7\xfc\xc1\xd3\x55\x47\x8b\x3d\xc1\xcd\x52\x99\x3a\x47\xd4\x84\x8e\x4c\xad\x0d\x45\x6d\x59\x7a\x04\xf3\xeb\x9c\x3d\xd3\xfb\x7c\xce\xa4\xb9\x4f\x93\x09\x17\x25\x44\x8a\x91\x6e\x8d\x87\xb1\x50\x8d\xd2\x29\x3c\x65\xc2\xd8\xcb\x0d\xc4\xf0\x15\x8a\x15\x4c\x80\xa9\x83\xd1\x64\x3b\x2a\xe4\x1c\xab\xae\xad\xf7\xb5\x13\xf1\xb8\x8e\x42\xd4\x23\xa7\x1e\xc0\x9b\x3e\x4d\x76\x3e\x7d\xbf\x9e\xd3\xe7\x36\xf8\xb3\x1d\xbd\x27\xea\x56\xbc\x2f\x26\xbc\x67\xe9\x27\x17\x8d\xc0\x22\xa0\xbe\xc9\xb4\x53\x87\x7d\x9e\x01\x94\x21\x12\x81\x40\x61\xb4\x77\x72\x5d\xb3\x89\x2a\x5c\x78\xcb\x37\x16\xf9\x19\xdb\xb1\xcc\x49\x46\x82\x55\x5b\xf3\x61\x65\xc9\x48\x6f\xe9\xb0\xda\xbe\xc4\x60\xd4\x96\xea\x04\x53\xb2\xec\xc4\x92\x76\x26\x29\xc6\xef\x2a\x99\x65\xdd\x6a\xb0\xfe\xc9\xf8\x1d\x23\x17\x55\x44\x3c\xda\xfc\x6e\x0c\x35\x96\x94\x6f\x98\x19\xb2\xa2\x8f\x90\x29\xcc\xe5\xba\xcc\xb2\x6b\x99\xf1\x64\xe0\x36\xdd\xde\x1e\x88\xed\x27\x45\x99\x65\xa4\x80\x8f\x96\xe4\xbd\x80\xf3\x7e\x9e\xdd\xd3\xbd\x3e\x25\x57\x6c\xc7\xd4\x29\xb9\x5c\x5f\x49\x73\x8d\xca\xcc\x10\x4f\x6c\x3a\xa3\xf1\x73\xc2\xd7\xe4\x95\x55\xa3\xb5\x21\x86\x6e\x40\xd1\xf4\x66\xe5\x53\x28\x8d\xd5\x00\x3b\x00\x15\x8e\xf9\x3d\xd7\xbd\xda\xda\x93\x89\xe9\x6b\x80\x64\x59\x12\xfe\xfb\x51\x88\xcf\xf8\x9a\x25\xfb\x64\x28\x3d\xb0\x2d\xc2\xa0\x2d\xac\xf6\x31\xc4\xac\x41\x83\x3e\x41\xc4\xb5\x39\x07\x65\xb5\x37\x8a\x97\xa0\x85\xac\x90\x42\x83\x75\xab\x26\xc7\x6a\x26\x78\x05\xd0\xd1\x1a\xee\xb8\x00\x29\xa4\x36\x37\xf6\x96\x30\xcc\xfb\xda\xb4\x75\xed\x3f\x20\x10\xc1\x9f\x65\x2c\x25\x3c\xcf\x59\x6a\x6f\x05\xd9\x9e\xd0\x35\xd4\x0a\x8e\xea\x28\x66\x21\x28\x86\x5b\x7e\x89\xc2\x68\x4b\x45\x9a\x31\x45\xd6\x94\x67\xee\xe6\xd1\xba\xd1\x18\xa6\x72\x2e\xec\x27\x01\xb8\x68\xcb\x86\xcb\x8f\xbd\x3c\x25\x89\xc4\x66\xf7\x46\xc2\xd5\xde\xfd\x54\x9f\x0d\xe0\xdf\xa3\x5c\x83\x34\x4a\x22\x57\x53\x5a\x65\x32\xb9\xd3\xa4\x14\x86\x67\x2e\x2b\x4b\xde\x91\x44\xe6\x45\x06\xb4\x1a\xd7\x76\x65\x22\x91\x57\xff\xb9\xa8\x28\x63\x61\xc7\xd5\x67\x5f\xd7\x3f\xc1\x1f\x86\x45\x64\x9c\x6e\xc1\x1e\x58\x32\xa1\x14\xb9\xe5\x32\x16\xf9\x52\x64\x7b\x22\x45\xa5\x62\x60\xa1\x3c\x88\xc1\x87\x53\x30\x22\x11\x57\xac\x66\x28\x4b\xf2\xe6\x81\x25\xd5\xbf\xf1\xca\x45\xb1\x4b\xbf\x91\x70\x9c\x8e\xd7\xb6\x2d\x10\xa2\x3b\xb8\xe6\xd7\xf8\x15\x10\x27\x90\x06\xfe\x33\xe3\x02\x4e\xb1\x0b\xdb\x8d\xb0\x0b\x61\x15\xee\x36\x7d\xe1\x09\x70\xfa\x15\x49\xb9\x62\x89\x91\x6a\x3f\xa1\x11\x9c\x9f\x8f\x9d\x9f\x92\xd2\x90\xe7\x27\x67\x27\x2f\x3a\x46\x8d\x13\xdd\x68\x85\x1f\x63\x1b\xbd\x6d\xc0\xb6\x02\x80\xe7\x45\xb6\x87\xd5\x9e\xa4\xa7\x84\x1b\x1f\xe1\x13\xa8\x2f\xde\x7d\x5c\x4c\xf3\x29\xd1\x92\x18\x45\xab\xac\x23\xf8\xab\x05\x03\x55\x75\x80\xd3\x3e\x3f\xf9\xe7\x49\x8c\xe5\x91\x99\xe4\x05\xb9\x97\xe2\xc4\x00\x1a\x97\xe4\x16\x73\xd9\xaa\xa1\xf6\xb2\x24\x82\x61\x0a\x12\x7b\x28\x32\x9e\x70\x13\xe1\xe1\x23\xc0\xfc\x88\x2c\x0d\xe6\x45\x50\xe3\xe3\xb1\xdf\x3c\x70\xe3\xdc\xe7\x96\xfe\xbf\x01\xca\x40\x36\x17\x83\x02\x4d\x32\xbe\x63\x67\x5b\x46\x33\xb3\xc5\x4a\xea\x42\x8a\xc5\x3f\x98\x92\x10\xb5\x2d\xdc\x2f\xe3\x9b\x14\xb4\x6f\x34\x9f\x49\x36\xd7\xb0\x0a\x79\xf8\xde\xa8\xb9\xd1\xb2\xbe\xef\x27\xf5\x54\xf9\xcb\xed\xed\xf5\xf7\xcc\x1c\xb0\x04\x0b\xc7\x3b\x30\xe1\xea\xc8\xd4\x5a\xaa\x11\x52\x8e\xe7\x0d\x43\x45\x46\x43\xf3\x94\xda\x60\x56\x17\x0a\x73\x61\x6f\x7c\x46\xb6\xbc\x6c\x91\x87\xb8\x90\x29\xb9\xbc\x5e\x92\xbf\xc9\xd2\xce\x79\x45\x57\xd9\xbe\x4a\x0d\xd2\xcc\x90\x67\x76\xb0\x67\xf6\x54\x5b\x3c\xfc\x85\xd1\x74\x58\x4f\x6d\x3e\xf6\x48\x31\x3a\x18\xee\xdf\x98\x45\x3c\x89\x34\x66\x30\x95\x95\x96\xda\xc8\x9c\x6c\xf1\xe3\x83\x18\x6b\xb7\xb7\x31\xbc\xc9\x52\x88\xcf\x62\x54\xac\x80\xa3\xe7\xa1\x1e\xf1\xd8\x74\xa8\x12\x57\x5d\xa5\x09\x6a\xab\x06\x35\x97\x14\xe5\x50\x30\xb2\x8e\x96\x14\xb8\x14\xbb\xe5\x51\xbe\x9b\x69\x1d\xf5\xa6\x74\x98\xeb\xb1\x66\xe0\x9a\xdc\xe5\x2c\x60\xf0\x3f\x7c\x26\x76\x58\x8b\x88\xca\x8e\x9f\x26\x80\xfa\x34\xf3\x8c\x6f\x90\x36\xe2\x20\x69\xbf\x18\x3b\xe3\x09\xdd\x21\xe3\x79\x38\x21\x45\x54\xac\x52\x6f\xa1\x14\x97\x4b\xef\x72\xe7\x81\x90\x87\x0b\x12\xf7\xcd\x2f\x0a\xf5\x85\x1c\x6b\x1b\x4c\xe0\x46\xb0\x7f\x3f\xea\x53\xb7\xe8\xc6\x91\xb9\x30\x6c\x13\x71\x5e\x17\x13\x03\x3e\xba\x09\x10\xca\xd5\x89\xae\x63\x0e\xb1\x72\x32\x22\x2f\x62\xdf\x65\xc7\x3b\x75\x85\x00\xbd\x11\xca\xb3\x4f\xc8\x86\x7e\x19\x43\x49\x92\xfc\xf1\xbf\xff\xf7\xdf\xff\xf7\x25\x4e\xb1\xf2\x65\x09\x72\x79\x7e\x75\xfe\xd3\xcd\xc7\xd7\x10\x3c\x3f\xbe\x8b\x0f\x8b\xfa\x3e\xb3\xe0\xc2\x2c\xa4\x5a\x20\xa6\x5e\x11\xa3\x46\xa9\x1a\xa2\xfb\xa6\x36\xf0\xba\x81\x8f\x9a\x05\x0b\x9c\xe4\x75\xf7\x3f\x5f\x38\x23\x46\x8c\x34\x2d\x1f\x96\x7c\x8f\x48\xb7\xb1\x7d\xa5\x06\x3b\x1e\xb5\x47\x1c\x77\xea\x26\xc5\x8d\x4c\xee\x26\xe9\x59\x27\xb7\xaf\xaf\xf1\xa3\x86\xaa\x05\x35\x32\xe0\xf2\xc5\xc5\x4e\x66\xbb\x71\xb2\xa7\xe4\xf6\xf5\x35\x2c\x64\x09\xff\x05\xf7\x52\xb8\x1a\xec\x2d\x64\x1f\x48\xe6\x4c\xc0\xf6\x1a\x31\x76\x09\x47\xa8\x8a\xd1\x8c\x6b\xc3\x13\x80\x5a\x9b\x48\x2c\xfc\xb0\x65\xf8\x93\x6a\x7d\x27\xef\xbd\x31\x79\x5c\x01\x8c\x3b\x8c\x0d\x05\xf0\xa8\x4d\xdb\xfe\x75\x39\xa7\xe3\x98\x18\xe7\x37\x73\xce\x83\xe7\x97\xe5\x2d\x11\x2f\x15\x8a\xdd\x18\x19\xa8\x3f\x7b\x60\x61\xc4\xd7\x07\xec\x8b\x2b\xb6\x96\x8a\xc5\x1b\x18\x6b\x83\x21\x49\x4b\x38\x89\x54\x40\xec\xb3\xbf\x2b\xca\xa6\xe9\x2f\x18\x63\x61\x1f\x5d\x26\x5b\x7f\x47\x17\x4c\xeb\x33\x30\x25\x96\x05\xea\xe8\x60\xb6\x2c\x15\x3b\xb5\x6b\x66\x39\xac\xe8\x34\x26\x4e\xd0\x2e\x86\x09\x7c\x9d\x99\x04\x43\x4c\xbc\x2d\xd4\x59\x52\x3c\x32\x0e\x4c\x90\x21\xa8\x8a\xea\x2d\x83\xbc\x32\xf6\xc0\x8d\x2b\x59\xa3\x18\xd5\x12\xdb\x6f\x78\xe4\x00\x3f\xd7\xd0\xd8\x0b\x0c\x21\x21\x49\x52\x4f\x0c\xc1\x5d\xcb\xf4\xe4\x44\xb7\x40\x6d\x14\x4d\x98\xbd\x81\x73\x99\x12\x48\x48\x48\xe5\x7d\xc8\xb5\xb5\x62\x1b\x2e\xb4\xdf\x5b\x2c\xbe\x83\x44\x60\xb9\x39\x03\x0b\x93\xcf\x7f\x5f\x92\x0f\x55\xb2\xdd\xb8\xa5\x56\x96\x26\x91\x35\x93\x70\x33\x3f\x34\x2c\x43\xd8\x0a\x6c\x7d\x49\xb3\xa0\xf1\xa7\x22\x27\x1f\xf3\x63\xc6\x51\xe0\x2c\xcc\x01\xa8\x0d\x02\x9c\x6a\x61\x0e\xa1\x40\x35\xbe\x1a\xdc\x1f\x6e\xef\xc8\x34\xd9\xb6\xfd\x2e\xb3\xb1\x7a\x36\x56\x87\x9e\xd9\x58\x3d\x1b\xab\x67\x63\x75\xef\x33\x1b\xab\x67\x63\xf5\x6c\xac\x1e\xff\x76\x36\x56\xcf\xc6\xea\xd9\x58\xdd\xf3\x7c\x89\x26\x97\xd9\x58\x1d\xfe\x7c\x36\x56\xcf\xc6\xea\x00\xd4\xd9\x58\xdd\xfb\xfe\x6f\x81\x73\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x3a\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\x72\xdd\x8a\xea\x45\x60\x8d\x12\xd3\x03\x13\xaf\xf3\x01\x7d\x4c\xab\x33\x02\xd7\x46\xe7\xde\x98\x60\xb0\xe7\x0d\xc0\x8c\x8f\xae\xf6\x21\xf0\xfa\xac\x90\xf8\xff\x6a\x4b\x5e\xc3\x84\x87\x7a\x7f\xff\xa1\x1f\x67\x62\x61\xdb\xdd\xa3\xec\x76\x6d\xcb\x5c\x80\x78\x9e\x60\xb3\x8b\xe3\xce\x51\xb6\xba\x47\xd8\xe9\xe2\x6c\x55\xb1\x36\xba\x43\x0b\xdc\x08\xd8\x68\xfb\x5c\xd3\xfa\x36\x02\x33\xce\x36\x37\x64\x79\x1b\x53\xd1\x06\xec\x72\xa3\x56\xb7\x11\xb8\xfd\x36\xb9\xa0\xc5\x6d\x6c\xa6\xbd\xf6\xb8\xa0\xb5\x6d\x1c\xb1\x91\xb6\xb8\x28\x83\x42\xb4\x38\x8c\xb9\xbb\x45\x70\x6e\xe7\x56\xbb\xdd\x2a\xa6\xb7\x32\x0b\x9c\xa4\xd6\x29\x7a\xc7\x05\xcf\xcb\x1c\x5a\xbb\xdb\x03\xc3\x77\x95\x87\x4e\x57\x14\x8f\x3c\x34\x68\xdd\x5a\x31\xec\x0e\x9f\x32\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\xb6\x74\x07\x1c\xa7\x4c\x12\xc6\xa0\x86\xf9\x45\x94\xc1\xec\xf7\xcb\x6a\x76\x55\x41\xc4\x97\xc3\x3b\x83\xd5\x5d\x40\x63\xf9\xfd\xb7\x23\x98\x0c\x6b\x35\xa3\x26\xcc\x4f\x61\xbe\x8c\x63\x93\xe3\x0a\xec\x64\x93\x65\x44\x31\x9c\x4f\x62\xae\x8c\x32\x55\x46\x9e\xa2\x68\x13\xe5\x74\xf3\x24\xec\xef\xd8\xe5\xe5\x31\xa6\xc9\x28\x2e\x32\xd9\x24\x19\x63\x83\x7e\x94\x39\x72\x8a\x29\xf2\x51\x75\x5e\x1e\x6b\x82\x9c\x74\xef\x88\x36\x3d\x1e\xc7\xec\xf8\x49\x6a\x2a\x45\xe0\x25\xce\xcc\x18\x6d\x62\x8c\x33\x2f\x8e\x9b\x16\x8f\x69\x56\x8c\x44\xed\xf8\xa5\x38\xe2\x42\x3c\xe5\x32\x3c\xe1\x22\x3c\xd9\x7c\xe8\x90\x34\xb2\xad\xb1\x17\xe0\x83\xeb\xed\x08\xd4\xc7\x5d\x7e\x9f\x70\xf1\x8d\x31\x17\x7e\x12\x53\xe1\x34\x33\x61\xd4\x6e\x8f\x1f\xee\x91\xeb\x7b\xc4\x51\xe5\x82\x1b\x4e\xb3\x0b\x96\xd1\xfd\x0d\x4b\xa4\x48\x03\x9c\xfa\xa0\xd4\x41\x45\x73\x1a\x3f\x74\x9a\x5b\x3b\xca\x66\x4b\x5d\xb5\x9c\xa0\xdf\xdb\x05\x28\xf9\x9b\xbb\x13\x2e\x50\x1b\x11\x67\xf8\x98\xec\xe5\x23\xdc\xaf\xc9\x51\x55\x44\x0c\x0c\x9a\x86\xe6\xbf\xc8\x7b\x22\xd7\x86\x09\xf2\x9c\x0b\x8f\xe9\x17\x0d\xe5\xb0\xd6\xb5\x43\x24\xe7\xc8\xd3\x7e\xf7\xf2\x1b\x0f\xe6\x73\xa9\xca\xa0\xd4\x43\xbb\xc1\x27\xdf\x3a\x1c\xa8\xa7\x5c\x3b\x1c\x88\x75\x99\xb5\xaf\x1e\x78\x1d\x89\xbd\x77\xbc\xac\x4b\xa2\xbc\x84\xb9\x54\xb4\x6c\x6f\x93\x2e\x98\xb1\x8b\xf0\x20\xc4\x5f\x60\x2b\x22\x5c\x02\x8f\x72\x07\xa0\xc1\x7f\x44\xc4\x4e\x72\x05\x34\x8d\xfd\x01\xb8\x53\xdc\x00\x9f\xe4\xf6\x74\x44\xd3\xff\x14\xb3\xff\xaf\x4e\xb3\x89\x30\xef\xff\x86\x34\x9b\x5f\x42\x17\x30\x3c\x67\xb2\x34\x47\x52\x03\xb0\x0b\x68\x83\x23\xf3\x70\xbd\x22\x59\x1e\x34\xe8\x78\xe9\x00\xf6\x4a\xa9\xe3\x45\xd4\x7e\x61\x5a\xc2\xc8\x3e\x0d\x5f\x92\x07\x9b\x00\xd5\xba\x58\x5d\xa3\x9c\x6a\x42\xc9\xc5\xd5\xcd\x4f\x6f\xcf\xff\xfc\xe6\xed\x92\xbc\xa1\xc9\x50\xa9\xf0\x46\x95\x10\x81\x0d\x11\x91\xf6\xb7\x74\xc7\x08\x25\xa5\xe0\x7f\x2f\x5d\x93\xcd\xe7\x15\xc4\x17\xde\x6b\x32\x00\x74\xac\xbe\xca\x08\xcf\x80\xc6\x01\x13\x2a\x55\x62\xa3\x01\x34\x23\x4b\xab\xe6\x2b\x99\x1f\xba\xfd\xde\xd8\x9f\x86\x59\x14\x45\xde\x03\xfd\x49\x37\x7c\xe7\x0c\x76\xae\x04\x4d\xa3\x8f\xab\x25\x49\x4b\x09\x56\x1a\xd2\x15\x98\xa9\x07\x39\x94\x60\xc6\x52\x5f\x75\xe3\x90\x42\x37\xf3\x2f\xec\x8d\x44\x9f\x92\x55\x09\xa6\xfa\x42\xf1\x9c\x2a\x9e\xed\x9b\x43\xd0\x6c\x88\xdf\x5c\x49\x2f\xa1\xf7\x28\x8e\xeb\xe9\x5f\xbc\x7f\x73\x43\xae\xde\xdf\x42\x4f\x24\x2b\x59\xc1\x8a\x0e\xbf\x03\x62\x56\x6c\x18\x0d\xae\xb6\xf5\x92\x9c\x8b\x3d\x7e\x82\xe7\x9c\x6b\xe8\x24\xcc\xa0\xf3\xbd\xbb\x95\xfb\x52\x50\xcf\xbe\x59\xc2\xff\x0d\x95\xbd\xa6\x69\xaa\x2c\x37\xaf\x9c\x10\x07\xf9\x03\x96\xcb\x02\xbf\xe7\xab\xac\xb1\x77\x0e\x7b\xbf\x58\x67\xb0\xca\x99\x78\x6d\x97\xdd\x6c\x10\x56\x6d\x24\x20\x04\xeb\x95\x42\x13\xd2\x41\x3e\x30\xda\xd7\x2c\xb2\x5e\x65\x3d\xa1\xe8\x7a\x79\x35\xbf\xf6\xc2\xd4\x1d\x0a\xd9\x28\x69\x4d\x2e\xaf\xfd\xb6\x84\x05\x1a\x94\x11\xab\x64\xa1\x2b\x06\x0d\x80\xd1\x24\x71\x4a\xbe\x21\x7f\x22\x0f\xe4\x4f\x20\x5a\xff\x18\x02\x16\xc7\x41\xe3\xd4\x5a\xd4\xda\x2e\xaf\xa3\xb1\xf2\xa3\x3d\x02\xf6\x1b\xbb\x72\x23\xc9\x8a\x8b\x14\x3b\x34\x3d\x18\xa6\xec\xc1\x76\xd8\x7a\x72\x85\x43\x3b\xc8\x51\x37\x0c\xac\x13\xe4\x72\xdd\xa8\x15\x16\xd6\x14\x27\x6e\x99\x05\x6d\x35\xd9\x2b\x24\xf2\xb0\x79\xba\x55\xb1\xac\x1e\x29\xa7\x26\xd9\xb6\x4f\x90\x15\xe1\xba\xd1\x44\x39\xac\x0c\xa7\x12\x6e\x08\xe8\x0e\xdc\xf2\x20\x55\x1e\x97\x90\x26\x35\xdf\x6b\xed\xc2\x01\xa6\x0f\x14\xc5\x11\x25\x3c\xf5\x92\xb5\x91\x0e\x55\xc8\x14\x45\x35\x4c\x2a\x6d\xb0\x1b\x2f\x95\x83\x40\xbb\x12\xdb\x85\xa8\x54\x57\x67\xa0\x2f\x7b\x12\x5c\x37\x4e\xa8\x60\xa9\x46\x32\x16\xec\x69\xa9\x7a\xe0\x05\x37\x26\xea\x7c\x14\x4a\x1a\x99\xc8\x60\xcd\xc8\xb6\x49\xd8\x7d\x00\xcb\xc0\x6b\xa5\xbf\x89\xff\x70\x71\x7d\x6a\x6f\x84\x50\x3c\xef\xe6\xf5\x98\x55\xae\xd5\x1e\xee\xf6\xf5\x75\xb0\x4d\x4d\xc4\x62\xc6\xcb\x79\xb7\x58\xf8\x90\x5a\xfe\xb4\xda\x93\x8a\xd1\x94\x1f\x2d\xb6\xc6\xb7\x3a\xac\xa0\x4e\x09\xb2\xc9\xe5\x8e\xa5\x28\xc0\xeb\x96\x89\x29\x34\xe4\xd5\x81\xc8\x9b\x71\x1d\xf2\x33\x58\x06\xe7\xc8\x9b\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x02\xef\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x8b\x96\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x1a\x2f\xcd\x91\x37\x6e\x52\xff\x32\xfe\xa9\x39\xf2\xa6\xfd\xcc\x91\x37\x9d\x51\xe6\xc8\x9b\x2f\xc3\xa7\x36\x47\xde\xf8\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\xe6\xe0\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\x26\xbc\x4f\x55\x37\xef\x18\x17\xca\x6b\x99\x17\xa5\x61\xe4\x43\xd5\xae\xbe\xea\x99\xbe\xda\xa3\x5f\xb0\x71\x38\x3e\x95\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb0\x16\xe2\x22\xc1\xa9\x2d\xaa\xf5\x2c\xaa\x99\x9c\x3d\xd6\xd5\x81\xbd\xf3\x87\xe9\xa1\x8e\x8f\xb9\x8e\x62\xfc\x51\x8c\xab\x8d\xf1\xb7\x30\x85\x86\xa1\x05\x9b\x45\x3d\x00\xf9\xd2\x5c\x96\x58\x02\xd2\xad\x3e\x30\x76\x85\x17\x34\x13\x7d\x3e\xb4\x93\xf8\x9e\xc1\x4c\x7f\x66\xec\x7f\x70\x93\x38\xc4\xbf\x63\x1f\x8f\xc3\xbf\x3f\x32\x10\x81\x50\x8d\xc0\x35\x91\x39\x37\x56\x4f\xb1\xca\x5e\x23\x5a\x28\xe4\xd5\xe0\xa6\x65\x43\x75\xd4\x02\x3e\x47\x6a\xb0\x0a\x6a\xe5\xe6\x68\xf6\x5c\xf3\xdd\xd4\x42\xe8\x82\xca\xb7\x95\xb6\x04\xbb\xbe\xf0\xcd\x77\x81\x71\x7e\xd1\x14\x34\xf2\x82\xd5\xf7\x15\x37\xfb\xd7\x52\x18\xf6\x30\xa0\xc1\xb4\x89\xe1\xc6\x7d\xe2\xba\x0a\xea\x4a\x95\x72\x4e\x4c\x55\x0a\x88\x6a\x88\x10\x25\x31\xc8\xc2\x6e\x63\x67\x7e\xa2\x80\x15\xf6\x60\xce\x06\x40\xc6\x6d\x85\xa1\xfa\xae\xde\x07\xb6\xb0\xc2\xa9\x46\x77\x67\xac\xc7\x32\x4e\x60\x31\xd7\x8a\xef\x78\xc6\x36\xec\x8d\x4e\x68\x06\x7b\x1e\xab\x02\x9c\x0f\x7c\xef\xbb\x2a\xea\xaa\x8b\xe6\x50\xc7\x6c\x37\x4f\x50\xea\x12\x2a\xc8\x86\x72\x41\x72\x8b\xa3\xc2\x83\x85\xee\x7b\x02\x3a\xbc\x15\x54\xd9\x0b\x81\xfb\x20\xa4\x71\x41\x60\xd8\x4a\xca\xcc\x79\x64\xb3\x7d\x3d\x27\xe7\xea\x17\xf2\x27\xc1\xee\x7f\xb2\xe3\x68\xb2\xce\xe8\x26\xd4\x8b\x9a\xb8\x8a\xb0\xcc\x74\x4a\xb6\x54\xd3\x21\x43\xe8\x08\x31\x06\x0d\xea\x1f\xa1\xd8\x81\xb1\xb7\xdd\xf7\x2b\xf2\xf2\x05\x50\x2d\xd5\xa4\x82\x1e\x32\xaa\x7c\xfb\x02\xac\x2f\xaf\xcf\xaf\x7f\xba\xf9\xdb\xcd\x4f\xe7\x17\xef\x2e\xaf\xc6\x8e\x68\xb8\x4f\x69\x42\x0b\xba\xe2\x19\x0f\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4b\x95\x2c\x70\x9d\xaa\x14\x10\xaf\x59\xc7\x60\x45\x18\x32\xbc\x0f\xaa\x0a\xef\xc4\xd6\xdc\xed\xa1\x36\x8a\x0a\xe3\x95\x9d\xb1\xfa\xdc\x88\x66\x55\x0a\xab\xa8\x3e\xd5\xe3\x46\xd3\x29\x41\x09\xe7\x69\xca\xd2\xd6\xd4\x8f\xec\x03\x7a\xed\x41\xef\xeb\x88\x51\x72\xfd\xfe\xe6\xf2\xff\xc6\x8f\x4a\x1c\x8d\x44\xb9\x07\x8e\xe4\xc1\x26\xc4\x92\xc9\x04\x4c\x7e\x70\xd1\x3d\x33\x2e\x07\xde\x19\xa9\xe4\xef\xb9\x4a\xe4\xe1\xfe\x50\x8a\x76\x64\x7e\x0d\x81\xe4\x32\x65\x4b\x72\x8d\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\x6b\x3f\x16\x86\xd3\x2c\xdb\x13\xab\x89\xed\x68\xc6\xd0\x85\xac\xe4\xe0\x6d\x85\xd4\x25\xb5\x30\x2e\xb5\xc9\x35\xd6\x34\xd3\x81\x03\x1e\xc3\x07\x2d\xab\x7f\x67\x95\xc9\x48\x3c\x55\xef\x93\x94\x09\x69\x9c\x5e\x6a\x47\x82\x80\x5a\x25\x13\x82\xba\x29\xba\x21\x02\xab\xaa\xc3\x89\x2a\x66\x09\x2c\xd6\xb3\x41\xae\xfd\x5a\xaf\xab\x31\xe1\x26\x1e\x80\x59\x6a\xa6\x0f\xa4\x8d\x63\x83\xb5\xb6\x6a\xc7\x55\x8c\xa6\x10\x1b\x56\x50\xb3\x05\xbb\x66\x00\x68\x4e\xf5\x1d\x4b\xf1\xd5\x25\xca\x61\xa7\x49\x6b\xd7\x01\xc0\x4d\xef\xd6\x62\x61\xcd\xa8\x29\x15\x03\xf9\x1b\x56\x72\x57\x8c\x30\x41\x57\x59\x28\xf2\x2c\x2a\x28\x92\xa6\xef\x45\xb6\xff\x20\xa5\xf9\xae\x0a\xa9\x8a\xdc\xce\x1f\xab\x9e\xe0\xcd\x1b\x34\x08\x5b\x30\x52\xa6\x0b\x40\x13\x04\x72\xc5\x55\x32\xbf\xa8\xb7\xef\x08\xe4\xa9\x4a\x71\xae\xbf\x57\xb2\x8c\x6d\xca\x61\x29\xe8\xfb\xcb\x0b\x38\x55\x25\x9e\x1b\x26\x8c\xda\x43\x50\x64\x27\x83\x67\x5c\x87\x5b\x92\x1f\x2c\x4d\x1d\x50\x91\xd5\xb8\x4a\xa1\x99\x59\x92\x77\x74\x4f\x68\xa6\xa5\x53\xa6\x42\x9a\x91\x20\xd7\xe0\x33\x69\xea\xff\x4b\x02\x31\xce\x18\x77\xb1\x92\x66\x4b\x0e\x5e\x18\x21\xce\x2e\x44\x0c\xdf\x43\x03\x53\x9d\xa0\xc4\xc5\x21\xe0\x10\x71\xd2\x3b\xa6\x49\xa1\x58\xc2\x52\x26\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\x93\xcc\xf7\xb0\xd3\x57\x52\x58\x32\x8e\xdc\xeb\x4b\x91\xf2\x84\x22\x0f\x72\xdd\xac\x6b\x12\x06\xab\xa6\xd3\x31\x29\xc4\xc0\x8d\x70\xd9\x52\x33\x85\xdd\x9d\x55\xc9\x10\x89\x7f\x2d\x57\x2c\x63\x06\x23\x6e\x21\xae\x9f\x1a\x6c\x25\x80\x0d\xe5\xa9\xf1\x84\x11\x3e\xe9\x4c\xe8\x12\xda\x85\xd8\xab\xb1\x21\xa9\x64\x75\xbc\x22\xd5\xe4\x87\xcb\x0b\xf2\x0d\x79\x6e\xe7\xf7\x02\x7c\x2c\x6b\xca\x43\x6a\xbb\x91\xe8\x85\x39\xd4\xab\xd7\x1e\x38\x2c\x03\xe8\x93\x48\x85\xc7\xf0\x94\x88\x90\xcf\x07\xba\xc5\xb8\x15\xda\xeb\x8e\x8f\x31\x76\x9e\x39\x30\xda\xb4\x09\x3d\x40\xce\xa1\x71\xc2\x84\x3e\x44\xce\x01\x88\xe3\x84\x3e\x81\x9c\xa3\x59\xd2\x0f\x9a\xa9\x09\x1c\xe9\x87\xa3\x72\xa4\xa6\x0a\x60\xa9\xb6\xbd\x7a\x24\xcd\x9c\x19\x9a\x52\x43\x09\x0f\x6d\x47\x29\x1a\x1d\x41\x7e\x0b\x1b\x7c\x3c\x7e\xa5\xd9\x5b\x2e\xca\x07\x74\x91\x4d\xb9\x42\xde\xbc\x81\x0f\x49\xe2\x27\x0f\x08\xa7\x45\x91\x71\x0c\x10\x6e\xe7\x51\x06\x30\x83\x87\xbc\x99\x1e\xd3\xa7\xf8\xc0\x51\xa6\x59\x26\x2d\xab\xb4\x52\x9d\x8a\x54\xe6\x01\xb0\x87\x13\xb4\x0a\x13\xa3\xc9\xb6\x69\x61\xef\x21\x96\x49\x42\xea\x5f\x5c\xec\xc5\x5d\x9d\x33\xb6\x63\xc1\xb4\x9b\xc3\xec\x5a\xfb\xbe\x55\x9c\xfc\x0e\x00\x00\x92\xd1\x15\xcb\x50\x78\x20\x95\x44\x3a\x5b\xa3\x68\x28\xfa\x6a\xa6\x64\x36\x25\x18\xe9\x83\xcc\xc0\xbf\x45\xab\xc5\x58\x00\x5f\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5e\xdf\x5a\x0b\xdc\x77\xbe\x8c\xb5\x94\x41\x49\xd4\x59\x8b\x15\x5c\xed\xb5\x80\x04\xf9\x12\xd6\x12\x71\xad\xbf\xe7\x22\x95\xf7\x7a\x3a\xd3\xfd\x11\x3f\xf4\x9c\x21\xb1\xac\xc7\x70\xb1\xd1\x4d\xc6\x4b\x83\xc6\xd2\xe6\x3d\xb5\x8f\xf3\x7a\xe3\x7c\x95\x4f\xdd\xe5\x51\x01\xe8\x5e\xe1\x2a\xb5\xf3\xcf\x3c\x42\x90\x86\x28\x3e\x8a\x37\x1e\x9d\x03\x6e\x72\x4d\x5f\x2b\x0b\xcb\x70\x9a\xdd\x14\x93\xda\x9e\x7d\xff\xee\xe6\xbc\xfd\xb1\x25\xdc\x7b\x48\xb9\xb7\xeb\xb1\xbf\x13\x9a\xe6\x5c\xeb\xb0\x49\x1a\xf0\xcb\x56\xd0\x8e\xee\xb9\xf7\x51\x6c\xb8\xd9\x96\xab\x65\x22\xf3\x86\xbb\x62\xa1\xf9\x46\x9f\x39\x2a\x5b\xd8\xd9\xbf\x18\x81\xcb\x45\xc6\x45\xc3\xe8\x00\x09\xec\x4e\xa9\x83\x09\x26\xd5\x0a\x00\xf5\x98\x69\x3a\x02\x14\xad\xbc\x3d\x08\xc0\xec\x52\xce\xb2\xd4\x19\x22\x30\x1c\xdb\x9e\xe7\xac\xd8\xd2\x05\x08\x8c\x11\xe0\x2e\x67\x0c\xee\xf5\x5b\x29\xa4\xf3\xa1\x63\xcc\xb1\xbb\x4a\xa1\x5d\x02\x26\xe1\x4e\x8e\x9d\xcb\x08\xe0\xa6\xe5\xe3\x28\xac\xad\x4b\x3d\x57\xa3\x81\xf5\x23\x14\x04\x08\x74\x19\x73\x8d\x68\x9c\x91\x95\xf5\x6e\x24\x2a\xdf\xbf\x85\x7d\xa8\x6e\x3c\x13\xd1\x0f\x37\x1f\xf7\x99\xe5\x36\x9e\x09\xf7\xde\x84\x46\x16\xd5\xa9\xbd\xd2\x7b\x1b\xb2\xaf\xb4\x6f\x44\xa3\xc7\xb7\x7b\x5f\x1a\xbb\x15\x8d\x80\xec\x53\x76\x9f\xa4\xeb\xf6\x03\x3d\x82\xbe\x4b\xfa\x74\xde\x03\x7a\x5e\x31\xe3\xc8\x19\x08\x36\xa7\x7b\xb2\x1a\x3b\x2e\x29\xd7\x60\xd6\x04\xa7\x74\x93\x78\x3f\x34\x09\xe9\xd8\x74\xfa\x64\xc7\x3c\x06\xb6\x46\x67\x75\xdf\x34\xde\x27\xbc\x6b\x8a\xba\x96\x29\x86\x8c\x57\x41\xb9\x83\xfd\x0f\x5d\xe8\x3a\xff\x87\x97\xfd\xb5\x66\x21\x24\xc6\x4c\x34\xe3\xc8\x7d\x83\x59\x6c\x9a\x3a\x00\xd3\x59\x74\x5d\xf3\xd5\xd6\x2c\xd0\xca\xb5\xe5\xba\x99\x1c\x7e\x5a\x4d\x3a\xe0\x34\x6e\xb6\x76\x38\x25\xff\x51\x6a\x43\x68\xe5\x7e\x6e\xf5\x9c\xa8\x62\x8e\x81\x9c\x92\x41\x6b\x8a\xcf\xc5\x32\xd2\x4e\x66\xc7\x53\x46\x52\xbe\x5e\x33\xef\x16\x5f\x31\x52\x50\x45\x73\x66\xc0\x8d\x82\xa8\x85\x2e\xbc\x62\x98\x18\xe4\x9a\x50\xdf\xeb\xb6\x8a\x80\x3b\x45\x1f\x2d\x37\x24\xe7\x9b\x2d\xea\x3a\x84\x92\x4c\x8a\x0d\x44\xf4\xd9\x29\x64\x92\x0e\x9d\x44\x60\x0e\x52\x91\x7b\xaa\x72\x42\x49\x42\x93\x2d\x58\x09\xa9\x20\x69\xa9\x20\xc1\xd3\x30\x9a\xee\x17\xda\xd8\x7b\xb6\xd5\x8e\xc0\x94\x86\x18\x18\xf4\x42\x77\x3a\x61\x00\xbe\x38\x46\x22\x5b\x59\x52\x1d\x13\xe7\x2b\xf0\xca\x41\x93\xfc\x06\xa0\xb7\x0e\xd8\x9c\xd2\x7f\xf0\xcc\x29\xfd\x73\x4a\xff\x9c\xd2\xef\xdf\x9c\x53\xfa\x3b\xcf\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x73\x4a\x3f\x3c\x73\x4a\xff\xf4\xb9\xcd\x29\xfd\x73\x4a\xff\x9c\xd2\xdf\x78\xe6\x94\xfe\xce\x28\x73\x4a\xff\x97\x91\xac\x37\xa7\xf4\xfb\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\x39\xa5\xff\xe0\x99\x53\xfa\xe7\x94\xfe\x39\xa5\x7f\xcc\x85\x96\xf2\x81\x54\xcb\x98\xac\x03\x67\xc0\x6f\xc4\x2a\xae\xca\xf5\xda\xde\x50\xe5\xa0\xb0\xb6\x23\x76\x2c\xd1\x55\xee\x5b\xe5\xe8\x72\xd6\x64\xcd\xcc\x29\xa4\x35\x60\x98\xce\x34\xa0\x2e\x90\x12\xd2\x1a\x15\xd3\x90\x06\x20\xc8\x9b\xf7\xdf\x2d\x1b\x49\x0f\x83\xa6\xcc\xc1\x54\x88\xb1\x98\x63\x98\xcd\x7b\x91\xc4\x38\x25\x6b\xc4\xf6\x45\x82\x3a\xfc\x26\x99\xd4\x18\x53\x00\xa0\x87\x5c\x53\x5b\x2a\x04\xf3\x5a\x07\x37\xa0\x2b\xaf\x18\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\x6c\x97\x76\x7c\x11\x84\xea\xb3\x43\xab\xd1\x2d\xeb\x65\x34\x47\xe4\x2a\x96\x53\x8e\x03\x10\x9a\x28\xa9\x35\xc9\xcb\xcc\xf0\xa2\x1a\x62\x68\xc7\x18\xc4\x00\x61\x64\x56\x85\x30\x70\x2c\x30\x34\xc5\x43\x4c\xbf\xdb\x58\xed\x97\x20\xc5\x68\xe0\x35\xe8\x46\xa7\x90\xd0\x9e\x17\x66\x8f\x2e\x57\x74\x3c\x71\xa5\x0d\x49\x32\x0e\xe2\x1f\x66\x87\x39\xa1\x30\xca\x69\xc0\xa9\x6f\x20\x57\x14\xd6\xaa\xdd\x62\x45\x0a\x52\xa3\x30\x1a\x1d\x8d\xf5\x30\x6e\x80\x94\x6b\x27\xa3\xf5\x90\x67\x82\xfa\xde\x21\xb8\xd9\x7e\xad\xb0\xdd\x29\x0c\xe1\xc7\x74\x7f\x6a\x0c\x32\x82\x05\x48\x79\x72\x17\xa5\xfa\x50\x41\x8a\xb1\xcf\xf3\x39\x6d\xf5\x19\x29\xaa\x64\x39\xb3\xa5\xc3\x95\x16\xfc\x41\x74\xb3\x05\x22\x10\x6c\x67\x69\x96\x25\xcc\xaa\xd0\xb4\x73\xc2\x70\xb8\x47\x1d\x25\xc3\x54\xce\x05\xb8\x65\xdf\x31\xad\xe9\x86\x5d\x0f\x1a\x78\x86\xd4\x26\xb0\xf1\xd4\xa8\x06\x42\xc8\x40\x87\xaa\xff\x52\xbb\xc4\x4e\x86\x18\x42\x63\x2a\x24\xc7\xb9\x54\x31\x80\xf7\x8a\x1b\x7b\xa7\xe2\x1a\x73\xe9\xc0\xae\x79\x18\x70\x39\x0c\xba\xe9\x84\x7b\xe7\x41\xd7\x20\x2d\x7f\x17\x29\x3a\xae\x56\x8c\xac\x14\x67\x6b\xb2\xe6\x82\x66\xce\x03\x35\x44\x5f\x90\x23\x42\x51\xa1\xd6\xda\xaa\xa6\x52\x78\xc7\x8a\x5f\xc3\x92\xfc\xe8\x16\x61\x54\x29\x12\x3a\x9a\xb3\x2c\x64\xca\x08\x5f\x93\x0d\x78\xbb\x14\x3a\xd4\xff\xf0\xcd\xff\xf8\x23\x59\xed\xad\x44\x04\x43\xa5\x91\x86\x66\x15\x9a\x32\x26\x36\x76\x0f\x80\x41\x0c\x9d\x85\x2c\x6b\xa6\x5f\x7a\xcc\x42\x5d\x15\x5c\xfa\xcb\x6f\xef\x56\x6d\x91\x7e\x96\xb2\xdd\x59\x63\x5f\x16\x99\x1c\x8c\x4b\xe9\x36\xc3\xe9\x17\xbe\x23\xea\x65\x0f\x41\x42\xf1\x85\x08\x92\xf4\xc9\x4f\x64\x2b\xef\x31\x07\xb3\x87\xa2\x6a\x97\x78\x21\x8b\x32\x1b\xee\xda\x43\xc8\x77\x96\x8a\x01\x4f\xa5\x93\x0e\xad\x70\xc6\xde\x93\x03\x17\x7d\x07\x78\x98\xd7\x35\x25\x3c\xba\x38\xfd\xf4\xa4\x8b\x87\x72\x97\xdc\x2a\xf7\xa9\x54\x6c\x49\xbe\xa3\x59\xb6\xa2\xc9\xdd\xad\x7c\x2b\x37\xfa\xbd\x78\xa3\xd4\xa0\x1a\xd0\x9a\x77\x46\x2d\x5f\xde\x96\xe2\xae\xdd\x6a\x21\x93\x1b\xab\xc7\x15\xa5\xf1\x11\x2b\x8d\x55\x0d\x00\xf6\x33\x85\x33\x5e\x09\x01\xea\x7a\xd9\xd4\xb0\xd9\x03\xd0\x15\x04\x3c\x51\x41\x98\x9d\xeb\x10\xa6\x2d\x45\x37\xe7\xa2\x9b\x64\xf9\xed\x37\x7f\xf8\x37\x24\x7d\x7b\xbb\xf8\xb7\x6f\xc0\xf9\xaf\x4f\x91\xb9\x58\xce\x38\xcc\xa1\x75\x4e\xb3\xcc\x5e\x24\x9a\x44\x6d\xb7\x75\x19\xdb\xbb\x69\x8c\x5a\x4d\x0c\x61\x46\x2b\x77\xb7\xb7\x7f\x0b\x68\x76\xdc\x68\x96\xad\x4f\x31\xf6\xae\xca\xb7\x3d\x01\x41\x71\xe2\x78\x97\x95\xea\x5d\xd1\xf0\x38\x35\x6b\x27\xb3\x32\x67\x17\x0c\x9a\xae\x44\x2c\xb3\xf5\xbe\x8f\xd8\xc8\x5c\x7f\xb4\x55\x26\x93\x3b\x92\xba\x1f\x61\xb2\x03\xcb\x04\xaf\x95\x0b\xe9\x69\xdc\x05\xab\x28\x20\x08\xc0\xf3\x91\x3c\x4f\xed\xb8\xd5\x9c\x73\xcb\xdf\x96\xd3\xa2\x80\x46\x63\x6b\x48\x10\xba\xc7\x05\x04\xee\x58\x00\xc1\x75\xd2\xa1\xc7\xe9\xbe\x85\x40\x87\x05\x72\xcf\x7a\xea\x4f\xfc\x06\x14\xf0\xdf\x18\x2f\x32\x21\xb5\x8e\xd4\x61\x7b\xd5\xda\x50\x62\x58\xcc\xc0\xc9\x7c\x72\x1f\x9e\x49\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xa6\xa4\x60\x4a\x43\x73\x38\xf3\x11\x76\xf4\x75\x46\x79\x28\xa3\x8b\x90\xba\xe1\xd1\xd3\x96\x31\xde\x81\xa7\xde\x93\xc1\x57\x02\xde\xbe\x27\xf6\xe6\x41\x02\x87\x64\xfc\x98\x33\x7c\x2d\x53\xf7\x09\x1c\x52\x2c\x5c\xd0\xa3\x6a\xe9\x88\xdc\xf7\xa3\xb7\xc7\xfb\x58\xaf\xa5\x7d\x56\xed\x5f\xaa\xc3\x8a\x6f\xb9\xa3\x38\xb8\xb7\x47\x3a\xa2\x30\xf4\xa4\x13\x0a\x67\xb3\xd1\x71\xab\x96\x07\x2d\x15\x1a\x37\x21\x48\xc1\xb5\x2a\xe3\x74\xe2\x25\x41\x9b\xb6\xc5\xba\x03\x4b\x4e\x5e\x9d\x3c\xf9\x9c\xe2\x22\x95\x2c\xe8\x66\xa4\x74\xd4\xc1\x5a\x0f\x3f\x24\x29\x43\x05\x83\x69\x50\xd2\xe0\x77\x70\x1b\x05\x17\x5a\x38\x08\xbe\xb3\x93\xf7\xf1\x39\x33\xad\x47\x9f\x53\x41\x30\x38\xf8\x3e\xe8\xc5\x26\x84\x2a\x59\x8a\xd4\xdd\xcf\x2b\x43\xc8\xbb\x83\x09\x5f\x49\x01\x4a\x0e\xe6\x20\x05\xc2\x56\xf1\x69\xc5\x88\x5b\x0e\xf3\x72\xf9\xf2\x9b\x5f\x96\x4d\xde\x1e\x34\xc4\xb3\x18\xb9\xaa\xd8\x24\x9e\x8d\x27\xcf\xc8\x17\xd8\x88\x9e\xd5\x3b\x77\x69\xab\xeb\x67\x70\x5f\x55\x00\xfe\x64\x2f\x63\x2c\xaa\x14\x1e\x21\xcf\x41\xa5\xb1\xba\x60\x23\x2b\xe1\xc5\xa4\x32\x30\x71\x69\xed\xf6\x7e\xb7\x7a\xd2\xd9\xc6\x43\x8c\x44\xdb\x77\x17\x0e\x53\x93\xfb\xba\xe7\x98\xb7\xba\xc8\x3d\x23\xcf\xf1\xcd\x13\x0d\xb1\xa8\x2f\x9e\xbc\xbd\x6e\xd9\x6f\x1e\x8a\x60\x1e\x65\x6b\xe9\x6f\x1e\x0a\x0a\x77\xe8\x62\x0c\x07\x23\x4a\x47\x5b\xca\x0c\xe3\xe0\xcf\x6c\x4b\x77\x0c\xe2\x64\x79\x46\xd5\x60\x26\x81\x83\x2b\xc9\x0d\xae\x0a\x9a\xdd\x32\xb1\xe3\x4a\x0a\xf0\x53\xed\xa8\xe2\x90\x53\x04\xad\x08\x99\xb0\xfa\xe9\xef\x9e\x7f\x3c\xff\x00\xfe\x81\x70\xb6\x1b\xe6\x1e\xb8\x95\x97\x1a\x62\x10\x0e\x56\xd0\x18\xaa\xde\xb8\xb1\xb9\xf6\x6c\xaa\x9f\xbf\xdd\x15\xe0\x75\x7e\x3d\x76\x0e\x79\x69\x4a\x3a\x9c\x4d\x81\x0f\x7b\x48\xb2\x52\xf3\xdd\x53\xcf\xff\xb8\xc6\x53\x49\xc5\xcf\xa0\xf0\xb8\x90\xee\x0b\x3e\x40\xbb\xfd\x0d\x77\x4f\x74\x37\x16\x1c\xcc\x7a\x42\x9a\xf1\xae\xa7\xbd\xc6\xe5\x13\x5d\xd5\xc6\x69\xa6\xb2\xba\x8b\xab\x4b\xb9\x18\xbc\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x8e\x73\x85\x1d\xde\xcb\x81\x3d\x0a\xec\xce\xd0\xbe\xb8\xe4\xa7\xd7\x32\x2f\xd0\xed\x7c\x38\x58\x6b\x4b\x2e\xf0\x6d\x2b\xf4\x73\x7b\x6d\x2e\x31\x67\x07\xbf\x3c\x5c\xe1\x30\x1b\xc7\xdc\x90\xf3\x34\xe7\xe2\xfc\xfa\x32\x38\xe2\xc9\x1b\xcc\x29\x74\x4e\x4a\xcc\xbb\xf1\x63\xdf\xb3\x15\x64\xd4\x0a\x72\x7e\x7d\x19\x0e\x2e\xa8\xb3\xcf\xe4\x9a\xfc\x0c\x22\xe8\xe7\x25\xf9\xf1\xfc\xc3\xd5\xe5\xd5\xf7\xaf\x08\x8c\xe2\x39\x44\x05\x52\xbb\x99\x5a\xa1\x6d\xa8\xe9\xdb\xa3\xaa\x81\xe5\xa9\x9d\x5b\xca\x32\x66\x18\xd8\xc4\x4f\x89\xde\x96\x26\x95\xf7\x82\x5c\x57\x33\x3e\xc5\xac\x34\xa9\xd8\xb2\x1a\xb2\x67\xaa\x5c\x37\x98\x6a\x6a\xd5\x1c\xb0\xd4\x24\x96\x9b\x78\x4d\xaa\xf4\x99\xf1\xe9\x8e\xbb\x8c\x24\x9a\xa6\x8d\x62\xbf\x1d\xb8\xb4\x34\x5b\x26\x0c\x4f\x5c\x77\xf2\xd2\x6c\xa5\xe2\xff\xc0\x7f\xed\x38\xb5\x37\x35\x25\x1f\xf6\x8d\x12\x40\xa0\x0d\xa0\x49\x5f\x57\x1f\xf4\x04\x1f\xb5\x23\x68\xb4\x4f\x4d\xc1\x92\xa2\xa9\x24\x5a\x2e\xc9\x77\x52\x61\x61\xd1\x66\x8b\x74\xcd\x58\xe5\x58\xac\x37\xb6\x72\x2c\xd6\x7f\x3a\xcb\xa8\x61\xda\x9c\xfd\xbd\x64\x6a\xcf\xc5\xe6\x8c\x16\xfc\xec\x6b\xa3\xd3\xd5\x02\xb6\x6b\x41\x0b\xde\xf1\x28\x86\x28\x70\x2d\x55\xc2\x52\xab\x7d\xe9\x82\x26\xec\x2d\x5d\x75\x8b\x5f\xb4\x85\x68\xef\x27\x1e\x92\x06\xcc\x43\xac\x86\xf0\x2f\x60\x99\x82\x0e\xb2\xe4\x9a\x48\xc5\x37\x5c\xd4\xa5\x4a\x68\xc6\x14\xe6\xc9\xe7\xcc\x28\x9e\x54\x65\x89\x61\x97\x13\x4c\xad\x40\xe3\x72\x3f\x4c\x24\xed\xa6\xcb\x6f\xc5\xaa\x5b\x38\x4e\xc6\xd9\x17\x90\x3b\x54\x03\x40\xb3\xf7\x6a\x84\x5e\xfc\xf5\x70\x27\x66\xc7\x83\x1d\xbc\x14\x86\xa9\x1d\x0d\xa3\xce\xbf\x64\x55\xef\x7b\xc6\x44\x2b\xea\xa8\x86\xd5\x09\xd7\x1e\x1e\xdf\x75\xe5\x86\x2d\xe8\xdc\x00\xe3\x0a\x5e\x07\x58\x6f\x27\xf4\x18\x90\xee\x2b\xa8\x62\xc5\xe7\xbd\xf3\x5b\x31\xc5\xd1\xf8\x09\x7b\xe8\x2a\xc8\x26\x32\xcf\x4b\x01\x27\xad\xe7\x80\xc3\x61\xae\x1a\x8b\xe3\x3d\x5d\x93\xe7\x6b\x96\xba\x24\xbc\x53\x68\x96\x6b\x18\xd1\x46\x2a\xba\x61\xa7\xe4\xdc\x02\xc7\x42\xd0\xaa\xa3\x43\x0e\xb2\x7d\x3f\xc6\x0f\x2a\xbc\x3f\xb7\xcd\x46\xe7\x3f\x7c\x78\xeb\xeb\x04\x7a\x3e\xcb\x85\x36\x14\x74\xaf\xaa\x21\xff\x8e\xf2\xcc\xb2\xc6\xce\xe2\x4a\x91\x36\x2d\x82\x82\x59\xbe\x4d\x15\x70\x95\x0d\x13\x76\x85\x56\x5c\x2a\x2b\xc7\xed\x58\xba\xe7\xdd\x0e\x50\xbe\x6e\x4d\xc7\x7b\xc7\x55\xd5\x4f\x18\xf2\xbc\xe0\x16\x75\x71\x75\x83\xbd\xad\x63\x69\x89\x6f\x84\x54\xac\x3a\xd5\x37\x2c\x03\x0d\xa3\x43\x31\x6d\x8a\x1e\xf8\xc8\xce\xb4\xe1\xc3\x45\x7c\xe1\x08\xa4\xf3\x76\x67\x99\x55\x95\x8f\xea\x26\x5d\xc8\x34\x97\x82\x1b\x89\x6a\xa5\x6b\x9b\xec\xff\x84\x7a\x88\x93\x2a\x66\xcb\xba\x88\x83\xf1\x81\x8b\x83\x47\x76\xc7\x54\xa3\xe5\x72\x7d\x11\xe0\x8a\x24\xa5\x82\x24\xd6\x8a\x61\x2c\xc9\xb0\x46\x3c\x74\x8b\x1b\x66\xb8\xa0\x16\x85\x51\x0a\x89\xed\xbc\x91\x4e\x0c\x3e\xfc\x3a\xd7\x9b\xc0\xf4\x57\x54\x33\x78\xf5\x94\x18\xba\xe9\x75\x5b\xeb\x2d\xb5\x27\x70\xe5\x7c\x25\x7a\x49\x6e\x00\xe4\xde\x0b\xf8\x1d\x53\x1a\x22\xec\x34\xd1\x06\x9d\xb8\x0d\x2a\x45\xd9\xd7\xab\x41\x34\x88\xf0\x3d\x64\xcc\x4a\x45\xee\x84\xbc\xb7\xc7\x9e\x9a\x0a\xae\x3c\x24\x57\xe0\xb2\x1d\x88\xb5\x1a\x19\x4f\xac\x76\xe5\xd7\x65\x96\xdd\xb0\x44\xb1\xae\xd5\xb0\x5d\xdd\x58\xb8\x2a\x2f\x34\xab\x4c\xfd\x8d\x7b\x14\x64\xdb\x00\x14\xaf\xc5\x6a\x9a\x37\x24\x46\xdf\xae\xfb\xb8\xee\xa2\xcc\x40\x5d\x6a\x28\x63\x10\x14\xd0\x60\x53\x38\x57\x47\xcb\x8a\x6d\xb8\x5d\x4e\x4f\xd4\x92\x57\x01\xfa\x43\x8b\xac\x00\x5c\x6c\x4a\x9e\xb2\x33\x84\xf7\xb5\xae\xf6\x72\x01\x7f\xb1\x53\x71\xeb\x58\x48\xb1\xa0\x8b\xae\xd5\x78\xc0\x8a\xd9\xae\x66\x25\x13\x9a\xbd\x07\x1e\xfa\xc1\xe3\xc8\xab\xf5\x56\x0f\x94\xe5\x66\xdb\x52\x5d\x8c\x24\x59\x6f\x01\xcd\xbd\x2c\x89\xf3\x1a\x61\x1a\x93\x83\x96\x7a\xd9\xeb\x0c\xfe\x5d\x8c\x77\xef\x08\x61\x33\xe7\xb0\xf1\xe9\x20\xac\xac\x11\xf5\xe7\xa6\x63\x26\x47\x80\xdb\xd3\xb7\xe3\xec\xfe\xcc\xdd\xc5\x16\x96\x7d\x2c\x70\x49\xfa\x0c\xd6\x70\xf6\x35\xfc\xcf\xc0\xad\x09\x63\x50\xcf\xd3\xd4\x59\x01\x4b\xcd\xd6\x65\x86\x76\x39\xbd\x24\xb4\xe0\x1f\xf1\xfc\x9c\x92\x3b\x2e\xd2\x53\x52\xf2\xf4\xdf\x1f\xe1\xa7\x7e\xc4\x2d\x88\x0b\x6e\xaa\xeb\x66\xf8\x50\x9d\x5c\xb6\xde\xf5\x99\x67\x4e\xfb\x6b\x03\x6a\x04\x9d\xf6\x10\xdf\x1a\xa2\xf1\x31\xe5\x5e\x6a\x06\xba\x72\xa3\xbe\x00\x5b\x6e\x96\x64\xcd\x4c\xb2\xad\x8e\xa9\x3d\x79\x5c\xd8\x75\xf5\xb9\x80\x2b\x4f\xc0\x75\xf3\x76\xd6\xe8\x24\x81\x47\xb1\x56\x3c\xb0\x8d\xc4\x92\x9c\x8b\x3d\xba\x80\xbb\x3b\xe7\x6a\x05\x40\xed\x13\x48\xe7\x76\xec\x8d\x8a\xf6\x52\x51\xd0\x64\x8c\xa2\x76\xe4\xc3\x6f\x88\xec\x16\x5f\x74\x75\x1b\x9e\x9a\x81\x60\x87\xaf\x5b\x32\xe8\x6e\xbb\x87\x1f\x74\xcf\x86\x40\xcb\x10\xb1\x07\x3e\x96\x50\xed\x0d\xd2\x10\xe2\x84\x58\x46\x94\xc3\xa7\x5d\x74\xd8\xeb\x93\x62\xd9\x9e\xc8\xd2\xd4\x67\x38\x91\x58\x4e\xfa\xde\x3b\xe5\x72\xca\xdb\xb1\x1c\x2e\x10\xbb\x57\x5a\xad\xf6\x24\x95\x90\x9e\x2b\x4f\x81\x77\x60\x64\x95\x77\xf1\x81\xf4\xd8\xd2\x1d\x97\xa5\xc2\x7a\x26\x8a\xd1\x3b\x42\x4d\xa5\x83\xf6\xea\x97\xb2\x04\x57\x03\x4f\x58\x27\xd4\x23\x86\x1b\x9e\x57\xa1\x72\x45\x91\xf9\x1b\x63\x6d\xe4\x80\xb9\xd9\xb9\xfa\x14\x54\xdf\xd3\xa3\xd7\xa9\x43\xed\x01\x98\xca\xdb\xa8\xda\x44\xb5\x5a\x3a\x57\x9b\x32\x87\xfb\xa9\xa3\xfe\xba\x46\x8f\x2b\xd0\x2d\x93\x3b\x2f\x8d\x86\xa3\x90\x5e\xbf\xbb\xf0\xbe\x04\x0c\xb7\xa8\xa3\x30\x5d\xa1\x8f\x74\x49\x3e\x3e\xca\x1a\x39\x6a\x87\x3c\x34\x44\x5e\x5a\x3d\xd6\x5b\x3e\x87\x4c\x50\x95\x7d\x49\x31\x2d\xb3\x9d\x2f\xeb\x56\xcd\xcc\xcb\x74\x2e\x8a\xd2\x38\x56\xe9\xd5\xf7\x01\x98\xa5\x48\xb6\x54\x6c\xfc\x4d\xb3\xb1\x32\xa2\xf7\xc2\xd0\x07\xcf\xa2\x98\x4e\x68\x51\xc5\x8f\x90\x54\x96\xc3\x13\xfd\xdd\xef\x4e\x09\x67\xaf\xc8\xef\x1a\xe0\x96\xe4\x8d\x83\xd0\x40\x64\x23\x9a\x6e\x55\x23\x6c\xc8\xaa\xa7\xd8\x86\xaa\x34\x83\xc0\xf5\x75\xd5\xe5\x04\xad\x3c\x6e\x93\xd8\x03\xd7\x06\xae\x66\x42\x9a\x86\x45\x6e\x68\xf5\xd3\xba\x6c\x61\x87\x18\xe4\xc6\x8b\x94\x1a\xba\x68\x1c\x95\x33\xec\xff\xb3\x70\x05\x25\x16\xd4\x11\x69\xa3\x87\xcc\xd7\xae\xfb\xc6\x82\x56\x6f\x71\xab\xbd\x40\x01\x86\x7e\xa9\x17\x74\xc6\x8e\xda\x86\xc3\x96\xd9\x60\xf5\x8f\x43\x8b\x5c\x55\x0e\x18\xa0\x2d\xc9\x95\x34\x75\x95\x9f\x2a\xcc\xc2\x95\x92\xb8\x1d\x0c\xa6\x3b\x38\x99\xe4\xcd\xd5\xed\x87\xbf\x5d\xbf\xbf\xbc\xba\x1d\x3d\x8a\x03\x10\x47\x0e\x68\xcc\x51\x1c\x80\x3c\x7c\x40\xc7\x8f\xe2\x00\xc8\xc0\x01\x1d\x3f\x8a\xc3\x6c\x61\xf0\x80\x46\x1f\xc5\x01\xd8\x03\x07\x34\xfe\x28\x0e\xc0\xed\x1c\xd0\xdf\xf8\x51\x64\x62\x17\x71\x0c\xdf\xba\x0b\x5d\x9f\xb7\xec\xb0\x92\xc2\x68\x34\xc5\xd1\xa3\x41\xde\x88\xdd\x47\xaa\xea\x3e\x2d\x10\x86\xdb\xeb\xd8\x73\x2f\x0c\x7a\xbd\x80\x95\xbc\x3e\x46\x38\xc8\x24\x57\x7d\xf3\xca\xd4\x37\xef\x3a\x43\x31\xd4\x59\x8b\x90\xd7\x3f\x5d\x5e\xbc\xb9\xba\xbd\xfc\xee\xf2\xcd\x87\x27\xfb\x7e\x47\x6b\x27\xb4\x19\xf5\x14\x6e\x18\x5c\x44\xcd\x29\x0b\xc5\xac\x26\xaa\x89\x6f\x70\xd7\x4f\x7e\x7c\x3c\x97\xac\x1d\x1b\x62\x75\x59\x67\xdc\xea\x07\x89\x4c\x37\x08\x31\x9e\x21\xb7\x58\x6f\x10\xe6\x54\xb6\xec\x18\x70\xd8\xd5\xfb\x29\x98\x33\x3e\x8f\x67\xd1\xe1\x19\xb7\x35\xa9\x76\x84\x43\x30\x97\x32\x9e\xac\xbf\x53\x32\xd0\x05\xe6\xb0\xd0\x00\x5c\x5d\xab\x34\xe5\x3e\x8a\x39\xd1\xae\xf9\x62\xf8\x78\xd6\x8c\xcf\xa9\x1b\x55\x5e\x9c\xfd\x3b\xc4\x4f\x87\x20\xc4\xd6\x64\xc1\x7b\xf8\x3b\x5a\xfc\x95\xed\x3f\xb0\x91\x94\xd0\xc3\xc5\x82\xb9\x58\x13\x4a\xee\xd8\x1e\x8d\xdc\xaf\x3d\xb8\xb1\x4a\x0a\x53\x6a\xc6\xdc\xb1\x60\xcc\x50\xef\xdc\xec\x29\xb0\xb3\x02\x79\x63\xa7\x39\x36\x21\x32\xb5\x5e\xcc\xa3\x2a\xd9\x7c\x21\x16\xaf\xf6\x33\xd5\xfe\x15\x05\x74\xd8\x46\xd6\x7e\x26\xe1\xdc\x5b\x8d\x27\xe3\xdd\xd9\xd9\x5b\x1c\xa6\xa2\x55\xcb\x3f\xf8\x68\x9e\x36\x3e\x96\xa6\x7c\x56\xb0\x13\x35\xd1\x8b\x1c\x0b\x1c\xc3\x27\xbe\xda\xcf\x5d\x8f\x5f\xa5\x6f\xdc\x88\x32\x3e\xb0\xd7\x53\xcf\xff\x49\xcd\x00\x30\x86\xb1\xca\xdf\x4e\x5f\x79\xcb\x92\xae\x2a\x02\x2f\x2d\x41\x8e\xd3\x4e\xeb\x75\x30\x3e\x9f\xd6\x7f\x43\x77\x67\xe3\x0f\xc0\x25\xd1\x99\x32\x0e\x5a\x17\x2c\x59\x0a\x99\x82\x7b\xec\x14\xff\xe9\x64\xfb\x79\x92\xc8\x52\x18\xf7\x03\x64\xd7\x2c\xb7\x52\x9b\xcb\xeb\x08\xb0\xf8\x7a\x21\xd3\xcb\xeb\xd3\xd6\xbf\xf4\x48\x3a\xff\x34\x36\x58\x9f\xc3\xc9\xe4\xff\xb1\xf6\xff\xa0\x61\x70\xcb\x72\x0a\xff\xf9\x9d\xdd\xb8\x40\xd0\x55\xfb\xe1\xba\xce\x80\x13\x90\xf6\x63\xe5\x76\xbb\x66\xdc\xb3\xdd\xcb\x67\x47\x67\xb6\x6b\x3f\xcd\xc9\x4b\x87\x68\x37\x5f\xe3\x14\xa8\xb4\x12\x09\x31\xda\xa0\x7f\x6a\xdf\xdf\xf9\xf5\xa5\xf7\xa7\x1d\x79\x99\xf1\x27\x7f\x1d\xb9\x6b\xd1\xe7\xdf\xf7\x6e\xfe\xee\x89\x7c\xc0\xc3\xe9\x24\x8d\xbc\x02\x67\xef\x28\xbe\xea\x26\xdb\xd8\xba\xdd\xa5\xdb\xba\x16\xdb\xcf\xf1\x8f\xcb\xa4\x28\x4f\xdd\x0b\xcb\x9c\xe5\x52\xed\xc7\x4f\xa9\x7b\x9d\x15\x5b\x96\x33\x45\xb3\x45\x15\xc2\xe0\xc1\x23\xd8\xea\x5f\x08\x78\xfc\x54\x36\x26\xd8\x85\x8e\x77\x19\xe7\xc2\xce\xf6\x75\xe1\x93\xa3\x72\x86\x0a\xcb\xe3\x85\xe5\xf1\x69\x6f\x5f\xed\x2c\x01\x9d\xa6\xa2\x43\x50\x63\x5d\x5e\x47\x9c\xd0\xaf\xbc\xba\x10\x40\x24\x76\x56\xe9\x0d\x94\x53\xa8\x9f\x49\xcc\x20\xe5\x3b\xae\xe5\x48\xb7\x96\x9e\x85\xde\xb4\xca\x70\xba\xb4\x41\xf4\x9b\xc6\xf5\x2f\xc0\x87\x3d\x14\x90\xf6\x5d\xd1\xea\x01\xff\x7b\xf9\xec\xd8\x0b\xf6\x23\x4d\xdf\xda\x0f\x9e\xa5\xd4\x27\xb3\x62\x7f\x47\xde\x97\x78\xee\xe5\xa7\x72\x2c\xe6\x85\xfe\xb1\xe3\x5c\x60\x9c\xaf\xad\xce\xf3\x1a\x09\xb7\x27\xee\x26\xd0\x1f\x98\xd0\x7e\x7e\xa9\x3b\x8f\x97\xf2\xb8\x94\x5a\xdc\xad\x95\xcc\x5d\xb6\x4f\x14\xa1\xaf\x18\x58\x93\x33\x9e\x7a\x58\x77\x6c\xa4\xfe\x31\x3e\xf3\x3d\xea\xb7\x74\x8f\xc2\x88\x1f\x77\x89\x8a\xb8\x94\xe0\xf3\xab\xbb\x44\x45\xbc\x36\x9e\x03\xf1\xe9\x32\x1c\x98\xd8\x0d\x5b\xb2\x7a\x0d\xf8\x5e\x13\x6b\x14\x27\xe8\x37\x81\x86\xdd\x48\xad\x6c\x6c\x60\x50\xb5\x91\xb6\x76\xc9\xa1\x6c\xca\x47\x4c\xd7\x2d\xa3\x35\x39\x87\x82\xf4\xc8\xa0\x00\xac\xb7\x86\x2a\xe6\xaa\xcb\x61\x95\x0d\xb6\x1b\xb6\xe3\x43\x54\xec\x41\xa2\x84\xab\x65\xc9\xc5\xc6\x65\xfa\xa1\x7c\x70\xc6\x46\x2e\xaa\x62\x3a\x03\x30\x2b\xb5\xa0\x8e\xed\xa7\x5a\xcb\x04\x0a\x5c\xd6\xcd\x5c\xa0\xbe\x82\x5b\x38\xcc\xdc\xd0\xbb\x21\x90\xcd\xc6\x32\x1f\x2d\xc4\x1a\x87\xab\x3d\x14\x77\x11\xbb\xca\x6e\x5b\xa2\x8f\x09\x85\x41\xa0\x0b\x09\x74\xee\x68\x42\xfe\x14\xde\x16\x4b\x74\xce\x2a\xda\x70\xba\x80\x7c\xaa\x6e\x0a\x14\x7c\x42\x3d\x21\x39\xfe\xa9\x4c\x35\x43\xb4\x16\x23\x5a\x2b\x53\xe7\x88\x9a\xd0\x91\xa9\xb5\xa1\xa8\x2d\x4b\x8f\x60\x7e\x8d\x11\x7e\x5f\xb6\xe0\x3b\x62\xf0\x5c\xfd\x44\x0b\xb3\x58\x41\x36\xc1\x18\x38\x4d\x30\xc5\x0a\xa5\x28\x21\x52\x28\xb6\xe6\x0f\xd1\xb4\xd9\x0c\xa3\xe5\xd0\x53\x6d\xcd\xa1\xcc\xbb\x05\x54\x30\x81\xd1\x7a\x34\xd9\x8e\x0a\x39\xc7\xaa\x6b\xeb\x7d\xed\x44\x3c\xae\xa3\x10\xf5\xc8\xa9\x07\xf0\xa6\x4f\x93\x9d\x4f\xdf\xaf\xe7\xf4\xb9\x0d\xfe\x6c\x47\xef\x89\xba\x55\x6f\x0e\x41\xcf\xd2\x4f\x2e\x1a\x81\x45\x98\x0c\x32\x95\x76\x1a\x81\xa5\x18\x76\x3e\xb0\xa2\x76\xf7\xb9\x8a\x4d\x60\x77\x56\x79\x4f\xb6\x7c\x63\x91\x8f\x1d\xe9\x50\x32\x12\x8c\x8f\xcf\x87\x95\x25\x48\x24\xc4\xe4\x54\xa9\x20\xeb\x41\xf1\xb4\x93\x63\x0a\x2a\x92\x0f\x8a\x85\x1f\x95\xcc\xb2\xe1\xae\x1f\x19\xbf\x63\xe4\x82\x15\x99\xdc\xe7\x2e\x22\x23\x25\x37\x86\x1a\x4b\xca\x37\xcc\x0c\x59\xd1\x47\xc8\xb4\xca\x48\x88\x2e\x05\x76\x82\x99\x1e\x45\x99\x65\xa4\x80\x8f\x96\xd0\x2e\x4b\xae\xc9\x39\xe4\xae\x9d\x92\x2b\xb6\x63\xea\x94\x5c\xae\xaf\xa4\xb9\x46\x65\x66\x88\x27\x36\x9d\xd1\xf8\x39\xe1\x6b\xf2\x0a\xd3\x05\x21\x45\x84\xeb\x66\x87\x3a\xa9\x5a\x60\x07\xa0\x56\xd5\x0e\x9e\x10\x96\x34\x4c\x4c\x5f\x03\xa4\x2a\x83\x61\xc0\x74\x37\x82\xf8\xaa\xb0\x6a\x04\xca\xcf\x5d\x3a\xa6\xa9\x23\x94\x3d\x0d\xba\xfc\x33\x9f\x70\x0a\xca\xea\x60\x69\x16\xc5\x74\x21\x85\x66\xed\xe2\x1e\x75\x89\x68\xb8\x02\xe8\x68\x0d\x77\x5c\x80\x14\x52\x1b\x68\x1d\x17\x5b\x41\xf7\xda\x7f\x00\xb5\x24\x69\x96\xb1\x94\xf0\x3c\x67\xa9\xbd\x15\x64\x7b\x57\x1f\x94\x46\x95\x59\xb2\x10\x7c\xea\xe5\x25\x0a\xa3\x2d\x15\x69\xc6\x54\xb3\x07\x61\xeb\x46\xe3\x4b\xb4\x05\xb9\x2a\xda\xb2\x5d\x7d\x4a\x42\x93\x44\xaa\xd4\x75\x48\xb0\x57\x7b\x1f\x3b\x5f\x9d\x0d\xe0\xdf\xa3\x5c\x83\xf4\xb5\x1d\x85\xc2\x58\xba\x51\x3a\x13\xba\x0a\x57\x7d\x16\x8f\x58\xfa\xb7\x41\xe4\x75\xa1\xdf\x8a\x32\x16\x50\x98\xfc\xac\x51\x03\x18\xfe\xf0\xd4\x72\xe2\xe1\x86\x7c\xe4\xb1\x4d\xf9\x46\x24\x62\xab\x65\xdf\x53\x1a\xf3\xc5\x2f\x94\xc4\x36\xe8\xeb\xac\x39\xae\x49\x5f\x84\x5d\xa8\x91\xb5\x14\xd3\xa8\x2f\xc6\xd2\xd4\x6e\xe5\x17\xdf\xac\x2f\x02\x76\xa3\x9d\x5f\x64\xc3\xbe\x08\xa0\x03\x2d\xfd\x06\x9b\xf6\x45\x80\x1c\x6b\xeb\x37\xd0\xb8\x2f\x02\x72\xa8\xb5\xdf\x40\xf3\xbe\x18\x14\x04\xda\xfb\x4d\x68\xe0\x47\x62\xdb\x6f\x91\xa9\x36\xd7\xb8\x4e\x49\xd1\xe6\xc6\xd1\x4e\x74\xe4\x13\x75\xa3\x23\x93\x78\xc3\x78\x5f\x85\xee\x3c\x23\x3a\xd3\x45\x1e\xe2\x4f\xd2\x9d\x8e\xc4\x76\xa8\x23\xd3\x48\x24\xba\x53\x1d\x79\x54\xb7\xba\x88\x55\x41\x87\xad\x47\x75\xac\x23\x53\x8e\xcd\xe4\xce\x75\x51\x0e\x05\x2c\x65\x3a\xbd\x7b\x1d\x99\xe8\x99\x23\x13\x7c\x56\xe4\x58\x9d\xec\xc8\x54\x6e\x43\xa6\x74\xb4\x1b\x9f\x66\x6c\x57\xbb\x47\xcc\x33\xd6\x55\x43\x62\x3b\xdc\x91\xe8\x2e\x77\x64\x8a\x97\x99\x4c\xe0\xe1\x31\x1d\xef\xc8\x91\xbb\xde\x91\x69\xa8\x1f\xef\x11\x43\xe2\xfa\xc4\x90\x89\xbd\x62\xc8\xb4\x7e\x31\xe4\x31\xdd\xf0\x22\xf6\x5d\x76\xbc\x53\xc1\xbe\x31\x31\x94\xd4\xea\x2c\xf3\xc8\xde\x31\xe4\x69\x9d\xf1\x48\x64\x77\x3c\xf2\xa9\x3a\xe4\x91\xc9\x5d\xf2\xc8\x14\xba\x8d\x63\x16\x23\x5d\x72\xc8\x04\xa7\xee\x78\xe7\x2c\xf2\xd8\xee\x59\x23\x58\x81\xde\x5a\xd3\x3b\x68\x8d\x42\xad\xfa\x6b\x4d\xea\xa2\x45\x3e\xb5\xd6\x77\xc4\x8e\x5a\x64\x62\x57\x2d\xf2\x5b\xe1\x9c\x11\xdd\xb6\x7e\xc3\x9c\xf3\x97\xe5\x2d\x11\x2f\x15\x8a\xdd\x18\x59\x44\x5b\x18\xf1\xf5\x01\xfb\xa2\x6b\xbe\x19\x6d\x60\xac\x0d\x86\x24\x2d\x19\x96\x16\x83\xd8\x67\x7f\x57\x94\x4d\xd3\x5f\x30\xc6\x82\x34\x9a\x9e\xf8\x86\x89\x67\xae\x59\xa2\xeb\x1b\xe6\xba\x55\x9c\xda\x35\xb3\xbc\xf0\xb5\xc6\x46\xe3\x04\x5d\x6f\x0d\x78\x9d\x99\x04\x43\x4c\xbc\x2d\xd4\x59\x52\x3c\x32\xe2\xcb\xd8\x27\x8a\xea\x2d\x16\x4f\x63\x0f\xdc\xb8\xee\x29\x8a\x51\x2d\xb1\x36\x5e\xb3\x47\x08\xd7\xa4\xa0\x1a\x6b\xa3\x84\x24\x49\x3d\x31\x04\x77\x2d\xd3\x93\x13\xdd\x02\xb5\x51\x34\x61\xae\x81\x28\x81\x84\x84\x54\xde\x87\x5c\x5b\x2b\xb6\xe1\x42\xfb\xbd\xc5\x12\x2b\x48\x04\x96\x9b\x33\xb0\x30\xf9\xfc\xf7\x25\xf9\x50\x25\xdb\x8d\x5b\x6a\x65\x69\x12\x59\x33\x09\x37\xf3\x43\xc3\x32\x84\xad\xc0\xd6\x8f\x15\x92\xad\xc8\xa9\x59\xe5\x77\x04\x05\xce\xc2\x1c\x80\xda\x20\xc0\xa9\x16\xe6\x10\x0a\x54\xe3\xab\xc1\xfd\x81\x5e\x4e\x34\xd9\xb6\xfd\x2e\xb3\xb1\x7a\x36\x56\x87\x9e\xd9\x58\x3d\x1b\xab\x67\x63\x75\xef\x33\x1b\xab\x67\x63\xf5\x6c\xac\x1e\xff\x76\x36\x56\xcf\xc6\xea\xd9\x58\xdd\xf3\x7c\x89\x26\x97\xd9\x58\x1d\xfe\x7c\x36\x56\xcf\xc6\xea\x00\xd4\xd9\x58\xdd\xfb\xfe\x6f\x81\x73\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x3a\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\xed\xfe\xc3\x0e\xd8\xb2\xae\xbe\x37\x30\xf1\x3a\x1f\xd0\xc7\xb4\x3a\x23\x70\x6d\x74\xee\x8d\x09\x06\x7b\xde\x00\xcc\x47\xd7\x85\x2e\x64\x5a\x5b\xf2\x1a\x26\x3c\xd4\xfb\xfb\x0f\xfd\x38\x13\x0b\xdb\xee\x1e\x65\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x3d\xc2\x4e\x17\x67\xab\x8a\xb5\xd1\x1d\x5a\xe0\x46\xc0\x46\xdb\xe7\x9a\xd6\xb7\x11\x98\x71\xb6\xb9\x21\xcb\xdb\x98\x8a\x36\x60\x97\x1b\xb5\xba\x8d\xc0\xed\xb7\xc9\x05\x2d\x6e\x63\x33\xed\xb5\xc7\x05\xad\x6d\xe3\x88\x8d\xb4\xc5\x45\x19\x14\xa2\xc5\x61\xcc\xdd\x2d\x82\x73\x3b\xb7\xda\xed\x56\x31\xbd\x95\x59\xe0\x24\xb5\x1b\x6f\x72\xc1\xf3\x32\x6f\x75\x43\x72\xa0\x74\x45\xf1\xc8\x43\x83\xd6\xad\x15\xd0\xb6\x25\x3d\xa8\x26\x43\x79\x66\x77\x03\x12\x1d\xb6\x74\x07\x1c\xa7\x4c\x12\xc6\xd2\x83\xf6\x94\x01\x90\xbf\x5f\x56\xb3\xab\x0a\x22\xbe\x1c\xde\x19\xac\xee\x02\x1a\xcb\xef\xbf\x1d\xc1\x64\x58\xab\x19\x35\x61\x7e\x0a\xf3\x65\x1c\x9b\x1c\x57\x60\x27\x9b\x2c\x23\x8a\xe1\x7c\x12\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xa7\x9b\x27\x61\x7f\xc7\x2e\x2f\x8f\x31\x4d\x46\x71\x91\xc9\x26\xc9\x18\x1b\xf4\xa3\xcc\x91\x53\x4c\x91\x8f\xaa\xf3\xf2\x58\x13\xe4\xa4\x7b\x47\xb4\xe9\xf1\x38\x66\xc7\x4f\x52\x53\x29\x02\x2f\x71\x66\xc6\x68\x13\x63\x9c\x79\x71\xdc\xb4\x78\x4c\xb3\x62\x24\x6a\xc7\x2f\xc5\x11\x17\xe2\x29\x97\xe1\x09\x17\xe1\xc9\xe6\x43\x87\xa4\x91\x6d\x8d\xbd\x00\x1f\x5c\x6f\x47\xa0\x3e\xee\xf2\xfb\x84\x8b\x6f\x8c\xb9\xf0\x93\x98\x0a\xa7\x99\x09\x23\xfb\xa1\x8f\x1d\xee\x91\xeb\x7b\xc4\x51\x85\x4e\x4e\x34\xbb\x60\x19\xdd\xdf\xb0\x44\x8a\x34\xc0\xa9\x0f\x4a\x1d\x54\x34\xa7\xf1\x43\xa7\xb9\xb5\xa3\x6c\xb6\xd4\x55\xcb\x09\xfa\xbd\x5d\x80\x92\xbf\xb9\x3b\xe1\x02\xb5\x11\x71\x86\x8f\xc9\x5e\x3e\xc2\xfd\x9a\x1c\x55\x45\xc4\xc0\xa0\x69\x68\xfe\x8b\xbc\x27\x72\x6d\x98\x20\xcf\xb9\xf0\x98\x7e\x71\xd0\xb7\x16\xf1\x15\x22\x39\x47\x9e\xf6\xbb\x97\xdf\x78\x30\x9f\x4b\x55\x06\xa5\x5e\xeb\x63\xdc\x3a\x1c\xa8\xa7\x5c\x3b\x1c\x88\x75\x99\xb5\xaf\x1e\x78\x1d\x89\xbd\x77\xbc\xac\x4b\xa2\xbc\x84\xb9\x54\xb4\x0c\xed\x2f\x31\x98\xb1\x8b\xf0\x20\xc4\x5f\x60\x2b\x22\x5c\x02\x8f\x72\x07\xa0\xc1\x7f\x44\xc4\x4e\x72\x05\x34\x8d\xfd\x01\xb8\x53\xdc\x00\x9f\xe4\xf6\x74\x44\xd3\xff\x14\xb3\xff\xaf\x4e\xb3\x89\x30\xef\xff\x86\x34\x9b\x5f\x42\x17\x30\x3c\x67\xb2\x34\x47\x52\x03\xee\xb7\x3c\xd9\x36\x39\x32\x0f\xd7\x2b\x92\xe5\x41\x83\x8e\x97\x0e\x60\xaf\x94\x3a\x5e\x44\xed\x17\xa6\x25\x8c\xec\x53\x64\xe3\xd4\x66\x19\xaa\x5a\x17\xab\x6b\x94\x53\x8d\x0d\xa7\x7f\x7a\x7b\xfe\xe7\x37\x6f\x97\xe4\x0d\x4d\x86\x4a\x85\x37\xaa\x84\x08\x6c\x88\x88\xb4\xbf\xa5\x3b\x46\x28\x29\x05\xff\x7b\x89\xb5\x8a\xc8\xf3\x0a\xe2\x0b\xef\x35\x19\x00\x3a\x56\x5f\x65\x84\x67\x40\xe3\x80\x09\x95\x2a\xb1\xd1\x00\x9a\x91\xa5\x55\xf3\x7d\x97\xea\x06\x6f\x78\x63\x7f\x1a\x66\x51\x14\x79\xcf\x96\x29\x46\x36\x7c\xe7\x0c\x76\xae\x04\x4d\xdd\xb7\xbd\xd5\x68\x97\xae\xc0\x4c\x3d\xc8\xa1\x04\x33\x96\xfa\xaa\x1b\x87\x14\xba\x99\x7f\x61\x6f\x24\xfa\x94\xac\x4a\x30\xd5\x17\x8a\xe7\x54\xf1\x6c\xdf\x1c\x82\x66\x43\xfc\xe6\x4a\x7a\x09\xbd\x47\x71\x5c\x4f\xff\xe2\xfd\x9b\x1b\x72\xf5\xfe\x16\x7a\x22\x59\xc9\x0a\x56\x74\xf8\x1d\x10\xd3\xdf\xf3\x19\x1f\x57\xdb\x1a\x5b\xaf\xc2\x27\x78\xce\xb9\x86\x46\xcd\x4c\xd8\xc1\xdc\xad\xdc\x97\x82\x7a\xf6\xcd\x12\xfe\x6f\xa8\xec\x35\x4d\x53\x65\xb9\x79\xe5\x84\x38\xc8\x1f\xb0\x5c\x16\xf8\x3d\x5f\x65\x8d\xbd\x73\xd8\xfb\xc5\x3a\x83\x55\xce\xc4\x6b\xbb\xec\x66\x83\xb0\x6a\x23\x01\x21\x58\xaf\x14\x9a\x90\x0e\xf2\x81\xd1\xbe\x66\x91\xf5\x2a\xeb\x09\x45\xd7\xcb\xab\xf9\xb5\x17\xa6\xee\x50\xc8\x46\x49\x6b\x72\x79\xed\xb7\x25\x2c\xd0\xa0\x8c\x58\x25\x0b\x5d\x31\x68\x00\x8c\x26\x89\x53\xf2\x0d\xf9\x13\x79\x20\x7f\x02\xd1\xfa\xc7\x10\xb0\x38\x0e\x1a\xa7\xd6\xa2\xd6\x76\x79\x1d\x8d\x95\x1f\xed\x11\xb0\xdf\xd8\x95\x1b\x49\x56\x1c\x1b\xd3\xd7\x4d\x87\x1d\xb6\x9e\x5c\xe1\xd0\x0e\x72\xd4\x0d\x03\xeb\x04\xb9\x6c\xb4\x9f\x0f\x3b\xd6\xcc\xc4\x2d\xb3\xa0\xad\x26\x7b\x85\x44\x1e\x36\x4f\xb7\x2a\x96\xd5\x23\xe5\xd4\x24\xdb\xf6\x09\xb2\x22\x5c\x9b\x9a\x88\xc3\xca\x70\x2a\xe1\x86\x80\xee\xc0\x2d\x0f\x52\xe5\x71\x09\x69\x52\xf3\xbd\xd6\x2e\x1c\x60\xfa\x40\x51\x1c\x51\xc2\x53\x2f\x59\x1b\xe9\x50\x85\x4c\x51\x54\xc3\xa4\xd2\x06\xbb\xf1\x52\x39\x08\xb4\x2b\xb1\x5d\x88\x4a\x75\x75\x06\xfa\xb2\x27\xc1\x75\xe3\x84\x0a\x96\x6a\x24\x63\xc1\x9e\x96\xaa\x07\x5e\x70\x63\xa2\xce\x47\xa1\xa4\x91\x89\x0c\xd6\x8c\x6c\x9b\x84\xdd\x07\xd8\xde\x1f\x29\xcb\xe1\xfc\x87\x8b\xeb\x53\x7b\x23\x84\xe2\x79\x37\xaf\xc7\xac\x72\xad\xf6\x70\xb7\xaf\xaf\x83\x6d\x6a\x22\x16\x33\x5e\xce\xbb\xc5\xc2\x87\xd4\xf2\xa7\xd5\x9e\x54\x8c\xa6\xfc\x68\xb1\x35\xbe\xd5\x61\x05\x75\x4a\x90\x4d\x2e\x77\x2c\x45\x01\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0e\x44\xde\x8c\xeb\x90\x9f\xc1\x32\x38\x47\xde\xcc\x91\x37\x73\xe4\xcd\x1c\x79\x13\x78\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x5e\xb4\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x78\x69\x8e\xbc\x71\x93\xfa\x97\xf1\x4f\xcd\x91\x37\xed\x67\x8e\xbc\xe9\x8c\x32\x47\xde\x7c\x19\x3e\xb5\x39\xf2\xc6\x3f\x73\xe4\xcd\x1c\x79\x33\x47\xde\xcc\x91\x37\x07\xcf\x1c\x79\x33\x47\xde\xcc\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\x5e\xcb\xbc\x28\x0d\x23\x1f\xaa\x76\xf5\x55\xcf\xf4\xd5\x1e\xfd\x82\x8d\xc3\xf1\xa9\xdc\x1c\xd8\xb6\xab\x54\x10\x2a\x72\x86\xb5\x10\x17\x09\x4e\x6d\x51\xad\x67\x51\xcd\xe4\xec\xb1\xae\x0e\xec\x9d\x3f\x4c\x0f\x75\x7c\xcc\x75\x14\xe3\x8f\x62\x5c\x6d\x8c\xbf\x85\x29\x34\x0c\x2d\xd8\x2c\xea\x01\xc8\x97\xe6\xb2\xc4\x12\x90\x6e\xf5\x81\xb1\x2b\xbc\xa0\x99\xe8\xf3\xa1\x9d\xc4\xf7\x0c\x66\xfa\x33\x63\xff\x83\x9b\xc4\x21\xfe\x1d\xfb\x78\x1c\xfe\xfd\x91\x81\x08\x84\x6a\x04\xae\x89\xcc\xb9\xb1\x7a\x8a\x55\xf6\x1a\xd1\x42\x21\xaf\x06\x37\x2d\x1b\xaa\xa3\x16\xf0\x39\x52\x83\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xef\xa6\x16\x42\x17\x54\xbe\xad\xb4\x25\xd8\xf5\x85\x6f\xbe\x0b\x8c\xf3\x8b\xa6\xa0\x91\x17\xac\xbe\xaf\xb8\xd9\xbf\x96\xc2\xb0\x87\x01\x0d\xa6\x4d\x0c\x37\xee\x13\xd7\x55\x50\x57\xaa\x94\x73\x62\xaa\x52\x40\x54\x43\x84\x28\x89\x41\x16\x76\x1b\x3b\xf3\x13\x05\xac\xb0\x07\x73\x36\x00\x32\x6e\x2b\x0c\xd5\x77\xf5\x3e\xb0\x85\x15\x4e\x35\xba\x3b\x63\x3d\x96\x71\x02\x8b\xb9\x56\x7c\xc7\x33\xb6\x61\x6f\x74\x42\x33\xd8\xf3\x58\x15\xe0\x7c\xe0\x7b\xdf\x55\x51\x57\x5d\x34\x87\x3a\x66\xbb\x79\x82\x52\x97\x50\x41\x36\x94\x0b\x92\x5b\x1c\x15\x1e\x2c\x74\xdf\x13\xd0\xe1\xad\xa0\xca\x5e\x08\xdc\x07\x21\x8d\x0b\x02\xc3\x56\x52\x66\xce\x23\x9b\xed\xeb\x39\x39\x57\xbf\x90\x3f\x09\x76\xff\x93\x1d\x47\x93\x75\x46\x37\xa1\x5e\xd4\xc4\x55\x84\x65\xa6\x53\xb2\xa5\x9a\x0e\x19\x42\x47\x88\x31\x68\x50\xff\x08\xc5\x0e\x8c\xbd\xed\xbe\x5f\x91\x97\x2f\x80\x6a\xa9\x26\x15\xf4\x90\x51\xe5\xdb\x17\x60\x7d\x79\x7d\x7e\xfd\xd3\xcd\xdf\x6e\x7e\x3a\xbf\x78\x77\x79\x35\x76\x44\xc3\x7d\x4a\x13\x5a\xd0\x15\xcf\x78\x98\x77\x77\xac\xe0\xcd\xcf\x80\x51\xa5\xe9\x59\xaa\x64\x81\xeb\x54\xa5\x80\x78\xcd\x3a\x06\x2b\xc2\x90\xe1\x7d\x50\x55\x78\x27\xb6\xe6\x6e\x0f\xb5\x51\x54\x18\xaf\xec\x8c\xd5\xe7\x46\x34\xab\x52\x58\x45\xf5\xa9\x1e\x37\x9a\x4e\x09\x4a\x38\x4f\x53\x96\xb6\xa6\x7e\x64\x1f\xd0\x6b\x0f\x7a\x5f\x47\x8c\x92\xeb\xf7\x37\x97\xff\x37\x7e\x54\xe2\x68\x24\xca\x3d\x70\x24\x0f\x36\x21\x96\x4c\x26\x60\xf2\x83\x8b\xee\x99\x71\x39\xf0\xce\x48\x25\x7f\xcf\x55\x22\x0f\xf7\x87\x52\xb4\x23\xf3\x6b\x08\x24\x97\x29\x5b\x92\x6b\x64\x8a\xd0\x6d\x37\xc8\xfb\xab\xef\x6a\x36\x00\xe6\x5f\xfb\xb1\x30\x9c\x66\xd9\x9e\x58\x4d\x6c\x47\x33\x86\x2e\x64\x25\x07\x6f\x2b\xa4\x2e\xa9\x85\x71\xa9\x4d\xae\xb1\xa6\x99\x0e\x1c\xf0\x18\x3e\x68\x59\xfd\x3b\xab\x4c\x46\xe2\xa9\x7a\x9f\xa4\x4c\x48\xe3\xf4\x52\x3b\x12\x04\xd4\x2a\x99\x10\xd4\x4d\xd1\x0d\x11\x58\x55\x1d\x4e\x54\x31\x4b\x60\xb1\x9e\x0d\x72\xed\xd7\x7a\x5d\x8d\x09\x37\xf1\x00\xcc\x52\x33\x7d\x20\x6d\x1c\x1b\xac\xb5\x55\x3b\xae\x62\x34\x85\xd8\xb0\x82\x9a\x2d\xd8\x35\x03\x40\x73\xaa\xef\x58\x8a\xaf\x2e\x51\x0e\x3b\x4d\x5a\xbb\x0e\x00\x6e\x7a\xb7\x16\x0b\x6b\x46\x4d\xa9\x18\xc8\xdf\xb0\x92\xbb\x62\x84\x09\xba\xca\x42\x91\x67\x51\x41\x91\x34\x7d\x2f\xb2\xfd\x07\x29\xcd\x77\x55\x48\x55\xe4\x76\xfe\x58\xf5\x04\x6f\xde\xa0\x41\xd8\x82\x91\x32\x5d\x00\x9a\x20\x90\x2b\xae\x92\xf9\x45\xbd\x7d\x47\x20\x4f\x55\x8a\x73\xfd\xbd\x92\x65\x6c\x53\x0e\x4b\x41\xdf\x5f\x5e\xc0\xa9\x2a\xf1\xdc\x30\x61\xd4\x1e\x82\x22\x3b\x19\x3c\xe3\x3a\xdc\x92\xfc\x60\x69\xea\x80\x8a\xac\xc6\x55\x0a\xcd\xcc\x92\xbc\xa3\x7b\x42\x33\x2d\x9d\x32\x15\xd2\x8c\x04\xb9\x06\x9f\x49\x53\xff\x5f\x12\x88\x71\xc6\xb8\x8b\x95\x34\x5b\x72\xf0\xc2\x08\x71\x76\x21\x62\xf8\x1e\x1a\x98\xea\x04\x25\x2e\x0e\x01\x87\x88\x93\xde\x31\x4d\x0a\xc5\x12\x96\x32\x91\x04\xf6\xb0\x61\x2b\xfa\xe3\x1f\x9e\x64\xbe\x87\x9d\xbe\x92\xc2\x92\x71\xe4\x5e\x5f\x8a\x94\x27\x14\x79\x90\xeb\x66\x5d\x93\x30\x58\x35\x9d\x8e\x49\x21\x06\x6e\x84\xcb\x96\x9a\x29\xec\xee\xac\x4a\x86\x48\xfc\x6b\xb9\x62\x19\x33\x18\x71\x0b\x71\xfd\xd4\x60\x2b\x01\x6c\x28\x4f\x8d\x27\x8c\xf0\x49\x67\x42\x97\xd0\x2e\xc4\x5e\x8d\x0d\x49\x25\xab\xe3\x15\xa9\x26\x3f\x5c\x5e\x90\x6f\xc8\x73\x3b\xbf\x17\xe0\x63\x59\x53\x1e\x52\xdb\x8d\x44\x2f\xcc\xa1\x5e\xbd\xf6\xc0\x61\x19\x40\x9f\x44\x2a\x3c\x86\xa7\x44\x84\x7c\x3e\xd0\x2d\xc6\xad\xd0\x5e\x77\x7c\x8c\xb1\xf3\xcc\x81\xd1\xa6\x4d\xe8\x01\x72\x0e\x8d\x13\x26\xf4\x21\x72\x0e\x40\x1c\x27\xf4\x09\xe4\x1c\xcd\x92\x7e\xd0\x4c\x4d\xe0\x48\x3f\x1c\x95\x23\x35\x55\x00\x4b\xb5\xed\xd5\x23\x69\xe6\xcc\xd0\x94\x1a\x4a\x78\x68\x3b\x4a\xd1\xe8\x08\xf2\x5b\xd8\xe0\xe3\xf1\x2b\xcd\xde\x72\x51\x3e\xa0\x8b\x6c\xca\x15\xf2\xe6\x0d\x7c\x48\x12\x3f\x79\x40\x38\x2d\x8a\x8c\x63\x80\x70\x3b\x8f\x32\x80\x19\x3c\xe4\xcd\xf4\x98\x3e\xc5\x07\x8e\x32\xcd\x32\x69\x59\xa5\x95\xea\x54\xa4\x32\x0f\x80\x3d\x9c\xa0\x55\x98\x18\x4d\xb6\x4d\x0b\x7b\x0f\xb1\x4c\x12\x52\xff\xe2\x62\x2f\xee\xea\x9c\xb1\x1d\x0b\xa6\xdd\x1c\x66\xd7\xda\xf7\xad\xe2\xe4\x77\x00\x00\x90\x8c\xae\x58\x86\xc2\x03\xa9\x24\xd2\xd9\x1a\x45\x43\xd1\x57\x33\x25\xb3\x29\xc1\x48\x1f\x64\x06\xfe\x2d\x5a\x2d\xc6\x02\xf8\x42\xd6\x02\xaf\xc5\xaf\x05\xf4\xfa\xd6\x5a\xe0\xbe\xf3\x65\xac\xa5\x0c\x4a\xa2\xce\x5a\xac\xe0\x6a\xaf\x05\x24\xc8\x97\xb0\x96\x88\x6b\xfd\x3d\x17\xa9\xbc\xd7\xd3\x99\xee\x8f\xf8\xa1\xe7\x0c\x89\x65\x3d\x86\x8b\x8d\x6e\x32\x5e\x1a\x34\x96\x36\xef\xa9\x7d\x9c\xd7\x1b\xe7\xab\x7c\xea\x2e\x8f\x0a\x40\xf7\x0a\x57\xa9\x9d\x7f\xe6\x11\x82\x34\x44\xf1\x51\xbc\xf1\xe8\x1c\x70\x93\x6b\xfa\x5a\x59\x58\x86\xd3\xec\xa6\x98\xd4\xf6\xec\xfb\x77\x37\xe7\xed\x8f\x2d\xe1\xde\x43\xca\xbd\x5d\x8f\xfd\x9d\xd0\x34\xe7\x5a\x87\x4d\xd2\x80\x5f\xb6\x82\x76\x74\xcf\xbd\x8f\x62\xc3\xcd\xb6\x5c\x2d\x13\x99\x37\xdc\x15\x0b\xcd\x37\xfa\xcc\x51\xd9\xc2\xce\xfe\xc5\x08\x5c\x2e\x32\x2e\x1a\x46\x07\x48\x60\x77\x4a\x1d\x4c\x30\xa9\x56\x00\xa8\xc7\x4c\xd3\x11\xa0\x68\xe5\xed\x41\x00\x66\x97\x72\x96\xa5\xce\x10\x81\xe1\xd8\xf6\x3c\x67\xc5\x96\x2e\x40\x60\x8c\x00\x77\x39\x63\x70\xaf\xdf\x4a\x21\x9d\x0f\x1d\x63\x8e\xdd\x55\x0a\xed\x12\x30\x09\x77\x72\xec\x5c\x46\x00\x37\x2d\x1f\x47\x61\x6d\x5d\xea\xb9\x1a\x0d\xac\x1f\xa1\x20\x40\xa0\xcb\x98\x6b\x44\xe3\x8c\xac\xac\x77\x23\x51\xf9\xfe\x2d\xec\x43\x75\xe3\x99\x88\x7e\xb8\xf9\xb8\xcf\x2c\xb7\xf1\x4c\xb8\xf7\x26\x34\xb2\xa8\x4e\xed\x95\xde\xdb\x90\x7d\xa5\x7d\x23\x1a\x3d\xbe\xdd\xfb\xd2\xd8\xad\x68\x04\x64\x9f\xb2\xfb\x24\x5d\xb7\x1f\xe8\x11\xf4\x5d\xd2\xa7\xf3\x1e\xd0\xf3\x8a\x19\x47\xce\x40\xb0\x39\xdd\x93\xd5\xd8\x71\x49\xb9\x06\xb3\x26\x38\xa5\x9b\xc4\xfb\xa1\x49\x48\xc7\xa6\xd3\x27\x3b\xe6\x31\xb0\x35\x3a\xab\xfb\xa6\xf1\x3e\xe1\x5d\x53\xd4\xb5\x4c\x31\x64\xbc\x0a\xca\x1d\xec\x7f\xe8\x42\xd7\xf9\x3f\xbc\xec\xaf\x35\x0b\x21\x31\x66\xa2\x19\x47\xee\x1b\xcc\x62\xd3\xd4\x01\x98\xce\xa2\xeb\x9a\xaf\xb6\x66\x81\x56\xae\x2d\xd7\xcd\xe4\xf0\xd3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x29\xf9\x8f\x52\x1b\x42\x2b\xf7\x73\xab\xe7\x44\x15\x73\x0c\xe4\x94\x0c\x5a\x53\x7c\x2e\x96\x91\x76\x32\x3b\x9e\x32\x92\xf2\xf5\x9a\x79\xb7\xf8\x8a\x91\x82\x2a\x9a\x33\x03\x6e\x14\x44\x2d\x74\xe1\x15\xc3\xc4\x20\xd7\x84\xfa\x5e\xb7\x55\x04\xdc\x29\xfa\x68\xb9\x21\x39\xdf\x6c\x51\xd7\x21\x94\x64\x52\x6c\x20\xa2\xcf\x4e\x21\x93\x74\xe8\x24\x02\x73\x90\x8a\xdc\x53\x95\x13\x4a\x12\x9a\x6c\xc1\x4a\x48\x05\x49\x4b\x05\x09\x9e\x86\xd1\x74\xbf\xd0\xc6\xde\xb3\xad\x76\x04\xa6\x34\xc4\xc0\xa0\x17\xba\xd3\x09\x03\xf0\xc5\x31\x12\xd9\xca\x92\xea\x98\x38\x5f\x81\x57\x0e\x9a\xe4\x37\x00\xbd\x75\xc0\xe6\x94\xfe\x83\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\x7e\xff\xe6\x9c\xd2\xdf\x79\xe6\x94\xfe\x39\xa5\x7f\x4e\xe9\x9f\x53\xfa\xe1\x99\x53\xfa\xa7\xcf\x6d\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\xc6\x33\xa7\xf4\x77\x46\x99\x53\xfa\xbf\x8c\x64\xbd\x39\xa5\xdf\x3f\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x07\xcf\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x63\x2e\xb4\x94\x0f\xa4\x5a\xc6\x64\x1d\x38\x03\x7e\x23\x56\x71\x55\xae\xd7\xf6\x86\x2a\x07\x85\xb5\x1d\xb1\x63\x89\xae\x72\xdf\x2a\x47\x97\xb3\x26\x6b\x66\x4e\x21\xad\x01\xc3\x74\xa6\x01\x75\x81\x94\x90\xd6\xa8\x98\x86\x34\x00\x41\xde\xbc\xff\x6e\xd9\x48\x7a\x18\x34\x65\x0e\xa6\x42\x8c\xc5\x1c\xc3\x6c\xde\x8b\x24\xc6\x29\x59\x23\xb6\x2f\x12\xd4\xe1\x37\xc9\xa4\xc6\x98\x02\x00\x3d\xe4\x9a\xda\x52\x21\x98\xd7\x3a\xb8\x01\x5d\x79\xc5\x98\x20\xb2\x60\x02\xfd\x50\xbe\x2d\x03\xa1\xc6\xd0\x64\xbb\xb4\xe3\x8b\x20\x54\x9f\x1d\x5a\x8d\x6e\x59\x2f\xa3\x39\x22\x57\xb1\x9c\x72\x1c\x80\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\xd5\x10\x43\x3b\xc6\x20\x06\x08\x23\xb3\x2a\x84\x81\x63\x81\xa1\x29\x1e\x62\xfa\xdd\xc6\x6a\xbf\x04\x29\x46\x03\xaf\x41\x37\x3a\x85\x84\xf6\xbc\x30\x7b\x74\xb9\xa2\xe3\x89\x2b\x6d\x48\x92\x71\x10\xff\x30\x3b\xcc\x09\x85\x51\x4e\x03\x4e\x7d\x03\xb9\xa2\xb0\x56\xed\x16\x2b\x52\x90\x1a\x85\xd1\xe8\x68\xac\x87\x71\x03\xa4\x5c\x3b\x19\xad\x87\x3c\x13\xd4\xf7\x0e\xc1\xcd\xf6\x6b\x85\xed\x4e\x61\x08\x3f\xa6\xfb\x53\x63\x90\x11\x2c\x40\xca\x93\xbb\x28\xd5\x87\x0a\x52\x8c\x7d\x9e\xcf\x69\xab\xcf\x48\x51\x25\xcb\x99\x2d\x1d\xae\xb4\xe0\x0f\xa2\x9b\x2d\x10\x81\x60\x3b\x4b\xb3\x2c\x61\x56\x85\xa6\x9d\x13\x86\xc3\x3d\xea\x28\x19\xa6\x72\x2e\xc0\x2d\xfb\x8e\x69\x4d\x37\xec\x7a\xd0\xc0\x33\xa4\x36\x81\x8d\xa7\x46\x35\x10\x42\x06\x3a\x54\xfd\x97\xda\x25\x76\x32\xc4\x10\x1a\x53\x21\x39\xce\xa5\x8a\x01\xbc\x57\xdc\xd8\x3b\x15\xd7\x98\x4b\x07\x76\xcd\xc3\x80\xcb\x61\xd0\x4d\x27\xdc\x3b\x0f\xba\x06\x69\xf9\xbb\x48\xd1\x71\xb5\x62\x64\xa5\x38\x5b\x93\x35\x17\x34\x73\x1e\xa8\x21\xfa\x82\x1c\x11\x8a\x0a\xb5\xd6\x56\x35\x95\xc2\x3b\x56\xfc\x1a\x96\xe4\x47\xb7\x08\xa3\x4a\x91\xd0\xd1\x9c\x65\x21\x53\x46\xf8\x9a\x6c\xc0\xdb\xa5\xd0\xa1\xfe\x87\x6f\xfe\xc7\x1f\xc9\x6a\x6f\x25\x22\x18\x2a\x8d\x34\x34\xab\xd0\x94\x31\xb1\xb1\x7b\x00\x0c\x62\xe8\x2c\x64\x59\x33\xfd\xd2\x63\x16\xea\xaa\xe0\xd2\x5f\x7e\x7b\xb7\x6a\x8b\xf4\xb3\x94\xed\xce\x1a\xfb\xb2\xc8\xe4\x60\x5c\x4a\xb7\x19\x4e\xbf\xf0\x1d\x51\x2f\x7b\x08\x12\x8a\x2f\x44\x90\xa4\x4f\x7e\x22\x5b\x79\x8f\x39\x98\x3d\x14\x55\xbb\xc4\x0b\x59\x94\xd9\x70\xd7\x1e\x42\xbe\xb3\x54\x0c\x78\x2a\x9d\x74\x68\x85\x33\xf6\x9e\x1c\xb8\xe8\x3b\xc0\xc3\xbc\xae\x29\xe1\xd1\xc5\xe9\xa7\x27\x5d\x3c\x94\xbb\xe4\x56\xb9\x4f\xa5\x62\x4b\xf2\x1d\xcd\xb2\x15\x4d\xee\x6e\xe5\x5b\xb9\xd1\xef\xc5\x1b\xa5\x06\xd5\x80\xd6\xbc\x33\x6a\xf9\xf2\xb6\x14\x77\xed\x56\x0b\x99\xdc\x58\x3d\xae\x28\x8d\x8f\x58\x69\xac\x6a\x00\xb0\x9f\x29\x9c\xf1\x4a\x08\x50\xd7\xcb\xa6\x86\xcd\x1e\x80\xae\x20\xe0\x89\x0a\xc2\xec\x5c\x87\x30\x6d\x29\xba\x39\x17\xdd\x24\xcb\x6f\xbf\xf9\xc3\xbf\x21\xe9\xdb\xdb\xc5\xbf\x7d\x03\xce\x7f\x7d\x8a\xcc\xc5\x72\xc6\x61\x0e\xad\x73\x9a\x65\xf6\x22\xd1\x24\x6a\xbb\xad\xcb\xd8\xde\x4d\x63\xd4\x6a\x62\x08\x33\x5a\xb9\xbb\xbd\xfd\x5b\x40\xb3\xe3\x46\xb3\x6c\x7d\x8a\xb1\x77\x55\xbe\xed\x09\x08\x8a\x13\xc7\xbb\xac\x54\xef\x8a\x86\xc7\xa9\x59\x3b\x99\x95\x39\xbb\x60\xd0\x74\x25\x62\x99\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\xad\x32\x99\xdc\x91\xd4\xfd\x08\x93\x1d\x58\x26\x78\xad\x5c\x48\x4f\xe3\x2e\x58\x45\x01\x41\x00\x9e\x8f\xe4\x79\x6a\xc7\xad\xe6\x9c\x5b\xfe\xb6\x9c\x16\x05\x34\x1a\x5b\x43\x82\xd0\x3d\x2e\x20\x70\xc7\x02\x08\xae\x93\x0e\x3d\x4e\xf7\x2d\x04\x3a\x2c\x90\x7b\xd6\x53\x7f\xe2\x37\xa0\x80\xff\xc6\x78\x91\x09\xa9\x75\xa4\x0e\xdb\xab\xd6\x86\x12\xc3\x62\x06\x4e\xe6\x93\xfb\xf0\x4c\xea\x7b\x04\x66\x85\x46\xa7\xa7\x66\xbc\x32\x25\x05\x53\x1a\x9a\xc3\x99\x8f\xb0\xa3\xaf\x33\xca\x43\x19\x5d\x84\xd4\x0d\x8f\x9e\xb6\x8c\xf1\x0e\x3c\xf5\x9e\x0c\xbe\x12\xf0\xf6\x3d\xb1\x37\x0f\x12\x38\x24\xe3\xc7\x9c\xe1\x6b\x99\xba\x4f\xe0\x90\x62\xe1\x82\x1e\x55\x4b\x47\xe4\xbe\x1f\xbd\x3d\xde\xc7\x7a\x2d\xed\xb3\x6a\xff\x52\x1d\x56\x7c\xcb\x1d\xc5\xc1\xbd\x3d\xd2\x11\x85\xa1\x27\x9d\x50\x38\x9b\x8d\x8e\x5b\xb5\x3c\x68\xa9\xd0\xb8\x09\x41\x0a\xae\x55\x19\xa7\x13\x2f\x09\xda\xb4\x2d\xd6\x1d\x58\x72\xf2\xea\xe4\xc9\xe7\x14\x17\xa9\x64\x41\x37\x23\xa5\xa3\x0e\xd6\x7a\xf8\x21\x49\x19\x2a\x18\x4c\x83\x92\x06\xbf\x83\xdb\x28\xb8\xd0\xc2\x41\xf0\x9d\x9d\xbc\x8f\xcf\x99\x69\x3d\xfa\x9c\x0a\x82\xc1\xc1\xf7\x41\x2f\x36\x21\x54\xc9\x52\xa4\xee\x7e\x5e\x19\x42\xde\x1d\x4c\xf8\x4a\x0a\x50\x72\x30\x07\x29\x10\xb6\x8a\x4f\x2b\x46\xdc\x72\x98\x97\xcb\x97\xdf\xfc\xb2\x6c\xf2\xf6\xa0\x21\x9e\xc5\xc8\x55\xc5\x26\xf1\x6c\x3c\x79\x46\xbe\xc0\x46\xf4\xac\xde\xb9\x4b\x5b\x5d\x3f\x83\xfb\xaa\x02\xf0\x27\x7b\x19\x63\x51\xa5\xf0\x08\x79\x0e\x2a\x8d\xd5\x05\x1b\x59\x09\x2f\x26\x95\x81\x89\x4b\x6b\xb7\xf7\xbb\xd5\x93\xce\x36\x1e\x62\x24\xda\xbe\xbb\x70\x98\x9a\xdc\xd7\x3d\xc7\xbc\xd5\x45\xee\x19\x79\x8e\x6f\x9e\x68\x88\x45\x7d\xf1\xe4\xed\x75\xcb\x7e\xf3\x50\x04\xf3\x28\x5b\x4b\x7f\xf3\x50\x50\xb8\x43\x17\x63\x38\x18\x51\x3a\xda\x52\x66\x18\x07\x7f\x66\x5b\xba\x63\x10\x27\xcb\x33\xaa\x06\x33\x09\x1c\x5c\x49\x6e\x70\x55\xd0\xec\x96\x89\x1d\x57\x52\x80\x9f\x6a\x47\x15\x87\x9c\x22\x68\x45\xc8\x84\xd5\x4f\x7f\xf7\xfc\xe3\xf9\x07\xf0\x0f\x84\xb3\xdd\x30\xf7\xc0\xad\xbc\xd4\x10\x83\x70\xb0\x82\xc6\x50\xf5\xc6\x8d\xcd\xb5\x67\x53\xfd\xfc\xed\xae\x00\xaf\xf3\xeb\xb1\x73\xc8\x4b\x53\xd2\xe1\x6c\x0a\x7c\xd8\x43\x92\x95\x9a\xef\x9e\x7a\xfe\xc7\x35\x9e\x4a\x2a\x7e\x06\x85\xc7\x85\x74\x5f\xf0\x01\xda\xed\x6f\xb8\x7b\xa2\xbb\xb1\xe0\x60\xd6\x13\xd2\x8c\x77\x3d\xed\x35\x2e\x9f\xe8\xaa\x36\x4e\x33\x95\xd5\x5d\x5c\x5d\xca\xc5\xe0\x2d\xa8\xaa\x0b\x99\x76\xcd\xee\x90\x9f\x75\x9c\x2b\xec\xf0\x5e\x0e\xec\x51\x60\x77\x86\xf6\x05\xbb\x36\xbf\x95\x09\xed\xa4\xfe\x77\x5a\x69\xbb\xf7\x48\x0e\x49\x58\xae\x96\x54\x6e\xaf\xcf\xa5\x76\x11\x63\x0e\x1e\x91\x82\x64\x52\x16\x2b\x9a\xdc\x75\xf7\x45\xcb\x6e\x6d\x19\x68\xb8\x4b\x37\x94\x0b\x5d\xe7\x23\x5d\x76\x22\x7f\x86\x45\x43\x26\x37\xdf\xa1\xdb\x28\xb8\x0c\xb9\x71\xde\x25\x88\x2b\x68\xcc\x1f\xaf\xe8\x8d\x9d\x85\x12\xa5\xbd\xc3\xf7\x6c\x57\x26\x37\x6f\xfb\xca\x27\x74\x06\xc7\xdc\xb4\xa3\x8e\x2d\x64\xca\x6e\x58\x06\xe7\xe2\x70\xfc\xb8\xda\xbf\x01\x2a\x6c\x2d\xe0\x02\xaa\xda\xba\x33\x72\x25\x53\x4f\x05\x32\xc5\xf0\x22\x9d\x6c\x59\x5a\x66\xe0\xaa\xe8\x9f\x7e\x0f\x6d\xca\x1d\x53\x8a\xa7\xec\x2f\x52\x48\xf5\x96\xae\x58\xd6\x99\x61\x3b\xb3\xa6\xfb\xbe\x55\x58\x1a\x9e\x93\x0a\x24\xd4\x70\xc6\x0c\xcb\x1a\xb9\x9d\xd5\x43\x36\xeb\x4f\x50\x52\x40\xbb\x6e\xc7\x0d\xc8\xda\x87\x24\xdf\x60\xcb\xd2\x77\x52\x70\x23\xc1\x99\x7e\x2d\x53\xf7\xaf\x2e\x46\x65\x55\x97\x89\xeb\xc6\x7c\x9a\x63\x0d\xea\x42\xc3\x44\xde\xc2\xd5\x2d\xcf\x99\x36\x34\x2f\x26\xe0\xab\xfe\xc6\x87\x4c\x1b\x49\x36\x99\x5c\x61\x99\x3f\xb1\x96\x2a\x61\x38\xcb\x3e\x8e\x64\xea\xcf\xb9\x00\xe4\xea\x44\xd1\xc2\xd3\x6e\x27\xde\x7a\x78\x25\x05\xb5\xfc\x36\x38\x71\xd0\xfe\x69\xf3\x9c\xa4\xac\xc8\xe4\x1e\x14\x03\xae\x1d\x08\xc8\x39\xa4\x2e\x55\x86\x3d\x24\xac\xe8\x0a\x26\x7b\xdc\x52\x96\xb1\xfe\x5a\x51\x3e\xf0\xb5\x14\x29\x53\x19\xb4\xcb\x47\x32\x9d\xb2\x1c\x99\xbe\x73\x29\xb9\xc1\x35\x5d\xd7\xef\xd5\x24\xa9\x89\x23\x36\xab\x39\x9c\x5b\xb9\x41\x71\x39\x78\xd0\xfa\x6e\x60\x8d\x5b\x97\x0f\x6c\xa9\xd1\x54\xc8\xb4\x33\xf5\xd0\x7d\x99\xd6\x43\xf6\x89\xe5\xf8\xfa\xe1\x23\xfa\xc9\x41\xed\xe2\xc6\x42\x31\x81\xb0\x74\x59\x4f\xc0\x02\xef\xd8\xde\xc5\x28\xe4\xb4\x20\xda\xc8\xa1\x3e\xd4\x68\xc4\xae\xea\x86\xa3\x68\xc1\xc4\x5f\x38\xba\xab\x7d\xdd\xc4\xdd\x48\x99\x39\xa7\xa7\x54\x6c\xd0\xe7\xa9\x98\x51\x9c\xed\x18\xa1\x6a\xc5\x8d\xa2\x6a\x5f\x25\x5c\x83\x87\x67\x0f\xdc\xce\x8a\xad\xbf\x97\x4c\xed\x41\x41\x85\xc8\x34\xd0\x84\x7b\x41\x5a\x82\x53\x0c\x84\x64\x8a\x99\x9d\xb9\x4c\xf9\xba\x45\x6d\x87\x31\x99\xfd\xc1\x16\x96\x9d\x2d\x36\x25\x4f\xd9\x59\x63\xe3\xfa\xfc\x39\x41\x65\x2d\xeb\xe5\xb4\x9f\x70\xbf\xdf\xd1\x02\x02\x5b\xe0\x6d\xbb\xbd\x48\xef\xb0\xc7\xba\xd5\x76\xdc\x65\xd8\xf6\x0e\x29\xd5\x86\x0a\xfe\x0f\xc4\x77\x42\x0d\xdb\x48\x65\xff\xf9\x5c\x27\xb2\x70\xbb\x00\xb2\xf0\x45\x03\xad\x74\x8f\x17\xee\x5e\x88\xda\x89\x4e\x70\x1c\x29\x56\x64\x3c\x69\xd5\xd0\xce\x20\x93\x17\xe0\xba\x16\xe7\x63\xf1\x32\x51\x7b\x87\xf8\x9f\xb8\x6d\x83\x3f\x15\x95\x28\xba\xa2\x39\xd3\x05\x4d\x06\x55\x82\x4e\xcc\x3b\xbc\xed\x95\x10\xc4\x86\x2b\xae\x5f\x0b\x38\x74\xe8\xef\x18\x2a\xde\x9d\x49\x0b\x9e\x9d\x62\xaa\x6b\xb2\x65\xc9\x1d\x91\xf7\x02\x34\x54\x00\x3d\x85\x15\xc1\x36\xd9\x5b\x94\x8b\x90\xe8\x43\x70\xdb\x8a\x75\xf0\x01\x7a\x21\xbc\x63\x03\xeb\x04\xf9\x1d\xf6\x0a\xb5\x15\x20\x03\xa9\x41\xb7\x2e\xef\xc8\xbf\x05\x07\xfd\xfc\xea\xa2\x5f\x7f\x0f\x58\x47\xdb\x65\xa6\x03\x13\xc1\x09\x57\xbf\xe0\x39\xc0\xdb\xc4\xd0\x4d\x14\x8f\xcc\x29\xa1\xf6\x14\x9d\x62\x34\x86\x70\x29\xdc\x1e\x84\x62\x19\xf5\xe5\x6e\x2d\x2b\xad\x8f\x5a\xff\xc2\xc7\xed\xa9\x77\x2c\x60\x52\x6a\x2d\xd7\x8e\xe7\x3d\x4c\xb0\x6e\xfb\x87\xca\x63\x51\x2d\x75\xbc\x72\x53\xc8\x8d\x11\x71\x17\xf6\x18\x89\x9c\x76\x85\xc0\xaa\xba\xb4\x46\x14\xdb\x6b\x3e\xc3\x4a\xf2\x7a\xcb\x0b\x88\x99\x0c\xcc\xda\x15\x44\x77\xd8\x26\x1f\x69\xc6\xd3\x0a\x38\x52\xd4\xa5\x38\x25\x57\xd2\xd8\xff\x79\xf3\xc0\xb5\x19\xab\xe9\x7b\x21\x99\xbe\x92\x06\xde\x7d\x12\x4a\x70\x52\x91\x08\x71\xac\xd9\x65\xf7\xdb\xab\x63\x83\x81\xfb\xe5\x5d\xae\x5d\x39\x29\x5c\x5f\x60\x11\x5c\x93\x4b\x61\xf5\x66\xb7\xf2\xaa\x20\x88\x76\xc0\x7d\x18\xa8\x90\x62\x01\x9e\x6b\x0f\x3d\x00\xb4\xda\x34\xae\x3d\x2a\xa5\x6a\xe1\x6b\x60\xa0\x00\xcc\x15\x23\x6e\x78\x30\xd8\xe2\x37\x10\x53\x54\x64\x34\x61\xa9\xaf\xa0\x40\x2d\x2e\xac\x08\xe2\x09\xc9\x99\xda\x84\xe6\x59\x58\x3e\x35\xbc\x75\xa3\xa9\x88\x13\x6a\x8a\x0c\x67\x89\x85\x8d\x43\x0b\x4b\xeb\x03\xbf\x04\xb7\x77\xc4\x28\x14\x9a\x15\xb0\xef\xfe\x4b\x1f\xf9\x64\xaa\x48\x63\x50\xe4\xbe\x39\xaa\x26\xff\x69\xd9\x29\x10\xca\x7f\x91\x82\x72\xa5\x97\xe4\xdc\x85\x0c\xf6\x8e\xd9\x7c\xdf\xd9\x81\x9a\xa0\x2d\x54\xae\x0f\x6a\xa7\x53\x41\x18\xc6\xe0\xf7\xab\x37\xeb\x8e\x44\x3b\x25\xf7\x5b\xa9\x91\x8b\x57\x3e\x8c\x67\x77\x6c\xff\xec\xb4\x75\xf2\x86\xa2\x39\x9f\x5d\x8a\x67\xa7\x95\x03\xa6\x75\x0e\xbc\x9c\x41\xd1\xfd\x0c\x7e\x7b\xb6\xec\x08\xc1\x5e\xb0\x41\xc1\xf8\x34\x15\x26\x4a\x73\x39\xf9\x6f\x6f\x1e\x0a\xa6\x38\xf4\xdc\xc9\xfe\x5b\x43\x57\xe9\x55\x65\x0c\x55\x1b\x66\x1a\x6a\xcc\xa1\xe6\x35\x6b\x25\xb3\x56\x32\x6b\x25\xb3\x56\x32\x6b\x25\x0d\xdc\xcc\x5a\xc9\xac\x95\xfc\xd6\xb5\x12\x65\xfa\xea\x48\x1e\x58\x75\x95\xcb\x4d\x04\xd3\x55\x95\x3d\x0b\x7e\x11\x91\x92\x8d\x55\x39\xa0\xd5\x96\xb3\x21\x0d\x84\xab\x34\x6b\xc2\xdc\xb3\x55\xef\x1c\x7b\x88\xa9\x50\x5c\x42\x09\xc5\x8c\x6a\x3d\x3e\x59\xf7\x36\x49\xec\xeb\x84\x6a\xcd\x37\xa2\xb6\x23\x5f\xcb\xf4\x70\x62\x81\x81\xbd\xcd\xf9\x8d\xb3\xb0\x02\x91\x8d\x4e\xc1\xc7\xbc\x34\x4c\xfb\x95\x89\x16\x65\xb3\x2f\xb2\x87\x5d\x7b\x1a\x2f\x76\x70\xc6\x85\x36\x54\x24\x18\x6f\xd8\x2d\xaf\x89\x26\x64\xb9\x26\x3f\xd7\x93\xfd\x79\x49\xde\xb4\x86\xeb\x00\x05\x1f\xc1\x4f\x42\x9a\x9f\x20\x2d\x11\xba\x84\x81\xd1\xb6\xca\x9a\x73\xee\x26\x0c\xb0\x76\xc2\xe7\xf9\xcf\xcf\x9e\xfd\xdc\x89\xf0\x18\xc4\x1e\xd8\x8e\x83\x78\xfa\x3f\xf6\x0d\xa8\x24\x8c\xfd\x24\x51\x7b\x81\xef\xda\xd5\xd6\xd6\x19\xdd\xb8\xe6\x75\x90\xf6\xd2\xc7\x6e\x6a\x1c\x4e\x31\xc8\x65\x52\xde\xad\x68\x72\x77\xc1\xb2\xae\x6b\xa3\x33\x61\x6c\x88\x94\x19\x5a\x55\x45\x4c\x98\xef\xa3\xea\x3a\x19\x81\x65\xdd\x62\x2b\xb7\xff\x99\xf4\x1f\x63\x27\xca\x58\xc5\x6f\x08\xb3\x98\x47\x65\x67\xf8\x68\x0f\x30\xda\x9c\x3e\xbc\x96\x22\x29\x95\x9d\x4f\xaf\xba\xd8\x9b\x2d\x0b\xc1\xf8\xf8\x15\x1a\xfa\xf9\x81\x9d\x1a\xfa\xa1\x18\x22\x07\x2a\x4f\x8f\x65\x31\x86\xf3\x17\x73\xfa\x70\x43\xf3\x22\xeb\x17\x2d\xed\x00\x2e\xd7\xe6\xb6\x2e\x5c\xa2\xf1\xcb\x3a\xe3\xcd\xd1\x0c\x15\x50\x33\x12\x82\x46\x7b\x11\x9f\xb3\x1c\x82\x2b\xae\xa4\x71\x9e\x14\xbf\x70\x38\x12\x6b\xca\x33\x97\x8d\xb0\x27\xf7\x10\xf6\x03\xf0\xa0\x61\xa4\x1b\xb4\x5f\x10\x6e\xa9\x70\xa9\x8d\xc2\x48\x37\x0c\x96\xc6\x03\x65\x26\xd3\xd2\x75\x11\xc6\xd8\xe1\xc3\x95\xf4\x33\xfb\xc6\xb2\x14\x33\xa5\xea\x38\x9d\x9f\xbe\x0d\x2e\x8f\x37\x7a\x0f\x20\x99\xcd\x4f\x2c\xa7\x7b\xac\xdb\xe9\x4a\x72\xac\x18\x28\x68\x2b\xc8\xc9\x9f\x48\xc6\x83\x12\x4a\xb1\x5c\x1a\xf6\x81\xd1\xb0\x37\xb5\x5d\xa7\x15\xeb\x6b\xd9\x0f\x7f\x52\x8c\xa6\xf0\x53\xab\x98\x27\x6b\x5c\xae\x3b\x13\x75\xf1\xfd\x50\xf8\xd0\xae\x31\xd9\x42\xd6\x37\x17\x84\x8a\x3d\x29\x8b\x44\xe6\x76\xa1\x8a\x65\x8c\x6a\xfc\x3b\x59\x29\x46\x21\x84\xe7\x9e\x76\x8a\xfb\x0d\xe8\x99\x9d\x06\x83\xb8\xcc\x0e\x43\x6c\x2e\xa4\xd5\x3a\xb7\x9f\x1a\x1a\x62\xab\xbb\x07\xe1\x1b\xe7\x8a\x6a\x9e\x9c\x97\x51\x49\x78\x7f\xf6\xef\x56\xfa\xc0\x0f\x1f\xde\x3e\xf6\x9a\x5b\x50\xad\xef\xa5\x8a\xad\xee\x71\x0b\x37\xda\x44\xd5\xc5\xd4\x9c\xe2\x41\x72\xe7\xcf\xa9\xbc\x33\xa1\x8c\x47\x52\x67\xfc\xfb\x7c\x05\x9c\x06\xb6\x5e\x2e\xcd\x96\x09\xe3\xdc\x65\x4f\xad\xab\x17\xbc\xc8\xf7\x2e\xd0\xaa\x9e\x2e\x69\xc2\xad\x15\xea\xc7\xd9\x7b\x3c\x44\x34\xba\x88\xeb\x20\x50\xb8\x56\x51\x6c\x25\xe5\xa1\xdc\xb1\x91\xea\x93\x91\x45\x18\xc6\x6b\xb0\x1d\x24\xff\x37\x6a\x33\xb8\x70\x47\x33\xb9\x4e\x8f\xd5\x34\x77\x9c\xdd\x9f\xb9\x88\xb9\xc5\x3d\x37\xdb\x85\x73\x85\x9e\xc1\xae\x9f\x7d\x0d\xff\x33\x82\x17\xac\x18\x72\x9e\xa6\x2e\x66\xbb\xd4\x6c\x5d\x66\xa8\xeb\xeb\x25\xa1\x05\xff\xc8\x94\x15\xcd\xa7\xe4\x8e\x8b\xf4\x94\x94\x3c\xfd\xf7\xa3\x94\xd5\x90\x3e\x79\x35\x1e\x77\x37\xc0\xd9\xf6\x55\xb7\x63\xa8\x38\x8c\xbb\x69\xaf\x20\x46\x03\xb1\x8c\x5c\xb0\x09\x52\x83\x6b\xdd\x1d\xb1\x92\xb1\x08\xe5\x98\x3a\x13\x43\x97\x5b\x12\x57\x66\xa2\xd4\x56\x8d\x0d\xd1\xd9\x2f\xc2\x17\xfc\x34\x66\xbe\x30\xf3\x85\x99\x2f\x7c\x76\xbe\x30\xf2\xc2\x8a\x51\xc5\xd4\xad\xbc\x63\x31\xd5\x4f\xf0\x6d\x62\xec\xeb\xee\x0e\x67\xd5\x2d\xc8\x0d\x79\x54\x5e\x6e\x63\xf8\xef\xf8\x50\x97\xae\xd6\x14\xbe\x73\x25\x0b\x40\xc3\x3b\xfa\x7c\x0a\x25\x1f\xf6\x3f\xa8\x01\xba\x6a\xc7\x52\x3a\x12\xb4\x97\xe9\x87\xfd\x0f\x1f\xde\x3e\x66\x3c\x3b\xd1\x0f\x2c\x61\x43\x4d\x8c\x7b\xd3\x93\xb1\xf8\x44\x23\xd5\x82\xa6\xc8\x6d\xfd\xfd\x0c\x94\xcc\xe1\xd6\x9e\x50\x97\xa9\xd1\xee\x21\x83\x48\x6e\x6d\xa4\x6a\x24\xde\x6f\xe9\x8e\x55\x4d\x18\xb0\xb2\xc7\x7a\x28\x31\x7c\x8c\xd4\x71\x57\x6e\x87\xaf\x4f\x87\x9c\x1b\xdf\x74\x3b\x0a\x95\x7f\x2b\x23\x4e\x63\x87\x09\x13\x29\x34\x60\x79\xd4\x56\xfb\x93\xf7\x8e\x9a\x64\x3b\x58\xaa\x38\xde\xbe\x1b\xc1\xbb\xda\x2e\x37\x51\x71\xb1\xca\x1b\xc8\xfe\x5e\x52\x68\x6a\x9e\xbb\x49\xb9\xb0\x4f\xbb\x19\x43\x83\xca\x2a\x9e\x10\x32\x40\x5b\xae\x3a\xe9\x2e\x9f\x8f\x41\xdc\xb0\xb5\x3c\xd3\xaf\xe1\x66\x15\xb3\x93\x6f\x6f\x08\xbe\xdc\xac\x04\x3a\x7a\x4a\xc7\xd5\x81\xa4\xd7\x00\xd5\x33\x83\x1b\x53\x26\x95\xbf\xd2\xe7\xfd\xbc\x3e\x27\x09\x53\xa6\x39\x27\x28\xaa\x00\x8e\xe1\x40\xa5\xe8\xd8\xee\x09\x76\xc1\xef\xe8\x94\x9e\xf9\xaf\xfd\x37\xcd\xa9\xc2\xa9\x6b\xcf\x71\x44\x36\x8d\xae\x20\x7e\x15\x24\x46\xe1\xea\xac\xc3\x2b\x5d\x95\x9a\x35\x56\xdf\x75\x52\x59\xe6\xb8\x52\xd6\x5f\xb2\xca\x44\x1e\xa1\x36\x45\x80\x1c\x57\xac\xc8\x34\x4c\xc7\x29\x58\x24\x46\xc9\xaa\x49\x1b\xf5\xac\x88\xe5\x78\x4d\x2c\x56\xd7\x22\xd1\xfa\x16\x89\x2e\xee\x1d\xd6\xbb\x48\x7c\xc5\x6e\xbc\x32\x4c\xd1\x54\x51\x2b\x0d\x33\x82\x2f\xe7\xa8\x3f\xfd\x7e\x45\x1e\x77\xc7\x22\x33\xf3\xf8\xd5\x33\x8f\xce\x0d\x2d\x62\x3d\xbf\x12\xce\x11\xf1\x52\x42\x87\x6f\x4d\x64\xa8\xc4\x7f\x53\x01\x72\x96\x9f\x86\xf3\x35\xa6\xe6\xcc\x54\x4e\x14\x41\x3a\x76\x36\xd1\x1a\x9d\xea\x51\xe9\x5c\xb1\x41\x58\x15\x94\xbc\x1a\x57\x98\x66\x75\xef\xe0\x99\xd5\xbd\x99\x63\x8f\x01\x9d\xd5\xbd\x59\xdd\x9b\xd5\xbd\x99\x79\x34\x9e\x59\xdd\xfb\xa5\xd4\x3d\xa6\xcc\x23\x15\xbe\x8e\x7a\xd4\xd1\xfc\xc2\x1a\x8e\xab\x68\x72\x4c\x95\x8f\x43\xb7\x11\xc5\x6e\xee\x78\xf1\x91\x29\xbe\x8e\x8d\xde\xbf\xc0\x26\xcd\x3e\x8f\xc3\xae\x89\xaf\xb1\xa2\x2c\x70\x94\x11\x5f\x63\xcc\xfe\xdf\xb1\xfd\xd3\x10\x8d\xb1\xb0\x5f\x04\x9e\xef\xd8\xfe\x66\x44\x26\x8d\xc8\xa3\xbe\x75\xfd\x62\xea\xf5\xec\xf4\xfd\xb2\xa4\xd2\xec\xf4\x1d\x5d\xc9\x67\x77\xfa\x12\x57\x82\xa9\x2f\xfa\xba\x7e\x5a\x98\xfa\xc1\x45\x59\xef\x80\x13\x57\xa5\x1b\xab\x48\x8e\xe3\x70\xa3\x91\x99\x97\x51\x9e\xd7\x5b\x8c\x9f\xf3\x47\xc2\x3b\xb3\xf0\x94\x8b\xb4\x8a\x78\x1d\x4a\xce\x7a\x74\xa1\xad\x52\x75\xe3\x1f\x1f\x51\x67\x0b\xdd\x5f\x3f\x2a\x6e\xc2\xa1\xf1\x83\x61\x9a\x58\x85\xf1\x5f\x25\x4e\x13\x16\x3a\x14\xa8\x89\x4b\x99\x23\x35\xe7\x48\xcd\x59\x38\xcf\xc2\xf9\x37\x22\x9c\xe7\x48\xcd\x99\x2f\xcc\x7c\x61\x10\x77\xbf\x51\xbe\x70\xd4\x48\xcd\xa8\x30\x49\x50\xbe\xbe\xa4\xb8\xcd\xc7\x4f\xe8\x97\x0e\xdc\xfc\x7b\xc9\x4a\x16\x1d\x06\xf7\x7f\xea\xb7\xab\x5a\x9b\xa5\x70\x9d\x10\x1a\xc1\x79\xa8\x0d\x03\xec\x41\x95\x52\xd1\x9c\x19\xa6\x1e\x5d\x25\x63\x45\x4d\xb2\xbd\x61\x22\xbd\x60\x34\xcd\xb8\x88\x95\x42\x7f\x3e\xfc\xce\x57\xd0\xc8\xdb\xe9\x6e\x78\xfb\x0a\x1c\x38\xc8\x1e\xbc\xa7\x1c\xa4\x19\xb6\x49\x7c\x9a\xeb\x98\x16\x34\xe1\x43\x0d\x7e\x3a\xeb\x78\xed\x5e\xf7\xd3\xef\x66\x4a\x1a\xe9\xbb\x37\x16\x41\x37\xb8\xde\x52\x95\xfa\x7c\xbe\x7b\x86\xe9\xb6\x24\x55\x12\x3b\xd2\x98\xed\x70\xcb\x8d\xb8\x26\xc2\x39\x7d\xf8\x33\x4d\xee\xe4\x3a\xd0\x37\xf6\x30\xf3\xd0\x7d\x70\xb8\x39\x8a\x19\xb5\x27\x29\xcb\xba\x37\xb9\xc3\x39\x05\x91\x9d\xd3\x87\x0f\x90\xb7\x1b\x5b\xa2\xe3\x5d\xf5\xc1\xe1\x94\x1a\xbd\xf5\x39\xb6\x31\x09\xe0\x1a\xe7\x4f\x91\x7a\x89\x14\x44\x31\x28\xde\x03\x86\x60\xe8\x59\x35\x6a\x96\x18\xc5\xb5\xcb\xb1\xbd\x66\xca\x92\x79\xfc\xfa\xda\xdf\x0d\x2f\x33\x94\xbf\x8a\x4f\xc1\x14\x98\x30\x9e\xbe\x14\x4b\x9a\x13\xb6\x08\xdf\x0f\x4c\x1d\x7e\x3f\x25\x7c\x19\x2c\x4a\x4f\xb1\x0f\x4d\x33\x5d\x3a\x19\xa5\xb7\x91\xc5\x70\x31\xf1\x0c\x54\x1f\xf8\xe5\xb8\x5e\xfc\xad\x33\x40\xbe\x67\x46\x93\x54\x96\xab\x2c\xa8\x1d\x58\xe1\xc4\x76\x4c\xed\xf1\xeb\xa7\x9d\x1d\x2e\xa6\xed\x8b\x7f\xbf\xda\x17\xd7\xaf\xf7\xf3\xef\xcb\x88\xae\xf2\x09\x02\xfe\x51\x34\x3e\x29\xe2\xff\x68\x81\xeb\x01\x35\x65\x8e\x5c\x9f\x43\x99\xfa\x9e\x39\x1a\x61\xe0\xf9\x92\xa3\x11\xe6\x50\xa6\x39\x94\x69\x0c\xf0\x1c\xca\x34\x33\x8f\x39\x94\x69\xf2\x4b\x73\xe4\xfa\x1c\xb9\xfe\x45\xc8\x80\x59\xdd\x1b\x7e\x7e\x63\x1c\x7b\x56\xf7\x66\x75\x6f\x0c\xf0\xac\xee\xcd\xcc\x63\x56\xf7\x26\xbf\x34\x47\xae\xcf\x91\xeb\xbd\x8b\x99\x23\xd7\xe7\x20\x98\x39\x08\xa6\x07\x77\xbf\xd1\x20\x98\x39\x72\xfd\xd1\x91\xeb\x04\xfd\x52\x1f\x18\xd4\x31\xc7\xcb\x4c\x4c\xef\x17\x3b\x29\x5f\x80\xaa\xe5\x6c\x53\x08\xa9\x1d\x9d\x3d\x80\xc3\x60\x7b\x88\x36\x53\x68\x4d\xd0\x87\xc3\xa4\x7b\x41\x73\x9e\x10\xc5\xec\xd8\x75\x64\xcc\xe0\x86\xf9\x7e\x35\xe6\xd4\x97\x52\x86\x66\x2d\x40\x09\x1e\x8d\x2e\x34\x83\x8b\x0d\xd3\x20\x59\xc9\xa5\xf1\x41\xe8\x83\x80\x7f\xfe\x13\x56\x23\xff\xc9\x2d\xff\x27\xd7\xcf\xf6\x7f\xfd\xbc\xd0\x0c\x7a\xcb\x1e\x94\xab\x6f\xa1\x67\x98\xc2\x7a\xb8\x5e\x23\xa4\xdd\x73\xbd\xfa\x4f\x67\xd0\x1e\xc7\x9c\xb5\xc0\x1f\xfc\xeb\xeb\xfe\xa9\x0e\xf1\xac\x18\xb1\x85\xed\x73\x43\x8c\xaa\x5d\xc5\x0c\x31\x62\xa4\xef\xa1\x4b\x56\x54\x63\x1f\x5d\xc5\x36\xec\x01\x2b\x99\x71\xb1\x09\xcb\x1f\x57\xaa\x9f\x70\x4d\x4e\x5c\x13\x93\x10\xe3\x8d\x62\xbb\xb9\x4c\xcb\xac\x0c\x4a\xe8\xb6\xbb\x1d\xdf\x07\x75\x88\xde\x55\x72\x6b\x4b\xf5\xb6\x12\xca\xd8\x56\xb6\xbf\x51\x40\xf3\x09\x35\x32\xc2\xa7\x51\x8a\xfc\x8f\x7f\x18\x5d\x6a\x38\x46\x82\x20\xae\xa3\x57\xfa\x81\x6d\xca\x8c\xaa\x66\x4d\x7d\xdf\x6e\x1d\xeb\xcd\x01\x73\x7a\x30\x8a\x26\x66\x44\x6c\x54\x4d\x10\xb0\x62\x5d\xba\x6c\x6d\xe5\xf3\xe5\x7f\x7b\xf1\xe4\x7d\x74\xf4\x90\x0f\x16\x49\xec\x5d\x61\xf5\x8d\x9b\x62\x7b\x81\xd4\x51\xa7\x83\x1d\x5c\x22\xd7\x8d\xfe\xd0\xdc\x2b\x33\x1d\x0c\x22\x02\xf4\xd2\x62\x97\x3d\x04\x21\x26\xb4\x30\xa5\x62\x64\xa3\x64\x59\x60\xbf\x25\xba\xa3\x3c\xb3\x77\x83\x36\x02\x7f\xf7\xf2\xc9\xe8\xd3\xac\xa0\x23\x4d\xa6\x3a\x6a\xb4\xfb\x82\xb8\x6e\x42\x2b\x66\xee\x19\x83\x2e\xb8\xf6\xae\x22\xa0\xd7\x34\x9e\x85\xe0\x3a\x91\x47\xfb\x3e\x4c\x69\x63\x5d\xff\xf3\x24\x74\x36\xe2\xd6\x05\xe3\x0f\x77\xe6\xe9\x5d\xda\xed\xc1\x21\xd6\x5e\xbb\x76\x5d\x67\xac\x92\x4d\xd8\x03\xd7\xbd\x6d\x33\x3a\x6b\xd3\xd0\x8a\x86\x43\x4b\x79\xe3\x5a\xa5\xb5\x90\x54\xea\xea\x16\x32\xdc\x74\xbe\xb5\xaa\x0a\xf7\x54\xa4\xfe\x50\x55\xc4\xdb\x06\xd4\x43\x85\x41\xd8\x5e\x19\x72\x44\x7f\x4a\xee\x18\x2b\xb0\xf1\x4e\xaa\x64\xe1\x3b\xa7\x87\x76\x66\xb4\x0b\x54\xb4\x4a\x3c\xd6\x09\x8a\x54\xf7\x30\xd8\xe2\xe8\x1d\x86\xb7\xa1\x69\x4e\xc5\xc9\x14\xd3\x65\x66\xaa\x96\x60\x76\x93\xac\x92\x61\x58\x18\x5d\x90\x02\xe7\x70\xe5\x70\x03\x0a\x04\x30\x3b\x91\xda\x4d\xda\xbb\xa8\xa0\xe6\x3b\x23\x86\x4e\xe0\x0e\x61\x0e\xf0\xb4\x93\x11\x19\x67\xde\x8f\xf9\x5f\x24\xfb\x11\xda\x6a\x7f\xe2\x2e\x41\x6e\x94\xce\x84\xe3\x3b\x03\xfd\xe4\x40\x7c\x21\x1d\x82\xdc\x6c\x3a\x87\x6f\xa0\x5d\x8d\x6f\x85\xa4\x11\x27\x45\x26\x91\x56\x69\x13\x85\xf8\x77\x2b\x24\x0f\xa7\x11\x6a\x94\x32\xac\x91\xf8\xbe\xfb\xe1\x49\x5e\x80\x02\x5e\xbf\x5c\x47\xfc\x61\x0f\x23\xe8\xfc\x62\xe7\xea\xfa\xd5\x5c\xcb\x74\x5a\x9b\x22\x80\xd0\xc7\x30\x3e\x51\x37\xfb\xb7\x38\x65\xfc\xe3\x8a\xb5\x63\x68\x9b\xa1\x97\x79\x51\x9a\xc6\xc2\x7b\x47\x76\x1d\x92\x26\x5b\x49\xda\x17\x83\x9c\x0a\xba\x61\x0b\x37\xe4\xa2\x1a\x72\x51\x19\xea\xce\x26\xb6\x9b\x27\xd5\x36\xfd\x82\x98\xfd\xe0\x29\xe3\x00\xb7\x2e\x0e\x76\x2a\x6e\x3d\x77\x83\xae\x8d\x15\x6c\xae\x89\xcc\xad\x38\x70\x09\xb2\xb5\x31\x13\x92\xa5\x7d\x23\xb6\xfe\xd5\x48\xe2\x76\x1f\x14\x43\x0a\xd2\x81\x3d\xd8\xa3\xca\x4d\xb6\x6f\xe6\x6f\x83\xcd\xe9\x9e\x6b\xe6\x9a\xec\x71\x7b\x47\x85\x64\x6d\xbb\xd8\x45\xc8\x46\x03\x7c\xe4\x8b\xa3\x88\x40\x17\x22\xab\x0b\xf5\xdc\x22\x3b\x31\xbf\x24\x75\xd3\x6b\x72\x25\xbd\xa5\x19\x04\x6b\x53\x2e\xea\xc2\xe3\x9e\x67\x77\xe6\x68\xd5\xc9\x6f\xff\xb0\x3d\x41\x45\x06\x5c\x2a\xa0\x36\x0d\xe9\xe9\x3f\xff\xbf\xdf\x2c\xfe\xc7\xff\xf7\xff\x3c\xcf\xf5\x3f\xf5\x3f\xf3\x7f\x6e\xff\x99\xfe\xf3\xfe\x9f\xfb\x17\x3f\x77\x00\x3f\xcf\x79\x96\x71\xcd\x12\x29\x52\xcb\xc2\xf1\x7f\x73\x2e\x4a\xc3\x34\xd9\xca\x52\x69\x92\xd2\xbd\x26\xf7\x8c\xdd\x69\xb2\x67\x54\xe9\x29\xfc\xdc\x21\xe9\x86\xff\x23\x2c\xfb\xde\x75\x38\x49\xca\xf5\x1d\xc1\x7c\x4f\x10\x7b\xab\x3d\x59\x65\x32\xb9\xeb\xb0\xc9\xe1\xd1\x65\x69\xd8\xb5\x62\x6b\xde\xb9\x35\x76\xf4\x65\x78\x97\x14\xf0\x72\x73\x9f\x14\xdb\x70\x6d\x98\xd2\xe4\x2f\xb7\xb7\xd7\xff\x3f\x7b\xdf\xff\xdc\xb8\x8d\xe5\xf9\xfb\xfe\x15\xa8\xce\x55\xd9\xbd\x65\xc9\x9d\xd9\xd4\xec\x54\xdf\x5c\xae\x1c\xdb\x9d\x71\x4d\x7f\xf1\x5a\xee\xa4\xea\x6e\xaf\x76\x21\x12\x92\x30\xa6\x08\x86\x00\xe5\x56\xfe\xfa\x2b\xbc\x07\x90\xa0\x44\x02\xa0\x24\xdb\xdd\x13\xf1\x97\x74\x64\xf2\x11\x00\x81\xf7\xfd\x7d\x1e\x59\xd0\x3c\xcd\xf4\xff\x75\xc2\xc4\x5b\x98\x02\xf4\xb9\x9e\xe9\xe3\x82\xba\xb1\x95\xad\x9f\xef\xde\x63\x9f\x60\x2c\xe5\xc2\x6e\xa6\xd6\x17\xa4\x5f\xb0\xcd\x8f\x04\x7c\x08\x31\x03\x35\x0d\x0e\x73\xd3\x45\x92\x26\xaa\xa2\x59\x8b\xba\x96\xc3\x4a\x8b\x6a\x55\x56\xec\x8c\x4c\xab\xed\xbd\x64\x6b\x6b\xa1\x0c\xa3\x5c\xb9\xb2\xa9\xca\x53\xa6\x99\x83\x6d\x66\xa7\x5a\xeb\x32\x26\xef\x84\xde\x65\xdd\xb5\x4f\x9a\xad\x54\x92\x91\x47\xae\x16\xe4\xbf\xf5\x99\x4d\x54\x86\xf3\xfc\xef\xf8\x4f\x56\x65\xec\xa3\xad\xf3\x8d\x6a\x8b\x5d\xdf\xdd\xd9\x05\xbb\xf9\x92\x77\x55\xc6\xa4\xd3\x0e\x7b\x6b\xfc\x37\x33\x52\xe5\x2e\x2b\xcb\x33\xf4\xb3\x4a\xad\x96\x35\xc5\xc7\x54\x6e\xe6\x64\x21\x77\xe8\x6a\xfc\xc9\x73\xb3\x1d\xb6\x8a\x5d\x8e\xdd\xb7\x8f\xdd\xb7\x8f\xdd\xb7\x8f\xdd\xb7\xb7\x9a\x01\x1f\xbb\x6f\xf7\x3f\x1f\xe5\x75\x09\xf9\x5c\x8e\xdd\xb7\x1b\x99\x71\xec\xbe\xfd\x95\x75\xdf\xd6\xfa\x4f\x94\xda\x73\xd1\x6a\x80\x63\xfc\xbb\xe8\x0d\xdc\xd4\x79\x94\x20\xa8\x54\xcf\x3a\xb6\x6e\x26\x68\x0a\xc7\x38\x63\xd0\x45\x19\x46\x20\x4d\x1e\xc6\xe7\x5c\xf1\x8c\x9c\xb2\x2f\x49\x56\xe9\xbb\x5e\xbb\x5a\xcf\xa7\xbe\xd3\xb0\x7a\x33\xfe\xd3\x0f\xe3\x37\x5d\xf7\xa2\x17\x69\xc9\xe7\x9a\x63\x00\x26\x57\xc6\xe6\x34\x59\xc3\x5b\x9b\xd4\xd4\xed\xc5\x56\x62\x63\x5a\x24\xa9\xa4\x12\x4b\xc7\xc1\x52\xeb\x7d\xd3\x35\xb9\x73\x96\x71\x4c\x3e\xd0\x87\xed\xbd\x2b\x2b\x6d\x67\x2a\x92\x0a\x26\x49\x2e\xac\x3d\xa5\xc7\x84\x36\xa5\xde\xba\xa6\x7f\xd4\x5a\x54\x24\x15\x70\xd7\x23\xc5\x2d\x3c\xdd\xa6\x68\xa6\x75\x54\xf5\x8e\xaa\xde\x51\xd5\x3b\xaa\x7a\x47\x55\xef\xa8\xea\x1d\x55\xbd\xa3\xaa\xe7\x53\xf5\xfc\x31\xa4\xf3\xd1\x08\x6e\x1a\xff\xeb\x39\x49\xc4\x72\x49\xf3\x74\x04\x98\x44\xb4\x9c\x57\x9d\x42\xdd\x27\xd5\x40\xc3\x0b\xea\x17\xf5\x3b\xe1\xf6\xfe\x37\x77\xd0\x09\x89\xd4\x99\x28\x7f\x2e\x69\xc2\x6e\x59\xc9\x45\x6f\x72\xe5\x26\x38\x08\x78\x85\x6b\x0f\xba\x4d\xd2\x80\xd1\xc1\x47\x2e\x99\x54\xa2\x64\x29\x39\x99\x89\xb2\x3f\x8f\x44\x2a\xaa\x58\x03\x24\xbb\xa4\x1c\x03\x02\x29\xee\x05\x88\x89\x68\x9a\x12\xfd\x97\x11\x89\x0c\xf0\x3e\xc4\x83\x9a\x97\x8c\x2a\x48\x5f\xa5\x39\x99\xeb\x39\x92\x02\x26\xd9\xc7\x00\x83\xdc\x6d\x26\xca\x4f\x95\xa2\x73\x76\x2f\x32\x56\xd2\x3c\xe9\xcd\x13\xdd\xf4\xa2\xe3\x88\x94\x20\x0a\x9e\x04\xe7\x6d\xe3\xa9\x04\x9a\x26\x9e\xaf\xd7\xcd\xc7\x5d\x71\x82\xb0\x70\xe0\x7f\x86\x0d\xb1\xeb\x84\x40\xc1\x48\xaf\x58\x46\x7b\xb5\xaa\xce\x2f\xdf\xc4\x03\xec\xbc\x00\x54\xcb\x24\x3d\x22\x55\xdf\x24\xa8\xdd\x2b\x4a\x90\x0b\xfd\x0f\x0c\x11\xf5\x82\x71\x85\xd0\x55\x76\x38\xe8\x32\x29\x69\xc1\x6e\x72\xc5\xca\xd5\x76\x76\x74\x1b\x0c\xd9\xdc\xe4\x26\x23\x49\x96\x54\x8a\xaf\x98\xa1\x13\x1f\xfe\xc0\xb4\x78\x3f\x8b\xc1\x64\xeb\x0d\x2b\xa2\xfe\x31\xef\xf7\x7f\x6f\xad\xcd\x96\x3f\xfc\xcc\x98\xa3\x18\xe9\x9a\x32\x34\x42\x59\x4a\x78\x6e\x12\x12\x9c\x47\xba\xc2\xdf\x68\x9d\xd8\xc1\x68\xfe\xdb\xa2\x70\xce\x54\xe2\x66\x92\x9a\xe9\x9e\xff\x15\xff\x31\xd2\x23\xfe\x31\x12\xd0\xd9\xf3\xd5\xfb\xa4\x39\x14\xc7\x70\xb5\xbe\x14\xb9\x62\x5f\xb6\x18\xeb\xe6\x2a\xbb\xf7\x92\x85\xc8\x52\x49\x0a\x91\x8e\x32\xb6\x02\x3b\x09\xff\x4e\xa8\x52\x25\x9f\x42\xc4\xa7\x4b\x41\xd6\xac\x58\xe4\x4e\x1d\x8a\x64\x4a\x1b\xed\xd2\x30\xb6\x74\x23\xe3\xc3\x26\xa3\xdd\x8a\x74\x63\x08\x43\x04\xc7\x4c\xfe\x5c\x8a\xaa\xb3\x7c\xba\x35\xcb\x57\x17\x18\x09\xa6\x19\x91\x55\x61\xe3\xbe\x19\xa6\xff\xa0\x3d\x64\x4c\x20\x50\x0c\xb2\xac\x99\x48\xb7\xc8\x85\xdc\xa4\x42\xa4\x63\x32\x11\x4b\x46\x56\x22\xab\x34\x0b\x58\x17\x7a\x79\xb2\x4c\x3c\xc2\x24\xff\x5e\x4d\x59\x86\xa9\x27\x06\xee\x1b\xb4\x84\x47\x4d\x76\xc1\x8b\x3e\xb5\x03\xc6\x63\x49\x42\xe0\x48\x3f\x02\xde\x03\x80\x93\x16\xe9\x5b\xf2\x9f\x39\xf9\x1e\xd5\x03\xf1\x08\x95\x36\x3f\xdf\x5c\x81\x0b\xa3\x93\xe8\x14\xdf\xfc\x6e\x02\xcb\x45\xfe\x34\x36\x98\xb6\x6a\xce\x53\x32\xe5\xca\xe6\xc8\x9c\xe6\xec\x11\x8a\x74\x24\x49\x40\x70\xe8\x0d\xdd\xad\xe4\x2d\xea\x59\x83\xe3\xc4\x1d\xa4\x79\xcd\x6b\xf2\x6f\xf8\x9e\x82\x95\x4b\x8e\xc1\xdf\x29\xc7\xf3\xd2\x49\xf3\xd3\xdd\x49\x8a\x32\xae\x7c\x1c\x95\x8f\xa3\xd1\x68\xa4\xe7\x89\xd1\x2f\x66\xac\x07\xbb\xa6\xf0\x56\x70\x8e\x88\xd4\x94\x1d\x74\xaf\xa7\x5d\x6d\x10\xc9\xcd\x50\x30\x70\x99\xaf\xcd\x2c\xc6\xaf\x3a\x9e\x0e\xe5\x08\xfb\x73\x83\xcb\x2a\xbf\x88\xdc\x9f\x7a\x95\xf4\x07\x54\x42\x3f\x65\x6a\x13\x54\xb9\xc6\xea\x04\x93\xfc\xdc\x9c\xad\xa2\x14\x09\x93\x3d\xee\x83\xcf\x92\x49\x4d\x05\x84\x52\x9d\xf3\x69\xd6\x70\x4c\x3e\xd0\x35\xa1\x99\x34\xf1\x48\xc0\x71\xd8\x3c\x80\x84\xdc\xcc\x3a\x49\x9b\xfb\xa7\x42\x2d\xb6\x18\x87\x5e\xdd\xed\xc3\xec\x58\x7c\xdd\x14\x6d\x50\xb3\x63\x1c\x90\x05\x2e\x49\x51\xb2\x84\xa5\x2c\x4f\x6c\x35\x49\xe3\x95\xe9\x96\x95\x07\xf8\x6a\x1f\x45\x7e\x27\x44\x58\x25\xbd\xc9\x53\xa8\x1e\x74\x9a\xb9\x37\x5f\x09\x6c\x68\xfd\x39\xa9\x96\x60\xda\x92\x2e\x85\xe8\xb6\x35\x2a\xc9\x4a\xb4\xb0\x21\x34\xbe\xb5\xcf\x4d\x71\x22\x9e\x62\xbe\xd4\x8a\x12\x55\xf6\x23\x77\x9f\x4f\x41\x58\x0e\x8e\x44\xcc\x8a\x71\xbc\x89\x66\x48\x9f\x6f\xae\xc8\x1b\x72\xaa\xc7\xf4\x1a\xbe\xde\x8c\x72\x48\xdc\x04\x18\xcd\xde\x43\xdf\xcc\x8f\xcf\x2c\xd9\x71\x7d\x46\xb5\xc5\x3f\xa3\x99\x64\x67\x24\x17\x44\x56\xc9\xc2\x29\xac\xec\xa4\x69\xb9\x47\x9d\xe2\x1d\xbd\x45\xf5\xdf\xfa\x98\xf3\x6e\x5b\xb4\xd9\x8e\x7d\x74\x43\x5b\xb4\xdf\x02\xeb\xab\xec\x82\xfd\xf6\x59\xb2\x4e\xd7\xd8\x76\xf1\xd2\x81\x98\x84\x9b\x80\xa9\x37\x5f\xfb\x20\xe2\x0e\x5b\x32\x45\x21\xfd\x87\xb7\xd2\x0f\xe0\xfb\x74\xdb\xa1\x71\xdf\xac\xef\xfb\x74\xd3\x8c\xff\x66\x1d\xef\xec\xde\xc5\x2f\xc1\x56\x24\x7b\xcf\xf3\xea\x0b\x62\x1f\x87\x7d\xe9\xa0\x5e\x5e\xc3\x23\x98\xdb\xfe\xc5\xb8\xf6\xdd\x32\xab\xb6\x9e\xd2\xfd\xa1\x37\x53\x47\xda\x7b\xc4\x8a\x09\x38\x84\x5a\x6f\x81\x52\x68\x4a\x4a\x9a\xa7\x62\x69\x47\xd0\x49\xd8\x8e\x0a\x00\x3a\x69\xb2\x70\x16\x8f\xfc\x01\x84\x4c\xc8\xa3\x00\xda\x73\x94\x39\xf9\x1e\xf4\x6c\x2e\xeb\xef\x8d\x8a\x37\xba\xeb\x37\x55\x53\x9f\x07\xd6\x3b\x5e\x12\x65\x09\x8b\xfe\xc2\xf5\x76\x79\x8f\xc8\x18\x1a\x66\x76\xd0\xfa\xd1\x17\x19\x33\xdc\x10\x33\xe6\xfb\x75\xb1\x31\x66\xfd\xe8\x8b\x8c\xb9\xea\x61\xf7\x5b\x63\xd6\x72\xa1\x3d\x66\x60\xd6\xcf\x3f\x66\xaf\x5f\xd9\x35\xa9\x40\xdf\x0d\xf3\xb7\x8b\xda\xa2\xb7\x15\x18\x0d\x5b\xd3\x87\x79\xc6\x4b\xa9\xac\x08\x03\x71\xd7\x63\x87\xb4\x59\xcf\x19\x18\x66\xc6\x53\x5d\xe3\x2a\xd8\xbf\x9e\xe8\x73\xce\x97\xb4\x5c\x6b\x65\xbb\x9f\x03\xb5\x18\x66\x2e\xec\x10\xad\xa6\x82\x05\x06\xe0\x40\x5e\xfb\x17\xd6\x13\x4a\x08\x97\x1f\x86\x0a\x0f\x7d\xbe\x7c\xb9\x96\x89\xea\xf6\xe3\xb7\xad\x7f\xbc\x0f\xac\x7e\xc7\xcb\x52\x7b\x54\x52\x4b\x09\xf3\x5c\xbb\xa2\xf4\xc4\xe8\x85\x60\x0c\xdf\x8a\xd4\x78\x29\xab\x5c\xef\x0a\x51\x2a\x87\xc6\xa9\x31\x60\xb7\xe4\xcf\xeb\x4e\xaa\x4b\x3e\x5f\xa8\x5a\x2b\xcd\x68\x95\x77\x87\x6d\x62\x43\xbf\x38\xd9\xba\x09\x16\x25\x0f\xac\xcc\x59\xd6\x40\xfa\xd7\x59\x9a\xdd\x7a\x43\x38\x2e\x3b\xa0\xa7\x8c\x2d\xa8\xa1\x96\xac\x41\x42\x0b\xa1\xbc\x84\x43\x8a\x91\x03\xf8\xc5\x96\xdc\x1c\x70\x04\xa1\xa0\x96\x5e\x9f\x9e\x3f\xf5\x4b\xef\x3d\x42\x5a\x8f\x3c\x4f\xc5\xa3\x1c\xa2\x74\xfd\x8a\x8f\x58\x9d\x21\xa9\xfd\x58\x87\x50\xbc\x10\x86\x02\x4f\x08\x78\x90\x5c\xd6\x14\xa3\xba\x5a\x16\x04\x69\xbb\x01\x75\xba\x4f\x59\xea\x77\xe7\x04\xd5\xe9\x28\x73\x27\x74\x4c\xe6\x4b\x49\x2f\x4b\xfd\xbc\xe2\x34\x9b\x14\x2c\x89\x12\x85\x3f\x7f\x98\x5c\xb4\x1f\x83\x3a\xc2\x05\x2b\xd1\x2a\xd6\x7f\x27\x34\x35\xde\x9d\xde\x3d\xfc\xc8\xa6\x0b\x21\x1e\xc8\xa9\xad\xe0\x98\x73\xb5\xa8\xa6\xe3\x44\x2c\x9d\x62\x8e\x91\xe4\x73\x79\x6e\xb6\xcf\x48\x8f\xb8\x9b\x45\x11\xb0\x0a\xb3\xba\xa9\x9e\x29\x43\x95\xd6\x1a\x83\x41\x25\xf5\xa8\x61\x71\xe1\x14\xa4\x64\xea\x29\xbb\x34\x4f\xb6\xa7\x0b\x1c\x03\xa2\x8e\xc6\xa5\x5a\x47\x20\x69\x56\x2c\x28\xfa\x6b\x3d\xc1\x06\xb8\x15\x22\x4a\x0b\x91\x43\x58\x6a\xba\x36\xc9\xf6\xc6\x7d\xc1\x72\x04\x47\x6a\x8e\x81\x1e\x45\x2f\x49\xd3\xd1\x90\xcc\x32\xda\x8b\x2e\x10\x64\x19\xdb\xbb\xc1\x87\x3c\x12\xd8\x11\xb0\x44\xb6\xad\x88\x03\x7d\xe3\x9d\xc6\xe6\xe7\x41\x8b\xd8\xb3\xc6\xee\x5a\xf6\x52\x1d\xb6\xc6\x87\x59\xcb\xda\x95\x10\xbd\x84\xe0\x52\x30\x0f\xe8\xf3\x6e\xb9\x5f\x9f\x8b\xc1\xbb\x65\xb7\x5d\x0f\x5b\x75\x9e\x3d\xae\x86\x5e\xb2\x3e\x17\xc4\xa6\x81\x19\x8e\x24\x34\xd7\x6e\x9c\xd3\xab\x61\xef\xc2\x3d\x61\x8f\xf5\x9f\x2f\xbb\xf7\xa6\x4c\xb9\x5b\x6f\x49\xd7\x00\x2a\x84\x58\x66\xc6\x63\xee\x6c\xa8\x3b\x77\x1b\x3c\xe5\xe9\xdd\x29\xe2\x88\x9d\xf3\x2e\x92\x44\x54\xb9\x0a\xd6\x1d\x4f\xb6\x6e\xef\x3a\xdf\xed\xbb\xba\x1a\xd9\x54\x58\xf6\x67\x37\x75\x20\xbc\xe7\x89\x5b\xc2\x8b\x3e\x60\xdb\xbf\x43\x56\x03\x4d\x5a\x94\x03\xc5\x40\x39\xcf\x4c\x11\x50\xb2\x60\xc9\x03\x11\x8f\x79\xa3\xb3\x1f\x73\x3c\x8f\x39\x9e\xc7\x1c\xcf\x63\x8e\xe7\x31\xc7\xf3\x98\xe3\xb9\xf9\xb7\x63\x8e\x67\xfb\xfa\x03\xe7\x78\xb6\x55\x99\x28\x0d\xa6\xad\xa3\x74\xaa\x31\x06\x58\xb7\x57\x7d\x39\x2a\x23\x47\x65\xe4\xa8\x8c\x1c\x95\x91\xa3\x32\xe2\xac\xcd\x51\x19\x39\x2a\x23\x7f\x70\x65\x64\xb1\xd5\x94\xb3\xad\x79\xfc\xed\x62\x1b\xf4\xd7\xa6\xa1\x41\xb2\x12\xea\x22\x08\xa8\xe6\xa0\xa0\x76\x96\xeb\xb6\x11\xe7\x56\x88\x39\xfe\xdf\x63\x32\xe1\x4b\x9e\x51\x08\x03\x52\xa2\xe8\x1c\x30\x6a\xd0\xc1\xf4\xb7\x0b\x07\x55\x6a\x8b\x26\xbe\x56\x22\xaa\xd4\xb2\x52\xe0\xe2\xdd\x18\xe1\x98\x18\x70\x73\xf8\x1c\xf7\x74\x0e\xab\xc8\xe7\xe0\x26\xde\xa2\xc8\x67\xf0\x4e\x4c\xcb\x8d\x77\x4f\x29\x51\xd2\x79\xc0\xa3\x86\xf7\xd4\xbe\x6e\x69\x70\xce\x17\xe2\xd1\x3e\xdf\xe4\xc5\x0f\x85\x87\x01\xd6\x79\xc5\xc3\xb9\x6c\x27\xd7\xe6\xce\x5f\x20\xfb\x76\x82\x90\xa0\xf8\x11\x2d\xa4\x52\x44\xf3\x83\x89\xa2\x8a\xcd\xaa\x6c\xc2\x14\x8a\x23\x27\xe0\x06\x64\x78\x8e\x18\xaa\xed\x64\xdf\xcb\x8c\xf2\xe5\x3d\x5b\x16\x5a\x4f\xea\x66\xcc\x03\xb1\xbe\xcc\xca\x9d\x23\x7d\x79\xfe\x1d\xac\x44\xca\x3b\xcb\x7e\x42\xfa\xd6\x92\xa5\xbc\x5a\xc6\x81\x79\xff\x0a\xaa\xd5\xba\x60\x28\x9e\xf1\xfb\x21\x01\x22\x17\xa2\xca\x52\x32\xa5\xc9\x03\x51\x90\x84\xcf\x4b\x50\xbf\x3c\xcd\x08\xee\x9d\xdc\x7c\xcd\x6b\x5e\x99\x52\x89\x25\xa3\xb9\xcd\x16\x44\xff\xab\x48\xd9\xc9\x49\x9d\xd8\x6f\xde\xe9\x81\xdf\x36\x02\x5e\x33\xc1\x16\x0c\xa3\x21\xf0\x5a\xcb\xee\x0f\x6c\xa9\x47\xb7\xe7\xea\x7b\x17\x9f\xc4\x08\x54\xc9\x7f\x67\x80\x2b\x17\xf7\x11\xee\x85\xa2\x99\x53\x0f\x94\x89\x84\x66\xf5\xd7\xb0\x92\xd7\x64\x96\x79\x3c\xfe\xf6\x50\xd8\x9c\x74\xcc\xd2\xe7\xbf\x33\xc4\x54\xc4\x38\x94\x14\xa8\x3d\x27\xc0\x65\x34\xcd\x25\xac\x9a\x27\x88\x02\x5f\x06\x88\x59\x54\xc4\x4a\xea\x91\x89\xdc\x3c\x6b\x77\x4c\x3d\x80\x47\xbd\x73\x7a\x29\x9a\x72\x02\x0b\x03\x88\xbc\xd4\xd6\x05\x01\xbf\xb4\xeb\xe7\x04\x44\x16\xac\x27\xed\x9f\x98\xf0\x24\x18\x08\xd5\x12\xe4\x20\x8e\xca\x60\x51\x42\x85\x97\x1b\x71\x77\xca\x2f\xee\x3d\x1a\xa2\xb3\x8f\x73\x9e\xb5\x37\xb2\xb5\x48\xea\x85\xad\x72\x83\x00\x88\xbb\xaf\x5f\x5b\xab\x77\x65\xf7\xa6\xac\x24\x2b\x47\xf3\x8a\xa7\x07\xdb\x8e\x5e\x15\xab\x83\xa1\x45\x24\x5f\xdd\xfe\x72\x59\x0b\x80\x5e\x8e\xdb\xe6\xae\x3b\xf0\xb1\xa6\xa1\x47\xdc\x31\xba\xb8\xbd\xb1\x32\xd2\x26\xe9\x80\xa8\xc6\xdf\x58\x4a\x64\xb2\x60\x4b\x8a\x51\x1f\xcf\x31\xaa\x6d\x38\x6a\xbb\x05\x68\x13\x19\xd6\x6f\x0c\x4e\x0c\xbd\x85\x0c\x73\x4c\x44\xbe\x62\xa5\xb6\x99\x13\x31\xcf\xf9\xef\x9e\xaa\x4a\x7c\x7b\x1d\xcb\xc4\xf6\x00\x90\xa0\x05\xd8\xb4\x70\x0a\xce\xea\x08\x5d\xc9\x00\x79\xad\xca\x23\x28\x5b\x7b\xaa\x83\xed\xcd\xb9\x1a\x3f\xfc\x05\xb6\x57\x22\x96\xcb\x2a\xe7\x6a\xad\x19\x1f\x16\x63\x89\x52\x9e\xa7\x6c\xc5\xb2\x73\xc9\xe7\x23\x5a\x26\x0b\xae\x58\xa2\xaa\x92\x9d\xd3\x82\x8f\x60\x72\x39\x82\x22\x2f\xd3\xef\x6a\x40\x92\x9d\xf9\xe2\x03\xcf\xe3\xaa\x63\x4f\xfe\xce\x31\x48\x4e\x5b\x36\x63\xf3\x69\x2c\x2c\xf7\xdd\xf5\xe4\xbe\x46\x4a\xe9\x37\x6e\xb4\xf4\x32\x58\x76\x8d\x85\xde\x7c\x4c\xbd\xe0\x3c\x9f\x31\xe4\xaf\x88\x22\xee\x36\xf8\xf0\x10\xae\xfb\x13\xc9\x6a\x0a\xdc\xc6\xe9\x7f\x3f\x26\x97\x34\xcf\x05\xc8\xad\xaa\x48\x01\x41\x45\xdb\xb1\x97\x74\xc9\xb2\x4b\x2a\x3d\x50\xd1\x4f\xfc\x29\xa1\xd2\x6c\xa4\x3f\xc7\xee\x1f\xd3\x06\xd7\xe3\x3e\xe8\x44\xd1\x3c\xa5\x65\x6a\x3e\x83\x16\xfd\x96\xc0\x93\x6f\x5c\xfb\x22\xff\x54\x3d\x90\xdb\x32\x36\xcb\xe8\x04\x12\x8b\x5c\xee\x93\x32\x09\xc2\x3b\x59\x50\x68\xc7\x50\x72\xa9\x78\x82\x42\xa9\xff\x40\x63\x65\x9c\xd9\x4a\xc8\x5c\x41\x60\x11\x5a\xa9\x05\x00\xff\xec\xa6\xe1\x14\x9a\x17\x4a\xc5\x72\x35\xb2\xd2\xa5\xf9\x09\x7f\x49\xb4\x2c\xd8\xb3\x05\x49\xc2\xa4\xfc\x20\x52\x7f\x7b\xad\x0d\xe6\xdd\x3c\xd4\xd8\x96\xee\x02\x22\x55\xb2\xd4\x77\x78\xa8\xb6\x4a\x0b\x0d\x93\x5e\xd0\xd5\x70\xf8\x5d\xcf\x92\xe1\x50\x46\x30\x94\x91\xb7\xc3\xc3\xf3\xe2\xed\xeb\x3d\x8e\xa6\xd0\x80\x86\x0a\x75\x96\x92\xd1\x33\x71\xd5\x8d\x5d\x95\xd3\x42\x2e\x84\xba\xaa\x09\x7b\xa7\x02\x49\x4e\x75\x66\xc8\x1c\x0a\xce\x40\x41\xc0\xac\xa5\x14\x84\x5b\x52\x95\x25\xcb\x55\xb6\xde\x78\x87\x97\xb2\x71\x09\x83\xaf\xa1\x49\x0c\x86\xd4\x1e\x64\xfd\xb5\x33\xb1\x28\xc5\x8a\x83\xbc\xf7\xf9\x13\x09\x49\x68\x6e\x29\x6d\x0c\xc4\x25\x0b\x08\xd2\x90\x35\x89\xf5\xac\xfe\xe9\x93\x9c\x3d\xda\xad\x07\x5d\x19\x34\x21\x9b\x73\x59\xa3\x39\x58\x0f\x82\xb9\xcf\x3f\xf1\xba\x4a\x5d\xf1\x65\xe7\x24\x9b\xba\xbc\xee\xd9\x78\xa9\xb7\x66\xea\x96\xe3\x1a\xa1\x65\x8b\x78\xad\x7a\x3d\xa3\x3c\xab\x3c\xca\x2d\x71\x72\x4c\x4b\x66\xbe\x12\x05\xc7\x06\x5b\x41\xef\xb8\x1b\x54\xf0\x67\x95\xde\x22\x67\xe4\x91\x69\xfb\x3a\xef\x4a\xb9\x71\x2f\x3b\xb5\xa5\x3e\xc2\xce\xa0\x6d\xc5\xb4\x19\xde\x94\x2d\xe8\x8a\x8b\x32\xd4\x7b\x8a\x20\x23\xab\x97\x50\x8b\x7f\x2c\xb0\xf6\xf5\x6e\x88\x6d\x71\x4b\x0b\xde\x5b\xb5\xeb\x5e\x6d\x9d\xfa\xf6\x06\x6b\xab\xcd\x4e\xc7\xca\xf2\xa6\xe3\x47\x44\xb7\x16\x02\x96\x15\x00\xdd\x61\xab\xbe\xc4\x24\xf9\xba\xb4\x61\xa3\xb4\xb2\x8a\x83\x34\x1b\x13\x0c\x94\x32\xeb\x69\x37\x5e\xcb\x44\x7f\x92\x8b\xdb\x1b\x1c\x31\xe0\x28\x07\x29\xd2\x7c\x6d\x5a\xf8\xa9\x05\x2f\xd3\x51\x41\x21\x7b\x5c\x7f\xcb\xb3\xd6\x68\x6b\xc0\xf7\x00\xc9\xe8\x96\xb1\x3e\x05\xd4\x5e\xad\xef\x62\xf5\x50\x68\x42\x67\xdc\x24\xf6\x6b\x6c\xad\xf6\xa1\x46\x19\xd3\x40\x78\xbb\x1a\x60\x23\xb1\xed\x89\x47\x19\xd3\xa1\x76\x04\xeb\xed\xbd\xa1\x37\xa5\xdf\x1d\x4c\xa0\x7f\x6d\x6f\xdb\x0a\xf7\xda\x6c\x4c\xd0\x34\xaf\xa8\x03\x76\xae\x4f\xc2\xdf\x88\xa0\x1e\xde\x93\xab\x1a\x41\x9b\x8b\x0c\xe0\x4c\xfd\x9d\x35\xdc\x2b\x3e\x70\xd2\x5a\x8a\xf8\xae\xcd\xbb\x74\xdf\x08\xbe\x7f\xab\x83\xc4\xcb\x76\xe2\xd8\x5e\x9a\x60\xfb\x76\x7f\x87\x0e\xf7\x7a\xe6\x2f\x14\xd5\xc5\x23\xf8\xfa\xae\x2e\x1f\xc1\x8e\x1e\x41\xaa\xbe\x8e\x1f\x9d\xdd\x3d\x82\x14\x0f\xde\xfd\xc3\xbd\x5e\xb0\x13\x88\x7b\x45\xee\xc8\xa8\xdb\x64\x4f\xea\x8f\x7b\x75\x66\xb4\xfc\x56\xb1\x72\x4d\xc4\x8a\x59\x7f\x35\x7c\xb0\x44\xe4\x92\xa7\xd8\x88\xda\x3b\x8b\x29\x07\x78\xac\x43\x68\x6c\x31\x99\x43\xbd\xd3\x19\x92\x45\x14\xdc\x1f\xad\x2c\xa3\x81\x19\x45\xee\x15\x61\x77\x6e\x4d\x24\x3e\xd3\x28\x48\x97\xb4\x73\x91\x62\xb2\x8e\x22\x68\x0e\xcd\x4b\x72\xaf\xd8\xad\x80\x57\xb0\xf3\xb7\xbd\x76\xc8\x5d\x8a\xa2\x4b\x9c\xc2\xec\xf0\xe4\xc8\x30\xee\x4e\xa2\xf2\x9b\xdc\x6b\xa7\x5c\xa7\xc8\x89\x42\xb4\x3c\x2e\xef\x29\x92\xe2\x56\x76\x54\x64\x0e\x54\x6b\x54\xc3\x96\x33\x94\x1b\xe5\x5e\x83\xf3\xa4\x22\xa7\xbd\x91\x4d\x15\xcc\x99\x8a\x24\xdb\x9b\x59\xd5\x91\x3f\x15\x49\x32\x2e\xcb\xaa\xc9\xa5\x8a\x24\x7b\xb8\x8c\x2b\xf7\x0a\x64\x5f\xb9\x57\x24\xd7\xc5\x6b\xe0\x0e\x8b\xf3\x00\xda\x2b\xc6\x3a\xc3\xcb\xdf\xef\xbd\xb9\x2b\x22\x49\xcf\x1d\x66\x84\xb6\x1b\x3f\xa3\x40\xa6\x97\x7b\x3d\xaf\x6a\x1c\x9f\x0d\x16\x1c\x82\xcd\x16\x1b\x9c\x19\x16\x9e\x9c\x9b\x39\x16\x95\x25\x16\x24\xd9\x9b\x45\xe6\xc9\x18\x8b\xb0\xe0\xa2\x32\xca\xe2\x95\xa0\x83\x6a\xb9\x68\xa2\x5f\x66\x54\x4a\x5f\x79\x2c\xd9\xb2\x9e\x3e\xba\x85\x86\x0e\x95\x26\xaf\xc3\xc2\x5a\x64\x94\x7b\x12\x60\xc8\xee\x59\x45\x1d\x7e\x85\x44\x0f\xc1\x1f\xbb\x88\x3a\x14\x48\xef\x83\x48\xe3\x57\xa4\x79\xa4\x0e\x94\x3d\xba\x59\x48\xc6\xa1\xe2\xb8\xff\xfc\x76\x80\xbb\x7a\x0d\x2c\xc5\x3b\x9e\x31\xb9\x96\x8a\x2d\x35\x25\x6d\xae\x71\xdb\xd6\x35\x0f\x05\x1b\xf2\x24\xab\x52\xcc\xfe\x02\xb2\x60\x08\x36\x08\xcb\x14\x2a\x6a\x6d\x9c\x63\xef\x46\xd8\x38\xdf\x41\x9b\xea\x97\xfa\x11\xab\x70\x1a\x6b\xa8\x71\xf3\x85\x10\x7d\xf4\x75\x5b\xef\x0b\x24\x08\xa9\x5e\x18\x59\xe7\x32\xbc\x1f\x0f\xd1\xcc\x58\x2a\xaa\xfa\x7b\xfc\x6f\x85\x90\x55\xb5\xe5\xb1\x33\xf1\x24\x38\x16\xe5\x12\x4d\x64\xa4\xda\x3b\x74\x44\x2d\xa9\x27\x6f\x77\x9c\xd9\x42\x77\x8c\xa6\x23\xcd\x83\xfe\x48\x51\x56\xd3\x6f\x71\x97\x20\x6b\xb3\x69\x18\x24\x06\x2d\x68\x77\x2a\xca\x3f\x59\xb0\x35\xa1\x05\x4d\xb8\xf2\x1a\x8a\xc3\xb5\x91\xc8\x01\xb6\xd1\xd4\xda\x07\xc2\x7c\xca\xc6\xc9\x66\x84\x0f\x74\xc0\xcc\xd6\x21\x15\xc7\xe4\x0e\xee\x2b\x30\x13\x91\xe3\xdc\xe3\x77\xe7\xa5\x39\xc9\x97\xf6\x51\x3d\xf2\xbe\x63\xea\x9d\x03\x80\xe7\xd8\xd9\x76\x90\x00\x50\x04\x64\x97\x92\xff\xce\x40\x59\xf1\x37\x93\xd7\x0b\xd8\x8c\xcb\xc6\x38\x4d\x5f\xf0\x93\x3b\x20\x33\x51\xb4\x54\x2c\x3d\xd9\xb3\x01\x7f\x6b\x4d\x36\x59\x34\x64\xea\x35\x03\xc1\x33\x9c\x49\x92\x32\xf8\x6f\x48\x3b\x9e\x8a\x4a\x35\xb8\xf7\xc5\x2a\x09\xc5\x48\x23\x55\xe8\x8c\x4a\x75\x5b\x8a\x29\xbb\xe7\xe1\xd0\xd5\x56\xc7\x7f\xa9\x10\x02\xff\x11\x22\xdb\x53\xfc\x1e\xcd\x0e\x0a\x2b\xcf\x16\x0d\x2d\xa5\x8a\x8d\x7a\x31\x6d\xdd\x6b\x80\xc6\xaf\xe7\x76\x5f\xd2\x5c\xc2\x60\xf6\x9a\x60\x6b\x5a\x44\xd5\x44\x23\x3c\xc7\x04\xb3\xd2\x44\xce\x8c\xcc\x44\xbd\x1e\xfc\xd2\x2f\xbc\x40\x4b\x26\x65\x47\xd9\xc0\xf6\xd5\x5a\x95\xbf\x55\x4b\x9a\x8f\x4a\x46\x53\x48\x44\x36\x44\x08\x47\x48\x64\x7d\x38\xe3\xf6\x34\xa9\xf7\x75\x06\xeb\x5c\x2f\x6a\x78\x55\x06\xcc\xb1\x64\x54\xf6\xe7\xa1\xf6\x4c\xf1\x73\xce\x7f\x43\x3c\x66\x5e\x27\x8c\x4e\x19\xa1\xfa\xdf\xa5\x3a\x23\x4b\x9a\x2c\x78\x1e\xe3\x88\x00\x6e\x26\x21\x85\x4e\x2f\x96\xf1\x0f\x81\x6f\x71\xce\x57\xc6\x27\x8a\x63\x0c\x3a\xce\xf1\xaa\xb7\xe1\x89\xdc\x5a\x38\xcd\x3f\xb9\x32\x19\x1c\x92\xbc\x6a\xb1\xb7\x2e\xa0\xf3\xcd\x0b\x06\x66\x33\xa5\x59\x1c\x2f\x8e\x72\x00\x03\xb7\x3e\xe8\x87\xf5\x2b\xa0\x3b\x91\xf4\x41\x8a\x36\xd7\x00\x36\x6f\xa0\x47\x63\x0e\x02\xc2\x65\x37\xe5\x49\x7e\xc2\x63\x4d\xf9\x70\x53\x8f\xf3\x3a\x8d\x48\x40\x3d\xc7\x9b\x54\x68\x68\x83\xcc\x7b\xbf\x2e\x57\x2c\xa8\x8c\xb7\xbe\x6e\xf5\xdd\x7d\x66\x08\x90\xea\x5d\xf9\xa7\x35\xa7\x76\x29\x9d\x53\x74\xee\xad\xf7\xba\xa7\xf3\x67\x28\x9d\xb3\x79\xfb\xda\xc0\xc6\x92\x36\xc2\x67\xf0\xee\x81\x25\x6c\x6a\x41\x73\xe1\x6f\x0c\xf3\xea\x1e\xee\x21\xad\xa8\x2a\x66\x0b\x34\x3f\xa2\xfb\xbd\xe4\xa2\x92\x84\x6a\xf3\xbf\x63\x3e\x60\x46\x3a\x0b\x63\x3a\xcf\x43\x71\x89\x79\x07\xcb\x57\xbc\x14\xf9\x12\x72\xdf\xfe\x33\x47\x17\x82\x64\x89\xc2\xc9\x6e\x91\x64\x5f\x0a\x56\x72\x84\xc2\x85\x58\x76\x93\x9a\x46\x24\x9f\xe7\x7c\xc6\x13\x0a\xc9\x93\x8f\x5c\x2d\xb4\xd0\x4b\xf5\x36\x4c\x70\x0e\xb9\x50\xbc\x23\x49\x4c\x0f\x28\x5f\x93\x92\x65\x8c\x4a\xd6\x8c\x83\xcb\xd6\xfb\xea\xd2\x83\xae\xf7\x6d\x11\xb5\xef\xd7\xd6\xdf\x23\x2d\x53\x08\xee\x53\xc5\xa7\x3c\xe3\x6a\xbd\xf9\xce\x4d\xa1\xe1\xd3\x2c\xa7\x54\xb2\x9b\x65\x8f\x42\xb1\x91\xbc\x0a\x8b\xac\x1f\x30\x7b\x91\xcf\xea\xc4\x32\x9a\xdb\x44\x80\xfe\x2a\xd3\x9e\xc3\x36\x2f\x8b\x04\x4b\x03\xee\x33\x89\xad\x5b\xc3\x15\x89\x3f\xdf\xdd\x5e\x9a\x87\xde\x4f\xf0\xa1\xa6\xd7\x96\x49\xea\xbb\xbb\xbd\xb4\xbb\x44\x6b\x73\x9d\xa7\x1c\xcb\x8c\xcc\xd4\xfe\xa3\x62\x25\x67\xa5\x16\xed\xa9\x84\x22\x93\x32\x65\x29\xf6\x94\xc5\xd4\xf9\x8f\x42\xb1\xda\x74\xea\x01\x14\xac\xfb\xfd\x5f\x5e\xbc\xe3\x19\x3b\x23\x97\xac\x54\xf8\x2f\xfd\xcd\xff\xce\xd6\xfa\x7f\xd0\xf7\x8b\xfe\xd5\x3a\xc7\x76\x4c\x3a\x9b\xd6\x92\xe6\x38\x9f\x9c\x8c\x46\x7a\xc1\x46\x38\xb1\x91\xca\xe4\xe8\x5f\x4f\x4e\xc8\xe5\xfb\x1b\x42\xcb\xb9\x1c\xef\x52\xc2\x98\xc4\x55\x15\x4c\x54\x95\xd4\x61\x66\xeb\x83\xb8\xbc\x20\x89\x69\x8b\x55\x49\x56\xe7\x50\x22\xb4\x48\xaf\x27\x3e\xc6\xd6\x49\x6c\x17\xdf\x78\x93\xd6\x3e\xe1\x0e\x12\x12\x58\x87\x8d\x2e\x76\x84\x24\x2e\x78\xbd\x05\xe2\x08\x91\x6a\xdb\x6c\xf9\x60\xd9\x96\x83\xf3\x18\x5b\xce\x72\xe3\xca\x54\x83\x9d\x49\x62\xc5\xca\x15\x67\x8f\xe7\x8f\xa2\x7c\xe0\xf9\x7c\xa4\x79\xd5\x08\x65\x9f\x3c\x07\xa0\xbb\xf3\xef\xe0\x3f\x41\xd5\xe7\xfe\xd3\xd5\xa7\xb7\xe4\x22\x4d\x0d\x5b\xa9\x24\x9b\x55\x99\x39\x29\x63\xa7\x42\xed\x0c\x52\x1d\xcf\x48\xc5\xd3\xff\x1d\x97\x7d\x13\xb1\x7e\x88\xf7\xbb\xdd\x58\xcd\xbb\x86\x13\x53\x90\xfd\xb8\x60\x86\x13\x3a\xed\xa7\x89\x28\x09\x57\x32\x2a\xe6\x67\x63\xb0\x71\xb9\x4d\xfe\x2e\x25\xcd\x15\x99\x37\xea\x1d\x5f\x64\x5e\x52\x52\xb2\xde\x02\x5c\xd2\xdd\x2e\xee\x1b\x38\xa6\xe6\x74\xe0\xf4\x9c\x0e\xe9\xd8\xd7\x1c\xea\xa4\x83\x9f\x16\x8c\x50\xb4\x14\x0c\x9d\x07\x16\x0c\xb3\x1f\x8f\xfd\xb7\x76\xec\xcd\x9e\x6e\xce\x7c\x08\xbd\x06\xaf\x6f\xf5\xcc\x07\x6f\x49\xa8\xd6\x73\xa2\x34\x8b\x5b\xaa\x16\x56\xc3\xb1\x0a\x05\xdf\x02\x7f\xad\x4d\xa1\xde\x81\x0f\xe3\x1f\xc1\x2d\x92\xf4\x34\xba\xdd\x1a\xff\x44\x95\x1d\xaa\x91\x29\x55\x85\xd9\xcc\x78\x56\x8f\xab\x7f\xf8\x47\xa5\xa9\x7b\x8c\x47\xa5\xa9\xff\xfa\x27\xe1\x9e\x47\xa5\xa9\xeb\x3a\x2a\x4d\x47\xa5\xa9\xfb\xfa\x27\x39\xf6\x47\xa5\xa9\x7d\x25\xc6\x57\x34\x58\x6d\xda\x52\x36\xb6\xf4\x27\x9f\xce\x60\x5c\xcc\x87\x52\x9c\x38\x34\x1b\x2f\xd9\xe4\x81\x17\xbf\xb0\x92\xcf\xe2\x7a\xb5\x5f\x61\x93\x04\x8b\x4b\xab\xe7\x02\x2e\x51\xc5\x9c\xbe\xa4\xfe\x41\xf9\xbe\xf4\x03\x7a\xde\x76\x5d\x5a\x4c\xd8\xec\x5a\xd9\x08\xcd\xf4\x50\x2b\xfb\xc0\xd6\x13\xaf\xd4\x08\x48\x8c\xae\xf9\x1c\xd0\x67\x17\x90\x18\x4f\x22\x2d\x06\x4b\x8a\x28\x2e\x17\x92\x10\x5f\xaf\x74\x38\xb8\x64\x88\x5a\xaf\x18\x89\xf0\x14\xd2\x20\x4a\x12\xc4\x48\x81\x90\x04\xf0\x71\xff\x70\xe2\x25\x78\xeb\xa3\x3b\xfd\x7c\x96\x88\x5c\xb1\x02\xde\x09\x4b\xb3\x10\x52\x41\xb1\xf9\x61\x38\x89\x77\xc4\x3c\x2a\x1e\x74\x63\x63\x40\x0e\x6a\x1c\x6d\x35\x67\x85\x6a\xc3\x3a\xc0\x74\x46\x14\xed\xde\x3f\x34\x4f\x89\x5c\x50\x92\x88\xe5\x94\xe7\x58\xd2\x34\xb6\x1b\xc4\x72\xad\x55\x13\xb4\x94\x0a\x50\x33\x58\xc2\xa4\xa4\x3d\x58\x7a\x6e\x4b\xed\x16\xaf\xfe\x64\xf3\xe7\x1f\x72\xf1\x68\x92\xa1\x2d\x6d\x31\x33\xa1\xa0\x6e\xa9\x66\xf3\xd8\xea\x40\x93\x07\x52\xb5\x67\xe5\x33\x08\x52\xbf\x17\x49\xf7\x49\x69\x67\x32\x35\xf7\x92\x25\x74\x23\xd2\x53\x31\xb1\x2a\xc9\x53\x96\xd0\xd2\x10\x24\x22\x27\x99\x10\xc5\x94\x26\x0f\xdd\x85\x5b\x52\x6c\xf7\x16\x9f\xf2\x3c\x25\x74\x4e\x79\x2e\xb1\x6a\xee\x56\xa4\xe4\xe6\x76\x78\x5b\x6c\xdc\x47\x36\xdf\x3e\x2e\x84\xf7\x69\xfb\x19\x37\x82\x67\xf0\xc3\x2c\x2c\x23\xcf\xcd\xc4\x77\x81\xb6\xf3\x48\xa5\x5d\x25\x12\x99\x7a\xe0\x11\xa3\xa5\x51\x90\xb3\xfa\xa4\xd0\xd7\x29\x81\x0e\x2a\x7d\x82\xeb\x13\x92\x3a\x3b\x4a\x9c\xb0\x54\x09\x49\x14\x9f\x34\xe9\x93\x24\x5e\x9e\xec\x85\xdd\xd8\x48\x50\xb6\xa9\xc8\x2e\x32\x5a\x0d\x50\xd2\xaa\xee\xf1\x79\x24\xdb\x8c\x06\xd2\xd4\x34\xd3\x00\x28\x9f\xd4\x34\xdb\xb5\x18\x0a\xe7\x06\xfc\xd3\x49\xd5\xdd\xe1\x9c\xfa\x11\x33\x86\xa5\x77\x47\x28\x2d\xbb\x20\x63\x58\x54\x85\xde\xf7\x7e\x45\x88\x18\x41\xad\x24\x84\x80\xf1\xc4\x2b\x1e\x85\x74\x31\x6c\xcd\x43\x08\x17\x5b\x08\x16\xbd\x34\x43\xc8\x16\x21\xe4\x0a\x5f\x8c\xa2\x17\xd1\xe2\xa5\x11\x2b\x76\xcf\x78\xeb\x44\x85\xdf\xfa\xe4\x06\x19\xbe\x49\x09\xdb\x2d\xb5\x8d\x3c\x11\x32\x3c\x79\x12\x74\x78\x12\x42\x88\x27\xa1\xc3\xd3\x91\x35\xb8\xb5\xb4\x26\x73\x70\x43\x3b\x0c\x2c\x71\xe7\x58\x37\xdb\x80\x0e\xca\x20\xec\x53\x9c\x77\x9a\x76\x49\x13\x9e\xcf\x23\xf5\xc9\x7b\xf7\xee\x56\x2e\x18\xfe\xc1\x51\x21\x6d\x42\x5e\x8f\x31\xd2\xce\xd3\x33\x85\x87\x9b\xf9\x81\x26\xe5\xae\x2a\x12\xb1\xc4\xda\x16\xc8\xbd\xeb\x71\x87\x11\x4a\xa6\x25\xa3\x50\xb9\xf5\x48\x3b\xf5\xc1\xa3\x12\x7b\x54\x62\x23\xd6\xe8\x9b\x56\x62\x57\xfd\x00\xe3\xed\x8a\xdb\x1a\x58\xdc\x55\x0c\xb6\xac\x74\xdb\xfd\x79\x18\x63\xe9\x4f\xce\x16\x19\x43\x19\xea\x4f\x69\x6e\x77\xae\x00\x84\x50\x91\x9e\x48\xf7\xf9\xcd\x21\xf5\x14\xa2\x6d\x1d\xdc\x42\xa4\x58\xbf\x72\x5f\xd3\x82\x1a\x68\xa5\x68\xb2\x30\x68\xa6\xf8\x17\x00\xe2\xec\xfc\x00\x94\xe7\xca\xd4\x84\x50\x95\x2c\xcc\xe2\xa9\x92\x17\x19\x23\x7f\xad\xf1\x0e\xce\xd8\x6c\xc6\x12\xf5\x23\xa9\xa4\x75\xb1\xc0\xfd\xdd\xbb\xb4\x46\x1d\xf8\xab\xfd\xd7\x8f\xdb\xcb\xee\x67\x61\xf8\xbe\xee\x4d\xde\x5a\x88\x6b\xb8\xd1\xd6\x26\xd9\xf1\xc3\xb4\x90\x86\x5e\x06\x18\xeb\x18\x7b\x20\xf4\x6c\x6f\x2c\x89\x81\x1b\xa1\x25\x81\x4b\x42\x8e\xc9\xaf\x0b\x96\xbb\x1f\xd2\xe8\xeb\x06\x46\xa1\x4f\x25\x2e\x19\xf9\x28\x26\xfa\x63\x54\x19\x3b\x23\xb7\xc0\xa6\x9a\x5f\x40\x23\xf8\x28\xae\xbf\xb0\xa4\xea\xeb\x56\x12\x60\x08\xbd\x8c\xbe\x0d\x95\xd9\xc0\x1f\xe1\xbc\x5a\xf0\x47\xcd\x56\x0c\x34\x6f\x53\xc2\xac\x61\xcf\x6a\x3d\xb0\x75\xd3\x3a\xcc\x40\x2e\x01\x4c\xcc\x59\x08\xa3\xc4\xb2\x20\xc4\xaa\xf9\x9f\xa6\xca\xbd\xf1\xf0\x35\x4d\x4a\x9a\x77\x5a\x04\x8b\x5e\x18\x4b\x7d\x13\x0c\x69\x97\x85\xf5\xa3\x30\xb5\x9d\x53\x03\x3a\xcc\xd5\x3a\x52\x9f\x80\xec\xc2\x57\x72\xe0\x92\xae\x7f\xab\x68\xd6\xee\xbe\x6e\x7e\xf2\xc2\xfc\x6c\x35\xac\x7a\xe4\x59\x9a\xd0\x12\x6d\x1c\xd3\xdf\xc0\x7a\xfd\x10\xce\x3c\x01\xec\x5f\x64\x1f\x9e\x05\x86\x2f\x2f\x4d\xdd\x3e\x2d\x15\x4f\x2a\xad\x4e\xeb\xb3\x38\xef\x6d\x47\x13\xf2\x37\xd7\x1b\x72\xc2\x12\x91\xa7\x31\xcd\x18\xef\x37\x9f\xd9\xac\x02\xd2\x5a\x9a\x48\x41\x61\x30\xf5\x9e\xbd\xbb\xbc\x3e\x0e\xa7\xa6\xb1\x88\xd9\x9d\x62\x66\x79\x4a\x7d\x68\x5b\xf0\x83\xfd\x9d\x2b\xea\x0e\x5f\x46\x01\x7e\xed\x70\xe6\xfa\x54\x8e\xc9\x4f\x6b\x6b\x47\x82\x06\x89\xa0\xc0\x3d\x24\x25\x53\x67\x1b\x1d\x7c\x90\xa2\x73\xcc\x67\xa2\x64\x2b\x56\x92\xd3\x54\x80\x3b\x86\xad\x78\xa2\x5e\xf7\x6d\xbd\xff\xc3\x4a\x01\x9b\x2c\x67\x73\xaa\xf8\xaa\x06\x89\xb1\x8e\x1a\x65\x31\xa7\x25\x79\x43\x4e\x81\x98\xb6\x7b\x58\xca\xa9\x62\xd9\xfa\x75\x0f\x5d\x03\x03\x82\x90\x1f\xdd\x2f\xb7\x45\xb0\x3c\x57\x7f\xfe\xc1\xb3\x65\x78\xae\xd8\xbc\x33\x72\x0a\x43\x8d\xd8\x27\x88\x42\xd2\x62\x86\x68\xb3\x6c\x70\xc2\x5a\x1c\xf6\x82\xbc\xf5\x42\x6d\x39\xa0\x59\x4e\x69\xa9\x65\x84\x01\x9b\xff\x1f\x7a\xaf\x51\x52\xb2\x39\x9c\x23\x3c\x23\x3b\x9c\xa2\x60\xc1\xd9\x76\xd9\x5d\x8f\xc2\xd5\xa9\x6c\xb5\xeb\xce\xfc\x96\x62\xef\x38\x2d\xdc\x4c\x95\x6f\xbb\x95\x3a\x40\x55\xf0\xc6\xcd\x72\xb0\xa6\x13\x4c\xed\x80\x6a\xdd\xbf\x1d\x7f\xc0\x88\xbc\xa8\x54\x51\x29\xb7\x13\x0e\x2a\xc0\xa6\xce\xb6\xf5\xca\x26\x68\xa5\x8f\xc2\x16\xc5\x29\xd3\x82\x93\xe5\x29\x2a\x5d\x68\x06\xb4\x08\x98\x2c\x80\xa2\x23\x0b\xe0\xac\x1b\x63\x51\xf3\xfd\x39\xcb\xe1\x44\x23\x50\x3b\x29\x99\xac\x32\xf0\x71\x99\x40\x08\x74\xb4\x30\xb6\xca\x2e\x4a\xa4\x33\x44\x47\x7b\xa6\x04\x7c\x69\x5a\xcf\x03\xae\xfe\x8b\x05\x9f\x57\x0b\x6d\x9b\x76\x6c\xc5\x7a\x2e\x43\xb5\x3c\x78\xd1\x2d\x55\x8b\x88\x83\x0b\x49\x16\x66\x10\xa6\x58\xdf\x78\x2b\xa8\x32\x7c\x70\x0b\xf3\xb9\x8f\x21\x31\x7c\x33\x4b\xad\x6d\xab\x99\xa3\x21\x48\x4e\xde\xf6\xc0\x44\x04\xa4\x16\x4e\xa6\x14\x05\x9d\xc3\x9e\x8c\x98\xd3\xe6\x23\x24\x65\x8a\x95\x4b\xf0\xc3\x2f\xc4\x23\xfe\x1d\x75\x80\xc2\xdc\xd5\x6b\x9f\xd5\x9d\x71\x16\x42\x2a\x03\xd7\x6a\x17\xc8\x60\x7e\xe1\xc6\x7c\xa4\x6b\x42\x4b\x51\xe5\xa9\x51\x6b\x03\x32\xe6\xc3\xc6\x20\x3f\x8a\x1c\x18\x28\x74\x10\x74\xbb\x54\x40\xc8\x53\x51\xbd\xd9\xbf\x1f\x7f\xff\x66\xa7\x45\xec\x37\xff\xb7\x7b\x63\x80\x58\x46\x7d\x50\xcf\xce\xfa\x03\xec\x8e\xdd\xe9\xfd\x25\xa3\xe9\xa7\x3c\x8b\x51\xaa\x3f\xe0\x16\x82\x47\x00\x94\x08\x1c\xbe\xa5\xd6\xa4\xe0\xa7\xc7\x92\x2b\xe6\xa8\x07\xa7\x33\x9a\xf5\xb2\x7d\x51\x92\x2a\xaf\xd9\xcc\xeb\xb6\x86\x07\x0f\xfa\xa6\xd3\x6f\x95\xcb\x6a\xba\xe3\xf9\x32\x07\x09\xb6\x55\x73\xbc\xea\x4d\x75\xd2\xdb\xc6\xba\x05\xba\xee\x1e\x35\x77\x4a\xaf\x5e\x91\x53\xbc\x53\x2b\xc9\x42\xf4\x69\x25\x81\xcf\x65\xa6\x77\xfd\xa5\x88\x51\xd4\xaf\xbf\x14\x14\x98\x74\xf1\xe4\x73\xfd\x89\x2d\xe8\x8a\x49\x22\xd1\xbd\x9c\x41\x3a\xfa\x04\x47\x0b\x1e\x66\xa7\xfc\xb8\x8f\x38\x2d\x39\x38\x94\x6b\xe0\x30\x49\xfe\xc7\xe9\x2f\x17\x77\xff\xf5\xf1\xe2\xc3\xf5\x6b\xe0\x0a\xcc\xce\xa8\xb1\xcb\xc3\xa3\x6e\x55\x3e\x07\x3e\x8a\x1d\xb3\x5e\x61\x8f\xa9\x65\x67\xa6\xc7\xb4\xac\x54\x45\xb3\x6c\x4d\xd8\x97\x24\xab\x24\x5f\xed\x72\x12\xfb\xbd\x49\xa3\x46\x6a\x74\xfc\xad\xb3\x69\xc1\x2e\xba\x10\x42\x5c\x45\x68\x25\x51\x0a\x89\x45\xd1\x46\xdd\x63\x5b\x25\x89\xd1\x45\x36\xd5\x10\x57\xed\xd8\x9e\xb2\x55\x43\x6a\xfc\x6e\xb0\xec\x9e\x4d\xa9\x68\xdb\xc2\xfa\xab\xa4\x35\xaa\x88\xe9\xf0\x68\xdd\x4e\xeb\x6e\xcf\x32\x82\x8b\x99\x06\x5b\xf9\xda\x8d\x4e\xe4\xd6\x8f\x36\x54\xdf\xa0\x8f\xf2\x3a\xa3\x52\xf1\xe4\xa7\x4c\x24\x0f\x7a\xc6\x31\xd2\xe6\xe4\xe2\xd7\xc9\xd6\x73\xad\x19\xe6\xe4\xe2\xd7\x09\xb9\xe2\xf2\x21\xd4\x10\xc6\x46\x04\x5d\x2f\x1d\x25\x0f\xd5\x94\x65\x0c\x5a\xaf\x81\xf8\x36\xf0\x33\x56\x72\x43\x94\x41\xc8\x7e\xdf\xac\xa8\x57\x64\xdf\x06\xab\xf4\x51\x32\x9c\xea\x54\x4f\x15\x1a\x23\x75\x3b\xab\xc3\x29\x9e\x33\x79\xef\xc5\x5b\x69\x2f\xb2\x03\x0b\x69\xf1\x26\x1d\xde\x0c\xeb\xb6\x16\x15\x79\xa4\x5e\x60\x55\x25\x90\x3f\x8c\xc9\x3d\x2f\xde\x92\x6b\x9b\xd6\x65\x7c\x5d\xb3\x8d\x97\x70\xd9\x14\xd4\x7b\xa8\x4e\x9b\xbc\x3a\x63\xf0\x69\x76\x6b\x2c\x5a\x72\xfd\x85\x2e\x8b\x8c\xc9\xb7\xe4\x15\xfb\xa2\x7e\x78\x75\x46\x5e\x7d\x99\x49\xfd\x9f\x5c\xcd\xe4\x2b\x5f\x7a\xe9\xcd\xb2\x0e\x0c\x43\x97\x43\xd3\x85\x6a\xca\x0c\x29\xad\x53\x38\x8a\x81\xfb\x79\x3d\x54\x0f\xf5\xe1\x3d\xaf\xc0\xa8\x87\x56\x52\x53\x81\xe8\x60\xd0\x46\x8a\xb0\xb2\x14\x65\x6d\xf0\x38\xcb\x0d\xc2\x35\x11\x4b\x6d\x03\x71\x19\x00\xf9\x03\xff\x32\x1c\x81\xfe\x5c\xd3\x88\x14\x02\x70\x48\xf5\xeb\xe2\x64\xbb\xdd\xaf\x3e\x45\xf6\x21\xd2\xd6\x0e\x5a\x3b\xd0\xdf\x16\xcb\xec\xc0\x9b\x99\x4d\x25\x40\x97\x80\xd3\xb5\xd6\x6e\x53\xbd\xb3\x0c\x7d\xcd\x24\x7d\x5b\xa5\xd9\x65\xef\x84\xe5\xeb\xe4\x3c\x65\xab\x73\x99\xd2\xef\xcf\x60\x68\xb6\xe5\xb7\x72\xe7\xe1\xa1\x49\x25\x79\xf5\xfd\xab\x3a\x0a\x9e\xad\xcf\xdc\x19\x37\x2b\x31\x13\x65\xfd\x2a\x3f\xdc\xd1\xab\x37\xaf\xc8\xa9\x28\x61\x34\x09\xcd\x49\xc6\xe8\x8a\x59\xe3\x57\xf3\x8b\x35\x7a\x42\x5e\x77\x82\x4f\xe0\xe5\x78\x83\xfe\xed\x4f\x81\xef\xdf\xef\x11\x22\x41\x75\x9e\x74\xf6\x88\xd4\xeb\xf7\x4a\xeb\xf1\xaf\x40\xf7\x16\x65\x82\x7c\x18\x10\x05\x17\x0c\x40\x48\x35\x4d\xcf\x22\xd4\x53\xe5\x79\xdb\x0f\xa0\x95\x2c\x20\xdd\xbb\x39\x3c\x54\xb9\x24\xaf\xc0\x14\x78\xf5\x8c\x5c\x9e\x44\x66\x44\x23\xe5\x9b\xab\xd8\x95\x46\x00\x36\x72\x73\x65\xf9\xbc\x03\x3f\x96\xba\x72\x94\x70\xdf\x06\xd6\x62\xf7\xf4\x62\x49\x7f\x17\x39\xb9\xfe\x69\x62\x86\xf1\xfa\x45\x16\xc8\xc3\x8a\xfc\xf9\xe2\xa3\x7a\xf5\x3c\x8a\x72\x6f\xa2\x0d\xfd\xbd\x2a\x99\x56\x3d\x22\x34\x99\x0b\x7b\xef\xa6\xf6\xa2\x7f\x27\x57\x54\x51\x54\x62\x4c\x36\x55\xdf\xca\xd7\xb2\x50\x9f\x0b\x48\x0c\xc6\x07\x1c\x3d\x64\x47\x95\x21\x01\xae\x3f\xf7\xa3\x56\xb7\x77\xd2\xdf\xf4\x40\x2e\xf1\x39\x80\xc7\x7d\x4b\x3e\x8a\x9c\x9d\xc1\x41\x25\xfa\xa4\x9a\x7f\xfe\xaa\x0d\x72\x0f\xdb\x89\xc9\x49\xe3\xf2\xc1\x0f\x07\xbd\x15\xa5\x75\xd3\x14\xa0\x04\x13\x76\xb7\x11\x2d\xd3\x4c\x4c\x6d\xda\xf2\xbe\xe3\xfa\x7c\x77\x33\x60\x58\x9f\xef\x6e\x9e\x76\x48\x83\x94\xbf\x4d\xdd\xaf\xd1\xe2\x4c\xea\x09\xa1\x8e\x2e\xe1\xd3\x1c\xf4\xd3\x4d\x1b\xd2\x90\xde\x36\xb6\x1a\x9b\x4f\xa2\xb5\x74\xb9\xc1\x1a\xdb\x3e\x6b\xe8\xef\x89\xd8\x3e\x06\xd7\x5f\x0a\x96\xa8\x3a\x24\x4d\x26\x0b\xaa\x19\x0e\x59\x56\x99\x82\x68\x3e\x7c\x58\xfd\xa5\x7d\xe2\xbb\x60\x65\x9d\x46\x4f\x93\x04\x4e\x35\xb9\x62\x18\x5c\x4f\xdf\xda\x4e\x08\x35\x2d\xf7\x01\x9f\x9e\x61\x49\x7d\x80\x7c\xc3\xf4\x2d\x72\x2d\x82\xe9\x87\xa9\xb3\x0b\x4f\xd1\x93\x96\xdb\x3f\xf9\x88\xae\x28\xcf\xa8\x41\x35\x93\x4c\xbd\x1e\xb7\xb2\x30\x25\x2c\xc0\x5e\xc7\x7d\xa0\xfa\xb0\xe5\xb3\x23\xa7\x9a\xc2\x39\x78\x02\x5f\x8f\x6b\xcd\x81\x2c\x98\x57\xb7\x06\xeb\x1e\x15\x0f\x57\xe1\xd0\x73\x54\x26\x39\xcd\xd5\x2a\x42\x5b\xcc\x27\xb8\x43\x82\xc9\x32\x3c\xcf\x9f\x3f\xdf\xdd\xec\x2c\xb6\xfa\x4b\x2c\xb7\xc5\x16\x00\xa1\x75\x89\x2d\xf8\xc3\x84\x95\x2b\x9e\x18\x0f\x5c\x9f\x93\x35\x7f\x42\xc9\xf5\xcf\xbf\x57\x2c\x06\xc1\x00\x01\xa8\x9c\xae\xa7\x36\xb9\xb0\xd5\x7e\x0c\xbf\xe0\x24\xc8\x40\x2e\x0c\x03\x01\x69\x6a\x90\xf1\xf6\x39\xd9\xc0\x1c\x06\x4c\x04\xb8\x29\xe9\x3d\x09\x51\x6f\x0d\x9d\xb5\x66\x75\xfb\x6e\xb0\x83\xde\xe5\xbc\x25\xac\x58\xcc\x62\x32\x29\x2e\x59\xb1\x78\x37\x69\x3b\xf0\xf4\x6f\xe4\xdd\xa4\xd6\x0b\x9d\x40\x53\x7f\x83\x38\x18\xae\x44\x67\xdf\x89\x24\x19\x9f\xb1\x5e\x7c\xeb\xf0\xf9\x5a\x8a\x9c\x2b\x51\x7a\x6a\x0a\xb6\x0b\x06\x60\xb5\xc9\x07\xf3\x24\x36\x08\x49\x44\x96\x19\x94\x4f\x31\xc3\x89\x59\xd2\x9e\xfd\xd7\x61\x4e\x30\x63\x8f\x8f\x1f\xfe\x02\x06\x85\x31\x1d\xce\x71\xa1\xcf\xef\xae\x2f\xae\x3e\x5c\x8f\x97\xe9\x77\x0b\xf1\x38\x52\x62\x54\x49\x36\xe2\xaa\x5f\x1e\x05\xf1\xe7\xa3\x4a\x6b\xc3\x98\xba\x45\x6f\x3c\x68\x7b\x11\x3f\xd9\x6c\x53\xac\x32\xa5\xa6\xe8\xc2\x46\xbe\x84\x50\x67\xa4\xa4\x35\xac\x67\xc0\xa5\x33\xab\xb2\x0c\x57\x5c\x95\x8c\x9d\xb9\xfe\x10\x4f\x5f\xcc\xc3\xcb\x69\x67\x5a\xb1\x6c\xd8\xe7\x6c\x63\x25\x1b\xcc\x86\x61\x43\xf9\x6c\xfd\x27\xdd\x6a\xf1\xbc\xde\x87\x81\xd0\xbf\xaa\x93\xfa\x59\x9b\x69\x53\x18\x88\x84\x07\xb6\x26\x01\xc0\x90\x99\x28\xf5\x6e\x2b\xdb\xfb\x83\xa9\x04\xa6\x7b\x5e\x49\x56\x8e\x8d\x2c\x79\x86\x53\x19\x23\x4b\x60\x30\x77\x6c\xb6\xeb\x42\xdd\xb1\x19\xf6\x54\x6a\x37\x08\x22\xb4\x52\x0b\x96\x2b\x8e\x18\xc2\x9e\x25\x33\xcb\xd1\xb9\x72\xa6\x31\xe0\x33\x2c\x55\x1c\x52\x50\x18\x4d\xe7\xeb\x4c\xf3\xc7\xeb\x09\x90\x74\x06\xb0\x75\x2f\x5c\x8c\x3e\x18\x3b\xf1\xf5\xd2\x1e\xd2\x92\xa6\x02\xf2\x3a\x4a\xf8\x4a\x67\x71\x3e\x49\x9a\x2e\x79\xfe\x55\x1c\xc5\x90\x82\xe5\x95\xf3\x21\xf5\x89\xe7\x69\xdf\xfa\xb6\xd7\xf6\x12\xee\x6c\xeb\x4f\xf8\xb4\xf5\xab\xd7\xb1\x3f\x6a\xed\x8f\x5e\x3b\x57\xe4\x36\x36\xd8\x8e\x0c\x46\x1d\xe8\xe5\x5a\xfe\x96\x8d\xf0\xdd\xa3\x22\x6d\x56\xfc\x65\x02\x7a\xcf\xe5\xd4\xd9\x08\xc6\xbd\x80\x6b\x27\x4a\x5f\x1c\xf8\x75\xc8\x51\x15\x3a\xe8\x2a\xc6\x68\x3f\x3b\xc9\xf4\x42\x70\x13\xea\xa1\x56\x30\x1b\x7c\x8a\x06\x5a\xc9\xe7\x81\xa3\x25\x5d\x32\xc5\x4a\xcc\xb0\x33\x99\x7c\xb9\xa9\x64\xf9\x54\xb0\x7c\xa2\x68\xf2\xe0\xf1\x63\x1f\xe5\xf0\x8b\xca\xe1\xa1\x91\x30\x9b\x16\x93\xd6\xdf\x9b\xa7\x5a\xeb\x33\x61\xdc\x26\x6b\x06\x37\xf9\x57\xc8\x75\x9e\x32\xba\x15\xc0\xa8\xed\x41\xa7\x6d\x0b\xdf\xfa\x67\xf0\x3d\x99\x6c\xbd\x42\x14\x55\xd6\x5f\xdb\x02\x15\x48\x38\xf0\x1d\x85\xa5\x51\x9e\x86\x84\xb2\x1a\x26\xb2\x14\x29\x23\x53\xae\x6c\xd9\xa2\x56\x04\x12\x53\x7e\x01\x32\xd3\xb3\x0b\xa6\x75\x15\x89\x2b\x69\xb1\x1e\x61\xca\xd4\x23\x63\x39\x79\x03\xba\xc7\x9b\x7f\xff\xf7\x7f\x0f\x94\xce\x9b\xd5\x10\xe4\xcd\x9f\x7f\xf8\x61\x4c\xae\x78\x09\xad\xf2\x39\x94\x85\xd4\x09\x94\x85\x4d\xfe\xcb\x85\x22\x14\x6a\x64\x40\x50\x7b\x1d\x02\x58\xe9\xad\x65\x82\x49\x23\x5e\xf2\xf9\x02\x46\xcb\xa1\x7d\xde\x2c\xe3\x89\x82\xb7\x98\x43\x8e\xb5\xaf\xde\x71\x42\x96\x9b\xa9\xfb\x33\xf9\x27\xb0\x96\x67\x24\xe3\x0f\x8c\xcc\xe4\xcf\xa5\xa8\x8a\xa6\x0d\x32\xa6\xbf\x79\x28\x26\x34\x87\xd2\x1f\x18\x40\xf3\x55\x24\x53\xcf\x92\xc0\x10\x70\x0a\x6d\x96\x9a\x3a\xda\xc9\x19\x61\x34\x59\x68\x83\x7b\x84\x9f\xbe\xa0\xbc\xce\x9d\xbb\xa2\xaa\x2b\x91\xbf\x1e\x3f\xe4\x73\xb7\x99\x7d\xc2\x52\xe7\x80\xd9\x04\xc4\xa2\x14\xff\xc0\x8f\xcd\x73\x6f\x4a\x8c\xc3\xca\x20\xef\x10\xbe\x0c\x36\xb7\xce\x9d\x66\xb9\x0f\x6c\x0d\xdf\x46\x8b\x4a\x68\x1d\xeb\xff\xda\xb6\x98\xae\xa3\xcc\x16\xb0\xae\x52\x28\x00\xdc\x1e\xad\x57\xdd\x30\xd6\x77\x93\x6d\xa9\x77\xb7\xc4\x3d\x53\xe5\x5b\x74\x01\x1c\xcb\xa7\xc0\x18\x56\x04\x83\xa4\xb6\x2e\xd2\xc9\xe5\x84\x84\x63\xac\xf5\xb2\xf7\x9a\xef\xe4\x21\x5a\x7f\x8a\x56\xc6\x8e\x64\xaa\x32\x1f\x07\x12\xb1\xf4\x78\x99\x94\xa6\x98\x6c\x49\xcb\x07\xef\xdc\x6d\x71\xf9\x18\xb2\xc1\x65\x5d\xf8\x86\x55\x8c\x2b\x56\xf7\x21\x72\xeb\x25\xfc\xe3\x3c\x19\x8f\x4f\x90\x3d\x88\x92\x48\x45\x4b\x73\xa2\xf5\xef\xfd\xa2\x2c\xe8\x0b\x6d\x67\xe2\xd3\x42\x6f\x29\xd3\x7a\xcf\x60\x7f\xd3\x56\x96\x37\x8d\x68\x9e\xfa\x0c\x80\xe4\x66\x03\x1e\x0c\x9a\x78\x19\xe8\xee\xbd\x35\x96\x80\x88\x51\x58\xcd\x91\x31\x9f\xd5\x64\x5e\x1d\x21\x59\x0c\x0a\x54\x73\x32\x83\x54\x9d\xbd\xec\xc8\xcf\xfa\x00\x3b\x35\x27\x56\x58\x04\x49\xfa\x85\x49\xa7\xc8\x08\x4f\x3e\x28\x52\xb6\x05\x47\x90\x68\x84\x60\xc1\x2b\x4e\xbc\xe0\x15\x23\x64\xf0\xf2\xc7\x05\xf0\xda\xda\xd7\x35\x67\xc0\x23\x3e\x6b\xa4\x2e\xd4\x6a\x17\x01\xee\x80\x17\x1e\x8e\x31\xf9\x60\x38\x8b\xde\x55\x39\xa1\x53\x29\xb2\x4a\x21\xe9\xe6\x8f\x86\xed\x44\xed\x24\x18\x14\x43\xec\x24\xe4\x38\x35\x19\x87\x15\x01\xb3\x8f\xe9\x1e\x49\x02\x5c\xcb\xbc\x38\xee\xf0\x1e\x02\x44\x7a\x04\x33\x0c\x86\x8c\x02\xc8\xf2\xe1\x90\x91\xdf\x56\xfc\x5a\xed\xc4\x03\xdb\x88\x11\xdf\x35\x8c\x6b\xbb\x53\x6b\x03\x19\x42\xb6\x8d\xc0\xb5\x0d\x3b\x3d\x42\x86\x98\xe4\x31\x26\xd8\xe4\x86\x9c\x5e\xd6\xa5\x1a\x26\xb0\x4f\x6e\x72\xc5\xca\x19\x4d\xd8\x6b\xd7\x34\xf3\xe7\x0d\xd9\x4a\x89\x05\xcd\xd3\xcc\xd6\x81\x10\xf6\x45\xb1\x32\xa7\x19\xbc\x29\x2d\x39\x94\xb7\x5f\x64\xc5\x82\x5a\xf0\xa5\x9e\x4a\xb2\x08\x83\x0d\xa8\xc5\xe6\x6f\xe0\xab\x8d\xda\x9a\x3b\x9b\xde\x19\x18\x4c\x01\xc7\xef\xd7\x63\x6b\x5b\x73\xac\x37\x00\xc8\x0f\x60\x4d\x6b\x51\x95\xc6\xc1\x6e\xa1\x7c\x13\x51\x6a\x13\xac\xbb\xd2\xa9\xb9\xa8\x24\x25\x9b\x6b\x5d\x15\xf0\xb6\x4c\xcd\x6c\x56\xe9\x1f\xf6\xca\x49\x3b\x50\x5e\x9f\x93\x7b\x67\xdc\xb0\x3e\x3f\xad\x75\xd0\x6e\xa2\x4a\xea\x49\x41\x80\xcb\x28\x21\x5c\x92\x82\x4a\xe3\x46\xf1\x8b\x1e\x2a\xa5\x48\x38\x18\xd4\xce\x17\x43\x65\x1c\xd4\x8d\xba\x16\xb7\x95\xbb\x1f\xe7\xb0\x16\x80\xa4\xe2\x01\x16\x8f\x58\xe8\x5c\xa4\xec\xb6\x9a\x66\x5c\x2e\x26\x03\xbd\x91\x1f\x3b\x1e\xc5\xec\x87\xad\x18\x23\x7a\x28\x7d\x36\xc1\xa6\xef\x92\x48\x06\xdd\xa8\x57\xc8\xd0\xb5\x2a\x02\x2d\xd3\x05\x2c\x7d\xdd\x99\x69\xd2\x9d\x15\x66\x46\x6b\xce\x87\x80\x8a\x90\x8c\x19\xd4\x0a\xfd\x21\x9c\xb1\x9b\x52\x32\x44\xc9\x49\xd9\xe7\xbc\x70\x7f\xf7\x1a\xed\x59\x26\x37\x6b\x93\x2d\x73\x46\x4d\xcd\x14\x9e\x99\xdd\xc3\xf5\xc6\x0a\xaf\x05\xdf\x00\x8d\x74\x30\xd3\xda\xcb\x24\xc9\x52\x60\xd9\x51\x4e\x84\xb7\x8d\x38\x3e\x0e\x80\x42\x96\x94\x53\xef\x09\x95\xdf\xb0\xa1\xfb\xb7\xd2\xd1\xdd\xfb\xa2\xee\xde\x81\x01\x97\x89\xb1\x85\xf0\x30\xda\xca\xf1\x76\xed\xa8\x65\xf5\x61\x93\x35\x10\xb3\xd9\x2b\x04\x82\x6f\xbf\x50\xaa\xe4\xd3\x4a\xf9\x76\xd7\x30\xe8\xd7\xc8\xa5\xef\x28\x2a\x6d\xc6\x02\xaa\x03\x93\x86\x8f\x8c\x8c\x81\x99\x38\x67\x21\xe8\x24\xac\x4f\x96\xc3\xb1\x0c\xbd\x46\x08\x83\xfc\xc5\x1f\x7b\xcb\xa9\x61\xb0\x22\xa9\x6a\x80\x56\xf8\x7e\x4d\xb8\x12\xf3\xb1\x43\xdf\x22\x80\xbc\xeb\xcd\xd1\x85\xf1\xed\xa2\xd3\xa5\xe2\x31\x7f\xa4\x65\x7a\x71\xdb\x53\x3a\xd0\x56\x79\x9a\xbb\x5d\x2d\xce\x12\x21\xfa\x77\x3a\x15\x06\x3e\xb5\x10\xbd\xd5\xaa\x1d\x5e\xf8\xa3\xbf\xbd\xbd\x44\x47\x7f\xfb\x37\xe0\x6f\xd7\xf7\xa2\x5a\x95\x71\x09\x35\xf4\xad\xb3\x60\x51\x25\x7c\x0e\xa5\x61\x8e\x4e\xe7\x04\x22\x47\xdc\xcc\x89\x77\x14\x32\xbf\xf0\x13\x66\x77\x37\x5f\x6d\xa3\xef\x4f\x21\x52\x14\xaf\x07\x70\x98\x02\x1d\xaf\xf6\xda\x31\x57\x27\x81\x77\x02\x60\xb4\x18\x35\x70\x02\x13\x85\xf0\x3a\x4f\xf0\x02\xf1\x4a\xf3\x5c\x20\x6f\x96\x67\x24\xa3\x53\x96\xc9\x33\xb4\xd9\x00\xee\x4c\x2b\x20\x05\x4d\xd8\x46\x7f\xf5\x90\x1b\x2e\x76\xfa\xfa\x6a\x34\x94\xf0\xbd\xfd\x90\x5b\xa0\x6f\x26\x0b\xb6\xa4\xf0\xcf\x77\x7a\x35\x3a\x81\x30\xba\x2e\x2e\x89\x56\x0b\x14\xc3\xc2\x66\x56\x2e\x25\x11\xb3\xb3\x56\xcd\xcc\xab\xd5\xf7\xde\x72\x75\x7b\x45\x3b\xa8\x89\xfd\xfc\xfd\x28\x34\x9e\xa9\xdf\xb6\x9c\x8a\xfa\xd3\x37\xd0\xc4\xc1\xc8\x43\x73\x35\xb1\x16\x38\x96\xb8\x9e\x07\x9e\x66\x8c\x3b\x8f\x80\xb8\x9e\x45\x7e\xb5\x28\xdf\x1d\x39\x06\x01\x8e\x41\x80\x97\x0c\x02\x38\x6c\x1a\x4e\x2b\x97\xc4\x2c\x80\x1b\x18\x08\x38\xab\xf0\xda\x88\x1e\x4c\x99\xd5\xc0\xc6\x0d\x48\x9b\xde\x6b\x36\x2e\xd0\x8b\x26\xdb\x5c\x4e\x8c\x92\x9c\x9c\x8c\xc7\x27\x27\x36\x9a\x60\x36\x6e\xa5\x66\xa3\xbf\x10\x96\x27\x22\xc5\x4d\x15\x1e\xe6\x8c\x97\x52\x81\xe0\x6e\xec\x63\x77\xae\x4b\x3b\xd6\x26\xc4\x10\x8e\x2b\xc0\xd8\x0e\xd6\x71\xd3\xd6\xce\xbf\xdb\x49\xf0\x36\xe2\xb6\xae\xc1\x37\x13\xad\x31\x78\xde\x82\x5c\x0d\x4e\xab\xe9\xb5\x61\x5a\xbe\xe8\xe3\x61\x1b\x89\x90\x53\xfc\x71\x9c\x14\xd5\x99\xb9\x61\xbc\x64\x4b\x51\xae\xc3\x2c\xc2\x12\xd1\x0f\xb7\xa8\x1a\x0a\x08\x8f\x95\x54\x65\xc9\x72\xe8\xba\xf1\x24\x52\xbd\x5e\x0f\x7f\x25\x59\x73\x6d\x64\x0a\xd7\x7e\x72\xf0\xce\xd4\x32\x04\x41\x79\x31\x5b\x3a\xbc\x14\xc4\x09\x3c\xc0\x93\x2c\x5f\x91\x15\x2d\x65\x68\xa6\x64\xa8\x20\x4f\xf9\x8a\xcb\x3e\x48\x64\xcf\x44\x1b\x9f\x87\x03\xbc\x89\xfc\xcb\xec\xac\xa8\x49\x1a\x0c\xa4\x66\x57\x6d\xe8\x2e\xdf\xbf\x3a\xf4\x84\xed\x9b\x86\x7f\xda\x86\x2b\xd6\x67\xa8\x56\x5d\x0e\xfc\x5d\xe2\x35\x8f\x00\x34\x55\xfb\xdd\x41\xc5\x23\x2e\x80\xf9\x1c\x01\xca\x00\x11\x70\xf1\x5e\xf1\xa8\xe4\xfd\x6b\x73\x6f\x3b\x83\x50\xb1\x65\x21\x4a\x5a\xae\x49\x6a\xec\xf1\xb5\xf5\x62\xd0\xb2\x1f\xfe\x1d\x0a\x1f\x9d\xca\xc7\xbd\x51\x49\x60\x26\x29\x2f\x77\xcd\xdf\x5f\xb2\x94\x57\xcb\x58\xef\xc8\xaf\x00\x9a\x65\xa0\xb8\x2c\x28\x00\x92\xa8\x21\x0f\x69\xf2\xe0\xc3\xbd\x06\xa2\x76\xc9\x40\xbc\xba\xa5\x49\xaf\x5e\x6d\x00\x58\x83\x06\x0a\xf1\x34\x91\xb2\x13\xbf\xc7\xcd\x90\xc1\xf1\x38\x8e\x97\xdc\xb8\xf4\x4d\x36\xd0\xa9\xb9\xf1\x35\x11\x25\xf9\x00\xb2\x61\x60\x06\xed\xe1\x3e\x10\x89\xac\x27\xe3\xbf\x33\x68\x21\x15\x8d\x5a\x25\x14\xcd\x9c\x16\x58\x19\x74\x81\xb4\x5f\xac\x25\x55\x02\xdf\xaa\xde\xfe\x36\x1a\xa9\xbf\x98\x1e\x0f\xca\x67\x70\x76\x64\x12\xa3\x5b\x3c\x01\x74\x4a\x4d\x15\x65\xae\x87\xae\xfd\x4a\xf7\x4e\x9b\xb4\x4a\xea\xd1\x01\xb6\xbf\x7e\xda\xee\xac\x7a\x08\x8f\x1e\x04\x5f\x82\x41\x6f\xb7\x03\x58\xdb\x00\x81\x4e\x27\x76\x1d\xdd\xa6\xa3\xfe\x6a\x7a\xab\xbe\xcb\x0a\x94\x3b\x33\x32\xa3\xbc\x88\x19\x44\x69\x6a\xa1\x2f\x6b\x28\x43\xdf\x8e\xda\xd8\xf3\x39\xcf\xda\x9b\xde\x22\xd3\xd5\x0b\x5c\xe5\x26\x96\x3f\x60\x9f\x76\x6f\xd3\x4a\xb2\x72\x34\xaf\x78\x7a\xd0\x0d\x1a\xe0\xb6\xb3\x24\x82\xcf\xbe\xbb\x6c\x33\xd8\x77\x7c\x5a\x32\x72\xb9\xa0\x79\xce\x32\x47\x64\x6e\x80\x25\xf6\x39\x94\x5d\x08\xc5\x00\x82\xe2\x01\x90\x1e\xbe\x8d\x2a\xa8\x97\x84\xb6\xf9\x46\xe0\x01\xb3\x2a\x1a\x18\xb0\xf1\x98\xbc\xbb\xb4\x2d\xe7\xb3\x2a\x27\x79\xb5\x9c\x32\xcf\x69\x7a\x39\x28\xbb\x97\x2f\xec\xda\xaf\x02\x0b\x17\xf9\xd7\x5f\x3f\x46\x23\x3e\x74\x7d\xa3\x47\x51\x66\xe9\x23\x4f\x31\x45\x47\x92\x53\x4d\xf0\xf5\xcb\x83\x30\x3c\x3e\xf2\xbe\xb6\x26\x81\x89\x19\xc7\x18\x4c\x8c\xc0\xcc\x4c\xb9\x10\xd7\x12\xe9\x14\x08\xf7\x75\xe2\xd0\xd7\x35\x47\x14\x78\x7d\x9f\xd6\x89\xdc\x2e\x3b\xda\x18\xab\x97\x1d\x58\xa7\xde\xe3\xcb\x40\xf7\x37\x83\x13\x3f\xad\x8c\x8b\x46\xa8\x05\x91\x7c\x59\x65\x8a\xe6\x4c\x54\x32\x5b\x7b\xb6\xc2\xf3\x2c\x78\x48\x66\x65\xec\x0b\x6e\xdd\x18\xd9\x55\xdf\xdc\x96\x61\x00\xac\xcc\x13\xfb\x81\x5a\x42\xac\x2f\xda\x24\x31\x97\x49\x72\x91\xb3\xf4\xbc\xae\x0b\x46\x34\x6f\xc8\x76\x63\x09\x34\x45\x4f\x49\x91\x55\x73\xde\xe3\xb5\x7e\xb6\xdc\xb6\x26\x6f\x47\x6b\xea\x11\x0a\x65\x28\x85\xe1\x0f\x0c\x24\x77\xdf\x99\x55\x46\x52\x56\xb0\x3c\x05\xa8\xf0\x66\xa7\xf9\xce\x1e\x4c\x7e\xaf\x15\x36\x5e\xf0\x97\x4c\xf0\x70\x78\xdc\xf5\x17\x55\x42\x7b\xff\xa5\x66\x40\xd6\x43\xcf\x67\x84\xe6\x3e\x46\x72\xf8\x54\x9d\x6f\x5e\x84\x3e\x19\x30\xc9\x53\x25\x0d\x22\x8f\x0b\x6e\x76\x9b\xda\xd7\x9b\xc2\x67\xdf\xef\xd6\x59\x79\x51\xb8\xe3\x53\xf9\xdc\x84\x3d\xaf\x44\xd4\x77\xc9\x8e\x34\x23\x9c\x63\x3d\x93\x63\x19\xf7\x57\x99\xd7\xf7\x74\x39\x57\xb3\x4c\x24\x0f\x51\x48\x22\xef\xf0\xce\x0d\x4b\xd9\xfc\xb8\x09\x25\xa2\x6d\xe0\x9e\xe9\x76\x5b\xc6\xe6\x0c\x39\xe2\x06\x52\x0a\x0c\x79\xbd\xf9\x4b\xd1\xb7\xc3\xa5\x01\x5b\x9c\x32\xe8\x66\x5c\xe5\xbd\x98\x06\x11\x9a\x09\x55\x54\x0e\x02\x15\xdc\x44\xd4\x95\x4c\x61\x3e\x20\x00\x94\x2d\x99\xa2\x00\x27\x3a\xfa\x31\x14\x76\x34\x73\xb6\x34\xb4\x3a\x63\xe7\xdf\xb4\x74\x49\x44\x2e\x79\xca\x0c\xf5\x54\x7f\x8b\xc4\xd3\x86\x29\x0e\xae\x17\xdf\xf8\xf9\x73\x34\x4a\x80\xbe\x75\x63\xce\x75\x67\x6a\x52\x21\x96\x76\x63\x07\xf8\xe6\x3c\x73\x36\x91\xa1\xf4\x64\xbe\xa0\x79\xc2\x6e\x6b\x58\xef\x48\x88\xea\x93\x9f\x2f\xaf\xdb\x0f\xb5\x0f\xc0\xcf\x97\xd7\xff\x14\x8d\x36\xe6\x09\x6b\x20\xcf\x53\x2e\x1f\x8e\x5d\x36\xfe\x00\x5d\x36\xb6\xbe\xfa\xb7\xee\x43\x3b\xb6\xd8\xf8\x8a\x5b\x6c\x3c\x13\x8f\x22\x07\x75\x74\x16\xe9\x00\x5d\xc0\xf6\x91\x70\x9d\x14\xb7\x57\x6e\xf3\x08\x2d\x30\xc6\x00\x5f\xea\xe7\x67\x2d\xd0\x1d\x0b\x88\x0f\xcf\x3e\xdf\x22\x3e\x01\xbe\x57\x0b\x47\x3a\x64\x7f\x7a\x56\x68\x0b\xb5\x6b\xbb\x41\xe1\xb3\x2f\xd4\x3e\xc0\xe6\xb8\xcb\x76\x52\x6a\xb8\xba\x63\x45\x8f\x64\xd8\x50\x65\xf0\xd6\x0d\x3f\x21\x57\xfa\x07\x21\x39\xe4\x11\x60\xc3\xed\xba\x73\x76\xef\x67\x47\x2f\xe1\x98\x5c\x5d\xdf\xde\x5d\x5f\x5e\xdc\x5f\x5f\xbd\x25\x96\x3e\x77\x15\xd3\x31\xb9\x17\x8d\x5b\xb1\xd7\x2a\x68\xfa\xa9\x41\x3e\x64\x33\xae\x33\xc3\x36\x69\xde\xc4\x62\x01\x14\x85\xe6\xe4\x26\xe7\xaa\xce\x5a\xf2\x29\x5e\x49\x26\x72\x93\xef\xa3\x69\x1a\x8f\xe6\x9c\xab\x33\x54\xb3\x0c\xea\xfa\x82\xb5\xdf\xd1\x4b\x92\x91\x5b\xcc\xa5\x68\x7a\xcd\xee\xaa\x2f\xd5\xf9\x08\xb1\xdd\x32\x30\x92\xd0\x64\x7e\x80\x14\xd9\xee\x1b\x6b\xf1\x4d\x3c\x87\xa8\x41\x3e\x01\x9f\xc3\xc9\xf8\xc4\xaa\x46\x59\x8d\x5b\x63\x13\x5f\xeb\xd7\x75\xb6\x1c\x6e\x2e\x13\x06\x6f\xef\xaa\x31\x21\x9f\x6c\xe3\xd1\x33\xad\xdd\x6c\x80\xe3\x78\x0a\x6d\xec\x48\x9b\x48\x77\x07\x7d\x2b\xb7\x65\x35\x75\x07\xea\x4f\xf5\x01\x2a\x2b\x96\x07\xc4\x70\x14\x13\xb4\x03\x89\xfc\x86\x77\xcd\xc8\x3f\xdf\xbd\xdf\xef\xd5\x78\xae\x22\x5f\x7c\x29\x96\x4b\xae\xc8\x82\xca\x45\x5d\xd6\xd7\x64\x23\xd4\xa7\x7a\xf7\x11\x85\xf8\x5c\xb3\x54\x3b\xf1\x3a\x2c\x18\x8f\xc2\x8d\x3f\xf9\xd9\xde\xbc\x61\xb0\xd5\x3f\x6f\xa1\xc7\xfb\x38\x48\x0b\x3d\x3e\x94\x44\xd5\x07\x35\x5b\x8f\x7f\x7f\xec\x53\x96\xa7\x88\xec\x18\xdd\x90\xc5\x3e\xf0\xd1\xc1\xb7\xb2\x54\x50\x61\x81\x89\xa6\x4c\x51\x9e\xf9\x14\xbe\x66\x05\x95\x28\x44\x26\xe6\xc3\xf0\x9c\x3b\x16\xe1\x3b\xcc\xac\x1e\xd1\x91\x5e\xdd\xfd\xf4\xff\x78\x34\x79\x9b\x20\xae\x17\xa2\x99\x53\xad\x09\x43\x5e\xf6\x10\xc3\xeb\x45\x26\x7c\x50\x05\x6c\x73\x15\xfc\x2a\x6a\xd3\x60\x18\x25\x49\x53\x3f\x5c\xb0\x72\xc9\xa5\x66\x25\x9d\x9a\x99\x87\xec\x33\xee\xa3\x7d\xd4\xb5\xfa\xf4\xf5\xa9\x73\x7d\x69\xa6\x01\x06\xa7\xb9\x50\x64\x83\x6c\x68\x34\x06\x5b\xb8\xc5\xde\x8a\x92\x8d\xd8\x17\x2e\xc1\x57\x01\xb5\x0b\xa2\x6c\xa4\x77\x5f\xc4\xcd\xe9\xa0\x61\x5d\x50\xd6\x61\x85\xcf\x42\xff\xe4\x56\xc6\x92\xa7\xcb\x3e\x5e\xd6\x1d\x88\x1d\x7e\xb3\x6c\x8d\x80\xa2\x50\x8d\x8c\x0e\x02\x3a\x87\x41\x8b\xd2\xb8\xdb\x8b\x92\xaf\x78\xc6\xfa\xdb\x2c\xa9\x05\xcf\xe7\x4e\xf3\x60\x68\x75\xcc\x4c\x19\x16\xdb\x9a\x83\x3e\xbf\x52\x39\x19\x72\x3d\x64\xe1\x14\x7c\xfc\x74\x4f\x72\xa6\x89\x2d\xb8\xdc\xdb\x78\xd0\xc3\xf0\xe4\x1a\x8f\x46\x23\xf0\xa7\x9c\xfe\x43\xeb\xa5\x69\xf6\x9a\xfc\xca\xcc\xdb\xb5\x7a\xae\x4f\x7c\xa2\xc8\xe3\x42\x80\x45\x5d\x49\x33\xaf\xd0\x77\xb4\x0d\xfa\xf3\xd4\x3e\x7b\xae\x9f\xd7\x6a\x21\x0a\xbb\x16\x15\xa8\xfa\x97\xa4\x89\x1c\xee\xac\xc3\x0e\xe6\xba\xd6\x75\x5c\x2b\x6b\xce\x0e\xac\xa1\x2c\x02\xb9\xda\x50\xe9\x2a\xd7\xcb\x8c\xe7\x0f\x67\x84\x2b\xcb\xcc\xf4\x9e\x30\x29\x8c\xf9\x83\xdd\xad\x25\xa3\x19\xf2\xf4\x61\xcc\x67\x97\x6f\xbe\x17\x3f\x57\x03\x9c\xa7\xf7\xeb\x02\xb3\x1e\x6a\x56\x60\x12\x41\x36\xba\xa8\x0f\x42\xb4\x7e\xe6\x19\x07\x0d\xe3\x1d\x39\x29\x97\x71\x08\x51\x27\x37\x93\xcb\xc9\xcd\x46\x23\x2f\xfc\xad\xe5\xd6\xb7\xfc\xb0\x67\xa6\xbb\xb9\xf5\xfd\xb0\x40\x7d\x6e\xfd\x3e\x81\x08\x53\xde\x5f\xb3\x4c\x16\xb4\xb8\xa8\xd4\xe2\x8a\xcb\x44\xac\x58\xb4\x51\x63\x61\xc3\x8c\x6b\x9d\x70\xbb\x88\x48\x85\x5c\xfe\xed\xe2\x36\xb6\x87\x48\x4c\x3a\x81\x1d\xe7\x84\xc9\x01\x16\x50\xf7\x28\x0d\x8d\x83\x8f\xf1\x18\x0c\xf9\x86\x82\x21\x70\x7e\xbe\xf5\x00\x08\xcf\xb9\xe2\x54\x89\x40\x0d\x60\xdb\x2b\x50\x49\x25\x96\xe6\x28\xdc\x58\x02\x10\xd8\x06\x61\xdc\xa2\xe9\x97\xc8\x0e\x8e\x30\x07\xeb\x2a\x91\xbc\x46\xdb\xdb\x48\xc3\x3c\x23\x39\x7b\xc4\xb7\x7a\xa5\x93\x7d\xfa\xaf\x26\x89\x56\xef\x55\x9a\xfd\xf8\xf6\xaf\x4e\x18\xe5\xc7\xba\x1c\xdb\x14\xe9\x7a\x28\x36\xd0\x75\xd0\xc7\x60\x3f\x87\x07\x21\xfc\xb7\x58\xde\x63\x5c\x77\xb8\xce\xff\x51\xd1\x0c\x57\xea\xe3\xbe\xfe\xa7\xf6\x2a\x47\x0e\xc6\x7e\x6d\xbb\xba\x1f\x6b\x0f\x40\x25\x19\x48\x41\xbc\x43\x95\x34\x97\x7a\xc9\x63\x81\x9f\x4e\x4c\xd0\xeb\x84\x9c\xaa\xa4\x08\xa2\x3e\x1d\x28\x25\x1e\x07\x6b\x56\xf8\x7d\x9d\x0a\xdf\xff\xf6\x03\x46\x88\x60\x3f\xc6\x3a\x62\x5a\x03\xbd\x85\x47\xc9\x7b\x2e\x15\x66\x60\x22\x2d\x68\x94\x05\x89\xd1\xbe\x48\x5e\x4e\x6e\x6e\x01\x96\xb3\xf8\x2f\x9a\xa6\xe5\x5b\x94\x67\x16\x8c\xa4\x04\xeb\x4d\xd4\xcd\xf0\x22\xba\x27\x9d\xaa\x75\xc1\x13\x30\xd5\xee\x2f\x6f\x81\x86\x24\x7f\xf9\x33\xa2\x27\xfc\xdb\x9f\xfe\xfc\xc6\xf3\x31\x9f\x2b\x53\x7d\xa0\xbf\xe3\x19\xe3\x4d\x7b\x29\x0a\x43\x73\x23\x41\x51\x99\x34\x7d\xd6\xcc\x59\xc5\x5d\xa5\x3f\x57\xcd\xb3\x63\xd5\x99\x63\x7e\xdf\x8b\xe2\xf6\xe1\xa7\x43\x7e\xb0\x3b\x27\x41\x26\x72\xbb\xc1\x44\x88\xb7\x15\xe6\x2e\x4c\xc4\x61\x15\x3e\x85\x69\x28\x13\xd9\xdb\x5a\xe4\xbf\x75\xcf\x74\xa4\x25\x49\xcf\x5f\xdc\x95\xdf\xc5\xd2\xec\x3f\x12\xed\xa3\x80\xfc\x43\xdb\x84\x4e\xc4\x0e\x2a\x00\xae\x3e\x4e\xfe\xeb\xfd\xc5\x4f\xd7\xef\x4d\x4f\x07\x48\x21\x40\x78\x35\x4f\x04\x72\x97\xac\xaf\xf8\x93\xd4\xbd\xeb\x03\x1f\x28\x8f\x8b\xcc\x7c\xdc\xe8\xe7\x9b\x93\x8f\xbd\xcd\x7c\x07\xd6\xb4\xef\xeb\xc3\xc9\x67\x3d\x33\x7f\x02\x27\x98\xf5\xb0\xb2\x2f\xed\xaa\x0e\xbd\x18\x92\x95\x80\xfc\xf8\x64\xae\x9b\xde\x89\x92\x17\x88\x3b\xe8\x19\xe3\x2a\xa0\xe9\xe7\x99\xf1\x6e\x11\x87\x17\x5d\xc7\x90\xe4\x2f\xe3\x4b\xa1\x4e\x26\x70\xb7\x8d\x5a\xe9\x53\x82\xa9\x46\xa5\x66\xe3\x9a\x81\x33\x29\xc3\x20\x26\x9b\x3b\xec\xc5\xf6\xd1\xce\xde\xbf\x91\x19\xff\x2e\x0c\xbb\xc9\xea\x41\x96\x7c\x99\x51\xde\x83\x42\xb1\x71\x6a\xbb\x1e\xc4\x7f\x4e\xd0\x49\xd8\x0a\xc5\xd4\x75\x2a\x7d\x4c\x5c\x10\x4a\x3a\x69\xd6\xf9\x0c\xd4\x98\xb7\x80\x07\x18\xe1\xfa\x18\xf2\x05\x9b\x65\x18\xd9\x8f\xd9\xfc\x84\xbf\x24\x7a\x30\x3b\x33\x44\x78\x7a\x48\xf2\xdc\xa5\x7d\x60\xb3\xd6\xaf\x67\x99\xfc\xfa\xfa\xf6\x02\xda\x86\xe1\x85\xb0\x35\x8d\x2d\xa8\xfb\x83\xf3\x88\x3d\x57\x98\x3c\x09\x27\xfe\x75\x60\xcd\x57\xd8\xea\xdf\xdf\xfe\x09\xb1\x81\x7a\x27\xed\x74\xdc\x17\x42\x89\x7c\x70\xe2\xff\x6d\xc7\x63\xed\xf3\x8d\x77\x5c\x62\x69\x4a\xd6\xef\x1e\xa8\x49\x60\x1e\x67\x57\xbb\xdd\xde\xc6\xba\x3b\x1e\xbd\x7f\xd6\x22\xd5\x83\x41\x42\xc4\xa4\x92\xa4\xd1\xe5\x30\x37\x57\x46\x99\xb3\x25\x2f\xd2\x6c\x0e\xd2\xec\x0e\x67\x1f\x78\xe6\xeb\xcd\xc1\xdf\x5f\x9c\xa6\xbb\x75\xbd\xd4\x1f\xf4\x51\x94\xf1\x45\xe9\xb7\xad\x07\x36\x32\x14\xcc\xdf\x36\x6b\xc6\xfa\x54\xfc\xaf\xe5\x94\x4c\x20\xdc\xea\x4c\xa5\x2b\x9a\x62\xcf\x8e\xe7\x13\x77\x1d\xaa\xa8\xa3\xe3\xa1\xd9\x71\xa8\xf0\xe8\x84\x8f\x8c\x4f\xe2\x1d\xee\x30\x0d\x14\x52\xb1\x05\xce\x21\x00\xa5\xa1\x05\xce\x7b\x69\xf2\x03\x3b\xed\xfe\x62\x6e\x37\x06\xbf\xfe\x3e\x0d\xfb\xa0\xf5\x11\x0a\xa5\x62\xbd\x68\x3b\xdc\xba\x83\x65\x04\x4f\x40\x7c\xf2\x99\x28\x01\xb6\x8a\x63\xf9\x72\x03\xc9\x69\x4a\x94\xcf\x4c\xf3\x89\x25\x2d\x7a\xc1\x26\x35\x4b\x70\xa1\xcd\x77\x3c\xfe\xc3\x11\xfa\x3f\x84\x60\xf9\x5d\xf0\xfd\x28\x16\xe0\x81\xe5\xef\x84\xda\xf7\x10\xed\x03\xe1\x0f\x40\xed\x7b\x28\x0e\x85\x28\x76\x20\x88\x3d\x54\xa3\xc1\x89\x1b\xf0\xe1\x67\x08\xe2\x98\x6d\x18\xb9\x11\x2c\xc0\xbe\x4d\x16\xc5\x63\xe0\xed\x4e\x30\x0c\x5a\xff\xb6\xa6\x88\x2b\x6d\xb0\x05\x9a\xfe\xb6\x34\x13\xf9\x3c\x8c\xe6\x2b\xdc\x64\x07\x96\xd6\xb9\x04\xeb\xc2\xeb\x2c\x8f\x45\x9d\x0d\xb4\xc3\xee\x99\x9c\x0b\xb9\xd0\x74\xe8\x68\xfa\x62\x43\xbd\xb4\xb7\xdc\xae\x1e\x65\x10\x8d\x7c\x18\x82\x6e\xf0\x23\x75\xce\x27\xa2\xd3\x71\x04\x49\xe2\x76\x43\x0e\xf7\x3c\x8e\xa2\xd8\xdd\x17\xd9\xcd\x2a\xd9\xe8\x7e\x1c\x45\xd5\xdf\x21\x19\xa9\x77\xf4\x41\x8e\xa2\xad\x42\xbd\x92\x3b\x3a\x22\x47\x11\x8e\xe9\x9a\x5c\xf7\x46\x8e\xa2\x38\xa8\x7f\x72\xf4\xe4\x07\x75\x52\x8e\xdb\x56\x4e\xb7\xe5\x60\x4f\xe5\x28\x8a\x3d\x7d\x97\xfb\xba\x2b\x47\xd1\x8c\xe9\x65\x4a\x86\x1c\xd1\xc1\x5d\x99\xa3\x68\x92\xa8\xde\xcd\xcd\x35\x84\xfb\xe0\x15\xd1\xcf\xb9\xb9\xf6\xec\xec\xdc\x5c\x83\x80\xa8\xf1\x8a\x69\xf4\xd0\x33\x52\x7f\xcb\x87\x68\x9a\xc4\x69\x0e\xe1\x6f\xfe\x30\x80\x64\x4f\x9b\x88\x9e\x36\x10\x03\x08\x7b\x1a\x46\xb8\x0d\x21\x06\x51\x3c\x4c\xeb\x88\xe6\x8a\x6e\x22\x31\x80\xe6\xb0\xe6\x49\x9b\xd7\x90\xc6\x12\xcd\x15\xdf\x62\xa2\xb9\x62\x9a\x4d\x34\x57\x7c\xef\xe9\x21\xdb\xb9\xee\x52\x1d\xe8\x42\x3d\x80\x66\x67\xbf\xea\xa6\x6d\x57\xab\x1f\xf5\x00\xb2\xde\xce\xd5\x03\xa9\x0d\x66\x3e\xb1\x20\xf3\x78\x85\xfa\x56\xbb\x77\x06\x8a\x0e\x9a\x2b\xba\x1f\x8e\x7b\xbb\x2f\xb3\xa9\xb9\xc2\x49\x36\x78\x7d\xcd\xa9\x36\x78\x0d\x4d\xb8\x89\x22\x1a\x4e\xca\xc1\x6b\xd0\xae\x0a\xf7\xca\x6e\xae\xc1\x5d\xb3\xa3\xa6\x55\x77\xd6\x8e\xe9\x9f\xbd\x39\x4b\xbf\x67\xaa\x7d\x6f\xc4\x9e\x0d\x76\x62\x74\x6e\x0d\x5b\x76\x0e\x35\xb0\xed\x82\xb3\x6a\x14\x98\x97\xb7\xed\xb6\xbb\xea\x6d\xb5\xbd\x8b\xfa\xbc\x91\x92\x60\x57\xf5\x36\xd4\x8b\x2f\x92\x17\x6f\xa0\x21\xfa\xbb\xf2\xc5\xca\xd5\x88\xde\x7d\xce\xdd\x83\x15\xe6\xd8\x7e\x7e\xcd\x15\xdf\xd9\x6f\x90\x2a\x8a\x3d\x00\x03\x3d\xfe\x06\x50\xdc\xa7\x1b\x60\x73\x0d\x5f\x50\x32\xb8\x43\x60\x73\xc5\xf5\x0a\x1c\x44\x92\x34\x9d\x05\x83\x5d\x03\x07\x12\x1e\xd0\x63\xd0\x79\x68\xb8\xa9\x44\x86\xf6\x1d\x6c\xae\xd8\x0e\x84\x03\x67\x6e\x13\x24\x76\xed\x45\xd8\x5c\x3b\x2d\xc7\x30\x05\x8e\x0c\xea\x54\xb8\x39\xb4\x68\x1d\x8d\x1c\x8d\xda\xa3\x51\x1b\x79\xfd\x01\x8c\xda\x50\x2f\xc5\x81\x36\x68\x0b\x14\xad\xaf\xab\xe2\x00\x9a\xdb\xfd\x17\x7b\xfb\x2b\x0e\x31\x6b\x7b\x3b\x31\xb6\x3b\x2d\x0e\x54\x0c\x82\x3d\x19\x23\x7b\x2e\x3a\x54\x87\xb3\xdd\xa1\x7d\x18\x9b\x6b\x78\x47\xc6\x21\x47\x49\xeb\x4b\xf1\xbd\x19\x07\x50\x6e\x77\x71\x0c\x77\x69\x1c\xa2\x1f\xed\xd8\xcf\xb1\xb9\x76\xd3\xcb\x06\xf7\x78\x6c\xae\xb8\x6e\x8f\x03\xf5\x08\xb7\x37\xe4\xee\x7d\x1f\x9b\x6b\x47\xe5\x6a\x40\x2f\x48\xe7\xa1\xc8\xae\x90\x03\x97\xc4\x9c\x05\x7f\x7f\xc8\x81\x34\xe3\xba\x49\x36\xd7\x8e\xcb\x38\xa4\xc3\x64\x73\x1d\xb6\xd7\xe4\x9e\x93\xd8\x45\xb3\x8c\xec\x44\xb9\x39\xb2\x01\x8a\xe5\x50\x87\xe5\xcb\xbb\x21\xa3\x09\x63\xe2\xce\x01\xdc\x44\xa6\xdf\x81\x89\xfe\x7f\x3d\x1e\xa0\x67\x8c\xee\x9b\x8a\xce\x00\xc6\x62\x73\x0d\x09\xed\xc7\x7b\x1f\x8e\xa1\xfd\xa7\x09\xed\x4f\x4c\xaf\x8e\x63\x5c\xbf\x73\x36\xc7\xb8\x7e\x73\x1d\xe3\xfa\x47\x17\xc8\xd1\x05\xb2\x7d\x1d\xe3\xfa\xad\x69\x1d\xe3\xfa\xc7\xb8\xfe\x31\xae\xef\xbb\x0e\x1a\xd7\x37\xea\x39\x06\xf5\xa3\x37\xdf\x57\x12\xd3\x37\x5d\xb2\x2e\x92\x44\x54\xb9\xba\x17\x0f\x2c\x18\xda\x8b\x32\xda\xb6\xa8\x06\x27\xf8\x74\x16\x1e\xad\x52\xae\x2d\xa9\xc1\x5f\xfb\xc2\x3c\x68\x8d\x1c\x2d\x61\xf2\x94\xa5\x35\xc5\x58\x97\xaf\x7e\x58\xe9\x55\x18\x93\x0b\x52\xb2\x84\x17\x9c\x61\x1b\x7c\x8a\xbf\xe3\x76\xb0\xed\x3d\x22\x15\x7d\xc9\xb2\x99\x69\x8c\x90\x3b\x8d\xb5\x1c\xdb\xc4\xb0\x7e\x3b\xdc\x28\xba\x86\xa9\xc0\xb0\x50\x1d\x10\x16\xa5\xdf\x76\x1c\x2b\xd9\x3f\x8c\xc6\x11\x37\x7b\x9c\xf9\xbd\x33\x12\xd7\xe9\x85\x4b\x1b\xd3\x17\x6c\x6b\x90\xb4\xe0\x06\xb1\xe0\xd0\x1c\x82\x7d\x29\x78\x09\xdb\x7a\xc2\x12\x91\xfb\xfa\x20\x37\x57\x6b\xf3\x5c\x6f\x52\xb0\xbb\xc8\xf8\x97\x23\xcd\xd8\xb4\x2a\xeb\xbe\xc7\x2b\x9a\xf1\x94\xab\x75\x1d\x3a\x37\x2d\xee\x28\x9e\x33\xb3\xd0\x51\x64\x2f\x64\xf3\x95\x09\x2d\x8a\x52\xd0\x64\xc1\xa4\x33\x6f\xd4\x81\x4d\x65\x65\x14\x4d\x5b\xf7\x82\xcd\x23\x41\x01\x06\xba\x5a\x4f\xca\xd6\xa4\x14\xca\xa6\x8d\x98\x81\xc7\x99\x9f\xad\xc9\xa1\xd9\x83\x83\xc2\x57\xa0\x4a\xa2\xca\x35\xe4\x9f\xc4\xb9\x50\x9d\xa1\xe0\x0a\xf0\x99\xfb\x3f\x92\x88\x2c\xb5\xe0\x46\x7f\x79\x13\x67\xfa\xb1\x32\x31\x67\x1a\xcc\x1b\xbe\x04\x0f\x67\xa6\x75\x44\x2d\x1a\xda\x2f\x88\xdb\xe4\xcd\x20\xfe\xf4\x03\x59\x88\xaa\x94\x63\xb7\x06\xf2\x7b\xf8\x0d\xed\xf3\xd8\x28\x99\x56\x2c\x15\xc9\x18\x95\x8a\x7c\xff\x86\x2c\x79\x5e\x69\xd5\x20\xe2\x59\x47\x35\xff\xf3\x0f\xd1\xc7\x2d\x56\x29\x8f\x55\xc7\xb7\x13\x1f\xcc\xa9\x2a\x10\xf4\xdc\x68\xe5\x86\xab\x84\xaa\x6e\x9d\xf7\x43\xc3\x83\x8d\x38\xa4\x11\x45\xee\x97\xcb\x95\x38\x30\xaf\x89\xd5\x6e\xa3\xb4\xd5\x48\xb9\x1f\x75\x5b\x48\x89\x0d\x95\x90\x9a\x00\x47\xe7\x5f\x03\x03\xf8\xad\x12\xd3\xb5\x8a\xa9\x29\xff\x0f\xbc\xb3\x5d\x4c\x6e\x7f\xec\x06\x8f\xea\x99\x70\xab\x97\x47\x83\x1d\xd5\x79\x77\x58\xfb\x98\x6b\x6b\x3a\xb2\x6e\x10\x2c\x6f\x6b\x0d\x5a\x37\x6d\x92\x30\xec\x39\x7c\xd5\x74\x8b\xcb\x05\xd2\x0d\x7c\xb2\x43\xd6\x5c\x7b\x11\x9a\xec\x3a\xdb\xfa\x41\x1f\xf3\x3d\x7c\x5f\x88\x18\x7d\xb8\x64\x73\x2e\xd5\x80\x16\x3c\x78\x7b\x7b\x3b\x49\x9e\xcf\xb1\x65\xc2\xb2\xca\x14\x2f\xb2\x7a\xe6\x9e\xf9\xd6\xa4\x8c\xac\x73\x5d\xc6\xd4\xf1\x4d\x52\x04\x2d\x40\x88\xbd\x40\xd8\xe0\xb4\x7e\x3f\xcb\x15\x22\xf5\x97\x5a\x98\x16\xb4\xa4\xf5\xc2\x42\x53\x72\xf9\xda\xf8\xa5\x69\xe2\x4d\x7f\x33\xd8\x37\x5a\x72\x95\x34\xab\x97\xcb\x0d\xe0\xee\xb3\xd9\x14\xcb\x69\xee\x89\x02\xb5\xdd\x2a\x70\x33\x11\x8f\x36\x93\xd4\x74\x62\xda\xd8\x65\xc1\x92\xe7\x9f\x68\xf2\xc0\xf2\x14\xda\xe9\xe1\x92\xa4\xeb\x9c\x2e\x0d\x86\x69\xdd\x74\x8c\xa5\x1b\x94\x7b\x2b\xcb\xf5\x85\x5e\x46\x2c\x99\xb6\x40\x0c\x81\x4e\xe0\x11\xeb\x53\xc9\x68\x90\xaf\xcf\x52\xeb\x02\x7e\x1e\x21\x31\xa6\x5a\xf2\x55\xc2\x8c\xda\xe4\x99\x92\x7e\xf9\x3e\x83\x5f\x79\x70\x3f\xb6\x86\x6f\x30\x3f\xb8\xb3\xf3\xc1\x79\x59\x87\xb9\x00\xf1\x8f\x66\x9a\x2d\xf8\xec\x1f\x5b\x58\xbf\xb1\x29\xa6\xeb\x7d\x1b\x76\x85\x7b\x54\xe1\xd1\xe8\xf9\xb3\x07\x8f\x21\x20\xeb\xca\x69\x0c\x4e\xc2\xc9\xdd\x4f\x57\x6d\xae\x74\x47\x53\x21\xc9\x4f\x99\x48\x1e\xc8\x15\x03\x3b\xc0\x95\x77\x3d\x2b\xb1\x09\xa1\xb8\x67\xef\xaa\x72\x9a\xee\xdf\x5b\xe0\x88\x87\xff\x0d\xe1\xe1\x97\x53\xdf\x02\x7c\x1b\x68\xf8\x4b\x3a\x8f\x6f\xa7\xa2\x2d\x76\x38\x6a\xf0\x98\x85\x69\xdd\xf1\x88\x7c\xb7\x10\x8f\x23\x25\x46\x95\x64\x23\xee\x49\x7c\x89\x98\xc5\x03\x5b\xeb\xbf\xc6\xce\xe3\xef\x78\x7b\xcb\x5c\x52\x02\x02\x0f\xf0\xbb\x96\xf8\x77\x3f\x5d\x69\x31\x13\x83\xee\xc6\x25\x39\x67\x2a\x39\x4f\x58\xb1\x38\x37\x43\xf9\x2a\x96\x65\x29\x72\xae\x44\x19\xdd\x01\xef\x82\x24\x22\xcb\x0c\xaa\x86\x98\x91\x4b\x56\x2c\x6a\x22\x4f\x3f\xa3\xe7\x42\x48\x2f\x84\x88\x45\x90\x76\xb6\xbc\x7e\xca\xec\x78\xe7\xc3\x97\xd3\xa1\x0c\xe6\xb9\x37\xc1\x37\xd6\x80\xf8\x09\x96\xe7\xb0\xc0\xf2\x27\x13\xfb\x00\x98\xa1\x4e\xec\xa9\x8d\x23\x6f\x08\x7b\x56\xc8\x65\x33\xe4\x66\x86\xea\x78\xca\x52\x22\x56\xac\x2c\x79\xca\x24\xa9\xb9\x89\x6b\xf9\xf2\xec\x40\x0d\x02\x77\x5a\xd3\x23\x0c\xfe\x8b\xc2\xe0\x0f\x30\x93\x1c\xe6\xa5\x9f\xda\x66\x5e\x34\x5d\xf2\x7c\x20\xac\xeb\xf3\xb2\xaf\x20\x9c\xbd\xd6\x43\x7a\xfe\x66\x05\xd7\x2e\x86\x88\x4c\x68\xc6\x6e\x3e\x45\x18\x23\x13\xbc\xb3\x6d\x8f\xd8\x1f\x1d\x64\xd3\x9d\xb0\x1c\xff\x5e\x6f\x76\x92\x8b\xb4\xcf\x37\xfd\xc7\x45\x3b\x75\xf6\x32\x82\x39\xee\x23\x28\xe7\x54\xb1\x47\x1a\xdd\x65\xdc\x4e\xa5\x8d\x29\x5e\x7f\xfa\x8b\xdb\x1b\xf2\x33\x52\xdc\x0f\x64\xb5\x14\x0a\x35\xb2\x2b\xb1\xa4\x3c\xba\x93\x92\x03\x0e\xed\x0e\xeb\xb6\x26\x47\x90\x9e\x96\x42\x01\x3b\x03\x71\xc7\x2a\x6d\x67\x19\x0b\xe8\x88\x74\x79\x60\xa5\xa2\xd1\x29\x1c\x27\x90\x4d\xf5\x6d\x9a\xd8\x98\xaf\x18\x70\x64\x35\x81\x6a\x22\x59\x2e\x39\x44\x81\x9c\xe4\x04\xd3\x3f\x14\x9b\xcf\x62\xa6\x2e\x2a\x1e\xbe\x93\xf7\x5e\xcc\x79\x6e\xcf\xad\x30\x21\xcd\x19\xf5\xe9\x22\x47\x4d\xe1\x45\x35\x05\x29\xb3\xeb\x9c\x4e\x33\x5f\x38\xad\xcd\xf8\x33\x3a\xd7\x9b\x8e\xc1\x53\xe7\x29\x97\xfa\xbf\x64\x32\x79\x0f\x8e\xf4\x2a\xb7\x9a\x6d\x20\xb5\xd9\xb0\xbd\xba\x9a\x07\x8f\xed\x7e\xe7\x09\xf9\xce\x00\x24\xd2\x9b\x3c\xd5\xc3\x65\xb2\x95\x9f\x64\xe8\x20\xc8\x6a\x9d\x62\x0e\x99\x1c\xfe\x78\xcd\xfd\x82\x27\x0f\xb7\x8e\xbf\x5c\x94\xfa\xb7\xdc\xf9\xa9\x25\x8e\x36\xff\xb6\x0f\xc3\x34\x83\xbe\x8d\x37\x5b\xef\x1d\x8e\x3f\x31\x53\xd6\x8f\x13\x2a\xa5\x48\x78\x13\x20\x09\x00\xa6\x36\xc2\x22\x05\x61\xb1\xdf\x34\x40\xd2\xef\x28\xbf\xec\x87\xb3\x8d\xb1\xa5\x23\x95\xfc\x46\xa8\x59\x87\xbd\x86\x8e\x1b\x65\x40\xa7\x86\xfb\x56\x6f\x06\xab\xfb\xa1\x47\xbf\xf6\xdb\x1b\x0f\x60\x98\xa9\x5b\x6d\xcc\xb4\xc3\xd9\xfe\x88\x75\x8f\x06\x13\x68\x7e\x42\xdf\xbf\xd1\x92\x7a\xfe\x5a\xcb\xbd\xbe\xbf\xf7\xeb\x8c\x21\x8d\xdc\x53\x44\xd5\x65\x9f\x6f\x84\x2d\xf1\x37\xe3\xec\x87\xc4\xad\x42\x14\x55\x46\x7b\xe3\x96\x5b\x8d\x2f\xf6\x68\x01\x83\x6f\xdf\x35\x24\x30\x1c\x85\xd9\x5f\x64\xd0\x06\x64\xf6\x7b\xf0\x2d\x54\x73\x1c\x20\x73\x18\x62\x44\x09\xf2\xe6\xcf\x3f\xfc\xd0\x07\xde\xdc\x0b\xd1\xec\xd5\x50\x7d\xe0\xcd\x3e\x88\x66\x2f\x51\x2f\x78\x73\x5f\x89\x80\x2f\x58\xd7\x0f\xde\xdc\xaf\x0e\x1c\x0e\xbd\x39\xe0\x5b\x1d\x5a\xcf\xe7\xd6\xea\xf9\x3c\x5c\xe1\x2a\xbe\xee\xfa\x36\x0f\x4d\x4f\xed\x9e\xbf\x2e\xcf\x47\xb3\xa3\x62\x2f\xb2\x1a\x2f\x60\x3b\x35\x89\x0e\x87\xaa\xc1\x1b\x54\x79\xe7\x56\xd5\x05\x46\xea\xaf\xb7\xeb\xa9\xa5\xf3\xd0\xec\xae\xb2\x0b\x57\xd0\x79\x48\xb6\x6a\xeb\x02\x95\x16\xc3\xd0\xc4\xc3\x35\x72\x51\xd5\x6f\xb1\x99\xd8\x11\x95\x6e\x7b\xd6\xb7\x45\x27\xdd\xc5\xd4\xb2\x0d\x11\x2e\x4d\x5d\x5a\x80\x28\xf1\xd7\xad\xf5\x55\xa3\x05\xa9\x76\x57\xab\xf9\x6a\xd0\x82\x24\xfd\x62\x64\xb7\xca\xb3\xe8\x7a\x33\x47\x64\x04\x89\x46\x57\x99\x0d\xa9\x2d\x8b\x4f\x5e\x8d\x49\x5c\x8d\xaf\x1e\x73\x6a\xc2\x82\x13\xf7\xd7\x8c\x75\x57\x82\x45\xed\xa4\xed\x4a\x31\x7f\xfd\x57\x90\x68\x4c\x7d\x58\xe4\xe1\x8d\xc9\x96\x0d\x55\x80\x05\x33\x69\x0f\x92\x1e\x1b\x53\x65\x34\xbc\xb6\xa8\x96\x2e\x5e\x2e\xef\x2f\x29\x8a\x77\xe6\x0d\xe9\xd3\xe7\xfa\xa8\x8c\xe9\x61\x15\x5c\x4c\x30\x6a\x40\x0b\xbd\x1a\x44\xd5\x13\x24\x3d\x94\xf1\x41\x62\x36\x5b\xc8\x30\xc3\xf7\x89\x98\xc6\xb6\xc6\x17\xf1\x69\xb2\x11\x2e\xa9\x7f\x3e\x46\x49\xbe\xf1\x9e\x70\x47\xe7\xfe\xf6\x24\x1b\xe7\xbe\x6c\x41\x28\x59\xa7\x04\xea\x4e\x33\x51\x12\x31\x35\xe0\xb1\x01\x5d\xbd\x39\x30\x17\xb7\x37\xda\x9e\x87\x8a\x31\x9a\xc9\x31\xe9\xa8\xdf\x37\x6a\x50\xc8\xfe\x69\x2c\x1c\xaa\x14\x5b\x16\xca\xb7\x15\x8e\xbe\xfd\x17\xf5\xed\x0f\x76\x48\xfe\x52\x3f\x50\xb7\x46\xae\x96\x34\x1f\xe9\xd3\x06\x5e\x7e\xc7\xd9\xea\x99\xc1\x26\xa7\x1e\x13\x9b\xcd\x0c\x0b\x0a\xae\x1b\x28\x64\x68\xf5\x68\x27\x3e\x1f\x41\xd3\xbd\xf7\x30\x1e\x5a\xa0\x35\x78\x55\x50\x18\x6f\x9c\xcf\x44\x6c\xe6\xd4\x7a\x59\x10\x4c\xb5\x5e\x21\x7b\x14\x1d\x59\xdf\xb2\xd8\xd5\x82\x85\xb2\xf7\x6f\xa1\xfa\xa6\x79\xbe\x6d\xc3\xa0\x11\x43\xb3\x4c\x3c\xe2\x78\x1b\x39\x18\x58\x6e\x98\x19\x96\x08\x42\x2d\x0a\xd7\x86\xbe\xf1\x26\xbb\x53\x00\x9e\xa4\xb4\x95\xe4\x55\xfc\xc1\x34\x28\x4d\x68\x71\xc2\x94\xbb\xd9\xb4\x19\x9d\x63\x42\xba\xfe\xb7\xcd\x6c\x0a\x4c\xdc\x06\x8e\xa6\x6c\x41\x57\x5c\x54\x25\xd2\x55\x82\xbc\x32\x7f\x02\xa1\xb5\x16\x55\xed\x2c\xac\x02\x09\xb3\xf5\x2a\xca\x8e\x2f\xf5\xb1\xf9\x23\x18\x73\xa9\xb0\x7e\x94\x11\xfb\xc2\xbd\xe5\x84\x5b\x6b\x66\x3f\x92\x45\xed\x7c\x32\xc5\x6b\x25\x0b\x2d\x15\xa3\x5b\x8e\xfe\xe2\xde\xdf\x56\xc0\x56\x13\xf8\xd3\xb7\xd6\x70\xf4\xa8\x82\x75\x5d\x75\xb8\x30\xe3\xc9\x3a\xba\xd9\x66\x13\x26\xd4\x8f\x91\x9f\xa8\x64\x29\xf9\x40\x73\x3a\x47\xdb\xf7\x74\x72\xfb\xd3\x87\xd7\xfa\x13\x06\xdc\x1b\x37\x57\x5d\x51\x46\x4b\x1f\xc9\x7f\xdc\xaf\x3e\x65\x63\x8e\x03\xc4\xe0\xc1\x66\xb9\x67\x85\x8d\x15\x58\x7e\xb4\xf3\xed\x02\xdf\xcd\x26\xca\x1b\x07\x77\xb5\x4c\x9f\xb0\x39\x72\x33\xe4\xe1\xec\xaa\x9f\xf6\xa8\x1b\x76\xcf\x43\xad\xcf\xdb\xf0\x48\xb3\x4b\xb1\xd4\x6c\xad\x0b\x95\xbf\x0d\x48\x00\x29\x0e\x58\x6c\x81\xb7\x5b\x39\x0f\x96\xc7\x88\x2e\x18\x4d\x49\x26\xe6\xa6\x0d\xfe\x24\xa7\x45\xd1\x91\xc8\x05\x22\x78\x96\x51\xa8\x25\xc0\xb6\x06\x2b\xca\x33\x20\xce\x73\x0b\x17\x0f\xc9\x61\xb7\xa5\x58\x32\xb5\x60\x95\x24\x3f\xfe\x2f\xf2\xa7\xf1\xf7\xdf\x8f\xdf\x6c\x12\xec\xb3\x3e\x3a\x17\x43\x2a\xaa\xaa\x16\x27\x6d\x2b\xd3\x1f\x34\xff\x2a\x19\x56\xe2\x4f\x01\x1b\x22\x35\x0f\xd9\xc9\x3a\x63\x4a\xb2\x4a\x2a\x56\xa2\xc9\x05\xc5\xa8\xed\xc1\x7d\x14\x8a\xf0\x3c\xc9\xaa\x14\xa2\x0d\x2c\xb7\xd8\x0d\x50\x30\x51\x8a\x65\x1b\x84\xe2\x0c\x57\xa3\xfe\x43\xf3\xa6\x16\xd5\x4f\xc0\x5e\x45\x09\x76\x0c\xa2\x78\x74\xea\xfb\x73\xae\x16\xd5\x74\x9c\x88\xa5\xa3\xfa\x9f\x9b\xac\x14\xb5\x3e\x9f\x66\x62\x7a\xbe\xa4\x7a\x06\xda\x10\x50\x25\x9f\x56\x4a\x94\xf2\x3c\x65\x2b\x96\x9d\x4b\x3e\x1f\xd1\x32\x59\x70\xc5\x12\x55\x95\xec\x9c\x16\x7c\x94\x88\x7c\xa5\x0f\x92\xc8\xe5\x78\x99\x7e\xa7\x99\xef\x88\xe6\xe9\x08\x97\xc8\xd5\xe3\xfb\xe4\x56\xfd\xad\xef\x98\x66\xef\x74\x4b\xac\xb5\x9d\x9d\x42\xd1\x8c\xe4\xd5\x72\xca\x4a\xc8\x0b\xa8\x77\x4a\x21\x52\x89\x86\x2f\x56\x9b\xd6\xa8\x04\x4b\x9e\xeb\xcf\xb1\x36\xa8\x19\xdb\xf0\xcb\x8a\x96\x73\xe6\x76\xb1\x75\xbe\x68\xca\x8a\x4c\xac\x97\x1d\xe1\x24\x9f\xf7\xb7\xdf\xdb\x5b\x50\xad\x77\x7a\xa7\x78\xd7\x28\x15\xd6\x73\xa7\xb5\x3f\x8a\x9d\x5f\x6d\xf5\x79\x95\xa7\xac\xcc\x28\x80\x54\x2c\x81\xf7\x6e\x6b\x1a\xc6\x5c\x03\xf5\x6e\xca\xf4\x9d\x05\x2b\xf5\xb8\xb5\xe6\x0b\xa6\x7d\xaa\x95\x0e\x56\xd3\xae\xa3\x73\xf5\x6d\x91\x67\x4b\xf3\xa6\x1d\xbe\x5e\x2e\xf2\x91\x62\xe5\x92\xe7\x20\xe7\xe0\x13\x7a\xbe\xc6\xd6\x04\x9b\xaf\x43\x4e\xd5\x82\xf1\xd2\xf4\x40\x21\x4b\xaa\x12\xe3\x51\x06\x44\x60\x51\xbe\x3e\xcc\xf7\xab\xf2\xfd\xf6\xab\xf3\xfc\x3e\xd3\x3d\xd0\x64\x8a\x54\xaf\xfb\x4e\x13\x39\xe0\xa7\x03\x79\xbc\xa0\x2b\x74\x3b\xa5\x4c\x6a\x19\x67\xd9\x3e\x18\x7b\x87\x98\x6e\x97\xf0\x1c\x6d\x73\x9f\xd6\x5f\xf1\xb4\xb6\x7e\x2a\xbb\xee\xeb\xd8\x15\xed\xbf\xb7\x17\xda\x2f\x94\x36\x07\x3a\x82\x25\xf8\x97\xce\xfb\xcd\x22\xbd\x25\xab\xef\x9b\xff\x83\x0f\x39\x32\x80\xeb\xf0\x07\x84\xe5\x62\xe9\x5b\xa2\xca\x0a\xd5\x04\xa3\xfc\x99\x5f\x1a\x31\x48\x93\x84\x15\x8a\xa5\x60\xcd\xe1\x10\x1e\x78\x9e\xbe\x25\xaf\x10\x1a\xbc\xc8\xaa\x92\x66\xe6\x7f\x35\x43\xe5\xc0\x3a\xde\x92\xff\xfb\xff\xfe\x05\xa9\xb2\xf4\x17\x3b\x0e\xfd\xe3\xff\x0f\x00\x00\xff\xff\x49\x90\x26\xb5\x15\x49\x05\x00") +var _examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdc\x36\xb6\x20\x8c\xff\x9f\x4f\x81\x72\xa6\x4a\xf6\xfe\xba\x5b\x71\x66\x76\xea\xae\x77\x6a\x6f\x69\x6c\x27\xa3\xbd\xb6\xac\xb5\x14\x67\xa7\x7e\xf5\x54\x82\x26\xd1\xdd\x58\x91\x00\x07\x00\x5b\xea\xd9\xe7\x7e\xf7\xa7\x70\x0e\xc0\x97\x26\x09\x82\x52\x3b\xf1\x24\xe4\xad\xba\x13\xab\x49\xbc\x1c\x1c\x9c\xf7\x97\xaf\x96\xcb\xe5\x57\xb4\xe0\x9f\x98\xd2\x5c\x8a\x57\x84\x16\x9c\x3d\x18\x26\xec\xbf\xf4\xea\xee\xdf\xf4\x8a\xcb\xf3\xfd\xcb\x35\x33\xf4\xe5\x57\x77\x5c\xa4\xaf\xc8\xeb\x52\x1b\x99\x7f\x64\x5a\x96\x2a\x61\x6f\xd8\x86\x0b\x6e\xb8\x14\x5f\xe5\xcc\xd0\x94\x1a\xfa\xea\x2b\x42\xa8\x10\xd2\x50\xfb\x67\x6d\xff\x49\x48\x22\x85\x51\x32\xcb\x98\x5a\x6e\x99\x58\xdd\x95\x6b\xb6\x2e\x79\x96\x32\x05\x33\xf8\xf9\xf7\xdf\xac\xbe\x5d\xfd\xe9\x2b\x42\x12\xc5\xe0\xf3\x5b\x9e\x33\x6d\x68\x5e\xbc\x22\xa2\xcc\xb2\xaf\x08\x11\x34\x67\xaf\x48\xa1\x64\xce\xcc\x8e\x95\x9a\xe9\x55\x2e\x05\x37\x52\x71\xb1\x5d\x25\x52\x31\xa9\x57\x89\xcc\xbf\xd2\x05\x4b\x60\x2d\x69\x0a\x0b\xa4\xd9\xb5\xe2\xc2\x30\xf5\x5a\x66\x65\x8e\x0b\x5b\x92\xff\x79\xf3\xe1\xea\x9a\x9a\xdd\x2b\xb2\xb2\x1f\xac\xdc\x52\x60\xd1\x29\xd3\x89\xe2\x85\x81\xa5\xdd\xee\x18\x71\x3f\x12\xb9\x21\xd7\xd5\x02\xe0\x55\x5c\xd5\xa7\xc6\xc7\xe6\x50\xb0\x57\x44\x1b\xbb\xac\xde\x99\x14\x2b\x32\x9e\x50\xdd\x3f\x55\xca\x34\x57\x2c\x25\xfe\x2d\x22\xca\x7c\xcd\x54\x7b\x6a\xd6\x9c\xfc\x63\x73\x3c\x9c\xdd\x6e\x77\xcb\xd4\xf1\xf4\xfe\xa4\x56\x1d\x28\x37\x86\xbb\xd8\xb2\xc6\x48\x29\x35\xf6\x9f\x5b\x25\xcb\xe2\x15\xe9\x07\x38\x7e\xe9\x0e\x1c\x91\xe5\x08\x4a\x19\xd7\xe6\x3f\x8e\x7e\x78\xc7\xb5\x81\x1f\x8b\xac\x54\x34\x6b\x1f\x2d\xfc\xa0\xb9\xd8\x96\x19\x55\xcd\x9f\xbe\x22\xa4\x50\x4c\x33\xb5\x67\x3f\x88\x3b\x21\xef\xc5\x77\x9c\x65\xa9\x7e\x45\x36\x34\xd3\x76\xa9\x3a\x91\x76\xe1\x57\x76\x49\x05\x4d\x58\x6a\xff\x56\xae\x95\x43\x5c\xfd\x8a\xfc\xdf\xff\xfc\x8a\x90\x3d\xcd\x78\x0a\x40\xc0\x75\xcb\x82\x89\x8b\xeb\xcb\x4f\x7f\xbc\x49\x76\x2c\xa7\xf8\xc7\xa3\xf3\xa9\x17\x4f\x52\x8b\xff\x4c\x13\xda\xfe\x63\x91\xc9\x43\xce\x84\x59\xb9\xcf\x0b\x25\x0b\xa6\x0c\xf7\xd0\xb1\x4f\xe3\xde\x55\x7f\x3b\x9a\xe8\xcc\xae\xc4\xe1\x9c\x9f\xc9\xd4\x78\xc8\x52\xa2\x61\x95\x16\x2b\xcc\x8e\x6b\x8b\x2d\x16\x2a\x02\xef\x5e\x63\x58\x62\x5f\xa1\x82\xc8\xf5\xff\x61\x89\x59\x91\x1b\x0b\x39\xa5\x89\xde\xc9\x32\x4b\xed\xf5\xdc\x33\x65\x88\x62\x89\xdc\x0a\xfe\xcf\x6a\x64\x4d\x8c\x84\x29\x33\x6a\x98\x3b\x28\xff\xc0\x65\x12\x34\xb3\x30\x2c\xd9\x82\x50\x91\x92\x9c\x1e\x88\x62\x76\x0e\x52\x8a\xc6\x68\xf0\x8a\x5e\x91\xf7\x52\x31\xc2\xc5\x46\xbe\x22\x3b\x63\x0a\xfd\xea\xfc\x7c\xcb\x8d\xa7\x34\x89\xcc\xf3\x52\x70\x73\x38\x07\x7a\xc1\xd7\xa5\x91\x4a\x9f\xa7\x6c\xcf\xb2\x73\xcd\xb7\x4b\xaa\x92\x1d\x37\x2c\x31\xa5\x62\xe7\xb4\xe0\x4b\x58\xb8\x00\x42\xb3\xca\xd3\xaf\xab\xd3\x3d\x6b\xac\xf4\xe8\x26\xe2\x03\xf8\x39\x08\x77\x8b\xa4\x84\xdb\x63\xc5\xcf\x70\xfd\x35\x78\xed\x9f\x2c\x54\x3e\xbe\xbd\xb9\x25\x7e\x52\x38\x82\x36\xcc\x01\xda\xf5\x67\xba\x06\xbc\x05\x14\x17\x1b\xa6\xf0\xe0\x36\x4a\xe6\x30\x22\x13\x69\x21\xb9\x30\xf0\x8f\x24\xe3\x4c\xb4\x81\xae\xcb\x75\xce\x8d\x3d\xe9\x7f\x94\x4c\x1b\x7b\x3e\x2b\xf2\x1a\xe8\x2d\x59\x33\x52\x16\xf6\xa6\xa6\x2b\x72\x29\xc8\x6b\x9a\xb3\xec\x35\xd5\xec\xb3\x83\xdd\x42\x58\x2f\x2d\x48\xc7\x01\xdf\x64\x13\xed\x17\x11\x5a\xd5\x9f\x3d\xfd\xee\x3f\xa1\x9b\x82\x25\x7c\xc3\x13\x40\x74\xc4\xff\x9a\x68\xae\xd9\x8e\xee\xb9\x54\xfe\xef\x8d\xbb\x99\x64\xa5\x36\x4c\xad\x5a\x40\xed\x07\xcf\xae\x5c\x5b\xba\x76\x6e\x99\x95\x12\xcc\x30\xdd\x80\xd4\x3a\x93\xeb\xf3\x9c\xda\xb1\x1e\x0b\x35\xbb\xc1\x25\x15\xe9\x52\x1b\x6a\xca\x16\xe4\xfa\xe8\x05\xd0\x8c\x8a\x97\x5d\x64\x4c\x99\xf7\x54\xd0\xad\x65\x68\x62\xc3\xb7\x47\xaf\x76\x48\x49\xe8\x53\x42\xb3\x4c\xde\x6b\x80\x39\xdf\x1c\x2c\x7a\x53\x72\xc7\x0e\x47\x23\x22\x15\x21\x37\x2c\x51\xcc\x00\x4f\xa7\x5c\xc0\xcb\xd5\xe0\x4d\x58\x37\x27\xb2\x6f\x6f\xf8\xb6\x54\x28\x15\xac\x3a\x23\x07\x5e\x76\xcb\xe2\x2c\x25\x54\x31\x42\x8b\x82\x89\x94\xa5\x9e\x34\xb5\x5f\xee\x0c\xbc\x65\x82\x29\x7b\x29\xc8\xfa\x70\x8c\x0d\x1f\x0a\xfb\x93\x54\x2b\xf2\x3f\xe5\x7a\x70\xd6\xce\x90\x79\xa9\x0d\xd9\xd1\x3d\x83\xf1\x36\x52\xe5\x84\x36\x57\xc9\x05\xfc\x20\x37\x1b\x9e\xf0\x36\x4c\x52\x99\x94\xb9\x27\xd0\xc7\x27\x46\x2a\xf4\xab\x39\x9d\xbd\xa0\xa9\x4c\x74\xe3\x4f\xe7\x48\x8c\xcf\x5b\xeb\x3d\xfa\xd7\xd7\xd4\xc2\x33\x47\x78\xfe\x84\xbf\xf5\x00\xbd\xf7\x90\x74\x0b\xcc\x0b\xd8\x4b\xa9\x99\x22\xc0\x61\x74\x21\x85\xe6\xeb\x8c\x59\xf8\xe7\xf4\x8e\x75\x46\xd5\xa5\xbd\x4e\xc6\xbe\x0e\xec\x75\x45\xae\xa4\xb1\xb0\xa2\x86\x94\x1a\x69\xa7\xa5\x79\x8c\xda\xab\x01\xa4\x90\x3d\x14\x52\x23\x38\x0b\xa9\x35\x5f\xf3\x8c\x9b\x2e\xfa\x19\x49\xd6\x8a\xd1\x3b\x52\x16\x5b\x45\x53\xa6\xdb\xf2\xd0\x8a\x5c\xc2\xac\x34\xdd\x73\x8d\x08\xa2\xd8\x9e\xb3\xfb\x63\x41\xa4\xf9\x28\x96\x31\xaa\x19\x11\xd2\x30\x60\x77\x4c\xc0\x06\x60\xb9\x42\x12\x2e\x12\x99\x17\xd4\xc0\x96\xfb\xa0\xd5\x19\xd1\x42\x6f\x2b\x61\x9f\x7e\xbd\x0d\x0c\xa0\x1b\x03\x54\x9f\xf9\x4d\xac\xce\x8e\x46\x18\xba\xfd\xf6\xb9\x63\x87\xee\x1f\x7b\xe4\xc7\x3b\x76\xf0\xd4\x4f\xe3\x75\x35\x92\x68\x96\x59\x7e\x64\x99\xcd\x8a\x90\xf7\x16\x8b\xd7\x8c\x50\x3c\xa5\x9e\x51\x89\xff\xf6\x8e\x1d\xba\xc8\x33\x40\xe0\xfd\x03\x62\xe4\xd8\x52\xcf\xac\x7c\xe6\x17\xaa\xd8\x86\x29\x2b\x35\xf5\x11\xe4\x9a\x0a\x57\x37\x22\x91\x22\x61\x85\xd1\xe7\x72\xcf\x94\x3d\xe6\xf3\x7b\xa9\xee\xb8\xd8\x2e\xef\xb9\xd9\x2d\x91\x9f\xe8\x73\x90\x4a\xcf\xbf\x86\xff\xe9\xdd\xe4\xed\x87\x37\x1f\x5e\x91\x8b\x34\x25\xd2\xec\x98\xb2\xb8\xbe\x29\x33\xb2\x01\x89\x72\xd5\x10\xd4\x16\x20\x36\x2c\x48\xc9\xd3\x7f\x3f\x3e\xb4\x51\x78\xc8\x02\x29\xe4\x28\x4c\x90\xb5\x1d\xc8\xfd\x8e\xc1\x72\x2c\x68\x1c\xc9\x95\x8a\x58\xe6\x6f\x0f\x37\x77\xa7\x87\x72\x61\xdf\xe9\xe1\x6a\xd6\x52\x66\x8c\x8a\xa3\xdf\xad\xf8\x60\x59\xe5\xf1\x62\x96\x3d\x54\xbf\x97\x3b\x93\x2e\x37\xfa\xc8\x32\xba\x66\xd9\x63\xb8\x51\xfb\xd3\xcf\xc3\x8d\x80\x20\xda\xdb\x6e\x67\x8a\x63\x47\x03\x6f\xff\x12\xfc\x28\x34\x7f\x97\xe0\x56\xeb\x79\x3c\x67\xea\x0c\xda\xe6\x54\xa7\xe6\x4c\x3f\xb9\xad\x39\xd6\xd4\x77\x02\xfd\x47\x16\xcf\x9c\xba\x6c\x9b\xde\xb1\xa7\x31\xa7\xce\x90\x0d\x66\xf5\x68\xe6\xd4\x19\xb4\x81\x10\x93\x98\x53\x0b\x5c\x9d\x51\x9b\xe0\x9b\xb9\xd3\xcc\x9d\xda\xcf\x6f\x99\x3b\xdd\x24\x8a\x16\x6c\x22\x5f\x6a\x7d\x34\xc4\x91\x9a\x1c\xa8\xef\xc2\x85\x39\x92\x86\x29\x8e\x59\x11\xb9\xe9\xfb\x73\x80\xe6\x8f\xf3\xa0\x10\xcf\xe9\x0c\x1c\xa7\x13\x8d\x71\x9a\xce\xb0\xd1\x3a\xd1\x09\x39\x0d\x02\x38\xa4\xfd\xb4\x8e\x60\xa2\xde\x03\xac\xa4\xbb\xcf\xdf\xa4\xde\xd3\x03\x27\xe0\x21\xc3\x2b\x9d\x79\x4a\xff\x52\x67\x9e\xd2\x85\xc9\xbf\x0e\x4f\xd9\x80\xbb\xab\x83\x90\xad\xdd\x5c\x6e\x6a\x32\xb8\x70\x57\x3b\x3d\xd3\x60\x51\x4f\xcb\xcc\xd2\x81\x44\x0a\x6d\x14\xe5\xc2\x74\x04\xdf\xd0\x55\x10\x32\x65\x17\x03\x4b\xe8\x2c\xe3\x0d\xfc\x63\xcd\x34\x7c\x56\x2d\xbd\xb9\x0c\x55\x66\x4c\x5b\xda\xed\x57\xd9\x87\xf2\xa1\x05\xe1\xef\x16\x89\x15\x4b\xdf\x94\x16\x0b\x6e\xaa\xe1\x2f\xb7\x42\x56\x7f\x7e\xfb\xc0\x92\xb2\xdf\xe6\xd5\xb3\x76\x7b\x9f\xdd\x3a\x99\x22\xf7\x3c\xcb\xdc\x34\x70\xa7\xdd\x0f\x76\xc1\x40\xb8\xec\xfe\xfa\xf1\xdc\x3e\x40\xcf\x34\x35\x5c\x6f\x90\xf7\x55\x90\x60\x0f\x85\x62\x5a\x1f\x31\x36\xe0\x90\x96\x4c\xdb\xcb\xb0\x18\x1c\x76\x5d\x1a\x4b\xeb\x2d\x11\x4f\x76\xd2\x12\x71\x8a\x80\x86\xf9\xf6\x5c\x02\x83\x22\x52\x30\x8b\xc3\xb9\xbd\xde\x78\xe9\x07\x47\x6c\x2c\x67\x05\x10\xa8\x87\xe3\x9a\xe4\x52\x9b\x1a\xd6\xf6\x2f\xc0\x4e\x05\x23\xf6\xea\x07\x76\xcf\xc8\x56\x31\x60\x96\x44\x97\xb9\x5d\xc4\x3d\xe3\xdb\x9d\xd1\x0b\xc2\x57\x6c\x05\xc7\xcf\x68\xb2\x6b\x4c\x97\x33\x66\x86\x01\x4a\xb3\xac\x22\xb4\x0d\x5c\xc2\xfb\x65\xf9\xb8\x26\xcf\x2b\x9f\x88\xf3\x53\x2c\xaa\xfb\x77\x8c\x25\xc3\xd3\xf4\x1c\xd3\x82\x30\x93\xac\x5e\x2c\x88\x65\x4d\xa5\xb1\x30\xb7\x7b\x5a\x1f\x08\x37\x56\x6a\x41\x1e\xab\x64\xb9\x0d\x43\x84\x65\x6e\xa1\xde\x71\x06\x87\x0d\x1e\x2c\x2b\xaa\x89\x2d\x79\x86\x40\x7a\xe6\x05\x2a\x5d\xe6\x83\x23\x72\x04\x06\xc0\x2f\xa7\x26\xd9\x39\x37\x5d\x22\x15\x8a\x0d\x30\x22\xfc\xf2\xb6\xde\xcb\x7f\x0f\x22\x83\x1d\xec\xb9\x7e\x01\x87\x0b\x83\xed\xf8\x76\xe7\xcf\x90\x2a\x14\x19\xda\x38\xd1\x77\x79\x61\x79\x86\xe5\x03\x77\x97\x1c\x5f\xbc\x0b\x41\x58\x5e\x98\x43\x03\xd3\x1a\x67\x6c\x98\xca\xab\x1d\xd2\xac\xab\x63\xd6\x8f\x63\x45\xb8\x7e\x9e\x17\x19\x4f\xb8\x71\x98\x47\xbe\x21\xcf\x01\xf5\xb8\x39\xd3\x70\x6d\x96\xb2\x78\xb1\x22\x17\xde\xc7\x3f\xf4\x8c\x2f\x4a\xc8\x6a\x66\x37\x85\x5d\xa8\xee\xda\x02\xea\xa7\x9a\x7f\xf0\x9d\x31\x0a\xd8\x5c\x1c\x13\x49\xaf\x0c\x50\x3f\x6d\x78\x23\xd6\xa0\x98\x62\xe9\x30\x53\xf9\x82\x50\xad\x65\xc2\x41\x5e\xf7\xe7\x1f\x1c\x92\x1c\xa1\x1a\x82\x79\x78\x43\xf1\x9b\x22\x60\x36\x69\x23\xee\xd8\xfb\x9d\x2d\x66\x5c\x1b\x7b\xd3\xda\x5b\x6d\x12\x8c\xd1\x11\x89\xbd\xe3\xf6\xfb\x33\x4d\xc0\xbc\xd1\x63\x30\x3a\x7e\x46\xf0\x7e\x70\xb9\x83\xcb\x74\x1e\x61\xf7\x4b\xc4\xc0\x8e\xf9\x38\x45\x50\x3b\x2f\xf8\x02\x75\x47\x74\x98\x53\x41\xa4\x53\xb8\xe0\xe5\xa8\x51\x15\x43\xe6\x62\x9c\xd8\x6b\x07\x72\x1e\xf6\x88\xef\xe3\x4f\x1e\x9f\x01\x01\xbc\xef\xe9\x30\x71\xb4\xdc\xd9\x35\x02\x24\x50\x38\x9f\x00\x3f\x02\x81\x12\x45\xc6\x41\x45\x89\xd9\x1d\x19\x93\x4a\xfb\x1e\x7f\x04\x8f\xda\xe7\xc7\xca\xbd\x8f\x07\x7b\xa6\xf1\x80\xec\x5d\xd9\xf1\x22\x7a\x9f\x46\x02\x76\xc1\x55\xf1\xf1\x12\x9f\xac\x9e\x52\x2d\x0f\x15\xaf\x4b\x31\x2c\x95\x1c\x3f\x57\xd2\x5c\x8a\x05\x79\xfb\xc0\xb5\x65\xf8\x6f\x24\xd3\x57\xd2\xc0\x3f\x57\xe4\x7b\x83\x38\xf8\x6e\x84\x54\x34\x96\x38\x15\xb0\xb8\x8f\x47\x81\xf5\x42\x10\xaa\x14\x05\xa5\xae\x19\x85\x61\xb5\xdd\xb0\x20\x75\xfc\x54\x17\x8c\x6b\x72\x29\xac\x38\xe6\xc0\x02\xb1\x34\x30\x26\x4e\x15\x3d\xa2\x57\x45\x84\x14\x4b\xe0\x97\x7e\x4d\xad\xb9\x10\xea\xf1\xcb\x54\xad\xf3\xe9\x2e\xcf\x4f\x1b\x3d\xe2\xf0\xd2\xbe\x07\xcd\xea\x5d\x6b\x92\xf8\x0b\x59\x2f\x06\x0c\x40\x14\x42\xb4\xb2\x4a\xac\x5a\x90\xfb\x1d\x4f\x76\x20\xb7\x47\x0f\xba\x66\x18\x50\x54\x28\x66\xf9\x1e\xd5\x96\x34\xba\x00\x36\x2b\x0e\x73\x0f\x04\x1e\xbf\x50\xc5\x8a\x8c\x26\x2c\x25\x29\x08\x9d\x18\xce\x43\x0d\xdb\xf2\x84\xe4\x4c\x6d\x19\x29\x2c\x6f\x8b\xc5\xfe\x68\x86\x82\xcf\xe4\xcb\xe2\x3f\x89\xc5\xc5\x21\x95\xb6\xef\xe9\x53\x73\xfb\xdf\xf3\x68\x12\xf1\xf2\xa0\x9e\x3c\xfc\x72\xcc\xde\x40\xe0\x70\xf1\x7c\xbf\xb2\xac\xe1\x2c\x22\xb3\xac\x31\xcb\x1a\x03\xcf\x2c\x6b\xf8\x67\x96\x35\x66\x59\x63\x96\x35\x66\x59\xe3\x5f\x48\xd6\x88\x1c\x14\xed\x29\x13\xcc\x3a\x3f\xa2\x9d\xeb\xd8\x8e\x03\x82\x8d\x8f\x1d\x6f\x99\x6c\x46\x76\x64\xc5\x84\x1b\xc7\xcb\x6e\xc1\x44\xe4\xdc\xa9\x8a\x8a\x2d\x23\x2f\x97\x2f\xbf\xf9\x26\x8c\x59\x1b\xa9\x72\x6a\x20\x25\xe4\x8f\xdf\x46\xc0\xa4\x4e\x1d\xe9\x7f\xc6\xf1\x61\xd9\xb0\x88\x05\x5e\x42\xd8\x0e\x5b\x6b\xc7\x4f\x68\xec\xb0\x87\x2c\xcf\x4f\xf0\x4f\x38\x2a\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\x61\x70\x73\xce\xea\xac\xc0\x09\x4b\x72\x66\x08\x35\x2d\xd3\x26\xcf\x59\xe5\x41\x42\x37\x08\xc6\xf9\x0f\x8e\xe8\x7d\x23\x29\x91\xc2\x59\xae\x2d\xee\xac\x22\x57\x3c\xec\xed\x68\x3a\x45\x48\x02\x8e\x63\x23\x2d\x21\xf5\xab\x96\xb9\x5d\x25\x17\xc6\x13\x40\xbb\x64\xe6\xa1\x3a\x38\xf0\x73\xb6\xda\xae\x48\x5a\xc2\x70\x54\xb8\x04\x86\x17\xb8\x6b\x7d\xd0\x86\xe5\xe0\x63\x91\x0a\xfe\xc7\x6e\xdf\xa8\x43\x5f\x74\x97\x7f\xd8\x9e\x09\x53\xd2\x2c\x3b\x10\xb6\xe7\x89\xa9\xe0\x07\x39\x16\xdc\xa0\x3f\x6c\xe8\xb6\xc4\x08\xac\xc7\xb7\x31\x48\xa7\x8f\xc4\x37\x44\xc5\xd5\xa0\xa6\x62\xec\x78\xe0\xfe\x09\x5f\x52\xfb\x1a\x60\xce\x87\x8f\xc3\x96\x7f\x12\xc7\x48\x8e\x75\x92\x32\xcb\x2c\xbc\xd1\x11\xd0\x5d\x9e\x37\xb6\x8f\xd2\x2c\x6f\x8a\x47\x6f\x56\x0b\xe3\xd0\x7f\x84\x9e\x8c\x8b\xab\x37\x16\x22\x63\x5b\x26\xe4\x56\x16\x32\x93\xdb\x43\x13\xf6\x70\xfb\xc1\xc1\xe0\x46\xa6\x44\x97\x6b\x27\xd9\x8e\x0b\x6e\x57\x47\x47\x39\xdb\xcc\x67\x3d\xb6\xef\x99\xf5\xd8\xce\x33\xeb\xb1\x91\x4b\x9c\xf5\x58\x78\x66\x3d\x76\xd6\x63\x47\x9f\x59\x8f\xed\x79\x79\xb6\x99\xcf\xb2\x46\xe0\x99\x65\x8d\xce\x33\xcb\x1a\xb3\xac\x31\xcb\x1a\xb3\xac\x11\x7c\x66\x59\xa3\xe7\xe5\x93\xd9\xcc\xc7\x87\x1b\x03\xcf\xb2\x6b\x68\x0b\x5a\x80\x07\x97\x14\xfc\xb9\x90\xe9\x23\x42\xea\x0b\x99\x06\x22\xea\xd1\xa8\x99\xc8\x65\x26\x13\x2c\x9c\xd4\xb3\x28\x7b\x63\xec\x30\xce\x92\xaf\x69\x8e\xb6\xda\x05\xf9\xa7\x14\x0c\x23\x9d\x21\xa5\x4a\xe6\xcc\xa5\x69\x14\x32\x7d\xae\x5f\xf4\x46\xaa\xce\x51\xfa\xbd\xcf\x1c\xa5\x3f\x47\xe9\xbb\xa7\x19\xa5\xbf\xa3\x1a\xf1\x12\x19\xe1\x70\xd0\x7e\x83\x3a\x58\x02\xf4\xdf\x83\xeb\xfd\x95\x62\xf6\x2d\x12\x3a\x64\x81\x7c\xd4\xfa\xe0\x71\x5f\xa9\x73\x47\xb2\xf4\xba\xbd\x9b\x00\xf5\x46\x1d\x0e\xf3\x21\xd3\x94\xa5\xa4\x60\x6a\x89\xa8\x27\xc9\x86\x8b\xb4\x67\x2f\x7e\xff\x83\xc3\x46\xc6\xd1\xb7\x17\x39\xc1\x75\xd1\xf4\xae\xb4\x08\xf4\x71\x54\xfd\x08\x2f\xac\xce\xef\x73\x46\xd5\x83\xe6\xe5\x99\xdb\x74\x95\x1d\xf4\xb6\x7f\x94\x4c\x1d\x88\xdc\x33\x55\x6b\x26\x55\x09\xb4\x18\x25\x04\x78\x0f\xd7\x24\xa1\x1a\x09\xf5\xb8\xa8\x35\x4d\x3b\x9d\xee\x07\xe9\x6c\xf6\x78\x08\xd4\xf2\xbd\xcd\xa2\xbf\xd6\x41\xff\xd3\x6b\xda\xe8\x71\x4e\xd1\x9e\xb4\xde\xfe\x07\x5d\x57\x51\x2f\x4f\x12\x4e\x7b\x4f\x7b\xc0\xe4\x11\xaf\x16\x34\xdc\x78\x23\x66\x8f\xf8\x31\x8f\xcc\x23\x4f\x34\x7d\x90\x47\x98\x3f\xc8\x34\x13\x08\x39\x06\xaf\x5d\xa5\xe3\xd3\x5d\x6b\xc8\x84\x41\x1b\xf8\x35\xdd\x22\x42\x1e\xa7\x8f\x4c\xb7\x8c\x90\xe3\xed\x57\xc7\xa7\x3a\x66\x92\x49\x9b\x6f\x9a\x54\x86\x4d\x25\x93\x86\xec\x98\x55\xda\xe6\x12\xc0\xad\x96\xc5\xe4\x73\x03\x7b\x9a\xb5\x84\x1c\x83\xda\xd9\x0a\x38\xa8\xce\x47\xb6\x93\x49\x80\x69\xdb\x59\x06\xed\x27\x93\xc6\x1c\x32\x66\xb4\x6d\x28\x93\x87\xec\xda\x5b\x3a\x76\x94\xd3\x2c\xd3\x2d\xb1\x36\x44\x4c\x1a\x16\x6b\xa7\x9e\xd2\x18\x41\xa6\x1b\x24\xc8\x63\xf1\x72\xaa\x61\x82\x4c\x34\x4e\x90\x09\x06\x0a\x32\xd5\x48\x41\xa6\x1a\x2a\xc8\xe4\xfd\x82\x08\xf1\x0e\x42\x20\xe2\xb6\xdb\xac\x19\x3d\x95\x1b\x4d\x3e\xc1\xae\xb4\x83\x4b\x45\x41\x27\xa7\x85\xa5\x12\xff\xd7\xb2\x66\x40\xfc\xff\x8c\xe5\xa3\x94\x2b\x6d\x45\x61\x67\xfc\x6b\x8c\xe0\x6d\x0e\x8d\xc9\x22\x07\xb5\xab\xe1\x9a\x58\xdc\xd9\xd3\xcc\x0a\x20\x18\xb6\xe5\x54\x35\xbb\xd2\x63\x79\x2d\xf6\x7e\xdf\xef\xac\x7a\x6e\x99\x2f\xaa\x79\x5c\x93\x67\x77\xec\xf0\x6c\xd1\xa1\x23\xcf\x2e\xc5\xb3\xd8\x51\xa9\x53\x55\x5a\x34\xa3\x92\x7c\xa4\xc8\x0e\xe4\x19\xfc\xf6\x2c\xf6\x62\xf7\x89\x8b\x53\x04\xc1\x47\x18\xe5\xa2\x5e\x16\xbe\xd2\xf5\x54\x07\x60\xfd\x61\x65\x5f\xf1\x8a\x71\xfd\x53\x8c\xb5\xd1\x4b\x50\x37\x5d\x39\x88\x3c\xaf\xd2\xc6\xb7\x16\xf2\xe6\xc5\xb0\x2a\xdd\xd8\x52\x2b\x12\x0d\x44\xfe\x9c\x51\xa1\xc9\x33\x6f\x3d\x3b\xd3\xf5\x1a\x9f\x9d\xce\xe3\x38\xe9\x0e\xc7\xd3\x22\xe3\x02\xd8\xfe\x23\x46\x5c\x3d\xd2\xf1\x9d\xb5\xd0\x15\xec\x5e\xb3\xda\xbc\x98\x92\xe7\x5e\xd3\x1d\xd6\xbd\xeb\x47\x2a\x88\xa2\x6c\x7d\x2e\x0c\x5f\x56\x63\xd4\xfa\xaf\xd5\x08\x63\xc9\xab\x0f\x6b\x6e\x63\x80\x37\x6e\x56\x76\xbb\x1a\xa3\x62\x6e\xf0\xfd\x8e\xa9\xd6\x4e\xb9\x2f\xb9\x0e\x1e\x08\x55\x0a\x28\xaf\x25\x85\x33\xeb\x45\x0d\x69\xc9\x0c\xd6\xf3\x76\x66\x12\x14\xfb\x61\xd7\x20\xfb\xd7\xa7\x14\x19\xea\x48\xbc\x01\x13\x8a\xac\xbb\x98\x49\x29\xdc\x25\xb2\x7f\xa9\x0a\x13\x59\xb8\xb0\x34\x16\xb2\xbc\xda\xe3\x8a\xbc\x85\x4b\xd0\x5c\x1c\xd7\x70\x92\x50\x9b\x2c\x86\xfa\x44\x63\x75\x9c\x6c\xb0\x6c\x2e\xe6\x14\x2e\x83\xc9\x61\xf6\xf7\x27\x0e\xb3\x3f\x32\x3d\xfd\x8b\x44\xd9\x47\x1a\xf5\xe6\x50\xfb\x39\xd4\xbe\x11\x6a\x0f\x1f\x21\xe5\x1b\x8f\xb9\x1f\xc6\x19\x88\xc5\x8f\x8d\xb9\x27\x3f\xee\x18\xdc\xa8\x80\x81\xcd\x1e\x51\x5e\x66\x86\x17\xb5\xc3\x5a\xe3\xd2\x32\x54\x1f\x31\x50\x49\x1f\x59\x67\x43\x19\x01\x34\xd9\x1d\x5f\x13\x98\x07\x1c\xda\x1a\x28\xb2\x73\xb3\xd0\x2c\x73\xb1\xf5\x56\xaf\x1c\x3e\x23\xe6\x7c\x55\xfc\x34\x26\xfc\x37\x55\x1b\x11\x67\x34\x01\xe7\xc4\x73\xcb\x2c\x33\x8b\x0e\x96\x65\x79\xaa\x16\xf2\xb9\x76\xf8\x2f\x5a\x65\xf6\xcc\x3b\x48\xb6\x7c\xcf\x44\xcd\x84\x9f\xeb\x17\x2f\xc6\xc2\x9a\x4c\xa4\xe8\xd1\x15\x2c\x02\x83\xf6\x89\x1c\x8b\x48\x76\x1f\x18\xb6\x12\x04\x22\xd8\xfc\x5f\x1a\xdc\xeb\x7f\x04\xc6\xac\x9d\x43\x83\x0c\x1e\xc0\x53\xb1\xf8\xea\x00\x03\x83\xf2\xf1\xdd\xc4\xd9\x41\x27\xb8\x11\x1e\xe1\x42\x20\x7c\x98\x9c\xe0\x33\xc5\x7d\xf0\x8b\xa5\x4f\x44\xb8\x0c\xa6\x84\xb9\x8d\xbb\x0b\x62\xf5\xbf\xc7\x86\x3c\x06\x1d\x00\x73\xcc\x63\xf0\x89\x37\xf6\xff\xf6\x42\x1f\x03\xc6\xfd\x2f\x34\x06\xf2\xd1\x46\xfd\x5f\x32\xf4\x31\x64\xc8\x9f\xe8\xed\x22\x63\x46\xfc\x27\x06\x00\x8e\x05\x41\x46\x8f\x39\x60\xbc\xef\x37\xc8\x47\x8f\xda\x67\xb8\xef\x35\xc6\x47\x8f\x38\x47\x10\x8e\xbe\xf7\x6b\x47\x10\x4e\x34\xc8\x3f\xd6\x18\x3f\xe9\x74\xa6\x1a\xe1\x9d\x79\x3d\x62\x19\x91\x06\xf8\xae\x69\x3d\x66\x8b\xa3\xc6\xf7\x63\xb3\x7a\x9c\xd1\x29\x64\x78\xef\x35\xa9\x47\x0c\xdb\x6f\x74\x7f\x92\x38\x15\x8d\x9d\x91\x2f\xc6\x9a\xd0\xa7\x9b\xcf\x23\x62\x09\x26\x98\xce\xbd\x61\x7c\x64\xc4\x53\x98\xcd\xa3\x28\x62\xf4\x4d\x8b\xa3\x10\xd1\x66\xf2\xcf\x61\x22\x9f\x68\x1e\x8f\x51\xcb\x49\xaf\x6a\x1e\x32\x8d\xa3\x26\x3c\x32\x64\xbc\x59\xbc\xa9\x0d\x8f\x6d\x3f\xd6\x24\xde\xd4\x87\xc7\x3c\x53\x51\xe6\xf0\xae\xb1\x3b\xde\x9b\x32\xc9\x14\x1e\x85\xad\x31\x96\xd7\x18\xf3\xf7\x93\x8d\xaa\xa3\xc1\xeb\xc2\xf0\xc7\x06\xb0\x37\xf1\x7a\x20\x8a\xbd\x77\xcd\x74\x2f\x79\x4a\x8a\xd2\x98\xaa\xa9\xc5\xb4\x48\xf6\xde\x51\x7f\x57\xd1\xed\x2d\xd0\x07\x43\xdc\xc3\x26\xed\xc5\x23\x42\xdc\x07\x47\x74\xd7\xf2\x11\x21\xee\xc3\x43\xba\xd0\xf7\x47\x85\xb8\x0f\x8e\x0a\xa1\xef\x8f\x0b\x71\x1f\xbd\xf1\xc7\x28\x34\x7c\x56\x3e\xce\x7d\x70\xc8\xf1\xf8\xf7\x40\x9c\xfb\xb0\x85\x3c\x18\xff\x1e\x88\x73\x1f\x06\x67\x74\xfc\x7b\x27\xce\x3d\x80\xf2\x73\xfc\xfb\xd1\x33\xc7\xbf\x37\x9e\x39\xfe\x3d\x72\xb3\x73\xfc\xfb\x1c\xff\x3e\xf6\xcc\xf1\xef\x73\xfc\xfb\x1c\xff\x3e\xc7\xbf\xcf\xf1\xef\x73\xfc\x7b\xcf\x33\xc7\xbf\xcf\xf1\xef\x73\xfc\x7b\xe3\x99\xe3\xdf\x47\xb6\x32\xc7\xbf\xcf\xf1\xef\x73\xfc\xfb\x1c\xff\x3e\xc7\xbf\xf7\xbc\xf2\xab\xc4\xbf\xb7\x8c\xd0\x83\x41\xf0\x01\x73\x6c\x5d\x3f\x65\x62\x10\xfc\xe0\x98\x6b\x36\x1e\x04\x3f\xb8\xec\xc1\x51\x07\x6a\xfc\x44\x45\xc2\x0f\x9b\x5e\x9b\x11\xf2\x93\x22\xe1\x03\x46\xf3\x9e\xaa\xf4\x4f\xac\x3e\x4f\x1a\x11\xf2\x8f\x8d\x84\x1f\x46\x01\x39\x47\xc2\xcf\x91\xf0\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xe3\x33\x47\xc2\xcf\x91\xf0\x73\x24\xfc\x1c\x09\x3f\x47\xc2\x77\x9e\x39\x12\xbe\x77\xb9\x73\x24\xfc\x1c\x09\x3f\x47\xc2\xd7\xcf\x1c\x09\xdf\x7e\xe6\x48\xf8\x39\x12\x3e\xf0\xcc\x91\xf0\x9f\x27\x12\x7e\xf0\x27\x9a\x59\x2e\x29\xb6\xc7\x8b\xef\xb1\x39\x91\x94\x19\xca\x33\x2b\x71\x6d\xa9\x82\x88\x47\xff\xf5\x31\x14\x43\x3a\x1a\x7c\x93\x53\x41\xb7\x4c\xf5\x92\x8b\xb6\x42\xdb\x78\xfb\xad\x48\xc1\x96\xa9\xc9\xb5\x92\x39\x33\x3b\x56\x6a\x7f\x85\x37\x5c\x31\x1c\xba\x5f\x4e\x75\x04\xb1\xef\xb8\x03\x74\x2b\x62\x29\x69\xc3\x1e\x67\x51\x94\x4b\x01\xa8\xee\x58\xf9\xc0\x41\xd6\xdf\xe3\x99\x78\x96\x57\x01\xd5\xcd\x43\x2e\xaf\x35\x46\xd4\x86\xb7\x17\xdc\x60\x8c\xce\x4c\x0b\xfe\x89\x29\x1d\x30\xba\x1f\x41\xc3\xbd\xed\xef\x67\x13\x38\xe4\xe2\xfa\x12\xef\x7c\x7d\x4e\x81\x6b\x56\x6a\x64\x5e\x9a\x89\xd4\xed\x71\x45\x2e\x0d\x49\xa8\xb0\x94\xf9\xd9\xfe\xe5\x33\x4b\x6a\x9f\xed\xbf\x0d\xb8\xe0\x23\x6e\xea\x9a\x51\xc5\xd4\xad\xbc\x63\xe2\x3b\x9e\xb1\xc8\x7d\xfe\xb5\xfd\x95\x5d\xa8\x62\xd4\x99\xab\x37\x3c\x63\xae\x1e\x8c\x91\x76\x23\x21\xe7\xd5\x8e\x09\x42\x4b\xb3\x63\xc2\xf0\xc4\x05\xb9\xcb\x16\xe0\x9e\xb4\x3d\xcb\x13\x22\xf7\x74\x45\x73\x30\x75\x76\xb0\x90\x0b\xf8\x0d\x58\xcb\x93\x17\x03\xa3\x4c\x58\x11\xbc\xdf\xb7\xac\x27\xad\xa4\xa0\x66\x77\xad\xd8\x86\x3f\x44\x2e\x05\x5f\x86\x64\x0b\x8b\xd8\x7f\xbb\xbd\xbd\x86\x41\x1c\x6a\x82\xd0\x59\x94\x7a\xc7\xd2\xa0\x2d\x27\x66\x69\x52\x05\x9c\x99\x54\x1c\x3e\x6c\x82\x3c\x25\xca\x43\xb8\x8c\x63\x62\x6d\x10\x48\x65\xfa\x6f\xb5\xd5\x3a\x1e\x0a\xa9\xc1\x9f\x35\xbc\xf9\x87\xe5\x5d\xb9\x66\x4a\x30\xc3\xf4\x92\x0b\xb3\x94\x6a\x89\x0b\x78\x45\x8c\x1a\x94\x2c\x74\xb2\x63\xd1\x48\x7c\x03\x2f\xbb\x7b\x87\xb7\x6b\xc3\x55\x45\x40\x03\x0a\x57\x04\x40\x4c\xa6\x5f\x4b\xb1\xe1\x1d\xbe\x38\xb0\x98\xdb\x77\x37\x04\x3f\xf0\x0b\xb2\xf8\xd3\xa2\xe4\x89\x14\x02\xf9\xc3\xf0\xca\xe2\x6c\x9b\x09\x9d\x20\xeb\xde\x98\xb2\xcd\x5e\xec\xb9\xbe\xbe\x20\x09\x53\xa6\xb9\xd6\x71\xad\xc3\x50\xb5\x65\x21\xb8\xc6\xef\x80\xa0\x92\xb7\xe1\xdb\xf7\xb4\x98\x68\xb1\x7f\xed\xbf\x6b\x6e\x2a\xa5\x86\x36\x76\x13\xa3\x0f\xef\x58\xdc\x8e\xa6\xed\x8a\x4c\xb1\x38\x77\xb2\x74\x50\x80\x76\x92\xc4\x94\x68\xb1\x68\xc3\x52\x98\x4b\x0c\x2e\xee\xcc\xb3\x0c\x88\x76\xc0\xae\xf5\x66\x45\xde\x4b\x70\x8d\x6e\x64\xac\x21\x6c\x67\x4c\xa1\x5f\x9d\x9f\xd7\xe4\x61\xc5\xe5\x79\x2a\x13\x7d\x9e\x48\x91\xb0\xc2\xe8\x73\xb9\x67\x6a\xcf\xd9\xfd\xf9\xbd\x54\x77\x5c\x6c\x97\x56\xb7\x58\xba\x56\xd9\xe7\xc0\x59\xce\xbf\x86\xff\x89\x9c\xf4\xf6\xc3\x9b\x0f\xaf\xc8\x45\x9a\xba\x2e\x41\xa5\x66\x9b\x32\xf3\x6d\x18\x1b\xa2\xcf\x82\xdc\x71\x11\x68\x96\xd3\x7e\x4a\x9e\xfe\xfb\xd9\xe7\x38\x23\x59\xa0\x0d\xeb\x11\xe7\x74\x03\x2a\xe2\xc1\x92\x43\xd8\x2a\x5c\xf6\xea\xc2\x44\xbb\x2b\xb8\xd1\x80\x8b\xde\x2e\xec\x34\xc6\x09\x9b\x5d\x4b\x99\x31\x3a\xe6\x12\x9c\x62\xb6\x8c\x33\x5a\x4e\xb0\x42\x6a\x96\x28\x36\x12\x4d\x44\x3a\x00\x86\x8f\x02\xa4\x27\x32\x29\xe4\x8b\x24\x3d\x95\xae\x0d\x7b\xac\x08\x11\xc8\xba\x2b\x42\xde\xc7\x9b\xeb\xd7\x8c\x50\xb2\x07\x6f\x8f\x1b\xed\x8e\x1d\x66\x82\x36\x13\xb4\x88\x67\x94\xa0\xb9\x3b\x28\x95\xa5\x53\x91\x7b\xfb\x8d\x53\xb3\xc8\x17\x13\x1a\xd6\x7c\x49\x47\x13\xb0\x8a\x8f\x0b\x08\xf2\x42\xa3\xb3\x46\x36\x6c\x30\x8e\x1a\x06\xb4\x10\xb7\xca\x16\x95\x8c\xa3\x81\x91\xa8\x66\x57\x36\x49\x2a\x56\x3d\x62\x71\x92\x71\x26\x0c\xee\xd2\xaa\xf6\x11\xa2\x64\xf4\x3e\x66\xc1\x78\x16\x8c\x03\xcf\xcc\x47\x66\xc1\xb8\xf5\xcc\x82\xf1\xc8\x33\x0b\xc6\xe1\x67\x26\x68\xbf\x3b\x82\x36\x0b\xc6\x8f\x7d\xd1\x8a\x7c\x4f\x10\x8d\x3b\x82\x63\x47\x46\x1e\x97\xf9\x50\x82\xfe\x2c\xc2\x31\x17\x9a\x25\xa5\x62\x37\x77\xbc\xf8\xc4\x14\xdf\x4c\x09\x96\x78\xc3\x35\x5d\x67\x7e\x41\xb0\x47\xbe\xe1\x09\x35\x0c\xe9\x18\x0d\x9b\xb4\xc9\x04\x5c\xb9\x63\x87\xa7\x1f\x02\xc6\x2f\x7d\x71\x67\x70\xc7\x0e\x37\x11\x7c\x75\x84\xa7\xf6\xed\xf3\x57\x51\x52\xa2\xf8\xe9\x67\xe4\xa5\x8f\xe4\xa3\x13\xe8\x73\x1c\xff\x9c\xc6\x3b\x7f\x79\xae\xf8\x19\x38\x62\x1c\x37\x9c\x00\xe9\x78\x2e\x38\x8d\x03\x46\x46\xb9\x4e\xe5\x7e\xf1\x9c\x2f\x36\x4d\x76\x6c\x9d\x91\x4c\x4c\x33\xb5\x67\xea\x6a\x14\x6f\x5b\x50\xfc\x41\x83\x23\x9b\xec\x81\x2f\x60\x55\x3a\xa9\x8d\xc5\xaf\xcf\x40\x07\x47\x77\x12\x06\xd9\x12\x6e\x65\xe0\x27\x88\x21\x18\xf8\xbd\x90\xaa\x7f\xce\x91\x45\x0d\x07\x5d\x0d\x2d\x76\xd9\x0e\x72\xfa\x2a\x72\x3a\x5a\x70\x3c\xc2\x7e\xd7\x73\x3b\x18\xe9\xfa\xf2\xa6\xf1\x2e\x86\xb3\xf9\xb0\xd2\x03\x96\xa7\xb1\xe7\x88\x59\x3a\xa5\xd9\x11\xcb\x04\xfb\x32\xcd\x8c\x24\x34\x49\x98\xd6\xf5\xfc\x10\xfd\x9f\xb1\x8d\xc1\xb8\xd0\x45\xd3\xd6\xc7\x35\xa1\x5a\x97\x39\x62\x8d\x2a\x85\x95\x2e\x78\x4f\x66\xbd\x23\x83\x49\x56\x6a\xc3\x14\xac\x03\x12\x66\x53\xae\x13\x48\x22\xbb\xb8\xbe\x74\x28\xab\xed\x0a\x65\x4e\x0d\x4f\x20\x31\xd4\xbe\xdb\x17\x4c\xe3\x22\x29\xcf\xb4\xb7\x45\x7a\x41\xc4\x7e\x80\xe1\x3d\xc4\xc8\x3b\x88\x04\xc8\x18\xa1\x86\x9c\xef\xa9\x3a\x57\xa5\x38\x47\x26\xa1\x8f\x08\xaf\x9d\x9e\x27\x8c\x26\x89\x2c\x85\x39\x9f\x12\xc6\xb6\xa6\x9a\x27\x17\xa5\xd9\x8d\x86\xb0\xfd\xd5\xbf\x89\x87\x04\x61\xd8\x2e\xc2\x05\x80\x5f\x87\x04\x31\xcc\xae\x83\xa1\x7b\x31\xb5\x19\x3e\xd4\xdb\xc8\x6a\xb4\x0e\x2c\xd5\xfa\x5e\xaa\x41\x8a\xd4\x2d\xf0\x8a\x04\xd5\x47\xa0\x22\xbc\x48\x2e\x05\x37\x52\xd5\x57\x2e\x9c\xfc\x55\xc5\x73\xc3\x01\xba\x25\x60\x84\x44\x6b\x43\x43\x04\x26\x46\x2c\x19\x11\x48\x3e\x8b\x28\x32\x59\x08\x89\xa2\x91\x63\x82\xc7\x97\x2b\x72\x4c\x15\x36\x46\x45\x89\x28\x78\xc5\x88\x0f\xd3\x05\x87\xf1\xe4\xa4\x28\x91\x21\x46\x58\x18\x13\x13\x42\x02\xc2\x28\x43\x2d\x35\x53\x21\x8c\xfa\x05\x6e\xbc\x5f\xc2\x7c\xe3\x07\x9e\xf9\xc6\x4f\x83\xd7\x7c\xe3\xc7\xa4\xd5\x81\x9f\x1b\x21\xd0\xe3\x62\x4b\x4b\x9e\xb2\x37\x17\xa4\x44\x10\x2d\x2b\x41\x71\x70\x01\x03\x27\x18\x11\x83\xdd\x5a\x44\x2b\xe4\x7a\xfd\x39\x56\x64\x85\xe4\xd1\x65\xfc\x4d\x62\x3d\x80\x86\x84\x7c\xe1\xc9\x00\xa6\xf2\x26\x52\x68\xae\x21\xa8\x1b\xa2\xff\xbd\x0e\xd5\x7b\x88\x52\x91\xcb\x6b\xb2\x91\x98\x82\x42\xd6\x07\xcc\xa3\x47\xa4\x06\x3d\x85\x88\x32\x5f\xf7\xfa\xd3\x83\x9b\x09\x86\xad\xc6\x04\xac\xc6\x01\x74\x8c\x3a\x0f\x07\xa8\x3e\x36\x34\x75\x4c\x05\x8d\xe1\x17\x51\x7e\xf5\xc9\x1e\xf5\x58\x05\x39\xd6\xb4\x16\x61\x58\x7b\x9a\x77\x3c\xda\x30\x13\x63\x00\xfb\x72\x39\x13\xf9\x1c\xdc\x69\x12\xfc\x62\xcd\x5a\x93\xfc\xd4\xd1\x76\xad\x69\x56\xad\x58\x9b\x56\x8c\x45\x6b\xcc\x9e\x15\x65\xcd\x1a\xf7\x41\x4f\xf7\x3e\x7f\x09\xd7\xf4\x14\xd6\xef\x47\xd9\xbe\xe7\x6b\xff\xaf\x76\xed\x1f\x21\xa0\x92\x58\x21\x95\x7c\x79\x77\x7e\xf4\x95\x70\xf0\xe2\x67\x09\x5b\x9c\x46\x3f\x46\x51\x24\x14\xa4\xf8\xc8\xf0\xc4\x60\x54\xcd\x2c\x34\x0d\xac\x71\x16\x9a\x86\x9f\xdf\x08\xf5\x9c\x85\xa6\xbe\x67\x16\x9a\x66\xa1\xa9\xff\xf9\x8d\x5c\xfb\x59\x68\x6a\x3f\x63\x81\x6d\x9f\x23\xa4\x6d\x72\x20\xd5\x28\x9a\xc4\x07\xb0\x9d\x2e\x74\x6d\xfc\xa4\x47\xc2\xd5\x1e\x1f\xa8\x16\x21\x99\x9e\x0a\xb2\xa3\x61\x69\x8f\x0b\x48\x3b\x95\xcd\x6e\xf6\xf1\xfc\xfa\xdc\x61\xf6\xf1\x0c\xec\xe0\x57\xf4\xea\x8e\x87\x7a\x9d\x3a\xc8\x6b\xe4\xd0\x02\x2b\x1e\x8e\x92\xb2\x6b\xf8\x2a\x72\x1c\xaa\xd6\xdc\x28\xaa\x0e\xdf\xdd\x5c\x80\x97\xe2\x16\x1b\xc4\xde\xbc\xef\x90\x8f\x76\xa0\xd4\xf0\x77\x4e\xb9\x2d\x15\x54\xe1\x43\xac\xf1\x7f\xea\x0f\xb0\x59\x53\xac\x7c\x02\xd5\x9e\xda\x8e\xf1\x84\x8a\x2a\x8e\xca\x4f\x89\xf5\x81\xec\xfb\x16\xc0\xf6\x1f\x9d\x11\x5d\xf5\x20\x77\xd5\xfb\x58\x00\x81\x5a\xfc\x9d\xe8\xa6\xce\x41\x85\xc8\x69\xca\x44\x2f\x1d\x0d\xe1\xf1\xe0\x49\x58\x20\x5c\xe6\x74\xdb\x41\xbd\xe3\xa8\x27\x46\xb8\x7d\xad\xe5\x60\x6a\x6e\x31\x65\x45\x26\x0f\xb9\x25\x6d\xbd\x73\xf7\x20\x5b\x65\x8e\x08\x1f\x7a\xa5\xfc\x1d\xd5\xf3\x6e\xfe\xbd\xd9\x8b\x7b\x30\x72\x90\xea\xe3\x73\x41\x80\x2c\x5c\x85\x3a\xbd\xa3\x59\x06\x0d\x17\x64\x29\xa0\xbc\x9e\xef\xf2\x10\x90\x93\xae\x65\xea\x8a\x83\x37\xd6\x03\xcd\x0c\x9a\x83\x9c\x33\x93\x9c\x17\xd5\x28\xe7\xb8\xf5\x9c\x16\xfa\xfc\x2f\xd5\x7f\x2f\xed\xd2\xff\xc7\x31\xf8\x06\x2a\x9a\x05\xae\xf0\x50\x8c\x63\x85\x85\x61\x78\x9f\xbd\xae\xde\xf3\x91\x88\x5c\x58\x38\x81\x2b\xb1\x2a\xca\xda\x18\x0e\x5b\x6d\xa7\x18\xab\xd8\x59\x69\x55\x49\x74\xcb\x84\xfd\x2f\x96\x36\x3e\x75\x05\x80\x5d\x79\xb0\xd2\x91\x36\x17\x5b\x87\x6d\x9f\x7b\x88\x72\x3b\xee\xc4\xde\x96\x87\x03\xd6\xa8\x6e\x1c\x2e\x14\xe7\x87\xfe\xe5\xc9\x0e\x5a\xba\xd8\x93\x5c\xb3\x1d\xdd\xf3\x9e\x20\x7b\xa8\x68\x18\x5c\xeb\x8a\x34\x00\x93\xba\xde\xf2\x29\x81\xde\x05\xb8\xfb\xee\x3a\xc3\x23\xba\xee\xd5\x07\x8b\x79\xae\x61\x74\x85\xc2\x10\x06\x09\xc3\xba\x5d\x76\x51\xcf\x7e\x93\x4a\xc1\xc8\x9e\xd3\xc1\x06\x86\x80\x9a\x49\xa9\x14\x28\x00\xd5\xcc\xfd\x92\x02\x55\xec\x15\xf9\xb9\xc6\xd3\x9f\x17\xcd\x7f\x2d\x11\x53\x97\x8a\x65\x92\xa6\x4c\xd9\x5f\xa1\x79\xfe\xb2\x46\xe1\xfa\xb7\x1e\x60\xa4\xe4\x67\xb3\xa3\x42\xea\xa5\xe6\x29\x4b\xa8\xfa\x79\x45\x3e\xec\x99\x52\x3c\x75\x6e\x77\x0f\x5e\xae\x89\x3d\x5f\xc5\xb2\x03\x91\xa5\xb1\xaf\xf7\x1a\x47\x75\x22\x0b\x90\xad\xee\x7d\x2d\xf7\x9c\xf2\x6a\x14\x08\x51\xd5\x65\x01\x4e\x78\x08\x2b\x3d\x90\x54\xda\xa9\xb4\x5c\x90\x83\x2c\x81\xc8\x17\x5d\xae\xec\x2a\xc3\x73\xed\xf1\xa5\xc4\xd6\x27\x6b\xc5\xe8\x1d\xa1\x06\x8a\x59\x1a\x9e\x63\xb7\x77\x59\x1a\x22\xa4\xe1\x09\x5b\x1d\x4b\x4a\x03\x97\xf7\xa8\xcc\xbf\x2b\x14\x0c\xb5\x5f\x1d\x4a\xd7\x27\x05\x6b\xb1\x6b\xbd\xa7\x18\x63\xaa\x4a\x01\xd3\xf6\xf6\x68\x80\x9e\x14\x5d\xb6\x1f\x16\xcf\xa9\xda\xc6\xd4\x4c\x3c\xbb\x50\xdb\x12\x8b\xf5\x3a\xba\xc8\x84\x51\x07\x08\x7e\x45\x3c\x4b\x65\x72\x67\xd1\xda\x72\x8a\xb3\xc1\x96\xb2\xaf\xdf\xbf\xb1\x07\x0c\x97\x9d\xbb\x26\xf0\xae\x90\x67\xa1\xe4\x9e\xa7\x2c\x5d\x91\x4f\x54\x71\xd0\xf7\x9c\xc4\x9c\x30\x4d\xfe\xf0\xfc\xd3\xc5\xc7\x9f\xae\x2e\xde\xbf\x1d\xaa\xe6\x6a\xaf\x04\x7b\x28\xa8\x48\x59\x4a\x4a\x5d\xb7\x85\x72\xd0\x3c\x3b\xb3\x88\xb5\xe7\x4a\x0a\x60\x55\xe4\x72\x03\xfa\x01\xce\x35\x30\x68\x42\x85\x5d\xdb\x9a\x41\x87\x8c\x6c\xcf\xd2\x45\x53\x96\x4f\x2a\xa5\x8f\x8b\xa2\x34\x3e\x88\x04\x90\x6f\x3d\x34\x66\x29\x90\x28\xa5\x08\xb8\xc6\xce\x88\x3e\x08\x43\x1f\x3c\x49\x64\x3a\xa1\x85\xef\x75\x45\x49\x2a\xcb\xe1\x85\xfe\xe1\x0f\x0b\xc2\xd9\x2b\xf2\x87\xc6\x70\x2b\xf2\xd6\x8d\xd0\x00\x24\x36\x3b\x62\x10\x9f\x5c\x03\x6c\x28\x5f\x04\x4b\x84\x66\x56\x1a\x82\x9b\x56\x8b\xe4\x1e\x70\x84\x55\x55\xe2\x85\x34\x2b\xf2\xda\x43\x6c\x68\xf7\xd0\x79\x28\x8d\x55\x82\x0c\xd5\x77\xfa\x1c\x99\xd0\x32\xa5\x86\x2e\x1b\x57\xe5\x1c\x25\xfc\x65\x22\xf3\x9c\x8a\x74\x49\x1d\x92\x2e\xab\x43\x3f\xff\xda\xd5\x97\x5d\xd2\xea\x2d\x2e\x96\x74\xa9\x77\x2c\xcb\xfa\x95\x9b\x60\xfd\xe3\x51\x9d\x27\x5c\xda\xd5\xad\x21\xe6\xc6\xbd\xad\x2e\x18\x8e\xb6\x22\x57\xd2\xb8\xde\x4e\x0e\x29\x38\x08\xb0\x76\x27\x80\x4a\x43\x1a\x44\xfb\x66\x92\xb7\x57\xb7\x1f\xff\x7e\xfd\xe1\xf2\xea\x76\xf4\x2a\x0e\x8c\x38\x72\x41\x63\xae\xe2\xc0\xc8\xc3\x17\x74\xfc\x2a\x0e\x0c\x19\xb8\xa0\xe3\x57\x71\x98\x2c\x0c\x5e\xd0\xe8\xab\x38\x30\xf6\xc0\x05\x8d\xbf\x8a\x03\xe3\x76\x2e\xe8\xef\xfc\x2a\x32\xb1\x8f\xb8\x86\xef\x9c\xc6\xd1\x40\xcc\x0a\xde\xae\xda\x6d\xe5\x92\xae\xc5\xc5\x21\xee\xd7\x01\xfd\xf4\x5d\xb7\x56\xf7\x56\xec\x3f\xd1\x76\xab\x17\xd1\xbb\x54\xe2\x5e\x18\xb4\x85\x00\x29\x79\x3d\xb6\x81\x18\x53\xdf\x24\x03\x59\xd3\x3e\xd6\xb7\xee\x15\x98\xf9\xc0\x94\x17\xb4\xf6\xbc\xfe\xe9\xf2\xcd\xdb\xab\xdb\xcb\xef\x2e\xdf\x7e\x7c\xb2\x89\x0f\x8a\xa6\xc7\xdb\xf8\xa6\x50\xc3\xe0\x26\x6a\x4a\x59\x28\x66\x25\xcf\xba\xc4\x7b\x3f\xfa\x21\xde\x05\xc7\xac\x85\x49\x6c\xf3\x74\xa8\x0c\x1e\xbd\x43\x22\xd1\x0d\x8e\x18\x4f\x90\x5b\xa4\x37\x38\xe6\x54\xb2\xec\x08\x70\x70\xcc\xcf\x42\x9c\xf1\x79\x3c\x89\x0e\xaf\xb8\x2d\x49\xbd\x61\x1b\x5a\x66\x28\x71\x3f\x7b\xd6\xd1\x2f\x9a\x4f\x3c\x5a\x7f\xa7\x64\x1e\x6f\x8a\x85\x9e\x70\x95\x65\xb1\x0f\x63\xce\x5c\x3b\xb1\xb0\x07\xb6\x41\xf8\x9c\xb8\x81\x6d\xfa\x9c\xbc\x81\xfd\x80\x02\x23\xc4\x3a\xa6\x2b\xb3\xd2\x7f\xb0\xc3\x47\x16\xa8\xba\xdc\xb7\x59\xf0\x2e\xb8\x66\x59\x18\xfc\x5d\x99\x75\xc6\xfc\xcb\x53\x6a\xd8\x44\x56\xb0\x79\x7a\xe9\xac\x49\x35\x4c\x62\xab\xcc\x7c\xb9\xee\x0d\xff\x7c\x96\xda\x31\xb1\x95\x63\x26\xc1\x7c\x4a\xd5\x98\xc9\x71\x32\x51\xdb\x7a\x5c\xd1\x98\x29\x25\x63\x62\x0b\xc6\xc4\x94\x8b\x89\x2e\x16\x03\x67\x3d\xf5\xfe\x9f\xd5\x04\x00\xfb\xf0\x3a\xbc\x2e\x64\xfa\xca\x5b\x92\x34\xc9\x99\xa1\x56\xf6\x5d\x59\x84\x1c\xc7\x9d\xd6\xeb\x60\x9a\x5e\xd4\x7f\x83\x8e\x2b\xba\xf1\x07\xa0\x92\x68\xf1\x1b\x1f\x5a\x17\x2c\x59\x09\x99\x32\x7b\x09\x17\xf8\x4f\xc7\xdb\x2f\x30\x0f\xda\xfd\x60\xa8\x29\xf5\x6a\x27\xb5\xb9\xbc\x8e\x18\x16\x5f\x2f\x64\x7a\x79\xbd\x68\xfd\x4b\x07\x59\x10\x99\x48\x06\x63\x1a\x55\xd4\x4f\xa8\x65\x05\x54\x9b\xa7\xf0\x9f\xdf\xd9\x83\xbb\xa6\x66\x17\x85\xfd\x5c\x93\x7b\xc5\x8d\x61\x02\x24\x15\xe8\x01\x2c\x37\x0b\x7b\x13\x6a\xc6\xbb\x7f\x19\xe8\x56\x51\x3f\x93\x2e\xfe\xc6\x2f\x73\xf2\xd6\x21\xfc\xc0\xed\x1b\xb1\xb4\xf6\x8b\x47\x48\x83\xfe\xa9\x3b\x10\x5d\x5c\x5f\x92\x3d\xc2\xf3\xc4\xdb\x8c\xbf\xf9\x9b\xc8\x53\x8b\xbe\xff\xbe\x9b\xed\x77\x4f\xa4\x03\x7e\x9c\xaa\x06\x82\x17\xa6\x5f\x41\x47\xb3\x51\x78\x55\x5d\x75\x49\xc6\x73\xee\x3a\x5d\x5a\xb8\x30\x2b\xe7\x3d\xc7\x3f\xae\x92\xa2\x5c\xb8\x17\x56\x39\xcb\xa5\x3a\x8c\xdf\x52\xf7\x3a\x2b\x76\x2c\x67\x8a\x66\x4b\x6d\xa4\xa2\x5b\xb6\xa8\x86\xc7\x61\xab\x7f\xe1\xc0\xe3\xb7\xb2\xb1\xc0\xee\xe8\xa8\xcb\x38\x8f\x42\x76\xf0\x54\x91\xa5\x27\xa5\x0c\x15\x94\xc7\x2b\xa0\xe0\x33\xe0\xc2\x42\x99\xa6\xc2\x43\x10\x63\xf7\x32\x2b\x73\x16\x41\x5d\x49\x83\x3f\xc3\x97\x4c\xec\xad\xd0\xab\x4f\x2e\x05\xa4\x7c\xcf\x75\x5c\xb3\xd7\x1e\x21\x80\xbb\xfe\xbb\xb2\x34\x45\x69\xec\x4a\x73\xec\xd1\x15\x4b\x0a\x7c\x1b\x90\x46\x07\xe8\x16\xfd\x7b\x19\x6e\x16\xf7\x88\x0d\xfb\x99\xa6\x1f\xed\x47\x4f\x52\xea\x9b\x59\x91\xbf\x13\x9f\x4b\x3c\xf5\xf2\x4b\x39\x15\xf1\xc2\x58\xa5\xd3\x28\x30\xed\x1a\x00\x50\x72\x25\x4a\x13\x18\x2e\xbf\x53\x3f\xbf\x94\xce\x73\xaa\x9a\x9d\x8f\xae\xd8\x39\xeb\x51\xbf\x27\x3d\xea\x31\x95\xc7\xa6\xd7\x1e\xfb\xe2\x95\xa8\x88\xd7\xc6\x03\xe3\x06\x13\xe7\x23\xc6\x1f\x35\xde\x0f\x5b\xb2\x7a\x0d\xf8\x5e\x12\x33\x92\x14\xb2\x28\x33\x6a\x06\x4c\xa0\x61\x37\x52\x23\x24\xc4\x11\xa8\xda\x48\x5b\xbb\xe4\x90\x37\xe5\x23\xa6\xeb\x96\xd1\x9a\x5c\x64\x19\xe1\x02\x09\x14\x0c\xeb\xad\xa1\x8a\xa1\x90\x45\x28\x9a\xf7\xf7\xc3\x76\x7c\xe8\x9e\xd5\x5a\xa6\x55\x72\xb4\xa1\xd8\xdd\x91\xfc\x08\xbd\xeb\x80\xac\x3a\x63\x23\x17\x24\x2f\x33\xc3\x8b\x41\xdb\x64\x25\x16\x54\x0d\x80\x09\xd5\x5a\x26\x9c\x7a\x37\x24\xc1\xf6\xa1\xda\xf8\x8d\xc3\xca\x0d\xbd\x1b\x1a\xb2\x50\x2c\x61\x29\x13\x09\x83\x56\xf2\x25\xab\x61\x88\x35\x14\xde\x8a\x7d\x65\xb7\x2d\xd1\xc7\x84\xcc\xc0\x8e\x3c\x84\x51\xf4\x8e\xb5\x46\xfe\x1c\xde\x16\x8b\x74\xce\x2a\xda\x70\xba\x00\x7f\xaa\x34\x05\xdf\x2d\x7f\xf0\x76\xd5\xd1\x62\x4f\x70\xb3\x54\xa6\xce\x11\x31\xa1\xc3\x53\x6b\x43\x51\x9b\x97\x9e\xc0\xfc\x3a\x67\xcf\xf4\x3e\xbf\x66\xd2\xdc\xe7\xc9\x84\x8b\x62\x22\xc5\x48\xb7\xc6\xe3\x58\xa8\x46\xe9\x14\x9e\x32\x61\xac\x72\x03\x31\x7c\x85\x62\x05\x13\x60\xea\x60\x34\xd9\x8d\x32\x39\x47\xaa\x6b\xeb\x7d\xed\x44\x3c\xad\xa3\x10\xe5\xc8\xa9\x17\xf0\xa6\x4f\x92\x9d\x6f\xdf\x6f\xe7\xf6\xb9\x03\xfe\xd5\xae\xde\x13\x65\x2b\xde\x17\x13\xde\xb3\xf5\xb3\x37\x8d\xc0\x22\xc0\xbe\xc9\xb8\x53\x87\x7d\x9e\xc3\x28\x43\x28\x02\x81\xc2\x68\xef\xe4\xba\x26\x13\x55\xb8\xf0\x8e\x6f\x2d\xf0\x33\xb6\x67\x99\xe3\x8c\x04\xab\xb6\xe6\xc3\xc2\x92\x91\xde\xd2\x61\xa5\x7d\x89\xc1\xa8\x2d\xd1\x09\x96\x64\xc9\x89\x45\xed\x4c\x52\x8c\xdf\x55\x32\xcb\xba\xd5\x60\xfd\x93\xf1\x3b\x46\xde\x54\x11\xf1\x68\xf3\xbb\x31\xd4\x58\x54\xbe\x61\x66\xc8\x8a\x3e\x82\xa6\xb0\x96\xeb\x32\xcb\xae\x65\xc6\x93\x01\x6d\xba\x7d\x3c\x10\xdb\x4f\x8a\x32\xcb\x48\x01\x1f\xad\xc8\x07\x01\xf7\xfd\x22\xbb\xa7\x07\xbd\x20\x57\x6c\xcf\xd4\x82\x5c\x6e\xae\xa4\xb9\x46\x61\x66\x88\x26\x36\x9d\xd1\xf8\x39\xe1\x1b\xf2\xca\x8a\xd1\xda\x10\x43\xb7\x20\x68\x7a\xb3\xf2\x02\x4a\x63\x35\x86\x1d\x18\x15\xae\xf9\x3d\xd7\xbd\xd2\xda\x93\x91\xe9\x6b\x18\xc9\x92\x24\xfc\xf7\xa3\x00\x9f\xf1\x0d\x4b\x0e\xc9\x50\x7a\x60\x9b\x85\x41\x5b\x58\xed\x63\x88\x59\x03\x07\x7d\x82\x88\x6b\x73\x0e\xc2\x6a\x6f\x14\x2f\x41\x0b\x59\x21\x85\x06\xeb\x56\x8d\x8e\xd5\x4a\x50\x05\xd0\xd1\x12\xee\x38\x03\x29\xa4\x36\x37\x56\x4b\x18\xa6\x7d\x6d\xdc\xba\xf6\x1f\x10\x88\xe0\xcf\x32\x96\x12\x9e\xe7\x2c\xb5\x5a\x41\x76\x20\x74\x03\xb5\x82\xa3\x3a\x8a\xd9\x11\x14\xc3\x23\xbf\x44\x66\xb4\xa3\x22\xcd\x98\x22\x1b\xca\x33\xa7\x79\xb4\x34\x1a\xc3\x54\xce\x85\xfd\x24\x30\x2e\xda\xb2\x41\xf9\xb1\xca\x53\x92\x48\x6c\x76\x6f\x24\xa8\xf6\xee\xa7\xfa\x6e\x00\xfd\x1e\xa5\x1a\xa4\x51\x12\xb9\x5a\xd2\x3a\x93\xc9\x9d\x26\xa5\x30\x3c\x73\x59\x59\xf2\x8e\x24\x32\x2f\x32\xc0\xd5\xb8\xb6\x2b\x13\x91\xbc\xfa\xcf\x65\x85\x19\x4b\x3b\xaf\x3e\xff\xba\xfe\x09\xfe\x30\xcc\x22\xe3\x64\x0b\xf6\xc0\x92\x09\xa5\xc8\x2d\x95\xb1\xc0\x97\x22\x3b\x10\x29\x2a\x11\x03\x0b\xe5\x41\x0c\x3e\xdc\x82\x11\x8e\xb8\x66\x35\x41\x59\x91\xb7\x0f\x2c\xa9\xfe\x8d\x2a\x17\xc5\x2e\xfd\x46\xc2\x75\x3a\x5d\xdb\xb6\x40\x88\xee\xe0\x9e\x5f\xe3\x57\x80\x9c\x80\x1a\xf8\xcf\x8c\x0b\xb8\xc5\x2e\x6c\x37\xc2\x2e\x84\x55\xb8\xdb\xf8\x85\x37\xc0\xc9\x57\x24\xe5\x8a\x25\x46\xaa\xc3\x84\x46\x70\x7e\x3d\x76\x7d\x4a\x4a\x43\x9e\x9f\x9d\x9f\xbd\xe8\x18\x35\xce\x74\xa3\x15\x7e\x8c\x6d\xf4\xb6\x31\xb6\x65\x00\x3c\x2f\xb2\x03\xec\xf6\x2c\x5d\x10\x6e\x7c\x84\x4f\xa0\xbe\x78\xf7\x71\x31\xcd\x0b\xa2\x25\x31\x8a\x56\x59\x47\xf0\x57\x3b\x0c\x54\xd5\x01\x4a\xfb\xfc\xec\xff\x3d\x8b\xb1\x3c\x32\x93\xbc\x20\xf7\x52\x9c\x19\x00\xe3\x8a\xdc\x62\x2e\x5b\x35\xd5\x41\x96\x44\x30\x4c\x41\x62\x0f\x45\xc6\x13\x6e\x22\x3c\x7c\x04\x88\x1f\x91\xa5\xc1\xbc\x08\x6a\x7c\x3c\xf6\xdb\x07\x6e\x9c\xfb\xdc\xe2\xff\x37\x80\x19\x48\xe6\x62\x40\xa0\x49\xc6\xf7\xec\x7c\xc7\x68\x66\x76\x58\x49\x5d\x48\xb1\xfc\x27\x53\x12\xa2\xb6\x85\xfb\x65\xfc\x90\x82\xf6\x8d\xe6\x33\xc9\xe6\x1a\x16\x21\x8f\xdf\x1b\x35\x37\x5a\xd2\xf7\xfd\xa4\x9e\x2a\x7f\xbb\xbd\xbd\xfe\x9e\x99\x23\x92\x60\xc7\xf1\x0e\x4c\x50\x1d\x99\xda\x48\x35\x82\xca\xf1\xb4\x61\xa8\xc8\x68\x68\x9d\x52\x1b\xcc\xea\x42\x66\x2e\xac\xc6\x67\x64\xcb\xcb\x16\x79\x89\x0b\x99\x92\xcb\xeb\x15\xf9\xbb\x2c\xed\x9a\xd7\x74\x9d\x1d\xaa\xd4\x20\xcd\x0c\x79\x66\x27\x7b\x66\x6f\xb5\x85\xc3\xdf\x18\x4d\x87\xe5\xd4\xe6\x63\xaf\x14\xa3\x83\xe1\xfe\x8d\x55\xc4\xa3\x48\x63\x05\x53\x49\x69\xa9\x8d\xcc\xc9\x0e\x3f\x3e\x8a\xb1\x76\x67\x1b\x43\x9b\x2c\x86\xf8\x2c\x46\xc5\x0a\xb8\x7a\x7e\xd4\x13\x5e\x9b\x0e\x56\xe2\xae\xab\x34\x41\x6d\xc5\xa0\xe6\x96\xa2\x1c\x0a\x46\xd6\xd1\x92\x02\xb7\x62\x8f\x3c\xca\x77\x33\xad\xa3\xde\x94\x0e\x73\x3d\xd6\x0c\xdc\x93\x53\xce\x02\x06\xff\xe3\x67\x62\x87\xb5\x88\xa8\xec\xf8\x65\xc2\x50\x9f\x67\x9d\xf1\x0d\xd2\x46\x1c\x24\xed\x17\x63\x57\x3c\xa1\x3b\x64\x3c\x0d\x27\xa4\x88\x8a\x55\xea\x2d\x94\xe2\x72\xe9\x5d\xee\x3c\x20\xf2\x70\x41\xe2\xbe\xf5\x45\x81\xbe\x90\x63\x6d\x83\x09\x68\x04\x87\x0f\xa3\x3e\x75\x0b\x6e\x9c\x99\x0b\xc3\xb6\x11\xf7\x75\x39\x31\xe0\xa3\x9b\x00\xa1\x5c\x9d\xe8\x3a\xe6\x10\x2b\x27\x23\xf0\x22\xce\x5d\x76\xbc\x53\x57\x38\xa0\x37\x42\x79\xf2\x09\xd9\xd0\x2f\x63\x30\x49\x92\x3f\xff\xd7\xff\xfa\xc7\xff\xba\xc2\x25\x56\xbe\x2c\x41\x2e\x2f\xae\x2e\x7e\xba\xf9\xf4\x1a\x82\xe7\xc7\x4f\xf1\x61\x59\xeb\x33\x4b\x2e\xcc\x52\xaa\x25\x42\xea\x15\x31\x6a\x14\xab\x21\xba\x6f\x6a\x03\xaf\x1b\xf8\xa8\x59\xb0\xc0\x71\x5e\xa7\xff\xf9\xc2\x19\x31\x6c\xa4\x69\xf9\xb0\xe8\x7b\x42\xbc\x8d\xed\x2b\x35\xd8\xf1\xa8\x3d\xe3\xb8\x53\x37\x29\x6e\x64\x72\x37\x49\xce\x3a\xbb\x7d\x7d\x8d\x1f\x35\x44\x2d\xa8\x91\x01\xca\x17\x17\x7b\x99\xed\xc7\xd1\x9e\x92\xdb\xd7\xd7\xb0\x91\x15\xfc\x17\xe8\xa5\xa0\x1a\x1c\xec\xc8\x3e\x90\xcc\x99\x80\xad\x1a\x31\xa6\x84\xe3\xa8\x8a\xd1\x8c\x6b\xc3\x13\x18\xb5\x36\x91\xd8\xf1\xc3\x96\xe1\xcf\x2a\xf5\x9d\x7d\xf0\xc6\xe4\x71\x01\x30\xee\x32\x36\x04\xc0\x93\x36\x6d\xfb\xd7\xa5\x9c\x8e\x62\x62\x9c\xdf\x4c\x39\x8f\x9e\x5f\x96\xb6\x44\xbc\x54\x28\x76\x63\x64\xa0\xfe\xec\x91\x85\x11\x5f\x1f\xb0\x2f\xae\xd9\x46\x2a\x16\x6f\x60\xac\x0d\x86\x24\x2d\xe1\x26\x52\x01\xb1\xcf\x5e\x57\x94\x4d\xd3\x5f\x30\xc6\xc2\x3e\xba\x4c\x76\x5e\x47\x17\x4c\xeb\x73\x30\x25\x96\x05\xca\xe8\x60\xb6\x2c\x15\x5b\xd8\x3d\xb3\x1c\x76\xb4\x88\x89\x13\xb4\x9b\x61\x02\x5f\x67\x26\xc1\x10\x13\x6f\x0b\x75\x96\x14\x0f\x8c\x23\x13\x64\x68\x54\x45\xf5\x8e\x41\x5e\x19\x7b\xe0\xc6\x95\xac\x51\x8c\x6a\x89\xed\x37\x3c\x70\x80\x9e\x6b\x68\xec\x05\x86\x90\x10\x27\xa9\x17\x86\xc3\x5d\xcb\xf4\xec\x4c\xb7\x86\xda\x2a\x9a\x30\xab\x81\x73\x99\x12\x48\x48\x48\xe5\x7d\xc8\xb5\xb5\x66\x5b\x2e\xb4\x3f\x5b\x2c\xbe\x83\x48\x60\xa9\x39\x03\x0b\x93\xcf\x7f\x5f\x91\x8f\x55\xb2\xdd\xb8\xa5\x56\x96\x26\x91\x35\x91\x70\x2b\x3f\x36\x2c\x43\xd8\x0a\x1c\x7d\x49\xb3\xa0\xf1\xa7\x42\x27\x1f\xf3\x63\xc6\x41\xe0\x2c\xcc\x81\x51\x1b\x08\x38\xd5\xc2\x1c\x02\x81\x6a\x7c\x35\x78\x3e\xdc\xea\xc8\x34\xd9\xb5\xfd\x2e\xb3\xb1\x7a\x36\x56\x87\x9e\xd9\x58\x3d\x1b\xab\x67\x63\x75\xef\x33\x1b\xab\x67\x63\xf5\x6c\xac\x1e\xff\x76\x36\x56\xcf\xc6\xea\xd9\x58\xdd\xf3\x7c\x89\x26\x97\xd9\x58\x1d\xfe\x7c\x36\x56\xcf\xc6\xea\xc0\xa8\xb3\xb1\xba\xf7\xfd\xdf\x03\xe5\x9c\x8d\xd5\xa1\x8f\xbf\x30\x63\xf5\xc8\x0b\xde\xea\x7b\x6d\x65\xdc\x98\x48\xec\x6b\xb0\xb1\xf1\xc4\x99\x87\xe5\xa6\x15\xd5\x8b\x83\x35\x4a\x4c\x0f\x2c\xbc\xce\x07\xf4\x31\xad\xce\x08\x5c\x1b\x9d\x7b\x63\x82\xc1\x9e\x37\x30\x66\x7c\x74\xb5\x0f\x81\xd7\xe7\x85\xc4\xff\x57\x5b\xf2\x1a\x26\x3c\x94\xfb\xfb\x2f\xfd\x38\x11\x0b\xdb\xee\x1e\x65\xb7\x6b\x5b\xe6\x02\xc8\xf3\x04\x9b\x5d\x1c\x75\x8e\xb2\xd5\x3d\xc2\x4e\x17\x67\xab\x8a\xb5\xd1\x1d\x5b\xe0\x46\x86\x8d\xb6\xcf\x35\xad\x6f\x23\x63\xc6\xd9\xe6\x86\x2c\x6f\x63\x22\xda\x80\x5d\x6e\xd4\xea\x36\x32\x6e\xbf\x4d\x2e\x68\x71\x1b\x5b\x69\xaf\x3d\x2e\x68\x6d\x1b\x07\x6c\xa4\x2d\x2e\xca\xa0\x10\xcd\x0e\x63\x74\xb7\x08\xca\xed\xdc\x6a\xb7\x3b\xc5\xf4\x4e\x66\x81\x9b\xd4\xba\x45\xef\xb9\xe0\x79\x99\x43\x6b\x77\x7b\x61\xf8\xbe\xf2\xd0\xe9\x0a\xe3\x91\x86\x06\xad\x5b\x6b\x86\xdd\xe1\x53\x06\xd5\x64\x28\xcf\xec\x69\x40\xa2\xc3\x8e\xee\x81\xe2\x94\x49\xc2\x18\xd4\x30\x7f\x13\x65\x30\xfb\xe3\xaa\x5a\x5d\x55\x10\xf1\xe5\xf0\xc9\x60\x75\x17\x90\x58\xfe\xf8\xed\x08\x24\xc3\x52\xcd\xa8\x09\xf3\x73\x98\x2f\xe3\xc8\xe4\xb8\x00\x3b\xd9\x64\x19\x51\x0c\xe7\xb3\x98\x2b\xa3\x4c\x95\x91\xb7\x28\xda\x44\x39\xdd\x3c\x09\xe7\x3b\xa6\xbc\x3c\xc6\x34\x19\x45\x45\x26\x9b\x24\x63\x6c\xd0\x8f\x32\x47\x4e\x31\x45\x3e\xaa\xce\xcb\x63\x4d\x90\x93\xf4\x8e\x68\xd3\xe3\x69\xcc\x8e\x9f\xa5\xa6\x52\x04\x5c\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb8\x69\xf1\x94\x66\xc5\x48\xd0\x8e\x2b\xc5\x11\x0a\xf1\x14\x65\x78\x82\x22\x3c\xd9\x7c\xe8\x80\x34\x72\xac\xb1\x0a\xf0\x91\x7a\x3b\x32\xea\xe3\x94\xdf\x27\x28\xbe\x31\xe6\xc2\xcf\x62\x2a\x9c\x66\x26\x8c\x3a\xed\xf1\xcb\x3d\xa2\xbe\x47\x5c\x55\x2e\xb8\xe1\x34\x7b\xc3\x32\x7a\xb8\x61\x89\x14\x69\x80\x52\x1f\x95\x3a\xa8\x70\x4e\xe3\x87\x4e\x72\x6b\x47\xd9\xec\xa8\xab\x96\x13\xf4\x7b\xbb\x00\x25\xaf\xb9\x3b\xe6\x02\xb5\x11\x71\x85\x8f\xc9\x5e\x3e\x81\x7e\x4d\x4e\x2a\x22\x62\x60\xd0\x34\x30\xff\x4d\xde\x13\xb9\x31\x4c\x90\xe7\x5c\x78\x48\xbf\x68\x08\x87\xb5\xac\x1d\x42\x39\x87\x9e\xf6\xbb\x97\xdf\xf8\x61\x7e\x2d\x51\x19\x84\x7a\x68\x37\xf8\x64\xad\xc3\x0d\xf5\x14\xb5\xc3\x0d\xb1\x29\xb3\xb6\xea\x81\xea\x48\xac\xde\xf1\xb2\x2e\x89\xf2\x12\xd6\x52\xe1\xb2\xd5\x26\x5d\x30\x63\x17\xe0\xc1\x11\x7f\x81\xa3\x88\x70\x09\x3c\xca\x1d\x80\x06\xff\x11\x16\x3b\xc9\x15\xd0\x34\xf6\x07\xc6\x9d\xe2\x06\xf8\x2c\xda\xd3\x09\x4d\xff\x53\xcc\xfe\xbf\x39\xc9\x26\xc2\xbc\xff\x3b\x92\x6c\x7e\x09\x59\xc0\xf0\x9c\xc9\xd2\x9c\x48\x0c\xc0\x2e\xa0\x0d\x8a\xcc\xc3\xf5\x8a\x64\x79\xd4\xa0\xe3\xa5\x1b\xb0\x97\x4b\x9d\x2e\xa2\xf6\x0b\x93\x12\x46\xce\x69\x58\x49\x1e\x6c\x02\x54\xcb\x62\x75\x8d\x72\xaa\x09\x25\x6f\xae\x6e\x7e\x7a\x77\xf1\xd7\xb7\xef\x56\xe4\x2d\x4d\x86\x4a\x85\x37\xaa\x84\x08\x6c\x88\x88\xb8\xbf\xa3\x7b\x46\x28\x29\x05\xff\x47\xe9\x9a\x6c\x3e\xaf\x46\x7c\xe1\xbd\x26\x03\x83\x8e\xd5\x57\x19\xa1\x19\xd0\x38\x60\x42\xa5\x4a\x6c\x34\x80\x66\x64\x69\xc5\x7c\x25\xf3\x63\xb7\xdf\x5b\xfb\xd3\x30\x89\xa2\x48\x7b\xa0\x3f\xe9\x96\xef\x9d\xc1\xce\x95\xa0\x69\xf4\x71\xb5\x28\x69\x31\xc1\x72\x43\xba\x06\x33\xf5\x20\x85\x12\xcc\x58\xec\xab\x34\x0e\x29\x74\x33\xff\xc2\x6a\x24\x7a\x41\xd6\x25\x98\xea\x0b\xc5\x73\xaa\x78\x76\x68\x4e\x41\xb3\x21\x7a\x73\x25\x3d\x87\x3e\x20\x3b\xae\x97\xff\xe6\xc3\xdb\x1b\x72\xf5\xe1\x16\x7a\x22\x59\xce\x0a\x56\x74\xf8\x1d\x00\xb3\x66\xc3\x60\x70\xb5\xad\x57\xe4\x42\x1c\xf0\x13\xbc\xe7\x5c\x43\x27\x61\x06\x9d\xef\x9d\x56\xee\x4b\x41\x3d\xfb\x66\x05\xff\x37\x54\xf6\x9a\xa6\xa9\xb2\xd4\xbc\x72\x42\x1c\xe5\x0f\x58\x2a\x0b\xf4\x9e\xaf\xb3\xc6\xd9\x39\xe8\xfd\x62\x9d\xc1\x2a\x67\xe2\xb5\xdd\x76\xb3\x41\x58\x75\x90\x00\x10\xac\x57\x0a\x4d\x48\x07\xe9\xc0\x68\x5f\xb3\xc8\x7a\x95\xf5\x82\xa2\xeb\xe5\xd5\xf4\xda\x33\x53\x77\x29\x64\xa3\xa4\x35\xb9\xbc\xf6\xc7\x12\x66\x68\x50\x46\xac\xe2\x85\xae\x18\x34\x0c\x8c\x26\x89\x05\xf9\x86\xfc\x85\x3c\x90\xbf\x00\x6b\xfd\x73\x68\xb0\x38\x0a\x1a\x27\xd6\xa2\xd4\x76\x79\x1d\x0d\x95\x1f\xed\x15\xb0\xdf\xd8\x9d\x1b\x49\xd6\x5c\xa4\xd8\xa1\xe9\xc1\x30\x65\x2f\xb6\x83\xd6\x93\x2b\x1c\xda\x49\x4e\x7a\x60\x60\x9d\x20\x97\x9b\x46\xad\xb0\xb0\xa4\x38\xf1\xc8\xec\xd0\x56\x92\xbd\x42\x24\x0f\x9b\xa7\x5b\x15\xcb\xea\x99\x72\x6a\x92\x5d\xfb\x06\x59\x16\xae\x1b\x4d\x94\xc3\xc2\x70\x2a\x41\x43\x40\x77\xe0\x8e\x07\xb1\xf2\xb4\x88\x34\xa9\xf9\x5e\xeb\x14\x8e\x20\x7d\x24\x28\x8e\x08\xe1\xa9\xe7\xac\x8d\x74\xa8\x42\xa6\xc8\xaa\x61\x51\x69\x83\xdc\x78\xae\x1c\x1c\xb4\xcb\xb1\x5d\x88\x4a\xa5\x3a\x03\x7e\xd9\x9b\xe0\xba\x71\x42\x05\x4b\x35\x92\xb1\x60\x6f\x4b\xd5\x03\x2f\x78\x30\x51\xf7\xa3\x50\xd2\xc8\x44\x06\x6b\x46\xb6\x4d\xc2\xee\x03\xd8\x06\xaa\x95\x5e\x13\xff\xe1\xcd\xf5\xc2\x6a\x84\x50\x3c\xef\xe6\xf5\x98\x55\xae\xd5\x1e\xee\xf6\xf5\x75\xb0\x4d\x4d\xc4\x66\xc6\xcb\x79\xb7\x48\xf8\x90\x58\xfe\xb4\xda\x93\x8a\xd1\x94\x9f\x2c\xb6\xc6\xb7\x3a\xac\x46\x9d\x12\x64\x93\xcb\x3d\x4b\x91\x81\xd7\x2d\x13\x53\x68\xc8\xab\x03\x91\x37\xe3\x32\xe4\xaf\x60\x19\x9c\x23\x6f\xe6\xc8\x9b\x39\xf2\x66\x8e\xbc\x09\xbc\x33\x47\xde\xcc\x91\x37\x73\xe4\x4d\x2f\x58\xe6\xc8\x9b\x39\xf2\x66\x8e\xbc\x69\xbc\x34\x47\xde\xb8\x45\xfd\xcb\xf8\xa7\xe6\xc8\x9b\xf6\x33\x47\xde\x74\x66\x99\x23\x6f\xbe\x0c\x9f\xda\x1c\x79\xe3\x9f\x39\xf2\x66\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\xa3\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\xf0\x39\x55\xdd\xbc\x63\x5c\x28\xaf\x65\x5e\x94\x86\x91\x8f\x55\xbb\xfa\xaa\x67\xfa\xfa\x80\x7e\xc1\xc6\xe5\xf8\x5c\x6e\x0e\x6c\xdb\x55\x2a\x08\x15\x39\xc7\x5a\x88\xcb\x04\x97\xb6\xac\xf6\xb3\xac\x56\x72\xfe\x58\x57\x07\xf6\xce\x1f\xc6\x87\x3a\x3e\xe6\x3a\x8a\xf0\x47\x11\xae\x36\xc4\xdf\xc1\x12\x1a\x86\x16\x6c\x16\xf5\x00\xe8\x4b\x73\x59\x62\x09\x48\xb7\xfb\xc0\xdc\x15\x5c\xd0\x4c\xf4\xeb\x81\x9d\xc4\xf7\x0c\x66\xfa\x57\x86\xfe\x47\xb7\x88\x63\xf8\x3b\xf2\xf1\x38\xf8\xfb\x2b\x03\x11\x08\xd5\x0c\x5c\x13\x99\x73\x63\xe5\x14\x2b\xec\x35\xa2\x85\x42\x5e\x0d\x6e\x5a\x36\x54\x87\x2d\xe0\x73\xa4\x06\xab\xa0\x56\x6e\x8e\x66\xcf\x35\xdf\x4d\x2d\x04\x2e\xa8\x7c\x5b\x49\x4b\x70\xea\x4b\xdf\x7c\x17\x08\xe7\x17\x8d\x41\x23\x2f\x58\x79\x5f\x71\x73\x78\x2d\x85\x61\x0f\x03\x12\x4c\x1b\x19\x6e\xdc\x27\xae\xab\xa0\xae\x44\x29\xe7\xc4\x54\xa5\x80\xa8\x86\x08\x56\x12\x03\x2c\xec\x36\x76\xee\x17\x0a\x50\x61\x0f\xe6\x7c\x60\xc8\xb8\xa3\x30\x54\xdf\xd5\xe7\xc0\x96\x96\x39\xd5\xe0\xee\xcc\xf5\x58\xc2\x09\x24\xe6\x5a\xf1\x3d\xcf\xd8\x96\xbd\xd5\x09\xcd\xe0\xcc\x63\x45\x80\x8b\x81\xef\x7d\x57\x45\x5d\x75\xd1\x1c\xea\x98\xed\xd6\x09\x42\x5d\x42\x05\xd9\x52\x2e\x48\x6e\x61\x54\xf8\x61\xa1\xfb\x9e\x80\x0e\x6f\x05\x55\x56\x21\x70\x1f\x84\x24\x2e\x08\x0c\x5b\x4b\x99\x39\x8f\x6c\x76\xa8\xd7\xe4\x5c\xfd\x42\xfe\x24\xd8\xfd\x4f\x76\x1e\x4d\x36\x19\xdd\x86\x7a\x51\x13\x57\x11\x96\x99\x4e\xc9\x96\x6a\x39\x64\x08\x1c\x21\xc2\xa0\x41\xfc\x23\x14\x3b\x30\xf6\xb6\xfb\x7e\x45\x5e\xbe\x00\xac\xa5\x9a\x54\xa3\x87\x8c\x2a\xdf\xbe\x00\xeb\xcb\xeb\x8b\xeb\x9f\x6e\xfe\x7e\xf3\xd3\xc5\x9b\xf7\x97\x57\x63\x57\x34\xdc\xa7\x34\xa1\x05\x5d\xf3\x8c\x87\x69\x77\xc7\x0a\xde\xfc\x0c\x08\x55\x9a\x9e\xa7\x4a\x16\xb8\x4f\x55\x0a\x88\xd7\xac\x63\xb0\x22\x0c\x19\xde\x07\x55\x85\x77\x62\x6b\xee\xf6\x54\x5b\x45\x85\xf1\xc2\xce\x58\x7d\x6e\x04\xb3\x2a\x85\x15\x54\x9f\xea\x71\xa3\xe9\x94\xa0\x84\x8b\x34\x65\x69\x6b\xe9\x27\xf6\x01\xbd\xf6\x43\x1f\xea\x88\x51\x72\xfd\xe1\xe6\xf2\x7f\xc7\xcf\x4a\x1c\x8e\x44\xb9\x07\x4e\xe4\xc1\x26\xc4\xa2\xc9\x04\x48\x7e\x74\xd1\x3d\x33\x2c\x07\xde\x19\xa9\xe4\xef\xa9\x4a\xe4\xe5\xfe\x58\x8a\x76\x64\x7e\x3d\x02\xc9\x65\xca\x56\xe4\x1a\x89\x22\x74\xdb\x0d\xd2\xfe\xea\xbb\x9a\x0c\x80\xf9\xd7\x7e\x2c\x0c\xa7\x59\x76\x20\x56\x12\xdb\xd3\x8c\xa1\x0b\x59\xc9\x41\x6d\x85\xd4\x25\xb5\x30\x2e\xb5\x49\x35\x36\x34\xd3\x81\x0b\x1e\x43\x07\x2d\xa9\x7f\x6f\x85\xc9\x48\x38\x55\xef\x93\x94\x09\x69\x9c\x5c\x6a\x67\x82\x80\x5a\x25\x13\x82\xb2\x29\xba\x21\x02\xbb\xaa\xc3\x89\x2a\x62\x09\x24\xd6\x93\x41\xae\xfd\x5e\xaf\xab\x39\x41\x13\x0f\x8c\x59\x6a\xa6\x8f\xb8\x8d\x23\x83\xb5\xb4\x6a\xe7\x55\x8c\xa6\x10\x1b\x56\x50\xb3\x03\xbb\x66\x60\xd0\x9c\xea\x3b\x96\xe2\xab\x2b\xe4\xc3\x4e\x92\xd6\xae\x03\x80\x5b\xde\xad\x85\xc2\x86\x51\x53\x2a\x06\xfc\x37\x2c\xe4\xae\x19\x61\x82\xae\xb3\x50\xe4\x59\x54\x50\x24\x4d\x3f\x88\xec\xf0\x51\x4a\xf3\x5d\x15\x52\x15\x79\x9c\x3f\x56\x3d\xc1\x9b\x1a\x34\x30\x5b\x30\x52\xa6\x4b\x00\x13\x04\x72\xc5\x55\x32\x7f\x53\x1f\xdf\x09\xd0\x53\x95\xe2\x42\x7f\xaf\x64\x19\xdb\x94\xc3\x62\xd0\xf7\x97\x6f\xe0\x56\x95\x78\x6f\x98\x30\xea\x00\x41\x91\x9d\x0c\x9e\x71\x19\x6e\x45\x7e\xb0\x38\x75\x84\x45\x56\xe2\x2a\x85\x66\x66\x45\xde\xd3\x03\xa1\x99\x96\x4e\x98\x0a\x49\x46\x82\x5c\x83\xcf\xa4\x29\xff\xaf\x08\xc4\x38\x63\xdc\xc5\x5a\x9a\x1d\x39\x7a\x61\x04\x39\xbb\x23\x62\xf8\x1e\x1a\x98\xea\x04\x25\x2e\x8e\x07\x0e\x21\x27\xbd\x63\x9a\x14\x8a\x25\x2c\x65\x22\x09\x9c\x61\xc3\x56\xf4\xe7\x3f\x3d\xc9\x7c\x0f\x27\x7d\x25\x85\x45\xe3\xc8\xb3\xbe\x14\x29\x4f\x28\xd2\x20\xd7\xcd\xba\x46\x61\xb0\x6a\x3a\x19\x93\x42\x0c\xdc\x08\x95\x2d\x35\x53\xd8\xdd\x59\x95\x0c\x81\xf8\x1f\xe5\x9a\x65\xcc\x60\xc4\x2d\xc4\xf5\x53\x83\xad\x04\xb0\xa1\x3c\x35\x1e\x31\xc2\x37\x9d\x09\x5d\x42\xbb\x10\xab\x1a\x1b\x92\x4a\x56\xc7\x2b\x52\x4d\x7e\xb8\x7c\x43\xbe\x21\xcf\xed\xfa\x5e\x80\x8f\x65\x43\x79\x48\x6c\x37\x12\xbd\x30\xc7\x72\xf5\xc6\x0f\x0e\xdb\x00\xfc\x24\x52\xe1\x35\x5c\x10\x11\xf2\xf9\x40\xb7\x18\xb7\x43\xab\xee\xf8\x18\x63\xe7\x99\x03\xa3\x4d\x1b\xd1\x03\xe8\x1c\x9a\x27\x8c\xe8\x43\xe8\x1c\x18\x71\x1c\xd1\x27\xa0\x73\x34\x49\xfa\x41\x33\x35\x81\x22\xfd\x70\x52\x8a\xd4\x14\x01\x2c\xd6\xb6\x77\x8f\xa8\x99\x33\x43\x53\x6a\x28\xe1\xa1\xe3\x28\x45\xa3\x23\xc8\xef\xe1\x80\x4f\x47\xaf\x34\x7b\xc7\x45\xf9\x80\x2e\xb2\x29\x2a\xe4\xcd\x5b\xf8\x90\x24\x7e\xf1\x00\x70\x5a\x14\x19\xc7\x00\xe1\x76\x1e\x65\x00\x32\x78\xc9\x9b\xe9\x31\x7d\x82\x0f\x5c\x65\x9a\x65\xd2\x92\x4a\xcb\xd5\xa9\x48\x65\x1e\x18\xf6\x78\x81\x56\x60\x62\x34\xd9\x35\x2d\xec\x3d\xc8\x32\x89\x49\xfd\x8b\xb3\xbd\x38\xd5\x39\x63\x7b\x16\x4c\xbb\x39\xce\xae\xb5\xef\x5b\xc1\xc9\x9f\x00\x0c\x40\x32\xba\x66\x19\x32\x0f\xc4\x92\x48\x67\x6b\x14\x0e\x45\xab\x66\x4a\x66\x53\x82\x91\x3e\xca\x0c\xfc\x5b\xb4\xda\x8c\x1d\xe0\x0b\xd9\x0b\xbc\x16\xbf\x17\x90\xeb\x5b\x7b\x01\x7d\xe7\xcb\xd8\x4b\x19\xe4\x44\x9d\xbd\x58\xc6\xd5\xde\x0b\x70\x90\x2f\x61\x2f\x11\x6a\xfd\x3d\x17\xa9\xbc\xd7\xd3\x89\xee\x8f\xf8\xa1\xa7\x0c\x89\x25\x3d\x86\x8b\xad\x6e\x12\x5e\x1a\x34\x96\x36\xf5\xd4\x3e\xca\xeb\x8d\xf3\x55\x3e\x75\x97\x46\x05\x46\xf7\x02\x57\xa9\x9d\x7f\xe6\x11\x8c\x34\x84\xf1\x51\xb4\xf1\xe4\x14\x70\x9b\x6b\xfa\x5a\xd9\xb1\x0c\xa7\xd9\x4d\x31\xa9\xed\xd9\xf7\xef\x6f\x2e\xda\x1f\x5b\xc4\xbd\x87\x94\x7b\xbb\x1f\xfb\x3b\xa1\x69\xce\xb5\x0e\x9b\xa4\x01\xbe\x6c\x0d\xed\xe8\x9e\x7b\x1f\xc5\x96\x9b\x5d\xb9\x5e\x25\x32\x6f\xb8\x2b\x96\x9a\x6f\xf5\xb9\xc3\xb2\xa5\x5d\xfd\x8b\x91\x71\xb9\xc8\xb8\x68\x18\x1d\x20\x81\xdd\x09\x75\xb0\xc0\xa4\xda\x01\x80\x1e\x33\x4d\x47\x06\x45\x2b\x6f\x0f\x00\x30\xbb\x94\xb3\x2c\x75\x86\x08\x0c\xc7\xb6\xf7\x39\x2b\x76\x74\x09\x0c\x63\x64\x70\x97\x33\x06\x7a\xfd\x4e\x0a\xe9\x7c\xe8\x18\x73\xec\x54\x29\xb4\x4b\xc0\x22\xdc\xcd\xb1\x6b\x19\x19\xb8\x69\xf9\x38\x09\x69\xeb\x62\xcf\xd5\x68\x60\xfd\x08\x06\x01\x00\x5d\xc6\x5c\x23\x1a\x67\x64\x67\xbd\x07\x89\xc2\xf7\xef\xe1\x1c\x2a\x8d\x67\x22\xf8\x41\xf3\x71\x9f\x59\x6a\xe3\x89\x70\xaf\x26\x34\xb2\xa9\x4e\xed\x95\x5e\x6d\xc8\xbe\xd2\xd6\x88\x46\xaf\x6f\x57\x5f\x1a\xd3\x8a\x46\x86\xec\x13\x76\x9f\x24\xeb\xf6\x0f\x7a\x02\x79\x97\xf4\xc9\xbc\x47\xf8\xbc\x66\xc6\xa1\x33\x20\x6c\x4e\x0f\x64\x3d\x76\x5d\x52\xae\xc1\xac\x09\x4e\xe9\x26\xf2\x7e\x6c\x22\xd2\xa9\xf1\xf4\xc9\x8e\x79\x0c\x6c\x8d\xce\xea\xbe\x69\xbc\x4f\x78\xd7\x14\x75\x2d\x53\x0c\x19\xaf\x82\x72\x07\xfb\x1f\xba\xd0\x75\xfe\x4f\xcf\xfb\x6b\xc9\x42\x48\x8c\x99\x68\xc6\x91\xfb\x06\xb3\xd8\x34\x75\x60\x4c\x67\xd1\x75\xcd\x57\x5b\xab\x40\x2b\xd7\x8e\xeb\x66\x72\xf8\xa2\x5a\x74\xc0\x69\xdc\x6c\xed\xb0\x20\xff\xa7\xd4\x86\xd0\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x3a\x25\x83\xd6\x14\x9f\x8b\x65\xa4\x5d\xcc\x9e\xa7\x8c\xa4\x7c\xb3\x61\xde\x2d\xbe\x66\xa4\xa0\x8a\xe6\xcc\x80\x1b\x05\x41\x0b\x5d\x78\xc5\x30\x32\xc8\x0d\xa1\xbe\xd7\x6d\x15\x01\xb7\x40\x1f\x2d\x37\x24\xe7\xdb\x1d\xca\x3a\x84\x92\x4c\x8a\x2d\x44\xf4\xd9\x25\x64\x92\x0e\xdd\x44\x20\x0e\x52\x91\x7b\xaa\x72\x42\x49\x42\x93\x1d\x58\x09\xa9\x20\x69\xa9\x20\xc1\xd3\x30\x9a\x1e\x96\xda\x58\x3d\xdb\x4a\x47\x60\x4a\x43\x08\x0c\x7a\xa1\x3b\x9d\x30\x00\x5e\x1c\x23\x91\x2d\x2f\xa9\xae\x89\xf3\x15\x78\xe1\xa0\x89\x7e\x03\xa3\xb7\x2e\xd8\x9c\xd2\x7f\xf4\xcc\x29\xfd\x73\x4a\xff\x9c\xd2\xef\xdf\x9c\x53\xfa\x3b\xcf\x9c\xd2\x3f\xa7\xf4\xcf\x29\xfd\x73\x4a\x3f\x3c\x73\x4a\xff\xf4\xb5\xcd\x29\xfd\x73\x4a\xff\x9c\xd2\xdf\x78\xe6\x94\xfe\xce\x2c\x73\x4a\xff\x97\x91\xac\x37\xa7\xf4\xfb\x67\x4e\xe9\x9f\x53\xfa\xe7\x94\xfe\x39\xa5\xff\xe8\x99\x53\xfa\xe7\x94\xfe\x39\xa5\x7f\xcc\x85\x96\xf2\x81\x54\xcb\x98\xac\x03\x67\xc0\x6f\xc4\x2a\xae\xcb\xcd\xc6\x6a\xa8\x72\x90\x59\xdb\x19\x3b\x96\xe8\x2a\xf7\xad\x72\x74\x39\x6b\xb2\x66\x66\x01\x69\x0d\x18\xa6\x33\x6d\x50\x17\x48\x09\x69\x8d\x8a\x69\x48\x03\x10\xe4\xed\x87\xef\x56\x8d\xa4\x87\x41\x53\xe6\x60\x2a\xc4\x58\xcc\x31\xac\xe6\x83\x48\x62\x9c\x92\x35\x60\xfb\x22\x41\x1d\x7c\x93\x4c\x6a\x8c\x29\x80\xa1\x87\x5c\x53\x3b\x2a\x04\xf3\x52\x07\x37\x20\x2b\xaf\x19\x13\x44\x16\x4c\xa0\x1f\xca\xb7\x65\x20\xd4\x18\x9a\xec\x56\x76\x7e\x11\x1c\xd5\x67\x87\x56\xb3\x5b\xd2\xcb\x68\x8e\xc0\x55\x2c\xa7\x1c\x27\x20\x34\x51\x52\x6b\x92\x97\x99\xe1\x45\x35\xc5\xd0\x89\x31\x88\x01\xc2\xc8\xac\x0a\x60\xe0\x58\x60\x68\x8a\x87\x98\x7e\x77\xb0\xda\x6f\x41\x8a\xd1\xc0\x6b\x90\x8d\x16\x90\xd0\x9e\x17\xe6\x80\x2e\x57\x74\x3c\x71\xa5\x0d\x49\x32\x0e\xec\x1f\x56\x87\x39\xa1\x30\xcb\x22\xe0\xd4\x37\x90\x2b\x0a\x7b\xd5\x6e\xb3\x22\x05\xae\x51\x18\x8d\x8e\xc6\x7a\x1a\x37\x41\xca\xb5\xe3\xd1\x7a\xc8\x33\x41\x7d\xef\x10\x3c\x6c\xbf\x57\x38\xee\x14\xa6\xf0\x73\xba\x3f\x35\x26\x19\x81\x02\xa4\x3c\x39\x45\xa9\xbe\x54\x90\x62\xec\xf3\x7c\x16\xad\x3e\x23\x45\x95\x2c\x67\x76\x74\xb8\xd2\x82\xbf\x88\x6e\xb5\x80\x04\x82\xed\x2d\xce\xb2\x84\x59\x11\x9a\x76\x6e\x18\x4e\xf7\xa8\xab\x64\x98\xca\xb9\x00\xb7\xec\x7b\xa6\x35\xdd\xb2\xeb\x41\x03\xcf\x90\xd8\x04\x36\x9e\x1a\xd4\x80\x08\x19\xc8\x50\xf5\x5f\x6a\x97\xd8\xd9\x10\x41\x68\x2c\x85\xe4\xb8\x96\x2a\x06\xf0\x5e\x71\x63\x75\x2a\xae\x31\x97\x0e\xec\x9a\xc7\x01\x97\xc3\x43\x37\x9d\x70\xef\xfd\xd0\xf5\x90\x96\xbe\x8b\x14\x1d\x57\x6b\x46\xd6\x8a\xb3\x0d\xd9\x70\x41\x33\xe7\x81\x1a\xc2\x2f\xc8\x11\xa1\x28\x50\x6b\x6d\x45\x53\x29\xbc\x63\xc5\xef\x61\x45\x7e\x74\x9b\x30\xaa\x14\x09\x1d\xcd\x59\x16\x32\x65\x84\x6f\xc8\x16\xbc\x5d\x0a\x1d\xea\x7f\xfa\xe6\xbf\xfd\x99\xac\x0f\x96\x23\x82\xa1\xd2\x48\x43\xb3\x0a\x4c\x19\x13\x5b\x7b\x06\x40\x20\x86\xee\x42\x96\x35\xd3\x2f\x3d\x64\xa1\xae\x0a\x6e\xfd\xe5\xb7\x77\xeb\x36\x4b\x3f\x4f\xd9\xfe\xbc\x71\x2e\xcb\x4c\x0e\xc6\xa5\x74\x9b\xe1\xf4\x33\xdf\x11\xf1\xb2\x07\x21\xa1\xf8\x42\x04\x4a\xfa\xe4\x27\xb2\x93\xf7\x98\x83\xd9\x83\x51\xb5\x4b\xbc\x90\x45\x99\x0d\x77\xed\x21\xe4\x3b\x8b\xc5\x00\xa7\xd2\x71\x87\x56\x38\x63\xef\xcd\x01\x45\xdf\x0d\x3c\x4c\xeb\x9a\x1c\x1e\x5d\x9c\x7e\x79\xd2\xc5\x43\x39\x25\xb7\xca\x7d\x2a\x15\x5b\x91\xef\x68\x96\xad\x69\x72\x77\x2b\xdf\xc9\xad\xfe\x20\xde\x2a\x35\x28\x06\xb4\xd6\x9d\x51\x4b\x97\x77\xa5\xb8\x6b\xb7\x5a\xc8\xe4\xd6\xca\x71\x45\x69\x7c\xc4\x4a\x63\x57\x03\x03\xfb\x95\xc2\x1d\xaf\x98\x00\x75\xbd\x6c\xea\xb1\xd9\x03\xe0\x15\x04\x3c\x51\x41\x98\x5d\xeb\x10\xa4\x2d\x46\x37\xd7\xa2\x9b\x68\xf9\xed\x37\x7f\xfa\x37\x44\x7d\xab\x5d\xfc\xdb\x37\xe0\xfc\xd7\x0b\x24\x2e\x96\x32\x0e\x53\x68\x9d\xd3\x2c\xb3\x8a\x44\x13\xa9\xed\xb1\xae\x62\x7b\x37\x8d\x61\xab\x89\x41\xcc\x68\xe1\xee\xf6\xf6\xef\x01\xc9\x8e\x1b\xcd\xb2\xcd\x02\x63\xef\xaa\x7c\xdb\x33\x60\x14\x67\x8e\x76\x59\xae\xde\x65\x0d\x8f\x13\xb3\xf6\x32\x2b\x73\xf6\x86\x41\xd3\x95\x88\x6d\xb6\xde\xf7\x11\x1b\x99\xeb\x8f\xb6\xce\x64\x72\x47\x52\xf7\x23\x2c\x76\x60\x9b\xe0\xb5\x72\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x1f\xc9\xf3\xd4\x8e\x5b\xcd\x35\xb7\xfc\x6d\x39\x2d\x0a\x68\x34\xb6\x81\x04\xa1\x7b\xdc\x40\x40\xc7\x82\x11\x5c\x27\x1d\x7a\x9a\xee\x5b\x38\xe8\x30\x43\xee\xd9\x4f\xfd\x89\x3f\x80\x02\xfe\x1b\xe3\x45\x26\xa4\xd6\x91\x3a\x6c\xaf\xda\x1b\x72\x0c\x0b\x19\xb8\x99\x4f\xee\xc3\x33\xa9\xef\x11\x98\x15\x1a\x9d\x9e\x9a\xf1\xca\x94\x14\x4c\x69\x68\x0e\x67\x3e\xc1\x89\xbe\xce\x28\x0f\x65\x74\x11\x52\x37\x3c\x7a\xda\x36\xc6\x3b\xf0\xd4\x67\x32\xf8\x4a\xc0\xdb\xf7\xc4\xde\x3c\x88\xe0\x90\x8c\x1f\x73\x87\xaf\x65\xea\x3e\x81\x4b\x8a\x85\x0b\x7a\x44\x2d\x1d\x91\xfb\x7e\xf2\xf6\x78\x9f\xea\xbd\xb4\xef\xaa\xfd\x4b\x75\x59\xf1\x2d\x77\x15\x07\xcf\xf6\x44\x57\x14\xa6\x9e\x74\x43\xe1\x6e\x36\x3a\x6e\xd5\xfc\xa0\x25\x42\xe3\x21\x04\x31\xb8\x16\x65\x9c\x4c\xbc\x22\x68\xd3\xb6\x50\x77\xc3\x92\xb3\x57\x67\x4f\xbe\xa7\xb8\x49\x25\x0b\xba\x1d\x29\x1d\x75\xb4\xd7\xe3\x0f\x49\xca\x50\xc0\x60\x1a\x84\x34\xf8\x1d\xdc\x46\xc1\x8d\x16\x6e\x04\xdf\xd9\xc9\xfb\xf8\x9c\x99\xd6\x83\xcf\x89\x20\x18\x1c\x7c\x1f\xf4\x62\x13\x42\x95\x2c\x45\xea\xf4\xf3\xca\x10\xf2\xfe\x68\xc1\x57\x52\x80\x90\x83\x39\x48\x81\xb0\x55\x7c\x5a\x31\xe2\x96\xc2\xbc\x5c\xbd\xfc\xe6\x97\x25\x93\xb7\x47\x0d\xf1\x2c\x44\xae\x2a\x32\x89\x77\xe3\xc9\x2b\xf2\x05\x36\xa2\x57\xf5\xde\x29\x6d\x75\xfd\x0c\xee\xab\x0a\xc0\x9f\xac\x32\xc6\xa2\x4a\xe1\x11\xf2\x1c\x44\x1a\x2b\x0b\x36\xb2\x12\x5e\x4c\x2a\x03\x13\x97\xd6\x6e\xf5\xbb\xf5\x93\xee\x36\x5e\x62\x44\xda\x3e\x5d\x38\x8c\x4d\xee\xeb\x9e\x6b\xde\xea\x22\xf7\x8c\x3c\xc7\x37\xcf\x34\xc4\xa2\xbe\x78\xf2\xf1\xba\x6d\xbf\x7d\x28\x82\x79\x94\xad\xad\xbf\x7d\x28\x28\xe8\xd0\xc5\x18\x0c\x46\x84\x8e\x36\x97\x19\x86\xc1\x5f\xd9\x8e\xee\x19\xc4\xc9\xf2\x8c\xaa\xc1\x4c\x02\x37\xae\x24\x37\xb8\x2b\x68\x76\xcb\xc4\x9e\x2b\x29\xc0\x4f\xb5\xa7\x8a\x43\x4e\x11\xb4\x22\x64\xc2\xca\xa7\x7f\x78\xfe\xe9\xe2\x23\xf8\x07\xc2\xd9\x6e\x98\x7b\xe0\x76\x5e\x6a\x88\x41\x38\xda\x41\x63\xaa\xfa\xe0\xc6\xd6\xda\x73\xa8\x7e\xfd\xf6\x54\x80\xd6\xf9\xfd\xd8\x35\xe4\xa5\x29\xe9\x70\x36\x05\x3e\xec\x21\xc9\x4a\xcd\xf7\x4f\xbd\xff\xe3\x12\x4f\xc5\x15\x7f\x05\x81\xc7\x85\x74\xbf\xe1\x03\xb8\xdb\xdf\x70\xf7\x4c\x77\x63\xc1\xc1\xac\x27\xa4\x19\xef\x7a\xda\x6b\x5c\x3e\xd3\x55\x6d\x9c\x66\x2a\xab\x53\x5c\x5d\xca\xc5\xa0\x16\x54\xd5\x85\x4c\xbb\x66\x77\xc8\xcf\x3a\x8d\x0a\x3b\x7c\x96\x03\x67\x14\x38\x9d\xa1\x73\x71\xc9\x4f\xaf\x65\x5e\xa0\xdb\xf9\x78\xb2\xd6\x91\xbc\xc1\xb7\x2d\xd3\xcf\xad\xda\x5c\x62\xce\x0e\x7e\x79\xbc\xc3\x61\x32\x8e\xb9\x21\x17\x69\xce\xc5\xc5\xf5\x65\x70\xc6\xb3\xb7\x98\x53\xe8\x9c\x94\x98\x77\xe3\xe7\xbe\x67\x6b\xc8\xa8\x15\xe4\xe2\xfa\x32\x1c\x5c\x50\x67\x9f\xc9\x0d\xf9\x19\x58\xd0\xcf\x2b\xf2\xe3\xc5\xc7\xab\xcb\xab\xef\x5f\x11\x98\xc5\x53\x88\x6a\x48\xed\x56\x6a\x99\xb6\xa1\xa6\xef\x8c\xaa\x06\x96\x0b\xbb\xb6\x94\x65\xcc\x30\xb0\x89\x2f\x88\xde\x95\x26\x95\xf7\x82\x5c\x57\x2b\x5e\x60\x56\x9a\x54\x6c\x55\x4d\xd9\xb3\x54\xae\x1b\x44\x35\xb5\x62\x0e\x58\x6a\x12\x4b\x4d\xbc\x24\x55\xfa\xcc\xf8\x74\xcf\x5d\x46\x12\x4d\xd3\x46\xb1\xdf\xce\xb8\xb4\x34\x3b\x26\x0c\x4f\x5c\x77\xf2\xd2\xec\xa4\xe2\xff\xc4\x7f\xed\x39\xb5\x9a\x9a\x92\x0f\x87\x46\x09\x20\x90\x06\xd0\xa4\xaf\xab\x0f\x7a\x82\x8f\xda\x11\x34\xda\xa7\xa6\x60\x49\xd1\x54\x12\x2d\x57\xe4\x3b\xa9\xb0\xb0\x68\xb3\x45\xba\x66\xac\x72\x2c\xd6\x07\x5b\x39\x16\xeb\x3f\x9d\x67\xd4\x30\x6d\xce\xff\x51\x32\x75\xe0\x62\x7b\x4e\x0b\x7e\xfe\xb5\xd1\xe9\x7a\x09\xc7\xb5\xa4\x05\xef\x78\x14\x43\x18\xb8\x91\x2a\x61\xa9\x95\xbe\x74\x41\x13\xf6\x8e\xae\xbb\xc5\x2f\xda\x4c\xb4\xf7\x13\x3f\x92\x06\xc8\x43\xac\x86\xf0\x2f\x60\x99\x82\x0e\xb0\xe4\x86\x48\xc5\xb7\x5c\xd4\xa5\x4a\x68\xc6\x14\xe6\xc9\xe7\xcc\x28\x9e\x54\x65\x89\xe1\x94\x13\x4c\xad\x40\xe3\x72\xff\x98\x88\xda\x4d\x97\xdf\x9a\x55\x5a\x38\x2e\xc6\xd9\x17\x90\x3a\x54\x13\x40\xb3\xf7\x6a\x86\x5e\xf8\xf5\x50\x27\x66\xe7\x83\x13\xbc\x14\x86\xa9\x3d\x0d\x83\xce\xbf\x64\x45\xef\x7b\xc6\x44\x2b\xea\xa8\x1e\xab\x13\xae\x3d\x3c\xbf\xeb\xca\x0d\x47\xd0\xd1\x00\xe3\x0a\x5e\x07\x48\x6f\x27\xf4\x18\x80\xee\x2b\xa8\x62\xc5\xe7\x83\xf3\x5b\x31\xc5\xd1\xf8\x09\x67\xe8\x2a\xc8\x26\x32\xcf\x4b\x01\x37\xad\xe7\x82\xc3\x65\xae\x1a\x8b\xa3\x9e\xae\xc9\xf3\x0d\x4b\x5d\x12\xde\x02\x9a\xe5\x1a\x46\xb4\x91\x8a\x6e\xd9\x82\x5c\xd8\xc1\xb1\x10\xb4\xea\xc8\x90\x83\x64\xdf\xcf\xf1\x83\x0a\x9f\xcf\x6d\xb3\xd1\xf9\x0f\x1f\xdf\xf9\x3a\x81\x9e\xce\x72\xa1\x0d\x05\xd9\xab\x6a\xc8\xbf\xa7\x3c\xb3\xa4\xb1\xb3\xb9\x52\xa4\x4d\x8b\xa0\x60\x96\x6e\x53\x05\x54\x65\xcb\x84\xdd\xa1\x65\x97\xca\xf2\x71\x3b\x97\xee\x79\xb7\x33\x28\xdf\xb4\x96\xe3\xbd\xe3\xaa\xea\x27\x0c\x79\x5e\xa0\x45\xbd\xb9\xba\xc1\xde\xd6\xb1\xb8\xc4\xb7\x42\x2a\x56\xdd\xea\x1b\x96\x81\x84\xd1\xc1\x98\x36\x46\x0f\x7c\x64\x57\xda\xf0\xe1\x22\xbc\x70\x06\xd2\x79\xbb\xb3\xcd\xaa\xca\x47\xa5\x49\x17\x32\xcd\xa5\xe0\x46\xa2\x58\xe9\xda\x26\xfb\x3f\xa1\x1c\xe2\xb8\x8a\xd9\xb1\x2e\xe0\x60\x7e\xa0\xe2\xe0\x91\xdd\x33\xd5\x68\xb9\x5c\x2b\x02\x5c\x91\xa4\x54\x90\xc4\x5a\x11\x8c\x15\x19\x96\x88\x87\xb4\xb8\x61\x82\x0b\x62\x51\x18\xa4\x90\xd8\xce\x1b\xe9\xc4\xe0\xc3\xaf\x73\xbd\x09\x2c\x7f\x4d\x35\x83\x57\x17\xc4\xd0\x6d\xaf\xdb\x5a\xef\xa8\xbd\x81\x6b\xe7\x2b\xd1\x2b\x72\x03\x43\x1e\x3c\x83\xdf\x33\xa5\x21\xc2\x4e\x13\x6d\xd0\x89\xdb\xc0\x52\xe4\x7d\xbd\x12\x44\x03\x09\x3f\x40\xc6\xac\x54\xe4\x4e\xc8\x7b\x7b\xed\xa9\xa9\xc6\x95\xc7\xe8\x0a\x54\xb6\x33\x62\x2d\x46\xc6\x23\xab\xdd\xf9\x75\x99\x65\x37\x2c\x51\xac\x6b\x35\x6c\x57\x37\x16\xae\xca\x0b\xcd\x2a\x53\x7f\x43\x8f\x82\x6c\x1b\x18\xc5\x4b\xb1\x9a\xe6\x0d\x8e\xd1\x77\xea\x3e\xae\xbb\x28\x33\x10\x97\x1a\xc2\x18\x04\x05\x34\xc8\x14\xae\xd5\xe1\xb2\x62\x5b\x6e\xb7\xd3\x13\xb5\xe4\x45\x80\xfe\xd0\x22\xcb\x00\x97\xdb\x92\xa7\xec\x1c\xc7\xfb\x5a\x57\x67\xb9\x84\xbf\xd8\xa5\xb8\x7d\x2c\xa5\x58\xd2\x65\xd7\x6a\x3c\x60\xc5\x6c\x57\xb3\x92\x09\xcd\x3e\x00\x0d\xfd\xe8\x61\xe4\xc5\x7a\x2b\x07\xca\x72\xbb\x6b\x89\x2e\x46\x92\xac\xb7\x80\xe6\x41\x96\xc4\x79\x8d\x30\x8d\xc9\x8d\x96\x7a\xde\xeb\x0c\xfe\x5d\x88\x77\x75\x84\xb0\x99\x73\xd8\xf8\x74\x14\x56\xd6\x88\xfa\x73\xcb\x31\x93\x23\xc0\xed\xed\xdb\x73\x76\x7f\xee\x74\xb1\xa5\x25\x1f\x4b\xdc\x92\x3e\x87\x3d\x9c\x7f\x0d\xff\x33\xa0\x35\x61\x0c\xea\x45\x9a\x3a\x2b\x60\xa9\xd9\xa6\xcc\xd0\x2e\xa7\x57\x84\x16\xfc\x13\xde\x9f\x05\xb9\xe3\x22\x5d\x90\x92\xa7\xff\xfe\x08\x3f\xf5\x23\xb4\x20\x2e\xb8\xa9\xd4\xcd\xf0\xa5\x3a\xbb\x6c\xbd\xeb\x33\xcf\x9c\xf4\xd7\x1e\xa8\x11\x74\xda\x83\x7c\x1b\x88\xc6\xc7\x94\x7b\xa9\x19\xc8\xca\x8d\xfa\x02\x6c\xb5\x5d\x91\x0d\x33\xc9\xae\xba\xa6\xf6\xe6\x71\x61\xf7\xd5\xe7\x02\xae\x3c\x01\xd7\x4d\xed\xac\xd1\x49\x02\xaf\x62\x2d\x78\x60\x1b\x89\x15\xb9\x10\x07\x74\x01\x77\x4f\xce\xd5\x0a\x80\xda\x27\x90\xce\xed\xc8\x1b\x15\xed\xad\x22\xa3\xc9\x18\x45\xe9\xc8\x87\xdf\x10\xd9\x2d\xbe\xe8\xea\x36\x3c\x35\x03\xc1\x4e\x5f\xb7\x64\xd0\xdd\x76\x0f\x3f\xe8\x9e\x03\x81\x96\x21\xe2\x00\x74\x2c\xa1\xda\x1b\xa4\x21\xc4\x09\xa1\x8c\x20\x87\x4f\xbb\xe0\xb0\xea\x93\x62\xd9\x81\xc8\xd2\xd4\x77\x38\x91\x58\x4e\xfa\xde\x3b\xe5\x72\xca\xdb\xb1\x1c\x2e\x10\xbb\x97\x5b\xad\x0f\x24\x95\x90\x9e\x2b\x17\x40\x3b\x30\xb2\xca\xbb\xf8\x80\x7b\xec\xe8\x9e\xcb\x52\x61\x3d\x13\xc5\xe8\x1d\xa1\xa6\x92\x41\x7b\xe5\x4b\x59\x82\xab\x81\x27\xac\x13\xea\x11\x43\x0d\x2f\xaa\x50\xb9\xa2\xc8\xbc\xc6\x58\x1b\x39\x60\x6d\x76\xad\x3e\x05\xd5\xf7\xf4\xe8\x75\xea\x50\x7b\x01\xa6\xd2\x36\xaa\xb6\x51\xad\x96\x2e\xd4\xb6\xcc\x41\x3f\x75\xd8\x5f\xd7\xe8\x71\x05\xba\x65\x72\xe7\xb9\xd1\x70\x14\xd2\xeb\xf7\x6f\xbc\x2f\x01\xc3\x2d\xea\x28\x4c\x57\xe8\x23\x5d\x91\x4f\x8f\xb2\x46\x8e\xda\x21\x8f\x0d\x91\x97\x56\x8e\xf5\x96\xcf\x21\x13\x54\x65\x5f\x52\x4c\xcb\x6c\xef\xcb\xba\x55\x2b\xf3\x3c\x9d\x8b\xa2\x34\x8e\x54\x7a\xf1\x7d\x60\xcc\x52\x24\x3b\x2a\xb6\x5e\xd3\x6c\xec\x8c\xe8\x83\x30\xf4\xc1\x93\x28\xa6\x13\x5a\x54\xf1\x23\x24\x95\xe5\xf0\x42\xff\xf0\x87\x05\xe1\xec\x15\xf9\x43\x63\xb8\x15\x79\xeb\x46\x68\x00\xb2\x11\x4d\xb7\xae\x01\x36\x64\xd5\x53\x6c\x4b\x55\x9a\x41\xe0\xfa\xa6\xea\x72\x82\x56\x1e\x77\x48\xec\x81\x6b\x03\xaa\x99\x90\xa6\x61\x91\x1b\xda\xfd\xb4\x2e\x5b\xd8\x21\x06\xa9\xf1\x32\xa5\x86\x2e\x1b\x57\xe5\x1c\xfb\xff\x2c\x5d\x41\x89\x25\x75\x48\xda\xe8\x21\xf3\xb5\xeb\xbe\xb1\xa4\xd5\x5b\xdc\x4a\x2f\x50\x80\xa1\x9f\xeb\x05\x9d\xb1\xa3\xb6\xe1\xb0\x65\x36\x58\xfd\xe3\xd8\x22\x57\x95\x03\x86\xd1\x56\xe4\x4a\x9a\xba\xca\x4f\x15\x66\xe1\x4a\x49\xdc\x0e\x06\xd3\x1d\xdd\x4c\xf2\xf6\xea\xf6\xe3\xdf\xaf\x3f\x5c\x5e\xdd\x8e\x5e\xc5\x81\x11\x47\x2e\x68\xcc\x55\x1c\x18\x79\xf8\x82\x8e\x5f\xc5\x81\x21\x03\x17\x74\xfc\x2a\x0e\x93\x85\xc1\x0b\x1a\x7d\x15\x07\xc6\x1e\xb8\xa0\xf1\x57\x71\x60\xdc\xce\x05\xfd\x9d\x5f\x45\x26\xf6\x11\xd7\xf0\x9d\x53\xe8\xfa\xbc\x65\xc7\x95\x14\x46\xa3\x29\x4e\x1e\x0d\xf2\x56\xec\x3f\x51\x55\xf7\x69\x81\x30\xdc\x5e\xc7\x9e\x7b\x61\xd0\xeb\x05\xa4\xe4\xf5\x29\xc2\x41\x26\xb9\xea\x9b\x2a\x53\xdf\xba\xeb\x0c\xc5\x50\x67\x2d\x42\x5e\xff\x74\xf9\xe6\xed\xd5\xed\xe5\x77\x97\x6f\x3f\x3e\xd9\xf7\x3b\x5a\x3b\xa1\x4d\xa8\xa7\x50\xc3\xe0\x26\x6a\x4a\x59\x28\x66\x25\x51\x4d\x7c\x83\xbb\x7e\xf4\xe3\xe3\xb9\x64\xed\xd8\x10\x2b\xcb\x3a\xe3\x56\xff\x90\x48\x74\x83\x23\xc6\x13\xe4\x16\xe9\x0d\x8e\x39\x95\x2c\x3b\x02\x1c\x76\xf5\x7e\x0e\xe2\x8c\xcf\xe3\x49\x74\x78\xc5\x6d\x49\xaa\x1d\xe1\x10\xcc\xa5\x8c\x47\xeb\xef\x94\x0c\x74\x81\x39\x2e\x34\x00\xaa\x6b\x95\xa6\xdc\x87\x31\x67\xda\x35\x5f\x0c\x5f\xcf\x9a\xf0\x39\x71\xa3\xca\x8b\xb3\x7f\x87\xf8\xe9\xd0\x08\xb1\x35\x59\x50\x0f\x7f\x4f\x8b\xff\x60\x87\x8f\x6c\x24\x25\xf4\x78\xb3\x60\x2e\xd6\x84\x92\x3b\x76\x40\x23\xf7\x6b\x3f\xdc\x58\x25\x85\x29\x35\x63\xee\x58\x30\x66\xa8\x77\x6d\xf6\x16\xd8\x55\x01\xbf\xb1\xcb\x1c\x5b\x10\x99\x5a\x2f\xe6\x51\x95\x6c\xbe\x10\x8b\x57\xfb\x99\x6a\xff\x8a\x1a\x74\xd8\x46\xd6\x7e\x26\xc1\xdc\x5b\x8d\x27\xc3\xdd\xd9\xd9\x5b\x14\xa6\xc2\x55\x4b\x3f\xf8\x68\x9e\x36\x3e\x16\xa7\x7c\x56\xb0\x63\x35\xd1\x9b\x1c\x0b\x1c\xc3\x27\xbe\xda\xcf\x5d\x8f\x5f\xa5\x6f\xde\x88\x32\x3e\x70\xd6\x53\xef\xff\x59\x4d\x00\x30\x86\xb1\xca\xdf\x4e\x5f\x79\xcb\x92\xae\x2a\x02\xaf\x2c\x42\x8e\xe3\x4e\xeb\x75\x30\x3e\x2f\xea\xbf\xa1\xbb\xb3\xf1\x07\xa0\x92\xe8\x4c\x19\x1f\x5a\x17\x2c\x59\x09\x99\x82\x7b\x6c\x81\xff\x74\xbc\xfd\x22\x49\x64\x29\x8c\xfb\x01\xb2\x6b\x56\x3b\xa9\xcd\xe5\x75\xc4\xb0\xf8\x7a\x21\xd3\xcb\xeb\x45\xeb\x5f\x7a\x24\x9d\x7f\x1a\x19\xac\xef\xe1\x64\xf4\xff\x54\xfb\x7f\xd0\x30\xb8\x63\x39\x85\xff\xfc\xce\x1e\x5c\x20\xe8\xaa\xfd\x70\x5d\x67\xc0\x09\x48\xfb\xb1\x7c\xbb\x5d\x33\xee\xd9\xfe\xe5\xb3\x93\x13\xdb\x8d\x5f\xe6\xe4\xad\x43\xb4\x9b\xaf\x71\x0a\x58\x5a\xb1\x84\x18\x69\xd0\x3f\xb5\xef\xef\xe2\xfa\xd2\xfb\xd3\x4e\xbc\xcd\xf8\x9b\xbf\x89\x3c\xb5\xe8\xfb\xef\x7b\x37\x7f\xf7\x44\x3a\xe0\xc7\xe9\x24\x8d\xbc\x02\x67\xef\x28\xbc\xea\x26\xdb\xd8\xba\xdd\xa5\xdb\xba\x16\xdb\xcf\xf1\x8f\xab\xa4\x28\x17\xee\x85\x55\xce\x72\xa9\x0e\xe3\xb7\xd4\xbd\xce\x8a\x1d\xcb\x99\xa2\xd9\xb2\x0a\x61\xf0\xc3\xe3\xb0\xd5\xbf\x70\xe0\xf1\x5b\xd9\x58\x60\x77\x74\xd4\x65\x9c\x0b\x3b\x3b\xd4\x85\x4f\x4e\x4a\x19\x2a\x28\x8f\x17\x96\xc7\xa7\x7d\x7c\xb5\xb3\x04\x64\x9a\x0a\x0f\x41\x8c\x75\x79\x1d\x71\x4c\xbf\xf2\xea\x42\x00\x91\xd8\x5b\xa1\x37\x50\x4e\xa1\x7e\x26\x11\x83\x94\xef\xb9\x96\x23\xdd\x5a\x7a\x36\x7a\xd3\x2a\xc3\xe9\xd2\x06\xd1\x6f\x1a\xd7\xbf\x00\x1f\xf6\x50\x40\xda\x77\x85\xab\x47\xf4\xef\xe5\xb3\x53\x6f\xd8\xcf\x34\xfd\x68\x3f\x7a\x92\x52\xdf\xcc\x8a\xfc\x9d\xf8\x5c\xe2\xa9\x97\x5f\xca\xa9\x88\x17\xfa\xc7\x4e\xa3\xc0\x38\x5f\x5b\x9d\xe7\x35\x12\x6e\x4f\x9c\x26\xd0\x1f\x98\xd0\x7e\x7e\x29\x9d\xc7\x73\x79\xdc\x4a\xcd\xee\x36\x4a\xe6\x2e\xdb\x27\x0a\xd1\xd7\x0c\xac\xc9\x19\x4f\xfd\x58\x77\x6c\xa4\xfe\x31\x3e\xb3\x1e\xf5\x7b\xd2\xa3\x30\xe2\xc7\x29\x51\x11\x4a\x09\x3e\xbf\x39\x25\x2a\xe2\xb5\xf1\x1c\x88\xcf\x97\xe1\xc0\xc4\x7e\xd8\x92\xd5\x6b\xc0\xf7\x92\x58\xa3\x38\x41\xbf\x09\x34\xec\x46\x6a\x65\x63\x03\x81\xaa\x8d\xb4\xb5\x4b\x0e\x79\x53\x3e\x62\xba\x6e\x19\xad\xc9\x05\x14\xa4\x47\x02\x05\xc3\x7a\x6b\xa8\x62\xae\xba\x1c\x56\xd9\x60\xfb\x61\x3b\x3e\x44\xc5\x1e\x25\x4a\xb8\x5a\x96\x5c\x6c\x5d\xa6\x1f\xf2\x07\x67\x6c\xe4\xa2\x2a\xa6\x33\x30\x66\x25\x16\xd4\xb1\xfd\x54\x6b\x99\x40\x81\xcb\xba\x99\x0b\xd4\x57\x70\x1b\x87\x95\x1b\x7a\x37\x34\x64\xb3\xb1\xcc\x27\x3b\x62\x0d\xc3\xf5\x01\x8a\xbb\x88\x7d\x65\xb7\x2d\xd1\xc7\x84\xcc\x20\xd0\x85\x04\x3a\x77\x34\x47\xfe\x1c\xde\x16\x8b\x74\xce\x2a\xda\x70\xba\x00\x7f\xaa\x34\x05\x0a\x3e\xa1\x9e\x90\x1c\xff\x54\xa6\x9a\x21\x5c\x8b\x61\xad\x95\xa9\x73\x44\x4c\xe8\xf0\xd4\xda\x50\xd4\xe6\xa5\x27\x30\xbf\xc6\x30\xbf\x2f\x9b\xf1\x9d\x30\x78\xae\x7e\xa2\x99\x59\x2c\x23\x9b\x60\x0c\x9c\xc6\x98\x62\x99\x52\x14\x13\x29\x14\xdb\xf0\x87\x68\xdc\x6c\x86\xd1\x72\xe8\xa9\xb6\xe1\x50\xe6\xdd\x0e\x54\x30\x81\xd1\x7a\x34\xd9\x8d\x32\x39\x47\xaa\x6b\xeb\x7d\xed\x44\x3c\xad\xa3\x10\xe5\xc8\xa9\x17\xf0\xa6\x4f\x92\x9d\x6f\xdf\x6f\xe7\xf6\xb9\x03\xfe\xd5\xae\xde\x13\x65\xab\xde\x1c\x82\x9e\xad\x9f\xbd\x69\x04\x16\x61\x32\xc8\x54\xdc\x69\x04\x96\x62\xd8\xf9\xc0\x8e\xda\xdd\xe7\x2a\x32\x81\xdd\x59\xe5\x3d\xd9\xf1\xad\x05\x3e\x76\xa4\x43\xce\x48\x30\x3e\x3e\x1f\x16\x96\x20\x91\x10\x93\x53\xa5\x82\xac\x07\xc5\xd3\x4e\x8e\x29\x88\x48\x3e\x28\x16\x7e\x54\x32\xcb\x86\xbb\x7e\x64\xfc\x8e\x91\x37\xac\xc8\xe4\x21\x77\x11\x19\x29\xb9\x31\xd4\x58\x54\xbe\x61\x66\xc8\x8a\x3e\x82\xa6\x55\x46\x42\x74\x29\xb0\x33\xcc\xf4\x28\xca\x2c\x23\x05\x7c\xb4\x82\x76\x59\x72\x43\x2e\x20\x77\x6d\x41\xae\xd8\x9e\xa9\x05\xb9\xdc\x5c\x49\x73\x8d\xc2\xcc\x10\x4d\x6c\x3a\xa3\xf1\x73\xc2\x37\xe4\x15\xa6\x0b\x42\x8a\x08\xd7\xcd\x0e\x75\x52\xb5\x86\x1d\x18\xb5\xaa\x76\xf0\x84\xb0\xa4\x61\x64\xfa\x1a\x46\xaa\x32\x18\x06\x4c\x77\x23\x80\xaf\x0a\xab\x46\x80\xfc\xc2\xa5\x63\x9a\x3a\x42\xd9\xe3\xa0\xcb\x3f\xf3\x09\xa7\x20\xac\x0e\x96\x66\x51\x4c\x17\x52\x68\xd6\x2e\xee\x51\x97\x88\x06\x15\x40\x47\x4b\xb8\xe3\x0c\xa4\x90\xda\x40\xeb\xb8\xd8\x0a\xba\xd7\xfe\x03\xa8\x25\x49\xb3\x8c\xa5\x84\xe7\x39\x4b\xad\x56\x90\x1d\x5c\x7d\x50\x1a\x55\x66\xc9\x8e\xe0\x53\x2f\x2f\x91\x19\xed\xa8\x48\x33\xa6\x9a\x3d\x08\x5b\x1a\x8d\x2f\xd1\x16\xa4\xaa\x68\xcb\x76\xf5\x29\x09\x4d\x12\xa9\x52\xd7\x21\xc1\xaa\xf6\x3e\x76\xbe\xba\x1b\x40\xbf\x47\xa9\x06\xe9\x6b\x3b\x0a\x85\xb1\x74\xa3\x74\x26\x74\x15\xae\xfa\x2c\x9e\xb0\xf4\x6f\x03\xc9\xeb\x42\xbf\x15\x66\x2c\xa1\x30\xf9\x79\xa3\x06\x30\xfc\xe1\xa9\xe5\xc4\xc3\x0d\xf9\xc8\x63\x9b\xf2\x8d\x70\xc4\x56\xcb\xbe\xa7\x34\xe6\x8b\xdf\x28\x89\x6d\xd0\xd7\xd9\x73\x5c\x93\xbe\x08\xbb\x50\x23\x6b\x29\xa6\x51\x5f\x8c\xa5\xa9\xdd\xca\x2f\xbe\x59\x5f\xc4\xd8\x8d\x76\x7e\x91\x0d\xfb\x22\x06\x1d\x68\xe9\x37\xd8\xb4\x2f\x62\xc8\xb1\xb6\x7e\x03\x8d\xfb\x22\x46\x0e\xb5\xf6\x1b\x68\xde\x17\x03\x82\x40\x7b\xbf\x09\x0d\xfc\x48\x6c\xfb\x2d\x32\xd5\xe6\x1a\xd7\x29\x29\xda\xdc\x38\xda\x89\x8e\x7c\xa6\x6e\x74\x64\x12\x6d\x18\xef\xab\xd0\x5d\x67\x44\x67\xba\xc8\x4b\xfc\x59\xba\xd3\x91\xd8\x0e\x75\x64\x1a\x8a\x44\x77\xaa\x23\x8f\xea\x56\x17\xb1\x2b\xe8\xb0\xf5\xa8\x8e\x75\x64\xca\xb5\x99\xdc\xb9\x2e\xca\xa1\x80\xa5\x4c\xa7\x77\xaf\x23\x13\x3d\x73\x64\x82\xcf\x8a\x9c\xaa\x93\x1d\x99\x4a\x6d\xc8\x94\x8e\x76\xe3\xcb\x8c\xed\x6a\xf7\x88\x75\xc6\xba\x6a\x48\x6c\x87\x3b\x12\xdd\xe5\x8e\x4c\xf1\x32\x93\x09\x34\x3c\xa6\xe3\x1d\x39\x71\xd7\x3b\x32\x0d\xf4\xe3\x3d\x62\x48\x5c\x9f\x18\x32\xb1\x57\x0c\x99\xd6\x2f\x86\x3c\xa6\x1b\x5e\xc4\xb9\xcb\x8e\x77\x2a\xd8\x37\x26\x06\x93\x5a\x9d\x65\x1e\xd9\x3b\x86\x3c\xad\x33\x1e\x89\xec\x8e\x47\x3e\x57\x87\x3c\x32\xb9\x4b\x1e\x99\x82\xb7\x71\xc4\x62\xa4\x4b\x0e\x99\xe0\xd4\x1d\xef\x9c\x45\x1e\xdb\x3d\x6b\x04\x2a\xd0\x5b\x6b\x7a\x07\xad\xd1\x51\xab\xfe\x5a\x93\xba\x68\x91\xcf\x2d\xf5\x9d\xb0\xa3\x16\x99\xd8\x55\x8b\xfc\x5e\x28\x67\x44\xb7\xad\xdf\x31\xe5\xfc\x65\x69\x4b\xc4\x4b\x85\x62\x37\x46\x16\xd1\x16\x46\x7c\x7d\xc0\xbe\xe8\x9a\x6f\x46\x1b\x18\x6b\x83\x21\x49\x4b\x86\xa5\xc5\x20\xf6\xd9\xeb\x8a\xb2\x69\xfa\x0b\xc6\x58\x90\x46\xd3\x13\xdf\x30\xf1\xdc\x35\x4b\x74\x7d\xc3\x5c\xb7\x8a\x85\xdd\x33\xcb\x0b\x5f\x6b\x6c\x34\x4e\xd0\xf5\xd6\x80\xd7\x99\x49\x30\xc4\xc4\xdb\x42\x9d\x25\xc5\x03\x23\xbe\x8c\x7d\xa2\xa8\xde\x61\xf1\x34\xf6\xc0\x8d\xeb\x9e\xa2\x18\xd5\x12\x6b\xe3\x35\x7b\x84\x70\x4d\x0a\xaa\xb1\x36\x4a\x88\x93\xd4\x0b\xc3\xe1\xae\x65\x7a\x76\xa6\x5b\x43\x6d\x15\x4d\x98\x6b\x20\x4a\x20\x21\x21\x95\xf7\x21\xd7\xd6\x9a\x6d\xb9\xd0\xfe\x6c\xb1\xc4\x0a\x22\x81\xa5\xe6\x0c\x2c\x4c\x3e\xff\x7d\x45\x3e\x56\xc9\x76\xe3\x96\x5a\x59\x9a\x44\xd6\x44\xc2\xad\xfc\xd8\xb0\x0c\x61\x2b\x70\xf4\x63\x85\x64\x2b\x74\x6a\x56\xf9\x1d\x01\x81\xb3\x30\x07\x46\x6d\x20\xe0\x54\x0b\x73\x08\x04\xaa\xf1\xd5\xe0\xf9\x40\x2f\x27\x9a\xec\xda\x7e\x97\xd9\x58\x3d\x1b\xab\x43\xcf\x6c\xac\x9e\x8d\xd5\xb3\xb1\xba\xf7\x99\x8d\xd5\xb3\xb1\x7a\x36\x56\x8f\x7f\x3b\x1b\xab\x67\x63\xf5\x6c\xac\xee\x79\xbe\x44\x93\xcb\x6c\xac\x0e\x7f\x3e\x1b\xab\x67\x63\x75\x60\xd4\xd9\x58\xdd\xfb\xfe\xef\x81\x72\xce\xc6\xea\xd0\xc7\x5f\x98\xb1\x7a\xe4\x05\x6f\xf5\xbd\xb6\x32\x6e\x4c\x24\xf6\x35\xd8\xd8\x78\xe2\xcc\xc3\xed\xfe\xc3\x6e\xb0\x55\x5d\x7d\x6f\x60\xe1\x75\x3e\xa0\x8f\x69\x75\x46\xe0\xda\xe8\xdc\x1b\x13\x0c\xf6\xbc\x81\x31\x1f\x5d\x17\xba\x90\x69\x6d\xc9\x6b\x98\xf0\x50\xee\xef\xbf\xf4\xe3\x44\x2c\x6c\xbb\x7b\x94\xdd\xae\x6d\x99\x0b\x20\xcf\x13\x6c\x76\x71\xd4\x39\xca\x56\xf7\x08\x3b\x5d\x9c\xad\x2a\xd6\x46\x77\x6c\x81\x1b\x19\x36\xda\x3e\xd7\xb4\xbe\x8d\x8c\x19\x67\x9b\x1b\xb2\xbc\x8d\x89\x68\x03\x76\xb9\x51\xab\xdb\xc8\xb8\xfd\x36\xb9\xa0\xc5\x6d\x6c\xa5\xbd\xf6\xb8\xa0\xb5\x6d\x1c\xb0\x91\xb6\xb8\x28\x83\x42\x34\x3b\x8c\xd1\xdd\x22\x28\xb7\x73\xab\xdd\xee\x14\xd3\x3b\x99\x05\x6e\x52\xbb\xf1\x26\x17\x3c\x2f\xf3\x56\x37\x24\x37\x94\xae\x30\x1e\x69\x68\xd0\xba\xb5\x06\xdc\xb6\xa8\x07\xd5\x64\x28\xcf\xec\x69\x40\xa2\xc3\x8e\xee\x81\xe2\x94\x49\xc2\x58\x7a\xd4\x9e\x32\x30\xe4\x1f\x57\xd5\xea\xaa\x82\x88\x2f\x87\x4f\x06\xab\xbb\x80\xc4\xf2\xc7\x6f\x47\x20\x19\x96\x6a\x46\x4d\x98\x9f\xc3\x7c\x19\x47\x26\xc7\x05\xd8\xc9\x26\xcb\x88\x62\x38\x9f\xc5\x5c\x19\x65\xaa\x8c\xbc\x45\xd1\x26\xca\xe9\xe6\x49\x38\xdf\x31\xe5\xe5\x31\xa6\xc9\x28\x2a\x32\xd9\x24\x19\x63\x83\x7e\x94\x39\x72\x8a\x29\xf2\x51\x75\x5e\x1e\x6b\x82\x9c\xa4\x77\x44\x9b\x1e\x4f\x63\x76\xfc\x2c\x35\x95\x22\xe0\x12\x67\x66\x8c\x36\x31\xc6\x99\x17\xc7\x4d\x8b\xa7\x34\x2b\x46\x82\x76\x5c\x29\x8e\x50\x88\xa7\x28\xc3\x13\x14\xe1\xc9\xe6\x43\x07\xa4\x91\x63\x8d\x55\x80\x8f\xd4\xdb\x91\x51\x1f\xa7\xfc\x3e\x41\xf1\x8d\x31\x17\x7e\x16\x53\xe1\x34\x33\x61\x64\x3f\xf4\xb1\xcb\x3d\xa2\xbe\x47\x5c\x55\xe8\xe4\x44\xb3\x37\x2c\xa3\x87\x1b\x96\x48\x91\x06\x28\xf5\x51\xa9\x83\x0a\xe7\x34\x7e\xe8\x24\xb7\x76\x94\xcd\x8e\xba\x6a\x39\x41\xbf\xb7\x0b\x50\xf2\x9a\xbb\x63\x2e\x50\x1b\x11\x57\xf8\x98\xec\xe5\x13\xe8\xd7\xe4\xa4\x22\x22\x06\x06\x4d\x03\xf3\xdf\xe4\x3d\x91\x1b\xc3\x04\x79\xce\x85\x87\xf4\x8b\xa3\xbe\xb5\x08\xaf\x10\xca\x39\xf4\xb4\xdf\xbd\xfc\xc6\x0f\xf3\x6b\x89\xca\x20\xd4\x6b\x7d\x0a\xad\xc3\x0d\xf5\x14\xb5\xc3\x0d\xb1\x29\xb3\xb6\xea\x81\xea\x48\xac\xde\xf1\xb2\x2e\x89\xf2\x12\xd6\x52\xe1\x32\xb4\xbf\xc4\x60\xc6\x2e\xc0\x83\x23\xfe\x02\x47\x11\xe1\x12\x78\x94\x3b\x00\x0d\xfe\x23\x2c\x76\x92\x2b\xa0\x69\xec\x0f\x8c\x3b\xc5\x0d\xf0\x59\xb4\xa7\x13\x9a\xfe\xa7\x98\xfd\x7f\x73\x92\x4d\x84\x79\xff\x77\x24\xd9\xfc\x12\xb2\x80\xe1\x39\x93\xa5\x39\x91\x18\x70\xbf\xe3\xc9\xae\x49\x91\x79\xb8\x5e\x91\x2c\x8f\x1a\x74\xbc\x74\x03\xf6\x72\xa9\xd3\x45\xd4\x7e\x61\x52\xc2\xc8\x39\x45\x36\x4e\x6d\x96\xa1\xaa\x65\xb1\xba\x46\x39\xd5\xd8\x70\xfa\xa7\x77\x17\x7f\x7d\xfb\x6e\x45\xde\xd2\x64\xa8\x54\x78\xa3\x4a\x88\xc0\x86\x88\x88\xfb\x3b\xba\x67\x84\x92\x52\xf0\x7f\x94\x58\xab\x88\x3c\xaf\x46\x7c\xe1\xbd\x26\x03\x83\x8e\xd5\x57\x19\xa1\x19\xd0\x38\x60\x42\xa5\x4a\x6c\x34\x80\x66\x64\x69\xc5\x7c\xdf\xa5\xba\x41\x1b\xde\xda\x9f\x86\x49\x14\x45\xda\xb3\x63\x8a\x91\x2d\xdf\x3b\x83\x9d\x2b\x41\x53\xf7\x6d\x6f\x35\xda\xa5\x6b\x30\x53\x0f\x52\x28\xc1\x8c\xc5\xbe\x4a\xe3\x90\x42\x37\xf3\x2f\xac\x46\xa2\x17\x64\x5d\x82\xa9\xbe\x50\x3c\xa7\x8a\x67\x87\xe6\x14\x34\x1b\xa2\x37\x57\xd2\x73\xe8\x03\xb2\xe3\x7a\xf9\x6f\x3e\xbc\xbd\x21\x57\x1f\x6e\xa1\x27\x92\xe5\xac\x60\x45\x87\xdf\x01\x30\xfd\x3d\x9f\xf1\x71\xb5\xad\xb1\xf5\x2a\x7c\x82\xf7\x9c\x6b\x68\xd4\xcc\x84\x9d\xcc\x69\xe5\xbe\x14\xd4\xb3\x6f\x56\xf0\x7f\x43\x65\xaf\x69\x9a\x2a\x4b\xcd\x2b\x27\xc4\x51\xfe\x80\xa5\xb2\x40\xef\xf9\x3a\x6b\x9c\x9d\x83\xde\x2f\xd6\x19\xac\x72\x26\x5e\xdb\x6d\x37\x1b\x84\x55\x07\x09\x00\xc1\x7a\xa5\xd0\x84\x74\x90\x0e\x8c\xf6\x35\x8b\xac\x57\x59\x2f\x28\xba\x5e\x5e\x4d\xaf\x3d\x33\x75\x97\x42\x36\x4a\x5a\x93\xcb\x6b\x7f\x2c\x61\x86\x06\x65\xc4\x2a\x5e\xe8\x8a\x41\xc3\xc0\x68\x92\x58\x90\x6f\xc8\x5f\xc8\x03\xf9\x0b\xb0\xd6\x3f\x87\x06\x8b\xa3\xa0\x71\x62\x2d\x4a\x6d\x97\xd7\xd1\x50\xf9\xd1\x5e\x01\xfb\x8d\xdd\xb9\x91\x64\xcd\xb1\x31\x7d\xdd\x74\xd8\x41\xeb\xc9\x15\x0e\xed\x24\x27\x3d\x30\xb0\x4e\x90\xcb\x46\xfb\xf9\xb0\x63\xcd\x4c\x3c\x32\x3b\xb4\x95\x64\xaf\x10\xc9\xc3\xe6\xe9\x56\xc5\xb2\x7a\xa6\x9c\x9a\x64\xd7\xbe\x41\x96\x85\x6b\x53\x23\x71\x58\x18\x4e\x25\x68\x08\xe8\x0e\xdc\xf1\x20\x56\x9e\x16\x91\x26\x35\xdf\x6b\x9d\xc2\x11\xa4\x8f\x04\xc5\x11\x21\x3c\xf5\x9c\xb5\x91\x0e\x55\xc8\x14\x59\x35\x2c\x2a\x6d\x90\x1b\xcf\x95\x83\x83\x76\x39\xb6\x0b\x51\xa9\x54\x67\xc0\x2f\x7b\x13\x5c\x37\x4e\xa8\x60\xa9\x46\x32\x16\xec\x6d\xa9\x7a\xe0\x05\x0f\x26\xea\x7e\x14\x4a\x1a\x99\xc8\x60\xcd\xc8\xb6\x49\xd8\x7d\x80\xed\xfd\x11\xb3\x1c\xcc\x7f\x78\x73\xbd\xb0\x1a\x21\x14\xcf\xbb\x79\x3d\x66\x95\x6b\xb5\x87\xbb\x7d\x7d\x1d\x6c\x53\x13\xb1\x99\xf1\x72\xde\x2d\x12\x3e\x24\x96\x3f\xad\xf6\xa4\x62\x34\xe5\x27\x8b\xad\xf1\xad\x0e\xab\x51\xa7\x04\xd9\xe4\x72\xcf\x52\x64\xe0\x75\xcb\xc4\x14\x1a\xf2\xea\x40\xe4\xcd\xb8\x0c\xf9\x2b\x58\x06\xe7\xc8\x9b\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x02\xef\xcc\x91\x37\x73\xe4\xcd\x1c\x79\xd3\x0b\x96\x39\xf2\x66\x8e\xbc\x99\x23\x6f\x1a\x2f\xcd\x91\x37\x6e\x51\xff\x32\xfe\xa9\x39\xf2\xa6\xfd\xcc\x91\x37\x9d\x59\xe6\xc8\x9b\x2f\xc3\xa7\x36\x47\xde\xf8\x67\x8e\xbc\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\xe6\xe8\x99\x23\x6f\xe6\xc8\x9b\x39\xf2\x26\x7c\x4e\x55\x37\xef\x18\x17\xca\x6b\x99\x17\xa5\x61\xe4\x63\xd5\xae\xbe\xea\x99\xbe\x3e\xa0\x5f\xb0\x71\x39\x3e\x97\x9b\x03\xdb\x76\x95\x0a\x42\x45\xce\xb1\x16\xe2\x32\xc1\xa5\x2d\xab\xfd\x2c\xab\x95\x9c\x3f\xd6\xd5\x81\xbd\xf3\x87\xf1\xa1\x8e\x8f\xb9\x8e\x22\xfc\x51\x84\xab\x0d\xf1\x77\xb0\x84\x86\xa1\x05\x9b\x45\x3d\x00\xfa\xd2\x5c\x96\x58\x02\xd2\xed\x3e\x30\x77\x05\x17\x34\x13\xfd\x7a\x60\x27\xf1\x3d\x83\x99\xfe\x95\xa1\xff\xd1\x2d\xe2\x18\xfe\x8e\x7c\x3c\x0e\xfe\xfe\xca\x40\x04\x42\x35\x03\xd7\x44\xe6\xdc\x58\x39\xc5\x0a\x7b\x8d\x68\xa1\x90\x57\x83\x9b\x96\x0d\xd5\x61\x0b\xf8\x1c\xa9\xc1\x2a\xa8\x95\x9b\xa3\xd9\x73\xcd\x77\x53\x0b\x81\x0b\x2a\xdf\x56\xd2\x12\x9c\xfa\xd2\x37\xdf\x05\xc2\xf9\x45\x63\xd0\xc8\x0b\x56\xde\x57\xdc\x1c\x5e\x4b\x61\xd8\xc3\x80\x04\xd3\x46\x86\x1b\xf7\x89\xeb\x2a\xa8\x2b\x51\xca\x39\x31\x55\x29\x20\xaa\x21\x82\x95\xc4\x00\x0b\xbb\x8d\x9d\xfb\x85\x02\x54\xd8\x83\x39\x1f\x18\x32\xee\x28\x0c\xd5\x77\xf5\x39\xb0\xa5\x65\x4e\x35\xb8\x3b\x73\x3d\x96\x70\x02\x89\xb9\x56\x7c\xcf\x33\xb6\x65\x6f\x75\x42\x33\x38\xf3\x58\x11\xe0\x62\xe0\x7b\xdf\x55\x51\x57\x5d\x34\x87\x3a\x66\xbb\x75\x82\x50\x97\x50\x41\xb6\x94\x0b\x92\x5b\x18\x15\x7e\x58\xe8\xbe\x27\xa0\xc3\x5b\x41\x95\x55\x08\xdc\x07\x21\x89\x0b\x02\xc3\xd6\x52\x66\xce\x23\x9b\x1d\xea\x35\x39\x57\xbf\x90\x3f\x09\x76\xff\x93\x9d\x47\x93\x4d\x46\xb7\xa1\x5e\xd4\xc4\x55\x84\x65\xa6\x53\xb2\xa5\x5a\x0e\x19\x02\x47\x88\x30\x68\x10\xff\x08\xc5\x0e\x8c\xbd\xed\xbe\x5f\x91\x97\x2f\x00\x6b\xa9\x26\xd5\xe8\x21\xa3\xca\xb7\x2f\xc0\xfa\xf2\xfa\xe2\xfa\xa7\x9b\xbf\xdf\xfc\x74\xf1\xe6\xfd\xe5\xd5\xd8\x15\x0d\xf7\x29\x4d\x68\x41\xd7\x3c\xe3\x61\xda\xdd\xb1\x82\x37\x3f\x03\x42\x95\xa6\xe7\xa9\x92\x05\xee\x53\x95\x02\xe2\x35\xeb\x18\xac\x08\x43\x86\xf7\x41\x55\xe1\x9d\xd8\x9a\xbb\x3d\xd5\x56\x51\x61\xbc\xb0\x33\x56\x9f\x1b\xc1\xac\x4a\x61\x05\xd5\xa7\x7a\xdc\x68\x3a\x25\x28\xe1\x22\x4d\x59\xda\x5a\xfa\x89\x7d\x40\xaf\xfd\xd0\x87\x3a\x62\x94\x5c\x7f\xb8\xb9\xfc\xdf\xf1\xb3\x12\x87\x23\x51\xee\x81\x13\x79\xb0\x09\xb1\x68\x32\x01\x92\x1f\x5d\x74\xcf\x0c\xcb\x81\x77\x46\x2a\xf9\x7b\xaa\x12\x79\xb9\x3f\x96\xa2\x1d\x99\x5f\x8f\x40\x72\x99\xb2\x15\xb9\x46\xa2\x08\xdd\x76\x83\xb4\xbf\xfa\xae\x26\x03\x60\xfe\xb5\x1f\x0b\xc3\x69\x96\x1d\x88\x95\xc4\xf6\x34\x63\xe8\x42\x56\x72\x50\x5b\x21\x75\x49\x2d\x8c\x4b\x6d\x52\x8d\x0d\xcd\x74\xe0\x82\xc7\xd0\x41\x4b\xea\xdf\x5b\x61\x32\x12\x4e\xd5\xfb\x24\x65\x42\x1a\x27\x97\xda\x99\x20\xa0\x56\xc9\x84\xa0\x6c\x8a\x6e\x88\xc0\xae\xea\x70\xa2\x8a\x58\x02\x89\xf5\x64\x90\x6b\xbf\xd7\xeb\x6a\x4e\xd0\xc4\x03\x63\x96\x9a\xe9\x23\x6e\xe3\xc8\x60\x2d\xad\xda\x79\x15\xa3\x29\xc4\x86\x15\xd4\xec\xc0\xae\x19\x18\x34\xa7\xfa\x8e\xa5\xf8\xea\x0a\xf9\xb0\x93\xa4\xb5\xeb\x00\xe0\x96\x77\x6b\xa1\xb0\x61\xd4\x94\x8a\x01\xff\x0d\x0b\xb9\x6b\x46\x98\xa0\xeb\x2c\x14\x79\x16\x15\x14\x49\xd3\x0f\x22\x3b\x7c\x94\xd2\x7c\x57\x85\x54\x45\x1e\xe7\x8f\x55\x4f\xf0\xa6\x06\x0d\xcc\x16\x8c\x94\xe9\x12\xc0\x04\x81\x5c\x71\x95\xcc\xdf\xd4\xc7\x77\x02\xf4\x54\xa5\xb8\xd0\xdf\x2b\x59\xc6\x36\xe5\xb0\x18\xf4\xfd\xe5\x1b\xb8\x55\x25\xde\x1b\x26\x8c\x3a\x40\x50\x64\x27\x83\x67\x5c\x86\x5b\x91\x1f\x2c\x4e\x1d\x61\x91\x95\xb8\x4a\xa1\x99\x59\x91\xf7\xf4\x40\x68\xa6\xa5\x13\xa6\x42\x92\x91\x20\xd7\xe0\x33\x69\xca\xff\x2b\x02\x31\xce\x18\x77\xb1\x96\x66\x47\x8e\x5e\x18\x41\xce\xee\x88\x18\xbe\x87\x06\xa6\x3a\x41\x89\x8b\xe3\x81\x43\xc8\x49\xef\x98\x26\x85\x62\x09\x4b\x99\x48\x02\x67\xd8\xb0\x15\xfd\xf9\x4f\x4f\x32\xdf\xc3\x49\x5f\x49\x61\xd1\x38\xf2\xac\x2f\x45\xca\x13\x8a\x34\xc8\x75\xb3\xae\x51\x18\xac\x9a\x4e\xc6\xa4\x10\x03\x37\x42\x65\x4b\xcd\x14\x76\x77\x56\x25\x43\x20\xfe\x47\xb9\x66\x19\x33\x18\x71\x0b\x71\xfd\xd4\x60\x2b\x01\x6c\x28\x4f\x8d\x47\x8c\xf0\x4d\x67\x42\x97\xd0\x2e\xc4\xaa\xc6\x86\xa4\x92\xd5\xf1\x8a\x54\x93\x1f\x2e\xdf\x90\x6f\xc8\x73\xbb\xbe\x17\xe0\x63\xd9\x50\x1e\x12\xdb\x8d\x44\x2f\xcc\xb1\x5c\xbd\xf1\x83\xc3\x36\x00\x3f\x89\x54\x78\x0d\x17\x44\x84\x7c\x3e\xd0\x2d\xc6\xed\xd0\xaa\x3b\x3e\xc6\xd8\x79\xe6\xc0\x68\xd3\x46\xf4\x00\x3a\x87\xe6\x09\x23\xfa\x10\x3a\x07\x46\x1c\x47\xf4\x09\xe8\x1c\x4d\x92\x7e\xd0\x4c\x4d\xa0\x48\x3f\x9c\x94\x22\x35\x45\x00\x8b\xb5\xed\xdd\x23\x6a\xe6\xcc\xd0\x94\x1a\x4a\x78\xe8\x38\x4a\xd1\xe8\x08\xf2\x7b\x38\xe0\xd3\xd1\x2b\xcd\xde\x71\x51\x3e\xa0\x8b\x6c\x8a\x0a\x79\xf3\x16\x3e\x24\x89\x5f\x3c\x00\x9c\x16\x45\xc6\x31\x40\xb8\x9d\x47\x19\x80\x0c\x5e\xf2\x66\x7a\x4c\x9f\xe0\x03\x57\x99\x66\x99\xb4\xa4\xd2\x72\x75\x2a\x52\x99\x07\x86\x3d\x5e\xa0\x15\x98\x18\x4d\x76\x4d\x0b\x7b\x0f\xb2\x4c\x62\x52\xff\xe2\x6c\x2f\x4e\x75\xce\xd8\x9e\x05\xd3\x6e\x8e\xb3\x6b\xed\xfb\x56\x70\xf2\x27\x00\x03\x90\x8c\xae\x59\x86\xcc\x03\xb1\x24\xd2\xd9\x1a\x85\x43\xd1\xaa\x99\x92\xd9\x94\x60\xa4\x8f\x32\x03\xff\x16\xad\x36\x63\x07\xf8\x42\xf6\x02\xaf\xc5\xef\x05\xe4\xfa\xd6\x5e\x40\xdf\xf9\x32\xf6\x52\x06\x39\x51\x67\x2f\x96\x71\xb5\xf7\x02\x1c\xe4\x4b\xd8\x4b\x84\x5a\x7f\xcf\x45\x2a\xef\xf5\x74\xa2\xfb\x23\x7e\xe8\x29\x43\x62\x49\x8f\xe1\x62\xab\x9b\x84\x97\x06\x8d\xa5\x4d\x3d\xb5\x8f\xf2\x7a\xe3\x7c\x95\x4f\xdd\xa5\x51\x81\xd1\xbd\xc0\x55\x6a\xe7\x9f\x79\x04\x23\x0d\x61\x7c\x14\x6d\x3c\x39\x05\xdc\xe6\x9a\xbe\x56\x76\x2c\xc3\x69\x76\x53\x4c\x6a\x7b\xf6\xfd\xfb\x9b\x8b\xf6\xc7\x16\x71\xef\x21\xe5\xde\xee\xc7\xfe\x4e\x68\x9a\x73\xad\xc3\x26\x69\x80\x2f\x5b\x43\x3b\xba\xe7\xde\x47\xb1\xe5\x66\x57\xae\x57\x89\xcc\x1b\xee\x8a\xa5\xe6\x5b\x7d\xee\xb0\x6c\x69\x57\xff\x62\x64\x5c\x2e\x32\x2e\x1a\x46\x07\x48\x60\x77\x42\x1d\x2c\x30\xa9\x76\x00\xa0\xc7\x4c\xd3\x91\x41\xd1\xca\xdb\x03\x00\xcc\x2e\xe5\x2c\x4b\x9d\x21\x02\xc3\xb1\xed\x7d\xce\x8a\x1d\x5d\x02\xc3\x18\x19\xdc\xe5\x8c\x81\x5e\xbf\x93\x42\x3a\x1f\x3a\xc6\x1c\x3b\x55\x0a\xed\x12\xb0\x08\x77\x73\xec\x5a\x46\x06\x6e\x5a\x3e\x4e\x42\xda\xba\xd8\x73\x35\x1a\x58\x3f\x82\x41\x00\x40\x97\x31\xd7\x88\xc6\x19\xd9\x59\xef\x41\xa2\xf0\xfd\x7b\x38\x87\x4a\xe3\x99\x08\x7e\xd0\x7c\xdc\x67\x96\xda\x78\x22\xdc\xab\x09\x8d\x6c\xaa\x53\x7b\xa5\x57\x1b\xb2\xaf\xb4\x35\xa2\xd1\xeb\xdb\xd5\x97\xc6\xb4\xa2\x91\x21\xfb\x84\xdd\x27\xc9\xba\xfd\x83\x9e\x40\xde\x25\x7d\x32\xef\x11\x3e\xaf\x99\x71\xe8\x0c\x08\x9b\xd3\x03\x59\x8f\x5d\x97\x94\x6b\x30\x6b\x82\x53\xba\x89\xbc\x1f\x9b\x88\x74\x6a\x3c\x7d\xb2\x63\x1e\x03\x5b\xa3\xb3\xba\x6f\x1a\xef\x13\xde\x35\x45\x5d\xcb\x14\x43\xc6\xab\xa0\xdc\xc1\xfe\x87\x2e\x74\x9d\xff\xd3\xf3\xfe\x5a\xb2\x10\x12\x63\x26\x9a\x71\xe4\xbe\xc1\x2c\x36\x4d\x1d\x18\xd3\x59\x74\x5d\xf3\xd5\xd6\x2a\xd0\xca\xb5\xe3\xba\x99\x1c\xbe\xa8\x16\x1d\x70\x1a\x37\x5b\x3b\x2c\xc8\xff\x29\xb5\x21\xb4\x72\x3f\xb7\x7a\x4e\x54\x31\xc7\x80\x4e\xc9\xa0\x35\xc5\xe7\x62\x19\x69\x17\xb3\xe7\x29\x23\x29\xdf\x6c\x98\x77\x8b\xaf\x19\x29\xa8\xa2\x39\x33\xe0\x46\x41\xd0\x42\x17\x5e\x31\x8c\x0c\x72\x43\xa8\xef\x75\x5b\x45\xc0\x2d\xd0\x47\xcb\x0d\xc9\xf9\x76\x87\xb2\x0e\xa1\x24\x93\x62\x0b\x11\x7d\x76\x09\x99\xa4\x43\x37\x11\x88\x83\x54\xe4\x9e\xaa\x9c\x50\x92\xd0\x64\x07\x56\x42\x2a\x48\x5a\x2a\x48\xf0\x34\x8c\xa6\x87\xa5\x36\x56\xcf\xb6\xd2\x11\x98\xd2\x10\x02\x83\x5e\xe8\x4e\x27\x0c\x80\x17\xc7\x48\x64\xcb\x4b\xaa\x6b\xe2\x7c\x05\x5e\x38\x68\xa2\xdf\xc0\xe8\xad\x0b\x36\xa7\xf4\x1f\x3d\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\xfb\x37\xe7\x94\xfe\xce\x33\xa7\xf4\xcf\x29\xfd\x73\x4a\xff\x9c\xd2\x0f\xcf\x9c\xd2\x3f\x7d\x6d\x73\x4a\xff\x9c\xd2\x3f\xa7\xf4\x37\x9e\x39\xa5\xbf\x33\xcb\x9c\xd2\xff\x65\x24\xeb\xcd\x29\xfd\xfe\x99\x53\xfa\xe7\x94\xfe\x39\xa5\x7f\x4e\xe9\x3f\x7a\xe6\x94\xfe\x39\xa5\x7f\x4e\xe9\x1f\x73\xa1\xa5\x7c\x20\xd5\x32\x26\xeb\xc0\x19\xf0\x1b\xb1\x8a\xeb\x72\xb3\xb1\x1a\xaa\x1c\x64\xd6\x76\xc6\x8e\x25\xba\xca\x7d\xab\x1c\x5d\xce\x9a\xac\x99\x59\x40\x5a\x03\x86\xe9\x4c\x1b\xd4\x05\x52\x42\x5a\xa3\x62\x1a\xd2\x00\x04\x79\xfb\xe1\xbb\x55\x23\xe9\x61\xd0\x94\x39\x98\x0a\x31\x16\x73\x0c\xab\xf9\x20\x92\x18\xa7\x64\x0d\xd8\xbe\x48\x50\x07\xdf\x24\x93\x1a\x63\x0a\x60\xe8\x21\xd7\xd4\x8e\x0a\xc1\xbc\xd4\xc1\x0d\xc8\xca\x6b\xc6\x04\x91\x05\x13\xe8\x87\xf2\x6d\x19\x08\x35\x86\x26\xbb\x95\x9d\x5f\x04\x47\xf5\xd9\xa1\xd5\xec\x96\xf4\x32\x9a\x23\x70\x15\xcb\x29\xc7\x09\x08\x4d\x94\xd4\x9a\xe4\x65\x66\x78\x51\x4d\x31\x74\x62\x0c\x62\x80\x30\x32\xab\x02\x18\x38\x16\x18\x9a\xe2\x21\xa6\xdf\x1d\xac\xf6\x5b\x90\x62\x34\xf0\x1a\x64\xa3\x05\x24\xb4\xe7\x85\x39\xa0\xcb\x15\x1d\x4f\x5c\x69\x43\x92\x8c\x03\xfb\x87\xd5\x61\x4e\x28\xcc\xb2\x08\x38\xf5\x0d\xe4\x8a\xc2\x5e\xb5\xdb\xac\x48\x81\x6b\x14\x46\xa3\xa3\xb1\x9e\xc6\x4d\x90\x72\xed\x78\xb4\x1e\xf2\x4c\x50\xdf\x3b\x04\x0f\xdb\xef\x15\x8e\x3b\x85\x29\xfc\x9c\xee\x4f\x8d\x49\x46\xa0\x00\x29\x4f\x4e\x51\xaa\x2f\x15\xa4\x18\xfb\x3c\x9f\x45\xab\xcf\x48\x51\x25\xcb\x99\x1d\x1d\xae\xb4\xe0\x2f\xa2\x5b\x2d\x20\x81\x60\x7b\x8b\xb3\x2c\x61\x56\x84\xa6\x9d\x1b\x86\xd3\x3d\xea\x2a\x19\xa6\x72\x2e\xc0\x2d\xfb\x9e\x69\x4d\xb7\xec\x7a\xd0\xc0\x33\x24\x36\x81\x8d\xa7\x06\x35\x20\x42\x06\x32\x54\xfd\x97\xda\x25\x76\x36\x44\x10\x1a\x4b\x21\x39\xae\xa5\x8a\x01\xbc\x57\xdc\x58\x9d\x8a\x6b\xcc\xa5\x03\xbb\xe6\x71\xc0\xe5\xf0\xd0\x4d\x27\xdc\x7b\x3f\x74\x3d\xa4\xa5\xef\x22\x45\xc7\xd5\x9a\x91\xb5\xe2\x6c\x43\x36\x5c\xd0\xcc\x79\xa0\x86\xf0\x0b\x72\x44\x28\x0a\xd4\x5a\x5b\xd1\x54\x0a\xef\x58\xf1\x7b\x58\x91\x1f\xdd\x26\x8c\x2a\x45\x42\x47\x73\x96\x85\x4c\x19\xe1\x1b\xb2\x05\x6f\x97\x42\x87\xfa\x9f\xbe\xf9\x6f\x7f\x26\xeb\x83\xe5\x88\x60\xa8\x34\xd2\xd0\xac\x02\x53\xc6\xc4\xd6\x9e\x01\x10\x88\xa1\xbb\x90\x65\xcd\xf4\x4b\x0f\x59\xa8\xab\x82\x5b\x7f\xf9\xed\xdd\xba\xcd\xd2\xcf\x53\xb6\x3f\x6f\x9c\xcb\x32\x93\x83\x71\x29\xdd\x66\x38\xfd\xcc\x77\x44\xbc\xec\x41\x48\x28\xbe\x10\x81\x92\x3e\xf9\x89\xec\xe4\x3d\xe6\x60\xf6\x60\x54\xed\x12\x2f\x64\x51\x66\xc3\x5d\x7b\x08\xf9\xce\x62\x31\xc0\xa9\x74\xdc\xa1\x15\xce\xd8\x7b\x73\x40\xd1\x77\x03\x0f\xd3\xba\x26\x87\x47\x17\xa7\x5f\x9e\x74\xf1\x50\x4e\xc9\xad\x72\x9f\x4a\xc5\x56\xe4\x3b\x9a\x65\x6b\x9a\xdc\xdd\xca\x77\x72\xab\x3f\x88\xb7\x4a\x0d\x8a\x01\xad\x75\x67\xd4\xd2\xe5\x5d\x29\xee\xda\xad\x16\x32\xb9\xb5\x72\x5c\x51\x1a\x1f\xb1\xd2\xd8\xd5\xc0\xc0\x7e\xa5\x70\xc7\x2b\x26\x40\x5d\x2f\x9b\x7a\x6c\xf6\x00\x78\x05\x01\x4f\x54\x10\x66\xd7\x3a\x04\x69\x8b\xd1\xcd\xb5\xe8\x26\x5a\x7e\xfb\xcd\x9f\xfe\x0d\x51\xdf\x6a\x17\xff\xf6\x0d\x38\xff\xf5\x02\x89\x8b\xa5\x8c\xc3\x14\x5a\xe7\x34\xcb\xac\x22\xd1\x44\x6a\x7b\xac\xab\xd8\xde\x4d\x63\xd8\x6a\x62\x10\x33\x5a\xb8\xbb\xbd\xfd\x7b\x40\xb2\xe3\x46\xb3\x6c\xb3\xc0\xd8\xbb\x2a\xdf\xf6\x0c\x18\xc5\x99\xa3\x5d\x96\xab\x77\x59\xc3\xe3\xc4\xac\xbd\xcc\xca\x9c\xbd\x61\xd0\x74\x25\x62\x9b\xad\xf7\x7d\xc4\x46\xe6\xfa\xa3\xad\x33\x99\xdc\x91\xd4\xfd\x08\x8b\x1d\xd8\x26\x78\xad\x5c\x48\x4f\x43\x17\xac\xa2\x80\x20\x00\xcf\x47\xf2\x3c\xb5\xe3\x56\x73\xcd\x2d\x7f\x5b\x4e\x8b\x02\x1a\x8d\x6d\x20\x41\xe8\x1e\x37\x10\xd0\xb1\x60\x04\xd7\x49\x87\x9e\xa6\xfb\x16\x0e\x3a\xcc\x90\x7b\xf6\x53\x7f\xe2\x0f\xa0\x80\xff\xc6\x78\x91\x09\xa9\x75\xa4\x0e\xdb\xab\xf6\x86\x1c\xc3\x42\x06\x6e\xe6\x93\xfb\xf0\x4c\xea\x7b\x04\x66\x85\x46\xa7\xa7\x66\xbc\x32\x25\x05\x53\x1a\x9a\xc3\x99\x4f\x70\xa2\xaf\x33\xca\x43\x19\x5d\x84\xd4\x0d\x8f\x9e\xb6\x8d\xf1\x0e\x3c\xf5\x99\x0c\xbe\x12\xf0\xf6\x3d\xb1\x37\x0f\x22\x38\x24\xe3\xc7\xdc\xe1\x6b\x99\xba\x4f\xe0\x92\x62\xe1\x82\x1e\x51\x4b\x47\xe4\xbe\x9f\xbc\x3d\xde\xa7\x7a\x2f\xed\xbb\x6a\xff\x52\x5d\x56\x7c\xcb\x5d\xc5\xc1\xb3\x3d\xd1\x15\x85\xa9\x27\xdd\x50\xb8\x9b\x8d\x8e\x5b\x35\x3f\x68\x89\xd0\x78\x08\x41\x0c\xae\x45\x19\x27\x13\xaf\x08\xda\xb4\x2d\xd4\xdd\xb0\xe4\xec\xd5\xd9\x93\xef\x29\x6e\x52\xc9\x82\x6e\x47\x4a\x47\x1d\xed\xf5\xf8\x43\x92\x32\x14\x30\x98\x06\x21\x0d\x7e\x07\xb7\x51\x70\xa3\x85\x1b\xc1\x77\x76\xf2\x3e\x3e\x67\xa6\xf5\xe0\x73\x22\x08\x06\x07\xdf\x07\xbd\xd8\x84\x50\x25\x4b\x91\x3a\xfd\xbc\x32\x84\xbc\x3f\x5a\xf0\x95\x14\x20\xe4\x60\x0e\x52\x20\x6c\x15\x9f\x56\x8c\xb8\xa5\x30\x2f\x57\x2f\xbf\xf9\x65\xc9\xe4\xed\x51\x43\x3c\x0b\x91\xab\x8a\x4c\xe2\xdd\x78\xf2\x8a\x7c\x81\x8d\xe8\x55\xbd\x77\x4a\x5b\x5d\x3f\x83\xfb\xaa\x02\xf0\x27\xab\x8c\xb1\xa8\x52\x78\x84\x3c\x07\x91\xc6\xca\x82\x8d\xac\x84\x17\x93\xca\xc0\xc4\xa5\xb5\x5b\xfd\x6e\xfd\xa4\xbb\x8d\x97\x18\x91\xb6\x4f\x17\x0e\x63\x93\xfb\xba\xe7\x9a\xb7\xba\xc8\x3d\x23\xcf\xf1\xcd\x33\x0d\xb1\xa8\x2f\x9e\x7c\xbc\x6e\xdb\x6f\x1f\x8a\x60\x1e\x65\x6b\xeb\x6f\x1f\x0a\x0a\x3a\x74\x31\x06\x83\x11\xa1\xa3\xcd\x65\x86\x61\xf0\x57\xb6\xa3\x7b\x06\x71\xb2\x3c\xa3\x6a\x30\x93\xc0\x8d\x2b\xc9\x0d\xee\x0a\x9a\xdd\x32\xb1\xe7\x4a\x0a\xf0\x53\xed\xa9\xe2\x90\x53\x04\xad\x08\x99\xb0\xf2\xe9\x1f\x9e\x7f\xba\xf8\x08\xfe\x81\x70\xb6\x1b\xe6\x1e\xb8\x9d\x97\x1a\x62\x10\x8e\x76\xd0\x98\xaa\x3e\xb8\xb1\xb5\xf6\x1c\xaa\x5f\xbf\x3d\x15\xa0\x75\x7e\x3f\x76\x0d\x79\x69\x4a\x3a\x9c\x4d\x81\x0f\x7b\x48\xb2\x52\xf3\xfd\x53\xef\xff\xb8\xc4\x53\x71\xc5\x5f\x41\xe0\x71\x21\xdd\x6f\xf8\x00\xee\xf6\x37\xdc\x3d\xd3\xdd\x58\x70\x30\xeb\x09\x69\xc6\xbb\x9e\xf6\x1a\x97\xcf\x74\x55\x1b\xa7\x99\xca\xea\x14\x57\x97\x72\x31\xa8\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x4e\xa3\xc2\x0e\x9f\xe5\xc0\x19\x05\x4e\x67\xe8\x5c\xb0\x6b\xf3\x3b\x99\xd0\x4e\xea\x7f\xa7\x95\xb6\x7b\x8f\xe4\x90\x84\xe5\x6a\x49\xe5\x56\x7d\x2e\xb5\x8b\x18\x73\xe3\x11\x29\x48\x26\x65\xb1\xa6\xc9\x5d\xf7\x5c\xb4\xec\xd6\x96\x81\x86\xbb\x74\x4b\xb9\xd0\x75\x3e\xd2\x65\x27\xf2\x67\x98\x35\x64\x72\xfb\x1d\xba\x8d\x82\xdb\x90\x5b\xe7\x5d\x82\xb8\x82\xc6\xfa\x51\x45\x6f\x9c\x2c\x94\x28\xed\x9d\xbe\xe7\xb8\x32\xb9\x7d\xd7\x57\x3e\xa1\x33\x39\xe6\xa6\x9d\x74\x6e\x21\x53\x76\xc3\x32\xb8\x17\xc7\xf3\xc7\xd5\xfe\x0d\x60\x61\x6b\x03\x6f\xa0\xaa\xad\xbb\x23\x57\x32\xf5\x58\x20\x53\x0c\x2f\xd2\xc9\x8e\xa5\x65\x06\xae\x8a\xfe\xe5\xf7\xe0\xa6\xdc\x33\xa5\x78\xca\xfe\x26\x85\x54\xef\xe8\x9a\x65\x9d\x15\xb6\x33\x6b\xba\xef\x5b\x81\xa5\xe1\x39\xa9\x86\x84\x1a\xce\x98\x61\x59\x03\xb7\xb3\x7b\xc8\x66\xfd\x09\x4a\x0a\x68\xd7\xed\xb8\x31\xb2\xf6\x21\xc9\x37\xd8\xb2\xf4\xbd\x14\xdc\x48\x70\xa6\x5f\xcb\xd4\xfd\xab\x0b\x51\x59\xd5\x65\xe2\xba\xb1\x9e\xe6\x5c\x83\xb2\xd0\x30\x92\xb7\x60\x75\xcb\x73\xa6\x0d\xcd\x8b\x09\xf0\xaa\xbf\xf1\x21\xd3\x46\x92\x6d\x26\xd7\x58\xe6\x4f\x6c\xa4\x4a\x18\xae\xb2\x8f\x22\x99\xfa\x73\x2e\x00\xb8\x3a\x51\xb4\xf0\xb8\xdb\x89\xb7\x1e\xde\x49\x41\x2d\xbd\x0d\x2e\x1c\xa4\x7f\xda\xbc\x27\x29\x2b\x32\x79\x00\xc1\x80\x6b\x37\x04\xe4\x1c\x52\x97\x2a\xc3\x1e\x12\x56\x74\x19\x93\xbd\x6e\x29\xcb\x58\x7f\xad\x28\x1f\xf8\x5a\x8a\x94\xa9\x0c\xda\xe5\x23\x9a\x4e\xd9\x8e\x4c\xdf\xbb\x94\xdc\xe0\x9e\xae\xeb\xf7\x6a\x94\xd4\xc4\x21\x9b\x95\x1c\x2e\x2c\xdf\xa0\xb8\x1d\xbc\x68\x7d\x1a\x58\x43\xeb\xf2\x81\x2d\x35\x98\x0a\x99\x76\x96\x1e\xd2\x97\x69\x3d\x65\x1f\x5b\x8e\xaf\x1f\x3e\x22\x9f\x1c\xd5\x2e\x6e\x6c\x14\x13\x08\x4b\x97\xf5\x04\x24\xf0\x8e\x1d\x5c\x8c\x42\x4e\x0b\xa2\x8d\x1c\xea\x43\x8d\x46\xec\xaa\x6e\x38\xb2\x16\x4c\xfc\x85\xab\xbb\x3e\xd4\x4d\xdc\x8d\x94\x99\x73\x7a\x4a\xc5\x06\x7d\x9e\x8a\x19\xc5\xd9\x9e\x11\xaa\xd6\xdc\x28\xaa\x0e\x55\xc2\x35\x78\x78\x0e\x40\xed\x2c\xdb\xfa\x47\xc9\xd4\x01\x04\x54\x88\x4c\x03\x49\xb8\x77\x48\x8b\x70\x8a\x01\x93\x4c\x31\xb3\x33\x97\x29\xdf\xb4\xb0\xed\x38\x26\xb3\x3f\xd8\xc2\x92\xb3\xe5\xb6\xe4\x29\x3b\x6f\x1c\x5c\x9f\x3f\x27\x28\xac\x65\xbd\x94\xf6\x33\x9e\xf7\x7b\x5a\x40\x60\x0b\xbc\x6d\x8f\x17\xf1\x1d\xce\x58\xb7\xda\x8e\xbb\x0c\xdb\xde\x29\xa5\xda\x52\xc1\xff\x89\xf0\x4e\xa8\x61\x5b\xa9\xec\x3f\x9f\xeb\x44\x16\xee\x14\x80\x17\xbe\x68\x80\x95\x1e\x50\xe1\xee\x1d\x51\x3b\xd6\x09\x8e\x23\xc5\x8a\x8c\x27\xad\x1a\xda\x19\x64\xf2\xc2\xb8\xae\xc5\xf9\x58\xbc\x4c\xd4\xd9\x21\xfc\x27\x1f\xdb\x90\xbd\xe1\x28\x8e\xa8\xb2\xc7\x5a\x70\xb6\x1a\xc9\x53\x18\x42\x17\x34\x61\x2b\x72\x59\x57\xd9\xef\xbf\x5b\x16\x51\x13\xc5\x28\x58\xf0\xaa\xca\xf3\x0b\x42\x33\xb3\x93\xe5\x76\x47\xb4\xcc\x59\xa3\x66\x7f\x0e\xe5\x07\x32\x79\x4f\xa8\x0b\x05\xe8\x47\x1c\x59\x67\x66\xed\x18\xd9\x32\xe1\xd2\x8f\xc1\x12\x22\x08\x2d\x2c\xbd\x52\x9c\x1a\x67\x47\xa6\xa5\x91\x39\x35\x3c\xb1\x7c\xaa\x5f\x94\xf6\xb5\x32\x0a\xc5\x73\xaa\x78\x76\xa8\x5d\xc7\x10\x89\x0e\xbb\x90\x82\xf0\x94\xe5\x85\x34\x56\x97\x44\x24\x6a\x16\xdb\x1f\xd0\x4a\x36\x10\x38\x2d\x45\x9f\x5c\x3f\xf9\xd6\x72\xa8\xcb\xb1\xe1\x4c\xe9\xaf\xe1\x2c\x86\x91\xa0\xf7\x6a\x0d\xe2\x47\x51\xc9\x23\x57\xfe\x88\x87\xe4\xc2\x4e\xe2\x03\xbc\xed\x25\x51\xbc\x12\x0e\x70\xb5\x94\x83\x51\x1d\x7b\x86\xda\x57\x17\x35\x79\xb6\xc0\x7c\xe7\x64\xc7\x92\x3b\x22\xef\x45\x03\xd7\x26\xf0\x23\xb8\xab\x56\x95\x76\x61\x32\xa3\xf8\x7e\xfc\x01\xba\xa2\xbc\x77\x0b\x8b\x45\xf9\x6b\xee\x11\xde\x4a\x11\x03\xf9\x61\xb7\x2e\xf9\xcc\xbf\x05\xd4\xfe\xe2\xea\x4d\xbf\x12\x17\x30\x91\xb7\x6b\x8d\x07\x16\x82\x0b\xae\x7e\x41\x62\x88\x2a\xe5\x90\x39\x02\xe9\xe6\x82\x50\x4b\x4a\x17\x18\x92\x23\x5c\x1e\xbf\x1f\x42\xb1\x8c\xfa\x9a\xc7\x96\x9f\xd6\xf4\xb6\x7f\xe3\xe3\x46\xf5\x3b\x16\xb0\x2b\xb6\xb6\x6b\xe7\xf3\x6e\x46\xd8\xb7\xfd\x43\xe5\xb6\xaa\xb6\x3a\x5e\xbe\x2b\xe4\xcb\x8a\x30\x88\x78\x88\x44\x2e\xbb\x02\x60\x55\x62\x5c\x23\x88\xcf\x34\x82\xd3\xe2\xd7\x8e\x17\x10\x38\x1b\x58\xb5\xab\x8a\xef\xa0\x4d\x3e\xd1\x8c\xa7\xd5\xe0\x88\x51\x97\x62\x41\xae\xa4\xb1\xff\xf3\xf6\x81\x6b\x33\x56\xd8\xf9\x8d\x64\xfa\x4a\x1a\x78\xf7\x49\x20\xc1\x45\x45\x02\xc4\xf1\x67\x57\xe2\x41\x29\x7a\x68\x70\x71\xbf\xbd\xcb\x8d\xab\x29\x86\xfb\x0b\x6c\x82\x6b\x72\x29\xac\xf2\xe4\x76\x5e\x55\x85\xd1\x6e\x70\xcf\xb5\x84\x14\x4b\x08\x5f\xf0\xa3\x07\x06\xad\x0e\x8d\x6b\x0f\x4a\xa9\x5a\xf0\x1a\x98\x28\x30\xe6\x9a\x11\x37\x3d\x58\xed\xf1\x1b\x08\x2c\x2b\x32\x9a\xb0\xd4\x97\xd1\xa0\x16\x16\x56\x0e\xe1\x09\xc9\x99\xda\x86\xd6\x59\x58\x3a\x35\x7c\x74\xa3\xf9\xa8\x13\x0a\xcb\x0c\xa7\x0a\x86\x2d\x84\x4b\x8b\xeb\x03\xbf\x04\x8f\x77\xc4\x32\x18\x5a\x15\x90\xef\x7e\xcd\x9f\x7c\x36\x79\xb4\x31\x29\x52\xdf\x1c\xe5\xd3\xff\x6b\xc9\x29\x20\xca\x7f\x92\x82\x72\xa5\x57\xe4\xc2\xc5\x8d\xf6\xce\xd9\x7c\xdf\x19\x03\x9b\x43\xdb\x51\xb9\x3e\x2a\xa0\x4f\x05\x61\x98\x88\xd1\x2f\xe3\x6e\x3a\x1c\x6d\x41\xee\x77\x52\x23\x15\xaf\x1c\x59\xcf\xee\xd8\xe1\xd9\xa2\x75\xf3\x86\x42\x7a\x9f\x5d\x8a\x67\x8b\xca\x0b\xd7\xba\x07\x9e\xcf\x20\xeb\x7e\x06\xbf\x3d\x5b\x75\x98\x60\xef\xb0\x41\xc6\x38\x6a\x8d\x0c\x8a\x30\x51\x92\xcb\xd9\x7f\x79\xfb\x50\x30\xc5\xa1\xf1\x52\xf6\x5f\x1a\xb2\x4a\xaf\x28\x63\xa8\xda\x32\xd3\x10\x63\x8e\x25\xaf\x59\x2a\x99\xa5\x92\x59\x2a\x99\xa5\x92\x59\x2a\x69\xc0\x66\x96\x4a\x66\xa9\xe4\xf7\x2e\x95\x28\xd3\x57\x4c\xf4\xc8\xb4\xaf\x5c\x82\x2a\xd8\x2f\xab\x14\x6a\x70\x8e\x89\x94\x6c\xad\xc8\x01\xfd\xd6\x9c\x21\x71\x20\x66\xa9\x59\x18\xe8\x9e\xad\x7b\xd7\xd8\x83\x4c\x85\xe2\x12\xea\x68\x66\x54\xeb\xf1\xc5\xba\xb7\x49\x62\x5f\x27\x54\x6b\xbe\x15\xb5\x33\xe1\x5a\xa6\xc7\x0b\x0b\x4c\xec\x1d\x0f\x6f\x9d\x99\x1d\x90\x6c\x74\x09\x3e\xf0\xa9\xe1\xdf\xa9\xec\xf4\xc8\x9b\x7d\xa5\x45\x6c\xdd\xd4\x78\xb1\x03\x33\x2e\xb4\xa1\x22\x41\x63\x61\xb7\xc6\x2a\xfa\x11\xe4\x86\xfc\x5c\x2f\xf6\xe7\x15\x79\xdb\x9a\xae\x33\x28\x38\x8a\x7e\x12\xd2\xfc\x04\xb9\xa9\xd0\x2a\x0e\x0c\xa2\x55\xea\xa4\xf3\x39\x62\x94\xbd\x63\x3e\xcf\x7f\x7e\xf6\xec\xe7\x4e\x98\xcf\x20\xf4\xc0\x81\x10\x84\xd3\xff\xb2\x6f\x40\x39\x69\x6c\x2a\x8a\xd2\x0b\x7c\xd7\x2e\xb9\xb7\xc9\xe8\xd6\x75\x30\x84\xdc\xa7\x3e\x72\x53\xc3\x70\x8a\x41\x2e\x93\xf2\x6e\x4d\x93\xbb\x37\x2c\xeb\xfa\xb7\x3a\x0b\xc6\xae\x58\x99\xa1\x55\x69\xcc\x84\xf9\x66\xba\xae\x9d\x15\xb8\x57\x2c\xb4\x72\xfb\x9f\x49\xff\x35\x76\xac\x8c\x55\xf4\x86\x30\x0b\x79\x14\x76\x86\xaf\xf6\x00\xa1\xcd\xe9\xc3\x6b\x29\x92\x52\xd9\xf5\xf4\x8a\x8b\xbd\x29\xd3\x90\x91\x81\x5f\xa1\xb7\x87\x1f\x39\x2b\xa0\x29\x8e\x21\x72\xa0\xfc\xf8\x58\x2a\x6b\x38\x89\x35\xa7\x0f\x37\x34\x2f\xb2\x7e\xd6\xd2\x8e\xe2\x73\xbd\x8e\xeb\xea\x35\x1a\xbf\xac\xd3\x1e\x1d\xce\x50\x01\x85\x43\x21\x72\xb8\x17\xf0\x39\xcb\x21\xc2\xe6\x4a\x1a\xe7\x4e\xf3\x1b\x87\x2b\xb1\xa1\x3c\x73\x29\x29\x07\x72\x0f\xb1\x5f\x30\x1e\x74\x0d\x75\x93\xf6\x33\xc2\x1d\x15\x2e\xbf\x55\x18\xe9\xa6\xc1\xfa\x88\x20\xcc\x64\x5a\xba\x56\xd2\x18\x40\x7e\xbc\x93\x7e\x62\xdf\xd8\x96\x62\xa6\x54\x9d\xc8\x83\xa7\x1f\x83\x4b\xe6\x8e\x3e\x03\xc8\x68\xf4\x0b\xcb\xe9\x01\x8b\xb7\xba\xba\x2c\x6b\x06\x02\xda\x1a\x0a\x33\x4c\x44\xe3\x41\x0e\xa5\x58\x2e\x0d\xfb\xc8\x68\xd8\xa5\xde\x2e\xd6\x8b\x45\xd6\xec\x87\x3f\x29\x46\x53\xf8\xa9\x55\xd1\x95\x35\x94\xeb\xce\x42\x5d\x92\x07\x54\xbf\xb4\x7b\x4c\x76\x90\xfa\xcf\x05\xa1\xe2\x40\xca\x22\x91\x39\x3a\x8d\x32\x46\x35\xfe\x9d\xac\x15\xa3\x10\xc7\x75\x4f\x3b\x5e\x9c\x01\x39\xb3\xd3\x65\x12\xb7\xd9\x21\x88\xcd\x8d\x8c\xb9\x74\x2c\x11\x2a\x06\x29\xe1\x98\xc6\xb9\xa6\x9a\x27\x17\x65\x54\x26\xe6\x5f\xfd\xbb\x95\x3c\xf0\xc3\xc7\x77\x8f\x55\x73\x0b\xaa\xf5\xbd\x54\xb1\x25\x5e\x6e\x41\xa3\x4d\x54\x5d\x51\xcf\x09\x1e\x24\x77\xfe\x9c\xca\x3b\x13\x4a\x7b\x25\x75\xd9\x07\x9f\xb4\x82\xcb\xc0\xfe\xdb\xa5\xd9\x31\x61\x9c\xcf\xf4\xa9\xc5\x15\x83\x8a\x7c\xef\x06\xad\xe8\xe9\x32\x67\xdc\x5e\xa1\x88\xa0\xd5\xe3\x21\xac\xd5\x85\xdd\x07\x07\x05\xb5\x8a\x62\x3f\x31\x3f\xca\x1d\x1b\x29\x41\x1a\x59\x89\x63\xbc\x10\x5f\x8f\xe7\xd6\x6d\xc8\xc5\xbc\x9a\xc9\xc5\x9a\xac\xa4\xb9\xe7\xec\xfe\xdc\x85\x4d\x2e\xef\xb9\xd9\x2d\x9d\x3f\xfc\x1c\x4e\xfd\x1c\x5d\x8f\x23\x70\xc1\xb2\x31\x17\x69\xea\x02\xf7\x4b\xcd\x36\x65\x86\xb2\xbe\x5e\x11\x5a\xf0\x4f\x4c\x59\xd6\xbc\x20\x77\x5c\xa4\x0b\x52\xf2\xf4\xdf\x4f\x52\x5b\x45\xfa\x0c\xe6\x78\xd8\xdd\x00\x65\x3b\x54\x2d\xaf\xa1\xec\x34\x9e\xa6\x55\x41\x8c\x06\x64\x19\x51\xb0\x09\x62\x83\xeb\xdf\x1e\xb1\x93\xb1\x30\xf5\x98\x62\x23\x43\xca\x2d\x89\xab\x35\x52\x6a\x2b\xc6\x86\xf0\xec\x17\xa1\x0b\x7e\x19\x33\x5d\x98\xe9\xc2\x4c\x17\x7e\x75\xba\x30\xf2\xc2\x9a\x51\xc5\xd4\xad\xbc\x63\x31\x25\x70\xf0\x6d\x62\xec\xeb\x4e\x87\xb3\xe2\x16\x24\x08\x3d\x2a\x39\xbb\x31\xfd\x77\x7c\xa8\x55\x5b\x6b\x09\xdf\xb9\xba\x15\x20\xe1\x9d\x7c\x3d\x85\x92\x0f\x87\x1f\xd4\x00\x5e\xb5\x03\x6a\x1d\x0a\x5a\x65\xfa\xe1\xf0\xc3\xc7\x77\x8f\x99\xcf\x2e\xf4\x23\x4b\xd8\x50\x27\xeb\xde\x1c\x75\xac\x40\xd2\xc8\xb7\xa1\x29\x52\x5b\xaf\x9f\x81\x90\x39\xdc\xdf\x15\x8a\x73\x35\x7a\x7e\x64\x10\xce\xaf\x8d\x54\x8d\xea\x0b\x3b\xba\x67\x55\x27\x0e\x2c\xef\xb2\x19\xaa\x0e\x30\x86\xea\x78\x2a\xb7\xc3\xea\xd3\x31\xe5\xc6\x37\xdd\x89\x42\x80\x58\x65\xc4\x69\x9c\x30\x61\x22\x85\x2e\x3c\x8f\x3a\x6a\x7f\xf3\xde\x53\x93\xec\x06\xeb\x55\xc7\xdb\x77\x23\x68\x57\xdb\xe5\x26\x2a\x2a\x56\x79\x03\xd9\x3f\x4a\x0a\x9d\xed\x73\xb7\x28\x17\xfb\x6b\x0f\x63\x68\x52\x59\x05\x95\x42\x1a\x70\xcb\x55\x27\x9d\xf2\xf9\x18\xc0\x0d\x5b\xcb\x33\xfd\x1a\x34\xab\x98\x93\x7c\x77\x43\xf0\xe5\x66\x39\xd8\xd1\x5b\x3a\x2e\x0e\x24\xbd\x06\xa8\x9e\x15\xdc\x98\x32\xa9\xfc\x95\x3e\xf9\xeb\xf5\x05\x49\x98\x32\xcd\x35\x41\x65\x0d\x70\x0c\x07\xca\x85\xc7\xb6\xd0\xb0\x1b\x7e\x4f\x03\xdd\xbf\x3b\xcb\x7c\xed\xbf\x69\x2e\x15\x6e\x5d\x7b\x8d\x23\xbc\x69\x74\x07\xf1\xbb\x20\x31\x02\x57\x67\x1f\x5e\xe8\xaa\xc4\xac\xb1\x22\xbf\x93\x6a\x73\xc7\xd5\x33\xff\x92\x45\x26\xf2\x08\xb1\x29\x62\xc8\x71\xc1\x8a\x4c\x83\x74\x9c\x80\x45\x62\x84\xac\x1a\xb5\x51\xce\x8a\xd8\x8e\x97\xc4\x62\x65\x2d\x12\x2d\x6f\x91\xe8\x0a\xef\x61\xb9\x8b\xc4\x97\x6d\x47\x95\x61\x8a\xa4\x8a\x52\x69\x98\x10\x7c\x39\x57\xfd\xe9\xfa\x15\x79\x9c\x8e\x45\x66\xe2\xf1\x9b\x27\x1e\x1d\x0d\x2d\x62\x3f\xbf\x11\xca\x11\xf1\x52\x42\x87\xb5\x26\x32\xd4\xe7\xa1\x29\x00\x39\xcb\x4f\xc3\xf9\x1a\x53\x78\x68\x2a\x25\x8a\x40\x1d\xbb\x9a\x68\x89\x4e\xf5\x88\x74\xae\xe2\x24\xec\x0a\xea\x9e\x8d\x0b\x4c\xb3\xb8\x77\xf4\xcc\xe2\xde\x4c\xb1\xc7\x06\x9d\xc5\xbd\x59\xdc\x9b\xc5\xbd\x99\x78\x34\x9e\x59\xdc\xfb\xa5\xc4\x3d\xa6\xcc\x23\x05\xbe\x8e\x78\xd4\x91\xfc\xc2\x12\x8e\x2b\x6b\x73\x4a\x91\x8f\x43\xcb\x19\xc5\x6e\xee\x78\xf1\x89\x29\xbe\x89\x8d\xde\x7f\x83\x9d\xba\x7d\x1e\x87\xdd\x13\xdf\x60\x59\x61\xa0\x28\x23\xbe\xc6\x98\xf3\xbf\x63\x87\xa7\x01\x1a\x63\x61\xbf\x08\x38\xdf\xb1\xc3\xcd\x08\x4f\x1a\xe1\x47\x7d\xfb\xfa\xc5\xc4\xeb\xd9\xe9\xfb\x65\x71\xa5\xd9\xe9\x3b\xba\x93\x5f\xdd\xe9\x4b\x5c\x1d\xae\xbe\xe8\xeb\xfa\x69\x41\xea\x07\x17\x65\xbd\x07\x4a\x5c\xd5\xef\xac\x22\x39\x4e\x43\x8d\x46\x56\x5e\x46\x79\x5e\x6f\x31\x7e\xce\x5f\x09\xef\xcc\xc2\x5b\x2e\xd2\x2a\xe2\x75\x28\x39\xeb\xd1\xd5\xd6\x4a\xd5\x8d\x7f\x7c\x44\xb1\x35\x74\x7f\xfd\xa8\xb8\x09\x87\xc6\x0f\x86\x69\x62\x29\xce\x7f\x95\x38\x4d\xd8\xe8\x50\xa0\x26\x6e\x65\x8e\xd4\x9c\x23\x35\x67\xe6\x3c\x33\xe7\xdf\x09\x73\x9e\x23\x35\x67\xba\x30\xd3\x85\x41\xd8\xfd\x4e\xe9\xc2\x49\x23\x35\xa3\xc2\x24\x41\xf8\xfa\x92\xe2\x36\x1f\xbf\xa0\x5f\x3a\x70\xf3\x1f\x25\x2b\x59\x74\x18\xdc\xff\xaa\xdf\xae\x0a\xae\x96\xc2\xb5\xc3\x68\x04\xe7\xa1\x34\x0c\x63\x0f\x8a\x94\x8a\xe6\xcc\x30\xf5\xe8\x2a\x19\x6b\x6a\x92\xdd\x0d\x13\xe9\x1b\x46\xd3\x8c\x8b\x58\x2e\xf4\xd7\xe3\xef\x7c\x05\x8d\xbc\x9d\xee\x86\xda\x57\xe0\xc2\x41\xf6\xe0\x3d\xe5\xc0\xcd\xb0\x57\xe6\xd3\x5c\xc7\xb4\xa0\x09\x1f\xea\xf2\xd4\xd9\xc7\x6b\xf7\xba\x5f\x7e\x37\x53\xd2\x48\xdf\xc2\xb3\x08\xba\xc1\xf5\x8e\xaa\xd4\xe7\xf3\xdd\x33\x4c\xb7\x25\xa9\x92\xd8\x96\xc8\xec\x86\xfb\xae\xc4\x75\x92\xce\xe9\xc3\x5f\x69\x72\x27\x37\x81\xe6\xc1\xc7\x99\x87\xee\x83\xe3\xc3\x51\xcc\xa8\x03\x49\x59\xd6\xd5\xe4\x8e\xd7\x14\x04\x76\x4e\x1f\x3e\x42\xde\x6e\x6c\x89\x8e\xf7\xd5\x07\xc7\x4b\xaa\x01\x0f\xf5\x84\xc3\xbd\xc0\x71\xfd\x14\xb1\x97\x48\x41\x14\x83\xe2\x3d\x60\x08\x86\xc6\x65\xa3\x66\x89\x51\x58\xbb\x1c\xdb\x6b\xa6\x2c\x9a\xc7\xef\xaf\xfd\xdd\xf0\x36\x43\xf9\xab\xf8\x14\x4c\x81\x09\xe3\xe9\x5b\xb1\xa8\x39\xe1\x88\xf0\xfd\xc0\xd2\xe1\xf7\x05\xe1\xab\x60\x67\x02\x8a\xcd\x88\x9a\xe9\xd2\xc9\x28\xbe\x8d\x6c\x86\x8b\x89\x77\xa0\xfa\xc0\x6f\x07\xaa\x76\xd2\xac\x75\x07\xc8\xf7\xcc\x68\x92\xca\x72\x9d\x05\xa5\x03\xcb\x9c\xd8\x9e\xa9\x03\x7e\xfd\xb4\xbb\xc3\xc5\xb4\x73\xf1\xef\x57\xe7\xe2\x9a\x36\xff\xfa\xe7\x32\x22\xab\x7c\x86\x80\x7f\x64\x8d\x4f\x8a\xf8\x3f\x59\xe0\x7a\x40\x4c\x99\x23\xd7\xe7\x50\xa6\xbe\x67\x8e\x46\x18\x78\xbe\xe4\x68\x84\x39\x94\x69\x0e\x65\x1a\x1b\x78\x0e\x65\x9a\x89\xc7\x1c\xca\x34\xf9\xa5\x39\x72\x7d\x8e\x5c\xff\x22\x78\xc0\x2c\xee\x0d\x3f\xbf\x33\x8a\x3d\x8b\x7b\xb3\xb8\x37\x36\xf0\x2c\xee\xcd\xc4\x63\x16\xf7\x26\xbf\x34\x47\xae\xcf\x91\xeb\xbd\x9b\x99\x23\xd7\xe7\x20\x98\x39\x08\xa6\x07\x76\xbf\xd3\x20\x98\x39\x72\xfd\xd1\x91\xeb\x04\xfd\x52\x1f\x19\xd4\x31\x47\x65\x26\xa6\xf7\x8b\x5d\x94\x2f\x40\xd5\x72\xb6\x29\x1c\xa9\x1d\x9d\x3d\x00\xc3\x60\x7b\x88\x36\x51\x68\x2d\xd0\x87\xc3\xa4\x07\x41\x73\x9e\x10\xc5\xec\xdc\x75\x64\xcc\xe0\x81\xf9\x7e\x35\x66\xe1\x4b\x29\x43\xb3\x16\xc0\x04\x0f\x46\x17\x9a\xc1\xc5\x96\x69\xe0\xac\xe4\xd2\xf8\x20\xf4\xc1\x81\x7f\xfe\x0b\x56\x23\xff\xc9\x6d\xff\x27\xd7\xd4\xf8\x7f\xfc\xbc\xd4\x0c\x1a\x0c\x1f\x95\xab\x6f\x81\x67\x18\xc3\x7a\xa8\x5e\x23\xa4\xdd\x53\xbd\xfa\x4f\xe7\xd0\x1e\xc7\x9c\xb7\x86\x3f\xfa\xd7\xd7\xfd\x4b\x1d\xa2\x59\x31\x6c\x0b\x7b\x28\x87\x08\x55\xbb\x8a\x19\x42\xc4\x48\xdf\x48\x99\xac\xa9\xc6\x66\xca\x8a\x6d\xd9\x03\x56\x32\xe3\x62\x1b\xe6\x3f\xae\x54\x3f\xe1\x9a\x9c\xb9\x26\x26\x21\xc2\x1b\x45\x76\x73\x99\x96\x59\x19\xe4\xd0\x6d\x77\x3b\xbe\x0f\xe2\x10\xbd\xab\xf8\xd6\x8e\xea\x5d\xc5\x94\xb1\xb7\x70\x7f\xa3\x80\xe6\x13\x6a\x64\x84\x4f\xa3\x14\xf9\x9f\xff\x34\xba\xd5\x70\x8c\x04\x41\x58\x47\xef\xf4\x23\xdb\x96\x19\x55\xcd\x9a\xfa\xbe\xe7\x3e\xd6\x9b\x03\xe2\xf4\x60\x14\x4d\xcc\x08\xdb\xa8\x9a\x20\x60\xc5\xba\x74\xd5\x3a\xca\xe7\xab\xff\xf2\xe2\xc9\xe7\xe8\xf0\x21\x1f\x2c\x92\xd8\xbb\xc3\xea\x1b\xb7\xc4\xf6\x06\xa9\xc3\x4e\x37\x76\x70\x8b\x5c\x37\x9a\x84\x73\x2f\xcc\x74\x20\x88\x00\xd0\x2b\x0b\x5d\xf6\x10\x1c\x31\xa1\x85\x29\x15\x23\x5b\x25\xcb\x02\xfb\x2d\xd1\x3d\xe5\x99\xd5\x0d\xda\x00\xfc\xc3\xcb\x27\x83\x4f\xb3\x82\x8e\x34\x99\xea\x88\xd1\xee\x0b\xe2\xba\x09\xad\x99\xb9\x67\x0c\x5a\x21\x5b\x5d\x45\x40\xc3\x71\xbc\x0b\xc1\x7d\x22\x8d\xf6\x7d\x98\xd2\xc6\xbe\xfe\xfb\x59\xe8\x6e\xc4\xed\x0b\xe6\x1f\xee\xcc\xd3\xbb\xb5\xdb\xa3\x4b\xac\xbd\x74\xed\xba\xce\x58\x21\x9b\xb0\x07\xae\x7b\xdb\x66\x74\xf6\xa6\xa1\x15\x0d\x57\xa0\x72\xb8\x56\x69\x2d\x20\x95\xba\xd2\x42\x7c\x9b\xf7\xf0\x7d\xaa\x4e\x0b\x9a\xc5\xb8\x4b\x55\x21\x6f\x7b\xa0\x1e\x2c\x0c\x8e\xed\x85\x21\x87\xf4\x0b\x72\xc7\x58\x81\x8d\x77\x52\x25\x0b\xdf\x3e\x3f\x74\x32\xa3\x5d\xa0\xa2\x45\xe2\xb1\x4e\x50\xa4\xd2\xc3\xe0\x88\xa3\x4f\x18\xde\x86\xa6\x39\x15\x25\x53\x4c\x97\x99\xa9\x5a\x82\xd9\x43\xb2\x42\x86\x61\x61\x70\x41\x0a\x9c\x83\x95\x83\x0d\x08\x10\x40\xec\x44\x6a\x0f\xe9\xe0\xa2\x82\x9a\xef\x8c\x18\x3a\x81\x3a\x84\x29\xc0\xd3\x6e\x46\x64\x9c\x79\x3f\xe4\x7f\x91\xec\x47\xe8\xad\xfe\x99\xbb\x04\xb9\x59\x3a\x0b\x8e\xef\x0c\xf4\x93\x1b\xe2\x0b\xe9\x10\xe4\x56\xd3\xb9\x7c\x03\xed\x6a\x7c\x2b\x24\x8d\x30\x29\x32\x89\xb8\x4a\x9b\x20\xc4\xbf\x5b\x26\x79\xbc\x8c\x50\xa3\x94\x61\x89\xa4\x6a\x00\x1f\x5c\xe4\x1b\x10\xc0\x1b\xdd\xe2\xab\x88\x3f\xec\x61\x04\x9d\x5f\xec\x5a\x5d\xbf\x9a\x6b\x99\x4e\x6b\x53\x04\x23\xf4\x11\x8c\xcf\xd3\xac\xed\xec\x1d\x2e\x19\xff\xb8\x66\xed\x18\xda\x66\xe8\x65\x5e\x94\xa6\xb1\xf1\xde\x99\x5d\x87\xa4\xc9\x56\x92\xb6\x62\x90\x53\x41\xb7\x6c\xe9\xa6\x5c\x56\x53\x2e\x2b\x43\xdd\xf9\x70\xbb\xf9\x01\xda\xe1\x8f\xe9\x17\x84\xec\x47\x8f\x19\x47\xb0\x75\x71\xb0\x53\x61\xeb\xa9\x1b\x74\x6d\xac\xc6\xe6\x9a\xc8\xdc\xb2\x03\x97\x20\x5b\x1b\x33\x21\x59\xda\x37\x62\xeb\xdf\x8d\x24\xee\xf4\x41\x30\xa4\xc0\x1d\xd8\x83\xbd\xaa\xdc\x64\x87\x66\xfe\x36\xd8\x9c\xee\xb9\x66\xae\xc9\x1e\xb7\x3a\x2a\x24\x6b\xdb\xcd\x2e\x43\x36\x1a\xa0\x23\x5f\x1c\x46\x04\xba\x10\x59\x59\xa8\x47\x8b\xec\xc4\xfc\x92\xd4\x2d\xaf\x49\x95\xf4\x8e\x66\x10\xac\x4d\xb9\xa8\x0b\x8f\x7b\x9a\xdd\x59\xa3\x15\x27\xbf\xfd\xd3\xee\x0c\x05\x19\x70\xa9\x80\xd8\x34\x24\xa7\xff\xfc\xff\xff\x66\xf9\xdf\xfe\x9f\xff\xdf\xff\xc7\xde\xd7\x36\x37\x8e\x5b\x6b\x7e\xbf\xbf\x02\xd5\xd9\x2a\xbb\x53\x96\xdc\x93\x3b\x95\x9b\xea\xcd\x66\xcb\x63\xf7\x4c\x5c\x99\xee\xf6\xb5\xdc\x33\x55\xbb\x77\xeb\x06\x22\x21\x09\x31\x49\x70\x08\xd0\x6e\x4d\xe5\xc7\x6f\xe1\x1c\x80\x04\x25\x12\x00\x25\xd9\xee\xce\x08\x5f\xa6\x47\x26\x41\xbc\x9e\xf7\xf3\x9c\xd3\x5c\xfe\x53\xfe\x33\xff\xe7\xea\x9f\xe9\x3f\x1f\xff\xb9\x7e\xfd\xf7\xad\x8e\x4f\x73\x9e\x65\x5c\xb2\x44\x14\xa9\x26\xe1\xf8\xdf\x9c\x17\xb5\x62\x92\xac\x44\x5d\x49\x92\xd2\xb5\x24\x8f\x8c\xdd\x4b\xb2\x66\xb4\x92\x63\xe8\xb9\x59\xa4\x19\xff\xd5\xcf\xfb\xde\x6f\x51\x92\x94\xcb\x7b\x82\xf9\x9e\xc0\xf6\xe6\x6b\x32\xcf\x44\x72\xbf\x45\x26\x87\xbf\x2e\x6a\xc5\x6e\x2a\xb6\xe0\x5b\x5a\xe3\x96\xbc\x0c\xcf\x92\x12\x1e\x76\xf7\xa9\x62\x4b\x2e\x15\xab\x24\xf9\xeb\xdd\xdd\x0d\x59\xd1\x22\xcd\xf4\xff\xf5\xc2\xc4\x5b\x98\x02\xb4\xb9\x9e\xe9\xeb\x82\xb2\xb1\xe5\xad\x9f\x6e\x7f\xc4\x3a\xc1\x98\xca\x85\xd5\x4c\xad\x2d\x48\x7f\x60\x9b\x1e\x09\xd8\x08\xb1\x00\x31\x0d\x2e\x73\x5b\x45\x92\x26\xaa\xa6\x59\xa7\x77\xcd\x87\x95\x66\xd5\xaa\xaa\xd9\x19\x99\xd7\xdb\x67\xc9\xe6\xd6\x42\x1a\x46\xf5\xe0\xf2\xa6\xba\x48\x99\x26\x0e\xb6\x98\x9d\xea\xac\xcb\x94\x7c\x2f\xf4\x29\xeb\xcf\x7d\xd2\x64\xa5\x96\x8c\x3c\x72\xb5\x22\x7f\xd7\x77\x36\x51\x19\xce\xf3\xef\xf1\x5b\x56\x67\xec\x83\xcd\xf3\x8d\x2a\x8b\xdd\x3c\xdd\x5b\x05\xbb\xdd\xc9\xdb\x3a\x63\xd2\x29\x87\xbd\x35\xfe\xeb\x05\xa9\x0b\x97\x94\x15\x19\xda\x59\xa5\x16\xcb\xda\xe4\x63\x2a\x37\x63\xb2\x90\x3a\xf4\x15\xfe\xe4\x85\x39\x0e\x5b\xc9\x2e\xc7\xea\xdb\xc7\xea\xdb\xc7\xea\xdb\xc7\xea\xdb\x5b\xc5\x80\x8f\xd5\xb7\x87\xdf\x8f\xb2\xba\x84\x6c\x2e\xc7\xea\xdb\x2d\xcf\x38\x56\xdf\xfe\xc2\xaa\x6f\x6b\xf9\x27\x4a\xec\xb9\xe8\x14\xc0\x31\xf6\x5d\xb4\x06\x6e\xca\x3c\x4a\x10\x14\xaa\x17\x3d\x47\x37\x13\x34\x85\x6b\x9c\x31\xa8\xa2\x0c\x23\x90\x26\x0e\xe3\x53\xa1\x78\x46\x4e\xd9\xe7\x24\xab\xf5\x53\xaf\x5d\xa9\xe7\xe3\xd0\x6d\x78\x78\x33\xfd\xc3\xb7\xd3\x37\x7d\xcf\xa2\x15\x29\xe7\x4b\x4d\x31\x00\x93\x2b\x63\x4b\x9a\xac\xe1\xab\x6d\x68\xea\xf6\x62\x2b\xb1\x31\x2d\x92\xd4\x52\x89\xdc\x31\xb0\x34\x72\xdf\x7c\x4d\x6e\x9d\x65\x9c\x92\xf7\xf4\x7e\xfb\xec\xca\x5a\xeb\x99\x8a\xa4\x82\x49\x52\x08\xab\x4f\xe9\x31\xa1\x4e\xa9\x8f\xae\xa9\x1f\xb5\x16\x35\x49\x05\x3c\xf5\x48\xf1\x08\xcf\xb7\x7b\x34\xd3\x3a\x8a\x7a\x47\x51\xef\x28\xea\x1d\x45\xbd\xa3\xa8\x77\x14\xf5\x8e\xa2\xde\x51\xd4\xf3\x89\x7a\x7e\x1f\xd2\xf9\x64\x02\x0f\x4d\x7f\x7f\x4e\x12\x91\xe7\xb4\x48\x27\x80\x49\x44\xab\x65\xdd\xcb\xd4\x7d\x5c\x0d\x24\xbc\xa0\x7c\xd1\x7c\x13\x1e\x1f\xfe\x72\x4f\x3f\x21\x96\xba\x10\xd5\x0f\x15\x4d\xd8\x0d\xab\xb8\x18\x0c\xae\xdc\x04\x07\x01\xab\x70\x63\x41\xb7\x41\x1a\x30\x3a\xd8\xe4\x8a\x49\x25\x2a\x96\x92\x93\x85\xa8\x86\xe3\x48\xa4\xa2\x8a\xb5\x40\xb2\x39\xe5\xe8\x10\x48\xf1\x2c\x80\x4f\x44\xf7\x29\xd1\x7e\x19\x11\xc8\x00\xdf\x43\x3c\xa8\x65\xc5\xa8\x82\xf0\x55\x5a\x90\xa5\x9e\x23\x29\x61\x92\x43\x04\x30\x48\xdd\x16\xa2\xfa\x58\x2b\xba\x64\x77\x22\x63\x15\x2d\x92\xc1\x38\xd1\x4d\x2b\x3a\x8e\x48\x09\xa2\xe0\x4d\x30\xde\xb6\x96\x4a\xe8\xd3\xf8\xf3\xf5\xba\xf9\xa8\x2b\x4e\x10\x16\x0e\xec\xcf\x70\x20\x76\x9d\x10\x08\x18\xe9\x15\xcb\xe8\xa0\x54\xd5\xbb\xf3\xad\x3f\xc0\xce\x0b\x40\xb5\x4c\xd0\x23\xf6\xea\x9b\x04\xb5\x67\x45\x09\x72\xa1\xff\x81\x2e\xa2\x41\x30\xae\x10\xba\xca\x0e\x17\x5d\x26\x15\x2d\xd9\x75\xa1\x58\xf5\xb0\x1d\x1d\xdd\x05\x43\x36\x0f\xb9\xc1\x48\x92\x25\xb5\xe2\x0f\xcc\xf4\x13\xef\xfe\xc0\xb0\x78\x3f\x89\xc1\x60\xeb\x0d\x2d\xa2\xf9\xb1\x18\xb6\x7f\x6f\xad\xcd\x96\x3d\xfc\xcc\xa8\xa3\xe8\xe9\x9a\x33\x54\x42\x59\x4a\x78\x61\x02\x12\x9c\x57\xfa\xdc\xdf\xa8\x9d\xd8\xc1\x68\xfa\xdb\xe9\xe1\x9c\xa9\xc4\x8d\x24\x35\xd3\x3d\xff\x33\xfe\x63\xa2\x47\xfc\x97\x48\x40\x67\xcf\xae\x0f\x71\x73\x48\x8e\xe1\x6a\x7d\x29\x0a\xc5\x3e\x6f\x11\xd6\xcd\x55\x76\x9f\x25\x2b\x91\xa5\x92\x94\x22\x9d\x64\xec\x01\xf4\x24\xfc\x3b\xa1\x4a\x55\x7c\x0e\x1e\x9f\x3e\x01\x59\x93\x62\x51\x38\x79\x28\x92\x29\xad\xb4\x4b\x43\xd8\xd2\x8d\x88\x0f\x1b\x8c\x76\x23\xd2\x8d\x21\x8c\x61\x1c\x0b\xf9\x43\x25\xea\xde\xf4\xe9\xce\x2c\x5f\x5d\xa0\x27\x98\x66\x44\xd6\xa5\xf5\xfb\x66\x18\xfe\x83\xfa\x90\x51\x81\x40\x30\xc8\xb2\x76\x22\xfd\x2c\x17\x62\x93\x4a\x91\x4e\xc9\x4c\xe4\x8c\x3c\x88\xac\xd6\x24\x60\x5d\xea\xe5\xc9\x32\xf1\x08\x93\xfc\x5b\x3d\x67\x19\x86\x9e\x18\xb8\x6f\x90\x12\x1e\x75\xb7\x2b\x5e\x0e\x89\x1d\x30\x1e\xdb\x25\x38\x8e\xf4\x2b\x60\x3d\x00\x38\x69\x91\xbe\x25\xff\x55\x90\x6f\x50\x3c\x10\x8f\x90\x69\xf3\xc3\xf5\x15\x98\x30\x7a\x3b\x9d\xe3\x97\xbf\x9f\xc1\x72\x91\x3f\x4c\x0d\xa6\xad\x5a\xf2\x94\xcc\xb9\xb2\x31\x32\xa7\x05\x7b\x84\x24\x1d\x49\x12\x60\x1c\xfa\x40\xf7\x0b\x79\xab\x66\xd6\x60\x38\x71\x07\x69\x3e\xf3\x9a\xfc\x3b\x7e\xa7\x64\x55\xce\xd1\xf9\x3b\xe7\x78\x5f\x7a\xfb\xfc\x78\x7b\x92\x22\x8f\xab\x1e\x27\xd5\xe3\x64\x32\x99\xe8\x79\xa2\xf7\x8b\x19\xed\xc1\xae\x29\x7c\x15\x8c\x23\x22\x35\x69\x07\xfd\xeb\x69\x57\x1b\x58\x72\x3b\x14\x74\x5c\x16\x6b\x33\x8b\xe9\xab\x9e\xb7\x43\x31\xc2\xfe\xd8\xe0\xaa\x2e\x2e\x22\xcf\xa7\x5e\x25\xbd\x81\x4a\xe8\xb7\x4c\x6e\x82\xaa\xd6\x98\x9d\x60\x82\x9f\xdb\xbb\x55\x56\x22\x61\x72\xc0\x7c\xf0\x49\x32\xa9\x7b\x01\xa6\xd4\xc4\x7c\x9a\x35\x9c\x92\xf7\x74\x4d\x68\x26\x8d\x3f\x12\x70\x1c\x36\x2f\x20\x21\xd7\x8b\xde\xae\xcd\xf3\x73\xa1\x56\x5b\x84\x43\xaf\xee\xf6\x65\x76\x34\xbe\xfe\x1e\xad\x53\xb3\x67\x1c\x10\x05\x2e\x49\x59\xb1\x84\xa5\xac\x48\x6c\x36\x49\x6b\x95\xe9\xe7\x95\x07\xd8\xb5\x0f\xa2\xb8\x15\x22\x2c\x92\x5e\x17\x29\x64\x0f\x3a\xc5\xdc\xdb\x5d\x02\x1d\x5a\x6f\x27\xd5\x1c\x4c\x6b\xd2\x95\x10\xfd\xba\x46\x2d\x59\x85\x1a\x36\xb8\xc6\xb7\xce\xb9\x49\x4e\xc4\x5b\xcc\x73\x2d\x28\x51\x65\x37\xb9\xff\x7e\x0a\xc2\x0a\x30\x24\x62\x54\x8c\x63\x4d\x34\x43\xfa\x74\x7d\x45\xde\x90\x53\x3d\xa6\xd7\xb0\x7b\x0b\xca\x21\x70\x13\x60\x34\x07\x2f\x7d\x3b\x3f\xbe\xb0\xdd\x4e\x9b\x3b\xaa\x35\xfe\x05\xcd\x24\x3b\x23\x85\x20\xb2\x4e\x56\x4e\x62\x65\x6f\x9f\x96\x7a\x34\x21\xde\xd1\x47\x54\xff\x6d\x88\x38\xef\x76\x44\xdb\xe3\x38\xd4\x6f\xe8\x88\x0e\x6b\x60\x43\x99\x5d\x70\xde\x3e\x49\xd6\x6b\x1a\xdb\x4e\x5e\x3a\x10\x91\x70\x03\x30\xf5\xe1\xeb\x5e\x44\x3c\x61\x39\x53\x14\xc2\x7f\x78\x27\xfc\x00\xf6\xa7\x5f\x0f\x8d\xdb\xb3\xa1\xfd\xe9\xef\x33\x7e\xcf\x7a\xbe\xd9\x7f\x8a\x5f\x82\xac\x48\xf6\x23\x2f\xea\xcf\x88\x7d\x1c\xb6\xa5\x83\x78\xf9\x0e\x5e\xc1\xd8\xf6\xcf\xc6\xb4\xef\xa6\x59\x75\xe5\x94\xfe\x8d\xde\x0c\x1d\xe9\x9e\x11\xcb\x26\xe0\x12\x6a\xb9\x05\x52\xa1\x29\xa9\x68\x91\x8a\xdc\x8e\xa0\xb7\x63\x3b\x2a\x00\xe8\xa4\xc9\xca\x59\x3c\xf2\x1b\x60\x32\x21\x8b\x02\x48\xcf\x51\xea\xe4\x8f\x20\x67\x73\xd9\xec\x37\x0a\xde\x68\xae\xdf\x14\x4d\x7d\x16\x58\xef\x78\x49\x94\x26\x2c\x86\x13\xd7\xbb\xe9\x3d\x22\x63\xa8\x98\xd9\x41\xeb\x57\x5f\x64\xcc\xf0\x40\xcc\x98\xef\xd6\xe5\xc6\x98\xf5\xab\x2f\x32\xe6\x7a\x80\xdc\x6f\x8d\x59\xf3\x85\xee\x98\x81\x58\x3f\xff\x98\xbd\x76\x65\x57\xa5\x02\x79\x37\x4c\xdf\x2e\x1a\x8d\xde\x66\x60\xb4\x64\x4d\x5f\xe6\x05\xaf\xa4\xb2\x2c\x0c\xd8\xdd\x80\x1e\xd2\x25\x3d\x67\xa0\x98\x19\x4b\x75\x83\xab\x60\xff\x7a\xa2\xef\x39\xcf\x69\xb5\xd6\xc2\xf6\x30\x05\xea\x10\xcc\x42\xd8\x21\x5a\x49\x05\x13\x0c\xc0\x80\xbc\xf6\x2f\xac\xc7\x95\x10\x4e\x3f\x0c\x25\x1e\xfa\x6c\xf9\x72\x2d\x13\xd5\x6f\xc7\xef\x6a\xff\xf8\x1c\x68\xfd\x8e\x95\xa5\xb1\xa8\xa4\xb6\x27\x8c\x73\xed\xf3\xd2\x13\x23\x17\x82\x32\x7c\x23\x52\x63\xa5\xac\x0b\x7d\x2a\x44\xa5\x9c\x3e\x4e\x8d\x02\xbb\xc5\x7f\x5e\xf7\xf6\x9a\xf3\xe5\x4a\x35\x52\x69\x46\xeb\xa2\xdf\x6d\x13\xeb\xfa\xc5\xc9\x36\x45\xb0\x28\xb9\x67\x55\xc1\xb2\x16\xd2\xbf\x89\xd2\xec\x97\x1b\xc2\x7e\xd9\x11\x35\x65\x6c\x42\x0d\xb5\xdd\x1a\x24\xb4\x10\xca\x4b\xd8\xa5\x18\x39\x80\x9f\x6c\xca\xcd\x01\x47\x10\x72\x6a\xe9\xf5\x19\xf8\xd3\x30\xf7\xde\xc3\xa5\xf5\xc8\x8b\x54\x3c\xca\x31\x42\xd7\xcf\xf8\x8a\x95\x19\x92\xc6\x8e\x75\x08\xc1\x0b\x61\x28\xf0\x86\x80\x05\xc9\x25\x4d\x31\xa2\xab\x25\x41\x10\xb6\x1b\x10\xa7\x87\x84\xa5\x61\x73\x4e\x50\x9c\x8e\x52\x77\x42\xd7\x64\x99\x4b\x7a\x59\xe9\xf7\x15\xa7\xd9\xac\x64\x49\x14\x2b\xfc\xe1\xfd\xec\xa2\xfb\x1a\xe4\x11\xae\x58\x85\x5a\xb1\xfe\x3b\xa1\xa9\xb1\xee\x0c\x9e\xe1\x47\x36\x5f\x09\x71\x4f\x4e\x6d\x06\xc7\x92\xab\x55\x3d\x9f\x26\x22\x77\x92\x39\x26\x92\x2f\xe5\xb9\x39\x3e\x13\x3d\xe2\x7e\x12\x45\x40\x2b\xcc\x9a\xa2\x7a\x26\x0d\x55\x5a\x6d\x0c\x06\x95\x34\xa3\x86\xc5\x85\x5b\x90\x92\xb9\x27\xed\xd2\xbc\xd9\x9d\x2e\x50\x0c\xf0\x3a\x1a\x93\x6a\xe3\x81\xa4\x59\xb9\xa2\x68\xaf\xf5\x38\x1b\xe0\x51\xf0\x28\xad\x44\x01\x6e\xa9\xf9\xda\x04\xdb\x1b\xf3\x05\x2b\x10\x1c\xa9\xbd\x06\x7a\x14\x83\x5d\x9a\x8a\x86\x64\x91\xd1\x41\x74\x81\x20\xc9\xd8\x3e\x0d\x3e\xe4\x91\xc0\x89\x80\x25\xb2\x65\x45\x1c\xe8\x1b\xef\x34\x36\xb7\x07\x35\x62\xcf\x1a\xbb\x6b\x39\xd8\xeb\xb8\x35\x3e\xcc\x5a\x36\xa6\x84\xe8\x25\x04\x93\x82\x79\x41\xdf\x77\x4b\xfd\x86\x4c\x0c\xde\x23\xbb\x6d\x7a\xd8\xca\xf3\x1c\x30\x35\x0c\x76\xeb\x33\x41\x6c\x2a\x98\x61\x4f\x42\xdb\x76\xa3\x9c\x5e\x09\x7b\x17\xea\x09\x67\x6c\xf8\x7e\xd9\xb3\x37\x67\xca\x3d\x7a\x39\x5d\x03\xa8\x10\x62\x99\x19\x8b\xb9\x73\xa0\x6e\xdd\x63\xf0\x94\xb7\x77\x27\x8f\x23\x56\xce\xbb\x48\x12\x51\x17\x2a\x98\x77\x3c\xdb\x7a\xbc\xef\x7e\x77\x9f\xea\x2b\x64\x53\x63\xda\x9f\x3d\xd4\x01\xf7\x9e\xc7\x6f\x09\x1f\x7a\x8f\x65\xff\x0e\x99\x0d\x34\xeb\xf4\x1c\x48\x06\x2a\x78\x66\x92\x80\x92\x15\x4b\xee\x89\x78\x2c\x5a\x99\xfd\x18\xe3\x79\x8c\xf1\x3c\xc6\x78\x1e\x63\x3c\x8f\x31\x9e\xc7\x18\xcf\xcd\xbf\x1d\x63\x3c\xbb\xed\x37\x1c\xe3\xd9\x15\x65\xa2\x24\x98\xae\x8c\xd2\x2b\xc6\x18\x60\xdd\x56\x7c\x21\xbf\xbf\xd2\xe4\x3d\xa1\x8a\xa5\x6f\x7f\xbf\x35\x76\xbe\x20\x05\xe3\x06\x60\x93\x4b\x52\x88\x8a\x94\x22\xdd\x18\x15\xcc\xde\xb1\xa5\xf8\xcb\xd5\x73\x49\xea\x02\x63\xe9\x8e\x09\x2f\x47\x61\xe8\x28\x0c\x1d\x85\xa1\xa3\x30\x74\x14\x86\x8e\xc2\xd0\x51\x18\x1a\x14\x86\x56\x5b\x45\x41\xbb\x92\xcf\x5f\x2f\xb6\x41\x87\x6d\x18\x1c\x04\x4b\xa1\x2c\x84\x80\x6e\x0e\x0a\x6b\x6f\xba\x70\x17\xf1\xee\x01\x31\xcf\xff\x3e\x25\x33\x9e\xf3\x8c\x82\x1b\x92\x12\x45\x97\x80\x91\x83\x06\xae\xbf\x5e\x38\xa8\x56\x5b\x7d\xe2\x67\x25\xa2\x5a\xe5\xb5\x02\x13\xf3\xc6\x08\xa7\xc4\x80\xab\xc3\x76\xdc\xd1\x25\xac\x22\x5f\x82\x99\xba\x4f\x2e\xd3\xdf\xc4\xb0\xe0\x78\xf3\x98\x12\x15\x5d\x06\x2c\x7a\xf8\x4c\x63\x6b\x97\x06\x67\x7d\x25\x1e\xed\xfb\x6d\x5c\xfe\x58\x78\x1a\x20\x9d\x57\x3c\x1c\x4b\x77\xf2\xce\x3c\xf9\x13\x44\xff\xce\x10\x92\x14\x37\xd1\x42\x3a\x45\x14\x5f\x98\x29\xaa\xd8\xa2\xce\x66\x4c\x21\x3b\x72\x84\x54\xe8\x86\x17\x88\xe1\xda\x0d\x36\xbe\xcc\x28\xcf\xef\x58\x5e\x6a\x39\xa9\x9f\x30\x8f\xc4\x1a\x33\x2b\x77\x8e\xfd\xcb\xf3\xdf\xc1\x4a\xa4\xbc\x37\xed\x28\x24\x6f\xe5\x2c\xe5\x75\x1e\x07\x26\xfe\x33\x88\x56\xeb\x92\x21\x7b\xc6\xfd\xc3\x0e\x88\x5c\x89\x3a\x4b\xc9\x9c\x26\xf7\x28\xdd\xa7\xbc\x02\xf1\xcb\x53\x0c\xe1\xce\xc9\x0d\xd0\xb4\xe6\x95\x49\xd5\xc8\x19\x2d\x6c\xb4\x22\xda\x7f\x45\xca\x4e\x4e\x9a\xc4\x02\xf3\x4d\x0f\xfc\xb7\x61\xf0\x9a\x08\x76\x60\x20\x4d\x07\xaf\x35\xef\x7e\xcf\x72\x3d\xba\x3d\x57\xdf\xbb\xf8\x24\x86\xa1\x4a\xfe\x2b\x03\x5c\xbb\xb8\x4d\xb8\x13\x8a\x66\x4e\x3e\x52\x26\x12\x9a\x35\xbb\x61\x39\xaf\x89\x6c\xf3\x78\x1c\xec\xa5\xb0\x31\xf1\x98\x25\xc0\x7f\x65\x88\xe9\x88\x7e\x30\x29\x50\x7a\x4e\x80\xca\xe8\x3e\x73\x58\x35\x8f\x13\x07\x76\x06\x3a\xb3\xa8\x8c\xb5\xd4\x23\x13\x85\x79\xd7\x9e\x98\x66\x00\x8f\xfa\xe4\x0c\xf6\x68\xd2\x19\x2c\x0c\x21\xd2\x52\x9b\x97\x04\xf4\xd2\xae\x9f\xe3\x90\x59\xb1\x81\xb4\x03\x62\xdc\xa3\xa0\x20\xd4\x39\xf0\x41\x1c\x95\xc1\xc2\x84\x0c\x33\xd7\xe3\xef\xa4\x7f\xdc\x79\x24\x44\xe7\x1c\x17\x3c\xeb\x1e\x64\xab\x91\x34\x0b\x5b\x17\x06\x81\x10\x4f\xdf\xb0\xb4\xd6\x9c\xca\xfe\x43\x59\x4b\x56\x4d\x96\x35\x4f\x0f\x76\x1c\xbd\x22\x56\x0f\x41\x8b\x08\xfe\xba\xf9\xe9\xb2\x61\x00\x83\x14\xb7\x4b\x5d\x77\xa0\x63\x6d\x41\x91\xb8\x6b\x74\x71\x73\x6d\x79\xa4\x0d\x12\x02\x56\x8d\xbf\xb1\x94\xc8\x64\xc5\x72\x8a\x5e\x27\xcf\x35\x6a\x74\x38\x6a\xab\x15\x68\x15\x19\xd6\x6f\x0a\x46\x14\x7d\x84\x0c\x71\x4c\x44\xf1\xc0\x2a\xad\x33\x27\x62\x59\xf0\x5f\x3d\x59\x9d\xf8\xf5\xc6\x97\x8a\xe5\x09\x20\x40\x0c\xb0\x71\xe1\x16\x9c\x35\x1e\xc2\x8a\x01\xf2\x5b\x5d\x44\xf4\x6c\xf5\xa9\x1e\xb2\xb7\xe4\x6a\x7a\xff\x27\x38\x5e\x89\xc8\xf3\xba\xe0\x6a\xad\x09\x1f\x26\x83\x89\x4a\x9e\xa7\xec\x81\x65\xe7\x92\x2f\x27\xb4\x4a\x56\x5c\xb1\x44\xd5\x15\x3b\xa7\x25\x9f\xc0\xe4\x0a\x04\x65\xce\xd3\xdf\x35\x80\x28\x3b\xd3\xc5\x7b\x5e\xc4\x65\xe7\x9e\xfc\x8d\xa3\x93\x9e\x76\x74\xc6\x76\x6b\x2c\x2c\xf8\xed\xbb\xd9\x5d\x83\xd4\x32\xac\xdc\x68\xee\x65\xb0\xf4\x5a\x0d\xbd\xdd\x4c\xbd\xe0\xbc\x58\x58\x2b\x16\xa0\x98\xbb\x05\x46\x3c\x1d\x37\xf5\x91\x64\x3d\x07\x6a\xe3\xd4\xdf\x9f\x92\x4b\x5a\x14\x02\xf8\x56\x5d\xa6\x80\xe0\xa2\xf5\xd8\x4b\x9a\xb3\xec\x92\x4a\x0f\x54\xf5\x13\x6f\x25\x64\xba\x4d\xf4\x76\xec\xbe\x99\xd6\xb9\x1f\xb5\xa1\xef\xf2\x39\x4b\x53\x96\xbe\xb7\x11\x01\x8d\xfe\xd0\xc4\x08\x54\x2c\x63\x0f\xb4\xdf\xff\x6b\x1b\x2d\x9a\x9e\x6e\xcd\xa6\x0f\xad\x61\x54\xb1\x0e\xbd\x3b\x74\x30\xba\xac\x79\x2c\x5a\x95\xb4\x2d\x12\xc4\x7d\x83\x7e\xb5\xa3\x31\x86\x93\xba\x90\x50\xf2\x16\xd0\xea\xb5\x12\x87\xb7\x20\xa7\xfd\xb9\x87\xb6\x99\xb4\x75\x08\x2c\xa0\xcd\xed\x40\xa6\x65\xa2\x0f\x24\x53\x9a\x62\x37\x20\xe0\x4a\x88\xcc\x5f\xff\x09\x32\x8b\xf4\xa9\xc4\xd4\x78\x55\x71\xf6\xc0\x08\xad\xe6\x5c\x55\x14\x44\x00\xdc\x47\xe0\xa9\x6b\xd0\x4e\x8a\x81\x74\x29\xdb\x7e\xa9\x59\xb5\x06\x31\x44\xf7\x69\xc5\x4d\xc0\x04\x85\xa0\x1b\x03\x03\x8e\x19\x82\x50\xd3\x06\x8b\x56\xf9\x11\xe2\x37\xae\x4e\x90\xcd\x3a\x87\x20\x5c\x2c\x22\x50\xca\x2f\x0b\x96\x53\x78\xa6\xb3\xf4\x1e\xcd\x12\x86\x78\xde\xb3\xb5\x74\xcc\xb8\xc6\x52\x4c\x8b\x3e\xac\x29\xb7\x59\x50\x78\x51\x2d\xa9\x66\x41\xd0\x47\x42\x15\x5b\x8a\x4a\xff\xef\xa9\x4c\x44\x69\x76\x0f\x4c\xb3\xaf\x23\xb7\x88\xae\x0d\x28\x96\xb5\xe8\x4a\xac\x9e\x04\x72\x29\x70\x5d\x20\x6c\x22\x03\x44\x5c\xec\x1f\x9c\x17\x07\xde\x7b\xdc\xaf\xbd\xb7\x3d\x54\xd7\xad\xa7\xaa\x9b\x35\x58\xd6\x05\xff\xa5\x66\x6d\x48\x69\x1b\x07\x42\xae\xfd\x17\xb2\xd1\x0b\xe0\x92\x40\xbe\x2f\xa0\xac\x59\x2e\x7d\x46\x68\xa6\x56\xa2\x5e\xae\x88\x14\x79\x08\xdb\xdb\xb6\x1c\x22\xb3\x32\xf1\x48\xa8\xe5\x6c\x4a\x58\xa6\x06\xfc\x6e\xc9\x0a\x56\xb9\xa2\x11\x2d\x35\xad\xad\x38\x55\xfe\xd3\x04\x21\x3f\xb4\x56\x22\xa7\x8a\x27\x34\xcb\xd6\x53\x62\x43\x82\x30\xb0\x9f\x67\x6b\x10\x88\x8a\xd4\xa8\x3b\x38\xab\x40\x5d\x0e\x9e\xb2\xbc\x14\x0a\xb2\x7f\xe0\x80\xba\xee\x25\x14\x05\x39\x56\x9f\xd8\x66\xc7\x07\x3d\x4d\x1c\x02\x11\x17\x9c\x55\x12\x0b\xea\xed\x59\x7c\x26\x78\xf6\x64\x6c\xf4\xed\x09\x04\xdc\xba\x52\x71\xca\x24\x1c\x9e\x64\x45\xa1\x4c\x51\xc5\xa5\xe2\x09\x2a\x4b\xc3\x82\x26\x66\x8c\x9b\xd3\x80\x42\x3f\x28\x52\x7a\x5b\x57\x00\x88\xb7\x9b\xe6\x5d\x6a\x19\x5d\x2a\x56\xa8\x89\xd5\x7a\xda\x9f\xf0\x97\x44\xeb\x28\x7b\x96\xe6\x4a\x98\x94\xef\x45\xea\xa7\xb8\x1b\x4c\xb9\x7d\xa9\x95\x59\xdc\x05\xc4\x5e\x35\x93\x0a\xdc\x2c\x27\xe5\xde\xb0\xba\x15\x7d\x18\x0f\x4b\xef\x59\x32\x1c\xca\x04\x86\x32\xf1\x56\x3e\x7a\xde\x3a\x34\x5a\x2c\x40\x13\xdd\x88\x42\x43\x4d\xf4\xae\xa1\x73\xb8\xea\xc6\xde\x57\xd0\x52\xae\x84\xba\x6a\x3a\xf6\x4e\x05\x82\x7f\x9b\x88\xc9\x25\x24\x62\x83\xe2\x8a\xd1\xbc\x29\x52\x8d\xba\xaa\x58\xa1\xb2\xf5\xc6\x37\xfc\xa4\x07\x47\x05\x36\xf0\x36\x61\x06\xc4\x59\x23\x9d\x5a\x27\x57\x59\x89\x07\x0e\x7a\xa8\xcf\xcf\x45\x80\x2b\x9b\x9e\x36\x06\xe2\x76\x0b\x95\x15\x20\x9b\x00\x71\x1e\xfc\xd3\x27\x05\x7b\xb4\x47\x0f\xaa\x15\xe9\x8e\x6c\x2e\x42\x83\x72\x64\x2d\xdb\xe6\x39\xff\xc4\x1b\xf4\x16\xc5\xf3\xde\x49\xb6\xf9\xea\xfd\xb3\xf1\xf6\xde\x99\xa9\x0b\x53\x61\xa8\xb7\x05\xb7\xb0\x66\x9f\x05\xe5\x59\xed\x31\xba\x10\x27\xf7\xa2\x62\x66\x97\x28\x88\xd8\xec\x01\x6a\xaa\x5e\xa3\xe1\x69\x51\xeb\x23\x72\x46\x1e\x19\x29\x33\x5a\xf8\x54\x11\x62\x32\xe7\xf4\xd4\x72\x7d\x85\x9d\x41\x5b\x24\x11\x33\xbc\x39\x5b\xd1\x07\x2e\xaa\x50\x4d\x46\x82\x84\xac\x59\x42\xcd\x8b\x11\x78\xc4\xc7\xa7\x62\x4b\xbf\xd3\x92\x0f\xa2\x59\xb8\xad\x6b\xeb\xb9\xb9\x46\xcc\x11\x73\xd2\x11\x71\xa5\xad\x84\x15\x51\xc5\x8c\x80\xc5\x0f\x45\x13\x80\xfe\x4f\x4c\xf2\x8b\xdb\x37\x1c\x94\x4e\xb6\x4d\xb0\xcf\xd6\x34\x08\xc6\x02\x2b\x50\x19\x6f\x5a\xa2\xb7\xe4\xe2\xe6\x1a\x47\x0c\xf5\x05\x82\x3d\xd2\x62\x6d\x4a\xdb\xaa\x15\xaf\xd2\x49\x49\x21\xab\x4a\xef\xe5\x59\x67\xb4\x4d\x21\x94\x40\x97\xd1\xa5\xd4\x7d\x86\x11\xdb\x3a\xfb\x62\xed\x23\x50\x9c\xd5\x98\xef\x1b\x45\x6f\x73\xb5\x0f\x35\xca\x98\xc2\xfa\xdb\x59\x72\x1b\x01\xdf\x4f\x3c\xca\x98\xca\xed\x13\x58\x6f\xef\x03\x83\xa9\x6e\xee\x60\x02\x5a\xc1\x60\x39\x27\xb7\x6d\x16\xec\x69\x8b\x3a\x35\x81\x24\xae\xad\x3c\x4e\x88\x7f\x7a\x51\x23\x68\x0b\x24\x23\x28\xd3\x70\xc5\x29\xb7\x8d\xd7\x9c\xc9\x98\xc3\xbd\x5b\x55\xaa\xe0\xf7\xb7\x2a\x2b\xbd\x6c\x85\xaa\xed\xa5\x09\x1c\x62\x12\xa8\x5c\xe5\xb6\x67\xde\xa1\xa8\xea\x56\xc1\xcf\xf7\x55\xbf\x0a\x56\xba\x0a\xf6\xea\xab\x84\xd5\x5b\xf5\x2a\xd8\xe3\xc1\xab\x62\xb9\xed\x05\x2b\x64\xb9\x2d\xf2\x44\x46\x3d\x26\x07\x42\x62\xdd\xd6\x1b\x69\x09\x56\x49\x22\x1e\x98\xf5\xa3\xc2\x86\x25\xa2\x90\x3c\x65\xd5\x60\x12\xbd\x6d\x73\x0e\xb0\x91\x87\x90\xd8\x62\x22\x5a\x07\xa7\x33\x26\xba\x35\x78\x3e\x3a\xd1\xaf\x23\x23\x5d\xdd\x16\xa1\x77\x6e\x4d\x24\x3e\x02\x36\xd8\x2f\xe9\xc6\xc8\xc6\x44\xc3\x46\xf4\x39\x36\x5e\xd6\x6d\xb1\x47\x01\x9b\x37\x8e\xd6\x6d\x3b\xc4\xd4\x46\xf5\x4b\x1c\xc0\x92\xf0\xe4\xc8\x38\xea\x4e\xa2\xe2\x6e\xdd\xb6\x53\x0c\x6e\xe4\x44\x21\x8a\x2b\x2e\x1e\x37\xb2\xc7\xad\xa8\xdd\xc8\xd8\xdc\xce\xa8\xc6\x2d\x67\x28\x66\xd7\x6d\xa3\xe3\x77\x23\xa7\xbd\x11\xe5\x1b\x8c\xe5\x8d\xec\x76\x30\xe2\xb7\x27\xae\x37\xb2\xcb\xb8\xe8\xdf\x36\xc6\x37\xb2\xdb\xc3\x45\x02\xbb\x2d\x10\x15\xec\xb6\x48\xaa\x8b\x6d\xe4\x09\x8b\xb3\x00\xda\x16\xa3\x9d\x61\x1b\x8e\x28\xee\x3e\x15\x11\x3c\xee\x0e\x33\x42\xda\x8d\x9f\x51\x20\x02\xd9\x6d\xcf\x2b\x1a\xc7\x47\x29\x07\x87\x60\xa3\x98\x47\x47\x2c\x87\x27\xe7\x46\x34\x47\x45\x2f\x07\xbb\x1c\x8c\x6e\xf6\x44\x32\x47\x68\x70\x51\x91\xce\xf1\x42\xd0\x41\xa5\x5c\x54\xd1\x2f\x33\x2a\xa5\x0f\x36\x82\xf4\x7b\x21\x6d\x02\xbe\xd3\x4b\xeb\x57\xb4\x70\x4f\x19\xe5\x9e\xc0\x4c\xb2\x7b\xb4\x6b\x8f\x5d\x21\xd1\x43\xf0\xfb\x2e\xa2\x2e\x05\xf6\xf7\x5e\xa4\xf1\x2b\xd2\xbe\xd2\x38\xca\x1e\xdd\xe8\x58\x63\x50\x71\xcc\x7f\x7e\x3d\xc0\x5d\xbd\x16\xae\xe9\x7b\x9e\x31\xb9\x96\x8a\xe5\xba\x27\xad\xae\x71\xeb\xc2\x0d\x85\x4b\xf0\x22\xc9\xea\x14\xa3\x92\xa1\x5b\x50\x04\xdb\xca\x03\x14\x90\x26\xac\x9f\x63\xcf\x32\xf8\x76\x09\x47\x1d\xaa\x9f\x9a\x57\xac\xc0\x69\xb4\xa1\xd6\xcc\x17\x42\xba\xd3\xed\xa6\x39\x17\xd8\x21\x84\x20\x63\xc4\x17\x97\xe1\xf3\x78\x10\xcf\xaa\xa2\xaa\x1e\xa4\xd0\x1b\xbe\x55\x78\x76\xd3\x62\x67\xfc\x49\x70\x2d\xaa\x1c\x55\x64\xec\x75\x70\xe8\x88\xe6\xd5\x4c\xde\x9e\x38\x73\x84\x6e\x19\x4d\x27\x9a\x06\xfd\x96\xbc\xac\xa6\x0e\xf1\x2e\x4e\xd6\xf6\xd0\x30\x08\x58\x5d\xd1\xfe\x10\xc9\x7f\x31\x67\x6b\x42\x4b\x9a\x70\xe5\x55\x14\x9f\x27\x08\xe9\xb6\x7b\x21\xcc\x56\xb6\x46\x36\xc3\x7c\xa0\x32\x74\xb6\x0e\x89\x38\x26\xa6\x7d\x5f\x86\x99\x88\x02\xe7\x1e\x7f\x3a\x2f\xcd\x4d\xbe\xb4\xaf\xea\x91\x0f\x5d\x53\xef\x1c\x00\x54\xce\xce\xb6\xa7\x0b\x00\x0b\x32\x41\x3c\xfc\x57\x06\xc2\x8a\x3f\xf6\x45\x2f\x60\x3b\x2e\xeb\xe3\x94\x58\xb4\xe0\xe4\x16\xba\x99\x29\x5a\x29\x96\x9e\xf8\xc6\x16\x71\x46\x3b\x6b\xb2\x49\xa2\x21\x82\xbc\x1d\x08\xde\xe1\x4c\x92\x94\xc1\x7f\x43\xd2\xf1\x5c\xd4\xaa\xad\x07\x53\x3e\x24\x21\x1f\x69\xa4\x08\x9d\x51\xa9\x6e\x2a\x31\x67\x77\x3c\xec\xba\xda\x04\xf6\xa5\x52\x61\x69\x98\x47\xf0\x6c\xcf\x71\x3f\xda\x13\x14\x16\x9e\x2d\x4a\x68\x4a\x15\x9b\x0c\x62\xbd\xbb\x6d\x84\xc4\xaf\xe7\x76\x57\xd1\x42\xc2\x60\xf6\x9a\x60\x67\x5a\x44\x35\x9d\x46\x58\x8e\x09\x46\x4b\x8b\x82\x19\x9e\x89\x72\x3d\xd8\xa5\x5f\x78\x81\x72\x26\x65\x4f\x3a\xdb\x76\xeb\xac\xca\x5f\xeb\x9c\x16\x93\x8a\xd1\x14\x22\x53\x4d\x27\x84\x63\xa9\x00\x7d\x39\xe3\xce\x34\x69\xce\x75\x06\xeb\xdc\x2c\x6a\x78\x55\x46\xcc\xb1\x62\x54\x0e\xe7\x47\x0c\x4c\xf1\x13\xc4\x1c\x9e\xa1\x38\xd5\x86\xdd\x52\xfd\xef\x4a\x9d\x91\x9c\x26\x2b\x5e\xc4\x18\x22\x80\x9a\x49\x45\x0b\x5c\x2c\x63\x1f\x02\xdb\xe2\x92\x3f\x18\x9b\x28\x8e\x31\x68\x38\xc7\xd6\x1c\xc3\x13\xb9\xb5\x70\x9a\x7e\x72\x65\x22\x38\x24\x79\xd5\x21\x6f\x7d\x05\x40\x36\x1b\x46\x40\x9b\x0c\x1e\x16\x47\x8b\xa3\x0c\xc0\x40\xad\x0f\xba\xb1\x7e\x01\x74\xa7\x2e\x7d\x50\xdb\x6d\x1b\x41\xe6\x0d\x24\x77\xcc\x45\xc0\x32\x12\x6d\xda\xac\xbf\xe3\xa9\xee\xf9\x70\x53\x8f\xb3\x3a\x4d\x48\x40\x3c\xc7\x87\x54\x68\x68\xa3\xd4\x7b\xbf\x2c\x57\xae\xa8\x8c\xd7\xbe\x6e\xf4\xd3\x43\x6a\x08\x74\x35\xb8\xf2\x4f\xab\x4e\xed\x92\xd2\xad\xe8\xd2\x9b\x87\x7c\x47\x97\xcf\x90\xd2\x6d\xf3\xc9\xb4\x82\x8d\xa9\xd6\x84\x2f\xe0\xdb\x23\x53\xab\xd5\x8a\x16\xc2\x5f\x30\xed\xd5\x1d\x3c\xb3\x11\xbe\x0c\xd1\x02\xed\x8f\x68\x7e\xaf\xb8\xa8\x25\xa1\x5a\xfd\xef\x99\x0f\xa8\x91\xce\xc2\x20\x80\x29\x26\x3d\x9a\x6f\xb0\xe2\x81\x57\xa2\xc8\x21\xf6\xed\xbf\x0a\x34\x21\x48\x96\x28\x9c\xec\x56\x97\xec\x73\xc9\x2a\x8e\x10\xf1\xe0\xcb\x6e\x43\xd3\x88\xe4\xcb\x82\x2f\x78\x42\x21\x78\xf2\x91\xab\x95\x66\x7a\xa9\x81\x0d\xd2\x1d\x16\x42\xf1\x9e\x20\x31\x3d\xa0\x62\x0d\x79\x3f\x54\xb2\x76\x1c\x5c\x76\xbe\xd7\xa4\xc4\xf5\x7d\x6f\xab\x53\xfb\x7d\xad\xfd\x3d\xd2\x2a\x05\xe7\x3e\x55\x7c\xce\x33\xae\xd6\x9b\xdf\xdc\x64\x1a\x3e\xc9\x72\x4e\x25\xbb\xce\x07\x04\x8a\x8d\xe0\x55\x58\x64\xfd\x82\x39\x8b\x7c\xd1\x04\x96\xd1\xc2\x06\x02\x0c\xa3\x1f\x0c\x5c\xb6\x65\x55\x26\x98\xb2\x76\x97\x49\x2c\x69\x1e\xce\x94\xff\xe1\xf6\xe6\xd2\xbc\xf4\xe3\x0c\x5f\x6a\x6b\x50\x9a\xa0\xbe\xdb\x9b\x4b\x7b\x4a\xb4\x34\xd7\x7b\xcb\x31\xfd\xd5\x4c\xed\x3f\x6b\x56\x71\x56\x69\xd6\x9e\x4a\x48\x7e\xac\x52\x96\x62\xad\x75\x4c\x02\xfa\x20\x14\x6b\x54\xa7\x01\xa0\x5d\x30\xa8\x82\x06\x73\xf1\x3d\xcf\xd8\x19\xb9\x64\x95\xc2\x7f\xe9\x3d\xff\x1b\x5b\xeb\xff\x41\xdb\x2f\xda\x57\x9b\x18\xdb\x29\xe9\x2d\xe6\x4e\xda\xeb\x7c\x72\x32\x99\xe8\x05\x9b\xe0\xc4\x26\x2a\x93\x93\xdf\x9f\x9c\x90\xcb\x1f\xaf\x09\xad\x96\x72\xba\x4b\x6a\x7d\x12\x97\xed\x36\x53\x75\xd2\xb8\x99\xad\x0d\xe2\xf2\x82\x24\xa6\x5c\x64\x2d\x59\x13\x43\x89\x90\x5b\x83\x96\xf8\x18\x5d\x27\xb1\xd5\xed\xe3\x55\x5a\xfb\x86\x3b\x48\x08\x60\x1d\x37\xba\xd8\x11\x92\x38\xe7\xf5\x16\xb8\x31\x78\xaa\x85\xf1\x51\x1f\x2c\xda\x72\x74\x1c\x63\xc7\x58\x6e\x4c\x99\x6a\xb4\x31\x49\x3c\xb0\xea\x81\xb3\xc7\xf3\x47\x51\xdd\xf3\x62\x39\xd1\xb4\x6a\x62\x12\xa6\xce\x21\x61\xe4\x1c\xf3\x46\x82\xa2\xcf\xdd\xc7\xab\x8f\x6f\xc9\x45\x9a\x1a\xb2\x52\x4b\xb6\xa8\x33\x73\x53\xa6\x4e\xe6\xf4\x19\x84\x3a\x9e\x91\x9a\xa7\xff\x3b\x2e\xfa\x26\x62\xfd\x10\x07\x7f\xbb\xe0\xa8\x77\x0d\x67\x06\x28\xe4\x71\xc5\x0c\x25\x64\xce\x31\x14\x15\xe1\x4a\x46\xf9\xfc\xac\x0f\x36\x2e\xb6\xc9\x5f\xbd\xab\x6d\x91\x71\xa3\xde\xf1\x45\xc6\x25\x25\x15\x1b\x04\x86\x20\xfd\x65\x54\xbf\x82\x6b\x6a\x6e\x07\x4e\xaf\xbd\xb4\xc0\x50\xa6\x88\xdf\x11\xdc\x5a\x50\x42\x51\x53\x30\xfd\xdc\xb3\xa0\x9b\xfd\x78\xed\xbf\xb6\x6b\x6f\xce\x74\x7b\xe7\x43\xa8\x6a\xd8\xbe\xd6\x3b\x1f\x7c\x24\xa1\x5a\xce\x89\x92\x2c\x6e\xa8\x5a\x59\x09\xc7\x0a\x14\x7c\x0b\x14\xbd\x51\x85\x06\x07\x3e\x8e\x7e\x04\x8f\x48\x32\x50\x00\x7e\x6b\xfc\x33\xc8\x67\xdf\x14\x8d\x4c\xa2\x29\xcc\x66\xc1\xb3\x66\x5c\xc3\xc3\x3f\x0a\x4d\xfd\x63\x3c\x0a\x4d\xc3\xed\x5f\x84\x7a\x1e\x85\xa6\xbe\x76\x14\x9a\x8e\x42\x53\x7f\xfb\x17\xb9\xf6\x47\xa1\xa9\xdb\x12\x63\x2b\x1a\x2d\x36\x6d\x09\x1b\x5b\xf2\x93\x4f\x66\x30\x26\xe6\x43\x09\x4e\xbc\x90\x2c\xa9\x2b\x36\xbb\xe7\xe5\x4f\xac\xe2\x8b\x41\x3a\xd2\x99\xcf\x15\x16\x0f\xb2\x78\xed\x7a\x2e\x60\x12\x55\xcc\xa9\xd7\xed\x1f\x94\x6f\xa7\xef\xd1\xf2\xb6\xeb\xd2\x62\xc0\x66\xdf\xca\x46\x48\xa6\x87\x5a\xd9\x7b\xb6\x9e\x79\xb9\x46\x80\x63\xf4\xcd\xe7\x80\x36\xbb\x00\xc7\x78\x12\x6e\x31\x9a\x53\x44\x51\xb9\x1d\xc0\x6f\xbe\x10\xee\x70\x70\xce\x10\xb5\x5e\x31\x1c\xe1\x29\xb8\x41\x14\x27\x88\xe1\x02\x21\x0e\xe0\xa3\xfe\xe1\xc0\x4b\xb0\xd6\x47\x57\xc0\xfb\x64\x10\xaa\x1e\x80\x76\xc2\xd2\xac\x84\x54\x90\x6c\x7e\x18\x4a\xe2\x1d\x31\x8f\xf2\x07\x5d\x5b\x1f\x90\x83\x66\x4a\x3b\x45\xcb\x21\xdb\xb0\x71\x30\x9d\x11\x45\xfb\xcf\x0f\xe2\xa4\x51\x92\x88\x7c\xce\x0b\x4c\x69\x9a\xda\x03\x62\xa9\xd6\x43\xeb\xb4\x94\x0a\x50\x33\x58\xc2\xa4\xa4\x03\x18\xaf\x4a\x10\x56\xc8\xda\xd4\xe1\x74\x68\xf5\x47\x1b\x3f\x7f\x5f\x88\x47\x13\x0c\x6d\xfb\x16\x0b\xe3\x0a\xea\xe7\x6a\x36\x8e\xad\x71\x34\x79\xa0\xbe\x07\x56\x3e\x03\x27\xf5\x8f\x22\xe9\xbf\x29\xdd\x48\xa6\xf6\x59\x92\x43\x95\x3e\x3d\x15\xe3\xab\x92\x3c\x65\x09\xad\x4c\x87\x44\x14\x24\x13\xa2\x9c\xd3\xe4\xbe\x3f\x71\x4b\x0a\x93\x93\xab\x5a\x0c\x93\x39\x2f\x52\x42\x97\x94\x17\x06\x04\xeb\x46\xa4\xe4\xfa\x66\x78\x52\x43\x37\x08\xcf\x91\x8d\xb7\x8f\x73\xe1\x7d\xdc\x7e\xc7\xf5\xe0\x19\x5c\x4b\x0b\x17\xcc\x0b\x33\xf1\x5d\x20\x57\x3d\x5c\x69\x57\x8e\xe4\xc3\x98\x8b\xe7\x46\x41\xca\xea\xe3\x42\x5f\x26\x07\x3a\x28\xf7\x09\xae\x4f\x88\xeb\xec\xc8\x71\xc2\x5c\x25\xc4\x51\x7c\xdc\x64\x88\x93\x78\x69\xb2\x17\x76\x63\x23\x40\xd9\x86\x22\xbb\xc8\x68\x0d\x40\x49\x27\xbb\xc7\x67\x91\xec\x12\x1a\x08\x53\xd3\x44\x03\xa0\x7c\x52\x53\x84\xde\x62\x28\x9c\x1b\x50\x6a\x27\x54\x77\x87\x7b\xea\x47\xcc\x18\x17\xde\x1d\x21\xb4\xec\x82\x8c\x61\x51\x15\x06\xbf\xfb\x05\x21\x62\x04\xa5\x92\x10\x02\xc6\x13\xaf\x78\x14\xd2\xc5\xb8\x35\x0f\x21\x5c\x6c\x21\x58\x0c\xf6\x19\x42\xb6\x08\x21\x57\xf8\x7c\x14\x83\x88\x16\x2f\x8d\x58\xb1\x7b\xc4\x5b\x6f\xb5\x92\xad\x2d\x37\x15\x4b\xda\x90\xb0\xdd\x42\xdb\xc8\x13\x55\x2c\x21\x4f\x52\xb5\x84\x84\x2a\x97\x90\xd0\xe5\xe9\x89\x1a\xdc\x5a\x5a\x13\x39\xb8\x21\x1d\x06\x96\xb8\x77\xac\x9b\xe5\xb1\x47\x45\x10\x0e\x09\xce\x3b\x4d\xbb\xa2\x09\x2f\x96\x91\xf2\xe4\x9d\xfb\x74\x27\x16\x0c\xff\xe0\x88\x90\x36\x20\x6f\x40\x19\xe9\xc6\xe9\x99\xc4\xc3\xcd\xf8\x40\x13\x72\x57\x97\x89\xc8\x31\xb7\x05\x62\xef\x06\xcc\x61\x84\x92\x79\xc5\x28\x64\x6e\x3d\xd2\x5e\x79\xf0\x28\xc4\x1e\x85\xd8\x88\x35\xfa\xaa\x85\xd8\x87\xe1\xc2\x17\xdd\x8c\xdb\xa6\xe0\x85\x2b\x18\x6c\x69\xe9\xc6\xf5\x35\x92\xb0\x0c\x07\x67\x8b\xcc\x40\x40\xfb\x43\x9a\xbb\x15\x95\x00\x21\x54\xa4\x27\xd2\x7d\x7f\x73\x48\x03\x89\x68\x5b\x17\xb7\x14\x29\xe6\xaf\xdc\x35\x7d\x41\x0e\xb4\x52\x34\x59\x19\x34\x53\xfc\x0b\x00\x71\xf6\x6e\x00\xe5\x85\xb2\xa8\xf8\x2a\x59\x99\xc5\x53\x15\x2f\x33\x46\xfe\xdc\xe0\x1d\x9c\xb1\xc5\x82\x25\xea\x2f\xa4\x96\xd6\xc4\x02\xcf\xf7\x9f\xd2\x06\x75\xe0\xcf\xf6\x5f\x7f\xd9\x5e\x76\x3f\x09\xc3\xef\xf5\x1f\xf2\x6e\x55\x05\x78\xd0\xe6\x26\xd9\xf1\xc3\xb4\xb0\x0f\xbd\x0c\x30\xd6\x29\xd6\xe6\x19\x38\xde\x98\x12\x83\x88\xec\x34\xcb\x3a\x5d\xc8\x29\xf9\x79\xc5\x0a\x77\x23\x8d\xbc\x6e\x60\x14\x86\x44\xe2\x8a\x91\x0f\x62\xa6\x37\xa3\xce\xd8\x19\xb9\x01\x32\xd5\xfe\x02\x12\xc1\x07\xf1\xee\x33\x4b\xea\xa1\x2a\x5a\x01\x82\x30\x48\xe8\xbb\x50\x99\x2d\xfc\x11\xce\xab\x03\x7f\xd4\x1e\xc5\x40\x51\x51\x25\xcc\x1a\x0e\xac\xd6\x3d\x5b\xb7\x25\x2d\x0d\xe4\x12\xc0\xc4\x9c\x85\x30\x4a\x2c\x09\x42\xac\x9a\xff\x69\xb2\xdc\x5b\x0b\x5f\x5b\x3c\xab\xfd\xa6\x45\xb0\x18\x84\xb1\xd4\x0f\xc1\x90\x76\x59\x58\x3f\x0a\x53\xd7\x38\x35\xa2\xf2\x69\x23\x23\x0d\x31\xc8\x3e\x7c\x25\x07\x2e\xe9\xdd\x2f\x35\xcd\xa6\x1d\xb1\xcb\xfc\xe4\x85\xf9\xd9\x2a\xa4\xf8\xc8\xb3\x34\xa1\x15\xea\x38\xa6\xee\x8e\xb5\xfa\x21\x9c\x79\x02\xd8\xbf\x48\x3e\x3c\x0b\x0c\x3b\x2f\x4d\xde\x3e\xad\x14\x4f\x6a\x2d\x4e\x9b\x0a\x09\x03\x72\x40\xc8\xde\xdc\x1c\xc8\x19\x4b\x44\x91\xc6\x14\x09\xbe\xdb\x7c\x67\x33\x0b\x48\x4b\x69\x22\x05\x81\xc1\xe4\x7b\x0e\x9e\xf2\xe6\x3a\x9c\x9a\x82\x57\xe6\x74\x8a\x85\xa5\x29\xcd\xa5\xed\xc0\x0f\x0e\x57\x54\x6a\x2a\x4f\x1a\x01\xf8\xb5\x43\x99\x9b\x5b\x39\x25\xdf\xad\xad\x1e\x09\x12\x24\x82\x02\x0f\x74\x29\x99\x3a\xdb\xa8\x2c\x87\x3d\x3a\xd7\x7c\x21\x2a\xf6\xc0\x2a\x72\x9a\x0a\x30\xc7\xb0\x07\x9e\xa8\xd7\x43\x47\xef\xff\xb0\x4a\xc0\x21\x2b\xd8\x92\x2a\xfe\xd0\x80\xc4\x58\x43\x8d\xb2\x98\xd3\x92\xbc\x21\xa7\xd0\x99\xd6\x7b\x58\xca\xa9\x62\xd9\xfa\xf5\x40\xbf\x06\x06\x04\x21\x3f\xfa\x3f\x6e\x93\x60\x79\xa1\xfe\xf8\xad\xe7\xc8\xf0\x42\xb1\x65\xaf\xe7\x14\x86\x1a\x71\x4e\x10\x85\xa4\x43\x0c\x51\x67\xd9\xa0\x84\x0d\x3b\x1c\x04\x79\x1b\x84\xda\x72\x40\xb3\x9c\xd4\x52\x4b\x08\x03\x3a\xff\x3f\xf4\x59\xa3\xa4\x62\x4b\xb8\x47\x78\x47\x76\xb8\x45\xc1\x84\xb3\xed\xb4\xbb\x01\x81\xab\x57\xd8\xea\xe6\x9d\xf9\x35\xc5\xc1\x71\x5a\xb8\x99\xba\xd8\x36\x2b\xf5\x80\xaa\xe0\x83\x9b\xe9\x60\x6d\x19\x8e\xc6\x00\xd5\x79\x7e\xdb\xff\x80\x1e\x79\x51\xab\xb2\x56\x6e\x85\xb6\x4e\x9d\x8c\xce\x27\x5b\xa7\x95\xbe\x0a\x5b\x3d\xce\x99\x66\x9c\x58\xb2\x43\x09\xa3\x06\x74\x3a\x30\x51\x00\x65\x4f\x14\xc0\x59\x3f\xc6\xa2\xa6\xfb\xa6\xcc\x88\x01\x6a\x27\x15\x93\x75\x06\x36\x2e\xe3\x08\x81\x8a\x16\x03\xd5\x66\x62\x84\x48\x67\x88\x8e\xf4\x4c\x09\xd8\xd2\xa0\xd8\x90\xa6\xea\x3f\x59\xf0\x79\x2c\xcf\xd2\x73\x14\x9b\xb9\x8c\x95\xf2\xe0\x43\x37\x54\xad\x22\x2e\x2e\x04\x59\x98\x41\x98\x64\x7d\x63\xad\xa0\xca\xd0\xc1\x2d\xcc\xe7\x21\x82\xc4\xf0\xcb\x2c\xb5\xba\xad\x26\x8e\xa6\x43\x72\xf2\x76\x00\x26\x22\xc0\xb5\x70\x32\x95\x28\xe9\x12\xce\x64\xc4\x9c\x36\x5f\x21\x29\x53\xac\xca\xc1\x0e\xbf\x12\x8f\xf8\x77\x94\x01\x4a\xf3\xd4\xa0\x7e\xd6\x54\x6c\x5b\x09\xa9\x0c\x5c\xab\x5d\x20\x83\xf9\x85\x07\xf3\x91\xae\x09\xad\x44\x5d\xa4\x46\xac\x0d\xf0\x98\xf7\x1b\x83\xfc\x20\x0a\x20\xa0\x50\xd9\xd6\xad\x52\x01\x2e\x4f\x45\xf5\x61\xff\x66\xfa\xcd\x9b\x9d\x16\x71\x58\xfd\xdf\xae\x8d\x01\x6c\x19\xe5\x41\x3d\x3b\x6b\x0f\xb0\x27\x76\xa7\xef\x57\x8c\xa6\x1f\x8b\x2c\x46\xa8\x7e\x8f\x47\x08\x5e\x01\x50\x22\x30\xf8\x56\x5a\x92\x82\x9f\x1e\x2b\xae\x98\x23\x1e\x9c\x2e\x68\x36\x48\xf6\x45\x45\xea\xa2\x21\x33\xaf\xbb\x12\x1e\xbc\xe8\x9b\xce\xb0\x56\x2e\xeb\xf9\x8e\xf7\xcb\x5c\x24\x38\x56\xed\xf5\x6a\x0e\xd5\xc9\x90\xa8\xd3\x05\x5d\x77\xaf\x9a\x3b\xa5\x57\xaf\xc8\x29\x3e\xa9\x85\x64\x21\x86\xa4\x92\xc0\x76\x99\xe9\xbd\xfb\x5c\xc6\x08\xea\xef\x3e\x97\x14\x88\x74\xf9\xe4\x73\xfd\x8e\xad\xe8\x03\x93\x44\xa2\x79\x39\x83\x70\xf4\x19\x8e\x16\x2c\xcc\x4e\xfa\xf1\x50\xe7\xb4\xe2\x60\x50\x6e\x80\xc3\x24\xf9\x1f\xa7\x3f\x5d\xdc\xfe\xf7\x87\x8b\xf7\xef\x5e\x03\x55\x60\x76\x46\xad\x5e\x1e\x1e\x75\x27\xf3\x39\xb0\x29\x76\xcc\x7a\x85\x3d\xaa\x96\x9d\x99\x1e\x53\x5e\xab\x9a\x66\xd9\x9a\xb0\xcf\x49\x56\x4b\xfe\xb0\xcb\x4d\x1c\xb6\x26\x4d\x5a\xae\xd1\xf3\xb7\xde\xa2\x05\xbb\xc8\x42\x08\x71\x15\x21\x95\x44\x09\x24\x16\x45\x1b\x65\x8f\x6d\x91\x24\x46\x16\xd9\x14\x43\x5c\xb1\x63\x7b\xca\x56\x0c\x69\xf0\xbb\x41\xb3\x7b\x36\xa1\xa2\xab\x0b\xeb\x5d\x49\x1b\x54\x11\x53\x79\xd8\x2d\xc6\xd8\x73\x40\x10\x5c\xcc\x14\xd8\x2a\xd6\xae\x77\xa2\xb0\x76\xb4\xb1\xf2\x06\x7d\x94\xef\x32\x2a\x15\x4f\xbe\xcb\x44\x72\xaf\x67\x1c\xc3\x6d\x4e\x2e\x7e\x9e\x6d\xbd\xd7\x99\x61\x41\x2e\x7e\x9e\x91\x2b\x2e\xef\x43\x05\x61\xac\x47\xd0\xb5\xd2\x51\x72\x5f\xcf\x59\xc6\xd4\xc9\x89\x44\xf6\x6d\xe0\x67\x2c\xe7\x06\x2f\x83\x90\xc3\xb6\x59\xd1\xac\xc8\xbe\x85\xbf\xe9\xa3\x64\x38\xd5\xb9\x9e\x2a\x14\x46\xea\x37\x56\x87\x43\x3c\x17\xf2\xce\x8b\xb7\xd2\x5d\x64\x07\x16\xd2\xe2\x4d\x3a\xb4\x19\xd6\x6d\x2d\x6a\xf2\x48\xbd\xc0\xaa\x4a\x20\x7d\x98\x92\x3b\x5e\xbe\x25\xef\x6c\x58\x97\xb1\x75\x2d\x36\x3e\xc2\x65\x9b\x50\xef\xe9\x75\xde\xc6\xd5\x19\x85\x4f\x93\x5b\xa3\xd1\x92\x77\x9f\x69\x5e\x66\x4c\xbe\x25\xaf\xd8\x67\xf5\xed\xab\x33\xf2\xea\xf3\x42\xea\xff\x14\x6a\x21\x5f\xf9\xc2\x4b\xaf\xf3\xc6\x31\x0c\xd5\x77\x4d\x15\xaa\x39\x33\x5d\x69\x99\xc2\x11\x0c\xdc\xed\xf5\xf4\x7a\xa8\x8d\xf7\x7c\x02\xbd\x1e\x5a\x48\x4d\x05\xa2\x83\x41\x19\x29\xc2\xaa\x4a\x54\x8d\xc2\xe3\x2c\x37\x30\xd7\x44\xe4\x5a\x07\xe2\x32\x00\xf2\x07\xf6\x65\xb8\x02\xc3\xb1\xa6\x11\x21\x04\x60\x90\x1a\x96\xc5\xc9\x76\x19\x7a\x7d\x8b\xec\x4b\xa4\x2b\x1d\x74\x4e\xa0\xbf\x2c\x96\x39\x81\xd7\x0b\x1b\x4a\x80\x26\x01\xa7\x9a\xba\x3d\xa6\xfa\x64\x99\xfe\x35\x91\xf4\x1d\x95\xf6\x94\x7d\x2f\x2c\x5d\x27\xe7\x29\x7b\x38\x97\x29\xfd\xe6\x0c\x86\x26\x8d\xc3\x47\xb9\xf3\xf0\xf4\x49\x25\x79\xf5\xcd\xab\xc6\x0b\x9e\xad\xcf\xdc\x19\xb7\x2b\xb1\x10\x55\xf3\x29\x3f\xdc\xd1\xab\x37\xaf\xc8\xa9\xa8\x60\x34\x09\x2d\x48\xc6\xe8\x03\xb3\xca\xaf\xa6\x17\x6b\xb4\x84\xbc\xee\x05\x9f\xc0\xe6\x58\x83\xfe\xfd\x0f\x81\xfd\x1f\xb6\x08\x91\xa0\x38\x4f\x7a\x6b\x44\xea\xf5\x7b\xa5\xe5\xf8\x57\x20\x7b\x8b\x2a\xb1\xe5\x5d\x91\x84\xdc\x9a\x3e\x3d\x8b\xd0\x4c\x95\x17\x5d\x3b\x80\x16\xb2\xa0\xeb\xc1\xc3\xe1\xe9\x95\x4b\xf2\x0a\x54\x81\x57\xcf\x48\xe5\x49\x64\x44\x34\xf6\x7c\x7d\x15\xbb\xd2\x08\xc0\x46\xae\xaf\x2c\x9d\x77\xe0\xc7\x52\x97\x8f\x12\xee\x3b\xc0\x9a\xed\x9e\x5e\xe4\xf4\x57\x51\x90\x77\xdf\xcd\xcc\x30\x5e\xbf\xc8\x02\x79\x48\x91\x3f\x5e\x7c\xd2\xac\x9e\x47\x50\x1e\x0c\xb4\xa1\xbf\xd6\x15\xd3\xa2\x47\x84\x24\x73\x61\x9f\xdd\x94\x5e\xf4\xef\xe4\x8a\x2a\x8a\x42\x8c\x89\xa6\x1a\x5a\xf9\x86\x17\xea\x7b\x01\x81\xc1\xf8\x82\x23\x87\xec\x28\x32\x24\x40\xf5\x97\x7e\xd4\xea\xee\x49\xfa\xab\x1e\xc8\x25\xbe\x07\xf0\xb8\x6f\xc9\x07\x51\xb0\x33\xb8\xa8\x44\xdf\x54\xf3\xcf\x9f\xb5\x42\xee\x21\x3b\x31\x31\x69\x5c\xde\xfb\xe1\xa0\xb7\xbc\xb4\x6e\x98\x02\xa4\x60\xc2\xe9\x36\xac\x65\x9e\x89\xb9\x0d\x5b\xde\x77\x5c\x9f\x6e\xaf\x47\x0c\xeb\xd3\xed\xf5\xd3\x0e\x69\x94\xf0\xb7\x29\xfb\xb5\x52\x9c\x09\x3d\x21\xd4\x91\x25\x7c\x92\x83\x7e\xbb\x2d\x43\x1a\x92\xdb\xa6\x56\x62\xf3\x71\xb4\x8e\x2c\x37\x5a\x62\xdb\x67\x0d\xfd\x35\x11\xbb\xd7\xe0\xdd\xe7\x92\x25\xaa\x71\x49\x93\xd9\x8a\x6a\x82\x43\xf2\x3a\x53\xe0\xcd\x87\x8d\xd5\x3b\xed\x63\xdf\x25\xab\x9a\x30\x7a\x9a\x24\x70\xab\xc9\x15\x43\xe7\x7a\xfa\xd6\x56\x42\x68\xfa\x72\x5f\xf0\xc9\x19\xb6\xab\xf7\x10\x6f\x98\xbe\x45\xaa\x45\x30\xfc\x30\x75\x4e\xe1\x29\x5a\xd2\x0a\xfb\x27\x5f\xa7\x0f\x94\x67\xd4\xa0\x9a\x49\xa6\x5e\x4f\x3b\x51\x98\x12\x16\x60\xaf\xeb\x3e\x52\x7c\xd8\xb2\xd9\x91\x53\xdd\xc3\x39\x58\x02\x5f\x4f\x1b\xc9\x81\xac\x98\x57\xb6\x06\xed\x1e\x05\x0f\x57\xe0\xd0\x73\x54\x26\x38\xcd\x95\x2a\x42\x47\xcc\xc7\xb8\x43\x8c\xc9\x12\x3c\xcf\x9f\x3f\xdd\x5e\xef\xcc\xb6\x86\x53\x2c\xb7\xd9\x16\x00\xa1\xf5\xb1\x2d\xf8\xc3\x0c\x8b\xe3\x13\x5f\xc5\x3b\xe3\xf9\x79\x1a\xce\xf5\xaf\x7f\x56\x2c\x06\xc1\x08\x06\xa8\x9c\xaa\xa7\x36\xb8\xb0\x53\x7e\x0c\x77\x70\x16\x24\x20\x17\x86\x80\x00\x37\x35\xc8\x78\xfb\xdc\x6c\x20\x0e\x23\x26\x02\xd4\x94\x0c\xde\x84\xa8\xaf\x86\xee\x5a\xbb\xba\x43\x0f\xd8\x41\xef\x72\xdf\x12\x56\xae\x16\x31\x91\x14\x97\xac\x5c\x7d\x3f\xeb\x1a\xf0\xf4\x6f\xe4\xfb\x59\x23\x17\x3a\x8e\xa6\xe1\x02\x71\x30\x5c\x89\xc6\xbe\x13\x49\x32\xbe\x60\x83\xf8\xd6\xe1\xfb\x95\x8b\x82\x2b\x51\x79\x72\x0a\xb6\x13\x06\x60\xb5\xc9\x7b\xf3\x26\x16\x08\x49\x44\x96\x19\x94\x4f\xb1\xc0\x89\xd9\xae\x3d\xe7\xaf\x47\x9d\x60\x46\x1f\x9f\xde\xff\x09\x14\x0a\xa3\x3a\x9c\xe3\x42\x9f\xdf\xbe\xbb\xb8\x7a\xff\x6e\x9a\xa7\xbf\x5b\x89\xc7\x89\x12\x93\x5a\xb2\x09\x57\xc3\xfc\x28\x88\x3f\x1f\x95\x5a\x1b\xc6\xd4\x2d\x07\xfd\x41\xdb\x8b\xf8\xd1\x46\x9b\x62\x96\x29\x35\x49\x17\xd6\xf3\x25\x84\x3a\x23\x15\x6d\x60\x3d\x03\x26\x9d\x45\x9d\x65\xb8\xe2\xaa\x62\xec\xcc\xb5\x87\x78\xea\x62\x1e\x9e\x4f\x3b\xd3\x8a\x25\xc3\x3e\x63\x1b\xab\xd8\x68\x32\x0c\x07\xca\xa7\xeb\x3f\xe9\x51\x8b\xa7\xf5\x3e\x0c\x84\xe1\x55\x9d\x35\xef\xda\x48\x9b\xd2\x40\x24\xdc\xb3\x35\x09\x00\x86\x2c\x44\xa5\x4f\x5b\xd5\x3d\x1f\x4c\x25\x30\xdd\xf3\x5a\xb2\x6a\x6a\x78\xc9\x33\xdc\xca\x18\x5e\x02\x83\xb9\x65\x8b\x5d\x17\xea\x96\x2d\xb0\xa6\x52\xb7\x40\x10\xa1\xb5\x5a\xb1\x42\x71\xc4\x10\xf6\x2c\x99\x59\x8e\xde\x95\x33\x85\x01\x9f\x61\xa9\xe2\x90\x82\xc2\x68\x3a\x5f\x66\x98\x3f\xb6\x27\x40\xd2\x19\x41\xd6\xbd\x70\x31\xfa\x62\xec\x44\xd7\x2b\x7b\x49\x2b\x9a\x0a\x88\xeb\xa8\x60\x97\xce\xe2\x6c\x92\x34\xcd\x79\xf1\x45\x5c\xc5\x90\x80\xe5\xe5\xf3\x21\xf1\x89\x17\xe9\xd0\xfa\x76\xd7\xf6\x12\x9e\xec\xca\x4f\xf8\xb6\xb5\xab\x37\xbe\x3f\x6a\xf5\x8f\x41\x3d\x57\x14\xd6\x37\xd8\xf5\x0c\x46\x5d\xe8\x7c\x2d\x7f\xc9\x26\xf8\xed\x49\x99\xb6\x2b\xfe\x32\x0e\xbd\xe7\x32\xea\x6c\x38\xe3\x5e\xc0\xb4\x13\x25\x2f\x8e\xdc\x1d\x72\x14\x85\x0e\xba\x8a\x31\xd2\xcf\x4e\x3c\xbd\x14\xdc\xb8\x7a\xa8\x65\xcc\x06\x9f\xa2\x85\x56\xf2\x59\xe0\x68\x45\x73\xa6\x58\x85\x11\x76\x26\x92\xaf\x30\x99\x2c\x1f\x4b\x56\xcc\x14\x4d\xee\x3d\x76\xec\x23\x1f\x7e\x51\x3e\x3c\xd6\x13\x66\xc3\x62\xd2\x66\xbf\x79\xaa\xa5\x3e\xe3\xc6\x6d\xa3\x66\xf0\x90\x7f\x81\x54\xe7\x29\xbd\x5b\x01\x8c\xda\x01\x74\xda\x2e\xf3\x6d\x7e\x06\xdb\x93\x89\xd6\x2b\x45\x59\x67\xc3\xb9\x2d\x90\x81\x84\x03\xdf\x91\x59\x1a\xe1\x69\x8c\x2b\xab\x25\x22\xb9\x48\x19\x99\x73\x65\xd3\x16\xb5\x20\x90\x98\xf4\x0b\xe0\x99\x9e\x53\x30\x6f\xb2\x48\x5c\x4e\x8b\xf9\x08\x73\xa6\x1e\x19\x2b\xc8\x1b\x90\x3d\xde\xfc\xc7\x7f\xfc\x47\x20\x75\xde\xac\x86\x20\x6f\xfe\xf8\xed\xb7\x53\x72\xc5\x2b\x28\x95\xcf\x21\x2d\xa4\x09\xa0\x2c\x6d\xf0\x5f\x21\x14\xa1\x90\x23\x03\x8c\xda\x6b\x10\xc0\x4c\x6f\xcd\x13\x4c\x18\x71\xce\x97\x2b\x18\x2d\x87\xf2\x79\x8b\x8c\x27\x0a\xbe\x62\x2e\x39\xe6\xbe\x7a\xc7\x09\x51\x6e\x26\xef\xcf\xc4\x9f\xc0\x5a\x9e\x91\x8c\xdf\x33\xb2\x90\x3f\x54\xa2\x2e\xdb\x32\xc8\x18\xfe\xe6\xe9\x31\xa1\x05\xa4\xfe\xc0\x00\xda\x5d\x91\x4c\x3d\x4b\x00\x43\xc0\x28\xb4\x99\x6a\xea\x48\x27\x67\x84\xd1\x64\xa5\x15\xee\x09\x6e\x7d\x49\x79\x13\x3b\x77\x45\x55\x5f\x20\x7f\x33\x7e\x88\xe7\xee\x12\xfb\x84\xa5\xce\x05\xb3\x01\x88\x65\x25\xfe\x81\x9b\xcd\x0b\x6f\x48\x8c\x43\xca\x20\xee\x10\x76\x06\x8b\x5b\x17\x4e\xb1\xdc\x7b\xb6\x86\xbd\xd1\xac\x12\x4a\xc7\xfa\x77\xdb\x26\xd3\xf5\xa4\xd9\x02\xd6\x55\x0a\x09\x80\xdb\xa3\xf5\x8a\x1b\x46\xfb\x6e\xa3\x2d\xf5\xe9\x96\x78\x66\xea\x62\xab\x5f\x00\xc7\xf2\x09\x30\x86\x14\xc1\x20\xa9\xcd\x8b\x74\x62\x39\x21\xe0\x18\x73\xbd\xec\xb3\x66\x9f\x3c\x9d\x36\x5b\xd1\x89\xd8\x91\x4c\xd5\x66\x73\x20\x10\x4b\x8f\x97\x49\x69\x92\xc9\x72\x5a\xdd\x7b\xe7\x6e\x93\xcb\xa7\x10\x0d\x2e\x9b\xc4\x37\xcc\x62\x7c\x60\x4d\x1d\x22\x37\x5f\xc2\x3f\xce\x93\xe9\xf4\x04\xc9\x83\xa8\x88\x54\xb4\x32\x37\x5a\xff\x3e\xcc\xca\x82\xb6\xd0\x6e\x24\x3e\x2d\xf5\x91\x32\xa5\xf7\x0c\xf6\x37\xed\x44\x79\xd3\x88\xe2\xa9\xcf\x00\x48\x6e\x0e\xe0\xc1\xa0\x89\xf3\x40\x75\xef\xad\xb1\x04\x58\x8c\xc2\x6c\x8e\x8c\xf9\xb4\x26\xf3\xe9\x08\xce\x62\x50\xa0\xda\x9b\x19\xec\xd5\x39\xcb\x0e\xff\x6c\x2e\xb0\x93\x73\x62\x99\x45\xb0\x4b\x3f\x33\xe9\x65\x19\xe1\xc9\x07\x59\xca\x36\xe3\x08\x76\x1a\xc1\x58\xb0\xc5\xb1\x17\x6c\x31\x4c\x06\x9b\xdf\x2f\x80\x6d\xeb\x5c\x37\x94\x01\xaf\xf8\xa2\xe5\xba\x90\xab\x5d\x06\xa8\x03\x36\xbc\x1c\x53\xf2\xde\x50\x16\x7d\xaa\x0a\x42\xe7\x52\x64\xb5\xc2\xae\xdb\x3f\x1a\xb2\x13\x75\x92\x60\x50\x0c\xb1\x93\x90\xe2\x34\xdd\x38\xa4\x08\x88\x7d\x4c\xf5\x48\x12\xa0\x5a\xe6\xc3\x71\x97\xf7\x10\x20\xd2\x13\x98\x61\xd0\x65\x14\x40\x96\x0f\xbb\x8c\xfc\xba\xe2\x97\xaa\x27\x1e\x58\x47\x8c\xd8\xd7\x30\xae\xed\x4e\xa5\x0d\x64\x08\xd9\x36\x02\xd7\x36\x6c\xf4\x08\x29\x62\x92\xc7\xa8\x60\xb3\x6b\x72\x7a\xd9\xa4\x6a\x18\xc7\x3e\xb9\x2e\x14\xab\x16\x34\x61\xaf\x5d\xd5\xcc\x1f\x37\x64\x33\x25\x56\xb4\x48\x33\x9b\x07\x42\xd8\x67\xc5\xaa\x82\x66\xf0\xa5\xb4\xe2\x90\xde\x7e\x91\x95\x2b\x6a\xc1\x97\x06\x32\xc9\x22\x14\x36\xe8\x2d\x36\x7e\x03\x3f\x6d\xc4\xd6\xc2\x39\xf4\xce\xc0\x60\x0a\x38\x7e\xbf\x1c\xdb\xe8\x9a\x53\x7d\x00\x80\x7f\x00\x69\x5a\x8b\xba\x32\x06\x76\x0b\xe5\x9b\x88\x4a\xab\x60\xfd\x99\x4e\x6d\xa3\x92\x54\x6c\xa9\x65\x55\xc0\xdb\x32\x39\xb3\x59\xad\x7f\xd8\x2b\x26\xed\x40\x71\x7d\x4e\xec\x9d\x31\xc3\xfa\xec\xb4\xd6\x40\xbb\x89\x2a\xa9\x27\x05\x0e\x2e\x23\x84\x70\x49\x4a\x2a\x8d\x19\xc5\xcf\x7a\xa8\x94\x22\xe1\xa0\x50\x3b\x3b\x86\xc2\x38\x88\x1b\x4d\x2e\x6e\x27\x76\x3f\xce\x60\x2d\x00\x49\xc5\x03\x2c\x1e\xb1\xd0\x85\x48\xd9\x4d\x3d\xcf\xb8\x5c\xcd\x46\x5a\x23\x3f\xf4\xbc\x8a\xd1\x0f\x5b\x3e\x46\xb4\x50\xfa\x74\x82\x4d\xdb\x25\x91\x0c\xaa\x51\x3f\x20\x41\xd7\xa2\x08\x94\x4c\x17\xb0\xf4\x4d\x65\xa6\x59\x7f\x54\x98\x19\xad\xb9\x1f\x02\x32\x42\x32\x66\x50\x2b\xf4\x46\x38\x63\x37\xa9\x64\x88\x92\x93\xb2\x4f\x45\xe9\xfe\xee\x55\xda\xb3\x4c\x6e\xe6\x26\x5b\xe2\x8c\x92\x9a\x49\x3c\x33\xa7\x87\xeb\x83\x15\x5e\x0b\xbe\x01\x1a\xe9\x60\xa6\x75\x97\x49\x92\x5c\x60\xda\x51\x41\x84\xb7\x8c\x38\xbe\x0e\x80\x42\xb6\x2b\x27\xdf\x13\x32\xbf\xe1\x40\x0f\x1f\xa5\xa3\xb9\xf7\x45\xcd\xbd\x23\x1d\x2e\x33\xa3\x0b\xe1\x65\xb4\x99\xe3\xdd\xdc\x51\x4b\xea\xc3\x2a\x6b\xc0\x67\xb3\x97\x0b\x04\xbf\x7e\xa1\x54\xc5\xe7\xb5\xf2\x9d\xae\x71\xd0\xaf\x91\x4b\xdf\x93\x54\xda\x8e\x05\x44\x07\x26\x0d\x1d\x99\x18\x05\x33\x71\xee\x42\xd0\x48\xd8\xdc\x2c\x87\x62\x99\xfe\x5a\x26\x0c\xfc\x17\x7f\x1c\x4c\xa7\x86\xc1\x8a\xa4\x6e\x00\x5a\x61\xff\x5a\x77\x25\xc6\x63\x87\xf6\x22\x80\xbc\xeb\x8d\xd1\x85\xf1\xed\x22\xd3\xa5\xe2\xb1\x78\xa4\x55\x7a\x71\x33\x90\x3a\xd0\x15\x79\xda\xa7\x5d\x29\xce\x76\x42\xf4\xef\x74\x2e\x0c\x7c\x6a\x29\x06\xb3\x55\x7b\xac\xf0\x47\x7b\x7b\x77\x89\x8e\xf6\xf6\xaf\xc0\xde\xae\x9f\x45\xb1\x2a\xe3\x12\x72\xe8\x3b\x77\xc1\xa2\x4a\xf8\x0c\x4a\xe3\x0c\x9d\xce\x0d\x44\x8a\xb8\x19\x13\xef\x08\x64\x7e\xe6\x27\xcc\xe9\x6e\x77\x6d\xa3\xee\x4f\x29\x52\x64\xaf\x07\x30\x98\x42\x3f\x5e\xe9\xb5\x67\xae\x4e\x00\xef\x0c\xc0\x68\xd1\x6b\xe0\x38\x26\x4a\xe1\x35\x9e\x60\x03\xf6\x4a\x8b\x42\x20\x6d\x96\x67\x24\xa3\x73\x96\xc9\x33\xd4\xd9\x00\xee\x4c\x0b\x20\x25\x4d\xd8\x46\x7d\xf5\x90\x19\x2e\x76\xfa\xba\xb5\x12\x4a\xf8\xd9\x61\xc8\x2d\x90\x37\x93\x15\xcb\x29\xfc\xf3\x7b\xbd\x1a\xbd\x40\x18\x7d\x8d\x4b\xa2\xc5\x02\xc5\x30\xb1\x99\x55\xb9\x24\x62\x71\xd6\xc9\x99\x79\xf5\xf0\x8d\x37\x5d\xdd\xb6\x68\x03\x35\xb1\xdb\x3f\x8c\x42\xe3\x99\xfa\x4d\xc7\xa8\xa8\xb7\xbe\x85\x26\x0e\x7a\x1e\xda\xd6\xfa\x5a\xe0\x5a\xe2\x7a\x1e\x78\x9a\x31\xe6\x3c\x02\xec\x7a\x11\xb9\x6b\x51\xb6\x3b\x72\x74\x02\x1c\x9d\x00\x2f\xe9\x04\x70\xc8\x34\xdc\x56\x2e\x89\x59\x00\xd7\x31\x10\x30\x56\x61\xdb\xf0\x1e\xcc\x99\x95\xc0\xa6\x2d\x48\x9b\x3e\x6b\xd6\x2f\x30\x88\x26\xdb\x36\xc7\x47\x49\x4e\x4e\xa6\xd3\x93\x13\xeb\x4d\x30\x07\xb7\x56\x8b\xc9\x9f\x08\x2b\x12\x91\xe2\xa1\x0a\x0f\x73\xc1\x2b\xa9\x80\x71\xb7\xfa\xb1\x3b\xd7\xdc\x8e\xb5\x75\x31\x84\xfd\x0a\x30\xb6\x83\x55\xdc\xb4\xb9\xf3\xdf\xef\xc4\x78\x5b\x76\xdb\xe4\xe0\x9b\x89\x36\x18\x3c\x6f\x81\xaf\x06\xa7\xd5\xd6\xda\x30\x25\x5f\xf4\xf5\xb0\x85\x44\xc8\x29\xfe\x38\x4d\xca\xfa\xcc\x3c\x30\xcd\x59\x2e\xaa\x75\x98\x44\xd8\x4e\xf4\xcb\x9d\x5e\x4d\x0f\x08\x8f\x95\xd4\x55\xc5\x0a\xa8\xba\xf1\x24\x5c\xbd\x59\x0f\x7f\x26\x59\xdb\x36\x22\x85\x1b\x3b\x39\x58\x67\x1a\x1e\x82\xa0\xbc\x18\x2d\x1d\x5e\x0a\xe2\x38\x1e\xe0\x4d\x56\x3c\x90\x07\x5a\xc9\xd0\x4c\xc9\x58\x46\x9e\xf2\x07\x2e\x87\x20\x91\x3d\x13\x6d\x6d\x1e\x0e\xf0\x26\xd2\x2f\x73\xb2\xa2\x26\x69\x30\x90\xda\x53\xb5\x21\xbb\x7c\xf3\xea\xd0\x13\xb6\x5f\x1a\xbf\xb5\x2d\x55\x6c\xee\x50\x23\xba\x1c\x78\x5f\xe2\x25\x8f\x00\x34\x55\xf7\xdb\x41\xc1\x23\xce\x81\xf9\x1c\x0e\xca\x40\x27\x60\xe2\xbd\xe2\x51\xc1\xfb\xef\xcc\xb3\xdd\x08\x42\xc5\xf2\x52\x54\xb4\x5a\x93\xd4\xe8\xe3\x6b\x6b\xc5\xa0\xd5\x30\xfc\x3b\x24\x3e\x3a\x99\x8f\x7b\xa3\x92\xc0\x4c\x52\x5e\xed\x1a\xbf\x9f\xb3\x94\xd7\x79\xac\x75\xe4\x67\x00\xcd\x32\x50\x5c\x16\x14\x00\xbb\x68\x20\x0f\x69\x72\xef\xc3\xbd\x86\x4e\xed\x92\x01\x7b\x75\x53\x93\x5e\xbd\xda\x00\xb0\x06\x09\x14\xfc\x69\x22\x65\x27\x7e\x8b\x9b\xe9\x06\xc7\xe3\x18\x5e\x0a\x63\xd2\x37\xd1\x40\xa7\xe6\xc1\xd7\x44\x54\xe4\x3d\xf0\x86\x91\x11\xb4\x87\xdb\x20\x12\x99\x4f\xc6\x7f\x65\x50\x42\x2a\x1a\xb5\x4a\x28\x9a\x39\x25\xb0\x32\xa8\x02\x69\x77\xac\xc3\x55\x02\x7b\xd5\x1c\x7f\xeb\x8d\xd4\x3b\xa6\xc7\x83\xfc\x19\x8c\x1d\x99\x44\xef\x16\x4f\x00\x9d\x52\xf7\x8a\x3c\xd7\xd3\xaf\xdd\xa5\x3b\xa7\x4c\x5a\x2d\xf5\xe8\x00\xdb\x5f\xbf\x6d\x4f\x56\x33\x84\x47\x0f\x82\x2f\x41\xa7\xb7\x5b\x01\xac\xab\x80\x40\xa5\x13\xbb\x8e\x6e\xd1\x51\x7f\x36\xbd\x15\xdf\x65\x0d\xc2\x9d\x19\x99\x11\x5e\xc4\x02\xbc\x34\x0d\xd3\x97\x0d\x94\xa1\xef\x44\x6d\x9c\xf9\x82\x67\xdd\x43\x6f\x91\xe9\x9a\x05\xae\x0b\xe3\xcb\x1f\x71\x4e\xfb\x8f\x69\x2d\x59\x35\x59\xd6\x3c\x3d\xe8\x01\x0d\x50\xdb\x45\x12\x41\x67\xbf\xbf\xec\x12\xd8\xef\xf9\xbc\x62\xe4\x72\x45\x8b\x82\x65\x0e\xcb\xdc\x00\x4b\x1c\x32\x28\xbb\x10\x8a\x01\x04\xc5\x03\x20\x3d\x7c\x1d\x59\x50\x2f\x09\x6d\xf3\x95\xc0\x03\x66\x75\x34\x30\x60\x6b\x31\xf9\xfe\xd2\x96\x9c\xcf\xea\x82\x14\x75\x3e\x67\x9e\xdb\xf4\x72\x50\x76\x2f\x9f\xd8\xb5\x5f\x06\x16\x2e\xf2\xcf\x3f\x7f\x88\x46\x7c\xe8\xdb\xa3\x47\x51\x65\xe9\x23\x4f\x31\x44\x47\x92\x53\xdd\xe1\xeb\x97\x07\x61\x78\x7c\xe4\x43\x65\x4d\x02\x13\x33\x86\x31\x98\x18\x81\x99\x99\x74\x21\xae\x39\xd2\x29\x74\x3c\x54\x89\x43\xb7\x77\x1c\x51\xe0\xf5\x73\x5a\x26\x72\xab\xec\x68\x65\xac\x59\x76\x20\x9d\xfa\x8c\xe7\x81\xea\x6f\x06\x27\x7e\x5e\x1b\x13\x8d\x50\x2b\x22\x79\x5e\x67\x8a\x16\x4c\xd4\x32\x5b\x7b\x8e\xc2\xf3\x2c\x78\x88\x67\x65\xec\x33\x1e\xdd\x18\xde\xd5\x3c\xdc\xe5\x61\x00\xac\xcc\x13\xbb\x41\x1d\x26\x36\xe4\x6d\x92\x18\xcb\x24\xb9\x28\x58\x7a\xde\xe4\x05\x23\x9a\x37\x44\xbb\xb1\x04\x8a\xa2\xa7\xa4\xcc\xea\x25\x1f\xb0\x5a\x3f\x5b\x6c\x5b\x1b\xb7\xa3\x25\xf5\x08\x81\x32\x14\xc2\xf0\x1b\x06\x92\xbb\xeb\x8d\x2a\x23\x29\x2b\x59\x91\x02\x54\x78\x7b\xd2\x7c\x77\x0f\x26\xbf\xd7\x0a\x1b\x2b\xf8\x4b\x06\x78\x38\x34\xee\xdd\x67\x55\x41\x79\xff\x5c\x13\x20\x6b\xa1\xe7\x0b\x42\x0b\x1f\x21\x39\x7c\xa8\xce\x57\xcf\x42\x9f\x0c\x98\xe4\xa9\x82\x06\x91\xc6\x05\x0f\xbb\x0d\xed\x1b\x0c\xe1\xb3\xdf\x77\xf3\xac\xbc\x28\xdc\xf1\xa1\x7c\x6e\xc0\x9e\x97\x23\xea\xa7\x64\x4f\x98\x11\xce\xb1\x99\xc9\x31\x8d\xfb\x8b\x8c\xeb\x7b\xba\x98\xab\x45\x26\x92\xfb\x28\x24\x91\xef\xf1\xc9\x0d\x4d\xd9\xfc\xb8\x09\x25\xa2\x75\xe0\x81\xe9\xf6\x6b\xc6\xe6\x0e\x39\xec\x06\x42\x0a\x4c\xf7\xfa\xf0\x57\x62\xe8\x84\x4b\x03\xb6\x38\x67\x50\xcd\xb8\x2e\x06\x31\x0d\x22\x24\x13\xaa\xa8\x1c\x05\x2a\xb8\x89\xa8\x2b\x99\xc2\x78\x40\x00\x28\xcb\x99\xa2\x00\x27\x3a\xf9\x4b\xc8\xed\x68\xe6\x6c\xfb\xd0\xe2\x8c\x9d\x7f\x5b\xd2\x25\x11\x85\xe4\x29\x33\xbd\xa7\x7a\x2f\x12\x4f\x19\xa6\x38\xb8\x5e\xfc\xe2\xa7\x4f\xd1\x28\x01\xfa\xd1\x8d\x39\x37\x95\xa9\x49\x8d\x58\xda\xad\x1e\xe0\x9b\xf3\xc2\x39\x44\xa6\xa7\x27\xb3\x05\x2d\x13\x76\xd3\xc0\x7a\x47\x42\x54\x9f\xfc\x70\xf9\xae\xfb\x52\xf7\x02\xfc\x70\xf9\xee\x5f\xa2\xd0\xc6\x32\x61\x2d\xe4\x79\xca\xe5\xfd\xb1\xca\xc6\x6f\xa0\xca\xc6\xd6\xae\x7f\xed\x36\xb4\x63\x89\x8d\x2f\xb8\xc4\xc6\x33\xd1\x28\x72\x50\x43\x67\x99\x8e\x90\x05\x6c\x1d\x09\xd7\x48\x71\x73\xe5\x16\x8f\xd0\x0c\x63\x0a\xf0\xa5\x7e\x7a\xd6\x01\xdd\xb1\x80\xf8\xf0\xee\xf3\x2d\xe2\x13\xe0\x7b\x75\x70\xa4\x43\xfa\xa7\x67\x85\xb6\x50\xbb\xb6\x0b\x14\x3e\xfb\x42\xed\x03\x6c\x8e\xa7\x6c\x27\xa1\x86\xab\x5b\x56\x0e\x70\x86\x0d\x51\x06\x1f\xdd\xb0\x13\x72\xa5\x7f\x10\x92\x43\x1c\x01\x16\xdc\x6e\x2a\x67\x0f\x6e\x3b\x5a\x09\xa7\xe4\xea\xdd\xcd\xed\xbb\xcb\x8b\xbb\x77\x57\x6f\x89\xed\x9f\xbb\x82\xe9\x94\xdc\x89\xd6\xac\x38\xa8\x15\xb4\xf5\xd4\x20\x1e\xb2\x1d\xd7\x99\x21\x9b\xb4\x68\x7d\xb1\x00\x8a\x42\x0b\x72\x5d\x70\xd5\x44\x2d\xf9\x04\xaf\x24\x13\x85\x89\xf7\xd1\x7d\x1a\x8b\xe6\x92\xab\x33\x14\xb3\x0c\xea\xfa\x8a\x75\xbf\x31\xd8\x25\x23\x37\x18\x4b\xd1\xd6\x9a\xdd\x55\x5e\x6a\xe2\x11\x62\xab\x65\xa0\x27\xa1\x8d\xfc\x00\x2e\xb2\x5d\x37\xd6\xe2\x9b\x78\x2e\x51\x8b\x7c\x02\x36\x87\x93\xe9\x89\x15\x8d\xb2\x06\xb7\xc6\x06\xbe\x36\x9f\xeb\x2d\x39\xdc\x36\xe3\x06\xef\x9e\xaa\x29\x21\x1f\x6d\xe1\xd1\x33\x2d\xdd\x6c\x80\xe3\x78\x12\x6d\xec\x48\x5b\x4f\x77\x4f\xff\x96\x6f\xcb\x7a\xee\x0e\xd4\x1f\xea\x03\xbd\x3c\xb0\x22\xc0\x86\xa3\x88\xa0\x1d\x48\xe4\x1e\xde\xb6\x23\xff\x74\xfb\xe3\x7e\x9f\xc6\x7b\x15\xf9\xe1\x4b\x91\xe7\x5c\x91\x15\x95\xab\x26\xad\xaf\x8d\x46\x68\x6e\xf5\xee\x23\x0a\xd1\xb9\x76\xa9\x76\xa2\x75\x98\x30\x1e\x85\x1b\x7f\xf2\x83\x7d\x78\x43\x61\x6b\x7e\xde\x42\x8f\xf7\x51\x90\x0e\x7a\x7c\x28\x88\x6a\x08\x6a\xb6\x19\xff\xfe\xd8\xa7\xac\x48\x11\xd9\x31\xba\x20\x8b\x7d\xe1\x83\x83\x6f\x65\x7b\x41\x81\x05\x26\x9a\x32\x45\x79\xe6\x13\xf8\xda\x15\x54\xa2\x14\x99\x58\x8e\xc3\x73\xee\x59\x84\xdf\x61\x64\xf5\x84\x4e\xf4\xea\xee\x27\xff\xc7\xa3\xc9\xdb\x00\x71\xbd\x10\xed\x9c\x1a\x49\x18\xe2\xb2\xc7\x28\x5e\x2f\x32\xe1\x83\x0a\x60\x9b\xab\xe0\x17\x51\xdb\x02\xc3\xc8\x49\xda\xfc\xe1\x92\x55\x39\x97\x9a\x94\xf4\x4a\x66\x9e\x6e\x9f\xf1\x1c\xed\x23\xae\x35\xb7\x6f\x48\x9c\x1b\x0a\x33\x0d\x10\x38\x4d\x85\x22\x0b\x64\x43\xa1\x31\x38\xc2\x1d\xf2\x56\x56\x6c\xc2\x3e\x73\x09\xb6\x0a\xc8\x5d\x10\x55\xcb\xbd\x87\x3c\x6e\x4e\x05\x0d\x6b\x82\xb2\x06\x2b\x7c\x17\xea\x27\x77\x22\x96\x3c\x55\xf6\xb1\x59\x73\x20\x56\xf8\xcd\xb2\x35\x02\x8a\x42\x36\x32\x1a\x08\xe8\x12\x06\x2d\x2a\x63\x6e\x2f\x2b\xfe\xc0\x33\x36\x5c\x66\x49\xad\x78\xb1\x74\x8a\x07\x43\xa9\x63\x66\xd2\xb0\xd8\xd6\x1c\xf4\xfd\x95\xca\x89\x90\x1b\xe8\x16\x6e\xc1\x87\x8f\x77\xa4\x60\xba\xb3\x15\x97\x7b\x2b\x0f\x7a\x18\x9e\x58\xe3\xc9\x64\x02\xf6\x94\xd3\x7f\x68\xb9\x34\xcd\x5e\x93\x9f\x99\xf9\xba\x16\xcf\xf5\x8d\x4f\x14\x79\x5c\x09\xd0\xa8\x6b\x69\xe6\x15\xda\x47\x5b\xa0\xbf\x48\xed\xbb\xe7\xfa\x7d\x2d\x16\x22\xb3\xeb\xf4\x02\x59\xff\x92\xb4\x9e\xc3\x9d\x65\xd8\xd1\x54\xd7\x9a\x8e\x1b\x61\xcd\x39\x81\x0d\x94\x45\x20\x56\x1b\x32\x5d\xe5\x3a\xcf\x78\x71\x7f\x46\xb8\xb2\xc4\x4c\x9f\x09\x13\xc2\x58\xdc\xdb\xd3\x5a\x31\x9a\x21\x4d\x1f\x47\x7c\x76\xd9\xf3\xbd\xe8\xb9\x1a\x61\x3c\xbd\x5b\x97\x18\xf5\xd0\x90\x02\x13\x08\xb2\x51\x45\x7d\x14\xa2\xf5\x33\xcf\x38\xa8\x18\xef\x48\x49\xb9\x8c\x43\x88\x3a\xb9\x9e\x5d\xce\xae\x37\x0a\x79\xe1\x6f\x1d\xb3\xbe\xa5\x87\x03\x33\xdd\xcd\xac\xef\x87\x05\x1a\x32\xeb\x0f\x31\x44\x98\xf2\xfe\x92\x65\xb2\xa2\xe5\x45\xad\x56\x57\x5c\x26\xe2\x81\x45\x2b\x35\x16\x36\xcc\x98\xd6\x09\xb7\x8b\x88\xbd\x90\xcb\xbf\x5e\xdc\xc4\xd6\x10\x89\x09\x27\xb0\xe3\x9c\x31\x39\x42\x03\xea\x1f\xa5\xe9\xe3\xe0\x63\x3c\x3a\x43\xbe\x22\x67\x08\xdc\x9f\xaf\xdd\x01\xc2\x0b\xae\x38\x55\x22\x90\x03\xd8\xb5\x0a\xd4\x52\x89\xdc\x5c\x85\x6b\xdb\x01\x38\xb6\x81\x19\x77\xfa\xf4\x73\x64\x07\x47\x98\x83\x76\x95\x48\xde\xa0\xed\x6d\x84\x61\x9e\x91\x82\x3d\xe2\x57\xbd\xdc\xc9\xbe\xfd\x67\x13\x44\xab\xcf\x2a\xcd\xfe\xf2\xf6\xcf\x8e\x1b\xe5\x2f\x4d\x3a\xb6\x49\xd2\xf5\xf4\xd8\x42\xd7\x41\x1d\x83\xfd\x0c\x1e\x84\xf0\x5f\x62\x69\x8f\x31\xdd\xe1\x3a\xff\x67\x4d\x33\x5c\xa9\x0f\xfb\xda\x9f\xba\xab\x1c\x39\x18\xbb\xdb\x76\x75\x3f\x34\x16\x80\x5a\x32\xe0\x82\xf8\x84\xaa\x68\x21\xf5\x92\xc7\x02\x3f\x9d\x18\xa7\xd7\x09\x39\x55\x49\x19\x44\x7d\x3a\x50\x48\x3c\x0e\xd6\xac\xf0\x8f\x4d\x28\xfc\xf0\xd7\x0f\xe8\x21\x82\xf3\x18\x6b\x88\xe9\x0c\xf4\x06\x5e\x25\x3f\x72\xa9\x30\x02\x13\xfb\x82\x42\x59\x10\x18\xed\xf3\xe4\x15\xe4\xfa\x06\x60\x39\xcb\xff\xa6\x69\x5a\xbd\x45\x7e\x66\xc1\x48\x2a\xd0\xde\x44\x53\x0c\x2f\xa2\x7a\xd2\xa9\x5a\x97\x3c\x01\x55\xed\xee\xf2\x06\xfa\x90\xe4\x4f\x7f\x44\xf4\x84\x7f\xff\xc3\x1f\xdf\x78\x36\xf3\xb9\x22\xd5\x47\xda\x3b\x9e\xd1\xdf\xb4\x97\xa0\x30\x36\x36\x12\x04\x95\x59\x5b\x67\xcd\xdc\x55\x3c\x55\x7a\xbb\x1a\x9a\x1d\x2b\xce\x1c\xe3\xfb\x5e\x14\xb7\x0f\xb7\x0e\xe9\xc1\xee\x94\x04\x89\xc8\xcd\x06\x11\x21\xde\x52\x98\xbb\x10\x11\x87\x54\xf8\x04\xa6\xb1\x44\x64\x6f\x6d\x91\xff\xd2\x3f\xd3\x89\xe6\x24\x03\x7f\x71\x57\x7e\x17\x4d\x73\xf8\x4a\x74\xaf\x02\xd2\x0f\xad\x13\x3a\x1e\x3b\xc8\x00\xb8\xfa\x30\xfb\xef\x1f\x2f\xbe\x7b\xf7\xa3\xa9\xe9\x00\x21\x04\x08\xaf\xe6\xf1\x40\xee\x12\xf5\x15\x7f\x93\xfa\x4f\x7d\x60\x83\x8a\x38\xcf\xcc\x87\x8d\x7a\xbe\x05\xf9\x30\x58\xcc\x77\x64\x4e\xfb\xbe\x36\x9c\x62\x31\x30\xf3\x27\x30\x82\x59\x0b\x2b\xfb\xdc\xcd\xea\xd0\x8b\x21\x59\x05\xc8\x8f\x4f\x66\xba\x19\x9c\x28\x79\x01\xbf\x83\x9e\x31\xae\x02\xaa\x7e\x9e\x19\xef\xe6\x71\x78\xd1\x75\x0c\x71\xfe\x2a\x3e\x15\xea\x64\x06\x4f\x5b\xaf\x95\xbe\x25\x18\x6a\x54\x69\x32\xae\x09\x38\x93\x32\x0c\x62\xb2\x79\xc2\x5e\xec\x1c\xed\x6c\xfd\x9b\x98\xf1\xef\x42\xb0\xdb\xa8\x1e\x24\xc9\x97\x19\xe5\x03\x28\x14\x1b\xb7\xb6\xef\x45\xfc\xe7\x0c\x8d\x84\x1d\x57\x4c\x93\xa7\x32\x44\xc4\x05\xa1\xa4\xb7\xcf\x26\x9e\x81\x1a\xf5\x16\xf0\x00\x23\x4c\x1f\x63\x76\xb0\x5d\x86\x89\xdd\xcc\xf6\x27\xfc\x25\xd1\x83\xd9\x99\x20\xc2\xdb\x63\x82\xe7\x2e\xed\x0b\x9b\xb9\x7e\x03\xcb\xe4\x97\xd7\xb7\x17\xd0\x16\x0c\x2f\x85\xcd\x69\xec\x40\xdd\x1f\x9c\x46\xec\xb9\xc2\xe4\x49\x28\xf1\xcf\x23\x73\xbe\xc2\x5a\xff\xfe\xfa\x4f\x88\x0c\x34\x27\x69\xa7\xeb\xbe\x12\x4a\x14\xa3\x03\xff\x6f\x7a\x5e\xeb\xde\x6f\x7c\xe2\x12\x53\x53\xb2\x61\xf3\x40\xd3\x05\xc6\x71\xf6\x95\xdb\x1d\x2c\xac\xbb\xe3\xd5\xfb\x57\x4d\x52\x3d\x18\x24\x44\x4c\x28\x49\x1a\x9d\x0e\x73\x7d\x65\x84\x39\x9b\xf2\x22\xcd\xe1\x20\xed\xe9\x70\xce\x81\x67\xbe\xde\x18\xfc\xfd\xd9\x69\xba\x5b\xd5\x4b\xbd\xa1\x8f\xa2\x8a\x4f\x4a\xbf\xe9\xbc\xb0\x11\xa1\x60\xfe\xb6\x99\x33\x36\x24\xe2\x7f\x29\xb7\x64\x06\xee\x56\x67\x2a\x7d\xde\x14\x7b\x77\x3c\x5b\xdc\x77\xa9\xa2\xae\x8e\xa7\xcf\x9e\x4b\x85\x57\x27\x7c\x65\x7c\x1c\xef\x70\x97\x69\x24\x93\x8a\x4d\x70\x0e\x01\x28\x8d\x4d\x70\xde\x4b\x92\x1f\x59\x69\xf7\x27\xf3\xb8\x51\xf8\xf5\xfe\xb4\xe4\x83\x36\x57\x28\x14\x8a\xf5\xa2\xe5\x70\x9b\x0a\x96\x11\x34\x01\xf1\xc9\x17\xa2\x02\xd8\x2a\x8e\xe9\xcb\x2d\x24\xa7\x49\x51\x3e\x33\xc5\x27\x72\x5a\x0e\x82\x4d\x6a\x92\xe0\x42\x9b\xef\x78\xfd\xc7\x23\xf4\xbf\x0f\xc1\xf2\xbb\xe0\xfb\x51\x24\xc0\x03\xcb\xdf\x0b\xb5\xef\xe9\x74\x08\x84\x3f\x00\xb5\xef\xe9\x71\x2c\x44\xb1\x03\x41\xec\xe9\x35\x1a\x9c\xb8\x05\x1f\x7e\x06\x27\x8e\x39\x86\x91\x07\xc1\x02\xec\xdb\x60\x51\xbc\x06\xde\xea\x04\xe3\xa0\xf5\x6f\x9a\x1e\x71\xa5\x0d\xb6\x40\x5b\xdf\x96\x66\xa2\x58\x86\xd1\x7c\x85\x1b\xec\xc0\xd2\x26\x96\x60\x5d\x7a\x8d\xe5\xb1\xa8\xb3\x81\x72\xd8\x03\x93\x73\x21\x17\xda\x0a\x1d\x6d\x5d\x6c\xc8\x97\xf6\xa6\xdb\x35\xa3\x0c\xa2\x91\x8f\x43\xd0\x0d\x6e\x52\xef\x7c\x22\x2a\x1d\x47\x74\x49\xdc\x6a\xc8\xe1\x9a\xc7\x51\x3d\xf6\xd7\x45\x76\xa3\x4a\x36\xaa\x1f\x47\xf5\xea\xaf\x90\x8c\xbd\xf7\xd4\x41\x8e\xea\x5b\x85\x6a\x25\xf7\x54\x44\x8e\xea\x38\xa6\x6a\x72\x53\x1b\x39\xaa\xc7\x51\xf5\x93\xa3\x27\x3f\xaa\x92\x72\xdc\xb1\x72\xaa\x2d\x07\x6b\x2a\x47\xf5\x38\x50\x77\x79\xa8\xba\x72\x54\x9f\x31\xb5\x4c\xc9\x98\x2b\x3a\xba\x2a\x73\x54\x9f\x24\xaa\x76\x73\xdb\xc6\x50\x1f\x6c\x11\xf5\x9c\xdb\xb6\x67\x65\xe7\xb6\x8d\x02\xa2\xc6\x16\x53\xe8\x61\x60\xa4\xfe\x92\x0f\xd1\x7d\x12\xa7\x38\x84\xbf\xf8\xc3\x88\x2e\x07\xca\x44\x0c\x94\x81\x18\xd1\xb1\xa7\x60\x84\x5b\x10\x62\x54\x8f\x87\x29\x1d\xd1\xb6\xe8\x22\x12\x23\xfa\x1c\x57\x3c\x69\xb3\x8d\x29\x2c\xd1\xb6\xf8\x12\x13\x6d\x8b\x29\x36\xd1\xb6\xf8\xda\xd3\x63\x8e\x73\x53\xa5\x3a\x50\x85\x7a\x44\x9f\xbd\xf5\xaa\xdb\xb2\x5d\x9d\x7a\xd4\x23\xba\xf5\x56\xae\x1e\xd9\xdb\x68\xe2\x13\x0b\x32\x8f\x2d\x54\xb7\xda\x7d\x32\x90\x74\xd0\xb6\xe8\x7a\x38\xee\xe3\xbe\xc8\xa6\xb6\x85\x83\x6c\xb0\x7d\xc9\xa1\x36\xd8\xc6\x06\xdc\x44\x75\x1a\x0e\xca\xc1\x36\xea\x54\x85\x6b\x65\xb7\x6d\x74\xd5\xec\xa8\x69\x35\x95\xb5\x63\xea\x67\x6f\xce\xd2\x6f\x99\xea\x3e\x1b\x71\x66\x83\x95\x18\x9d\x47\xc3\x9a\x9d\xd3\x1b\xe8\x76\xc1\x59\xb5\x02\xcc\xcb\xeb\x76\xdb\x55\xf5\xb6\xca\xde\x45\x6d\x6f\x24\x27\xd8\x55\xbc\x0d\xd5\xe2\x8b\xa4\xc5\x1b\x68\x88\xfe\xaa\x7c\xb1\x7c\x35\xa2\x76\x9f\xf3\xf4\x68\x81\x39\xb6\x9e\x5f\xdb\xe2\x2b\xfb\x8d\x12\x45\xb1\x06\x60\xa0\xc6\xdf\x88\x1e\xf7\xa9\x06\xd8\xb6\xf1\x0b\x4a\x46\x57\x08\x6c\x5b\x5c\xad\xc0\x51\x5d\x92\xb6\xb2\x60\xb0\x6a\xe0\xc8\x8e\x47\xd4\x18\x74\x5e\x1a\xaf\x2a\x91\xb1\x75\x07\xdb\x16\x5b\x81\x70\xe4\xcc\x6d\x80\xc4\xae\xb5\x08\xdb\xb6\xd3\x72\x8c\x13\xe0\xc8\xa8\x4a\x85\x9b\x43\x8b\x96\xd1\xc8\x51\xa9\x3d\x2a\xb5\x91\xed\x37\xa0\xd4\x86\x6a\x29\x8e\xd4\x41\x3b\xa0\x68\x43\x55\x15\x47\xf4\xb9\x5d\x7f\x71\xb0\xbe\xe2\x18\xb5\x76\xb0\x12\x63\xb7\xd2\xe2\x48\xc1\x20\x58\x93\x31\xb2\xe6\xa2\xd3\xeb\x78\xb2\x3b\xb6\x0e\x63\xdb\xc6\x57\x64\x1c\x73\x95\xb4\xbc\x14\x5f\x9b\x71\x44\xcf\xdd\x2a\x8e\xe1\x2a\x8d\x63\xe4\xa3\x1d\xeb\x39\xb6\x6d\x37\xb9\x6c\x74\x8d\xc7\xb6\xc5\x55\x7b\x1c\x29\x47\xb8\xb5\x21\x77\xaf\xfb\xd8\xb6\x1d\x85\xab\x11\xb5\x20\x9d\x97\x22\xab\x42\x8e\x5c\x12\x73\x17\xfc\xf5\x21\x47\xf6\x19\x57\x4d\xb2\x6d\x3b\x2e\xe3\x98\x0a\x93\x6d\x3b\x6c\xad\xc9\x3d\x27\xb1\x8b\x64\x19\x59\x89\x72\x73\x64\x23\x04\xcb\xb1\x06\xcb\x97\x37\x43\x46\x77\x8c\x81\x3b\x07\x30\x13\x99\x7a\x07\xc6\xfb\xff\xe5\x58\x80\x9e\xd1\xbb\x6f\x32\x3a\x03\x18\x8b\x6d\x1b\xe3\xda\x8f\xb7\x3e\x1c\x5d\xfb\x4f\xe3\xda\x9f\x99\x5a\x1d\x47\xbf\x7e\xef\x6c\x8e\x7e\xfd\xb6\x1d\xfd\xfa\x47\x13\xc8\xd1\x04\xb2\xdd\x8e\x7e\xfd\xce\xb4\x8e\x7e\xfd\xa3\x5f\xff\xe8\xd7\xf7\xb5\x83\xfa\xf5\x8d\x78\x8e\x4e\xfd\xe8\xc3\xf7\x85\xf8\xf4\x4d\x95\xac\x8b\x24\x11\x75\xa1\xee\xc4\x3d\x0b\xba\xf6\xa2\x94\xb6\xad\x5e\x83\x13\x7c\x3a\x0d\x8f\xd6\x29\xd7\x9a\xd4\xe8\xdd\xbe\x30\x2f\x5a\x25\x47\x73\x98\x22\x65\x69\xd3\x63\xac\xc9\x57\xbf\xac\xf4\x2a\x4c\xc9\x05\xa9\x58\xc2\x4b\xce\xb0\x0c\x3e\xc5\xdf\xf1\x38\xd8\xf2\x1e\x91\x82\xbe\x64\xd9\xc2\x14\x46\x28\x9c\xc2\x5a\x8e\x6e\x62\x48\xbf\x1d\x6e\x54\xbf\x86\xa8\xc0\xb0\x50\x1c\x10\x16\xa5\xdf\x56\x1c\xab\xd8\x3f\x8c\xc4\x11\x37\x7b\x9c\xf9\x9d\x33\x12\xd7\xe8\x85\x4b\x1b\x53\x17\x6c\x6b\x90\xb4\xe4\x06\xb1\xe0\xd0\x14\x82\x7d\x2e\x79\x05\xc7\x7a\xc6\x12\x51\xf8\xea\x20\xb7\xad\x73\x78\xde\x6d\xf6\x60\x4f\x91\xb1\x2f\x47\xaa\xb1\x69\x5d\x35\x75\x8f\x1f\x68\xc6\x53\xae\xd6\x8d\xeb\xdc\x94\xb8\xa3\x78\xcf\xcc\x42\x47\x75\x7b\x21\xdb\x5d\x26\xb4\x2c\x2b\x41\x93\x15\x93\xce\xbc\x51\x06\x36\x99\x95\x51\x7d\xda\xbc\x17\x2c\x1e\x09\x02\x30\xf4\xab\xe5\xa4\x6c\x4d\x2a\xa1\x6c\xd8\x88\x19\x78\x9c\xfa\xd9\x99\x1c\xaa\x3d\x38\x28\xfc\x04\x8a\x24\xaa\x5a\x43\xfc\x49\x9c\x09\xd5\x19\x0a\xae\x00\x5f\xb8\xff\x23\x89\xc8\x52\x0b\x6e\xf4\xa7\x37\x71\xaa\x1f\xab\x12\x73\xa7\x41\xbd\xe1\x39\x58\x38\x33\x2d\x23\x6a\xd6\xd0\xfd\x40\xdc\x21\x6f\x07\xf1\x87\x6f\xc9\x4a\xd4\x95\x9c\xba\x39\x90\xdf\xc0\x6f\xa8\x9f\xc7\x7a\xc9\xb4\x60\xa9\x48\xc6\xa8\x54\xe4\x9b\x37\x24\xe7\x45\xad\x45\x83\x88\x77\x1d\xd1\xfc\x8f\xdf\x46\x5f\xb7\x58\xa1\x3c\x56\x1c\xdf\x0e\x7c\x30\xb7\xaa\x44\xd0\x73\x23\x95\x1b\xaa\x12\xca\xba\x75\xbe\x0f\x05\x0f\x36\xfc\x90\x86\x15\xb9\x3b\x57\x28\x71\x60\x5a\x13\x2b\xdd\x46\x49\xab\x91\x7c\x3f\xea\xb1\x90\x10\x1b\x4a\x21\x35\x0e\x8e\xde\xbf\x06\x06\xf0\x4b\x2d\xe6\x6b\x15\x93\x53\xfe\x9f\xf8\x64\x37\x99\xdc\xfe\xd8\x0f\x1e\x35\x30\xe1\x4e\x2d\x8f\x16\x3b\xaa\xf7\xe9\xb0\xf4\xb1\xd4\xda\x74\x64\xde\x20\x68\xde\x56\x1b\xb4\x66\xda\x24\x61\x58\x73\xf8\xaa\xad\x16\x57\x08\xec\x37\xb0\x65\x87\xcc\xb9\xf6\x22\x34\xd9\x75\xb6\xf9\x83\x3e\xe2\x7b\xf8\xba\x10\x31\xf2\x70\xc5\x96\x5c\xaa\x11\x25\x78\xf0\xf1\xee\x71\x92\xbc\x58\x62\xc9\x84\xbc\xce\x14\x2f\xb3\x66\xe6\x9e\xf9\x36\x5d\x19\x5e\xe7\x9a\x8c\xa9\x63\x9b\xa4\x08\x5a\x80\x10\x7b\x01\xb7\xc1\x69\xf3\x7d\x56\x28\x44\xea\xaf\x34\x33\x2d\x69\x45\x9b\x85\x85\xa2\xe4\xf2\xb5\xb1\x4b\xd3\xc4\x1b\xfe\x66\xb0\x6f\x34\xe7\xaa\x68\xd6\x2c\x97\xeb\xc0\xdd\xe7\xb0\x29\x56\xd0\xc2\xe3\x05\xea\x9a\x55\xe0\x61\x22\x1e\x6d\x24\xa9\xa9\xc4\xb4\x71\xca\x82\x29\xcf\xdf\xd1\xe4\x9e\x15\x29\x94\xd3\xc3\x25\x49\xd7\x05\xcd\x0d\x86\x69\x53\x74\x8c\xa5\x1b\x3d\x0f\x66\x96\xeb\x86\x56\x46\x4c\x99\xb6\x40\x0c\x81\x4a\xe0\x11\xeb\x53\xcb\x68\x90\xaf\x4f\x52\xcb\x02\x7e\x1a\x21\xd1\xa7\x5a\xf1\x87\x84\x19\xb1\xc9\x33\x25\xfd\xf1\x7d\x06\xff\xe0\xc1\xfd\xd8\x1a\xbe\xc1\xfc\xe0\xce\xc9\x07\xe3\x65\xe3\xe6\x02\xc4\x3f\x9a\x69\xb2\xe0\xd3\x7f\x6c\x62\xfd\xc6\xa1\x98\xaf\xf7\x2d\xd8\x15\xae\x51\x85\x57\x63\xe0\xcf\x1e\x3c\x86\x00\xaf\xab\xe6\x31\x38\x09\x27\xb7\xdf\x5d\x75\xa9\xd2\x2d\x4d\x85\x24\xdf\x65\x22\xb9\x27\x57\x0c\xf4\x00\x97\xdf\x0d\xac\xc4\x26\x84\xe2\x9e\xb5\xab\xaa\x79\xba\x7f\x6d\x81\x23\x1e\xfe\x57\x84\x87\x5f\xcd\x7d\x0b\xf0\x75\xa0\xe1\xe7\x74\x19\x5f\x4e\x45\x6b\xec\x70\xd5\xe0\x35\x0b\xd3\xba\xe3\x15\xf9\xdd\x4a\x3c\x4e\x94\x98\xd4\x92\x4d\xb8\x27\xf0\x25\x62\x16\xf7\x6c\xad\xff\x1a\x3b\x8f\xbf\xe1\xe3\x1d\x75\x49\x09\x70\x3c\xc0\xef\x9a\xe3\xdf\x7e\x77\xa5\xd9\x4c\x0c\xba\x1b\x97\xe4\x9c\xa9\xe4\x3c\x61\xe5\xea\xdc\x0c\xe5\x8b\x58\x96\x5c\x14\x5c\x89\x2a\xba\x02\xde\x05\x49\x44\x96\x19\x54\x0d\xb1\x20\x97\xac\x5c\x35\x9d\x3c\xfd\x8c\x9e\x0b\x21\xbd\x14\x22\x16\x41\xda\x39\xf2\xfa\x2d\x73\xe2\x9d\x8d\xaf\xe6\x63\x09\xcc\x73\x1f\x82\xaf\xac\x00\xf1\x13\x2c\xcf\x61\x81\xe5\x4f\x66\xf6\x05\x50\x43\x1d\xdf\x53\x17\x47\xde\x74\xec\x59\x21\x97\xcc\x90\xeb\x05\x8a\xe3\x29\x4b\x89\x78\x60\x55\xc5\x53\x26\x49\x43\x4d\x5c\xcd\x97\x67\x07\x2a\x10\xb8\xd3\x9a\x1e\x61\xf0\x5f\x14\x06\x7f\x84\x9a\xe4\x10\x2f\xfd\xd6\x36\xf1\xa2\x69\xce\x8b\x91\xb0\xae\xcf\x4b\xbe\x82\x70\xf6\x5a\x0e\x19\xf8\x9b\x65\x5c\xbb\x28\x22\x32\xa1\x19\xbb\xfe\x18\xa1\x8c\xcc\xf0\xc9\xae\x3e\x62\x7f\x74\x90\x4d\x77\xc2\x72\xfc\x5b\x73\xd8\x49\x21\xd2\x21\xdb\xf4\x6f\x17\xed\xd4\x39\xcb\x08\xe6\xb8\x0f\xa3\x5c\x52\xc5\x1e\x69\x74\x95\x71\x3b\x95\x2e\xa6\x78\xb3\xf5\x17\x37\xd7\xe4\x07\xec\x71\x3f\x90\xd5\x4a\x28\x94\xc8\xae\x44\x4e\x79\x74\x25\x25\x07\x1c\xda\x1d\xd6\x4d\xd3\x1d\xc1\xfe\x34\x17\x0a\xe8\x19\x88\x3b\x56\x6b\x3d\xcb\x68\x40\x47\xa4\xcb\x03\x0b\x15\xad\x4c\xe1\x18\x81\x6c\xa8\x6f\x5b\xc4\xc6\xec\x62\xc0\x90\xd5\x3a\xaa\x89\x64\x85\xe4\xe0\x05\x72\x82\x13\x4c\xfd\x50\x2c\x3e\x8b\x91\xba\x28\x78\xf8\x6e\xde\x8f\x62\xc9\x0b\x7b\x6f\x85\x71\x69\x2e\xa8\x4f\x16\x39\x4a\x0a\x2f\x2a\x29\x48\x99\xbd\x2b\xe8\x3c\xf3\xb9\xd3\xba\x84\x3f\xa3\x4b\x7d\xe8\x18\xbc\x75\x9e\x72\xa9\xff\x4b\x66\xb3\x1f\xc1\x90\x5e\x17\x56\xb2\x0d\x84\x36\x1b\xb2\xd7\x64\xf3\xe0\xb5\xdd\xef\x3e\x21\xdd\x19\x81\x44\x7a\x5d\xa4\x7a\xb8\x4c\x76\xe2\x93\x4c\x3f\x08\xb2\xda\x84\x98\x43\x24\x87\xdf\x5f\x73\xb7\xe2\xc9\xfd\x8d\x63\x2f\x17\x95\xfe\xad\x70\x7e\xea\xb0\xa3\xcd\xbf\xed\x43\x30\xcd\xa0\x6f\xe2\xd5\xd6\x3b\x87\xe2\xcf\xcc\x94\xf5\xeb\x84\x4a\x29\x12\xde\x3a\x48\x02\x80\xa9\x2d\xb3\x48\x81\x59\xec\x37\x0d\xe0\xf4\x3b\xf2\x2f\xbb\x71\xb6\x30\xb6\x74\xb8\x92\x5f\x09\x35\xeb\xb0\xd7\xd0\xf1\xa0\x8c\xa8\xd4\x70\xd7\xa9\xcd\x60\x65\x3f\xb4\xe8\x37\x76\x7b\x63\x01\x0c\x13\x75\x2b\x8d\x99\x72\x38\xdb\x9b\xd8\xd4\x68\x30\x8e\xe6\x27\xb4\xfd\x1b\x29\x69\xe0\xaf\x0d\xdf\x1b\xfa\xfb\xb0\xcc\x18\x92\xc8\x3d\x49\x54\x7d\xfa\xf9\x86\xdb\x12\x7f\x33\xc6\x7e\x08\xdc\x2a\x45\x59\x67\x74\xd0\x6f\xb9\x55\xf8\x62\x8f\x12\x30\xf8\xf5\x5d\x5d\x02\xe3\x51\x98\xfd\x49\x06\x5d\x40\x66\xbf\x05\xdf\x42\x35\xc7\x01\x32\x87\x21\x46\x94\x20\x6f\xfe\xf8\xed\xb7\x43\xe0\xcd\x83\x10\xcd\x5e\x09\xd5\x07\xde\xec\x83\x68\xf6\x76\xea\x05\x6f\x1e\x4a\x11\xf0\x39\xeb\x86\xc1\x9b\x87\xc5\x81\xc3\xa1\x37\x07\x6c\xab\x63\xf3\xf9\xdc\x5c\x3d\x9f\x85\x2b\x9c\xc5\xd7\x9f\xdf\xe6\xe9\xd3\x93\xbb\xe7\xcf\xcb\xf3\xf5\xd9\x93\xb1\x17\x99\x8d\x17\xd0\x9d\xda\x40\x87\x43\xe5\xe0\x8d\xca\xbc\x73\xb3\xea\x02\x23\xf5\xe7\xdb\x0d\xe4\xd2\x79\xfa\xec\xcf\xb2\x0b\x67\xd0\x79\xba\xec\xe4\xd6\x05\x32\x2d\xc6\xa1\x89\x87\x73\xe4\xa2\xb2\xdf\x62\x23\xb1\x23\x32\xdd\xf6\xcc\x6f\x8b\x0e\xba\x8b\xc9\x65\x1b\xc3\x5c\xda\xbc\xb4\x40\xa7\xc4\x9f\xb7\x36\x94\x8d\x16\xec\xb5\x3f\x5b\xcd\x97\x83\x16\xec\xd2\xcf\x46\x76\xcb\x3c\x8b\xce\x37\x73\x58\x46\xb0\xd3\xe8\x2c\xb3\x31\xb9\x65\xf1\xc1\xab\x31\x81\xab\xf1\xd9\x63\x4e\x4e\x58\x70\xe2\xfe\x9c\xb1\xfe\x4c\xb0\xa8\x93\xb4\x9d\x29\xe6\xcf\xff\x0a\x76\x1a\x93\x1f\x16\x79\x79\x63\xa2\x65\x43\x19\x60\xc1\x48\xda\x83\x84\xc7\xc6\x64\x19\x8d\xcf\x2d\x6a\xb8\x8b\x97\xca\xfb\x53\x8a\xe2\x8d\x79\x63\xea\xf4\xb9\x36\x2a\xa3\x7a\x58\x01\x17\x03\x8c\x5a\xd0\x42\xaf\x04\x51\x0f\x38\x49\x0f\xa5\x7c\x90\x98\xc3\x16\x52\xcc\xf0\x7b\x22\xa6\xb0\xad\xb1\x45\x7c\x9c\x6d\xb8\x4b\x9a\x9f\x8f\x5e\x92\xaf\xbc\x26\xdc\xd1\xb8\xbf\x3d\xc9\xd6\xb8\x2f\x3b\x10\x4a\xd6\x28\x81\xb2\xd3\x42\x54\x44\xcc\x0d\x78\x6c\x40\x56\x6f\x2f\xcc\xc5\xcd\xb5\xd6\xe7\x21\x63\x8c\x66\x72\x4a\x7a\xf2\xf7\x8d\x18\x14\xd2\x7f\x5a\x0d\x87\x2a\xc5\xf2\x52\xf9\x8e\xc2\xd1\xb6\xff\xa2\xb6\xfd\xd1\x06\xc9\x9f\x9a\x17\x9a\xd2\xc8\x75\x4e\x8b\x89\xbe\x6d\x60\xe5\x77\x8c\xad\x9e\x19\x6c\x52\xea\x29\xb1\xd1\xcc\xb0\xa0\x60\xba\x81\x44\x86\x4e\x8d\x76\xe2\xb3\x11\xb4\xd5\x7b\x0f\x63\xa1\x85\xbe\x46\xaf\x0a\x32\xe3\x8d\xfb\x99\x88\xcd\x98\x5a\x2f\x09\x82\xa9\x36\x2b\x64\xaf\xa2\xc3\xeb\x3b\x1a\xbb\x5a\xb1\x50\xf4\xfe\x0d\x64\xdf\xb4\xef\x77\x75\x18\x54\x62\x68\x96\x89\x47\x1c\x6f\xcb\x07\x03\xcb\x0d\x33\xc3\x14\x41\xc8\x45\xe1\x5a\xd1\x37\xd6\x64\x77\x0a\x40\x93\x94\xd6\x92\xbc\x82\x3f\xa8\x06\x95\x71\x2d\xce\x98\x72\x0f\x9b\x56\xa3\x0b\x0c\x48\xd7\xff\xb6\x91\x4d\x81\x89\x5b\xc7\xd1\x9c\xad\xe8\x03\x17\x75\x85\xfd\x2a\x41\x5e\x99\x3f\x01\xd3\x5a\x8b\xba\x31\x16\xd6\x81\x80\xd9\x66\x15\x65\xcf\x4e\x7d\x68\xff\x08\xca\x5c\x2a\xac\x1d\x65\xc2\x3e\x73\x6f\x3a\xe1\xd6\x9a\xd9\x4d\xb2\xa8\x9d\x4f\x26\x78\x3d\xc8\x52\x73\xc5\xe8\x92\xa3\x3f\xb9\xcf\x77\x05\xb0\x87\x19\xfc\xe9\x6b\x2b\x38\x7a\x14\xc1\xfa\x5a\xe3\x2e\xcc\x78\xb2\x8e\x2e\xb6\xd9\xba\x09\xf5\x6b\xe4\x3b\x2a\x59\x4a\xde\xd3\x82\x2e\x51\xf7\x3d\x9d\xdd\x7c\xf7\xfe\xb5\xde\xc2\x80\x79\xe3\xfa\xaa\xcf\xcb\x68\xfb\xc7\xee\x3f\xec\x97\x9f\xb2\x31\xc7\x11\x6c\xf0\x60\xb3\xdc\x33\xc3\xc6\x32\x2c\x3f\xda\xf9\x76\x82\xef\x66\x11\xe5\x8d\x8b\xfb\x90\xa7\x4f\x58\x1c\xb9\x1d\xf2\x78\x72\x35\xdc\xf7\xa4\x1f\x76\xcf\xd3\xdb\x90\xb5\xe1\x91\x66\x97\x22\xd7\x64\xad\x0f\x95\xbf\x0b\x48\x00\x21\x0e\x98\x6c\x81\x8f\x5b\x3e\x0f\x9a\xc7\x84\xae\x18\x4d\x49\x26\x96\xa6\x0c\xfe\xac\xa0\x65\xd9\x13\xc8\x05\x2c\x78\x91\x51\xc8\x25\xc0\xb2\x06\x0f\x94\x67\xd0\x39\x2f\x2c\x5c\x3c\x04\x87\xdd\x54\x22\x67\x6a\xc5\x6a\x49\xfe\xf2\xbf\xc8\x1f\xa6\xdf\x7c\x33\x7d\xb3\xd9\xe1\x90\xf6\xd1\xbb\x18\x52\x51\x55\x77\x28\x69\x57\x98\x7e\xaf\xe9\x57\xc5\x30\x13\x7f\x0e\xd8\x10\xa9\x79\xc9\x4e\xd6\x19\x53\x92\xd5\x52\xb1\x0a\x55\x2e\x48\x46\xed\x0e\xee\x83\x50\x84\x17\x49\x56\xa7\xe0\x6d\x60\x85\xc5\x6e\x80\x84\x89\x4a\xe4\x5d\x10\x8a\x33\x5c\x8d\xe6\x0f\xed\x97\x3a\xbd\x7e\x04\xf2\x2a\x2a\xd0\x63\x10\xc5\xa3\x57\xde\x5f\x72\xb5\xaa\xe7\xd3\x44\xe4\x8e\xe8\x7f\x6e\xa2\x52\xd4\xfa\x7c\x9e\x89\xf9\x79\x4e\xf5\x0c\xb4\x22\xa0\x2a\x3e\xaf\x95\xa8\xe4\x79\xca\x1e\x58\x76\x2e\xf9\x72\x42\xab\x64\xc5\x15\x4b\x54\x5d\xb1\x73\x5a\xf2\x49\x22\x8a\x07\x7d\x91\x44\x21\xa7\x79\xfa\x3b\x4d\x7c\x27\xb4\x48\x27\xb8\x44\xae\x1c\x3f\xc4\xb7\x9a\xbd\xbe\x65\x9a\xbc\xd3\x2d\xb6\xd6\x35\x76\x0a\x45\x33\x52\xd4\xf9\x9c\x55\x10\x17\xd0\x9c\x94\x52\xa4\x12\x15\x5f\xcc\x36\x6d\x50\x09\x72\x5e\xe8\xed\x58\x1b\xd4\x8c\x6d\xf8\x65\x45\xab\x25\x73\xab\xd8\x3a\x3b\x9a\xb2\x32\x13\xeb\xbc\xc7\x9d\xe4\xb3\xfe\x0e\x5b\x7b\x4b\xaa\xe5\x4e\xef\x14\x6f\x5b\xa1\xc2\x5a\xee\xb4\xf4\x47\xb1\xf2\xab\xcd\x3e\xaf\x8b\x94\x55\x19\x05\x90\x8a\x1c\x68\xef\xb6\xa4\x61\xd4\x35\x10\xef\xe6\x4c\x3f\x59\xb2\x4a\x8f\x5b\x4b\xbe\xa0\xda\xa7\x5a\xe8\x60\x4d\xdf\x8d\x77\xae\x79\x2c\xf2\x6e\x69\xda\xb4\xc3\xee\x15\xa2\x98\x28\x56\xe5\xbc\x00\x3e\x07\x5b\xe8\xd9\x8d\xad\x09\xb6\xbb\x43\x4e\xd5\x8a\xf1\xca\xd4\x40\x21\x39\x55\x89\xb1\x28\x03\x22\xb0\xa8\x5e\x1f\x66\xff\xea\x62\xbf\xf3\xea\xbc\xbf\xcf\x74\x0f\x34\x99\x32\xd5\xeb\xbe\xd3\x44\x0e\xb8\x75\xc0\x8f\x57\xf4\x01\xcd\x4e\x29\x93\x9a\xc7\x59\xb2\x0f\xca\xde\x21\xa6\xdb\xc7\x3c\x27\xdb\xd4\xa7\xf3\x57\xbc\xad\x9d\x9f\xaa\xbe\xe7\x7a\x4e\x45\xf7\xef\xdd\x85\xf6\x33\xa5\xcd\x81\x4e\x60\x09\xfe\xad\xf7\x79\xb3\x48\x6f\xc9\xc3\x37\xed\xff\xc1\x46\x4e\x0c\xe0\x3a\xfc\x01\x61\xb9\x58\xfa\x96\xa8\xaa\x46\x31\xc1\x08\x7f\xe6\x97\x96\x0d\xd2\x24\x61\xa5\x62\x29\x68\x73\x38\x84\x7b\x5e\xa4\x6f\xc9\x2b\x84\x06\x2f\xb3\xba\xa2\x99\xf9\x5f\x4d\x50\x39\x90\x8e\xb7\xe4\xff\xfe\xbf\x7f\xc3\x5e\x59\xfa\x93\x1d\x87\xfe\xf1\xff\x07\x00\x00\xff\xff\xf5\x38\x0c\x17\x32\x52\x05\x00") func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYamlBytes() ([]byte, error) { return bindataRead( @@ -137,7 +137,7 @@ func examplePrometheusOperatorCrdMonitoringCoreosCom_prometheusesYaml() (*asset, return nil, err } - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml", size: 346389, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml", size: 348722, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -182,7 +182,7 @@ func examplePrometheusOperatorCrdMonitoringCoreosCom_servicemonitorsYaml() (*ass return a, nil } -var _examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x73\xdc\xb8\x95\x28\xfc\x7b\xfe\x0a\x94\x27\x55\xb2\xbf\xaf\xbb\x65\x4f\xb2\xa9\xac\x37\xb5\x5b\x8a\x24\x4f\x54\xb1\x65\x5d\x4b\xe3\xb9\xf9\x1e\x35\x83\x26\xd1\xdd\x58\x91\x00\x03\x80\x2d\xf5\xdc\xdc\xff\xfd\x16\x0e\x00\x3e\x9a\x04\x08\xb6\x5a\x63\x27\x43\x6e\xd5\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x3e\xbf\x99\xcf\xe7\xbf\xc1\x05\xfd\x4c\x84\xa4\x9c\xbd\x45\xb8\xa0\xe4\x51\x11\xa6\xff\x25\x17\xf7\x7f\x94\x0b\xca\x4f\xb7\x6f\x96\x44\xe1\x37\xbf\xb9\xa7\x2c\x7d\x8b\xce\x4b\xa9\x78\xfe\x89\x48\x5e\x8a\x84\x5c\x90\x15\x65\x54\x51\xce\x7e\x93\x13\x85\x53\xac\xf0\xdb\xdf\x20\x84\x19\xe3\x0a\xeb\x9f\xa5\xfe\x27\x42\x09\x67\x4a\xf0\x2c\x23\x62\xbe\x26\x6c\x71\x5f\x2e\xc9\xb2\xa4\x59\x4a\x04\x8c\xe0\xc6\xdf\xbe\x5e\x7c\xbb\xf8\xfd\x6f\x10\x4a\x04\x81\xcf\xef\x68\x4e\xa4\xc2\x79\xf1\x16\xb1\x32\xcb\x7e\x83\x10\xc3\x39\x79\x8b\xd4\x06\x33\x2e\x45\x99\x11\x21\x17\x39\x67\x54\x71\x41\xd9\x7a\x91\x70\x41\xb8\x5c\x24\x3c\xff\x8d\x2c\x48\xa2\x07\x5f\x0b\x5e\x16\x6f\x51\xff\x4b\x06\x9e\x9d\xa4\x59\xe0\x1d\x80\xfe\xa4\x41\xc3\xaf\x19\x95\xea\xaf\xfb\x7f\x79\x4f\xa5\x82\xbf\x16\x59\x29\x70\xd6\x9e\x10\xfc\x41\x52\xb6\x2e\x33\x2c\x5a\x7f\xfa\x0d\x42\x85\x20\x92\x88\x2d\xf9\x9e\xdd\x33\xfe\xc0\xde\x51\x92\xa5\xf2\x2d\x5a\xe1\x4c\x92\xdf\x20\x24\x13\x5e\x90\xb7\xe8\x5a\xcf\xaa\xc0\x09\x49\x7f\x83\xd0\x16\x67\x34\x05\x74\x98\x79\xf2\x82\xb0\xb3\x9b\xab\xcf\xbf\xbb\x4d\x36\x24\xc7\xe6\x47\x84\x52\x22\x13\x41\x0b\x78\xaf\x39\x57\x94\xea\x4d\x22\x12\xe1\xbd\x5f\x8b\x8c\xef\x72\xc2\xd4\xc2\x02\x28\x04\x2f\x88\x50\xd4\xe1\x43\x3f\x0d\xea\xa8\x7e\xdb\x1b\xea\x44\xcf\xc5\xbc\x53\x0d\xa5\x36\x04\xd9\x5d\x25\x29\x92\x30\x4f\xc4\x57\x48\x6d\xa8\x44\x82\x00\x12\x98\xa1\x90\x06\x58\xa4\x5f\xc1\x0c\xf1\xe5\x7f\x93\x44\x2d\xd0\xad\x46\x94\x90\x48\x6e\x78\x99\xa5\x9a\x88\xb6\x44\x28\x24\x48\xc2\xd7\x8c\xfe\x5c\x41\x96\x48\x71\x18\x32\xc3\x8a\xd8\x8d\x71\x0f\x65\x8a\x08\x86\x33\x8d\xc5\x92\xcc\x10\x66\x29\xca\xf1\x0e\x09\xa2\xc7\x40\x25\x6b\x40\x83\x57\xe4\x02\x7d\xe0\x82\x20\xca\x56\xfc\x2d\xda\x28\x55\xc8\xb7\xa7\xa7\x6b\xaa\xdc\x79\x48\x78\x9e\x97\x8c\xaa\xdd\x29\x50\x35\x5d\x96\x8a\x0b\x79\x9a\x92\x2d\xc9\x4e\x25\x5d\xcf\xb1\x48\x36\x54\x91\x44\x95\x82\x9c\xe2\x82\xce\x61\xe2\x0c\x8e\xc3\x22\x4f\xbf\x11\xf6\xf0\xc8\x93\xc6\x4c\xd5\x4e\xef\xbb\x54\x9a\x42\xab\x9f\x81\x22\xbd\x78\xd7\x54\x89\xa8\xde\x57\xf3\x99\x99\x7f\x8d\x5e\xfd\x93\xc6\xca\xa7\xcb\xdb\x3b\xe4\x06\x85\x2d\x68\xe3\x1c\xb0\x5d\x7f\x26\x6b\xc4\x6b\x44\x51\xb6\x22\xc2\x6c\xdc\x4a\xf0\x1c\x20\x12\x96\x16\x9c\x32\x05\xff\x48\x32\x4a\x58\x1b\xe9\xb2\x5c\xe6\x54\xe9\x9d\xfe\x7b\x49\xa4\xd2\xfb\xb3\x40\xe7\xc0\x15\xd0\x92\xa0\xb2\x48\xb1\x22\xe9\x02\x5d\x31\x74\x8e\x73\x92\x9d\x63\x49\x9e\x1d\xed\x1a\xc3\x72\xae\x51\x3a\x8c\xf8\x26\x33\x6b\xbf\x68\xb0\x55\xfd\xec\xb8\x4c\xff\x0e\xdd\x16\x24\xa1\x2b\x9a\x00\xa1\x1b\xfa\x27\xfa\x15\x2a\x48\x8a\x96\x64\x83\xb7\x94\x0b\xf7\x7b\xf3\x70\x26\x59\x29\x15\x11\x8b\x16\x56\xfb\xf1\xb3\x29\x97\x9a\x95\x9d\x6a\x9e\x2a\x18\x51\x44\x36\x50\xb5\xcc\xf8\xf2\x34\xc7\x1a\xd6\xa1\x68\xd3\x2b\x9c\x63\x96\xce\xa5\xc2\xaa\x6c\xa1\xae\x8f\x61\x00\xd3\x58\xc1\xad\xb0\x6b\xff\xba\x87\x9c\xab\x15\x20\x8f\xae\x28\x49\x67\x80\x80\x82\xa7\x27\x12\x8e\x74\x5a\x66\x9a\x78\x13\xce\xa4\x12\x98\x6a\x9a\xdc\x03\xe5\x1b\x5a\x3f\x8c\xa7\xe4\xcc\x33\x85\xce\x34\x2e\xe0\x1f\x4b\x22\xe1\xb3\x6a\xea\xcd\x69\x68\xd6\x2d\xd1\x8a\x0b\x37\xcb\xfd\xc9\x0c\x4d\xc8\xfc\x9d\xac\x88\x10\x24\xbd\x28\x35\xa5\xdd\x56\xe0\xaf\xd6\x8c\x57\x3f\x5f\x3e\x92\xa4\x54\x7b\xdc\xd6\x3b\xf7\xbb\x0d\x71\xf3\x24\x02\x3d\xd0\x2c\xb3\xc3\x68\x7e\xe8\xfe\xa0\x27\x0c\x0c\x52\xaf\x4f\x7a\xc0\x22\x7d\x4b\x29\x24\xb1\xa2\x72\xb5\x83\x75\x56\x98\x20\x8f\x9a\x31\x80\x48\x50\xef\x18\x5a\xee\x2c\x4f\xd0\x17\xd8\xcc\x0b\x76\x59\x2a\x44\x15\x30\x92\x64\xc3\xb9\x24\x08\x1b\x44\xc3\x78\x5b\xca\x81\x65\x23\xce\x08\xe2\x02\xe5\x9a\xc2\xcd\x71\xf0\x42\x6c\x4c\x67\x01\x18\xa8\xc1\x51\x89\x72\x2e\x55\x8d\x6b\xfd\x8b\x5e\x8b\x06\xff\x40\xd5\x26\xb0\x7a\x82\xd6\x5a\xe6\x20\x52\x21\x59\xe6\x7a\x12\x0f\x84\xae\x37\x4a\xce\x10\x5d\x90\x05\x6c\x3f\xc1\xc9\xa6\x31\x5c\x4e\x88\xf2\x23\x14\x67\x99\x3b\xd9\x4d\x5a\x22\x7f\x2f\xa9\x20\xfa\xda\x95\xe8\x65\xc5\x94\x2d\xa3\x9c\xb9\xbf\x77\xa8\xc4\x3f\x4c\xcf\x36\xcd\x10\x51\xc9\xe2\xd5\x0c\x25\x3c\x2f\x4a\xa5\x71\xae\xd7\xb4\xdc\x21\xaa\x88\xc0\xf6\x62\x10\xbc\x5c\x87\x31\x42\x32\x3b\x51\x77\x73\xc3\x66\xc3\x15\x8a\xd3\x54\x43\x79\x61\x90\xf4\xc2\x5d\xc0\xb2\xcc\xbd\x10\xa9\x41\x06\xe0\x2f\xc7\x2a\xd9\x58\x39\x21\xe1\x42\x10\x59\x70\x06\x10\xe1\x2f\x97\xf5\x5a\xfe\x23\x48\x0c\x1a\xd8\x4b\xf9\x0a\x36\x17\x80\x6d\xe8\x7a\xe3\xf6\x10\x0b\x02\xbf\xb5\x69\xa2\xef\xf0\xc2\xf4\x14\xc9\x3d\x67\x17\xed\x1f\xbc\x33\x86\x48\x5e\xa8\x5d\x83\xd2\x1a\x7b\xac\x88\xc8\xab\x15\x62\x90\x5a\x7d\x8f\xb9\x4d\xa4\x99\x3f\xcd\x8b\x8c\x26\x54\x59\xca\x43\xaf\xd1\x4b\x20\x3d\xaa\x4e\x24\x1c\x9b\x39\x2f\x5e\x2d\xd0\x99\x13\x85\x7d\xcf\xf0\xa4\x18\xaf\x46\xb6\x43\xe8\x89\x4a\x1e\x00\x5a\x8d\xef\x7d\x67\x88\x03\x36\x27\x47\x58\x42\x42\x6f\xed\xe3\xdb\x50\x8d\x24\x19\x49\x94\xe6\xc3\x44\xe4\x33\x84\xa5\xe4\x09\xd5\x92\x44\xb5\xff\x41\x90\x68\x8f\xd4\x0c\x9a\xfd\x0b\x8a\x5f\x94\x7e\xf6\x09\x77\xe8\xfd\xce\x12\xb5\xa2\xa1\x4f\x5a\x7b\xa9\x4d\x86\x31\x08\x11\xe9\x33\xae\xbf\x3f\x91\x28\xc3\x4b\x92\x75\xee\xcd\xee\x33\x40\xf7\xde\xe9\x7a\xa7\x69\x45\x52\xfb\x97\x08\xc0\xf6\xf2\xd1\xf2\x09\xa6\x4c\x5a\x31\x7c\x86\x30\xba\x27\x3b\x23\xb1\x6b\xa5\xa0\xd0\xac\x0b\x2e\x61\xac\xa2\xa0\x0a\x62\x2e\x17\xcd\x03\xee\xc9\x0e\x00\x59\x11\x3f\xe2\xfb\xf8\x9d\x37\xcf\x3d\xe9\x15\x36\xfa\x9e\xce\x25\x0e\x7b\x05\x73\x04\x4c\x00\x27\x1d\x83\x3f\x04\x9a\x5a\x91\x51\x02\xa2\x76\xe4\x37\xbd\x92\x6f\xe8\x71\x5b\x70\xd0\x3a\x3f\x55\xfa\x85\xd9\xd8\x13\x69\x36\x48\x9f\x95\x0d\x2d\xa2\xd7\xa9\x38\x50\x17\x1c\x15\xa7\xb0\x7d\xd6\x1a\x72\x35\x3d\x09\x9c\xff\x8a\xf9\xa5\x92\xfd\xe7\x9a\xab\x2b\x36\x43\x97\x8f\x54\xea\x0b\xff\x82\x13\x79\xcd\x15\xfc\x73\x81\xbe\x53\x86\x06\xdf\x0f\xb0\x8a\xc6\x14\xc7\x22\xd6\xac\xe3\x20\xb4\x9e\x31\x84\x85\xc0\x3b\x8d\x8e\xa6\x1a\x28\x17\x5a\xc2\x1e\x66\x89\xf5\x53\x1d\x30\x2a\xb5\x62\xc6\x85\x43\x0b\x28\xf3\x00\xd3\x0c\x15\x0d\x31\x2f\x25\xe8\x7b\x8c\xb3\x39\xdc\x97\x6e\x4e\xad\xb1\x0c\xd6\xe3\xa7\x29\x5a\xfb\xd3\x9d\x9e\x1b\x36\x1a\xa2\x7f\x6a\xdf\x29\x3d\xdc\xfb\xd6\x20\xf1\x07\xb2\x9e\xcc\x06\x6f\x41\x08\xa3\x6c\x9d\x55\x62\xd5\x0c\x3d\x6c\x68\xb2\x01\xb9\x3d\x1a\xe8\x92\x18\x8b\x46\x21\x88\xbe\xf7\xb0\xd4\xac\x51\xff\xb2\x26\x42\x8b\xc3\xd4\x21\x81\xc6\x4f\x54\x90\x22\xc3\x09\x49\x51\x0a\x42\xa7\xb1\x27\x60\x45\xd6\x34\x41\x39\x11\x6b\x82\x0a\x7d\xb7\xc5\x52\x7f\xf4\x85\x62\x9e\xd1\x87\xc5\x7d\x12\x4b\x8b\x4e\xa4\x8e\x99\xd2\x5c\x73\xa6\xa8\xf7\x1c\x99\x44\xbc\xdc\x6b\x38\x08\xbf\x1c\xb3\x36\x10\x38\xac\xfd\xf0\x0b\xcb\x1a\xa0\x17\x4c\xb2\xc6\x24\x6b\x78\x9f\x49\xd6\x70\xcf\x24\x6b\x4c\xb2\xc6\x24\x6b\x4c\xb2\xc6\x3f\x91\xac\x11\x09\xd4\xd8\x53\x46\x98\x75\x7e\x30\x76\xae\x7d\x3b\x0e\x08\x36\xce\x79\xd5\x32\xd9\x0c\xac\x48\x8b\x09\xb7\xf6\x2e\xbb\x03\x13\x11\x65\x00\x44\x60\xb6\x26\xe8\xcd\xfc\xcd\xeb\xd7\x61\xca\x5a\x71\x91\x63\xf5\x56\x53\xf9\xef\xbe\x8d\xc0\x89\x3d\x0d\xde\x37\x87\xe9\x61\xde\xb0\x88\x05\x5e\x32\xb8\xf5\x5b\x6b\x87\x77\x68\x68\xb3\x7d\x96\xe7\x27\xf8\x27\x2c\x97\xab\x4c\xd4\x2d\xe3\x77\xc7\x95\xe0\x5d\x9c\xb5\x3a\x0b\xcd\xdc\x15\xca\x89\x42\x58\xb5\x4c\x9b\x34\x27\x95\x07\xc9\xb8\x41\x8c\xa3\xd1\x0b\xd1\xf9\x46\x52\xc4\x99\xb5\x5c\x6b\xda\x59\x44\xce\xd8\xef\xed\x68\x3a\x45\x50\x42\xb0\x24\x5a\x86\x58\x92\x6a\xd6\x3c\xd7\xb3\xa4\x4c\x39\x06\xa8\xa7\x4c\x1c\x56\xbd\x80\x5f\x92\xc5\x7a\x81\xd2\x12\xc0\x61\x66\x3d\xa8\xaf\xcc\xaa\xe5\x4e\x2a\x92\x83\x8f\x85\x0b\xf8\x1f\xbd\x7c\x25\x76\x48\xf9\x2d\xba\x64\x4b\x98\x2a\x71\x96\xed\x10\xd9\xd2\x44\x55\xf8\x03\x27\x2f\x55\xc6\x1f\xe6\x3b\x2d\x31\x02\xeb\xfe\x69\x0c\xf2\xe9\x3d\xf1\xcd\x90\xe2\xc2\xab\xa9\x28\x0d\x0f\xdc\x3f\xe1\x43\xaa\x5f\x03\xca\xf9\xf8\xc9\x6f\xf9\x47\x71\x17\xc9\xbe\x4e\x52\x66\x99\xc6\xb7\x71\x04\x74\xa7\xe7\x8c\xed\x83\x3c\xcb\x99\xe2\x8d\x37\xab\x45\x71\xc6\x7f\x64\x3c\x19\x67\xd7\x17\x1a\x23\x43\x4b\x46\xe8\x8e\x17\x3c\xe3\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\x60\x21\x63\x24\xcb\xa5\x95\x6c\x87\x05\xb7\xeb\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf7\x4c\x7a\x6c\xe7\x99\xf4\xd8\xc8\x29\x4e\x7a\x2c\x3c\x93\x1e\x3b\xe9\xb1\x83\xcf\xa4\xc7\xf6\xbc\x3c\xd9\xcc\x27\x59\x23\xf0\x4c\xb2\x46\xe7\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\x08\x3e\x93\xac\xd1\xf3\xf2\xd1\x6c\xe6\xc3\xe0\x86\xd0\x33\xef\x1a\xda\x82\x16\x60\xef\x94\x82\x7f\x2e\x78\x7a\x40\x48\x7d\xc1\xd3\x40\x44\xbd\x31\x6a\x26\x7c\x9e\xf1\x04\xab\x7e\x7e\x00\xe6\x54\x0d\xc6\x5a\xf2\x25\xce\x8d\xad\x76\x86\x7e\xe6\x8c\x98\x48\x67\x7d\xcc\xc0\xb2\xca\xd5\x86\x08\xfd\xfa\x4b\xf9\xaa\x37\x52\x75\x8a\xd2\xef\x7d\xa6\x28\xfd\x29\x4a\xdf\x3e\xcd\x28\xfd\x0d\x96\x86\x2e\xcd\x45\xe8\x0f\xda\x6f\x70\x07\xcd\x80\xfe\x23\x38\xdf\x2f\x14\xb3\xaf\x89\xd0\x12\x0b\xa4\x19\xd6\x1b\x6f\xd6\x95\x5a\x77\x24\x49\x6f\xda\xab\x09\x70\x6f\xa3\xc3\xc1\xa4\x71\x9a\x92\x14\x15\x44\xcc\x0d\xe9\x71\xb4\xa2\x2c\xed\x59\x8b\x5b\xbf\x17\x6c\x64\x1c\x7d\x7b\x92\x23\x5c\x17\x4d\xef\x4a\x8b\x41\xef\x47\xd5\x0f\xdc\x85\xd5\xfe\x3d\x67\x54\x3d\x68\x5e\xee\x72\x1b\xaf\xb2\x83\xde\xf6\xf7\x92\x88\x1d\xe2\x5b\x22\x6a\xcd\xa4\xca\xc1\x8c\x51\x42\xe0\xee\xa1\x12\x25\x58\x1a\x46\x3d\x2c\x6a\x8d\xd3\x4e\xc7\xfb\x41\x3a\x8b\xdd\x07\x61\xb4\x7c\x67\xb3\x00\x44\x44\x4a\x6f\xbd\xa6\x8d\x1e\xe7\x14\x16\xb1\x22\xbc\x71\x5d\x45\xbd\x3c\x4a\x38\xed\xdd\x6d\x8f\xc9\x23\x5e\x2d\x68\xb8\xf1\x06\xcc\x1e\xf1\x30\xf7\xcc\x23\x4f\x34\x7d\xa0\x03\xcc\x1f\x68\x9c\x09\x04\xed\xa3\x57\xcf\xd2\xde\xd3\x5d\x6b\xc8\x08\xa0\x0d\xfa\x1a\x6f\x11\x41\x87\xe9\x23\xe3\x2d\x23\x68\x7f\xf9\xd5\xf6\x89\x8e\x99\x64\xd4\xe2\x9b\x26\x15\xbf\xa9\x64\x14\xc8\x8e\x59\xa5\x6d\x2e\x01\xda\x6a\x59\x4c\x9e\x1b\xd9\xe3\xac\x25\x68\x1f\xd5\xd6\x56\x40\x41\x75\xde\xb3\x9d\x8c\x42\x4c\xdb\xce\xe2\xb5\x9f\x8c\x82\xe9\x33\x66\xb4\x6d\x28\xa3\x41\x76\xed\x2d\x1d\x3b\xca\x71\xa6\x69\xa7\x58\x1b\x22\x46\x81\x35\xc5\x1b\x8e\x69\x8c\x40\xe3\x0d\x12\xe8\x50\xba\x1c\x6b\x98\x40\x23\x8d\x13\x68\x84\x81\x02\x8d\x35\x52\xa0\xb1\x86\x0a\x34\x7a\xbd\x20\x42\xbc\x87\x10\x88\xb8\xe5\x6a\xf5\x42\x9f\x59\x9c\xdd\x8c\xbe\x8d\x46\xef\x60\x57\xda\x31\x53\x35\x82\x4e\x8e\x0b\xcd\x25\xfe\x97\xbe\x9a\x81\xf0\xff\x77\xec\x3d\x8a\xa9\x90\x5a\x14\xb6\xc6\xbf\x06\x04\x67\x73\x68\x0c\x16\x09\x54\xcf\x86\x4a\xa4\x69\x67\x8b\x33\x2d\x80\x98\xb0\x2d\xab\xaa\xe9\x99\xee\xcb\x6b\xb1\xe7\xfb\x61\xa3\xd5\x73\x7d\xf9\x1a\x35\x8f\x4a\xf4\xe2\x9e\xec\x5e\xcc\x3a\x7c\xe4\xc5\x15\x7b\x11\x0b\x15\x5b\x55\xa5\xc5\x33\x2a\xc9\x87\xb3\x6c\x87\x5e\xc0\xdf\x5e\xc4\x1e\xec\x3e\x71\x71\x8c\x20\x78\x80\x51\x2e\xea\x65\xe6\x2a\xeb\x8c\x75\x00\xd6\x1f\x56\xf6\x15\xa7\x18\xd7\x7f\x8a\xb1\x36\x3a\x09\xea\xb6\x2b\x07\xa1\x97\x55\xda\xf8\x5a\x63\x5e\xbd\xf2\xab\xd2\x8d\x25\xb5\x22\xd1\x40\xe4\xcf\x09\x66\x12\xbd\x70\xd6\xb3\x13\x59\xcf\xf1\xc5\xf1\x3c\x8e\xa3\xce\x70\x3c\x2f\x52\x36\x80\xed\xaf\x31\xe2\xea\x9e\x8e\x6f\xad\x85\xb6\x62\xd0\x92\xd4\xe6\xc5\x14\xbd\x74\x9a\xae\x5f\xf7\xae\x1f\x2e\x20\x8a\xb2\xf5\x39\x53\x74\x5e\xc1\xa8\xf5\x5f\xad\x11\xc6\xb2\x57\x17\xd6\xdc\xa6\x00\x67\xdc\xac\xec\x76\x35\x45\xc5\x9c\xe0\x87\x0d\x11\xad\x95\x52\x69\x2b\x31\x81\x07\x42\x94\x8c\xe9\x71\x39\xb3\x66\xbd\x28\x90\x9a\xcd\x98\x82\x42\xd6\x4c\x62\xc4\x7e\x58\x35\xc8\xfe\xf5\x2e\x45\x86\x3a\x22\x67\xc0\x84\x2a\x4f\x36\x66\x92\x33\x7b\x88\xf4\x2f\xce\x12\x07\x78\x21\x69\x2c\x66\x69\xb5\xc6\x05\xba\x84\x43\xd0\x9c\x1c\x95\xb0\x93\x38\xcb\xf8\x43\x0c\xf7\x89\xa6\xea\x38\xd9\x60\xde\x9c\xcc\x31\x5c\x06\xa3\xc3\xec\x1f\x8e\x1c\x66\xbf\x67\x7a\xfa\x27\x89\xb2\x8f\x34\xea\x4d\xa1\xf6\x53\xa8\x7d\x23\xd4\x1e\x3e\x32\x9c\x6f\x38\xe6\xde\x4f\x33\x10\x8b\x1f\x1b\x73\x8f\x7e\xd8\x10\x38\x51\x01\x03\x9b\xde\xa2\xbc\xcc\x14\x2d\x6a\x87\xb5\x34\x53\xcb\x8c\xfa\x68\x02\x95\xe4\x9e\x75\x36\x94\x11\x80\x93\xcd\xfe\x31\x81\x71\xc0\xa1\x2d\x81\x23\x5b\x37\x0b\xce\x32\x1b\x5b\xaf\xf5\x4a\xff\x1e\x11\xeb\xab\xa2\xc7\x31\xe1\x5f\x54\x85\x0c\xad\xd1\x04\x9c\x13\x2f\xf5\x65\x99\x69\x72\xd0\x57\x96\xe3\x6a\x21\x9f\x6b\xe7\xfe\x35\x56\x99\x2d\x71\x0e\x92\x35\xdd\x12\x56\x5f\xc2\x2f\xe5\xab\x57\x43\x61\x4d\x2a\x52\xf4\xe8\x0a\x16\x01\xa0\x7d\x22\xc7\x2c\xf2\xba\x0f\x80\xad\x04\x81\x88\x6b\xfe\x4f\x8d\xdb\xeb\x3f\x03\x30\x6b\xe7\x90\xf7\x82\x07\xf4\x54\x57\x7c\xb5\x81\x01\xa0\x74\x78\x35\x71\x76\xd0\x11\x6e\x84\x03\x5c\x08\x88\xfa\xd9\x89\x79\xc6\xb8\x0f\x7e\xb1\xf4\x89\x08\x97\xc1\x98\x30\xb7\x61\x77\x41\xac\xfe\x77\x68\xc8\x63\xd0\x01\x30\xc5\x3c\x06\x9f\x78\x63\xff\xbf\x5e\xe8\x63\xc0\xb8\xff\x95\xc6\x40\x1e\x6c\xd4\xff\x25\x43\x1f\x43\x86\xfc\x91\xde\x2e\x34\x64\xc4\x7f\x62\x00\xe0\x50\x10\x64\x34\x4c\x8f\xf1\xbe\xdf\x20\x1f\x0d\xb5\xcf\x70\xdf\x6b\x8c\x8f\x86\x38\x45\x10\x0e\xbe\xf7\xa5\x23\x08\x47\x1a\xe4\x0f\x35\xc6\x8f\xda\x9d\xb1\x46\x78\x6b\x5e\x8f\x98\x46\xa4\x01\xbe\x6b\x5a\x8f\x59\xe2\xa0\xf1\x7d\xdf\xac\x1e\x67\x74\x0a\x19\xde\x7b\x4d\xea\x11\x60\xfb\x8d\xee\x4f\x12\xa7\xa2\xa9\x33\xf2\xc5\x58\x13\xfa\x78\xf3\x79\x44\x2c\xc1\x08\xd3\xb9\x33\x8c\x0f\x40\x3c\x86\xd9\x3c\x8a\x23\x46\x9f\xb4\x38\x0e\x11\x6d\x26\x7f\x0e\x13\xf9\x48\xf3\x78\x8c\x5a\x8e\x7a\x55\xf3\x90\x69\xdc\x68\xc2\x03\x20\xe3\xcd\xe2\x4d\x6d\x78\x68\xf9\xb1\x26\xf1\xa6\x3e\x3c\xe4\x99\x8a\x32\x87\x77\x8d\xdd\xf1\xde\x94\x51\xa6\xf0\x28\x6a\x8d\xb1\xbc\xc6\x98\xbf\x9f\x6c\x54\x1d\x0c\x5e\x67\x8a\x1e\x1a\xc0\xde\xa4\x6b\x4f\x14\x7b\xef\x9c\xf1\x96\xd3\x14\x15\xa5\xb2\xa1\xbc\xa3\x23\xd9\x7b\xa1\xfe\xaa\xa2\xdb\x5b\xa8\x0f\x86\xb8\x87\x4d\xda\xb3\x03\x42\xdc\xbd\x10\xed\xb1\x3c\x20\xc4\xdd\x0f\xd2\x86\xbe\x1f\x14\xe2\xee\x85\x0a\xa1\xef\x87\x85\xb8\x0f\x9e\xf8\x7d\x12\xf2\xef\x95\x8b\x73\xf7\x82\x1c\x8e\x7f\x0f\xc4\xb9\xfb\x2d\xe4\xc1\xf8\xf7\x40\x9c\xbb\x1f\x9d\xd1\xf1\xef\x9d\x38\xf7\x00\xc9\x4f\xf1\xef\x7b\xcf\x14\xff\xde\x78\xa6\xf8\xf7\xc8\xc5\x4e\xf1\xef\x53\xfc\xfb\xd0\x33\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x3d\xcf\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x8d\x67\x8a\x7f\x1f\x58\xca\x14\xff\x3e\xc5\xbf\x4f\xf1\xef\x53\xfc\xfb\x14\xff\xde\xf3\xca\x17\x89\x7f\x6f\x19\xa1\xbd\x41\xf0\x01\x73\x6c\x5d\x3f\x65\x64\x10\xbc\x17\xe6\x92\x0c\x07\xc1\x7b\xa7\xed\x85\xea\xa9\xf1\x13\x15\x09\xef\x37\xbd\x36\x23\xe4\x47\x45\xc2\x07\x8c\xe6\x3d\x55\xe9\x9f\x58\x7d\x1e\x35\x22\xe4\x0f\x8d\x84\xf7\x93\x00\x9f\x22\xe1\xa7\x48\xf8\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xcd\x33\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x3f\x45\xc2\x77\x9e\x29\x12\xbe\x77\xba\x53\x24\xfc\x14\x09\x3f\x45\xc2\xd7\xcf\x14\x09\xdf\x7e\xa6\x48\xf8\x29\x12\x3e\xf0\x4c\x91\xf0\xcf\x13\x09\xef\xfd\x13\xce\x88\x50\x17\x82\x17\xfd\x57\x6c\x5b\xb9\x6c\xbf\xab\xd9\xf4\x8a\xae\x4b\x1b\xb7\x6a\xe8\x00\x28\xd3\x6e\x9f\x39\x5d\x9d\x89\x2e\x09\x4a\x05\x2f\x0a\x02\x01\xf1\x77\x1b\xcc\xb8\xfc\x04\x31\xe4\x30\x19\x13\xb6\xf2\x93\x69\xc8\xf7\x53\xed\xeb\xd5\x9b\x56\x08\xbe\xa5\x29\xe9\xa9\x67\xfe\x93\x02\x38\x3f\x0a\x0d\xe8\x47\x2d\x13\xd2\x04\xff\x64\x4c\xb4\xed\x01\xcd\x20\x68\xb9\xd3\xe7\x00\x97\x59\x47\x6d\xf0\xf0\xb1\x00\x2d\xf8\xb6\x05\x86\xca\x31\xc3\x6b\x22\xe4\x39\x60\x2b\x88\x60\x63\xdb\xab\xf0\x0a\x3a\x17\x44\x7d\x27\x9c\x31\x92\x98\xb8\x68\xde\x02\xbb\x40\xe8\x23\xcb\xba\xd4\x80\xb7\x98\x66\x78\x99\x55\xc1\xe5\x1a\x3b\x68\xfb\x7a\xf1\xe6\xf5\xe2\x35\xdc\xcb\x10\x7b\xac\xbf\xff\x80\x0b\xe9\x8c\x7e\x3f\xb5\xa6\xbc\x30\x33\xf9\xa9\x0b\x5d\x74\x12\x1f\x42\x6a\xb9\x47\x05\xef\x04\x29\x6b\xfe\x51\x9d\xf7\x44\x10\x08\x1e\x30\x27\x1f\xcc\xc3\x7a\xb2\x56\x53\xc1\x9a\x45\x79\xc2\xc5\xec\xb7\xf7\x64\xd7\x77\xba\x83\x67\x5a\x93\xef\xe0\x54\x4f\xae\x71\x5e\x99\x0a\x6d\x0b\x5f\xb5\x40\x1f\x38\xd8\x89\x57\xfc\x2d\xda\x28\x55\xc8\xb7\xa7\xa7\xf7\xe5\x92\x08\x46\x14\x91\x0b\xca\x4f\x53\x9e\xc8\xd3\x84\xb3\x84\x14\x4a\x9e\xf2\x2d\x11\x5b\x4a\x1e\x4e\x1f\xb8\xb8\xa7\x6c\x3d\xd7\x1b\x35\xb7\x1d\x41\x4f\xe1\x1c\x9d\x7e\x03\xff\xd3\xbb\xc8\xbb\x8f\x17\x1f\xdf\xa2\xb3\x34\xb5\xad\x0f\x4a\x49\x56\x65\xe6\x7a\x4b\x21\x5c\xd0\xcf\x44\x68\xc1\x6e\x86\xee\x29\x4b\x67\xa8\xa4\xe9\x7f\x9d\x8c\xc5\x07\x2f\x8c\x38\x3d\x88\x93\x5b\xb8\x9b\x76\xfa\x36\x82\xe9\x68\xd4\xdc\x9a\x7d\xd0\x17\x98\x92\xb0\xb9\x4e\xcf\xb4\x37\x90\x77\x36\x4b\xce\x33\x82\xf7\x0d\x8a\x3e\x46\xdb\xa7\xce\x84\x19\x9e\x23\xf0\xef\x45\x67\x65\xed\x9d\xb6\x27\xf2\xfb\x4f\xef\xa5\xa1\x45\x96\x3a\x06\xa2\xb8\x61\x88\xf5\x41\x7c\xc7\x85\x65\x67\x9d\x85\x75\x0f\xde\xcc\x7c\xfd\xa1\xc5\x1d\x1a\x02\x49\x29\x81\x5d\x49\x45\x70\xba\x00\xcb\x47\x0f\x61\x36\xbc\x3f\x8e\xd3\x51\xe3\x49\x43\x74\xd5\x3b\x00\x6d\xb8\xc3\x16\x70\xf4\xbb\x40\x7b\x59\x41\x29\xb2\x9f\xe0\xdc\xef\xd3\xd0\xf1\xd8\xa5\x15\xfb\x89\x08\x5f\x43\x27\xe7\xd5\x7b\xe6\x16\x97\x88\xb2\xff\xb6\xec\xb1\xd6\x00\x1b\xe0\x4c\x5e\x4f\x4a\x57\xbb\x7e\x1a\xb7\x6a\xcb\x9a\x30\xfd\x5f\x24\x6d\x7c\x6a\xad\x0d\x09\x66\xd5\xa6\x00\x07\xce\xf8\x83\xcb\x31\xe9\xd0\x29\x42\xb8\x54\x1b\xc2\x14\x4d\x0c\x0b\x2f\x04\x7f\xdc\x19\x83\x58\xf3\xba\x03\x57\x00\x64\x4b\x25\x1b\x70\x20\x6b\xb4\x2f\xc9\x06\x6f\x69\x8f\xc0\x0e\xf2\x53\x70\xb2\x0b\xd4\xc0\x4c\x6a\x33\xd9\x52\x04\x9e\x12\xb3\xfc\xee\x44\xc3\x10\x6d\xae\xcc\x0e\xc9\x8d\x4b\x4f\x31\xc9\x6b\xfa\xff\x69\x5a\x06\xb0\x76\x99\x5d\x4a\xd2\xdf\xa4\x9c\x11\xb4\xa5\xd8\x1b\x2e\x09\x9c\x3f\x29\x85\x66\xa2\x8d\x91\xfb\x39\x1f\x16\xe4\xad\xbb\xeb\xe7\x70\xd7\xff\x04\xf3\xf8\x09\x32\xf2\xe6\xe6\xbe\xca\x71\x31\x17\x24\xe3\x38\x25\xe2\xa7\x05\xfa\xb8\x25\x42\x50\xd8\xaa\x7a\x5f\x3b\x90\xb5\x3e\xcd\x14\x15\x24\xdb\x21\x5e\x2a\x49\x53\xbb\xde\x84\x17\xc0\xec\x1f\x9c\xe9\x37\xc7\xb4\xc2\x32\x9c\x3a\x59\x16\x05\x17\x5d\x99\x4d\x4f\x4c\x8b\x19\x5c\x0f\x2d\xf9\x0c\xed\x78\x89\x70\xa2\xd9\xbf\x33\x24\x53\xe9\x36\xbc\x34\x9e\xd2\xa5\x20\xf8\x1e\x61\x05\xb2\xaf\xa2\x79\x57\x08\xd7\xd7\x04\x2f\x95\x96\x87\x68\x42\x62\x8f\xe3\x9e\x97\xc0\xda\x19\x40\x75\xb4\x44\x5a\xa3\x1e\xe6\xa6\xe7\xfa\x80\x4d\xfc\x9e\x28\x19\x0c\xdb\xeb\xe2\x01\x97\x56\xf7\xa2\x0d\x9b\xe9\xb1\x58\x7b\x54\xc5\xf6\x51\x3f\x13\xeb\xd2\xe8\xfa\x96\x2b\x11\xa6\xc4\x0e\x3c\xda\x86\x70\x52\x9e\xdc\x6b\x3a\xcd\xf1\x9a\x9c\x78\x23\xd2\xcf\x3f\x5c\xe8\x0d\x36\x3c\xd5\xe6\x90\xed\x89\x94\x0b\xf4\x19\x0b\x0a\x12\x53\xd5\x95\x5f\xa2\xdf\xbe\xfc\x7c\xf6\xe9\xc7\xeb\xb3\x0f\x97\x3e\x65\x50\xd3\x38\x79\x2c\x30\x4b\x49\x8a\x4a\x59\x47\x95\x58\x6c\x9e\x9c\x68\xc2\xda\x52\xc1\x59\x0e\x62\xc2\xd5\x0a\x84\x17\x33\x96\x07\x68\x82\x99\x29\xae\x07\x0e\xb6\x6c\x4b\xd2\x59\x53\xd8\x48\x88\x53\x09\x29\x2b\x4a\xe5\xcc\xc9\xf6\x0a\xf0\xc0\x2c\x99\xe1\x32\xa6\x93\x78\x73\x65\x48\xee\x98\xc2\x8f\x8e\xc9\x11\x99\xe0\xc2\x85\xca\x60\x94\xf2\xd2\x3f\xd1\xdf\xfe\x76\x86\x28\x79\x8b\x7e\xdb\x00\xb7\x40\x97\x16\x42\x03\x91\x26\x56\x82\x6c\x89\x80\x21\x2c\xc2\x7c\x96\x7f\x41\xd6\x58\xa4\x19\x91\xd2\x9c\xbc\x5a\xa6\x70\x88\x43\xa4\x32\x32\x33\xae\x16\xe8\xdc\x61\xcc\xb7\x7a\x08\x5c\x48\x63\xa5\x34\x85\xe5\xbd\x3c\x35\xd7\xca\x3c\xc5\x0a\xcf\x1b\x47\xe5\xd4\x88\x2f\xf3\x84\xe7\x39\x66\xe9\x1c\x5b\x22\x9d\x57\x9b\x7e\xfa\x8d\x55\x4f\xe7\xb8\x7a\x8b\xb2\x39\x9e\xcb\x0d\xc9\xb2\x3e\x29\x6c\xc0\x7c\x32\xa8\x88\x86\x35\x43\x3b\x87\x98\x13\x77\x59\x1d\x30\x03\x6d\xa1\x45\x0f\x1b\x1a\x62\x89\x42\x2b\x51\x08\x56\x12\x6a\x4a\xbf\x77\x32\xd1\xe5\xf5\xdd\xa7\xbf\xdd\x7c\xbc\xba\xbe\x1b\x3c\x8a\x1e\x88\x03\x07\x34\xe6\x28\x7a\x20\xfb\x0f\xe8\xf0\x51\xf4\x80\x0c\x1c\xd0\xe1\xa3\xe8\x67\x0b\xde\x03\x1a\x7d\x14\x3d\xb0\x3d\x07\x34\xfe\x28\x7a\xe0\x76\x0e\xe8\xaf\xfc\x28\x12\xb6\x8d\x38\x86\xef\x6d\x00\x42\x83\x30\x2b\x7c\x5b\x4d\x44\x39\x12\xab\xe5\x3f\xdf\xed\xd7\x41\xfd\xf8\x55\xb7\x66\x77\xc9\xb6\x9f\x71\xdb\x53\xcc\x7a\xa7\x8a\xec\x0b\x5e\x9b\x17\xb0\x92\xf3\xa1\x05\xc4\xb8\xfc\x7d\x9a\x7b\xef\x02\x9a\x0a\x7c\xdf\xbc\x17\xb5\x9d\x21\x68\x1f\x3c\xff\xf1\xea\xe2\xf2\xfa\xee\xea\xdd\xd5\xe5\xa7\x90\x25\x31\xca\x8e\x08\x36\xd7\xe8\x25\x9c\x8c\xe1\x86\xc1\x45\xd4\x9c\xb2\x10\x44\x4b\xa2\xb5\x85\xb8\x9f\xfc\x0c\xdd\x05\x61\xd6\xc2\xa4\x89\x12\xd9\x21\x49\xc4\x96\x26\xfd\xe8\x36\x26\xbf\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x96\x01\x07\x61\x3e\x0b\x73\x36\xcf\xe1\x2c\x3a\x3c\xe3\xb6\x24\x75\x61\xac\xa2\xc0\x65\x5e\xbc\xe8\xe8\x17\xcd\x27\x9e\xac\xdf\x09\x1e\x4c\xd4\x6f\xdb\x92\x4c\x41\x8a\x15\x17\xde\x03\x7a\x62\xa3\x91\xc2\xe6\xfb\x06\xe3\xb3\xe2\x86\x89\xf2\xb3\xf2\x86\x09\x27\x08\x40\x88\x0d\x35\x32\x6a\xe7\x07\x5c\xfc\x95\xec\x3e\x91\xd5\x90\x0f\xac\xbd\x58\x30\x6f\xda\x58\x1b\x50\xf2\xd1\xb9\x03\x37\xe4\xd6\x1c\x13\x0a\x15\x19\x06\xd5\x6b\x93\xad\xac\xb0\x31\x4e\xec\x51\xbe\xf4\x21\xae\xdd\x3b\xad\xaf\xc2\xfe\xba\xff\x8c\xb5\xc7\x46\x01\xf5\xd9\x6c\xf7\x9f\x51\x38\x0f\xd9\x74\xf7\x9f\x41\x1b\x6f\x45\xab\xd6\xcc\x1b\xb5\xac\x38\x53\x70\xff\x22\xfb\x4d\xc3\xfb\x4f\x6c\x34\x4c\x4c\x24\x4c\x74\xe8\x00\xec\xf5\xd8\xf3\x7f\x52\x33\x00\x63\xc8\xb5\x74\x5d\xf0\xf4\xad\xb3\x2c\x49\x94\x13\x85\xb5\xec\xbb\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\x51\x3c\xab\x7f\x33\x9e\xb5\xc6\x0f\xc0\x25\x8d\x09\x6f\x18\xb4\x2c\x48\xb2\x60\x3c\x25\xfa\x10\xce\xcc\x3f\xed\xdd\x7e\x96\x24\xbc\x64\xca\xfe\x41\x61\x55\xca\xc5\x86\x4b\x75\x75\x13\x01\xd6\xbc\x5e\xf0\xf4\xea\x66\xd6\xfa\x97\x0c\x5e\x41\x68\x24\x1b\xac\xcf\xe1\x68\xf2\xb7\xdf\x35\x2b\x2a\xe5\x18\xfe\xf3\x9d\xde\xb8\x1b\x1c\x28\xf6\xd3\x7c\xa8\x44\x0f\x82\x2a\x45\x18\x48\x2a\x90\x42\xc0\x57\x33\xe7\x8e\x34\x17\xef\xf6\x4d\x54\xbe\xe9\xa8\x83\xbf\x72\xd3\x1c\xbd\x74\xfd\x91\x5b\xb7\xa1\xd2\xda\x31\x17\x21\x0d\xba\xa7\x0e\x60\x38\xbb\xb9\x42\x5b\x83\xcf\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\x60\xf8\x77\x4f\xe4\x03\x55\x49\x2e\x8b\xf1\x4a\x98\x7e\x0b\x01\x51\x83\xf8\xaa\x82\xf2\x51\x46\x73\x6a\x03\x65\x6d\x79\x2f\x89\x5e\x9a\x1f\x17\x49\x51\xce\xec\x0b\x8b\x9c\xe4\x5c\xec\x86\x4f\xa9\x7d\x9d\x14\x1b\x92\x13\x81\xb3\xb9\x54\x5c\xe0\x35\x99\x55\xe0\x0d\xd8\xea\x5f\x06\xf0\xf0\xa9\x6c\x4c\xb0\x0b\xdd\xe8\x32\xd6\x45\x90\xed\x1c\x57\x24\xe9\x51\x39\x43\x85\xe5\xeb\x83\x64\x92\xf3\x96\xe7\xe2\x6d\x45\x87\x20\xc6\x6e\x79\x56\xe6\x71\x19\xad\xf5\xfd\x6c\xea\xbd\xb1\xad\x16\x7a\xe5\xd1\xa5\x80\x94\x6e\xa9\x8c\x8b\x15\xef\x11\x02\xa8\x0d\xdf\xe7\xa5\x2a\x4a\x65\xd3\x1a\x87\x3a\xc3\x37\x1f\xf2\x58\x70\x09\xaa\x4f\x95\x40\xd2\xe2\x7f\x6f\x86\x93\xb5\x47\x2e\xd8\x8d\x34\x7e\x6b\x5d\xd9\xb0\xb7\xf5\xc9\xac\xd8\xdf\x91\xf7\x25\x9e\x7b\xb9\xa9\x1c\x8b\x79\x99\xa0\x89\xe3\x28\x30\x36\x00\xc3\xea\xe1\x10\x44\x18\xa5\x09\x80\xa4\xf2\x95\xe8\x3c\x11\x71\x28\x51\x84\x5e\xc7\xaa\x0c\xc4\xa5\xec\x3f\x93\x1e\xf5\x6b\xd2\xa3\x3a\xb1\x32\x51\xeb\xfa\x97\x53\xa2\x22\x5e\x1b\x9a\xd5\x1c\x0e\x43\xd0\x78\x1f\x80\x3f\x68\xbc\xf7\x5b\xb2\x7a\x0d\xf8\x4e\x12\x53\x1c\x15\xbc\x28\x33\xac\x3c\x26\xd0\xb0\x1b\xa9\x11\xe3\x61\x19\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\xcb\x32\x44\x99\x61\x50\x00\xd6\x59\x43\x05\x31\x42\x16\xc2\xc6\xbc\xbf\xf5\xdb\xf1\x1f\x6c\x4e\x76\x33\x70\x44\x6a\x25\x4e\x28\x08\xd1\x85\x9c\x6d\x73\x3f\x58\x63\x23\x65\x55\xe6\xb6\x07\x66\x25\x16\x54\xf9\x03\x9d\x32\x0e\x26\xea\x54\x2a\xb7\x70\x98\xb9\xc2\xf7\x3e\x90\x85\x20\x09\x49\x09\x4b\x08\x64\xa2\x95\xa4\xc6\xe1\x72\xa7\xd7\x78\xc9\xb6\x95\xdd\xb6\x34\x3e\x26\x73\x19\x68\xc8\x3e\x8a\xc2\xf7\xa4\x05\xf9\x39\xbc\x2d\x9a\xe8\x6e\x5d\x99\xde\xca\xe9\x02\xf7\x53\xa5\x29\xb8\x64\x3b\xef\xe9\xaa\x4c\x35\x3e\x5a\x8b\xb9\x5a\x2b\x53\xe7\x80\x98\xd0\xb9\x53\x6b\x43\x51\xfb\x2e\x3d\x82\xf9\x35\xe6\xf2\xfb\xba\x2f\xbe\xa3\x05\x73\x36\x9f\xe8\xcb\x2c\xf6\x22\x1b\x61\x0c\x1c\x77\x31\xc5\x5e\x4a\x51\x97\x48\x21\xc8\x8a\x3e\x46\xd3\xe6\x19\xab\x15\x2e\x9a\x12\xa6\xb4\x72\x03\x41\x79\x85\x20\x05\x61\x69\x55\x16\x62\xe8\x92\xb3\xac\xba\xb6\xde\x37\x82\x95\x8f\xea\x28\x34\x72\xe4\xd8\x03\x78\xdb\x27\xc9\x4e\xa7\xef\x5f\xe7\xf4\xd9\x0d\xfe\x62\x47\xef\x89\xb2\x15\x04\x0a\xc5\x44\x28\x5d\x34\x02\x8b\x80\xfa\x46\xd3\x4e\x1d\x06\x7a\x0a\x50\x7c\x24\x72\x57\x87\x57\x53\x59\xb3\x89\x2a\x00\xd8\x44\x72\xa3\x8c\x6c\x49\x66\x6f\x46\x64\x02\xa6\x73\xbf\xb0\xa4\xb8\xb3\x74\x68\x69\x9f\x9b\xe0\xd4\x96\xe8\x04\x53\xd2\xec\x44\x93\x76\xc6\xb1\x09\xc8\x15\x3c\xcb\xfa\x02\x57\xcd\x93\xd1\x7b\x82\x2e\x48\x91\xf1\x9d\xcd\x8d\x64\x29\xba\x55\x58\x69\x52\xbe\x25\xca\x67\x45\x1f\x20\x53\x98\xcb\x4d\x99\x65\x37\x3c\xa3\x89\x47\x9b\x6e\x6f\xcf\x15\xec\x4b\x51\x66\x19\x2a\xe0\xa3\x05\xfa\xc8\xe0\xbc\x9f\x65\x0f\x78\x27\x67\xe8\x9a\x6c\x89\x98\xa1\xab\xd5\x35\x57\x37\x46\x98\xf1\xf1\xc4\xa6\x33\xda\x7c\x8e\xe8\x0a\xbd\xcd\x4c\x97\x04\x85\xdb\x01\xed\x33\x8d\xd1\x26\x58\x0f\x54\x38\xe6\x0f\x54\xf6\x4a\x6b\x4f\x26\xa6\x6f\x00\x92\x66\x49\xe6\xdf\x07\x21\x3e\xa3\x2b\x92\xec\x92\x2c\xe6\x44\x9c\x25\xe0\xbb\xa9\x8b\x53\xd4\x34\xe8\xba\x15\xdb\xbc\x02\x10\x56\xbd\x85\x5a\x4c\x89\x24\x53\x43\xaa\x26\xc7\x6a\x26\x46\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\x6e\xb5\x96\x10\x59\xfb\xe8\xe4\xc6\x7d\x80\x20\x26\x3f\xcb\x48\x8a\x68\x9e\x93\x54\x6b\x05\xd9\x0e\xe1\x95\x82\xea\x34\xd5\xec\x03\x1c\x4d\x43\x80\x76\x1b\x69\x55\xec\x60\x83\x59\x9a\x11\x81\x56\x98\x66\x56\xf3\x68\x69\x34\x8a\x88\x9c\xb2\x81\x7a\x45\xc6\x96\x0d\xca\x8f\x56\x9e\x92\x84\x0b\xdb\x7f\x19\x54\x7b\xfb\xa7\xfa\x6c\x00\xff\x1e\xe4\x1a\xa8\x4e\xb8\xac\xa7\xb4\xcc\x78\x72\x2f\x51\xc9\x14\xcd\xcc\x02\x38\xbf\x87\xa6\x1a\x19\xd0\x6a\x83\x94\x03\x60\x47\x12\x79\xf5\x9f\xf3\x8a\x32\xe6\x7a\x5c\x79\xfa\x4d\xfd\x27\xf8\xc1\x7f\x45\xc6\xc9\x16\xe4\x91\x24\x23\xb2\x7a\x35\x97\xd1\xc8\x87\xa4\x71\xce\x2a\x11\x63\xc5\x35\xb3\x86\x18\xfc\xfe\x84\xc4\xf6\xb3\x24\xcd\x0c\x99\xcb\x47\x92\x34\x92\xb5\xa1\x64\x1b\x1c\x37\x08\x48\xc7\xf7\x03\x11\x28\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\xa8\xc6\x02\x41\x19\x65\x70\x8a\x6d\xd8\x6e\x84\x5d\x88\xb2\x2a\xe3\xa1\xda\x45\x73\x02\xac\x7c\x85\x52\x2a\x20\x1b\x79\x87\x56\x71\xf5\x20\x1a\xf3\x81\x84\x5d\xce\x15\x7a\x79\x72\x7a\xf2\xaa\x63\xd4\x38\xd1\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x35\x60\xeb\x0b\x80\xe6\x45\xb6\x83\xd5\x9e\xa4\x33\x44\x95\x8b\xf0\x11\x25\xb3\x2b\x8b\x00\x6a\x63\x9a\x67\x48\x72\xa4\x04\xae\xf2\x88\xe0\x57\x48\xc5\x12\xa5\xe5\xb4\x2f\x4f\xfe\x71\x12\x63\x79\x24\x2a\x79\x85\x1e\x38\x3b\x51\x80\xc6\x05\xba\xe3\x5a\xba\xac\x87\xda\xf1\x12\x31\x62\x92\x8a\xc8\x63\x91\xd1\x84\xaa\x08\x0f\x1f\x02\xe6\x87\x78\xa9\x4c\x5e\x04\x56\x2e\x1e\xfb\xf2\x91\x2a\xeb\x3e\xd7\xf4\xff\x1a\x28\xc3\xb0\xb9\x18\x14\x48\x94\xd1\x2d\x39\xdd\x10\x9c\xa9\x8d\xa9\xcc\xc4\x38\x9b\xff\x4c\x04\x87\xa8\x6d\x66\xff\x72\xc4\xfa\x55\xcf\x52\x4a\x37\xd2\xdc\xa8\x59\xdf\x77\x64\x4c\x45\xd1\xbf\xdc\xdd\xdd\x7c\x47\xd4\x1e\x4b\xd0\x70\x9c\x03\x13\x54\x47\x22\x56\x5c\x0c\x90\x72\x3c\x6f\xd8\x70\x39\x30\xc7\xee\x3c\xb9\x54\x26\x4d\xcb\x5c\xe6\x4c\x6b\x7c\x8a\xb7\xbc\x6c\x91\x87\xb8\xe0\x29\xba\xba\x59\xa0\xbf\xf1\x52\xcf\x79\x89\x97\xd9\xae\x4a\x0d\x92\x44\xa1\x17\x7a\xb0\x17\xfa\x54\x6b\x3c\xfc\x85\xe0\xd4\x2f\xa7\x36\x1f\x97\xdd\x18\xb9\xeb\x51\x24\xd2\x98\xc1\x58\x56\x5a\x4a\xc5\x73\xb4\x31\x1f\xef\xc5\x58\xdb\xbd\x8d\xe1\x4d\x9a\x42\x5c\x5e\xa2\x20\x05\x1c\x3d\x07\xf5\xb9\xca\xbe\xe9\x31\xcd\xaa\xab\xbc\x3f\xa9\xc5\xa0\xe6\x92\xa2\x1c\x0a\xa6\x7a\xa8\xcd\x3d\x35\x4b\xd1\x5b\x1e\xe5\xbb\x19\x5b\x98\x2d\xd6\x67\x85\xfa\xac\x19\x66\x4d\x56\x39\x0b\x18\xfc\xf7\x9f\xc3\x6a\x7f\x1d\x67\x9a\x31\x45\x35\x0e\x9c\xe7\xb8\xea\x4f\x91\xf8\x9a\x47\xcf\xf8\x99\x6a\x3f\x15\x51\xb1\x4a\xdd\x48\x25\xad\xa0\x27\x09\xc4\x43\x9b\xe3\x0b\x84\x2c\x89\xd8\xfa\x73\x0c\xf6\xe7\x17\x85\xfa\x82\x87\x74\x17\xf7\x60\xb6\xfb\x38\xe8\x53\x87\x2a\x21\x51\x35\x9f\xf7\xdf\x3f\xa4\x6c\x95\x31\xc1\x09\xc4\xca\x7c\x49\x44\x1d\x73\x28\x54\x8d\xbc\x88\x7d\xe7\x1d\xef\xd4\xb5\x01\xe8\x8c\x50\xed\xfa\xd8\x31\x94\xc4\xd1\x1f\xfe\xed\xdf\x7e\xf7\x6f\x0b\x33\xc5\xca\x97\xc5\xd0\xd5\xd9\xf5\xd9\x8f\xb7\x9f\xcf\x21\x78\x7e\x78\x17\x1f\xe7\xb5\x3e\x33\xa7\x4c\xcd\xb9\x98\x1b\x4c\xbd\x45\x4a\x0c\x52\x35\x44\xf7\x45\x9c\xfb\xb6\x55\x0e\x3e\xd2\x6b\xd0\x42\x5e\xb7\x70\x87\x51\xd1\xe2\xae\x91\xa6\xe5\x43\x93\xef\x17\xa8\xde\xde\x9b\xd4\xdc\x1d\x71\xd8\xa9\x9b\x14\xb7\x3c\xb9\x1f\x25\x67\x9d\xdc\x9d\xdf\x98\x8f\x1a\xa2\x16\x66\x4e\xf9\xa2\x6c\xcb\xb3\xed\x30\xd9\x63\x74\x77\x7e\x03\x0b\x59\xc0\x7f\x81\x5e\x0a\xaa\xc1\x4e\x43\x76\x81\x64\xd6\x04\xac\xd5\x88\x21\x25\xdc\x40\x15\x04\x67\x54\x2a\x9a\x00\xd4\xda\x44\xa2\xe1\x87\x2d\xc3\xcf\x2a\xf5\x9d\x7c\x74\xc6\xe4\x61\x01\x30\xee\x30\x36\x04\xc0\xe1\x00\x8a\x5f\x05\xe7\xb4\x1c\xd3\xc4\xf9\x4d\x9c\x73\xef\xf9\x65\x79\x4b\xc4\x4b\x85\x20\xb7\x8a\x17\xd1\x16\x46\xf3\xba\xc7\xbe\xb8\x24\x2b\x2e\x48\xbc\x81\xb1\x36\x18\x56\xc5\xf4\x19\xc4\x3e\x3b\x5d\x91\x37\x4d\x7f\xc1\x18\x0b\xfd\xc8\x32\xd9\x38\x1d\x9d\x11\x29\x4f\xc1\x94\x58\x16\x46\x46\x07\xb3\x65\x29\xc8\x4c\xaf\x99\xe4\xb0\xa2\x59\x4c\x9c\xa0\x5e\x0c\x61\xe6\x75\x68\x45\x7d\xd7\xb0\x85\x5a\x4b\x8a\x43\xc6\x9e\x09\x32\x04\x55\x60\xb9\x21\x90\x57\x46\x1e\x69\x5d\x0e\x1b\x4b\x5b\xd4\xca\x21\x07\xf8\xb9\x44\x05\x96\xa6\xba\x4a\xe8\x26\xa9\x27\x66\xc0\xdd\xf0\xf4\xe4\x44\xb6\x40\xad\x05\x4e\x88\xd6\xc0\x29\x4f\x11\x24\x24\xa4\xfc\x21\xe4\xda\x5a\x92\x35\x65\xd2\xed\xad\x1e\xc2\x11\x81\xe6\xe6\xa6\x64\x9e\xcb\x7f\x5f\xa0\x4f\x55\xb2\xdd\xb0\xa5\x96\x97\x2a\xe1\x35\x93\xb0\x33\xdf\x37\x2c\x43\xd8\x4a\xdd\x16\x21\xb4\x7c\x47\x4e\x2e\xe6\x47\x0d\xa3\xc0\x5a\x98\x03\x50\x1b\x04\x38\xd6\xc2\x1c\x42\x81\x68\x7c\xe5\xdd\x1f\xa8\xdf\x8b\x93\x4d\xdb\xef\x32\x19\xab\x27\x63\x75\xe8\x99\x8c\xd5\x93\xb1\x7a\x32\x56\xf7\x3e\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xe1\x6f\x27\x63\xf5\x64\xac\x9e\x8c\xd5\x3d\xcf\xd7\x68\x72\x99\x8c\xd5\xe1\xcf\x27\x63\xf5\x64\xac\x0e\x40\x9d\x8c\xd5\xbd\xef\xff\x1a\x38\xe7\x64\xac\x0e\x7d\xfc\x95\x19\xab\x07\x5e\x70\x56\xdf\x1b\x2d\xe3\xc6\x44\x62\xdf\x80\x8d\x8d\x26\xd6\x3c\xcc\x57\xad\xa8\x5e\x03\xac\x51\x33\xda\x33\xf1\x3a\x1f\xd0\xc5\xb4\x5a\x23\x70\x6d\x74\xee\x8d\x09\x06\x7b\x9e\x07\x66\x7c\x74\xb5\x0b\x81\x97\xa7\x05\x37\xff\xaf\xb6\xe4\x35\x4c\x78\x46\xee\xef\x3f\xf4\xc3\x4c\x2c\x6c\xbb\x3b\xc8\x6e\xd7\xb6\xcc\x05\x88\xe7\x09\x36\xbb\x38\xee\x1c\x65\xab\x3b\xc0\x4e\x17\x67\xab\x8a\xb5\xd1\xed\x5b\xe0\x06\xc0\x46\xdb\xe7\x9a\xd6\xb7\x01\x98\x71\xb6\x39\x9f\xe5\x6d\x48\x44\xf3\xd8\xe5\x06\xad\x6e\x03\x70\xfb\x6d\x72\x41\x8b\xdb\xd0\x4c\x7b\xed\x71\x41\x6b\xdb\x30\x62\x23\x6d\x71\xbf\x7c\x0b\xa9\x08\xce\x6d\xdd\x6a\x77\x1b\x41\xe4\x86\x67\x81\x93\xd4\x3a\x45\x1f\x28\xa3\x79\x99\x6b\xc2\x94\xd0\x57\x7b\x5b\x79\xe8\x64\x45\xf1\x86\x87\x06\xad\x5b\xd0\x9c\x0a\x48\x0f\xaa\xc9\x60\x9a\xe9\xdd\x80\x44\x87\x0d\xde\x02\xc7\x29\x93\x84\x10\xa8\x61\x7e\x11\x65\x30\xfb\xdd\xa2\x9a\x5d\x55\x10\xf1\x8d\x7f\x67\xe2\x9a\xd6\xc7\x48\x35\x83\x26\xcc\xe7\x30\x5f\xc6\xb1\xc9\x61\x01\x76\xb4\xc9\x32\xa2\x18\xce\xb3\x98\x2b\xa3\x4c\x95\x91\xa7\x28\xda\x44\x39\xde\x3c\x09\xfb\x3b\xa4\xbc\x1c\x62\x9a\x8c\xe2\x22\xa3\x4d\x92\x31\x36\xe8\x83\xcc\x91\x63\x4c\x91\x07\xd5\x79\x39\xd4\x04\x39\x4a\xef\x88\x36\x3d\x1e\xc7\xec\xf8\x2c\x35\x95\x22\xf0\x12\x67\x66\x1c\xd9\x6d\x72\xc8\xbc\x38\x6c\x5a\x3c\xa6\x59\x31\x12\xb5\xc3\x4a\x71\x84\x42\x3c\x46\x19\x1e\xa1\x08\x8f\x36\x1f\x5a\x24\x0d\x6c\x6b\xac\x02\xbc\xa7\xde\x0e\x40\x3d\x4c\xf9\x7d\x82\xe2\x1b\x63\x2e\x7c\x16\x53\xe1\x38\x33\xe1\xd1\x9a\x2f\x06\xd5\xf7\x88\xa3\x4a\x19\x55\x14\x67\x17\x24\xc3\xbb\x5b\x92\x70\x96\x06\x38\xf5\x5e\xa9\x83\x8a\xe6\xa4\xf9\xd0\x4a\x6e\xed\x28\x9b\x0d\xb6\xd5\x72\x82\x7e\x6f\x1b\xa0\xe4\x34\x77\x7b\xb9\x40\x6d\x44\x33\xc3\x43\xb2\x97\x8f\xa0\x5f\xa3\xa3\x8a\x88\x26\x30\x68\x1c\x9a\xff\xc2\x1f\x10\x5f\x29\xc2\xd0\x4b\xca\x1c\xa6\x5f\x35\x84\xc3\x5a\xd6\x0e\x91\x9c\x25\x4f\xfd\xdd\x9b\xd7\x0e\xcc\x97\x12\x95\x41\xa8\x97\xf2\x18\x5a\x87\x05\xf5\x14\xb5\xc3\x82\x58\x95\x59\x5b\xf5\x30\xea\x48\xac\xde\xf1\xa6\x2e\x89\xf2\x06\xe6\x52\xd1\xb2\xd6\x26\x6d\x30\x63\x17\xe1\x41\x88\xbf\xc0\x56\x44\xb8\x04\x0e\x72\x07\x18\x83\xff\xc0\x15\x3b\xca\x15\xd0\x34\xf6\x07\xe0\x8e\x71\x03\x3c\x8b\xf6\x74\x44\xd3\xff\x18\xb3\xff\xbf\x9c\x64\x13\x61\xde\xff\x15\x49\x36\xbf\x84\x2c\xa0\x68\x4e\x78\xa9\x8e\x24\x06\x98\x3e\xc9\x0d\x8e\x4c\xc3\xf5\x8a\x78\xb9\xd7\xa0\xe3\x8d\x05\xd8\x7b\x4b\x1d\x2f\xa2\xf6\x2b\x93\x12\x06\xf6\xc9\xaf\x24\x7b\x9b\x00\xd5\xb2\x58\x5d\xa3\x1c\x4b\x84\xd1\xc5\xf5\xed\x8f\xef\xcf\xfe\x7c\xf9\x7e\x81\x2e\x71\xe2\x2b\x15\xde\xa8\x12\xc2\x4c\x43\x44\x43\xfb\x1b\xbc\x25\x08\xa3\x92\xd1\xbf\x97\xb6\x6b\xe6\xcb\x0a\xe2\x2b\xe7\x35\xf1\x00\x1d\xaa\xaf\x32\xc0\x33\xa0\x71\xc0\x88\x4a\x95\xa6\xd1\x80\x31\x23\x73\x2d\xe6\x0b\x9e\xef\xbb\xfd\x2e\xf5\x9f\xfc\x2c\x0a\x1b\xde\x03\x0d\x47\xd7\x74\x6b\x0d\x76\xb6\x04\x4d\xa3\x33\xab\x26\x49\x4d\x09\xfa\x36\xc4\x4b\x30\x53\x7b\x39\x14\x23\x4a\x53\x5f\xa5\x71\x70\x26\x9b\xf9\x17\x5a\x23\x91\x33\xb4\x2c\xc1\x54\x5f\x08\x9a\x63\x41\xb3\x5d\x73\x08\x9c\xf9\xf8\xcd\x35\x77\x37\xf4\xce\x5c\xc7\xf5\xf4\x2f\x3e\x5e\xde\xa2\xeb\x8f\x77\xd0\x13\x49\xdf\xac\x60\x45\x87\xbf\x03\x62\x96\xc4\x8f\x06\x5b\xdb\x7a\x81\xce\xd8\xce\x7c\x62\xce\x39\x95\x48\x5f\xcd\xc4\x75\xdc\xd7\xc8\x71\xa5\xa0\x5e\xbc\x5e\xc0\xff\xf9\xca\x5e\xe3\x34\x15\x9a\x9b\x57\x4e\x88\xbd\xfc\x01\xcd\x65\x81\xdf\xd3\x65\xd6\xd8\x3b\x8b\xbd\x5f\xac\x33\x58\xe5\x4c\xbc\xd1\xcb\x6e\x36\x08\xab\x36\x12\x10\x62\xea\x95\x42\x13\x52\x2f\x1f\x18\xec\x6b\x16\x59\xaf\xb2\x9e\x50\x74\xbd\xbc\x9a\x5f\xbb\xcb\xd4\x1e\x0a\xde\x28\x69\x8d\xae\x6e\xdc\xb6\x84\x2f\x34\x28\x23\x96\xb7\x1b\x97\x1b\xc0\xc6\x24\x31\x43\xaf\xd1\x9f\xd0\x23\xfa\x13\x5c\xad\x7f\x08\x01\x8b\xe3\xa0\x71\x62\xad\x91\xda\xae\x6e\xa2\xb1\xf2\x83\x3e\x02\xfa\x1b\xbd\x72\xc5\xd1\x92\xb2\xd4\x74\x68\x7a\x54\x44\xe8\x83\x6d\xb1\xf5\xe4\x0a\x87\x7a\x90\xa3\x6e\x18\x58\x27\xd0\xd5\xaa\x51\x2b\x2c\x2c\x29\x8e\xdc\x32\x0d\x5a\x4b\xb2\xd7\x86\xc8\xc3\xe6\xe9\x56\xc5\xb2\x7a\xa4\x1c\xab\x64\xd3\x3e\x41\xfa\x0a\x97\x2a\xd4\xb6\xb8\x85\x11\x0e\x1a\x82\x71\x07\x6e\x68\x90\x2a\x8f\x4b\x48\xa3\x9a\xef\xb5\x76\x61\x0f\xd3\x7b\x82\xe2\x80\x10\x9e\xba\x9b\xb5\x91\x0e\x55\xf0\xd4\x5c\xd5\x30\xa9\xb4\xc1\x6e\xdc\xad\x1c\x04\xda\xbd\xb1\x6d\x88\x4a\xa5\x3a\x03\x7d\xe9\x93\x60\xbb\x71\x42\x05\x4b\x31\x90\xb1\xa0\x4f\x4b\xd5\x03\x2f\xb8\x31\x51\xe7\xa3\x10\x5c\xf1\x84\x07\x6b\x46\xb6\x4d\xc2\xf6\x03\x58\x86\x51\x2b\x9d\x26\xfe\xfd\xc5\xcd\x4c\x6b\x84\x50\x3c\xef\xf6\x7c\xc8\x2a\xd7\x6a\x0f\x77\x77\x7e\x13\x6c\x53\x13\xb1\x98\xe1\x72\xde\x2d\x16\xee\x13\xcb\x9f\x56\x7b\x52\x10\x9c\xd2\xa3\xc5\xd6\xb8\x56\x87\x15\xd4\x31\x41\x36\x39\xdf\x92\xd4\x5c\xe0\x75\xcb\xc4\x14\x1a\xf2\xca\x40\xe4\xcd\xb0\x0c\xf9\x05\x2c\x83\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x81\x77\xa6\xc8\x9b\x29\xf2\x66\x8a\xbc\xe9\x45\xcb\x14\x79\x33\x45\xde\x4c\x91\x37\x8d\x97\xa6\xc8\x1b\x3b\xa9\x7f\x1a\xff\xd4\x14\x79\xd3\x7e\xa6\xc8\x9b\xce\x28\x53\xe4\xcd\xd7\xe1\x53\x9b\x22\x6f\xdc\x33\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\xb3\xf7\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\xde\xa7\xaa\x9b\x77\x8c\x0b\xe5\x9c\xe7\x45\xa9\x08\xfa\x54\xb5\xab\xaf\x7a\xa6\x2f\x77\xc6\x2f\xd8\x38\x1c\xcf\xe5\xe6\x30\x6d\xbb\x4a\x01\xa1\x22\xa7\xa6\x16\xe2\x3c\x31\x53\x9b\x57\xeb\x99\x57\x33\x39\x3d\xd4\xd5\x61\x7a\xe7\xfb\xe9\xa1\x8e\x8f\xb9\x89\x62\xfc\x51\x8c\xab\x8d\xf1\xf7\x30\x85\x86\xa1\xc5\x34\x8b\x7a\x04\xf2\xc5\x39\x2f\x4d\x09\x48\xbb\xfa\xc0\xd8\x15\x5e\x8c\x99\xe8\xcb\xa1\x1d\xc5\xf7\x0c\x26\xf2\x0b\x63\xff\x93\x9d\xc4\x3e\xfe\x2d\xfb\x38\x0c\xff\xee\xc8\x40\x04\x42\x35\x02\x95\x88\xe7\x54\x69\x39\x45\x0b\x7b\x8d\x68\xa1\x90\x57\x83\xaa\x96\x0d\xd5\x52\x0b\xf8\x1c\xb1\x32\x55\x50\x2b\x37\x47\xb3\xe7\x9a\xeb\xa6\x16\x42\x17\x54\xbe\xad\xa4\x25\xd8\xf5\xb9\x6b\xbe\x0b\x8c\xf3\xab\xa6\xa0\x81\x17\xb4\xbc\x2f\xa8\xda\x9d\x73\xa6\xc8\xa3\x47\x82\x69\x13\xc3\xad\xfd\xc4\x76\x15\x94\x95\x28\x65\x9d\x98\xa2\x64\x10\xd5\x10\x71\x95\xc4\x20\xcb\x74\x1b\x3b\x75\x13\x05\xac\x90\x47\x75\xea\x01\x19\xb7\x15\x0a\xcb\xfb\x7a\x1f\xc8\x5c\x5f\x4e\x35\xba\x3b\x63\x1d\xca\x38\x81\xc5\xdc\x08\xba\xa5\x19\x59\x93\x4b\x99\xe0\x0c\xf6\x3c\x56\x04\x38\xf3\x7c\xef\xba\x2a\xca\xaa\x8b\xa6\xaf\x63\xb6\x9d\x27\x08\x75\x09\x66\x68\x8d\x29\x43\xb9\xc6\x51\xe1\xc0\x42\xf7\x3d\x06\x1d\xde\x0a\x2c\xb4\x42\x60\x3f\x08\x49\x5c\x10\x18\xb6\xe4\x3c\xb3\x1e\xd9\x6c\x57\xcf\xc9\xba\xfa\x19\xff\x91\x91\x87\x1f\xf5\x38\x12\xad\x32\xbc\x0e\xf5\xa2\x46\xb6\x22\x2c\x51\x9d\x92\x2d\xd5\x74\x90\x0f\x1d\x21\xc6\x20\x41\xfc\x43\xd8\x74\x60\xec\x6d\xf7\xfd\x16\xbd\x79\x05\x54\x8b\x25\xaa\xa0\x87\x8c\x2a\xdf\xbe\x02\xeb\xcb\xf9\xd9\xcd\x8f\xb7\x7f\xbb\xfd\xf1\xec\xe2\xc3\xd5\xf5\xd0\x11\x0d\xf7\x29\x4d\x70\x81\x97\x34\xa3\x61\xde\xdd\xb1\x82\x37\x3f\x03\x46\x95\xa6\xa7\xa9\xe0\x85\x59\xa7\x28\x19\xc4\x6b\xd6\x31\x58\x11\x86\x0c\xe7\x83\xaa\xc2\x3b\x4d\x6b\xee\xf6\x50\x6b\x81\x99\x72\xc2\xce\x50\x7d\x6e\x83\x66\x51\x32\x2d\xa8\x3e\xd5\xe3\x86\xd3\x31\x41\x09\x67\x69\x4a\xd2\xd6\xd4\x8f\xec\x03\x3a\x77\xa0\x77\x75\xc4\x28\xba\xf9\x78\x7b\xf5\x3f\xe3\x47\x45\x96\x46\xa2\xdc\x03\x47\xf2\x60\x23\xa4\xc9\x64\x04\x26\x3f\xd9\xe8\x9e\x09\x97\x9e\x77\x06\x2a\xf9\x3b\xae\x12\x79\xb8\x3f\x95\xac\x1d\x99\x5f\x43\x40\x39\x4f\xc9\x02\xdd\x18\xa6\x08\xdd\x76\x83\xbc\xbf\xfa\xae\x66\x03\x60\xfe\xd5\x1f\x33\x45\x71\x96\xed\x90\x96\xc4\xb6\x38\x23\xc6\x85\x2c\xb8\x57\x5b\x41\x75\x49\x2d\x13\x97\xda\xe4\x1a\x2b\x9c\xc9\xc0\x01\x8f\xe1\x83\x9a\xd5\x7f\xd0\xc2\x64\x24\x9e\xaa\xf7\x51\x4a\x18\x57\x56\x2e\xd5\x23\x41\x40\xad\xe0\x09\x32\xb2\xa9\x71\x43\x04\x56\x55\x87\x13\x55\xcc\x12\x58\xac\x63\x83\x54\xba\xb5\xde\x54\x63\x82\x26\x1e\x80\x59\x4a\x22\xf7\x6e\x1b\xcb\x06\x6b\x69\x55\x8f\x2b\x08\x4e\x21\x36\xac\xc0\x6a\x03\x76\xcd\x00\xd0\x1c\xcb\x7b\x92\x9a\x57\x17\xe6\x1e\xb6\x92\xb4\xb4\x1d\x00\xec\xf4\xee\x34\x16\x56\x04\xab\x52\x10\xb8\x7f\xc3\x42\xee\x92\x20\xc2\xf0\x32\x0b\x45\x9e\x45\x05\x45\xe2\xf4\x23\xcb\x76\x9f\x38\x57\xef\xaa\x90\xaa\xc8\xed\xfc\xa1\xea\x09\xde\xd4\xa0\xe1\xb2\x05\x23\x65\x3a\x07\x34\x41\x20\x57\x5c\x25\xf3\x8b\x7a\xfb\x8e\x40\x9e\xa2\x64\x67\xf2\x3b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbb\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\xbd\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x01\xef\x10\xce\x24\xb7\xc2\x54\x48\x32\x62\xe8\x06\x7c\x26\x4d\xf9\x7f\x81\x20\xc6\xd9\xc4\x5d\x2c\xb9\xda\xa0\xbd\x17\x06\x88\xb3\x0b\xd1\x84\xef\x19\x03\x53\x9d\xa0\x44\xd9\x3e\xe0\x10\x71\xe2\x7b\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xf8\xfd\x93\xcc\xf7\xb0\xd3\xd7\x9c\x69\x32\x8e\xdc\xeb\x2b\x96\xd2\x04\x1b\x1e\x64\xbb\x59\xd7\x24\x0c\x56\x4d\x2b\x63\x62\x88\x81\x1b\xe0\xb2\xa5\x24\xc2\x74\x77\x16\x25\x31\x48\xfc\x6b\xb9\x24\x19\x51\x26\xe2\x16\xe2\xfa\xb1\x32\xad\x04\x4c\x43\x79\xac\x1c\x61\x84\x4f\x3a\x61\xb2\x84\x76\x21\x5a\x35\x56\x28\xe5\xa4\x8e\x57\xc4\x12\x7d\x7f\x75\x81\x5e\xa3\x97\x7a\x7e\xaf\xc0\xc7\xb2\xc2\x34\x24\xb6\x2b\x6e\xbc\x30\xfb\x72\xf5\xca\x01\x87\x65\x00\x7d\x22\x2e\xcc\x31\x9c\x21\x16\xf2\xf9\x40\xb7\x18\xbb\x42\xad\xee\xb8\x18\x63\xeb\x99\x03\xa3\x4d\x9b\xd0\x03\xe4\x1c\x1a\x27\x4c\xe8\x3e\x72\x0e\x40\x1c\x26\xf4\x11\xe4\x1c\xcd\x92\xbe\x97\x44\x8c\xe0\x48\xdf\x1f\x95\x23\x35\x45\x00\x4d\xb5\xed\xd5\x1b\xd2\xcc\x89\xc2\x29\x56\x18\xd1\xd0\x76\x94\xac\xd1\x11\xe4\xd7\xb0\xc1\xc7\xe3\x57\x92\xbc\xa7\xac\x7c\x34\x2e\xb2\x31\x2a\xe4\xed\x25\x7c\x88\x12\x37\x79\x40\x38\x2e\x8a\x8c\x9a\x00\xe1\x76\x1e\x65\x00\x33\xe6\x90\x37\xd3\x63\xfa\x04\x1f\x38\xca\x38\xcb\xb8\x66\x95\xfa\x56\xc7\x2c\xe5\x79\x00\xec\xfe\x04\xb5\xc0\x44\x70\xb2\x69\x5a\xd8\x7b\x88\x65\xd4\x25\xf5\x4f\x7e\xed\xc5\xa9\xce\x19\xd9\x92\x60\xda\xcd\x7e\x76\xad\x7e\x5f\x0b\x4e\x6e\x07\x00\x00\xca\xf0\x92\x64\xe6\xf2\x30\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xf0\x6c\x4c\x30\xd2\x27\x9e\x81\x7f\x0b\x57\x8b\xd1\x00\xbe\x92\xb5\xc0\x6b\xf1\x6b\x01\xb9\xbe\xb5\x16\xd0\x77\xbe\x8e\xb5\x94\xc1\x9b\xa8\xb3\x16\x7d\x71\xb5\xd7\x02\x37\xc8\xd7\xb0\x96\x08\xb5\xfe\x81\xb2\x94\x3f\xc8\xf1\x4c\xf7\x07\xf3\xa1\xe3\x0c\x89\x66\x3d\x8a\xb2\xb5\x6c\x32\x5e\x1c\x34\x96\x36\xf5\xd4\x3e\xce\xeb\x8c\xf3\x55\x3e\x75\x97\x47\x05\xa0\x3b\x81\xab\x94\xd6\x3f\x73\xc0\x45\x1a\xa2\xf8\x28\xde\x78\x74\x0e\xb8\xce\x25\x3e\x17\x1a\x96\xa2\x38\xbb\x2d\x46\xb5\x3d\xfb\xee\xc3\xed\x59\xfb\x63\x4d\xb8\x0f\x90\x72\xaf\xd7\xa3\xff\x8e\x70\x9a\x53\x29\xc3\x26\x69\xc0\x2f\x59\x42\x3b\xba\x97\xce\x47\xb1\xa6\x6a\x53\x2e\x17\x09\xcf\x1b\xee\x8a\xb9\xa4\x6b\x79\x6a\xa9\x6c\xae\x67\xff\x6a\x00\x2e\x65\x19\x65\x0d\xa3\x03\x24\xb0\x5b\xa1\x0e\x26\x98\x54\x2b\x00\xd4\x9b\x4c\xd3\x01\xa0\xc6\xca\xdb\x83\x00\x93\x5d\x4a\x49\x96\x5a\x43\x84\x09\xc7\xd6\xe7\x39\x2b\x36\x78\x0e\x17\xc6\x00\x70\x9b\x33\x06\x7a\xfd\x86\x33\x6e\x7d\xe8\x26\xe6\xd8\xaa\x52\xc6\x2e\x01\x93\xb0\x27\x47\xcf\x65\x00\x70\xd3\xf2\x71\x14\xd6\xd6\xa5\x9e\xeb\xc1\xc0\xfa\x01\x0a\x02\x04\xda\x8c\xb9\x46\x34\xce\xc0\xca\x7a\x37\xd2\x08\xdf\xbf\x86\x7d\xa8\x34\x9e\x91\xe8\x07\xcd\xc7\x7e\xa6\xb9\x8d\x63\xc2\xbd\x9a\xd0\xc0\xa2\x3a\xb5\x57\x7a\xb5\x21\xfd\x4a\x5b\x23\x1a\x3c\xbe\x5d\x7d\x69\x48\x2b\x1a\x00\xd9\x27\xec\x3e\x49\xd6\xed\x07\x7a\x04\x79\x17\xf5\xc9\xbc\x7b\xf4\xbc\x24\xca\x92\x33\x10\x6c\x8e\x77\x68\x39\x74\x5c\x52\x2a\xc1\xac\x09\x4e\xe9\x26\xf1\x7e\x6a\x12\xd2\xb1\xe9\xf4\xc9\x8e\x79\x13\xd8\x1a\x9d\xd5\x7d\xdb\x78\x1f\xd1\xae\x29\xea\x86\xa7\x26\x64\xbc\x0a\xca\xf5\xf6\x3f\xb4\xa1\xeb\xf4\x67\x77\xf7\xd7\x92\x05\xe3\x26\x66\xa2\x19\x47\xee\x1a\xcc\x9a\xa6\xa9\x1e\x98\xd6\xa2\x6b\x9b\xaf\xb6\x66\x61\xac\x5c\x1b\x2a\x9b\xc9\xe1\xb3\x6a\xd2\x01\xa7\x71\xb3\xb5\xc3\x0c\xfd\x77\x29\x15\xc2\x95\xfb\xb9\xd5\x73\xa2\x8a\x39\x06\x72\x4a\xbc\xd6\x14\x97\x8b\xa5\xb8\x9e\xcc\x96\xa6\x04\xa5\x74\xb5\x22\xce\x2d\xbe\x24\xa8\xc0\x02\xe7\x44\x81\x1b\xc5\xa0\x16\xba\xf0\x32\x3f\x31\xf0\x15\xc2\xae\xd7\x6d\x15\x01\x37\x33\x3e\x5a\xaa\x50\x4e\xd7\x1b\x23\xeb\x20\x8c\x32\xce\xd6\x10\xd1\xa7\xa7\x90\x71\xec\x3b\x89\xc0\x1c\xb8\x40\x0f\x58\xe4\x08\xa3\x04\x27\x1b\xb0\x12\x62\x86\xd2\x52\x40\x82\xa7\x22\x38\xdd\xcd\xa5\xd2\x7a\xb6\x96\x8e\xc0\x94\x66\x30\xe0\xf5\x42\x77\x3a\x61\x00\xbe\xa8\x89\x44\xd6\x77\x49\x75\x4c\xac\xaf\xc0\x09\x07\x4d\xf2\xf3\x40\x6f\x1d\xb0\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\xdf\xbd\x39\xa5\xf4\x77\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xa7\x94\x7e\x78\xa6\x94\xfe\xf1\x73\x9b\x52\xfa\xa7\x94\xfe\x29\xa5\xbf\xf1\x4c\x29\xfd\x9d\x51\xa6\x94\xfe\xaf\x23\x59\x6f\x4a\xe9\x77\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xff\x90\x0b\x2d\xa5\x9e\x54\xcb\x98\xac\x03\x6b\xc0\x6f\xc4\x2a\x2e\xcb\xd5\x4a\x6b\xa8\xdc\x7b\x59\xeb\x11\x3b\x96\xe8\x2a\xf7\xad\x72\x74\x59\x6b\xb2\x24\x6a\x06\x69\x0d\x26\x4c\x67\x1c\x50\x1b\x48\x09\x69\x8d\x82\x48\x48\x03\x60\xe8\xf2\xe3\xbb\x45\x23\xe9\xc1\x6b\xca\xf4\xa6\x42\x0c\xc5\x1c\xc3\x6c\x3e\xb2\x24\xc6\x29\x59\x23\xb6\x2f\x12\xd4\xe2\x37\xc9\xb8\x34\x31\x05\x00\xda\xe7\x9a\xda\x60\xc6\x88\x93\x3a\xa8\x02\x59\x79\x49\x08\x43\xbc\x20\xcc\xf8\xa1\x5c\x5b\x06\x84\x95\xc2\xc9\x66\xa1\xc7\x67\x41\xa8\x2e\x3b\xb4\x1a\x5d\xb3\x5e\x82\x73\x83\x5c\x41\x72\x4c\xcd\x00\x08\x27\x82\x4b\x89\xf2\x32\x53\xb4\xa8\x86\xf0\xed\x18\x81\x18\x20\x13\x99\x55\x21\x0c\x1c\x0b\xc4\x98\xe2\x21\xa6\xdf\x6e\xac\x74\x4b\xe0\x6c\x30\xf0\x1a\x64\xa3\x19\x24\xb4\xe7\x85\xda\x19\x97\xab\x71\x3c\x51\x21\x15\x4a\x32\x0a\xd7\x3f\xcc\xce\xe4\x84\xc2\x28\xb3\x80\x53\x5f\x41\xae\x28\xac\x55\xda\xc5\xb2\x14\x6e\x8d\x42\x49\xe3\x68\xac\x87\xb1\x03\xa4\x54\xda\x3b\x5a\xfa\x3c\x13\xd8\xf5\x0e\x31\x9b\xed\xd6\x0a\xdb\x9d\xc2\x10\x6e\x4c\xfb\x53\x63\x90\x01\x2c\x40\xca\x93\x55\x94\xea\x43\x05\x29\xc6\x2e\xcf\x67\xd6\xea\x33\x52\x54\xc9\x72\x6a\x83\xfd\x95\x16\xdc\x41\xb4\xb3\x05\x22\x60\x64\xab\x69\x96\x24\x44\x8b\xd0\xb8\x73\xc2\xcc\x70\x07\x1d\x25\x45\x44\x4e\x19\xb8\x65\x3f\x10\x29\xf1\x9a\xdc\x78\x0d\x3c\x3e\xb1\x09\x6c\x3c\x35\xaa\x81\x10\x32\x90\xa1\xea\x5f\x6a\x97\xd8\x89\x8f\x21\x34\xa6\x82\x72\x33\x97\x2a\x06\xf0\x41\x50\xa5\x75\x2a\x2a\x4d\x2e\x1d\xd8\x35\xf7\x03\x2e\xfd\xa0\x9b\x4e\xb8\x0f\x0e\x74\x0d\x52\xf3\x77\x96\x1a\xc7\xd5\x92\xa0\xa5\xa0\x64\x85\x56\x94\xe1\xcc\x7a\xa0\x7c\xf4\x05\x39\x22\xd8\x08\xd4\x52\x6a\xd1\x94\x33\xe7\x58\x71\x6b\x58\xa0\x1f\xec\x22\x94\x28\x59\x82\x07\x73\x96\x19\x4f\x09\xa2\x2b\xb4\x06\x6f\x97\x30\x0e\xf5\xdf\xbf\xfe\xf7\x3f\xa0\xe5\x4e\xdf\x88\x60\xa8\x54\x5c\xe1\xac\x42\x53\x46\xd8\x5a\xef\x01\x30\x08\xdf\x59\xc8\xb2\x66\xfa\xa5\xc3\x2c\xd4\x55\x31\x4b\x7f\xf3\xed\xfd\xb2\x7d\xa5\x9f\xa6\x64\x7b\xda\xd8\x97\x79\xc6\xbd\x71\x29\xdd\x66\x38\xfd\x97\xef\x80\x78\xd9\x43\x90\x50\x7c\x21\x82\x24\x5d\xf2\x13\xda\xf0\x07\x93\x83\xd9\x43\x51\xb5\x4b\xbc\xe0\x45\x99\xf9\xbb\xf6\x20\xf4\x4e\x53\x31\xe0\xa9\xb4\xb7\x43\x2b\x9c\xb1\xf7\xe4\x80\xa2\x6f\x01\xfb\x79\x5d\xf3\x86\x37\x2e\x4e\x37\x3d\x6e\xe3\xa1\xac\x92\x5b\xe5\x3e\x95\x82\x2c\xd0\x3b\x9c\x65\x4b\x9c\xdc\xdf\xf1\xf7\x7c\x2d\x3f\xb2\x4b\x21\xbc\x62\x40\x6b\xde\x19\xd6\x7c\x79\x53\xb2\xfb\x76\xab\x85\x8c\xaf\xb5\x1c\x57\x94\xca\x45\xac\x34\x56\xe5\x01\xec\x66\x0a\x67\xbc\xba\x04\xb0\xed\x65\x53\xc3\x26\x8f\x40\x57\x10\xf0\x84\x19\x22\x7a\xae\x3e\x4c\x6b\x8a\x6e\xce\x45\x36\xc9\xf2\xdb\xd7\xbf\xff\xa3\x21\x7d\xad\x5d\xfc\xf1\x35\x38\xff\xe5\xcc\x30\x17\xcd\x19\xfd\x1c\x5a\xe6\x38\xcb\xb4\x22\xd1\x24\x6a\xbd\xad\x8b\xd8\xde\x4d\x43\xd4\xaa\x62\x08\x33\x5a\xb8\xbb\xbb\xfb\x5b\x40\xb2\xa3\x4a\x92\x6c\x35\x33\xb1\x77\x55\xbe\xed\x09\x5c\x14\x27\x96\x77\xe9\x5b\xbd\x7b\x35\x1c\x26\x66\x6d\x79\x56\xe6\xe4\x82\x40\xd3\x95\x88\x65\xb6\xde\x77\x11\x1b\x99\xed\x8f\xb6\xcc\x78\x72\x8f\x52\xfb\x47\x98\xac\x67\x99\xe0\xb5\xb2\x21\x3d\x0d\x5d\xb0\x8a\x02\x82\x00\x3c\x17\xc9\xf3\xd4\x8e\x5b\xcd\x39\xb7\xfc\x6d\x39\x2e\x0a\x68\x34\xb6\x82\x04\xa1\x07\xb3\x80\x80\x8e\x05\x10\x6c\x27\x1d\x7c\x9c\xee\x5b\x06\xa8\xff\x42\xee\x59\x4f\xfd\x89\xdb\x80\x02\xfe\xdb\xc4\x8b\x8c\x48\xad\x43\x75\xd8\x5e\xb5\x36\x73\x63\x68\xcc\xc0\xc9\x7c\x72\x1f\x9e\x51\x7d\x8f\xc0\xac\xd0\xe8\xf4\xd4\x8c\x57\xc6\xa8\x20\x42\x42\x73\x38\xf5\x19\x76\xf4\x3c\xc3\x34\x94\xd1\x85\x50\xdd\xf0\xe8\x69\xcb\x18\xee\xc0\x53\xef\x89\xf7\x95\x80\xb7\xef\x89\xbd\x79\x0c\x81\x43\x32\x7e\xcc\x19\xbe\xe1\xa9\xfd\x04\x0e\xa9\x29\x5c\xd0\x23\x6a\xc9\x88\xdc\xf7\xa3\xb7\xc7\xfb\x5c\xaf\xa5\x7d\x56\xf5\x2f\xd5\x61\x35\x6f\xd9\xa3\xe8\xdd\xdb\x23\x1d\x51\x18\x7a\xd4\x09\x85\xb3\xd9\xe8\xb8\x55\xdf\x07\x2d\x11\xda\x6c\x42\x90\x82\x6b\x51\xc6\xca\xc4\x0b\x64\x6c\xda\x1a\xeb\x16\x2c\x3a\x79\x7b\xf2\xe4\x73\x6a\x16\x29\x78\x81\xd7\x03\xa5\xa3\xf6\xd6\xba\xff\x21\x4a\x89\x11\x30\x88\x04\x21\x0d\xfe\x0e\x6e\xa3\xe0\x42\x0b\x0b\xc1\x75\x76\x72\x3e\x3e\x6b\xa6\x75\xe8\xb3\x22\x88\x09\x0e\x7e\x08\x7a\xb1\x11\xc2\x82\x97\x2c\xb5\xfa\x79\x65\x08\xf9\xb0\x37\xe1\x6b\xce\x40\xc8\x31\x39\x48\x81\xb0\x55\xf3\xb4\x62\xc4\x35\x87\x79\xb3\x78\xf3\xfa\x97\x65\x93\x77\x7b\x0d\xf1\x34\x46\xae\x2b\x36\x69\xce\xc6\x93\x67\xe4\x0a\x6c\x44\xcf\xea\x83\x55\xda\xea\xfa\x19\xd4\x55\x15\x80\x9f\xb4\x32\x46\xa2\x4a\xe1\x21\xf4\x12\x44\x1a\x2d\x0b\x36\xb2\x12\x5e\x8d\x2a\x03\x13\x97\xd6\xae\xf5\xbb\xe5\x93\xce\xb6\x39\xc4\x86\x68\xfb\x74\xe1\x30\x35\xd9\xaf\x7b\x8e\x79\xab\x8b\xdc\x0b\xf4\xd2\xbc\x79\x22\x21\x16\xf5\xd5\x93\xb7\xd7\x2e\xfb\xf2\xb1\x08\xe6\x51\xb6\x96\x7e\xf9\x58\x60\xd0\xa1\x8b\x21\x1c\x0c\x08\x1d\xed\x5b\xc6\x8f\x83\x3f\x93\x0d\xde\x12\x88\x93\xa5\x19\x16\xde\x4c\x02\x0b\x97\xa3\x5b\xb3\x2a\x68\x76\x4b\xd8\x96\x0a\xce\xc0\x4f\xb5\xc5\x82\x42\x4e\x11\xb4\x22\x24\x4c\xcb\xa7\xbf\x7d\xf9\xf9\xec\x13\xf8\x07\xc2\xd9\x6e\x26\xf7\xc0\xae\xbc\x94\x10\x83\xb0\xb7\x82\xc6\x50\xf5\xc6\x0d\xcd\xb5\x67\x53\xdd\xfc\xf5\xae\x00\xaf\x73\xeb\xd1\x73\xc8\x4b\x55\x62\x7f\x36\x85\x79\xc8\x63\x92\x95\x92\x6e\x9f\x7a\xfe\x87\x25\x9e\xea\x56\xfc\x02\x02\x8f\x0d\xe9\xbe\xa0\x1e\xda\xed\x6f\xb8\x7b\x22\xbb\xb1\xe0\x60\xd6\x63\x5c\x0d\x77\x3d\xed\x35\x2e\x9f\xc8\xaa\x36\x4e\x33\x95\xd5\x2a\xae\x36\xe5\xc2\xab\x05\x55\x75\x21\xd3\xae\xd9\x1d\xf2\xb3\x8e\xa3\xc2\xfa\xf7\xd2\xb3\x47\x81\xdd\xf1\xed\x0b\x61\x2b\x2e\x12\x92\xea\x6b\x48\x16\x38\x21\xef\xf1\xb2\x5b\x05\xa0\xcd\x4d\x7a\x3f\x71\x90\x24\xd4\x9b\x05\xa7\x35\x73\x2f\x98\x7c\xed\xce\x74\xf9\x0a\x71\x41\xd7\x94\xd5\x35\x1b\x70\x46\x84\x49\x18\xce\x89\x12\x34\xa9\xea\xb3\x42\x9a\x5c\x62\x62\xcc\x8d\x95\xad\x1f\xa6\x71\x6b\x35\x7d\x1f\x4b\x52\xa9\x23\x66\x32\x56\xd1\x32\x68\xaa\x06\x80\xae\xd7\xd5\x08\xbd\xd8\xeb\xd9\x26\xa2\xc7\x03\x69\xe4\x8a\x29\x22\xb6\x38\x8c\x3a\xf7\x92\x96\x41\x1e\x08\x61\xad\xf0\x8b\x1a\x56\x27\x6e\xd5\x3f\xbe\x6d\x4f\x7c\x23\xc8\x8a\x3e\x06\xc7\xbe\x6b\x76\x33\xfe\xfe\xd3\x7b\x40\xc2\xdd\x06\x33\x2e\xd1\xa7\x32\x83\x32\x72\x52\x61\x60\xb1\x55\xdf\xed\x2d\xa6\x99\xe6\xbf\x1d\x3c\x97\x2c\x6d\x2a\xfe\x8c\x24\x44\x4a\x2c\x76\x9a\x41\xae\x09\x23\x02\x2b\x7d\x2a\x84\x3e\xae\x7a\x34\xd9\xf3\x6e\x07\x28\x5d\xed\x4d\xc8\xb9\xc1\x44\xd5\x38\x14\x12\x3a\x40\x5c\xba\xb8\xbe\x35\x4d\x6c\x63\x71\xb5\x16\x45\x72\x0b\x71\x8d\x77\x99\x3c\x87\x23\x1c\x44\xd8\xc9\x77\x9f\x6e\xce\xed\x07\xef\x6f\xcd\x07\xf5\xd1\x37\x0a\xfc\xfa\xd3\xcd\xb9\x0d\x96\x0c\xdd\xa2\x76\x55\xff\xa3\x24\x82\x12\x61\x3d\x09\x82\x24\x5c\xe8\xbb\x49\x94\x19\x01\x3f\xca\x02\x5d\x73\x45\xde\xa2\xf3\x52\x08\xc2\x14\x64\x0e\x65\xfd\xe6\xe8\xf3\xb3\x77\x34\x23\x33\x74\x4e\x84\x32\xff\xa5\x0f\xcd\x5f\xc9\x0e\x0c\xa3\x20\xeb\x9a\x90\xaf\x2a\x06\x64\x81\x3e\xe0\xa2\x4a\x3b\x3d\x39\x99\xcf\x35\x42\xe6\x66\xf2\x73\x95\xc9\xf9\xff\x75\xd2\xb5\x0a\x9f\xbf\xbf\x42\x58\xac\x65\xc7\x60\x1c\x52\xc0\x12\xdc\xc7\xde\xdb\xa1\x82\xaa\x4c\x2a\x45\xc8\x5d\xcd\xe7\x67\x28\x21\x42\x35\x03\x08\xc1\xee\x89\xc5\x9a\xa8\xde\x60\xee\x21\x35\xd0\x6c\xd7\x07\xec\xad\xc7\xb6\x7f\xe3\x98\xb7\x9b\x13\x03\x07\x57\xfc\x8c\x62\x66\xa5\x9f\x7b\x12\x2f\xa1\xeb\xa3\x7b\x4f\x76\x26\x3e\x3e\x23\x49\x30\x80\xf2\xf8\x6a\xcb\xc9\x75\x23\x6a\xc4\x0a\x62\x6a\x74\x04\x21\xdf\x12\xb1\xa5\xe4\xe1\xd4\xde\xe5\x73\x2d\x87\xce\x0d\x17\x96\xa7\xc0\x9e\x4f\xbf\x81\xff\x09\x0a\x4a\x26\x92\xe9\x2c\x4d\xad\x2e\x59\x4a\xb2\x2a\x33\x4b\xf1\x0b\x84\x0b\xfa\x99\x08\x49\x39\x9b\xa1\x7b\xca\xd2\x19\x2a\x69\xfa\x5f\xa1\x70\x9f\x28\x7c\x71\xe7\x50\x8b\xc5\xd9\x2d\x88\x25\xbb\xaa\xfe\x32\x90\x77\x45\x5e\x5c\x40\x39\x65\xbd\xa7\x83\x6d\xbb\x97\x50\xc6\x8f\xb2\x60\xcc\x67\x54\x25\xb0\x41\xd1\xf0\x9e\xf8\x84\xd4\x41\xb9\x4f\x92\x44\xf8\x03\xdf\xda\xa8\x81\x57\xbf\xd2\x23\x66\xa9\xdc\x2c\xa7\x3e\x70\xc0\xdc\xad\x09\x67\x68\xb7\x5c\x4f\x7d\x0b\xe3\x9e\x04\x93\xd9\xa6\xe3\xfa\xb5\x1e\x57\x4b\xa7\xff\x6a\x67\x35\xf8\xe7\x04\x6b\xf9\x61\xf0\xf6\x76\xde\xd4\xe6\xa5\x6d\x35\xa1\x1b\xc1\x73\x8d\xc3\xb2\xe9\x4d\xf3\x44\xfb\x46\x9e\xf7\xe0\x96\xeb\xb1\x23\xa4\x0d\xd1\x23\x6e\xd8\x58\x15\x98\x3d\x78\x4c\x27\x81\x63\x12\x38\x3a\xcf\x3f\x31\x07\x9b\x04\x8e\x49\xe0\xe8\x3c\xd3\x71\xfd\x5a\x8f\xeb\xaf\x52\xe0\xb0\xf6\x8b\x51\x22\x47\xe7\xe2\x0e\xc8\x1e\xbd\x73\x7e\xaa\xd0\x41\xc1\x6a\x27\xc8\xed\x3d\x2d\x3e\x13\x41\x57\xbd\xe7\xbe\x35\xff\x0b\x53\x65\xca\x0e\x09\x73\xa7\x2b\x13\x12\x57\x17\xb2\xf6\x4f\xc4\xb7\x7b\xf7\xc6\xe2\x73\x08\xfa\x34\x81\x7d\x11\xec\xdd\x93\xdd\xad\x97\x7b\x0f\x70\xee\xbe\xf9\x1f\x41\x6c\x0b\x70\xee\x43\xb9\x76\xa8\xf0\x58\x3c\xc7\x1e\xe4\x3e\x21\x4e\xfd\x75\x72\xe9\xa3\x72\xe8\x41\xfc\x0c\x71\xe6\x03\xb9\xf2\x30\xe7\x1d\xe2\xba\x21\x8e\xeb\xe3\xb6\x41\x56\x6a\x2c\xb9\xbe\xa2\x87\xfb\x65\x75\x21\x7c\x73\x0b\xbc\xab\x8a\xd9\x80\x90\xad\xa7\x9d\x6e\xef\x0c\xc1\x2f\x36\xe0\xa0\x00\x23\xf9\x9e\x2b\x0d\x7d\xff\xe9\x7d\xb4\x89\x1f\xbe\xb8\x29\xb3\xcc\x6c\x5a\xe7\xb0\xb7\x9b\x3f\xb1\x8a\x38\xaa\x48\xc8\x86\x9b\x19\x0e\x35\x40\x71\x0c\x52\x6a\xf4\x54\x7e\xa4\x0e\x5e\x1a\xf2\x64\x51\x66\x99\xe1\x56\xb0\x24\x98\x96\x4d\x1d\x10\x64\x4d\xf5\xcc\x89\x44\x92\x98\x2a\x35\xfd\x47\xae\x94\x44\xcc\xd7\x25\x4d\xc9\xa9\xf9\xfe\x1b\xe3\xea\xdc\xe9\x53\x07\xbf\xe8\x51\xec\x14\xe7\x9c\xcd\xf1\xbc\x1b\x2f\xe7\x89\xdf\x6a\xd7\xf1\xe6\x09\xce\x3e\xc2\x8e\x7d\x72\xcb\x77\xbb\x20\x11\x61\xbc\x5c\x6f\x80\x43\x88\x1c\xbb\x82\x63\x59\x6f\xeb\x90\x1d\x2f\x91\x8d\x97\x6d\x30\x99\x84\xa4\xce\xd9\x66\x43\x1d\xbb\xc8\xec\x52\x59\x98\x63\xfb\xb9\xde\xd7\xc8\xf3\x8e\xc8\xf1\x82\xfc\xee\x00\xff\x2f\x65\x54\x55\x8e\xf6\xf0\x79\x39\xb9\x6a\xbd\xeb\x6a\xee\x58\x77\x6f\x1b\x50\x23\xdd\xb6\x87\xf8\x56\x50\x87\xc0\x14\x1b\xe4\x92\x40\xe3\xc1\x46\x65\x45\xb2\x58\x2f\xd0\x8a\xa8\x64\x53\x9d\x40\x7d\xa8\x28\xd3\xeb\xea\x0b\x7e\xaf\x62\x20\x0d\x0b\x31\xce\xc3\x56\x13\x4d\x73\xf6\x2a\xf7\xa7\xed\xa0\xb9\x40\x67\x6c\x67\xa2\xdf\xbb\x5b\x67\xcb\x24\x42\xd9\x57\xa8\x64\xa7\xc1\xf0\x15\x34\xfb\x6c\xae\xd5\x38\x4b\x33\x82\x4d\x51\x6e\x97\x79\x84\x78\xb7\xef\x84\x2d\x59\xf9\xd4\xe2\x0b\x7a\xf8\xba\x1b\xa5\xec\x76\xba\xfc\x5e\xf6\xec\x08\x74\x4b\x65\x3b\xe0\x51\x09\x96\x2e\x16\x0f\xb2\xbb\xac\x1c\x02\x38\x87\x4f\xbb\xe8\x20\x4c\x51\x41\xb2\x1d\xe2\xa5\xaa\x0f\x71\xc2\x4d\x27\xad\x07\x17\x8f\x9c\x63\xda\x4e\x63\xb1\xfe\xc7\xde\xfc\xb2\xe5\x0e\xa5\x1c\x2a\x93\xf1\x19\x30\x0f\x93\x54\xe6\xa2\x9b\xc1\x2b\xbf\xc1\x5b\xca\x4b\x61\x4a\xb9\x0a\x82\xef\x11\x56\xb0\x8e\xde\x3e\x36\xfa\x64\xf2\x12\xa2\x2c\x69\x42\x3a\x4e\xcb\x18\x76\x78\x56\x65\x09\x16\x45\xa6\x05\x74\xda\xcc\xbb\x33\x73\xd3\x73\x75\xd5\xb7\x5c\x3b\xd3\xde\x78\x56\xac\x4f\xc0\x58\xe6\x86\xc5\x3a\xaa\xcb\xf4\x99\x58\x97\x39\xa4\xbc\x58\xf2\xaf\xcb\x13\xdb\xde\x64\x3c\xb9\x77\xf7\xa8\x3f\x01\xeb\xfc\xc3\x85\x0b\xa3\x34\x99\x26\x75\x02\xaa\xad\x71\x9a\x2e\xd0\xe7\x83\x02\xb1\x06\x43\xb0\xf6\x63\xb0\xae\x56\x20\x1b\x9b\xb1\x3c\x40\xeb\x2a\xa4\x82\x48\x9e\x6d\x5d\x45\xfb\x6a\x66\xee\xbe\xa6\xac\x28\x95\xe5\x95\x2e\xa4\xc1\x03\xb3\x64\xc9\x06\xb3\xb5\x8b\x2d\x69\xac\x0c\xc9\x1d\x53\xf8\xd1\xf1\x28\x22\x13\x5c\x54\xa9\x33\x28\xe5\xa5\x7f\xa2\xbf\xfd\xed\x0c\x51\xf2\x16\xfd\xb6\x01\x6e\x81\x2e\x2d\x84\x06\x22\x1b\x89\x84\xcb\x1a\x61\xbe\x80\x26\x41\xd6\x58\xa4\x19\xe4\xec\xaf\x5a\xa2\x6a\x15\x2d\x47\x1e\xa9\x54\x90\x92\xc3\xb8\x6a\x04\x23\xf9\x56\x3f\xae\xc1\xb8\x69\x8e\x6b\xd8\xf1\x3c\xc5\x0a\xcf\x1b\x47\xe5\xd4\x48\xc5\x73\x5b\x4b\x73\x8e\x2d\x91\x36\xda\xe7\x7e\x63\x1b\x8f\xce\x71\xf5\x16\xd5\xe2\x0b\xd4\x9e\xec\xbf\xf6\x82\x71\xe8\x83\x3a\x40\x38\x28\x2d\x58\xf8\xb4\x7d\xe2\x2e\xeb\x4e\x48\x00\x0d\x02\x36\xea\x02\xc7\x55\x86\x89\xad\xa2\x79\xe7\xcd\x23\xdc\x3b\x99\xe8\xf2\xfa\xee\xd3\xdf\x6e\x3e\x5e\x5d\xdf\x0d\x1e\x45\x0f\xc4\x81\x03\x1a\x73\x14\x3d\x90\xfd\x07\x74\xf8\x28\x7a\x40\x06\x0e\xe8\xf0\x51\xf4\xb3\x05\xef\x01\x8d\x3e\x8a\x1e\xd8\x9e\x03\x1a\x7f\x14\x3d\x70\x3b\x07\xf4\x57\x7e\x14\x09\xdb\x46\x1c\xc3\xf7\x56\x59\xeb\x0b\x14\xde\x2f\x22\x39\x98\x48\x72\xf4\x44\x98\x4b\xb6\xfd\x8c\x45\xdd\xa2\x16\x32\x90\x7b\x63\x9a\xed\x0b\x5e\x43\x09\xb0\x92\xf3\x63\x64\xc2\x8c\x32\xe7\x37\x75\xa6\xbe\x79\xd7\xc5\x99\x42\x4d\xc5\x11\x3a\xff\xf1\xea\xe2\xf2\xfa\xee\xea\xdd\xd5\xe5\xa7\x27\x3b\x24\x06\xcb\x46\xb6\x19\xf5\x18\x6e\x18\x5c\x44\xcd\x29\x0b\x41\xb4\x24\x2a\x9d\xd9\xc7\x43\x7e\x74\xb8\x8c\x4e\x3b\x2d\x46\xcb\xb2\x52\x2b\x98\x49\x3f\xba\x4d\x95\x88\x30\xaa\xe3\x19\x72\x8b\xf5\x06\x61\x8e\x65\xcb\x96\x01\x07\x61\x3e\x0b\x73\x36\xcf\xe1\x2c\x3a\x3c\xe3\xb6\x24\xd5\x4e\xee\x08\x96\x91\x8a\x27\xeb\x77\x82\x07\x1a\xe0\xee\x9b\x28\x41\x75\xad\xac\x74\x7d\x14\x73\x22\x0d\xdc\x70\xf9\xa4\x06\xe3\xb3\xe2\x46\x55\x12\x48\xff\x0e\xa9\xe3\x21\x08\xb1\xe5\x68\xab\x88\x88\xbf\x92\xdd\x27\x32\x50\x0d\xab\x63\xff\xcf\x48\xa2\x39\xa8\x33\xba\xe3\xda\xa7\x3d\x54\x44\x72\x4c\xb9\xdc\x01\xc7\x6d\xef\xdc\x46\xc5\x48\xb8\x67\x54\xa9\xdc\x83\x8a\xf8\x7e\x25\x26\xaf\xf6\x33\xd6\x00\x16\x05\x74\xc8\x71\xeb\x9e\x51\x38\x8f\x71\xe4\xba\x67\x74\xfc\x45\xd4\xb2\xe2\x3d\x0c\xdd\x45\x0e\xe5\xcc\x99\x27\xbe\xd0\xb1\xdf\xe7\xdb\x1e\x37\xa2\x82\x31\xec\xf5\xd8\xf3\x7f\x52\x33\x00\x93\xbe\x59\x95\xae\x4b\xdf\x3a\xcb\x92\xac\x9a\x21\x2d\x34\x41\x0e\xd3\x4e\xeb\x75\xb0\x3e\xcf\xea\xdf\x20\xab\x44\x36\x7e\x00\x2e\x69\xb2\x32\x86\x41\xcb\x82\x24\x0b\xc6\x53\xa2\x0f\xe1\xcc\xfc\xd3\xde\xed\x67\x49\xc2\x4b\xa6\xec\x1f\xa0\xb0\xc8\x62\xc3\xa5\xba\xba\x89\x00\x6b\x5e\x2f\x78\x7a\x75\x33\x6b\xfd\xab\x1b\x97\xbf\xff\x8c\x61\x83\xf5\x39\x1c\x4d\xfe\xf6\xbb\xca\x31\x9a\x6c\x48\x8e\xe1\x3f\xdf\xe9\x8d\x0b\xe4\x9b\xb5\x1f\x2a\xeb\xe2\x3f\x0c\x2a\x9e\xe8\x7b\xbb\x5d\x2e\xff\xc5\xf6\xcd\x8b\xa3\x33\xdb\x95\x9b\xe6\xe8\xa5\x83\x6b\xdd\xb5\x77\x01\x2a\xad\xfd\xc1\x11\xd2\xa0\x7b\xea\xae\x58\x67\x37\x57\x68\x6b\xf0\x79\xe4\x65\xc6\x9f\xfc\x55\xe4\xae\x45\x9f\x7f\x2d\x8f\x6a\xc9\xe5\xdd\x13\xf9\x80\x83\xd3\xa9\x97\xf1\x16\x92\x65\x06\xf1\xe5\xbe\xb7\x65\x6c\xa4\xad\x34\x06\xad\x06\x24\x7a\x69\x7e\x5c\x24\x45\x39\xb3\x2f\x2c\x72\x92\x73\xb1\x1b\x3e\xa5\xf6\x75\x52\x6c\x48\x4e\x04\xce\xe6\x52\x71\x81\xd7\x90\x46\x6d\xc0\x1b\xb0\xd5\xbf\x0c\xe0\xe1\x53\xd9\x98\x60\x17\xba\xd1\x65\x92\x2a\x63\xa8\xce\xf7\x39\x26\x67\xa8\xb0\x3c\xdc\x53\xcf\x3c\xed\xed\xab\x9d\x25\x20\xd3\x54\x74\x08\x62\xac\x2d\x69\x11\x77\xe9\x57\x1e\x5b\x48\x19\x64\x5b\x2d\xf4\x06\x2a\x49\xd6\xcf\x28\x66\x90\xd2\x2d\x95\x7c\xa0\x51\x6d\xcf\x42\x6f\x5b\x1d\x48\x6c\xc5\x24\xe3\x38\x8d\x6b\xdd\x68\x1e\xf2\x58\x40\xc5\xbb\x8a\x56\xf7\xf8\xdf\x9b\x17\xc7\x5e\xb0\x1b\x69\xfc\xd6\x7e\x72\x2c\xa5\x3e\x99\x15\xfb\x3b\xf2\xbe\xc4\x73\x2f\x37\x95\x63\x31\x2f\xe3\x1f\x3b\x8e\x02\x63\x7d\x6d\x75\x89\x9b\x81\x4a\x03\xc8\x6a\x02\xfd\x41\x07\xed\xe7\x97\xd2\x79\x9e\x1a\xb4\xea\x9e\xd1\xc1\xab\xee\x99\xf4\xa8\x5f\x93\x1e\xd5\x09\xc1\x8a\x5a\xd7\xbf\x9c\x12\x15\xf1\xda\x70\x18\xef\xf3\x15\x77\x20\x6c\xeb\xb7\x64\xf5\x1a\xf0\x9d\x24\xd6\xa8\xcb\xd8\x6f\x02\x0d\xbb\x91\x5a\x85\xe8\x80\x41\xd5\x46\xda\xda\x25\x67\xee\xa6\x7c\xc0\x74\xdd\x32\x5a\xa3\x33\xe8\xc5\x67\x18\x14\x80\x75\xd6\x50\x41\x6c\x61\x7d\x53\x60\x94\x6c\xfd\x76\x7c\x68\xe3\xb9\x57\x23\xc2\xb6\xf1\xa0\x6c\x6d\x8b\x1c\x99\xfb\xc1\x1a\x1b\x29\xab\xea\x08\x7b\x60\x56\x62\x81\xaa\x9a\xea\x62\x29\x79\x02\xbd\x3d\xea\x3e\xb6\x50\x5a\xd2\x2e\x1c\x66\xae\xf0\xbd\x0f\x64\xb3\xa7\xee\x67\x0d\xb1\xc6\xe1\x72\x07\x75\x6d\xd9\xb6\xb2\xdb\x96\xc6\xc7\x64\x2e\x83\x40\x03\x56\x68\x5a\xda\x84\xfc\x1c\xde\x16\x4d\x74\xd6\x2a\xda\x70\xba\xc0\xfd\x54\x69\x0a\x18\x7c\x42\x3d\x21\x39\xee\xa9\x4c\x35\x3e\x5a\x8b\xb9\x5a\x2b\x53\xe7\x80\x98\xd0\xb9\x53\x6b\x43\x51\xfb\x2e\x3d\x82\xf9\x35\xe6\xf2\xfb\xba\x2f\xbe\xa3\x67\x74\xa0\x31\x97\x59\xec\x45\x36\xc2\x18\x38\xee\x62\x8a\xbd\x94\xa2\x2e\x91\xa2\xb7\x4e\x88\x77\x1d\xcd\x10\x59\x0a\xed\xe4\x57\x14\xd2\x39\x35\xa0\x82\x30\x13\xae\x87\x93\xcd\xe0\x25\x67\x59\x75\x6d\xbd\xaf\x9d\x88\xc7\x75\x14\x1a\x39\x72\xec\x01\xbc\xed\x93\x64\xa7\xd3\xf7\xaf\x73\xfa\xec\x06\x7f\xb1\xa3\xf7\x44\xd9\xaa\x37\x7a\xbe\x67\xe9\x27\x17\x8d\xc0\x22\x53\x1e\x67\x2c\xed\x34\x02\x4b\x4d\xdc\xb9\x67\x45\xed\xc6\xfb\x15\x9b\x50\xdc\x04\x06\xa3\x0d\x5d\x6b\xe4\x9b\x66\xfc\xe6\x66\x44\x39\x66\x78\x0d\x1d\x88\x7c\x68\xe2\x55\x5d\x2e\x2e\x90\x26\x63\x41\xd3\x4e\x79\x2d\x10\x91\x5c\x50\x2c\xfc\x51\xf0\x2c\xf3\x37\x3c\xcd\xe8\x3d\x41\x17\xa4\xc8\xf8\x2e\xb7\x11\x19\x29\xba\x55\x58\x69\x52\xbe\x25\xca\x67\x45\x1f\x20\xd3\x2a\xdb\x20\xba\x0a\xfa\xc9\x15\xec\x4b\x51\x66\x19\x2a\xe0\xa3\x05\x74\x0a\xe7\x2b\x74\x06\xd5\xaa\x66\xe8\x9a\x6c\x89\x98\xa1\xab\xd5\x35\x57\x37\x46\x98\xf1\xf1\xc4\xa6\x33\xda\x7c\x8e\xe8\x0a\xbd\xd5\x62\xb4\x54\x48\x99\x6e\x07\x8d\xe6\xfc\x5c\xb4\xc0\x7a\xa0\x56\x85\x1e\x9f\x10\x96\xe4\x27\xa6\x6f\x00\x52\x95\xc2\xe0\x31\xdd\x0d\x20\xbe\xea\x29\x13\x81\xf2\x33\xdb\x45\x5b\xd5\x11\xca\x8e\x06\x91\x29\x91\xeb\x0a\x18\x82\xb0\xea\xad\x4a\x2b\x88\x2c\x38\x93\xa4\x5d\xd7\xb4\xee\x8e\x05\x2a\x80\x8c\x96\x70\x87\x2f\x90\x82\x4b\x05\x5d\xf3\x63\x9b\x07\xdd\xb8\x0f\xa0\x8d\x06\xce\x32\x92\x22\x9a\xe7\x24\xd5\x5a\x41\xb6\xb3\xad\x51\x70\x54\x85\x69\x0d\xc1\x15\x5b\xbb\x32\x97\xd1\x06\xb3\x34\x23\x02\x2a\xde\x5b\xcd\xa3\xa5\xd1\xb8\xea\xf4\x41\xae\x6a\x6c\xd9\xb6\x35\x07\xc2\x49\xc2\x45\x6a\x9b\x43\x6a\xd5\xde\xc5\xce\x57\x67\x03\xf8\xf7\x20\xd7\x40\xa6\x98\x5c\x7b\x4a\x50\x13\x5c\x36\xba\x86\x6c\x38\xbf\x47\x09\xcf\x8b\x0c\x68\xf5\x78\x5d\x8f\x1a\x44\x5e\xf7\x38\xaa\x28\x63\x0e\x3d\xd9\x4e\x1b\xed\x8f\xe0\x87\xa7\x76\x52\x23\x8f\x24\x09\xdf\x8a\x2d\xea\xd0\x5c\x46\x23\x1f\x0a\x8a\x71\x56\x89\x18\x2b\xae\x99\x35\xc4\xe0\xc3\x29\x18\xb8\x11\x97\xa4\x66\x28\x0b\x74\xf9\x48\x92\xbd\xae\xdb\xb6\x77\x9d\xe2\x70\x9c\xc2\xa6\xbc\x78\x6b\x65\x30\x44\xd7\xbb\xe6\x73\xf3\x95\x2b\xb6\x6e\x81\x40\x8b\x02\xd3\x06\x1f\xc2\x76\x23\xec\x42\x8d\xb4\xa5\x6a\x17\xcd\x09\xe8\xd4\xa5\x0c\xb4\x08\x68\x3e\xcd\xf9\x40\xbb\x1a\xce\x15\x7a\x79\x72\x7a\xf2\xaa\x63\xd4\x88\x2a\xe7\xdd\x7c\xee\x1a\xb0\x29\xd4\x60\x2d\xb2\x1d\xac\xf6\x24\x9d\x21\xaa\x5c\x84\x8f\x28\x99\x5d\x59\x04\x50\x1b\xd3\x3c\x43\x92\x23\x25\x70\x4a\xed\x75\x0f\xbf\x42\xe5\x40\x51\x5a\x4e\xfb\xf2\xe4\x1f\x27\x31\x96\x47\xa2\x92\x57\xe8\x81\xb3\x13\x05\x68\x5c\xa0\x3b\x93\x40\x57\x0d\xb5\xe3\x25\x62\xc4\xe6\x04\x3d\x16\x19\x4d\xa8\x8a\xf0\xf0\x21\x60\x7e\x88\x97\xa6\x95\x92\xe6\xfb\x36\x1e\xfb\xf2\x91\x2a\xd7\xd4\x83\xaf\xd0\x6b\xd3\xdf\x89\x0c\xf0\xac\x0a\x05\x12\xfa\x50\x9e\x6e\x08\xce\xd4\xc6\xb4\xd5\x60\x9c\xcd\x7f\x26\x82\x43\xd4\x36\xb3\x7f\x19\xde\xa4\xa8\xce\xe3\x68\xac\xcd\x35\xae\x49\x74\xb4\xb9\x71\xb0\x09\x3f\x7a\xa6\x46\xfc\x68\x14\x6f\x18\x6e\x29\xd9\x9d\x67\x44\x53\xfe\xc8\x43\xfc\x2c\x8d\xf9\x51\x6c\x73\x7e\x34\x8e\x44\xa2\x9b\xf4\xa3\x83\x1a\xf5\x47\xac\x0a\x9a\x8b\x1f\xd4\xac\x1f\x8d\x39\x36\xa3\x9b\xf6\x47\x39\x14\x4c\x17\x97\xf1\x8d\xfb\xd1\x48\xcf\x1c\x1a\xe1\xb3\x42\xc7\x6a\xe2\x8f\xc6\x72\x1b\x34\xa6\x99\xff\xf0\x34\x63\x1b\xfa\x1f\x30\xcf\x58\x57\x0d\x8a\x6d\xee\x8f\xa2\x1b\xfc\xa3\x31\x5e\x66\x34\x82\x87\xc7\x34\xfb\x47\x47\x6e\xf8\x8f\xc6\xa1\x7e\xb8\x3d\x2e\x8a\x6b\x91\x8b\x46\xb6\xc9\x45\xe3\x5a\xe5\xa2\xfe\x04\x08\x81\x58\xd5\x8d\x55\x75\xda\xe5\x46\xec\x3b\xef\x78\xa7\x82\x2d\x73\x63\x28\xa9\xd5\x54\xf7\xc0\xb6\xb9\xe8\x29\xad\x73\xcd\x03\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\x9a\x55\x12\xec\xcd\x6b\xf5\x3f\x57\x84\x22\xe6\x1a\x69\x5a\x3e\x34\xf9\x1e\x91\x6e\xe3\x98\xc5\x40\x83\x60\x34\xc2\xa9\x3b\xdc\x34\x1c\x1d\xda\x38\x7c\x00\x2b\xd0\x56\x7c\x7c\xf3\xf0\x41\xa8\x55\x6b\xf1\x51\x0d\xc4\xd1\x73\x4b\x7d\x47\x6c\x26\x8e\x46\x36\x14\x47\xbf\x16\xce\x19\xd1\x68\xfc\x57\xcc\x39\x7f\x59\xde\x12\xf1\x52\x21\xc8\xad\xe2\xde\x5a\xa5\x1d\x0b\xa3\x79\xdd\x63\x5f\x5c\x92\x15\x17\x24\xde\xc0\x58\x1b\x0c\x51\x5a\xc2\x49\xc4\x0c\x62\x9f\x9d\xae\xc8\x9b\xa6\xbf\x60\x8c\x05\x6a\xf4\x7b\xd5\x3a\x3a\x23\x52\x9e\x82\x29\xb1\x2c\x6c\xcb\x74\xdb\xa8\x73\xa6\xd7\x4c\x72\x58\xd1\x2c\x26\x4e\xd0\xb6\x15\x85\xd7\x89\x4a\x4c\x88\x89\xb3\x85\x5a\x4b\x8a\x43\x46\x7c\x07\xbf\x44\x60\xb9\x31\x4d\x33\xc9\x23\x55\xb6\x71\xac\x20\x58\x72\xd3\x0d\xa3\xd9\x1e\x95\x4a\x54\x60\x69\x8a\xa3\x84\x6e\x92\x7a\x62\x06\xdc\x0d\x4f\x4f\x4e\x64\x0b\xd4\x5a\xe0\x84\x68\x0d\x9c\xf2\x14\x41\x42\x42\xca\x1f\x42\xae\xad\x25\x59\x53\x26\xdd\xde\x9a\x32\x71\x86\x08\x34\x37\x27\x60\x61\x72\xf9\xef\x0b\xf4\xa9\x4a\xb6\x1b\xb6\xd4\xf2\x52\x25\xbc\x66\x12\x76\xe6\xfb\x86\x65\x08\x5b\x81\xad\x1f\xea\xa1\x53\x91\x53\xb3\xc1\xd1\x00\x0a\xac\x85\x39\x00\xb5\x41\x80\x63\x2d\xcc\x21\x14\x88\xc6\x57\xde\xfd\x81\x36\xd6\x38\xd9\xb4\xfd\x2e\x93\xb1\x7a\x32\x56\x87\x9e\xc9\x58\x3d\x19\xab\x27\x63\x75\xef\x33\x19\xab\x27\x63\xf5\x64\xac\x1e\xfe\x76\x32\x56\x4f\xc6\xea\xc9\x58\xdd\xf3\x7c\x8d\x26\x97\xc9\x58\x1d\xfe\x7c\x32\x56\x4f\xc6\xea\x00\xd4\xc9\x58\xdd\xfb\xfe\xaf\x81\x73\x4e\xc6\xea\xd0\xc7\x5f\x99\xb1\x7a\xe0\x05\x67\xf5\xbd\xd1\x32\x6e\x4c\x24\xf6\x0d\xd8\xd8\x68\x62\xcd\xc3\x7c\xd5\x8a\xea\x35\xc0\x16\x75\xf5\x3d\xcf\xc4\xeb\x7c\x40\x17\xd3\x6a\x8d\xc0\xb5\xd1\xb9\x37\x26\x18\xec\x79\x1e\x98\x07\xd7\x85\x2e\x78\x5a\x5b\xf2\x1a\x26\x3c\x23\xf7\xf7\x1f\xfa\x61\x26\x16\xb6\xdd\x1d\x64\xb7\x6b\x5b\xe6\x02\xc4\xf3\x04\x9b\x5d\x1c\x77\x8e\xb2\xd5\x1d\x60\xa7\x8b\xb3\x55\xc5\xda\xe8\xf6\x2d\x70\x03\x60\xa3\xed\x73\x4d\xeb\xdb\x00\xcc\x38\xdb\x9c\xcf\xf2\x36\x24\xa2\x79\xec\x72\x83\x56\xb7\x01\xb8\xfd\x36\xb9\xa0\xc5\x6d\x68\xa6\xbd\xf6\xb8\xa0\xb5\x6d\x18\xb1\x91\xb6\xb8\x28\x83\x42\xf4\x75\x18\xa3\xbb\x45\x70\x6e\xeb\x56\xbb\xdb\x08\x22\x37\x3c\x0b\x9c\xa4\xd6\x29\xfa\x40\x19\xcd\xcb\xbc\xd5\xff\xdc\x82\x92\x15\xc5\x1b\x1e\x1a\xb4\x6e\x2d\x81\xb6\x35\xe9\x41\x35\x19\x4c\x33\xbd\x1b\x90\xe8\xb0\xc1\x5b\xe0\x38\x65\x92\x10\x02\x35\xcc\x2f\xa2\x0c\x66\xbf\x5b\x54\xb3\xab\x0a\x22\xbe\xf1\xef\x8c\xa9\xee\x02\x12\xcb\xef\xbe\x1d\xc0\x64\x58\xaa\x19\x34\x61\x3e\x87\xf9\x32\x8e\x4d\x0e\x0b\xb0\xa3\x4d\x96\x11\xc5\x70\x9e\xc5\x5c\x19\x65\xaa\x8c\x3c\x45\xd1\x26\xca\xf1\xe6\x49\xd8\xdf\x21\xe5\xe5\x10\xd3\x64\x14\x17\x19\x6d\x92\x8c\xb1\x41\x1f\x64\x8e\x1c\x63\x8a\x3c\xa8\xce\xcb\xa1\x26\xc8\x51\x7a\x47\xb4\xe9\xf1\x38\x66\xc7\x67\xa9\xa9\x14\x81\x97\x38\x33\x63\xb4\x89\x31\xce\xbc\x38\x6c\x5a\x3c\xa6\x59\x31\x12\xb5\xc3\x4a\x71\x84\x42\x3c\x46\x19\x1e\xa1\x08\x8f\x36\x1f\x5a\x24\x0d\x6c\x6b\xac\x02\xbc\xa7\xde\x0e\x40\x3d\x4c\xf9\x7d\x82\xe2\x1b\x63\x2e\x7c\x16\x53\xe1\x38\x33\x61\xd4\x6e\x0f\x1f\xee\x01\xf5\x3d\xe2\xa8\x42\x2b\x27\x9c\x5d\x90\x0c\xef\x6e\x49\xc2\x59\x1a\xe0\xd4\x7b\xa5\x0e\x2a\x9a\x93\xe6\x43\x2b\xb9\xb5\xa3\x6c\x36\xd8\x56\xcb\x09\xfa\xbd\x6d\x80\x92\xd3\xdc\xed\xe5\x02\xb5\x11\xcd\x0c\x0f\xc9\x5e\x3e\x82\x7e\x8d\x8e\x2a\x22\x9a\xc0\xa0\x71\x68\xfe\x0b\x7f\x40\x7c\xa5\x08\x43\x2f\x29\x73\x98\x7e\xd5\x10\x0e\x6b\x59\x3b\x44\x72\x96\x3c\xf5\x77\x6f\x5e\x3b\x30\x5f\x4a\x54\x06\xa1\x5e\xca\x63\x68\x1d\x16\xd4\x53\xd4\x0e\x0b\x62\x55\x66\x6d\xd5\xc3\xa8\x23\xb1\x7a\xc7\x9b\xba\x24\xca\x1b\x98\x4b\x45\xcb\x5a\x9b\xb4\xc1\x8c\x5d\x84\x07\x21\xfe\x02\x5b\x11\xe1\x12\x38\xc8\x1d\x60\x0c\xfe\x03\x57\xec\x28\x57\x40\xd3\xd8\x1f\x80\x3b\xc6\x0d\xf0\x2c\xda\xd3\x11\x4d\xff\x63\xcc\xfe\xff\x72\x92\x4d\x84\x79\xff\x57\x24\xd9\xfc\x12\xb2\x80\xa2\x39\xe1\xa5\x3a\x92\x18\xf0\xb0\xa1\xc9\xa6\xc9\x91\x69\xb8\x5e\x11\x2f\xf7\x1a\x74\xbc\xb1\x00\x7b\x6f\xa9\xe3\x45\xd4\x7e\x65\x52\xc2\xc0\x3e\x45\x76\x4e\x6d\x96\xa1\xaa\x65\xb1\xba\x46\x39\x96\x08\xa3\x8b\xeb\xdb\x1f\xdf\x9f\xfd\xf9\xf2\xfd\x02\x5d\xe2\xc4\x57\x2a\xbc\x51\x25\x84\x99\x86\x88\x86\xf6\x37\x78\x4b\x10\x46\x25\xa3\x7f\x2f\x4d\xad\x22\xf4\xb2\x82\xf8\xca\x79\x4d\x3c\x40\x87\xea\xab\x0c\xf0\x0c\x68\x1c\x30\xa2\x52\xa5\x69\x34\x60\xcc\xc8\x5c\x8b\xf9\x82\xe7\xfb\x6e\xbf\x4b\xfd\x27\x3f\x8b\xc2\x86\xf7\x6c\x88\x20\x68\x4d\xb7\xd6\x60\x67\x4b\xd0\xe0\xb4\x0a\x52\x6d\x76\xda\xc5\x4b\x30\x53\x7b\x39\x14\x23\x4a\x53\x5f\xa5\x71\x70\x26\x9b\xf9\x17\x5a\x23\x91\x33\xb4\x2c\xc1\x54\x5f\x08\x9a\x63\x41\xb3\x5d\x73\x08\x9c\xf9\xf8\xcd\x35\x77\x37\xf4\xce\x5c\xc7\xf5\xf4\x2f\x3e\x5e\xde\xa2\xeb\x8f\x77\xd0\x13\x49\xdf\xac\x60\x45\x87\xbf\x03\x62\x96\xc4\x8f\x06\x5b\xdb\xda\xb4\x5e\x85\x4f\xcc\x39\xa7\x12\x9a\x30\x13\xe8\xf2\x6e\xb5\x72\x57\x0a\xea\xc5\xeb\x05\xfc\x9f\xaf\xec\x35\x4e\x53\xa1\xb9\x79\xe5\x84\xd8\xcb\x1f\xd0\x5c\x16\xf8\x3d\x5d\x66\x8d\xbd\xb3\xd8\xfb\xc5\x3a\x83\x55\xce\xc4\x1b\xbd\xec\x66\x83\xb0\x6a\x23\x01\x21\xa6\x5e\x29\x34\x21\xf5\xf2\x81\xc1\xbe\x66\x91\xf5\x2a\xeb\x09\x45\xd7\xcb\xab\xf9\xb5\xbb\x4c\xed\xa1\xe0\x8d\x92\xd6\xe8\xea\xc6\x6d\x4b\xf8\x42\x83\x32\x62\xd5\x5d\x68\x8b\x41\x03\x60\x63\x92\x98\xa1\xd7\xe8\x4f\xe8\x11\xfd\x09\xae\xd6\x3f\x84\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x41\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\xb9\xa6\xc3\x16\x5b\x4f\xae\x70\xa8\x07\x39\xea\x86\x81\x75\x02\x5d\xad\x1a\xb5\xc2\xc2\x92\xe2\xc8\x2d\xd3\xa0\xb5\x24\x7b\x6d\x88\x3c\x6c\x9e\x6e\x55\x2c\xab\x47\xca\xb1\x4a\x36\xed\x13\xa4\xaf\x70\xa9\x6a\x22\x0e\x0b\xc3\x29\x07\x0d\xc1\xb8\x03\x37\x34\x48\x95\xc7\x25\xa4\x51\xcd\xf7\x5a\xbb\xb0\x87\xe9\x3d\x41\x71\x40\x08\x4f\xdd\xcd\xda\x48\x87\x2a\x78\x6a\xae\x6a\x98\x54\xda\x60\x37\xee\x56\x0e\x02\xed\xde\xd8\x36\x44\xa5\x52\x9d\x81\xbe\xf4\x49\xb0\xdd\x38\xa1\x82\xa5\x18\xc8\x58\xd0\xa7\xa5\xea\x81\x17\xdc\x98\xa8\xf3\x51\x08\xae\x78\xc2\x83\x35\x23\xdb\x26\x61\xfb\x81\x69\xdd\x6f\x28\xcb\xe2\xfc\xfb\x8b\x9b\x99\xd6\x08\xa1\x78\xde\xed\xf9\x90\x55\xae\xd5\x1e\xee\xee\xfc\x26\xd8\xa6\x26\x62\x31\xc3\xe5\xbc\x5b\x2c\xdc\x27\x96\x3f\xad\xf6\xa4\x20\x38\xa5\x47\x8b\xad\x71\xad\x0e\x2b\xa8\x63\x82\x6c\x72\xbe\x25\xa9\xb9\xc0\xeb\x96\x89\x29\x34\xe4\x95\x81\xc8\x9b\x61\x19\xf2\x0b\x58\x06\xa7\xc8\x9b\x29\xf2\x66\x8a\xbc\x99\x22\x6f\x02\xef\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x8b\x96\x29\xf2\x66\x8a\xbc\x99\x22\x6f\x1a\x2f\x4d\x91\x37\x76\x52\xff\x34\xfe\xa9\x29\xf2\xa6\xfd\x4c\x91\x37\x9d\x51\xa6\xc8\x9b\xaf\xc3\xa7\x36\x45\xde\xb8\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x29\xf2\x66\xef\x99\x22\x6f\xa6\xc8\x9b\x29\xf2\x26\xbc\x4f\x55\x37\xef\x18\x17\xca\x39\xcf\x8b\x52\x11\xf4\xa9\x6a\x57\x5f\xf5\x4c\x5f\xee\x8c\x5f\xb0\x71\x38\x9e\xcb\xcd\x61\xda\x76\x95\x02\x42\x45\x4e\x4d\x2d\xc4\x79\x62\xa6\x36\xaf\xd6\x33\xaf\x66\x72\x7a\xa8\xab\xc3\xf4\xce\xf7\xd3\x43\x1d\x1f\x73\x13\xc5\xf8\xa3\x18\x57\x1b\xe3\xef\x61\x0a\x0d\x43\x8b\x69\x16\xf5\x08\xe4\x8b\x73\x5e\x9a\x12\x90\x76\xf5\x81\xb1\x2b\xbc\x18\x33\xd1\x97\x43\x3b\x8a\xef\x19\x4c\xe4\x17\xc6\xfe\x27\x3b\x89\x7d\xfc\x5b\xf6\x71\x18\xfe\xdd\x91\x81\x08\x84\x6a\x04\x2a\x11\xcf\xa9\xd2\x72\x8a\x16\xf6\x1a\xd1\x42\x21\xaf\x06\x55\x2d\x1b\xaa\xa5\x16\xf0\x39\x62\x65\xaa\xa0\x56\x6e\x8e\x66\xcf\x35\xd7\x4d\x2d\x84\x2e\xa8\x7c\x5b\x49\x4b\xb0\xeb\x73\xd7\x7c\x17\x18\xe7\x57\x4d\x41\x03\x2f\x68\x79\x5f\x50\xb5\x3b\xe7\x4c\x91\x47\x8f\x04\xd3\x26\x86\x5b\xfb\x89\xed\x2a\x28\x2b\x51\xca\x3a\x31\x45\xc9\x20\xaa\x21\xe2\x2a\x89\x41\x96\xe9\x36\x76\xea\x26\x0a\x58\x21\x8f\xea\xd4\x03\x32\x6e\x2b\x14\x96\xf7\xf5\x3e\x90\xb9\xbe\x9c\x6a\x74\x77\xc6\x3a\x94\x71\x02\x8b\xb9\x11\x74\x4b\x33\xb2\x26\x97\x32\xc1\x19\xec\x79\xac\x08\x70\xe6\xf9\xde\x75\x55\x94\x55\x17\x4d\x5f\xc7\x6c\x3b\x4f\x10\xea\x12\xcc\xd0\x1a\x53\x86\x72\x8d\xa3\xc2\x81\x85\xee\x7b\x0c\x3a\xbc\x15\x58\x68\x85\xc0\x7e\x10\x92\xb8\x20\x30\x6c\xc9\x79\x66\x3d\xb2\xd9\xae\x9e\x93\x75\xf5\x33\xfe\x23\x23\x0f\x3f\xea\x71\x24\x5a\x65\x78\x1d\xea\x45\x8d\x6c\x45\x58\xa2\x3a\x25\x5b\xaa\xe9\x20\x1f\x3a\x42\x8c\x41\x82\xf8\x87\xb0\xe9\xc0\xd8\xdb\xee\xfb\x2d\x7a\xf3\x0a\xa8\x16\x4b\x54\x41\x0f\x19\x55\xbe\x7d\x05\xd6\x97\xf3\xb3\x9b\x1f\x6f\xff\x76\xfb\xe3\xd9\xc5\x87\xab\xeb\xa1\x23\x1a\xee\x53\x9a\xe0\x02\x2f\x69\x46\xc3\xbc\xbb\x63\x05\x6f\x7e\x06\x8c\x2a\x4d\x4f\x53\xc1\x0b\xb3\x4e\x51\x32\x88\xd7\xac\x63\xb0\x22\x0c\x19\xce\x07\x55\x85\x77\x9a\xd6\xdc\xed\xa1\xd6\x02\x33\xe5\x84\x9d\xa1\xfa\xdc\x06\xcd\xa2\x64\x5a\x50\x7d\xaa\xc7\x0d\xa7\x63\x82\x12\xce\xd2\x94\xa4\xad\xa9\x1f\xd9\x07\x74\xee\x40\xef\xea\x88\x51\x74\xf3\xf1\xf6\xea\x7f\xc6\x8f\x8a\x2c\x8d\x44\xb9\x07\x8e\xe4\xc1\x46\x48\x93\xc9\x08\x4c\x7e\xb2\xd1\x3d\x13\x2e\x3d\xef\x0c\x54\xf2\x77\x5c\x25\xf2\x70\x7f\x2a\x59\x3b\x32\xbf\x86\x80\x72\x9e\x92\x05\xba\x31\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\xab\x3f\x66\x8a\xe2\x2c\xdb\x21\x2d\x89\x6d\x71\x46\x8c\x0b\x59\x70\xaf\xb6\x82\xea\x92\x5a\x26\x2e\xb5\xc9\x35\x56\x38\x93\x81\x03\x1e\xc3\x07\x35\xab\xff\xa0\x85\xc9\x48\x3c\x55\xef\xa3\x94\x30\xae\xac\x5c\xaa\x47\x82\x80\x5a\xc1\x13\x64\x64\x53\xe3\x86\x08\xac\xaa\x0e\x27\xaa\x98\x25\xb0\x58\xc7\x06\xa9\x74\x6b\xbd\xa9\xc6\x04\x4d\x3c\x00\xb3\x94\x44\xee\xdd\x36\x96\x0d\xd6\xd2\xaa\x1e\x57\x10\x9c\x42\x6c\x58\x81\xd5\x06\xec\x9a\x01\xa0\x39\x96\xf7\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x69\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x47\x96\xed\x3e\x71\xae\xde\x55\x21\x55\x91\xdb\xf9\x43\xd5\x13\xbc\xa9\x41\xc3\x65\x0b\x46\xca\x74\x0e\x68\x82\x40\xae\xb8\x4a\xe6\x17\xf5\xf6\x1d\x81\x3c\x45\xc9\xce\xe4\x77\x82\x97\xb1\x4d\x39\x34\x05\x7d\x77\x75\x01\xa7\xaa\x34\xe7\x86\x30\x25\x76\x10\x14\xd9\xc9\xe0\x19\x96\xe1\x16\xe8\x7b\x4d\x53\x7b\x54\xa4\x25\xae\x92\x49\xa2\x16\xe8\x03\xde\x21\x9c\x49\x6e\x85\xa9\x90\x64\xc4\xd0\x0d\xf8\x4c\x9a\xf2\xff\x02\x41\x8c\xb3\x89\xbb\x58\x72\xb5\x41\x7b\x2f\x0c\x10\x67\x17\xa2\x09\xdf\x33\x06\xa6\x3a\x41\x89\xb2\x7d\xc0\x21\xe2\xc4\xf7\x44\xa2\x42\x90\x84\xa4\x84\x25\x81\x3d\x6c\xd8\x8a\xfe\xf0\xfb\x27\x99\xef\x61\xa7\xaf\x39\xd3\x64\x1c\xb9\xd7\x57\x2c\xa5\x09\x36\x3c\xc8\x76\xb3\xae\x49\x18\xac\x9a\x56\xc6\xc4\x10\x03\x37\xc0\x65\x4b\x49\x84\xe9\xee\x2c\x4a\x62\x90\xf8\xd7\x72\x49\x32\xa2\x4c\xc4\x2d\xc4\xf5\x63\x65\x5a\x09\x98\x86\xf2\x58\x39\xc2\x08\x9f\x74\xc2\x64\x09\xed\x42\xb4\x6a\xac\x50\xca\x49\x1d\xaf\x88\x25\xfa\xfe\xea\x02\xbd\x46\x2f\xf5\xfc\x5e\x81\x8f\x65\x85\x69\x48\x6c\x57\xdc\x78\x61\xf6\xe5\xea\x95\x03\x0e\xcb\x00\xfa\x44\x5c\x98\x63\x38\x43\x2c\xe4\xf3\x81\x6e\x31\x76\x85\x5a\xdd\x71\x31\xc6\xd6\x33\x07\x46\x9b\x36\xa1\x07\xc8\x39\x34\x4e\x98\xd0\x7d\xe4\x1c\x80\x38\x4c\xe8\x23\xc8\x39\x9a\x25\x7d\x2f\x89\x18\xc1\x91\xbe\x3f\x2a\x47\x6a\x8a\x00\x9a\x6a\xdb\xab\x37\xa4\x99\x13\x85\x53\xac\x30\xa2\xa1\xed\x28\x59\xa3\x23\xc8\xaf\x61\x83\x8f\xc7\xaf\x24\x79\x4f\x59\xf9\x68\x5c\x64\x63\x54\xc8\xdb\x4b\xf8\x10\x25\x6e\xf2\x80\x70\x5c\x14\x19\x35\x01\xc2\xed\x3c\xca\x00\x66\xcc\x21\x6f\xa6\xc7\xf4\x09\x3e\x70\x94\x71\x96\x71\xcd\x2a\xf5\xad\x8e\x59\xca\xf3\x00\xd8\xfd\x09\x6a\x81\x89\xe0\x64\xd3\xb4\xb0\xf7\x10\xcb\xa8\x4b\xea\x9f\xfc\xda\x8b\x53\x9d\x33\xb2\x25\xc1\xb4\x9b\xfd\xec\x5a\xfd\xbe\x16\x9c\xdc\x0e\x00\x00\x94\xe1\x25\xc9\xcc\xe5\x61\xa8\x24\xd2\xd9\x1a\x45\x43\xd1\xaa\x99\xe0\xd9\x98\x60\xa4\x4f\x3c\x03\xff\x16\xae\x16\xa3\x01\x7c\x25\x6b\x81\xd7\xe2\xd7\x02\x72\x7d\x6b\x2d\xa0\xef\x7c\x1d\x6b\x29\x83\x37\x51\x67\x2d\xfa\xe2\x6a\xaf\x05\x6e\x90\xaf\x61\x2d\x11\x6a\xfd\x03\x65\x29\x7f\x90\xe3\x99\xee\x0f\xe6\x43\xc7\x19\x12\xcd\x7a\x14\x65\x6b\xd9\x64\xbc\x38\x68\x2c\x6d\xea\xa9\x7d\x9c\xd7\x19\xe7\xab\x7c\xea\x2e\x8f\x0a\x40\x77\x02\x57\x29\xad\x7f\xe6\x80\x8b\x34\x44\xf1\x51\xbc\xf1\xe8\x1c\x70\x9d\x4b\x7c\x2e\x34\x2c\x45\x71\x76\x5b\x8c\x6a\x7b\xf6\xdd\x87\xdb\xb3\xf6\xc7\x9a\x70\x1f\x20\xe5\x5e\xaf\x47\xff\x1d\xe1\x34\xa7\x52\x86\x4d\xd2\x80\x5f\xb2\x84\x76\x74\x2f\x9d\x8f\x62\x4d\xd5\xa6\x5c\x2e\x12\x9e\x37\xdc\x15\x73\x49\xd7\xf2\xd4\x52\xd9\x5c\xcf\xfe\xd5\x00\x5c\xca\x32\xca\x1a\x46\x07\x48\x60\xb7\x42\x1d\x4c\x30\xa9\x56\x00\xa8\x37\x99\xa6\x03\x40\x8d\x95\xb7\x07\x01\x26\xbb\x94\x92\x2c\xb5\x86\x08\x13\x8e\xad\xcf\x73\x56\x6c\xf0\x1c\x2e\x8c\x01\xe0\x36\x67\x0c\xf4\xfa\x0d\x67\xdc\xfa\xd0\x4d\xcc\xb1\x55\xa5\x8c\x5d\x02\x26\x61\x4f\x8e\x9e\xcb\x00\xe0\xa6\xe5\xe3\x28\xac\xad\x4b\x3d\xd7\x83\x81\xf5\x03\x14\x04\x08\xb4\x19\x73\x8d\x68\x9c\x81\x95\xf5\x6e\xa4\x11\xbe\x7f\x0d\xfb\x50\x69\x3c\x23\xd1\x0f\x9a\x8f\xfd\x4c\x73\x1b\xc7\x84\x7b\x35\xa1\x81\x45\x75\x6a\xaf\xf4\x6a\x43\xfa\x95\xb6\x46\x34\x78\x7c\xbb\xfa\xd2\x90\x56\x34\x00\xb2\x4f\xd8\x7d\x92\xac\xdb\x0f\xf4\x08\xf2\x2e\xea\x93\x79\xf7\xe8\x79\x49\x94\x25\x67\x20\xd8\x1c\xef\xd0\x72\xe8\xb8\xa4\x54\x82\x59\x13\x9c\xd2\x4d\xe2\xfd\xd4\x24\xa4\x63\xd3\xe9\x93\x1d\xf3\x26\xb0\x35\x3a\xab\xfb\xb6\xf1\x3e\xa2\x5d\x53\xd4\x0d\x4f\x4d\xc8\x78\x15\x94\xeb\xed\x7f\x68\x43\xd7\xe9\xcf\xee\xee\xaf\x25\x0b\xc6\x4d\xcc\x44\x33\x8e\xdc\x35\x98\x35\x4d\x53\x3d\x30\xad\x45\xd7\x36\x5f\x6d\xcd\xc2\x58\xb9\x36\x54\x36\x93\xc3\x67\xd5\xa4\x03\x4e\xe3\x66\x6b\x87\x19\xfa\xef\x52\x2a\x84\x2b\xf7\x73\xab\xe7\x44\x15\x73\x0c\xe4\x94\x78\xad\x29\x2e\x17\x4b\x71\x3d\x99\x2d\x4d\x09\x4a\xe9\x6a\x45\x9c\x5b\x7c\x49\x50\x81\x05\xce\x89\x02\x37\x8a\x41\x2d\x74\xe1\x65\x7e\x62\xe0\x2b\x84\x5d\xaf\xdb\x2a\x02\x6e\x66\x7c\xb4\x54\xa1\x9c\xae\x37\x46\xd6\x41\x18\x65\x9c\xad\x21\xa2\x4f\x4f\x21\xe3\xd8\x77\x12\x81\x39\x70\x81\x1e\xb0\xc8\x11\x46\x09\x4e\x36\x60\x25\xc4\x0c\xa5\xa5\x80\x04\x4f\x45\x70\xba\x9b\x4b\xa5\xf5\x6c\x2d\x1d\x81\x29\xcd\x60\xc0\xeb\x85\xee\x74\xc2\x00\x7c\x51\x13\x89\xac\xef\x92\xea\x98\x58\x5f\x81\x13\x0e\x9a\xe4\xe7\x81\xde\x3a\x60\x53\x4a\xff\xde\x33\xa5\xf4\x4f\x29\xfd\x53\x4a\xbf\x7b\x73\x4a\xe9\xef\x3c\x53\x4a\xff\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\xf0\x4c\x29\xfd\xe3\xe7\x36\xa5\xf4\x4f\x29\xfd\x53\x4a\x7f\xe3\x99\x52\xfa\x3b\xa3\x4c\x29\xfd\x5f\x47\xb2\xde\x94\xd2\xef\x9e\x29\xa5\x7f\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\xbd\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x21\x17\x5a\x4a\x3d\xa9\x96\x31\x59\x07\xd6\x80\xdf\x88\x55\x5c\x96\xab\x95\xd6\x50\xb9\xf7\xb2\xd6\x23\x76\x2c\xd1\x55\xee\x5b\xe5\xe8\xb2\xd6\x64\x49\xd4\x0c\xd2\x1a\x4c\x98\xce\x38\xa0\x36\x90\x12\xd2\x1a\x05\x91\x90\x06\xc0\xd0\xe5\xc7\x77\x8b\x46\xd2\x83\xd7\x94\xe9\x4d\x85\x18\x8a\x39\x86\xd9\x7c\x64\x49\x8c\x53\xb2\x46\x6c\x5f\x24\xa8\xc5\x6f\x92\x71\x69\x62\x0a\x00\xb4\xcf\x35\xb5\xc1\x8c\x11\x27\x75\x50\x05\xb2\xf2\x92\x10\x86\x78\x41\x98\xf1\x43\xb9\xb6\x0c\x08\x2b\x85\x93\xcd\x42\x8f\xcf\x82\x50\x5d\x76\x68\x35\xba\x66\xbd\x04\xe7\x06\xb9\x82\xe4\x98\x9a\x01\x10\x4e\x04\x97\x12\xe5\x65\xa6\x68\x51\x0d\xe1\xdb\x31\x02\x31\x40\x26\x32\xab\x42\x18\x38\x16\x88\x31\xc5\x43\x4c\xbf\xdd\x58\xe9\x96\xc0\xd9\x60\xe0\x35\xc8\x46\x33\x48\x68\xcf\x0b\xb5\x33\x2e\x57\xe3\x78\xa2\x42\x2a\x94\x64\x14\xae\x7f\x98\x9d\xc9\x09\x85\x51\x66\x01\xa7\xbe\x82\x5c\x51\x58\xab\xb4\x8b\x65\x29\xdc\x1a\x85\x92\xc6\xd1\x58\x0f\x63\x07\x48\xa9\xb4\x77\xb4\xf4\x79\x26\xb0\xeb\x1d\x62\x36\xdb\xad\x15\xb6\x3b\x85\x21\xdc\x98\xf6\xa7\xc6\x20\x03\x58\x80\x94\x27\xab\x28\xd5\x87\x0a\x52\x8c\x5d\x9e\xcf\xac\xd5\x67\xa4\xa8\x92\xe5\xd4\x06\xfb\x2b\x2d\xb8\x83\x68\x67\x0b\x44\xc0\xc8\x56\xd3\x2c\x49\x88\x16\xa1\x71\xe7\x84\x99\xe1\x0e\x3a\x4a\x8a\x88\x9c\x32\x70\xcb\x7e\x20\x52\xe2\x35\xb9\xf1\x1a\x78\x7c\x62\x13\xd8\x78\x6a\x54\x03\x21\x64\x20\x43\xd5\xbf\xd4\x2e\xb1\x13\x1f\x43\x68\x4c\x05\xe5\x66\x2e\x55\x0c\xe0\x83\xa0\x4a\xeb\x54\x54\x9a\x5c\x3a\xb0\x6b\xee\x07\x5c\xfa\x41\x37\x9d\x70\x1f\x1c\xe8\x1a\xa4\xe6\xef\x2c\x35\x8e\xab\x25\x41\x4b\x41\xc9\x0a\xad\x28\xc3\x99\xf5\x40\xf9\xe8\x0b\x72\x44\xb0\x11\xa8\xa5\xd4\xa2\x29\x67\xce\xb1\xe2\xd6\xb0\x40\x3f\xd8\x45\x28\x51\xb2\x04\x0f\xe6\x2c\x33\x9e\x12\x44\x57\x68\x0d\xde\x2e\x61\x1c\xea\xbf\x7f\xfd\xef\x7f\x40\xcb\x9d\xbe\x11\xc1\x50\xa9\xb8\xc2\x59\x85\xa6\x8c\xb0\xb5\xde\x03\x60\x10\xbe\xb3\x90\x65\xcd\xf4\x4b\x87\x59\xa8\xab\x62\x96\xfe\xe6\xdb\xfb\x65\xfb\x4a\x3f\x4d\xc9\xf6\xb4\xb1\x2f\xf3\x8c\x7b\xe3\x52\xba\xcd\x70\xfa\x2f\xdf\x01\xf1\xb2\x87\x20\xa1\xf8\x42\x04\x49\xba\xe4\x27\xb4\xe1\x0f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x9d\xa6\x62\xc0\x53\x69\x6f\x87\x56\x38\x63\xef\xc9\x01\x45\xdf\x02\xf6\xf3\xba\xe6\x0d\x6f\x5c\x9c\x6e\x7a\xdc\xc6\x43\x59\x25\xb7\xca\x7d\x2a\x05\x59\xa0\x77\x38\xcb\x96\x38\xb9\xbf\xe3\xef\xf9\x5a\x7e\x64\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\xf7\xed\x56\x0b\x19\x5f\x6b\x39\xae\x28\x95\x8b\x58\x69\xac\xca\x03\xd8\xcd\x14\xce\x78\x75\x09\x60\xdb\xcb\xa6\x86\x4d\x1e\x81\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xb7\xaf\x7f\xff\x47\x43\xfa\x5a\xbb\xf8\xe3\x6b\x70\xfe\xcb\x99\x61\x2e\x9a\x33\xfa\x39\xb4\xcc\x71\x96\x69\x45\xa2\x49\xd4\x7a\x5b\x17\xb1\xbd\x9b\x86\xa8\x55\xc5\x10\x66\xb4\x70\x77\x77\xf7\xb7\x80\x64\x47\x95\x24\xd9\x6a\x66\x62\xef\xaa\x7c\xdb\x13\xb8\x28\x4e\x2c\xef\xd2\xb7\x7a\xf7\x6a\x38\x4c\xcc\xda\xf2\xac\xcc\xc9\x05\x81\xa6\x2b\x11\xcb\x6c\xbd\xef\x22\x36\x32\xdb\x1f\x6d\x99\xf1\xe4\x1e\xa5\xf6\x8f\x30\x59\xcf\x32\xc1\x6b\x65\x43\x7a\x1a\xba\x60\x15\x05\x04\x01\x78\x2e\x92\xe7\xa9\x1d\xb7\x9a\x73\x6e\xf9\xdb\x72\x5c\x14\xd0\x68\x6c\x05\x09\x42\x0f\x66\x01\x01\x1d\x0b\x20\xd8\x4e\x3a\xf8\x38\xdd\xb7\x0c\x50\xff\x85\xdc\xb3\x9e\xfa\x13\xb7\x01\x05\xfc\xb7\x89\x17\x19\x91\x5a\x87\xea\xb0\xbd\x6a\x6d\xe6\xc6\xd0\x98\x81\x93\xf9\xe4\x3e\x3c\xa3\xfa\x1e\x81\x59\xa1\xd1\xe9\xa9\x19\xaf\x8c\x51\x41\x84\x84\xe6\x70\xea\x33\xec\xe8\x79\x86\x69\x28\xa3\x0b\xa1\xba\xe1\xd1\xd3\x96\x31\xdc\x81\xa7\xde\x13\xef\x2b\x01\x6f\xdf\x13\x7b\xf3\x18\x02\x87\x64\xfc\x98\x33\x7c\xc3\x53\xfb\x09\x1c\x52\x53\xb8\xa0\x47\xd4\x92\x11\xb9\xef\x47\x6f\x8f\xf7\xb9\x5e\x4b\xfb\xac\xea\x5f\xaa\xc3\x6a\xde\xb2\x47\xd1\xbb\xb7\x47\x3a\xa2\x30\xf4\xa8\x13\x0a\x67\xb3\xd1\x71\xab\xbe\x0f\x5a\x22\xb4\xd9\x84\x20\x05\xd7\xa2\x8c\x95\x89\x17\xc8\xd8\xb4\x35\xd6\x2d\x58\x74\xf2\xf6\xe4\xc9\xe7\xd4\x2c\x52\xf0\x02\xaf\x07\x4a\x47\xed\xad\x75\xff\x43\x94\x12\x23\x60\x10\x09\x42\x1a\xfc\x1d\xdc\x46\xc1\x85\x16\x16\x82\xeb\xec\xe4\x7c\x7c\xd6\x4c\xeb\xd0\x67\x45\x10\x13\x1c\xfc\x10\xf4\x62\x23\x84\x05\x2f\x59\x6a\xf5\xf3\xca\x10\xf2\x61\x6f\xc2\xd7\x9c\x81\x90\x63\x72\x90\x02\x61\xab\xe6\x69\xc5\x88\x6b\x0e\xf3\x66\xf1\xe6\xf5\x2f\xcb\x26\xef\xf6\x1a\xe2\x69\x8c\x5c\x57\x6c\xd2\x9c\x8d\x27\xcf\xc8\x15\xd8\x88\x9e\xd5\x07\xab\xb4\xd5\xf5\x33\xa8\xab\x2a\x00\x3f\x69\x65\x8c\x44\x95\xc2\x43\xe8\x25\x88\x34\x5a\x16\x6c\x64\x25\xbc\x1a\x55\x06\x26\x2e\xad\x5d\xeb\x77\xcb\x27\x9d\x6d\x73\x88\x0d\xd1\xf6\xe9\xc2\x61\x6a\xb2\x5f\xf7\x1c\xf3\x56\x17\xb9\x17\xe8\xa5\x79\xf3\x44\x42\x2c\xea\xab\x27\x6f\xaf\x5d\xf6\xe5\x63\x11\xcc\xa3\x6c\x2d\xfd\xf2\xb1\xc0\xa0\x43\x17\x43\x38\x18\x10\x3a\xda\xb7\x8c\x1f\x07\x7f\x26\x1b\xbc\x25\x10\x27\x4b\x33\x2c\xbc\x99\x04\x16\x2e\x47\xb7\x66\x55\xd0\xec\x96\xb0\x2d\x15\x9c\x81\x9f\x6a\x8b\x05\x85\x9c\x22\x68\x45\x48\x98\x96\x4f\x7f\xfb\xf2\xf3\xd9\x27\xf0\x0f\x84\xb3\xdd\x4c\xee\x81\x5d\x79\x29\x21\x06\x61\x6f\x05\x8d\xa1\xea\x8d\x1b\x9a\x6b\xcf\xa6\xba\xf9\xeb\x5d\x01\x5e\xe7\xd6\xa3\xe7\x90\x97\xaa\xc4\xfe\x6c\x0a\xf3\x90\xc7\x24\x2b\x25\xdd\x3e\xf5\xfc\x0f\x4b\x3c\xd5\xad\xf8\x05\x04\x1e\x1b\xd2\x7d\x41\x3d\xb4\xdb\xdf\x70\xf7\x44\x76\x63\xc1\xc1\xac\xc7\xb8\x1a\xee\x7a\xda\x6b\x5c\x3e\x91\x55\x6d\x9c\x66\x2a\xab\x55\x5c\x6d\xca\x85\x57\x0b\xaa\xea\x42\xa6\x5d\xb3\x3b\xe4\x67\x1d\x47\x85\xf5\xef\xa5\x67\x8f\x02\xbb\xe3\xdb\x17\xc8\xa4\xee\xc8\x50\x71\x25\x63\x03\x93\x6f\x17\x0a\x80\x31\x6a\xac\x99\x54\x3a\xd7\x58\xd7\xe4\x72\x17\x98\x9a\x00\xd0\xbb\x0d\x66\x5c\x7e\x2a\xb3\x3e\xd9\xcf\xee\xb9\x4d\xbd\x49\x2b\xe7\x2f\x12\xa4\xc8\x68\x82\x2d\xb0\x9f\x14\x00\xf9\x51\x68\x28\x3f\xda\xbf\xfd\xd4\x9f\x29\xb4\x24\x7a\xb5\xae\x27\xba\xf9\x5e\x9f\xe0\x25\x81\x12\x78\x85\xd9\x63\x9c\x11\xa1\x3a\xe1\xa4\x5e\x7c\x9b\x5e\xd8\xef\x79\x82\x3b\x05\x15\x3a\x0d\xca\xed\x7b\x28\x87\xd4\x36\x8d\x1a\x83\x02\x04\xb3\xb7\xa0\x10\x67\x28\xe3\xbc\x58\xe2\xe4\xbe\x4b\xe8\x92\x77\x8b\xf5\x40\x07\x63\xbc\xc6\x94\xc9\x3a\xc1\xeb\xaa\x13\x4a\xe5\xbf\x6b\x33\xbe\x7e\x67\xfc\x70\xc1\x15\xf0\xb5\x75\xd7\x41\xa0\x46\x63\xf7\xac\xd1\xa3\x71\x56\xa0\xe8\x6b\xef\xf8\x3d\x34\x94\xf1\xf5\xfb\xbe\x82\x14\x9d\xd1\x4d\xb6\xdf\x71\x07\x67\x3c\x25\xb7\x24\x03\x56\xf3\xbc\x67\xe3\x02\x0a\x05\x5b\xb6\x73\xcd\x53\x57\xa4\x8d\xa7\x26\x62\x4b\x26\x1b\x92\x96\x19\x78\x7f\xa2\xc9\xcf\xfc\x74\xab\xb8\xc0\x6b\x72\x0e\x38\x08\xa2\xf1\x63\xf7\xfd\x1a\x75\xd2\x82\x43\xd2\xfc\x5d\x1f\x07\x83\xe9\xfd\xf9\x84\x74\xb2\x7b\xd2\x2b\x90\x76\x82\x7c\xef\xc9\xce\x59\x42\x24\x49\x04\xb1\x01\xee\x7a\x2b\x40\x4c\x71\x6a\x54\xdd\xbb\xba\x97\xaf\xda\x6f\xef\x49\x6f\x22\x49\x90\xeb\xfa\x24\xfa\x3d\x4f\x7d\x23\x90\xc2\xca\x26\x6a\x74\x50\x1d\xdf\x12\xb1\xa5\xe4\xe1\xd4\x5e\x6f\x73\x4d\xa4\x73\x83\x6e\x79\xaa\x27\x22\x4f\xbf\x81\xff\xe9\x5d\xa4\x09\xea\x39\x4b\x53\xab\x56\x95\x92\xac\xca\xcc\x28\x3a\x72\x81\x70\x41\x3f\x13\x21\x29\x67\x33\x74\x4f\x59\x3a\x43\x25\x4d\xff\xab\xcf\xf0\x1f\xc4\x07\x77\xbe\xa4\x21\x9c\xdc\xc2\x4d\xbc\xab\x4a\x0e\x43\xda\x9f\xd9\x07\x2e\xa0\x7c\xb0\xde\x5c\x17\xeb\x61\x2b\x64\x7b\x67\xd3\x2f\xfe\xfb\xae\xc4\xb9\x86\x1d\x7b\x3c\x0a\xac\xef\xfa\xe0\x89\x00\xcd\x13\xb7\x38\x4a\x4a\x8a\x8c\xef\x40\x2a\xa5\xd2\xc2\x80\x84\x57\x6c\xf3\xb4\xc8\xa3\xde\xd5\xce\x82\x34\x67\x4a\x49\x46\xfa\x0b\x95\xb9\xa8\xeb\x92\xa5\x44\x64\x3b\x30\x94\x98\xfd\x8f\xe7\xd4\x05\x4f\x3f\xd8\x7c\xf0\xe0\xa2\x6e\xea\xf7\x9c\xc0\x22\xdd\xe5\xac\xaf\xbc\x33\x2d\xb2\x60\xb3\x98\x35\x51\xb2\xa1\xdb\x77\xf9\x9b\x31\x3a\xa9\xe6\x55\x55\xf0\x74\x14\x4f\xc0\xf5\x78\x7d\xc4\x15\x5f\xb7\x7e\x40\x2e\xde\xab\x99\xdd\x58\xa5\x49\x5c\x2d\x6d\xb6\x1d\xdc\x13\x9a\x46\x4d\x6c\x4c\x8e\x0b\xe0\x79\x9e\x60\x5b\xe3\x3c\xa9\xea\xd5\x9b\x1b\xd8\x24\x9c\x83\x1b\x7f\xb9\xab\x65\x1c\xc5\x79\x66\x9d\xed\x9a\x43\xf8\x7c\xed\x82\x28\x41\xc9\x96\x20\x2c\x96\x54\x09\x2c\x76\x55\xa2\x3f\x78\x16\x77\x70\x25\xe8\xdb\xfd\xef\x25\x11\x3b\x50\x8c\x20\x22\x12\x34\xb0\x5e\x90\x9a\xd6\x04\x81\x70\xfe\xd4\x64\x14\xe7\x3c\xa5\xab\x16\xa1\xed\xb3\xad\x7e\xae\x55\x4a\x22\xe6\xeb\x92\xa6\xe4\xb4\xb1\x71\x7e\x76\xe2\x51\x12\xfa\x05\xce\x67\xdc\xef\x0f\xb8\x80\x80\x2a\x78\x5b\x6f\xaf\x21\x76\xd8\x63\xd9\x6a\x77\x6f\x33\xbb\x7b\x87\xe4\x62\x8d\x19\xfd\xd9\xe0\x3b\xc1\x8a\xac\xb9\xd0\xff\x7c\x29\x13\x5e\xd8\x5d\x80\x5b\xea\x55\x03\xad\x78\x67\x0c\x3d\x9e\x2b\xca\xc8\x17\xe0\xb0\xb4\x32\x6a\xb3\x76\x7b\x06\x19\xe4\x00\xd7\xb6\xd6\x1f\x8a\xd3\x8a\xda\x3b\x83\xff\x91\xdb\xe6\x67\xa5\x5c\xa8\xbe\x32\x1b\x7b\x7c\x47\xd8\xd0\x4d\xc0\x70\x15\x5c\x0c\x32\x0e\x4b\xd1\x5a\xdf\x83\x50\x89\xdc\x2e\xd5\x63\xcd\x6b\xa6\xcc\x3d\x90\x65\xac\x30\x57\x08\xca\xa1\xc2\x44\x86\xa5\x1c\x9e\xac\x7d\x1b\x25\xfa\x75\x84\xa5\xa4\x6b\x56\x57\xba\xd3\x82\x59\xec\xc0\x70\x48\x23\xc4\x2f\x2b\x03\xb6\xba\x3e\xf4\x66\x4f\x00\xaf\x05\xa8\x90\xbb\x87\x99\xa6\x8a\x3e\x25\xc9\x05\x91\xd9\x4b\xd6\xe4\x53\xff\x0f\xfd\xe1\x65\xd5\x70\xdf\xd8\x43\xdd\x85\x44\xd7\x50\xd2\x45\x13\x6d\xd1\xc5\xbc\x5d\xfc\x4f\x30\xf6\xc2\x4c\xf4\x27\x74\xfe\xfe\x0a\x61\xb1\x2e\x8d\xf9\xe4\x23\xcb\x76\x08\x6f\x31\xcd\x80\x2f\xd9\x62\x1a\x30\xe5\xed\xeb\xc5\x9b\x37\x8b\xd7\x3d\x17\x40\x8a\x36\x74\xbd\xe9\xaa\x7a\x93\x28\x39\x89\x92\xff\x0c\xa2\xe4\xdf\x5b\x67\x2a\x78\xca\xf7\x8e\x9f\x99\xb4\x74\xca\xbe\x06\x44\x89\x40\xa4\x3e\x9f\x7e\xa3\xac\xe2\x96\x0b\xe4\x5a\x60\x48\xa4\x39\xb5\xee\x94\xce\xe7\xe6\x8f\x10\xef\x06\x74\x55\xcb\x68\xfb\x24\xec\xf1\xef\x05\x76\xd1\x67\x48\xb2\x37\x58\x18\x07\xd7\x8d\xd4\xba\x86\xe0\x58\x31\x33\xbd\x04\x23\x67\xef\x4f\x34\x14\x12\xec\x0f\x04\xf6\x36\xed\xda\xeb\x5d\xe0\x5a\x0e\xb9\x4d\x31\x47\xd1\x0a\x76\x96\x50\x72\x08\x2e\xd2\x6c\xd9\x44\x91\x76\x90\xa6\xaf\x86\x45\xd7\x44\xc5\x78\xd5\xa3\xe9\xd4\x34\xca\xaa\x98\x6e\xb7\x00\x77\x88\xef\xf9\xbb\x6c\x3d\x93\xe4\x34\xae\xa7\x56\x8d\xec\xde\x91\xbf\x68\x37\xad\xa0\x44\x1a\xea\xa0\xf5\x4c\x98\x1d\xdb\x2f\x6b\x00\xb7\xa3\x3b\x65\x35\xfb\x61\xf5\xaf\xe6\x80\x1e\x59\xc1\x4e\x58\xbd\xa3\x7c\xc1\xee\x58\x87\x08\xbb\x82\x28\xc2\xfa\x7c\xec\x6d\xd1\x03\x0a\xef\x3b\x31\xae\x69\x41\x90\x1b\x0c\x51\xe3\xe0\xfb\x07\x2d\x7c\xc5\xeb\xf8\xb7\xce\x24\xa9\x44\x27\xdf\xfe\x7e\x73\x32\x33\xa5\xcc\xda\x6e\x63\x41\xd6\x65\x86\x85\xde\x13\x61\xa2\xc9\xd1\x4f\xff\xef\xeb\xf9\xbf\xff\xff\xff\xf7\xcb\x5c\xfe\x43\xfe\x23\xff\xc7\xe6\x1f\xe9\x3f\x1e\xfe\xb1\x7b\xf5\x53\x07\xf0\xcb\x9c\x66\x19\x75\x19\x26\xee\x7f\x73\xca\x4a\x05\xbe\xff\x52\x48\x94\x42\x37\x24\x42\xee\x25\xda\x11\x2c\x64\xc7\x71\xe9\xa5\x77\xc1\x4b\x45\x6e\x04\x59\xd1\xc7\x30\x9e\xf4\x2a\xf4\xbb\x5a\x41\x5d\xd1\xc7\x16\xaa\x04\x59\x53\x09\x35\xb4\x20\x1d\x7d\x83\x59\x0a\xfa\xd0\xaa\x2f\x4e\x11\xdc\xea\xb6\x02\x84\xbd\x57\xbe\xbf\xb2\x16\x60\xab\xf9\x72\x86\x30\x92\xe5\x72\x5e\xe0\x11\x66\x60\x7d\x3b\x69\xe9\x4c\x16\x38\xf1\xda\x83\x3b\x39\xe4\xf0\xb6\xac\xc6\xd7\x5f\xd9\x23\xa8\xd7\x26\x4d\x6c\xfc\x96\x58\x1f\x56\xb3\x30\x6b\x57\x60\xd2\x32\x35\x08\xb0\x5a\x46\x64\x0e\x38\xc2\x4d\x47\x81\xc1\x98\x35\xd2\x42\xc4\x74\x15\x15\x31\xe2\x76\x01\xd2\xba\xac\xa8\xa9\x97\xcb\xb5\xe3\x47\xf6\x3e\x30\xf1\x7f\x2e\xa4\xd0\x38\x52\x9c\x8e\xdb\xba\x43\xfb\x3d\x61\x77\x9b\xbd\x9b\x16\x0b\x82\xce\xae\x2f\xfa\x3d\x67\x81\xb8\xa4\x76\x83\xa7\xc0\x44\xcc\x84\xab\xbf\x18\x4b\x80\x35\x8b\xf5\x42\xb6\x0c\x4b\xce\x10\xd6\x32\xa2\x39\x97\x98\xd9\xe2\x69\x0e\x84\x20\x19\x76\x8d\x66\xb4\x94\x5a\x1b\x1b\xfa\x17\x3e\x1c\xc9\xe4\x51\x78\x7a\x96\xab\xc7\x73\xb1\x9d\xb0\x6e\xfd\x43\x15\x2b\x58\x2d\x75\xb8\x66\x72\x28\x80\x30\xc2\x0b\xed\x30\x12\x39\xed\x0a\x81\x55\x5f\x27\x69\x50\x7c\x22\x0d\x3a\x35\x7d\x6d\x68\x01\x37\x4c\x60\xd6\xb6\x15\x99\xc5\x36\xfa\xac\x75\xba\x0a\xb8\xa1\xa8\x2b\x36\x43\xd7\x5c\xe9\xff\xb9\x7c\xa4\xfa\x9a\x0c\x17\xfc\xba\xe0\x44\x5e\x73\x05\xef\x3e\x09\x25\x66\x52\x91\x08\xb1\xc6\x29\x5b\x57\x4f\xcb\xda\x0d\x13\x96\x5b\xde\xd5\xca\x16\x72\x36\xeb\x0b\x2c\x82\x4a\x74\xc5\xb4\xe6\x64\x57\x5e\x95\xe2\x94\x16\xb8\xd3\xa4\x18\x67\x73\x88\x19\x77\xd0\x03\x40\xab\x4d\xa3\xd2\xa1\x92\x8b\x16\xbe\x3c\x03\x05\x60\x2e\x09\xb2\xc3\x1b\x9e\x0e\xdf\x40\x36\x4f\x91\xe1\x84\xa4\xae\x76\x21\xd6\xb8\xc0\x8a\xac\x69\x82\x72\x22\xd6\xa1\x79\x16\x9a\x4f\xf9\xb7\x6e\xb0\x08\xd0\x88\x6a\x9e\xfe\xfa\x2c\xe1\xb0\x8c\x3e\x95\xd3\xfd\x25\xb8\xbd\x03\xe1\x18\xa1\x59\x01\xfb\x7e\xff\x0b\x1b\x63\x1b\x83\x1a\xee\x9b\x1b\xe3\xec\xff\xd2\xec\x14\x08\xe5\x7f\x9b\x48\x80\x05\x3a\xf3\xa9\x59\xfa\x69\xbe\x6f\x23\x30\x9a\xa0\x35\x54\x2d\xaf\xb6\xba\x96\x61\x86\x88\x11\x4c\xfb\x0d\xbc\xab\xce\x8d\x36\x43\x0f\x1b\x2e\x0d\x17\xaf\xa2\x07\x5f\xdc\x93\xdd\x8b\x59\xeb\xe4\xf9\xf2\x28\x5f\x5c\xb1\x17\xb3\x2a\xf4\xb1\x75\x0e\x2a\xf7\x0b\xdc\xf0\x2f\xe0\x6f\x2f\x16\x9d\x4b\xb0\x5f\x93\x0a\x5d\x8c\x07\xc9\xb5\x65\x16\x27\xdd\x74\x6e\xd3\xda\xa0\x66\x1c\xd8\x37\x82\xe7\x44\x6d\x48\x29\x8d\xa8\xe3\xa2\x94\x3b\x13\x05\x85\x24\xd3\x64\xa5\x4f\x33\xe4\xfa\x25\x5c\xa4\x94\x75\x52\x98\x26\x99\x65\x92\x59\x26\x99\x65\x92\x59\x26\x99\xa5\x81\x9b\x49\x66\x99\x64\x96\x5f\xb7\xcc\x32\xd0\x97\xbe\xed\x4d\xda\xeb\x5f\xb0\xe1\x59\x2a\x11\x14\x27\x81\xd8\x41\x07\x0b\x61\xa5\x04\x5d\x82\x15\xac\x8f\xc3\x26\x3c\xcf\x9b\x35\x18\xaa\xae\x3c\xf6\xe8\xa7\x9e\x0e\xd9\x3d\x2d\x16\x46\x08\x39\x2b\x7f\x43\xd1\xd6\x2a\x5f\x9c\x19\xab\x2c\xce\xa0\xee\x93\xb5\xc1\x66\x68\xad\xbf\x6e\xf5\x4a\xb2\xcd\x83\x1a\x19\xe7\xbd\x7b\x06\xb9\x92\x05\x4f\x17\xe8\x96\xe7\x55\xae\x80\xde\x11\x6b\x6d\x83\x45\xba\xa6\x93\x8a\x43\x0d\x8e\xb5\x89\xee\xe5\x0f\x1a\xec\x86\x16\x3e\xba\x85\xf9\x38\x90\x60\x29\xd3\x9f\x54\xb9\xa5\x05\x4f\xdf\xa2\xff\x8f\xa1\x37\x86\xbe\xf8\x03\x84\x07\x7c\x77\x75\xe1\x2f\xf7\xbf\x34\x23\xbf\xbb\x05\x74\xa1\x6f\xcd\x97\x92\xa8\x35\x4d\xd1\xd2\x94\xe8\xd6\x97\xed\x4b\x46\x1e\x4c\x82\x1c\x4a\x6c\xcd\x6a\x4f\x2a\x5a\x23\x43\xc2\x79\x6c\xaa\x49\xda\x61\x5e\xa1\xdf\x99\x71\x0a\x22\x6c\x67\x1f\x3d\x96\x3f\x6d\xea\xe3\xa7\x13\x9b\x77\x2d\x1e\xe6\xe2\x61\x3e\x9f\xcf\xf5\x3a\x5d\x03\xcc\x9e\x46\x9e\x8c\x2b\x1b\xb3\xe3\xbd\xdc\x2a\x6c\xc3\xc1\xad\xa7\x02\xa1\x25\x98\xed\xec\x2a\x16\x2f\x7a\xbe\x1e\x6a\x31\x18\xae\xb2\x13\x6e\x78\xfb\x84\x56\xb7\x55\xc3\x94\xde\x05\x8f\x6b\x72\xdb\xd3\x66\xc4\xdf\x17\xf2\xc0\x8e\x90\x81\x72\xaf\xa3\x5a\x58\xd9\xe8\x98\x5a\xac\xef\x4f\x81\x3c\xc2\xae\x05\x9a\xd7\x3e\x4b\xdb\xda\xe3\x37\xac\x3d\xb0\x55\x6d\xd5\x90\xd6\x7b\xe8\x47\x34\xa9\xdd\x6f\x45\xdb\x0b\x33\xae\x3d\xad\xaf\xe7\xa4\x8f\x39\x1f\x46\xa2\x03\xbd\x86\x0e\xec\xb2\x16\x4e\xd9\x0b\xf6\xa0\x7d\x42\xf7\xd9\x30\x93\x18\xd9\x77\xb6\xd3\x47\xa9\x5f\x90\x89\xdb\x33\xdf\xfe\xf4\xc3\x8c\xdf\xb3\xd8\x8e\x49\x5f\x84\xad\x0c\xf7\x98\x1d\xdf\x5d\xb6\x2d\xa7\xf4\x6f\xf4\x53\x1a\xcb\xba\x19\xf4\x02\x1e\xd9\x52\xf6\x5f\xed\x92\x19\xb2\xf2\x04\x1b\xc6\x1e\xd6\x2a\x76\xa8\x1b\xc2\x60\x5d\x80\x41\xcd\x37\xd4\x18\xf6\xb0\x96\xb0\xcf\x3f\xe7\x50\x03\xd8\xc3\x5a\xbf\x3e\xff\x9c\x43\x8d\x5e\x0f\x6b\xf1\xfa\xdc\x73\x0e\x1a\x26\x9a\x2a\x15\xc8\xbb\xc3\xfc\xed\xac\x32\x2c\x83\x0a\x26\xf7\x9b\x66\x9b\x8a\x7c\xf6\x0a\xb3\x9d\x83\x7a\x67\xde\x66\x3d\x33\x50\xcc\xac\xa9\xa3\xd3\xd8\xf6\x44\x9f\x73\x9a\x63\xb1\xd3\xc2\xb6\x9f\x03\xb5\x18\x26\xe3\x6e\x8a\x4e\x52\x31\x29\x91\x60\x81\xd8\x85\x11\x1b\xb0\x45\x0d\x77\x2f\x1f\x2a\xe1\x19\x32\x06\xc9\x9d\x4c\x54\xbf\x21\xa8\xad\xfd\x9b\xf7\x40\xeb\x6f\x18\xfb\xab\x60\x8a\xd4\x41\xaa\xa2\xd3\xbd\x72\x21\x28\xc3\x90\x9a\x07\x1a\x5c\xc9\xea\x02\xcb\x0e\xc6\xcb\xfd\xe2\x48\xee\xfe\xe9\xcf\x55\x37\x89\xc6\x4e\x2a\xcd\x70\xc9\xfa\xed\x7e\xb1\xbe\x03\xb3\xd8\x2a\x8e\x11\xa3\x7b\x22\x18\xa4\xd7\xda\xa6\x74\x55\x58\x4a\xbf\xdc\x30\x6c\xd8\x0f\x17\xbc\xe8\x69\xa8\x00\x15\x80\x0c\xd8\x9d\xed\xf0\xf2\x64\x9b\x74\xe4\x04\x3e\x83\xf0\x74\xdc\x19\x0c\x59\x45\xbd\xc9\xf3\xa1\x8e\x20\x4f\xb0\x89\x0e\xf7\x98\x3e\xb8\xbb\xf4\x41\x82\x97\xeb\x2b\xdd\xad\xb6\x75\x22\xa3\x44\xd7\x67\x6b\x2d\x1d\x27\x4e\x47\xa9\x3b\x43\xc7\x24\xbe\x91\xf4\x73\xb4\x90\x3e\x7e\xf3\xe8\xc3\xda\x46\xa3\x65\xa0\x9f\xda\x33\x34\x8c\x7e\x86\x16\xc5\x31\x4d\x5f\x07\x59\xc6\xb8\xc6\xd0\x87\xb5\x84\x46\xc1\x65\x8c\x6e\x06\xdd\xc4\xa5\x17\xea\x38\x1c\x1f\x07\x97\x51\xcd\x9d\x0f\x6f\xeb\x8c\x78\xbf\xb8\x84\x3a\x96\xa1\xc8\x86\xce\x95\xa9\xc1\x0b\x76\x44\x2b\xe7\x08\x4f\x42\xfd\x1c\xc6\x39\x83\x12\xf6\x21\xdc\x33\x5c\x98\x2b\xdc\xb8\x39\xb2\x35\xf3\x73\x9e\xde\xc3\x7c\x53\x90\xc5\x78\x96\x24\xbc\x64\xc3\xe9\x91\xb7\x9d\xd7\xfb\xce\x77\xfb\xad\xbe\x34\xd5\xd2\x84\xe0\x3b\xa2\xb6\x89\x45\x26\x3a\xf8\xa6\x27\x35\xdb\xbb\x72\x5b\xe8\x21\x3c\x69\x5b\x0c\xc2\xb1\x13\x69\x33\xb6\x36\xfc\xa1\x2a\x14\x61\xe2\xdd\xdd\x55\x3e\xc2\xe5\x05\xfe\x74\x4f\x91\xa0\x76\x22\xc5\xa5\x7d\xd3\xd4\x4e\xbb\xb5\x99\xd8\xbc\xca\xe6\xb5\xd2\x78\x1d\x97\xd4\x4b\x05\xb7\x0a\x2b\xb2\x2a\xb3\x5b\xa2\xe4\x7e\x47\x6b\xd7\xa7\x0f\x9c\xf9\x6d\x7f\x0a\xd4\xb1\xbc\x23\x79\x91\x61\xe5\xa9\xdb\x34\x32\xb5\xc1\x62\xee\xd4\x56\x79\x3c\xfd\x06\x30\x91\x52\xd1\x97\xc2\x30\x24\x84\xe4\x24\xa5\x65\x1e\xc5\x23\x4f\x7e\x00\xd3\xfe\xae\x20\x26\x66\xc3\xec\x9f\x01\x50\xd5\xf7\xc2\xc9\xbd\x49\x2c\xad\x8b\x30\x79\x4f\xde\x5d\xc3\xfd\x49\x25\x7a\xf1\xc2\x15\x56\x22\x98\x39\x83\xac\x21\x71\x9e\x92\x93\x46\x35\x26\x33\xa6\x1f\xf0\x87\xba\x55\x88\x29\x6e\x6c\x03\x4c\x5e\x5a\x00\xaf\x10\x17\xe8\x03\xc9\xa1\x44\xd4\xd3\xb0\x1f\x44\x3e\x8a\xb9\xac\x24\xfd\x99\x40\x1a\x4d\xdc\x26\xdc\x41\xdd\xf0\x3a\xf9\x27\x83\xba\x40\x6e\x37\x9c\xe2\x61\x8d\x77\x01\xa6\xea\x0e\x85\x73\xfb\x19\x47\x28\xfd\xd9\x16\x14\x37\x57\xbd\xe4\x46\xda\x4f\xe0\xae\xd6\x30\x73\xc0\x5a\xe0\x9e\x82\x9d\x01\x60\x2e\x09\xac\x74\x75\xb1\xcd\xb7\x8e\x62\xaa\x09\x3c\x78\xeb\x12\xa0\xda\x63\x9b\xb7\x3a\x92\x2c\x89\x7a\x20\xc4\xb0\xb0\x5b\x87\xbf\xc6\x9d\xa3\x85\xe1\xa0\x04\x08\x51\x63\x65\x0e\xc1\x11\x66\x56\x36\xeb\x4e\x9f\xdd\x76\x9d\xf5\xda\xc3\x7d\x17\xb8\xf5\x1a\x74\xcc\x68\xd6\x26\x64\xe7\x11\xab\x10\x5b\x32\x9b\xf0\x64\xa8\x2f\x20\x51\x47\x57\x5b\x38\x12\x39\x06\x75\xcc\x1e\x86\x16\x61\xdf\xba\xf9\x7c\x5e\x5d\x00\x5e\x8e\xdb\xe6\xae\x07\xf0\xb1\x3a\xf9\x38\xee\x18\x9d\xdd\x5c\xd9\xf7\x5b\xf9\x9c\x5b\xf3\x1b\x49\x4d\x5f\x43\x6c\x2e\xd6\xc0\x31\xaa\x02\xfb\x4c\x26\x17\xb0\x7e\x8b\xbf\x05\x5c\xc7\x9a\x84\x5c\x93\x12\xce\xb6\x44\x28\x08\x63\x5d\x33\xfa\x73\xa0\x41\x9f\x19\xbd\x12\x17\x21\xf0\x12\xca\xf8\x9a\x52\x21\x70\x0a\x66\x95\x10\x24\x08\xa4\xf5\x94\x2c\x02\xb2\x0b\xb2\xeb\x61\x7b\x6b\xaa\x16\xf7\x7f\x04\xf2\x4a\x78\x9e\x97\x8c\xaa\xdd\x29\x14\x9a\xa0\xcb\x52\x71\x21\x4f\x53\x2d\x7b\x9d\x4a\xba\x9e\x63\x91\x6c\xa8\x22\x50\x0f\xe5\x14\x17\x74\x0e\x8b\x83\xc4\x37\xb9\xc8\xd3\x6f\xaa\x14\xbb\x83\xf9\xe2\x3d\xf5\xf7\x99\x6f\xef\xe5\x5f\xa9\xd1\x43\x70\x2b\x90\xb0\xde\x1a\x57\xd4\xf1\xd3\xe5\xed\x5d\x95\x24\x19\x90\xe0\x69\x55\xcd\xaa\x0e\xdb\xac\x37\x53\x23\x9c\xb2\x95\xab\x06\x5f\xd5\xb3\x75\x49\xd9\x61\xd5\xc0\x74\x3e\x91\xe5\x12\xb8\x8d\xcb\x2a\x45\x8a\xf7\x55\x03\x44\x57\x0c\x9d\xe3\x9c\x64\xe7\x38\x54\x0c\xf5\x99\xb7\x12\x82\x79\xe6\x7a\x3b\x0e\xdf\xcc\xdc\x53\x7a\xa8\x7f\x43\x6f\x15\x66\x29\x16\xa9\xdd\x06\x7d\xf5\xd7\x25\x6e\x9e\x79\xb5\x6e\xa0\xf0\x52\x03\xc5\x2d\x65\xac\x21\xe7\x04\x6c\x37\x4d\xee\x93\x12\x09\x97\x77\xb2\xc1\x02\x27\x8a\x08\xe8\xbd\x67\x2e\x25\xff\x81\x36\xc1\x47\x96\x94\x5c\x13\xa3\x82\xa7\x08\x97\x6a\xc3\xc5\xc1\x12\x4e\x5d\x91\x7d\xee\x6e\x97\xfa\x27\xf3\x4b\xa2\xef\x02\x2f\x55\xc4\x94\xdf\x36\x7d\xe5\x3e\xf0\x34\xdc\x12\x70\x8f\x79\xd7\x1f\xd5\x01\x87\x4d\x04\xda\x6e\x75\xb9\x7e\x23\x00\xb5\x15\xbd\x65\x99\xf4\x06\x6f\xc7\x67\x1b\x07\x50\x66\xa6\x32\x87\xa9\xcc\xdf\x84\x5a\x0a\x46\x74\x1a\x8f\xec\xec\x17\xd3\x08\x5a\xd3\xb8\x51\x85\xc6\x55\xa6\x36\xca\x78\xd5\xbc\x42\x23\xd0\xea\x55\x0c\x17\x72\xc3\xd5\x45\x05\x38\xb8\x14\xb0\x23\x55\xca\xf7\x1a\x62\x7a\x40\x40\x30\x86\x21\xd3\xdc\x29\x29\x85\x20\x4c\x65\xbb\xbd\x31\x82\x90\xad\x5e\x0c\x16\xbe\xda\xf7\x02\xd6\x13\xc3\xfa\xab\x08\x73\xa8\xbf\x00\xf7\x7d\xb8\x91\x42\x82\x99\x83\xb4\x37\x91\x26\x58\x48\x98\x07\xc3\xb4\x09\x19\x0c\x2f\x1f\x31\xf2\xe0\x48\x4f\x2f\x15\x00\x39\xb3\xb6\x20\xa6\xa6\x98\xbb\xff\xdd\x7b\x03\xfd\xbf\x5d\x0e\x70\xa3\x4f\x5c\x6b\x91\x75\xe8\x53\xff\x6a\x82\xd0\x5b\x2b\x6d\x46\x3c\xda\x4b\xcb\xc5\x49\x3a\xf1\xda\x36\xbd\x09\xc2\xac\xd7\x6b\x77\xc9\xb4\x62\x22\x5b\xa8\x6e\x73\x65\x04\xfc\x55\xa9\x49\x64\x86\x1e\x88\xd6\xaf\xd9\x50\xeb\x7c\xb7\xb4\x5c\x1f\xe1\xc6\xa4\x5d\x50\xaa\x9d\xde\x92\x6c\xf0\x96\x72\xd7\xc2\x3b\x08\xb2\x89\x42\x7d\xfd\x9b\x18\xd6\x50\x11\xe6\xd8\x36\xfc\xb8\xa0\xde\xc0\xc8\xe6\xd3\x96\xa9\x6f\xae\x4c\xf8\xaa\xa5\x74\x13\xbc\xeb\x2a\x66\x0d\x0a\x38\xee\x59\x12\x2d\x18\x55\x35\xb3\x8d\x1f\xa5\x09\xbb\x5d\x39\x79\x10\x4b\xa8\x15\x61\x02\x42\xd9\x5e\xdf\xcf\x44\x6f\xc9\xd9\xcd\x95\x99\xf1\x02\xbd\x0b\x26\x77\x58\x0c\xb1\x9d\x2d\x37\xa4\x36\x54\xa4\xf3\x02\x83\x83\x4e\xef\xe5\xac\x35\xdb\xaa\xbe\xc5\x00\xc8\xe8\xee\xa8\x21\x01\xd4\x3d\xad\x7d\x71\x72\x28\xd4\x3c\xb4\x66\x92\xaa\x40\xcc\x3e\xb6\x8f\x35\xcb\xa1\xde\x02\x9d\x59\xf6\xd9\x0e\x9f\x79\x96\xc3\xbd\x54\x21\x55\x84\x06\x13\x96\x82\x25\xc7\x51\x8c\x64\x86\x42\xc5\x7e\x9a\xcf\x7e\x1d\x16\x57\xf9\xa7\x91\xc5\xd5\xb4\x49\x84\xeb\xae\x54\xd3\x7b\x76\x51\x63\x50\xe7\x42\x23\x38\x93\xbf\x90\x50\xf3\x89\xcf\xa6\x69\xa1\x22\x96\xb8\x0f\x2b\x36\x34\x38\x7e\xa7\x60\xce\x97\x2d\x3c\xd4\x45\xcd\x00\x11\xa3\x81\x82\x44\xcd\xe7\x17\xde\xa1\xa8\xa2\x45\x83\xc3\xf7\x15\x35\x1a\x2c\x60\x34\x08\x35\x54\xe0\xa8\xb7\x98\xd1\x20\xc4\xa3\x17\x3b\x6a\x3e\x5f\xb0\xf0\x51\xf3\x89\xa4\xc8\xa8\xd7\xa4\x27\x81\xbc\xf9\xf4\xa6\x39\x9b\x62\x75\x7c\x4b\x44\xb3\xb9\x55\xc2\xa1\x2b\x5a\xa8\x99\xb2\x79\x96\x94\xf5\xa5\x8d\x37\x9f\x58\xbe\x18\x93\x4e\xee\x5d\xce\x98\xd4\xf2\x41\xfa\x68\xa5\x9e\x8f\x4c\x33\x6f\x3e\x11\x7a\x67\x67\x21\xf1\xe9\xe7\x83\x70\x51\x3b\x41\x3d\x26\x15\x3d\x02\xe6\xd8\x64\xf5\xe6\x13\x4b\x0a\xe6\x09\x26\xb1\x37\x9f\x03\x12\xda\xa3\xe0\xa2\x46\xec\xeb\xf0\xe2\xd0\x38\xee\x8e\xa2\x92\xde\x9b\xcf\x41\x09\xf0\x91\x0b\xd5\xfc\x34\x32\x19\x3e\x12\x62\x27\x65\x3e\x32\x31\xbe\x35\xab\x71\xe8\x1c\x4a\x98\x6f\x3e\xa3\x93\xe7\x23\x97\xbd\x97\x62\x3f\x98\x48\x1f\x09\xd6\x9b\x6e\xdf\x93\x54\x1f\x09\x32\x2e\xf5\xbe\x4e\xb0\x8f\x04\x7b\xbc\x34\xfc\xe6\x33\x90\x92\xdf\x7c\x22\xb9\xae\x79\x46\x52\x58\x9c\x05\xd0\x3d\x31\xda\x99\x79\xfc\xe9\xfc\xed\xb7\x22\x2a\x37\x34\xa7\x19\x21\xed\xc6\xaf\x68\x20\xfd\xbf\xf9\xfc\xb2\xa2\x71\x7c\x89\x80\xc1\x29\xb8\x12\x02\xa3\xcb\x05\x0c\x2f\xae\x59\x4e\x20\xaa\x74\xc0\x20\x48\x6f\x69\x81\x40\x19\x81\x08\x0d\x2e\xaa\xcc\x40\xbc\x10\x74\x54\x29\xd7\xf6\xc8\xf1\x95\x92\x6f\x3e\xfe\x2a\xdf\xb7\x0d\x28\x75\x5c\x87\xcb\x1c\xc8\x30\x0d\x04\xc0\xa0\xc3\xa3\x8a\x7a\xec\x0a\x50\xe4\x3e\xec\xbb\x88\x3a\x14\xae\x93\x6d\x1a\x8f\x91\xfa\x93\xca\x51\xf6\xd0\x8c\x42\xb2\x06\x95\x86\xf9\x2f\xac\x07\x34\xb1\x57\x47\xfe\xbf\xab\x3a\xe1\x42\x69\xcc\xdc\xc4\xb7\x3f\xd8\xc6\xa2\x61\x67\x03\x4b\xb2\x32\x35\xd1\x5f\x00\x16\x14\xc1\x71\xcd\xae\x47\xa3\x70\x14\x51\x7d\xae\x3e\x71\x02\xa7\xd5\x86\x6a\x33\xdf\x50\xd2\x94\x7e\x6e\xf6\xfa\x33\x43\xa8\x97\xf1\xac\x53\x39\x4c\x8f\x11\xab\x1b\xf6\xac\x42\xa7\xfd\x68\x17\xb2\x2a\x3b\x16\x3b\xeb\x4f\x82\x63\x21\x72\xa3\x22\x1b\xa8\xde\xa9\xef\x35\xa7\x76\x14\x67\x49\xe8\x93\x6b\x87\xfa\x6b\xf2\xb2\xe2\x44\x95\x38\x3b\xc8\xc9\x5a\x13\x0d\x81\xc0\xa0\x0d\xee\x0f\x45\xf9\x17\x73\xb6\x26\xb8\xc0\x09\x55\x41\x45\x71\xbc\x34\x12\x39\xc1\xbd\x32\xf6\xad\x03\x61\xb7\xb2\x36\xb2\xd9\xcb\xa7\xee\x34\x15\x9c\xc1\x36\xb2\x1b\xf1\xc0\x85\x99\x70\x66\xd6\x1e\x4f\x9d\xe7\xf6\x24\x9f\xbb\x4f\xf5\xcc\x7d\xc7\x34\xb8\x06\xc8\x4f\xaa\xfa\x6a\x75\x41\x40\xdc\xb9\x61\x97\x92\xfe\x4c\x40\x58\xf1\xa7\xd5\x20\x4b\xef\xf5\xbc\x1a\x75\xfc\x35\x9f\x3d\xf9\x04\x60\x6e\x15\x16\x8a\xa4\xc1\xd6\xde\x11\x34\xda\xee\x4a\xd3\xd7\x42\xbf\x9e\x88\x39\xc3\x99\x44\x29\x81\xff\x1d\x92\x8e\x97\xbc\x54\xc0\x73\xe1\x8e\x2c\xb6\xc9\x90\x8f\x34\x52\x84\xce\xb0\x54\x37\x82\x2f\xc9\x1d\x1d\x76\x5d\x75\xba\x84\x4a\x85\x4c\xa6\x3e\x78\xb6\x97\x66\x3f\x6a\x0a\x1a\x16\x9e\x5d\xc2\x69\x8a\x15\x99\x7b\xcb\x86\x34\x9f\x11\x12\xbf\x5e\xdb\x9d\xc0\x4c\xc2\x64\x9e\xb4\xc0\xd6\xb2\x90\xaa\x80\x46\x58\x8e\x91\x89\x4a\xe3\x8c\xd8\x3b\xd3\xc8\xf5\x60\x97\xfe\xc2\x08\xca\x89\x94\x3d\x69\x03\xdd\xa7\x85\x95\xbf\x94\x39\x66\x73\x41\x70\x0a\x81\xc8\x16\x08\xa2\xa6\xea\x0c\xf4\xfc\x8d\xa2\x69\x54\xd1\x75\x06\x78\xae\x90\x3a\x8c\x95\x11\x6b\x14\x04\xcb\x70\x8f\xfd\x9e\x25\x7e\xcf\xe8\xdf\x4d\xc9\x1b\x2a\x1b\xdd\xb2\xb1\xfe\x6f\xa1\x66\x28\xc7\xc9\x86\xb2\x18\x43\x04\x70\x33\x09\x21\x74\x1a\x59\xd6\x3e\x04\xb6\xc5\x35\xdd\x56\x8d\x4b\xf4\x1c\x07\x0d\xe7\xe6\xa9\xc8\xf0\x44\x76\x10\xa7\xf9\x27\x55\x36\x82\x43\xa2\x17\x2d\xf6\xd6\x57\x4b\x6a\xff\x31\x2d\xf1\x6c\xa4\x34\x89\xe3\xc5\x51\x06\x60\xe0\xd6\x47\xdd\xd8\xb0\x00\x7a\x10\xc8\x50\xd5\x86\xfa\x19\xc1\xe6\x6d\x75\x87\x98\x83\x60\x2a\x12\xd9\x68\x59\xbe\x1a\x00\xbc\xd0\x90\x8f\xb7\xf4\x38\xab\xd3\x1c\x0d\x88\xe7\xe6\x25\x35\x34\xb5\x51\xea\x7d\x58\x96\x2b\x36\x58\xc6\x6b\x5f\x37\xfa\x6d\x9f\x1a\x02\xa0\xbc\x98\x7f\x5e\x75\xea\x90\x9c\x35\xc5\x33\x22\xfa\x7b\x71\xb6\xab\x81\xad\xf6\xe2\x86\x50\xc1\xd3\x13\xd9\xfc\x3e\xb2\xc7\x54\x27\x49\xb3\xe0\xa9\x61\x91\x77\x15\x2c\x50\xb3\x95\xc2\xc9\xc6\x06\xcc\x99\xbf\x40\xac\x57\xdf\x36\x6a\x45\x46\xb9\x4e\x9c\x2a\xd9\x58\x8e\xa8\x04\x2d\x32\x82\xfe\x54\x99\xd4\x66\x64\xb5\x22\x89\xfa\x4f\x54\x4a\xa7\xb2\xc0\xfb\xfd\x28\xaf\x0c\x5b\x7f\x72\xff\xf5\x9f\xdd\x0d\x0c\x0b\x49\x66\xbc\x88\x02\x0e\x97\xf0\xa2\xbb\xfe\xdc\xfc\x61\x59\x06\x06\xd4\xd4\x06\x5b\xb4\x49\xb3\xf1\x90\x88\xe1\xba\xa6\x5f\x0c\xce\xb2\x16\x08\xb9\x30\xfd\x6d\x1b\x1b\x69\x83\x24\xac\xa5\xce\x03\x13\x0b\x82\xae\xf9\xad\xed\x48\x3d\x43\x37\x60\x65\xa8\x7f\x01\x7b\xdf\x35\xbf\x7c\x24\x49\xe9\x4b\x88\x1b\xa0\x6e\xaf\xc7\xad\x1d\x8d\x55\x7b\xd8\xcc\xba\x5a\x1e\xb6\x9a\x14\x07\x8a\x46\x2b\x6e\x71\xe8\xc1\xd6\x3d\xd9\xd5\x25\x8b\xad\x57\x0f\x3c\x11\xb3\x21\x33\xb8\xf3\x5b\x18\x77\xc8\x7f\x58\x43\x0a\xcf\x97\x94\x99\x89\x55\x79\x70\xf5\x98\xce\x48\xea\x8d\x94\xd2\x2f\xc1\x94\x0e\x41\x6c\xd8\xd1\xd7\xee\x06\x3e\xa2\xb2\x75\x65\xdd\xf5\x71\xb4\x3e\x17\x5e\xc3\x23\x77\xf9\xf7\x12\x67\xed\x1c\x6a\xfb\x53\xd0\x93\xd4\x29\x94\xfb\x40\xb3\x34\xc1\xc2\x24\xc7\xd9\x14\x1a\xd7\x15\xdf\x44\xcc\x27\x10\x5e\x6a\xd8\x47\x00\xc1\xb0\xf3\xd2\x9a\x86\xb0\x50\x34\x81\x36\x4b\xb6\xe3\xab\xc7\x07\x35\x94\x79\x55\x11\xe4\xad\xe9\xb5\x14\xb1\x09\x77\xfb\xdf\xec\x5f\x34\x05\x11\x94\xa7\xa0\xd4\x5b\x95\xc2\x4b\xe5\xd5\x71\x78\x69\x73\xd7\x2c\x75\xf2\x95\xe3\x29\xd5\xa1\x6d\x45\xb8\xf8\x93\xa3\xaa\xb4\x6d\xdb\x36\xf4\x55\x83\x33\x57\xa7\x72\x81\xfe\xbc\x73\x41\x38\x10\x90\x63\xe2\x4e\x3d\x20\xa1\xf8\x69\x3b\x49\xd4\x40\x6c\x1c\xf3\x15\x17\x64\x4b\x04\x7a\x99\x72\x88\x60\x25\x5b\x9a\xa8\x4e\x67\x2a\xf7\xfc\x3f\x44\x70\x20\x32\x46\xd6\x58\xd1\x6d\xe5\x87\x70\x6a\xbb\x72\x61\xcd\x12\xbd\x46\x2f\x01\x18\xa2\x79\x4e\x52\x8a\x15\xc9\x76\xbe\x72\x18\xd6\xd2\x6c\xac\xca\xfd\x83\x3f\xbd\xf2\x51\xa0\xcc\x4d\x4f\x89\x9b\x16\x33\x34\x42\xdf\x1e\x27\xac\xae\x43\x6f\x1c\x81\xd7\x9b\xdb\x2a\x44\x58\x69\x2f\x8e\x11\x3a\x72\xf1\x40\xfd\x6f\x4d\x6b\xb8\x6a\x57\x66\xce\xc8\x01\xa7\x68\x50\xa6\xe9\x4a\x76\x4a\xe0\x84\xb2\x75\x44\x03\xde\xbb\xe6\x9b\x55\x1f\x5e\x8d\x2d\xf3\x07\x44\x5d\x23\xb7\x86\xf5\xbf\x6b\x28\x22\x8f\xfa\x50\xda\xb2\xcb\xd6\x2d\x00\x84\x5f\x07\x96\x43\xca\x29\xdb\xa1\xb2\x48\x78\x6e\x2c\x4f\x19\xd1\x92\x22\xa4\xa2\x2e\x05\xc1\xf7\x7d\xab\x7f\xc0\x1d\xce\x33\x75\xc8\x9d\x3a\xe4\xfe\x33\x74\xc8\xb5\xf6\xfb\xe0\xf9\xfb\x6c\xe3\xfe\x6c\x0f\xbf\x76\x23\x6c\x7d\x15\x57\xf6\xf3\x2a\x44\x90\xb3\xde\x2b\x8f\x97\xaa\x28\x55\x33\xe5\xd8\xac\xdd\x1a\x34\xdc\x40\x75\x2e\x43\x55\xf0\xae\x28\x08\x4b\x7b\x50\xa4\xb8\xdd\xf0\x2a\x38\x11\x64\x0a\x41\xd0\x9a\x30\xb8\xa0\x4c\x6a\x0b\x12\x44\x96\x19\x38\xd6\xad\x7b\x17\x72\x00\x5d\x33\xf8\x03\x74\xa2\xcf\x2e\xfb\xaf\x21\x85\x99\xba\x4a\xce\x64\x62\xd3\xd7\x9d\xc2\xb3\x43\xcb\x3e\x36\x6c\x3c\x27\x36\x7b\xb0\x59\xce\xcf\xc5\x15\x14\xbc\xc7\x96\x12\xd6\x67\xf0\x83\xbc\xcc\xb0\x54\x34\xf9\x73\xc6\x93\x7b\xbd\xe2\x98\xdb\xea\xe4\xec\x87\xdb\xce\x77\xad\x15\x32\x74\xf6\xc3\x2d\xba\xa0\xf2\x7e\x28\xdb\xc5\x75\x25\x6d\xea\x87\x18\xdd\x9b\x92\xd2\x27\x27\x12\x6d\x38\x74\xcc\x04\xdb\x9a\x0b\x45\x60\x9a\x49\x73\xe9\x35\xb4\x5a\x91\x16\x6a\x02\x3c\xb1\x7a\x04\x7e\x90\xc4\x2c\x75\xa9\x97\x0a\x59\x5f\xfd\x6e\xab\x61\xfb\xfa\x4a\xde\x05\x8d\x49\x6d\x24\x37\x7c\xde\xce\x99\xde\xf0\xd3\x01\xde\x76\xbc\x44\x0f\x38\x18\x35\xe2\x7a\x37\x2d\xd0\x1d\x2d\xde\xa2\xcb\x46\xa5\x6d\x53\xbd\xb2\x3d\x08\x95\x75\x46\x5e\x00\xaa\x15\x9e\x60\x6f\x8c\xa8\x01\x7d\xff\x8d\x2c\x85\x2e\x1f\x71\x5e\x64\x44\xbe\x45\x2f\xc8\xa3\xfa\xfd\x8b\x19\x7a\xf1\xb8\x92\xfa\x7f\x98\x5a\xc9\x17\x21\xb3\xc9\x55\x5e\xc5\x6b\x43\x0a\xb7\x4d\xb1\x5b\x12\x0b\xaa\x5b\x5e\xa9\xda\xde\x00\xd4\x63\x6d\x7c\x60\x08\x73\xb1\x6c\xf8\x03\x4a\xb9\x71\x7d\x40\x8e\x1c\x22\x42\x70\x53\xa3\x62\x0f\xdd\xe0\x00\x48\x78\x5e\x08\x9e\x53\x39\xe0\xc1\x04\xcb\x06\x1c\x01\xbf\xcb\x34\xc2\xe2\x04\xaa\x90\x0a\x94\x60\xe8\xd4\x32\xd1\xa7\xc8\x7d\xe4\x16\xd1\x47\x81\xe1\x9c\x3f\x4b\x81\x57\x2b\x97\x09\x30\x43\xaa\x5d\x5a\xc6\x91\xa9\xa6\x2c\x0b\x5f\x33\xc9\x10\xa9\xd4\x54\xf6\x8e\x3b\xbe\x8e\x4e\x53\xb2\x3d\x95\x29\x7e\x33\x83\xa9\xb9\x7a\x46\xaa\xb9\x8e\x00\x4c\x2c\xd1\x8b\x37\x2f\x16\xe8\x96\xe6\x34\xc3\x22\xdb\xcd\x9a\x2b\xae\x31\xa1\xf5\x53\x37\x54\xd8\x96\xfb\xe2\xf5\x0b\xf4\x92\x0b\x98\x8d\x56\x5e\x33\x82\xb7\xc4\xa5\x7d\x9a\x5a\x96\x20\x83\xbf\x5a\xf8\x77\x36\xd4\x35\xbd\x7e\x86\x74\x11\x64\x1c\x1f\xe9\x47\x96\xc5\x36\xf5\x3a\x71\xf2\xc9\x0b\x25\x4a\xf2\x42\xef\xd2\x8a\x8b\xc4\xf0\x61\x70\x97\x6e\x08\x44\x58\x7c\x0c\x15\x98\x43\xf5\x52\x29\xb3\xf7\xe1\x07\xbd\xd9\xb0\xed\x06\xb4\x97\x38\x02\x50\xa9\x44\x2f\xa0\x82\xff\x8b\x5f\x90\xcb\xa3\xc1\x32\xf9\xe6\x31\x90\xaf\x2e\x62\x31\x6d\xbc\x4b\xe8\xea\xc2\xf1\xf9\x86\x6f\x25\x6d\xde\xa3\xbe\xf2\xc2\xe6\xd1\xd7\xee\xcb\xb3\x1c\xff\xcc\x19\xba\xfc\xf3\xad\x9d\xc6\xab\x2f\x82\xa0\x27\x94\x5f\x75\xd8\x0b\x68\x98\x5e\xbb\x39\xfe\xb9\x14\x44\x8b\x1e\x31\x4d\xfa\xdc\xbb\xfb\xd2\x8b\xfe\x1d\x5d\x60\x85\x8d\x10\x63\x13\xd7\x7c\x98\xaf\xee\x42\x7d\x2e\x96\x90\x57\x6b\xcb\xbb\xf9\x25\x33\x14\x25\x32\x24\xc0\xf5\xd7\xe1\x90\xbc\x36\x25\xfd\x45\x4f\xe4\xdc\x7c\x07\xb1\x3f\x6f\xd1\x35\x67\x64\x06\x07\x15\xe9\x93\x6a\xff\xf3\x07\x41\x15\x09\xb0\x9d\x88\x0b\x45\x53\x66\x38\xd6\xad\xa3\xad\x36\xb5\x40\x48\xfe\x06\xea\xb6\x57\xcb\x32\xe3\x4b\x17\x9d\xf9\xd4\x79\x7d\xff\xe9\x6a\xc4\xb4\xbe\xff\x74\xf5\xbc\x53\x1a\x25\xfc\xed\xcb\x7e\xb5\x14\x57\x6b\xf2\xb5\x2c\x31\xe0\x86\x6a\xd4\x58\x18\x92\xdb\x16\x4e\x62\x0b\xdd\x68\x2d\x59\x6e\xb4\xc4\xf6\x14\x1c\x86\x13\xbe\xf7\x6a\x0a\xfe\x1f\xf6\xae\xad\xb7\x71\x1c\x59\xbf\xef\xaf\x20\x66\x1e\xd2\x0d\xc4\xc9\xcc\x9e\xc1\xec\xa2\xb1\x58\x20\x9d\x74\xcf\x09\xb6\x2f\xd9\xb8\x7b\xe6\xe1\xe0\x60\xc1\x48\x74\xcc\x8d\x2c\x6a\x44\x29\x69\x9f\x5f\x7f\xc0\x2a\x52\xa4\x64\x89\x17\xdb\x49\xba\x77\xac\x97\x99\x76\xac\x32\xaf\x55\xc5\x62\xd5\xf7\x7d\xa9\x90\xb2\x5d\x87\x0b\xe7\x4b\xaa\x14\x0e\x59\xb5\x45\x03\xf7\x48\x30\xb1\x6a\xa6\x7d\xe6\xbb\x62\x75\x07\xdd\x46\x35\x68\x23\xb9\x60\x78\xad\x93\xbf\x32\x69\xde\x9d\x2c\xf7\x05\x9f\x9f\x61\x44\xbd\x87\xf2\xbf\xfc\x15\x6a\x2d\x82\xd5\x80\xb9\xb3\x0a\x5f\x40\xfe\x34\x2f\xcd\x9f\x7c\x42\xef\x29\x2f\xe8\x0d\x2f\x78\xb3\x56\xd6\xf9\xe5\x49\xaf\x78\x52\xc2\x00\xec\xb4\xdd\x13\xdd\x07\xf7\x3e\x00\x0c\x35\x79\xa1\x24\x9c\x3e\x28\xc5\xf3\xf2\xa4\xf3\x1c\xfc\x68\x70\x1a\x84\x02\x1d\x0f\xd7\xe1\x30\x80\xd7\x43\xaf\x22\xb4\xc4\x7c\x86\x3b\x64\x98\x8c\xc2\xf3\xfc\xf9\xf3\xf5\xe5\xd6\x66\x4b\xed\xfb\x58\xb3\xa5\xbe\x3b\x6a\xb6\xe0\x0f\x1a\x68\x74\x82\xb8\x17\x1f\x8c\xbe\x3c\x92\xe5\xfa\xcf\x5f\x2b\x26\x64\x9a\x60\x00\x5d\x48\x07\x13\xab\xed\xd5\x56\xe2\x0c\xce\x83\x0a\xc4\x00\xc8\x82\x35\x55\x73\xf7\x0f\x4f\xdd\x4f\xc4\xce\x06\xe5\x90\xd0\x11\xd0\xa6\xc4\x0b\xdb\xbb\xb3\x13\x68\x47\x77\xea\x0b\xa6\xd1\xdb\xec\xb7\x8c\x55\xcb\x45\xcc\x1d\xde\x39\xab\x96\x6f\xe7\xfd\x00\x9e\xfa\x8c\xbc\x9d\x77\x7e\xa1\xdd\x47\x9e\xea\x57\x68\xae\xc4\x60\xdf\x91\x24\x05\x5f\xb0\xc9\xe4\xbd\xf0\xfe\x5a\x89\x92\x37\xa2\x8e\xe5\xf5\x85\xba\x7f\x18\x6d\xf2\x5e\xbf\x89\xd5\x0f\x99\x28\x0a\x96\x99\x18\x2d\x74\xcc\x88\xf6\xac\xbf\x91\xe3\x04\xd3\xe7\x71\x03\xf4\x66\xd0\x6f\x71\xa0\x4f\xaf\xdf\x9c\x5d\xbc\x7f\x73\xb2\xca\xbf\x5f\x8a\x87\x59\x23\x66\xad\x64\x33\xde\x4c\xdb\xa3\xa7\xa1\xc7\x85\x92\xc0\x65\xec\x20\x7e\x34\x81\x7d\xf2\x59\x62\xc4\x18\x42\x33\x6a\x15\xb0\x9c\xd4\x42\x34\xc7\xa4\xa6\x3a\x94\x3f\xa9\x36\x88\x3e\x32\x2c\xda\xa2\xc0\x11\x6f\x6a\xc6\x8e\xdd\x78\x88\xa7\xe8\x7f\xff\x76\xda\xe9\x56\xac\x1a\xf6\x05\xdb\x58\xcd\x92\xd5\xb0\x1f\x66\x95\x3c\xf2\x52\x8b\xd7\xf5\xd3\x06\xda\x37\xaa\xf3\xee\x5d\x73\xc7\xab\x16\x9d\x1a\xe3\x3b\xb6\x26\x81\x4c\xbc\x85\xa8\x01\xf9\xbe\xbf\x3e\x58\x93\x41\x77\x01\x62\xf6\x44\xdb\x92\x27\xd8\x95\x31\xb6\x04\x1a\x73\xcd\x16\xdb\x0e\xd4\x35\x5b\x60\xc1\x58\xbf\xfa\x09\xe0\x12\x59\xd9\x40\x46\xb1\x37\x8c\xa7\x87\x63\x74\xe4\x74\xd5\xf3\x13\x0c\x55\x5c\xc2\x7d\x18\x1e\xea\xeb\xbb\x45\xb5\xcf\xde\xee\x53\xed\x93\xa0\xd6\xbd\xe9\xa2\x3e\xea\x32\xaf\x5e\xaf\xcd\x26\xad\x69\x2e\x24\x32\x41\xa8\xb1\x38\x8e\x8b\x49\xd2\x7c\xc5\xcb\xaf\x62\x2b\x86\x1c\x2c\xaf\x9d\x0f\xb9\x4f\xbc\xcc\xa7\xc6\xb7\x3f\xb6\xe7\xf0\xcd\xbe\xff\x84\x6f\x5b\xd4\x44\x7d\xf7\x47\xcd\xf9\x63\xf2\x9c\x2b\x4a\x73\x37\xd8\xbf\x19\x8c\xda\xd0\xab\xb5\xfc\xbd\x98\xe1\x6f\xcf\xaa\xdc\x8e\xf8\xf3\x5c\xe8\x3d\x55\x50\x67\x70\x19\xf7\x0c\xa1\x9d\x28\x7f\x31\x71\x76\xc8\xc1\x15\xda\xeb\x28\xc6\x78\x3f\x5b\xd9\x74\xc0\xdc\x96\x06\x19\x06\x73\x5b\x10\xbc\x5b\x9f\x7a\xfd\xee\x4f\xc7\x79\xa7\x99\xfd\x10\x55\xaa\xd4\x39\xd4\x1f\x2b\x56\xce\x1b\x9a\xdd\x79\xe2\xd8\x07\x3b\xfc\xac\x76\x38\xf5\x26\xcc\xa4\xc5\xe4\xdd\x7c\x73\x60\xbd\xd2\xd7\xb8\x36\x6b\x06\x17\xf9\x57\xa8\x75\x1e\xf3\x76\x0b\xb3\xaa\xde\xd3\x09\x40\xda\x7e\xe4\xc2\x7c\x77\x60\x7c\xbb\x8f\x21\xf6\xa4\x93\x41\x2b\x51\xb5\xc5\x74\x56\x35\xe4\xbe\x63\xc3\xb7\x34\x96\xda\x79\x4a\xb9\xca\xb2\x4a\x64\x25\x72\x46\x6e\x78\x47\x03\xae\x1c\x01\x83\x67\x0c\x36\xd3\xb3\x0a\x6e\xba\xfc\xe5\x93\x7e\x22\xa4\xc3\x53\xf2\x03\xf8\x1e\x3f\xfc\xe5\x2f\x7f\xb1\x69\xec\x3e\x0b\x2c\xc8\x0f\x3f\xff\xf4\xd3\x09\xb9\xd0\x24\x3a\x9c\x75\x5c\x89\xdd\xf1\x8e\xd6\x0c\xf2\x9b\x29\x64\x67\xfb\x89\xf4\xf4\x00\x6b\x9b\xa0\xf3\x53\x91\x56\x14\xd1\x79\xd5\xa4\x15\x3c\x6b\x90\x43\x0b\x37\xb9\x26\x69\xf4\x0a\xa5\xe6\xf7\xbb\xfc\x13\x18\xcb\x63\x52\xf0\x3b\x46\x16\x12\xd0\x79\x2d\xc6\x0b\xa6\xbf\x79\x24\x66\xb4\x84\xa4\x73\x68\x80\x9d\x15\xc9\x9a\x27\x49\x60\x08\x04\x85\x86\x45\x4e\x3d\x5e\x4b\x20\xe0\xbd\x63\xeb\x19\x4e\x7d\x45\x79\x97\x3b\x77\x41\x9b\x69\xfc\x7e\x93\x28\xdf\x57\xf6\x19\xcb\x9d\x0d\x66\x12\x10\xab\x5a\xfc\x1b\x27\x9b\x97\xde\x94\x18\x17\x34\x5c\x6a\xc7\x4f\x23\xf7\x94\x0e\x12\x88\x41\xc6\xd3\x74\x8d\xfe\x5c\x13\x5b\xc6\x31\x52\xe0\x55\x70\xe0\x1e\xb8\x63\x6b\xb9\xd9\x5a\xaf\xbb\xa1\x4f\xdf\x36\xdb\x52\xad\x6e\x89\x6b\xa6\x2d\x37\xe4\x22\xda\xb8\xcf\xa2\xa3\x2a\x82\x46\x52\x53\x91\xe3\xe4\x72\x42\xf5\x80\x46\xb7\xd6\xdf\xd5\xf3\xe4\x11\xda\x4d\x45\x2f\x63\x47\xb2\xa6\xd5\x93\x03\x89\x58\xaa\xbd\x4c\x4a\x5d\xc6\xb0\xa2\xf5\x9d\xb7\xef\x26\x8f\xf7\x84\x5c\xa9\x2e\x77\x89\xb8\x58\x3f\x73\xcf\x3a\x7e\x17\xd5\x54\xed\xcd\x04\xda\x79\x74\x72\x72\x84\xea\x41\xd4\x44\x36\xb4\xd6\x3b\x5a\x7d\x3e\x6d\xca\x82\xb1\xd0\xde\xc2\x7f\x4f\x2b\x87\x6b\x05\xaa\xaa\x04\x14\xc2\x34\x4b\x4b\xe8\x1a\x46\x86\x88\x05\x0c\x88\xc0\x57\x1c\xcd\x59\x6f\x84\x59\x80\x7b\x43\x04\x5f\x05\xa0\x8b\x36\xda\x12\x30\x31\x48\x20\xc3\x0b\x16\x46\x2b\x5c\x45\x58\x96\xcb\xc5\x00\xb2\x3d\x28\xd5\x59\xcb\x8e\xfd\x1c\xb0\xeb\xf6\x8c\x45\x50\xa4\xdf\x98\x8c\x9a\x8c\x70\xe7\x83\x26\x65\xd3\x70\x04\x85\x46\x18\x16\x7c\xe2\xcc\x0b\x3e\x31\x46\x06\x1f\xff\xbd\x00\x3e\x1b\xeb\xba\xd3\x0c\xb8\xc5\x17\xd6\xea\x42\x95\x60\x15\x85\xd1\x8f\x9b\x03\xa9\x43\x35\x77\x03\x2d\x09\xbd\x91\xa2\x68\x1b\x14\x6d\xff\xa8\xd5\x4e\xd4\x4a\x82\x46\x19\xec\x38\xd0\x38\x9d\x18\x47\x15\x81\xb2\x8f\x43\x32\xf4\x6b\x2d\xfd\xc3\x7b\x85\xa0\xf7\xc2\x1b\xce\xa0\x87\xc1\x2b\xa3\x40\x95\x79\xf8\xca\x28\x81\x3d\xfd\x2b\x3a\x27\xee\xf9\x8c\x18\x31\xaf\xbe\x3a\x98\x91\xb1\x1a\xab\x86\xb1\x2e\x96\x2d\x88\x41\x43\xec\xf3\xf8\x7d\xb5\x32\x6e\xeb\x7d\x41\x8f\xd0\x41\x4c\xf2\x98\x23\xd8\xfc\x92\xbc\x38\xef\x4a\x35\x0c\xdf\xea\x65\xd9\xb0\x7a\x41\x33\xf6\xd2\x3d\x9a\xf9\xf3\x86\x4c\xa5\xc4\x92\x96\x79\x61\xea\x40\x08\xfb\xa2\x19\xe7\xd4\x2f\xe5\x35\x87\xc2\xca\x33\x97\xba\x67\xa2\xb2\x32\xe2\xc0\x06\xd2\x62\xf3\x37\xf0\xa7\x47\x28\x6f\x9d\x86\x41\x17\xb0\xfd\x7e\x3f\xb6\x3b\x6b\x9e\xa8\x05\x00\xf6\x03\x54\xd3\x5a\xb4\xb5\x0e\xb0\x1b\x36\x95\x4c\xd4\xea\x08\x16\xe2\x9e\xa0\x92\xd4\xec\x56\xf9\xaa\x35\x62\x01\x22\xcc\x60\xab\x3e\xd8\x29\x27\x6d\x4f\x79\x7d\x4e\xee\x9d\x0e\xc3\xfa\xe2\xb4\x26\x40\xbb\xd0\x4e\xb2\xb8\xe7\xb9\x71\xf4\x91\x50\xf5\xde\x54\x94\x56\x54\xca\x8e\xa7\xc8\x3b\x40\x52\x64\x1c\x0e\xd4\xce\x8c\xa1\x33\x0e\xee\x46\xce\x1a\x56\xaf\x78\xc9\x7a\xb9\xfb\x71\x01\x6b\x64\x29\xf5\x60\xff\x46\x0c\x74\x29\x72\x76\xd5\xde\x14\x5c\x2e\xe7\x89\xd1\xc8\x0f\x23\xaf\x62\xf6\xc3\xc6\x1d\x23\x46\x28\x7d\x67\x82\x61\xec\x92\x48\x06\x50\x3b\xf7\xcc\x45\x2d\x04\xef\x96\xca\x8e\x20\xf2\x7c\x3e\x9e\x15\xa6\x5b\xab\xf7\x87\x80\x8a\x90\x82\xe9\x7a\x69\x35\x11\x4e\xdb\x7f\xb5\x64\x54\xea\xd3\xcf\x65\xe5\x7e\xee\x3d\xb4\x17\x85\x1c\xf2\xc4\x1b\xe5\x8c\x9e\x9a\xe1\xea\xc6\xd5\xc3\xd5\xc2\x0a\x8f\x05\x1f\x70\x3e\x38\x25\xa8\xfd\x61\x92\x48\xf6\xd4\x2c\x69\x49\x84\x17\x23\x09\x5f\x07\x28\x0b\x23\xaa\x9b\x23\xc4\x1d\xc0\x05\x3d\xbd\x94\x0e\xe1\xde\x67\x0d\xf7\x26\x5e\xb8\xcc\xf5\x59\x08\x37\xa3\xc6\xea\x1c\xd4\x8e\x1a\x55\x1f\x3e\xb2\x06\xee\x6c\x76\xba\x02\xc1\x5f\x3f\x6b\x90\xb3\xd2\x0b\xe6\x99\x08\x14\x19\x35\xf4\x23\x45\xa5\xb6\x2d\xe0\x3a\x30\xa9\xf5\xc8\x4c\x1f\x30\x33\x67\x2f\x04\x83\x84\xdd\xce\x72\x34\x96\x96\x67\x8d\x30\xd8\x5f\xfc\xf0\xc8\x27\x32\x17\x59\xdb\xf1\xa9\xc0\xfc\xd9\xeb\xca\x10\x0e\x7e\x70\x8d\x05\x73\x74\xa1\x7d\xdb\xf8\x74\xb9\x78\x28\x1f\x68\x9d\x9f\x5d\x4d\x94\x0e\xf4\x5d\x1e\xfb\x6d\xd7\x8b\x33\x42\x80\x47\x0d\xb1\xec\x74\x2a\xad\xcf\xb1\x1b\x44\xe1\x0f\xf1\xf6\xfe\x10\x1d\xe2\xed\xdf\x40\xbc\x5d\x7d\xb7\x4f\x98\xd3\xdb\x0b\x3a\x8e\xe5\x0d\x28\xa5\x05\x3a\x9d\x1d\x88\x1a\x71\x98\x13\xef\x38\x64\x7e\xe3\x27\xf4\xea\xb6\xb3\xe6\x38\x78\x7a\xfb\x06\xe1\xf4\x63\x03\xa6\x20\xc7\xeb\xbd\x8e\xf4\xd5\x49\xe0\x9d\x03\xb6\x07\xde\x1a\x38\x17\x13\x95\x88\x60\x88\x00\xf3\x0a\x3c\xd6\x88\x00\x75\x8c\xec\x36\xf2\x18\xcf\x6c\x00\xb4\xa3\x1c\x90\x8a\x66\x0c\x76\x54\xa7\xb8\x83\x61\xb8\x14\x56\x9e\x30\x1b\xfc\xe4\x40\x18\x56\x78\x03\x79\x82\x34\xf0\xea\x7f\xdf\xaa\xd1\xb8\xf2\x47\x80\xec\xc3\x25\x51\x6e\x41\xc3\xb0\xb0\x99\xd5\x2b\x49\xc4\xe2\xb8\x57\x33\xf3\xdd\xfd\x8f\xde\x72\x75\xf3\x24\xd1\x7f\x2c\x4c\x33\x93\xbb\x7e\xd5\x0b\x2a\xaa\xa9\xb7\x48\x2f\xc1\x9b\x07\xfb\xd8\xbb\x16\xd8\x96\x38\x9e\x7b\xee\x66\x2c\x67\xc9\xcc\x0e\x47\x54\x1c\x31\x82\x8a\xe4\x70\x09\x70\xb8\x04\xf0\x7f\xf7\x11\x2f\x01\x1c\x35\x0d\xbb\x95\x4b\xa2\x07\xc0\xbd\x18\x08\x04\xab\xf0\x19\xdc\x1e\x58\x06\x67\xed\x56\x99\xab\x01\x73\x2f\x10\x81\x14\xec\xdc\x51\x92\xa3\xa3\x93\x93\xa3\x23\x73\x9b\xa0\x17\x6e\xdb\x2c\x66\x7f\x25\xac\xcc\x44\x8e\x8b\x2a\xdc\xcc\x05\xaf\x65\x03\x86\xdb\x9e\x8f\xdd\xbe\xae\x4c\x5b\xed\x15\x43\xf8\x5e\x01\xda\x16\x47\x7c\x18\x05\x65\x8b\xb5\xf3\x6f\xb7\x32\xbc\xd6\xdc\x76\x35\xf8\xba\xa3\x1d\x06\xcf\x2b\xb0\xab\xc1\x6e\x59\x14\x7f\x24\x6f\x85\xed\x61\x78\x42\xc9\x0b\xfc\xf0\x24\xab\xda\x63\xfd\x85\x93\x15\x5b\x89\x7a\x1d\x56\x11\x46\x88\x7a\xb9\x27\x55\x4b\x78\x09\xb6\xdc\xb2\xb5\x3f\x8e\x55\xef\xc6\x23\xc4\x7f\x62\x9e\x41\xa6\x70\x17\x27\x87\xe8\x8c\xe5\xd4\x59\x74\x00\x1f\x32\x8e\x36\xce\xc4\xb6\xe0\x4d\x56\xde\x93\x7b\x5a\x7b\x49\x77\xcd\x93\x64\xc8\x73\x7e\xcf\x65\x1c\xeb\xde\x44\xcc\x03\xa0\xfa\x10\xec\x0a\xf5\x57\x0c\xd9\xb9\x79\x34\x06\x92\x5d\x55\x03\xdf\xe5\xc7\x28\x70\xef\x94\x0e\x9b\x5f\x4a\x9f\x5a\xab\x15\xbb\x3d\xd4\xb9\x2e\x7b\x9e\x97\x78\xcf\x23\x92\x88\x3d\xd2\xf1\x88\xbb\xc0\x7c\x8a\x0b\xca\x80\x10\x08\xf1\x5e\xf0\xa8\xe4\xfd\x37\xfa\xbb\xfd\x0c\xc2\x86\xad\x2a\x51\xd3\x7a\x4d\x72\x7d\x1e\x5f\x9b\x28\x06\xad\xa7\x81\x87\xa1\xf0\xd1\xa9\x7c\xdc\x19\x95\x04\x7a\x92\xf3\x7a\xdb\xfc\xfd\x15\xcb\x79\xbb\x8a\x8d\x8e\xfc\xe6\xf2\x5a\x19\x50\x00\x14\xd1\x21\x6a\xd2\xec\xce\x87\xb8\x0a\x42\xcd\x90\x21\x1b\x9a\x53\x9a\xf4\xdd\x77\x03\xe8\x54\xf0\x40\xe1\x3e\x4d\xe4\xec\xc8\x1f\x71\xd3\x62\xb0\x3d\x4e\xe0\xa5\xd4\x21\x7d\x9d\x0d\xf4\x42\x7f\xf1\x25\x11\x35\x79\x0f\xb6\x21\x31\x83\x76\x7f\x13\x44\x22\xeb\xc9\xf8\xff\x31\x60\x7e\x8e\x46\xad\x12\x0d\x2d\x2c\xdb\x38\x29\x44\x46\x8b\x6e\xc6\x7a\x56\x25\x30\x57\xdd\xf2\x37\xb7\x91\x6a\xc6\x54\x7b\xd0\x3e\x43\xb0\xa3\x90\x78\xbb\xc5\x33\x60\x73\x50\x52\xd1\xe6\x7a\xe4\x9a\x59\xfa\xe4\xb0\xa3\xb7\xc0\x98\x01\xa8\xd2\xea\x6d\xb3\xb2\xba\x26\x3c\xa8\x15\xe6\x0b\xbb\xe1\x52\x31\x44\xde\xfd\x03\x08\x00\x4b\x9a\x71\x74\x0e\x80\x81\x6a\x7a\xe3\xbe\xcb\x16\x9c\x3b\xdd\x32\xed\xbc\x88\x05\xdc\xd2\x74\x46\x5f\x76\x50\x86\xbe\x15\x35\x58\xf3\x25\x2f\xfa\x8b\xde\x20\xd3\x75\x03\xdc\x96\xfa\x2e\x3f\x61\x9d\x8e\x2f\xd3\x56\xb2\x7a\x76\xdb\xf2\x7c\xaf\x0b\x34\xa0\x6d\x17\x59\x84\x9e\x7d\x7b\xde\x57\xb0\x6f\xf9\x4d\xcd\xc8\xf9\x92\x96\x25\x2b\x1c\x93\x39\x00\x4b\x9c\x0a\x28\xbb\x10\x8a\x01\x04\xc5\x3d\x20\x3d\x7c\x1b\x55\x50\xcf\x09\x6d\xf3\x8d\xc0\x03\x16\x6d\x34\x30\xa0\x8d\x98\xbc\x3d\x27\x0d\xad\x6f\x59\xa3\x5e\x27\x65\xbb\xba\x61\x9e\xdd\xf4\x7c\x50\x76\xcf\x5f\xd8\xb5\x5b\x05\x16\x0e\xf2\x6f\xbf\x7d\x88\x46\x7c\x18\x9b\xa3\x07\x51\x17\xf9\x03\xcf\x31\x45\x47\x92\x17\x4a\xe0\xcb\xe7\x07\x61\x78\x78\xe0\x53\x80\xfa\x81\x8e\xe9\xc0\x18\x74\x8c\x40\xcf\x74\xb9\x10\x57\x16\xe9\x05\x08\x9e\xc2\x80\x57\xcf\x1b\x0e\xc1\x28\xf8\x9e\xf2\x89\x5c\x7e\x07\x75\x18\xeb\x86\x1d\x54\xa7\x5a\xe3\x3a\xc8\xe7\x91\x09\x28\xf8\x37\xad\x0e\xd1\x88\x66\x49\x24\x5f\xb5\x45\x43\x4b\x26\x5a\x59\xac\x3d\x4b\xe1\x69\x06\x3c\x64\xb3\x0a\xf6\x05\x97\x6e\x8c\xed\xea\xbe\xdc\xb7\x61\x00\xac\xcc\x33\x33\x41\x3d\x23\x36\x75\xdb\x24\x31\x97\x49\x02\x8b\xda\x69\x57\x17\x8c\xfc\x2e\x90\xed\xc6\x32\x72\x43\x95\xdd\xaa\x8a\xf6\x96\x4f\x44\xad\x9f\x2c\xb7\xcd\xe6\xed\x28\x4f\x3d\xc2\xa1\x0c\xa5\x30\xfc\x81\x81\xe4\x3e\x8d\x66\x95\x91\x9c\x55\xac\xcc\x01\x2a\xdc\xae\x34\xdf\xde\x83\xce\xef\x34\xc2\x3a\x0a\xfe\x9c\x09\x1e\x8e\x8e\x7b\xf3\xa5\xa9\xa9\x52\x4b\x2b\xa5\x80\x4c\x84\x9e\x2f\x08\x2d\x7d\x8a\x64\xff\xa9\x3a\xdf\xbc\x09\x7d\x34\x60\x92\xc7\x4a\x1a\x44\x1d\x17\x5c\xec\x26\xb5\x6f\x32\x85\xcf\xfc\xbe\x5b\x67\xe5\x45\xe1\x8e\x4f\xe5\x73\x13\xf6\xbc\x16\x51\x7d\x4b\x8e\xa4\x19\x61\x1f\xbb\x9e\x1c\xca\xb8\xbf\xca\xbc\xbe\xc7\xcb\xb9\x5a\x14\x22\xbb\x8b\x42\x12\x79\x8b\xdf\x1c\x9c\x94\xf5\x87\x43\x28\x11\x75\x06\x9e\xe8\xee\xf8\xc9\x58\xef\x21\xc7\xdc\x40\x4a\x81\x16\xaf\x16\x7f\x2d\xa6\x56\xb8\xd4\x60\x8b\x9a\x86\xb8\x2d\x27\x31\x0d\x22\x3c\x13\xda\x50\x99\x04\x2a\x38\x44\xd4\x95\xac\xc1\x7c\x40\x00\x28\x5b\xb1\x86\x02\x9c\xe8\xec\xef\xa1\x6b\x47\xdd\x67\x23\x43\xb9\x33\xa6\xff\x96\x31\x28\x13\xa5\xe4\x39\xd3\xd2\x73\x35\x17\x80\x85\xba\x8b\xc1\xd5\xbf\xf8\xf9\x73\x34\x4a\x80\xfa\xea\xa0\xcf\x96\xd4\xa7\x45\x2c\x6d\x7b\x0e\xf0\xf5\x79\xe1\x2c\x22\x2d\xe9\xd1\x62\x41\xb7\x19\xb3\x44\x92\x91\x10\xd5\x47\xbf\x9c\xbf\xe9\xbf\xd4\xdf\x00\xbf\x9c\xbf\xf9\x8f\x20\xda\xb8\xcd\x98\x85\x3c\xcf\xb9\xbc\x3b\xb0\x6c\xfc\x01\x58\x36\x36\x66\xfd\x5b\x8f\xa1\x1d\x28\x36\xbe\x62\x8a\x8d\x27\xd2\x51\x64\xaf\x81\xce\x2a\x4f\xf0\x05\x0c\x8f\x84\x1b\xa4\xb8\xba\x70\xc9\x23\x94\xc1\x38\x01\xf8\x52\xbf\x3e\xeb\x81\xee\x18\x40\x7c\x78\xf7\xe9\x06\xf1\x11\xf0\xbd\x7a\x38\xd2\xa1\xf3\xa7\x67\x84\x36\x50\xbb\x36\x8e\xc4\x4f\x3f\x50\xbb\x00\x9b\xe3\x2a\xdb\xca\xa9\xe1\xcd\x35\xab\x26\x2c\xc3\xc0\x95\xc1\xaf\x0e\xe2\x84\x9a\x9c\x5e\x72\xc8\x23\x40\xaa\xd7\x8e\xb3\x75\x72\xda\x31\x4a\x78\x42\x2e\xde\x5c\x5d\xbf\x39\x3f\xfb\xf4\xe6\xe2\x15\x31\xf2\xb9\xeb\x98\x9e\x90\x4f\xc2\x86\x15\x27\x4f\x05\x96\x4f\x0d\xf2\x21\x6d\xbb\x8e\xb5\xda\xa4\xa5\xbd\x8b\x05\x50\x14\x5a\x92\xcb\x92\x37\x5d\xd6\x92\xcf\xf1\xca\x0a\x51\x76\xc4\xfe\x95\xd0\x11\xcd\x5b\xde\x1c\xa3\x9b\xa5\x51\xd7\x97\xac\xff\x1b\x93\x22\x19\xb9\xc2\x5c\x8a\xae\xd9\x13\x27\xe7\x88\x03\x87\xc9\x47\x88\x65\xcb\xc0\x9b\x04\x9b\xf9\x01\x56\xc4\xa6\x24\x9a\x1c\x43\x83\x6f\xe2\xd9\x44\x16\xf9\x04\x62\x0e\x47\x27\x47\xc6\x35\x2a\x3a\xdc\x1a\x93\xf8\xda\xfd\x9c\xda\xb3\x3e\xa7\x09\xb7\x72\x7f\x55\x9d\x10\xf2\xd1\x50\x9c\x1e\x2b\xef\x66\x00\x8e\xe3\x29\xb4\x31\x2d\xb5\x37\xdd\x23\xf2\x8d\xdd\x96\xed\x8d\xdb\x50\x7f\xaa\x0f\x48\xb9\x67\x65\xc0\x0c\x47\x29\x41\xd3\x90\xc8\x39\xbc\xb6\x2d\xff\x7c\xfd\x6e\xb7\x9f\xc6\x7d\x15\xf9\xc3\xe7\x62\xb5\xe2\x0d\x59\x52\xb9\xec\xca\xfa\x6c\x36\x42\xb7\xab\xb7\x6f\x51\x48\xcf\xd9\xa1\xda\x4a\xd7\x61\xc1\x78\x14\x6e\xfc\xd1\x2f\xe6\xcb\x83\x03\x5b\xf7\xf1\x06\x7a\xbc\x4f\x83\xf4\xd0\xe3\x43\x49\x54\x53\x50\xb3\x5d\xfb\x77\xc7\x3e\x65\x65\x8e\xc8\x8e\xd1\x84\x2c\xe6\x85\x0f\x0e\xbe\x95\x91\x82\x0e\x0b\x74\x34\x67\x0d\xe5\x85\xcf\xe1\xb3\x23\xd8\x88\x4a\x14\xe2\x36\x0d\xcf\x79\x64\x10\xbe\xc7\xcc\xea\x19\x9d\xa9\xd1\xdd\xcd\xff\x8f\x47\x93\x37\x09\xe2\x6a\x20\x6c\x9f\x3a\x4f\x18\xf2\xb2\x53\x0e\x5e\xcf\xd2\xe1\xbd\x3a\x60\xc3\x51\xf0\xbb\xa8\x37\x16\x7a\x1f\x2c\x89\xad\x1f\xae\x58\xbd\xe2\x52\xa9\x92\x51\xcf\xcc\x23\xf6\x09\xd7\xd1\x2e\xee\x5a\xb7\xfb\xa6\xdc\xb9\xa9\x34\xd3\x80\x82\x53\x5a\x68\xba\x34\x69\x93\x68\x0c\x96\x70\x4f\xbd\x55\x35\x9b\xb1\x2f\x5c\x42\xac\x02\x6a\x17\x44\x6d\xad\xf7\xd4\x8d\x9b\xc3\xa0\x61\x42\x50\x26\x60\x85\xef\x16\xeb\x61\xc6\x92\xf5\x7c\x26\x84\x9a\x70\x20\x32\xfc\x16\xc5\x1a\x01\x45\xa1\x1a\x19\x03\x04\xf4\x16\x1a\x2d\x6a\x1d\x6e\xaf\x6a\x7e\xcf\x0b\x36\x4d\xb3\xd4\x2c\x79\x79\xeb\x90\x07\x03\xd5\x31\xd3\x65\x58\x6c\xa3\x0f\x6a\xff\xca\xc6\xc9\x90\x9b\x10\x0b\xbb\xe0\xc3\xc7\x4f\xa4\x64\x4a\xd8\x92\xcb\x9d\x0f\x0f\xaa\x19\x9e\x5c\xe3\xd9\x6c\x06\xf1\x94\x17\xff\x56\x7e\x69\x5e\xbc\x24\xbf\x31\xfd\xeb\xca\x3d\x57\x3b\x3e\x6b\xc8\xc3\x52\xc0\x89\xba\x95\xba\x5f\xa1\x79\x5c\x21\xad\x23\x2d\x73\xf3\xee\xa9\x7a\x5f\xb9\x85\x68\xec\x7a\x52\xa0\xea\x5f\x12\x7b\x73\xb8\xb5\x0f\x9b\xac\x75\x4d\xe8\xb8\x73\xd6\x9c\x15\xd8\x41\x59\x04\x72\xb5\xa1\xd2\x55\xae\x57\x05\x2f\xef\x80\x20\x5e\x2b\x33\xb5\x26\x74\x0a\x63\x79\x67\x56\x6b\xcd\x68\x81\x3a\x3d\x4d\xf9\x6c\x33\xe7\x3b\xe9\xf3\x26\x21\x78\xfa\x69\x5d\x61\xd6\x43\xa7\x0a\x74\x22\x88\xab\x72\xbf\xfb\x2e\x0d\xd1\xfa\x89\x7b\x1c\x3c\x18\x6f\xa9\x49\xb9\x8c\x43\x88\x3a\xba\x9c\x9f\xcf\x2f\x07\x44\x5e\xf8\x59\x2f\xac\x6f\xf4\xe1\x44\x4f\xb7\x0b\xeb\xfb\x61\x81\xa6\xc2\xfa\x53\x06\x11\xba\xbc\xbb\x67\x99\x2d\x69\x75\xd6\x36\xcb\x0b\x2e\x33\x71\xcf\xa2\x0f\x35\x06\x36\x4c\x87\xd6\x09\x37\x83\x88\x52\xc8\xf9\x7f\x9f\x5d\xc5\x72\x88\xc4\xa4\x13\x98\x76\xce\x99\x4c\x38\x01\x8d\xb7\x52\xcb\xd8\x7b\x1b\x0f\x97\x21\xdf\xd0\x65\x08\xec\x9f\x6f\xfd\x02\x84\x97\xbc\xe1\xb4\x11\x81\x1a\xc0\x7e\x54\xa0\x95\x8d\x58\xe9\xad\x70\x69\x04\xc0\xc5\x36\x18\xe3\x9e\x4c\xbf\x45\x76\x70\x84\x39\x9c\xae\x32\xc9\x3b\xb4\xbd\x41\x1a\xe6\x31\x29\xd9\x03\xfe\xaa\xd7\x3a\x99\xb7\xff\xa6\x93\x68\xd5\x5a\xa5\xc5\xdf\x5f\xfd\xcd\xb9\x46\xf9\x7b\x57\x8e\xad\x8b\x74\x3d\x12\x2d\x74\x1d\xf0\x18\xec\x16\xf0\x20\x84\xff\x1e\xab\x7b\x74\xe8\x0e\xc7\xf9\x9f\x2d\x2d\x70\xa4\x3e\xec\x1a\x7f\xea\x8f\x72\x64\x63\xcc\x6c\x9b\xd1\xfd\xd0\x45\x00\x5a\xc9\xc0\x0a\xe2\x37\x9a\x9a\x96\x52\x0d\x79\x2c\xf0\xd3\x91\xbe\xf4\x3a\x22\x2f\x9a\xac\x0a\xa2\x3e\xed\x29\x25\x1e\x1b\xab\x47\xf8\x5d\x97\x0a\x3f\xfd\xeb\x7b\xbc\x21\x82\xf5\x18\x1b\x88\xe9\x35\xf4\x0a\x5e\x25\xef\xb8\x6c\x30\x03\x13\x65\x01\x51\x16\x24\x46\xfb\x6e\xf2\x4a\x72\x79\x05\xb0\x9c\xd5\xbf\x68\x9e\xd7\xaf\xd0\x9e\x19\x30\x92\x1a\x4e\x6f\xa2\x23\xc3\x8b\x60\x4f\x7a\xd1\xac\x2b\x9e\xc1\x51\xed\xd3\xf9\x15\xc8\x90\xe4\xaf\x3f\x23\x7a\xc2\x7f\xfd\xf9\xe7\x1f\x3c\x93\xf9\x54\x99\xea\x89\xf1\x8e\x27\xbc\x6f\xda\xc9\x51\x48\xcd\x8d\x04\x47\x65\x6e\x79\xd6\xf4\x5e\xc5\x55\xa5\xa6\xab\xd3\xd9\xb1\xee\xcc\x21\xbf\xef\x59\x71\xfb\x70\xea\x50\x1f\x6c\xaf\x49\x50\x89\x5c\x0d\x94\x08\xf1\x52\x61\x6e\xa3\x44\x1c\x55\xe1\x73\x98\x52\x95\xc8\xce\xa7\x45\xfe\xfb\x78\x4f\x67\xca\x92\x4c\xfc\xc5\x1d\xf9\x6d\x4e\x9a\xd3\x5b\xa2\xbf\x15\x50\x7f\xa8\x33\xa1\x73\x63\x07\x15\x00\x17\x1f\xe6\xff\x7a\x77\xf6\xfa\xcd\x3b\xcd\xe9\x00\x29\x04\x08\xaf\xe6\xb9\x81\xdc\x26\xeb\x2b\x7e\x27\x8d\xaf\xfa\xc0\x04\x95\x71\x37\x33\x1f\x06\x7c\xbe\x25\xf9\x30\x49\xe6\x9b\x58\xd3\xbe\x6b\x0c\xa7\x5c\x4c\xf4\xfc\x11\x82\x60\x26\xc2\xca\xbe\xf4\xab\x3a\xd4\x60\x48\x56\x03\xf2\xe3\xa3\x85\x6e\x26\x3b\x4a\x9e\xe1\xde\x41\xf5\x18\x47\x01\x8f\x7e\x9e\x1e\x6f\x77\xe3\xf0\xac\xe3\x18\xb2\xfc\x75\x7c\x29\xd4\xd1\x1c\xbe\x6d\x6e\xad\xd4\x2e\xc1\x54\xa3\x5a\xa9\x71\xa5\xc0\x99\x94\x61\x10\x93\xe1\x0a\x7b\xb6\x75\xb4\x75\xf4\x6f\xa6\xdb\xbf\x8d\xc2\xb6\x59\x3d\xa8\x92\xcf\x0b\xca\x27\x50\x28\x06\xbb\x76\xec\x45\xfc\xdf\x39\x06\x09\x7b\x57\x31\x5d\x9d\xca\x94\x12\x17\x84\x92\x51\x99\x5d\x3e\x03\xd5\xc7\x5b\xc0\x03\x8c\x08\x7d\xa4\xcc\xa0\x1d\x86\x99\x99\x4c\xfb\x11\x7e\x92\xa9\xc6\x6c\xad\x10\xe1\xed\x94\xe4\xb9\x73\xf3\xc2\xb0\xd6\x6f\x62\x98\xfc\xfe\xfa\xe6\x00\x1a\xc2\xf0\x4a\x98\x9a\xc6\x1e\xd4\xfd\xde\x75\xc4\x8e\x23\x4c\x1e\x45\x13\xff\x96\x58\xf3\x15\x3e\xf5\xef\x7e\xfe\x09\xa9\x81\x6e\x25\x6d\xb5\xdd\x97\xa2\x11\x65\x72\xe2\xff\xd5\xc8\x6b\xfd\xfd\x8d\xdf\x38\xc7\xd2\x94\x62\x3a\x3c\xd0\x89\xc0\x3c\xce\x31\xba\xdd\x49\x62\xdd\x2d\xb7\xde\x7f\x6a\x91\xea\xde\x20\x21\x62\x52\x49\xf2\xe8\x72\x98\xcb\x0b\xed\xcc\x99\x92\x17\xa9\x17\x07\xb1\xab\xc3\x59\x07\x9e\xfe\x7a\x73\xf0\x77\x37\xa7\xf9\x76\xac\x97\x6a\x42\x1f\x44\x1d\x5f\x94\x7e\xd5\x7b\x61\x90\xa1\xa0\xff\x36\xac\x19\x9b\x72\xf1\xbf\x96\x5d\x32\x87\xeb\x56\xa7\x2b\x63\xb7\x29\x66\xef\x78\xa6\x78\x6c\x53\x45\x6d\x1d\x8f\xcc\x91\x4d\x85\x5b\x27\xbc\x65\x7c\x16\x6f\x7f\x9b\x29\xd1\x48\xc5\x16\x38\x87\x00\x94\x52\x0b\x9c\x77\xf2\xe4\x13\x99\x76\x7f\xd5\x5f\xd7\x07\x7e\x35\x3f\x56\x7d\xd0\x6e\x0b\x85\x52\xb1\x9e\x95\x0e\xb7\x63\xb0\x8c\xd0\x09\x88\x4f\xbe\x10\x35\xc0\x56\x71\x2c\x5f\xb6\x90\x9c\xba\x44\xf9\x58\x93\x4f\xac\x68\x35\x09\x36\xa9\x54\x82\x0b\x6d\xbe\xe5\xf6\x4f\x47\xe8\x7f\x1f\x82\xe5\x77\xc1\xf7\xa3\x54\x80\x07\x96\x7f\x14\x6a\xdf\x23\x74\x0a\x84\x3f\x00\xb5\xef\x91\x98\x0a\x51\xec\x40\x10\x7b\xa4\x46\x83\x13\x5b\xf0\xe1\x27\xb8\xc4\xd1\xcb\x30\x72\x21\x18\x80\x7d\x93\x2c\x8a\xdb\xc0\xcb\x4e\x90\x06\xad\x7f\xd5\x49\xc4\x91\xd6\xd8\x02\x96\xdf\x96\x16\xa2\xbc\x0d\xa3\xf9\x0a\x37\xd9\x81\xe5\x5d\x2e\xc1\xba\xf2\x06\xcb\x63\x51\x67\x03\x74\xd8\x13\x9d\x73\x21\x17\x2c\x43\x87\xe5\xc5\x86\x7a\x69\x6f\xb9\x5d\xd7\xca\x20\x1a\x79\x1a\x82\x6e\x70\x92\x46\xfb\x13\xc1\x74\x1c\x21\x92\xb8\x6c\xc8\x61\xce\xe3\x28\x89\xe3\xbc\xc8\x6e\x56\xc9\x80\xfd\x38\x4a\xaa\x9f\x21\x19\xa5\x8f\xf0\x20\x47\xc9\x6e\x42\x5c\xc9\x23\x8c\xc8\x51\x82\x63\x58\x93\x3b\x6e\xe4\x28\x89\x49\xfc\xc9\xd1\x9d\x4f\x62\x52\x8e\x5b\x56\x0e\xdb\x72\x90\x53\x39\x4a\xe2\x04\xef\xf2\x14\xbb\x72\x94\xcc\x18\x2e\x53\x92\xb2\x45\x93\x59\x99\xa3\x64\x92\x28\xee\x66\xfb\xa4\x68\x1f\x7c\x22\xf8\x9c\xed\xb3\x23\xb3\xb3\x7d\x92\x80\xa8\xf1\x89\x21\x7a\x98\x68\xa9\x9f\xf2\x21\x5a\x26\x71\xc8\x21\xfc\xe4\x0f\x09\x22\x27\x68\x22\x26\x68\x20\x12\x04\x7b\x08\x23\x5c\x42\x88\x24\x89\xfb\xa1\x8e\xb0\x4f\x34\x89\x44\x82\xcc\x34\xf2\xa4\xe1\x93\x42\x2c\x61\x9f\x78\x8a\x09\xfb\xc4\x90\x4d\xd8\x27\x9e\x7b\x3a\x65\x39\x77\x2c\xd5\x01\x16\xea\x04\x99\xa3\x7c\xd5\x96\xb6\xab\xc7\x47\x9d\x20\xd6\xcb\x5c\x9d\x28\x2d\x59\xf9\xc4\x82\xcc\xe3\x13\xe2\xad\x76\xbf\x19\x28\x3a\xb0\x4f\x34\x1f\x8e\xfb\x75\x5f\x66\x93\x7d\xc2\x49\x36\xf8\x7c\xcd\xa9\x36\xf8\xa4\x26\xdc\x44\x09\x0d\x27\xe5\xe0\x93\xb4\xaa\xc2\x5c\xd9\xf6\x49\x66\xcd\x8e\xea\x56\xc7\xac\x1d\xc3\x9f\x3d\xec\xa5\x3f\x32\xd5\xff\x6e\xc4\x9a\x0d\x32\x31\x3a\x5f\x0d\x9f\xec\x1c\x69\x70\xb6\x0b\xf6\xca\x3a\x30\xcf\x7f\xb6\xdb\x64\xd5\xdb\xa0\xbd\x8b\x9a\xde\x48\x4b\xb0\xad\x7b\x1b\xe2\xe2\x8b\xd4\xc5\x03\x34\x44\x3f\x2b\x5f\xac\x5d\x8d\xe0\xee\x73\xbe\x9d\xec\x30\xc7\xf2\xf9\xd9\x27\x9e\xd9\x2f\xc9\x15\x45\x0e\xc0\x00\xc7\x5f\x82\xc4\x5d\xd8\x00\xed\x93\x3e\xa0\x24\x99\x21\xd0\x3e\x71\x5c\x81\x49\x22\x89\x65\x16\x0c\xb2\x06\x26\x0a\x4e\xe0\x18\x74\x5e\x4a\x3f\x2a\x91\x54\xde\x41\xfb\xc4\x32\x10\x26\xf6\xdc\x24\x48\x6c\xcb\x45\x68\x9f\xad\x86\x23\xcd\x81\x23\x49\x4c\x85\xc3\xa6\x45\xfb\x68\xe4\x70\xa8\x3d\x1c\x6a\x23\x9f\x3f\xc0\xa1\x36\xc4\xa5\x98\x78\x06\xed\x81\xa2\x4d\xb1\x2a\x26\xc8\xdc\xe4\x5f\x9c\xe4\x57\x4c\x39\xd6\x4e\x32\x31\xf6\x99\x16\x13\x1d\x83\x20\x27\x63\x24\xe7\xa2\x23\x35\x5d\xed\xa6\xf2\x30\xda\x27\x9d\x91\x31\x65\x2b\x29\x7f\x29\x9e\x9b\x31\x41\x72\x9f\xc5\x31\xcc\xd2\x98\xe2\x1f\x6d\xc9\xe7\x68\x9f\xed\xfc\xb2\x64\x8e\x47\xfb\xc4\xb1\x3d\x26\xfa\x11\x2e\x37\xe4\xf6\xbc\x8f\xf6\xd9\xd2\xb9\x4a\xe0\x82\x74\x5e\x8a\x64\x85\x4c\x1c\x12\xbd\x17\xfc\xfc\x90\x89\x32\xe3\xd8\x24\xed\xb3\xe5\x30\xa6\x30\x4c\xda\x67\xbf\x5c\x93\x3b\x76\x62\x1b\xcf\x32\x92\x89\x72\xd8\xb2\x04\xc7\x32\x35\x60\xf9\xfc\x61\xc8\x68\xc1\x98\xb8\xb3\x87\x30\x91\xe6\x3b\xd0\xb7\xff\x5f\x4f\x04\xe8\x09\x6f\xf7\x75\x45\x67\x00\x63\xd1\x3e\x29\x57\xfb\xf1\xd1\x87\xc3\xd5\xfe\xe3\x5c\xed\xcf\x35\x57\xc7\xe1\x5e\x7f\xb4\x37\x87\x7b\x7d\xfb\x1c\xee\xf5\x0f\x21\x90\x43\x08\x64\xf3\x39\xdc\xeb\xf7\xba\x75\xb8\xd7\x3f\xdc\xeb\x1f\xee\xf5\x7d\xcf\x5e\xef\xf5\xb5\x7b\x8e\x97\xfa\xd1\x8b\xef\x2b\xb9\xd3\xd7\x2c\x59\x67\x59\x26\xda\xb2\xf9\x24\xee\x58\xf0\x6a\x2f\xea\xd0\xb6\x21\x35\xd8\xc1\xc7\x3b\xe1\xd1\x36\xe7\xea\x24\x95\x3c\xdb\x67\xfa\x45\x73\xc8\x51\x16\xa6\xcc\x59\xde\x49\x8c\x0d\xf9\xaa\x97\x1b\x35\x0a\x27\xe4\x8c\xd4\x2c\xe3\x15\x67\x48\x83\x4f\xf1\x73\x5c\x0e\x86\xde\x23\xd2\xd1\x97\xac\x58\x68\x62\x84\xd2\x21\xd6\x72\xce\x26\x5a\xf5\x9b\xe6\x46\xc9\xd5\x4a\x05\x9a\x85\xee\x80\x30\x28\xfd\x86\x71\xac\x66\xff\xd6\x1e\x47\x5c\xef\xb1\xe7\x9f\x9c\x96\xb8\x41\x2f\x1c\xda\x18\x5e\xb0\x8d\x46\xd2\x8a\x6b\xc4\x82\x7d\x6b\x08\xf6\xa5\xe2\x35\x2c\xeb\x39\xcb\x44\xe9\xe3\x41\xb6\x4f\x6f\xf1\xbc\x19\x4a\x30\xab\x48\xc7\x97\x23\x8f\xb1\x79\x5b\x77\xbc\xc7\xf7\xb4\xe0\x39\x6f\xd6\xdd\xd5\xb9\xa6\xb8\xa3\xb8\xcf\xf4\x40\x47\x89\x3d\x93\x76\x96\x09\xad\xaa\x5a\xd0\x6c\xc9\xa4\xd3\x6f\xf4\x81\x75\x65\x65\x94\x4c\x53\xf7\x82\xe4\x91\xe0\x00\x83\x5c\xe5\x27\x15\x6b\x52\x8b\xc6\xa4\x8d\xe8\x86\xc7\x1d\x3f\x7b\x9d\xc3\x63\x0f\x36\x0a\x7f\x02\x5d\x92\xa6\x5e\x43\xfe\x49\x5c\x08\xd5\x69\x0a\x8e\x00\x5f\xb8\xff\x90\x44\x14\xb9\x01\x37\xfa\xeb\x0f\x71\x47\x3f\x56\x67\x7a\x4f\xc3\xf1\x86\xaf\x20\xc2\x59\x28\x1f\x51\x99\x86\xfe\x0f\xc4\x2d\x72\xdb\x88\x3f\xff\x44\x96\xa2\xad\xe5\x89\x5b\x03\xf9\x23\x7c\x86\xe7\xf3\xd8\x5b\x32\xe5\x58\x36\xa4\x60\x54\x36\xe4\xc7\x1f\xc8\x8a\x97\xad\x72\x0d\x22\xde\x75\x5c\xf3\x9f\x7f\x8a\xde\x6e\xb1\x4e\x79\xac\x3b\xbe\x99\xf8\xa0\x77\x55\x85\xa0\xe7\xda\x2b\xd7\x5a\x25\x54\x75\xeb\xfc\x3e\x10\x1e\x0c\xee\x21\xb5\x29\x72\x67\xae\x6c\xc4\x9e\x75\x4d\xac\x77\x1b\xe5\xad\x46\xda\xfd\xa8\xaf\x85\x9c\xd8\x50\x09\xa9\xbe\xe0\x18\xfd\x6b\xa0\x01\xbf\xb7\xe2\x66\xdd\xc4\xd4\x94\xff\x13\xbf\xd9\x2f\x26\x37\x1f\x8e\x83\x47\x4d\x74\xb8\xc7\xe5\x61\xb1\xa3\x46\xbf\x1d\xf6\x3e\x6e\xd5\x69\x3a\xb2\x6e\x10\x4e\xde\xe6\x34\x68\xc2\xb4\x59\xc6\x90\x73\xf8\xc2\xb2\xc5\x95\x02\xe5\x06\xa6\x6c\x9f\x35\xd7\x5e\x84\x26\x33\xce\xa6\x7e\xd0\xa7\x7c\xf7\xcf\x0b\x11\xe3\x0f\xd7\xec\x96\xcb\x26\x81\x82\x07\xbf\xde\x5f\x4e\x92\x97\xb7\x48\x99\xb0\x6a\x8b\x86\x57\x45\xd7\x73\x4f\x7f\x3b\x51\xda\xd6\xb9\x21\x63\xea\xc4\x26\x29\x82\x16\x20\xc4\x5e\xe0\xda\xe0\x45\xf7\xfb\xac\x6c\x10\xa9\xbf\x56\xc6\xb4\xa2\x35\xed\x06\x16\x48\xc9\xe5\x4b\x1d\x97\xa6\x99\x37\xfd\x4d\x63\xdf\x28\xcb\x55\xd3\xa2\x1b\x2e\xf7\x02\x77\x97\xc5\xd6\xb0\x92\x96\x9e\x5b\xa0\x7e\x58\x05\xbe\x4c\xc4\x83\xc9\x24\xd5\x4c\x4c\x83\x55\x16\x2c\x79\x7e\x4d\xb3\x3b\x56\xe6\x40\xa7\x87\x43\x92\xaf\x4b\xba\xd2\x18\xa6\x1d\xe9\x18\xcb\x07\x92\x27\x2b\xcb\xd5\x83\x51\x46\x2c\x99\x36\x40\x0c\x01\x26\xf0\x88\xf1\x69\x65\x34\xc8\xd7\x67\xa9\x7c\x01\xbf\x8e\x90\x78\xa7\x5a\xf3\xfb\x8c\x69\xb7\xc9\xd3\x25\xf5\xe3\xbb\x34\xfe\xde\x83\xfb\xb1\xd1\x7c\x8d\xf9\xc1\x9d\x95\x0f\xc1\xcb\xee\x9a\x0b\x10\xff\x68\xa1\xd4\x82\xef\xfc\x63\x0a\xeb\x07\x8b\xe2\x66\xbd\x2b\x61\x57\x98\xa3\x0a\xb7\xc6\xc4\x9f\x3d\x78\x0c\x01\x5b\x57\xdf\xc4\xe0\x24\x1c\x5d\xbf\xbe\xe8\x6b\xa5\x6b\x9a\x0b\x49\x5e\x17\x22\xbb\x23\x17\x0c\xce\x01\xae\xbd\x9b\x18\x89\x21\x84\xe2\x8e\xdc\x55\xf5\x4d\xbe\x3b\xb7\xc0\x01\x0f\xff\x1b\xc2\xc3\xaf\x6f\x7c\x03\xf0\x6d\xa0\xe1\xaf\xe8\x6d\x3c\x9d\x8a\x3a\xb1\xc3\x56\x83\xd7\x0c\x4c\xeb\x96\x5b\xe4\xfb\xa5\x78\x98\x35\x62\xd6\x4a\x36\xe3\x9e\xc4\x97\x88\x5e\xdc\xb1\xb5\xfa\x6b\x6c\x3f\xfe\x81\x5f\xef\x1d\x97\x1a\x01\x17\x0f\xf0\xb9\xb2\xf8\xd7\xaf\x2f\x94\x99\x89\x41\x77\xe3\x92\x9c\xb2\x26\x3b\xcd\x58\xb5\x3c\xd5\x4d\xf9\x2a\x86\x65\x25\x4a\xde\x88\x3a\x9a\x01\xef\x8c\x64\xa2\x28\x34\xaa\x86\x58\x90\x73\x56\x2d\x3b\x21\x8f\xdf\xa3\xa7\x42\x48\xaf\x84\x88\x45\x90\x76\x96\xbc\x7a\x4b\xaf\x78\x67\xe2\xeb\x9b\x54\x05\xf3\xd4\x8b\xe0\x1b\x23\x20\x7e\x84\xe1\xd9\x2f\xb0\xfc\xd1\xdc\xbc\x00\xc7\x50\xe7\xee\xa9\x8f\x23\xaf\x05\x7b\x46\xc8\x55\x33\xe4\x72\x81\xee\x78\xce\x72\x22\xee\x59\x5d\xf3\x9c\x49\xd2\x69\x13\xf7\xe4\xcb\x8b\x3d\x11\x04\x6e\x35\xa6\x07\x18\xfc\x67\x85\xc1\x4f\x38\x26\x39\xca\x4b\xbd\xb5\xa9\xbc\x68\xbe\xe2\x65\x22\xac\xeb\xd3\xaa\xaf\x20\x9c\xbd\xf2\x43\x26\xfe\x66\x0c\xd7\x36\x07\x11\x99\xd1\x82\x5d\x7e\x8c\x38\x8c\xcc\xf1\x9b\xfd\xf3\x88\xf9\xd0\x41\x36\xdd\x0a\xcb\xf1\x1f\xdd\x62\x27\xa5\xc8\xa7\x62\xd3\x7f\x5c\xb4\x53\x67\x2d\x23\x98\xe3\x2e\x86\xf2\x96\x36\xec\x81\x46\xb3\x8c\x9b\xae\xf4\x31\xc5\xbb\xa9\x3f\xbb\xba\x24\xbf\xa0\xc4\xdd\x40\x56\x6b\xd1\xa0\x47\x76\x21\x56\x94\x47\x33\x29\x39\xe0\xd0\x6e\xb3\xae\x3a\x71\x04\xe5\x29\x2b\x14\x38\x67\x20\xee\x58\xab\xce\x59\xfa\x04\x74\x40\xba\xdc\xb3\x53\x61\x7d\x0a\x27\x08\x64\x52\x7d\x2d\x89\x8d\x9e\xc5\x40\x20\xcb\x5e\x54\x13\xc9\x4a\xc9\xe1\x16\xc8\x49\x4e\xd0\xfc\xa1\x48\x3e\x8b\x99\xba\xe8\x78\xf8\x76\xde\x3b\x71\xcb\x4b\xb3\x6f\x85\xbe\xd2\x5c\x50\x9f\x2f\x72\xf0\x14\x9e\xd5\x53\x90\xb2\x78\x53\xd2\x9b\xc2\x77\x9d\xd6\x57\xfc\x05\xbd\x55\x8b\x8e\xc1\x5b\xa7\x39\x97\xea\xbf\x64\x3e\x7f\x07\x81\xf4\xb6\x34\x9e\x6d\x20\xb5\x59\xab\xbd\xae\x9a\x07\xb7\xed\x6e\xfb\x09\xf5\x4e\x02\x12\xe9\x65\x99\xab\xe6\x32\xd9\xcb\x4f\xd2\x72\x10\x64\xb5\x4b\x31\x87\x4c\x0e\xff\x7d\xcd\xa7\x25\xcf\xee\xae\x9c\x78\xb9\xa8\xd5\x67\xa5\xf3\x51\xcf\x1c\x0d\xff\xb6\x8b\xc2\xd4\x8d\xbe\x8a\x3f\xb6\x7e\x72\x34\xfe\x5c\x77\x59\xbd\x4e\xa8\x94\x22\xe3\xf6\x82\x24\x00\x98\x6a\x8d\x45\x0e\xc6\x62\xb7\x6e\x80\xa5\xdf\xd2\x7e\x99\x89\x33\xc4\xd8\xd2\xb1\x4a\xfe\x43\xa8\x1e\x87\x9d\x9a\x8e\x0b\x25\x81\xa9\xe1\x53\x8f\x9b\xc1\xf8\x7e\x18\xd1\xef\xe2\xf6\x3a\x02\x18\x56\xea\xc6\x1b\xd3\x74\x38\x9b\x93\xd8\x71\x34\xe8\x8b\xe6\x47\x8c\xfd\x6b\x2f\x69\xe2\xaf\x9d\xdd\x9b\xfa\xfb\xb4\xcf\x18\xf2\xc8\x3d\x45\x54\x63\xe7\xf3\xc1\xb5\x25\x7e\xa6\x83\xfd\x90\xb8\x55\x89\xaa\x2d\xe8\xe4\xbd\xe5\x06\xf1\xc5\x0e\x14\x30\xf8\xeb\xdb\x5e\x09\xa4\xa3\x30\xfb\x8b\x0c\xfa\x80\xcc\xfe\x08\xbe\x81\x6a\x8e\x03\x64\x0e\x43\x8c\x34\x82\xfc\xf0\xf3\x4f\x3f\x4d\x81\x37\x4f\x42\x34\x7b\x3d\x54\x1f\x78\xb3\x0f\xa2\xd9\x2b\xd4\x0b\xde\x3c\x55\x22\xe0\xbb\xac\x9b\x06\x6f\x9e\x76\x07\xf6\x87\xde\x1c\x88\xad\xa6\xd6\xf3\xb9\xb5\x7a\xbe\x08\x57\xb8\x8a\x6f\xbc\xbe\xcd\x23\xd3\x53\xbb\xe7\xaf\xcb\xf3\xc9\x1c\xa9\xd8\x8b\xac\xc6\x0b\x9c\x9d\x6c\xa2\xc3\xbe\x6a\xf0\x92\x2a\xef\xdc\xaa\xba\x40\x4b\xfd\xf5\x76\x13\xb5\x74\x1e\x99\xe3\x55\x76\xe1\x0a\x3a\x8f\xc8\x5e\x6d\x5d\xa0\xd2\x22\x0d\x4d\x3c\x5c\x23\x17\x55\xfd\x16\x9b\x89\x1d\x51\xe9\xb6\x63\x7d\x5b\x74\xd2\x5d\x4c\x2d\x5b\x8a\x71\xb1\x75\x69\x01\xa1\xc4\x5f\xb7\x36\x55\x8d\x16\x94\x3a\x5e\xad\xe6\xab\x41\x0b\x8a\xf4\x9b\x91\xed\x2a\xcf\xa2\xeb\xcd\x1c\x93\x11\x14\x1a\x5d\x65\x96\x52\x5b\x16\x9f\xbc\x1a\x93\xb8\x1a\x5f\x3d\xe6\xd4\x84\x05\x3b\xee\xaf\x19\x1b\xaf\x04\x8b\x5a\x49\x9b\x95\x62\xfe\xfa\xaf\xa0\xd0\x98\xfa\xb0\xc8\xcd\x1b\x93\x2d\x1b\xaa\x00\x0b\x66\xd2\xee\x25\x3d\x36\xa6\xca\x28\xbd\xb6\xa8\xb3\x2e\x5e\x2d\xef\x2f\x29\x8a\x0f\xe6\xa5\xf0\xf4\xb9\x31\x2a\x7d\xf4\x30\x0e\x2e\x26\x18\x59\xd0\x42\xaf\x07\xd1\x4e\x5c\x92\xee\xeb\xf0\x41\x62\x16\x5b\xe8\x60\x86\xbf\x27\x62\x88\x6d\x75\x2c\xe2\xe3\x7c\x70\x5d\xd2\x7d\x7c\xb8\x25\xf9\xc6\x39\xe1\x0e\xc1\xfd\xcd\x4e\xda\xe0\xbe\xec\x41\x28\x99\xa0\x04\xfa\x4e\x0b\x51\x13\x71\xa3\xc1\x63\x03\xbe\xba\xdd\x30\x67\x57\x97\xea\x3c\x0f\x15\x63\xb4\x90\x27\x64\xa4\x7e\x5f\xbb\x41\xa1\xf3\x8f\x3d\xe1\xd0\xa6\x61\xab\xaa\xf1\x2d\x85\x43\x6c\xff\x59\x63\xfb\xc9\x01\xc9\x5f\xbb\x17\x3a\x6a\xe4\x76\x45\xcb\x99\xda\x6d\x10\xe5\x77\x82\xad\x9e\x1e\x0c\x35\xf5\x09\x31\xd9\xcc\x30\xa0\x10\xba\x81\x42\x86\x1e\x47\x3b\xf1\xc5\x08\x2c\x7b\xef\x7e\x22\xb4\x20\x2b\x79\x54\xd0\x18\x0f\xf6\x67\x26\x86\x39\xb5\x5e\x15\x04\x5d\xed\x46\xc8\x6c\x45\xc7\xd6\xf7\x4e\xec\xcd\x92\x85\xb2\xf7\xaf\xa0\xfa\xc6\xbe\xdf\x3f\xc3\xe0\x21\x86\x16\x85\x78\xc0\xf6\x5a\x3b\x18\x18\x6e\xe8\x19\x96\x08\x42\x2d\x0a\x57\x07\x7d\x1d\x4d\x76\xbb\x00\x3a\xa9\x51\xa7\x24\xaf\xe3\x0f\x47\x83\x5a\x5f\x2d\xce\x59\xe3\x2e\x36\x75\x8c\x2e\x31\x21\x5d\xfd\xbf\xc9\x6c\x0a\x74\xdc\x5c\x1c\xdd\xb0\x25\xbd\xe7\xa2\xad\x51\x6e\x23\xc8\x77\xfa\x4f\x60\xb4\xd6\xa2\xed\x82\x85\x6d\x20\x61\xb6\x1b\x45\x39\x32\x53\x1f\xec\x1f\xe1\x30\x97\x0b\x13\x47\x99\xb1\x2f\xdc\x5b\x4e\xb8\x31\x66\x66\x92\x0c\x6a\xe7\xa3\x39\x5e\xf7\xb2\x52\x56\x31\x9a\x72\xf4\x57\xf7\xfb\x7d\x07\xec\x7e\x0e\x7f\xfa\xd6\x08\x47\x0f\x2e\xd8\xd8\xd3\x5d\x17\x16\x3c\x5b\x47\x93\x6d\xda\x6b\x42\xf5\x1a\x79\x4d\x25\xcb\xc9\x7b\x5a\xd2\x5b\x3c\xfb\xbe\x98\x5f\xbd\x7e\xff\x52\x4d\x61\x20\xbc\x71\x79\x31\x76\xcb\x68\xe4\xa3\xf8\x0f\xbb\xd5\xa7\x0c\xfa\x98\x60\x06\xf7\xd6\xcb\x1d\x2b\x6c\x8c\xc1\xf2\xa3\x9d\x6f\x16\xf8\x0e\x49\x94\x07\x1b\xf7\x7e\x95\x3f\x22\x39\xb2\x6d\x72\xba\xba\x9a\x96\x3d\x1b\x87\xdd\xf3\x48\x1b\x8f\x36\x8c\xbe\x20\x1b\xda\xb4\x3d\x6d\xd3\x77\x38\xdf\xab\x3d\x5e\x33\xac\x56\xbf\x01\xfc\x84\x5c\xbf\x64\x0c\xff\xa7\x25\x2d\x85\xbc\x6e\x0b\x56\x93\xac\x68\x65\xc3\x6a\x3c\x97\x40\xc5\x66\x7f\x0d\x7c\x10\xea\xa0\x9f\x15\x6d\x0e\x21\x79\x56\x1a\x80\x03\xa8\x2a\xa8\xc5\xaa\x8f\xd4\x70\x8c\xbe\x52\xf7\x07\xe7\xa7\x7a\x62\x3f\x82\x12\x12\x35\x78\xfb\x88\x75\x31\xea\x15\xdf\xf2\x66\xd9\xde\x9c\x64\x62\xe5\x38\xc8\xa7\x3a\x77\xa3\x59\x9f\xde\x14\xe2\xe6\x74\x45\x55\x17\x94\xbb\xdc\xd4\xfc\xa6\x6d\x44\x2d\x4f\x73\x76\xcf\x8a\x53\xc9\x6f\x67\xb4\xce\x96\xbc\x61\x59\xd3\xd6\xec\x94\x56\x7c\x96\x89\xf2\x5e\x2d\x37\x51\xca\x93\x55\xfe\xbd\x52\x51\x33\x5a\xe6\x33\x1c\x24\xd7\xdb\x9d\xd2\xee\xf4\x9e\xf2\x42\xf9\x98\xd7\x4c\x29\x41\xba\xa1\xfc\xfb\x21\x41\xd1\xd0\x82\x94\xed\xea\x86\xd5\x70\x7b\x6e\xde\x26\x95\xc8\x25\x1e\x0f\xb1\x26\xb3\xab\xdd\x5f\xf1\x52\xcd\xc7\x5a\x63\x4b\x6c\x82\x14\x37\xb4\xbe\x65\x2e\xd7\xab\x3b\xa7\x39\xab\x0a\xb1\x5e\x8d\xdc\xba\xf8\x82\xa4\xd3\x41\xd1\x8a\x2a\xf7\xcc\xdb\xc7\x6b\x6b\x7b\x4d\x80\x4b\x39\x49\x14\x09\x52\x4d\x91\x76\x5b\xe6\xac\x2e\x00\xca\x61\x05\x1a\x6a\xd3\x1e\xeb\x43\x0d\x38\x41\x37\x4c\x7d\xb3\x62\xb5\x6a\xb6\xf2\x0f\xe1\x00\x9c\x2b\xd3\xcc\x3a\xd1\xdd\x1d\x56\xf7\xb5\xd1\x7e\x8d\x9d\x7f\xeb\x6d\x66\xaf\x14\xe5\xac\x61\xf5\x8a\x97\x60\x0d\x60\x0a\x7d\xb3\xb1\xd1\x43\x3b\x3b\xe4\x45\xb3\x64\xbc\xd6\x54\x21\x64\x45\x9b\x4c\x07\x5e\x01\x38\x57\xd4\x2f\xf7\x33\x7f\x6d\xb9\xdb\x82\x75\xde\xdf\xa9\xbf\x7b\xea\x4d\x95\xab\x91\xdf\xaa\x27\xfb\x9c\x3c\x30\x5c\x4b\x7a\x8f\xf1\x99\x9c\x49\x65\x0c\x0c\x9d\x06\x9c\x8a\xf6\xd1\xdf\x31\x2b\x33\xdb\x54\x40\xbd\xbf\xe2\x7e\xed\x7d\x54\x8f\x7d\x6f\x64\x5d\xf4\xff\xde\x1f\x69\xbf\x65\x1a\x36\x74\x06\x43\xf0\xa7\xd1\xef\xeb\x41\x7a\x45\xee\x7f\xb4\xff\x82\x99\x9c\x69\x64\x72\xf8\x03\xe2\x57\xb1\xfc\x15\x69\xea\x16\xed\xa9\xf6\x92\xf4\x27\xd6\x16\xd2\x2c\x63\x55\xc3\x72\x38\xf6\x60\x13\xee\x78\x99\xbf\x22\xdf\x21\x86\x76\x55\xb4\x35\x2d\xf4\x3f\x95\x4e\xe5\xa0\x3d\x5e\x91\xff\xf9\xdf\x3f\xa1\x54\x96\xff\x6a\xda\xa1\x3e\xfc\xff\x00\x00\x00\xff\xff\xa7\x5a\xa2\x04\x4f\x3b\x04\x00") +var _examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7d\x73\xdc\xb8\xb5\x20\x0e\xff\x9f\x4f\x81\xf2\xa4\x4a\xf6\xf3\x74\xb7\xec\x24\x9b\xca\x7a\x53\xbb\xa5\x48\xf2\x5c\x55\x6c\x59\x2b\x69\x3c\x9b\xdf\x4b\xcd\xa0\x49\x74\x37\xae\x48\x80\x01\xc0\x96\x3a\x9b\xfd\xee\xbf\xc2\x01\xc0\x97\x26\x01\x82\xad\xd6\xd8\xc9\x90\xb7\xea\x66\xdc\x22\x0f\x80\x83\x83\x83\xf3\x7e\x7e\x33\x9f\xcf\x7f\x83\x0b\xfa\x85\x08\x49\x39\x7b\x8f\x70\x41\xc9\x93\x22\x4c\xff\x4b\x2e\x1e\xfe\x24\x17\x94\x9f\x6e\xdf\x2d\x89\xc2\xef\x7e\xf3\x40\x59\xfa\x1e\x9d\x97\x52\xf1\xfc\x96\x48\x5e\x8a\x84\x5c\x90\x15\x65\x54\x51\xce\x7e\x93\x13\x85\x53\xac\xf0\xfb\xdf\x20\x84\x19\xe3\x0a\xeb\x9f\xa5\xfe\x27\x42\x09\x67\x4a\xf0\x2c\x23\x62\xbe\x26\x6c\xf1\x50\x2e\xc9\xb2\xa4\x59\x4a\x04\x8c\xe0\xc6\xdf\xbe\x5d\xfc\x6e\xf1\x87\xdf\x20\x94\x08\x02\x9f\xdf\xd3\x9c\x48\x85\xf3\xe2\x3d\x62\x65\x96\xfd\x06\x21\x86\x73\xf2\x1e\xa9\x0d\x66\x5c\x8a\x32\x23\x42\x2e\x72\xce\xa8\xe2\x82\xb2\xf5\x22\xe1\x82\x70\xb9\x48\x78\xfe\x1b\x59\x90\x44\x0f\xbe\x16\xbc\x2c\xde\xa3\xfe\x97\x0c\x3c\x3b\x49\xb3\xc0\x7b\x00\x7d\xab\x41\xc3\xaf\x19\x95\xea\xaf\xfb\x7f\xf9\x48\xa5\x82\xbf\x16\x59\x29\x70\xd6\x9e\x10\xfc\x41\x52\xb6\x2e\x33\x2c\x5a\x7f\xfa\x0d\x42\x85\x20\x92\x88\x2d\xf9\x81\x3d\x30\xfe\xc8\x3e\x50\x92\xa5\xf2\x3d\x5a\xe1\x4c\x92\xdf\x20\x24\x13\x5e\x90\xf7\xe8\x5a\xcf\xaa\xc0\x09\x49\x7f\x83\xd0\x16\x67\x34\x05\x74\x98\x79\xf2\x82\xb0\xb3\x9b\xab\x2f\xbf\xbf\x4b\x36\x24\xc7\xe6\x47\x84\x52\x22\x13\x41\x0b\x78\xaf\x39\x57\x94\xea\x4d\x22\x12\xe1\xbd\x5f\x8b\x8c\xef\x72\xc2\xd4\xc2\x02\x28\x04\x2f\x88\x50\xd4\xe1\x43\x3f\x0d\xea\xa8\x7e\xdb\x1b\xea\x44\xcf\xc5\xbc\x53\x0d\xa5\x36\x04\xd9\x5d\x25\x29\x92\x30\x4f\xc4\x57\x48\x6d\xa8\x44\x82\x00\x12\x98\xa1\x90\x06\x58\xa4\x5f\xc1\x0c\xf1\xe5\x7f\x92\x44\x2d\xd0\x9d\x46\x94\x90\x48\x6e\x78\x99\xa5\x9a\x88\xb6\x44\x28\x24\x48\xc2\xd7\x8c\xfe\xa3\x82\x2c\x91\xe2\x30\x64\x86\x15\xb1\x1b\xe3\x1e\xca\x14\x11\x0c\x67\x1a\x8b\x25\x99\x21\xcc\x52\x94\xe3\x1d\x12\x44\x8f\x81\x4a\xd6\x80\x06\xaf\xc8\x05\xfa\xc4\x05\x41\x94\xad\xf8\x7b\xb4\x51\xaa\x90\xef\x4f\x4f\xd7\x54\xb9\xf3\x90\xf0\x3c\x2f\x19\x55\xbb\x53\xa0\x6a\xba\x2c\x15\x17\xf2\x34\x25\x5b\x92\x9d\x4a\xba\x9e\x63\x91\x6c\xa8\x22\x89\x2a\x05\x39\xc5\x05\x9d\xc3\xc4\x19\x1c\x87\x45\x9e\x7e\x27\xec\xe1\x91\x27\x8d\x99\xaa\x9d\xde\x77\xa9\x34\x85\x56\x3f\x03\x45\x7a\xf1\xae\xa9\x12\x51\xbd\xaf\xe6\x33\x33\xff\x1a\xbd\xfa\x27\x8d\x95\xdb\xcb\xbb\x7b\xe4\x06\x85\x2d\x68\xe3\x1c\xb0\x5d\x7f\x26\x6b\xc4\x6b\x44\x51\xb6\x22\xc2\x6c\xdc\x4a\xf0\x1c\x20\x12\x96\x16\x9c\x32\x05\xff\x48\x32\x4a\x58\x1b\xe9\xb2\x5c\xe6\x54\xe9\x9d\xfe\x7b\x49\xa4\xd2\xfb\xb3\x40\xe7\xc0\x15\xd0\x92\xa0\xb2\x48\xb1\x22\xe9\x02\x5d\x31\x74\x8e\x73\x92\x9d\x63\x49\x5e\x1c\xed\x1a\xc3\x72\xae\x51\x3a\x8c\xf8\x26\x33\x6b\xbf\x68\xb0\x55\xfd\xec\xb8\x4c\xff\x0e\xdd\x15\x24\xa1\x2b\x9a\x00\xa1\x1b\xfa\x27\xfa\x15\x2a\x48\x8a\x96\x64\x83\xb7\x94\x0b\xf7\x7b\xf3\x70\x26\x59\x29\x15\x11\x8b\x16\x56\xfb\xf1\xb3\x29\x97\x9a\x95\x9d\x6a\x9e\x2a\x18\x51\x44\x36\x50\xb5\xcc\xf8\xf2\x34\xc7\x1a\xd6\xa1\x68\xd3\x2b\x9c\x63\x96\xce\xa5\xc2\xaa\x6c\xa1\xae\x8f\x61\x00\xd3\x58\xc1\xad\xb0\x6b\xff\xba\x87\x9c\xab\x15\x20\x8f\xae\x28\x49\x67\x80\x80\x82\xa7\x27\x12\x8e\x74\x5a\x66\x9a\x78\x13\xce\xa4\x12\x98\x6a\x9a\xdc\x03\xe5\x1b\x5a\x3f\x8c\xa7\xe4\xcc\x33\x85\xce\x34\x2e\xe0\x1f\x4b\x22\xe1\xb3\x6a\xea\xcd\x69\x68\xd6\x2d\xd1\x8a\x0b\x37\xcb\xfd\xc9\x0c\x4d\xc8\xfc\x9d\xac\x88\x10\x24\xbd\x28\x35\xa5\xdd\x55\xe0\xaf\xd6\x8c\x57\x3f\x5f\x3e\x91\xa4\x54\x7b\xdc\xd6\x3b\xf7\xfb\x0d\x71\xf3\x24\x02\x3d\xd2\x2c\xb3\xc3\x68\x7e\xe8\xfe\xa0\x27\x0c\x0c\x52\xaf\x4f\x7a\xc0\x22\x7d\x4b\x29\x24\xb1\xa2\x72\xb5\x83\x75\x56\x98\x20\x4f\x9a\x31\x80\x48\x50\xef\x18\x5a\xee\x2c\x4f\xd0\x17\xd8\xcc\x0b\x76\x59\x2a\x44\x15\x30\x92\x64\xc3\xb9\x24\x08\x1b\x44\xc3\x78\x5b\xca\x81\x65\x23\xce\x08\xe2\x02\xe5\x9a\xc2\xcd\x71\xf0\x42\x6c\x4c\x67\x01\x18\xa8\xc1\x51\x89\x72\x2e\x55\x8d\x6b\xfd\x8b\x5e\x8b\x06\xff\x48\xd5\x26\xb0\x7a\x82\xd6\x5a\xe6\x20\x52\x21\x59\xe6\x7a\x12\x8f\x84\xae\x37\x4a\xce\x10\x5d\x90\x05\x6c\x3f\xc1\xc9\xa6\x31\x5c\x4e\x88\xf2\x23\x14\x67\x99\x3b\xd9\x4d\x5a\x22\x7f\x2f\xa9\x20\xfa\xda\x95\xe8\x75\xc5\x94\x2d\xa3\x9c\xb9\xbf\x77\xa8\xc4\x3f\x4c\xcf\x36\xcd\x10\x51\xc9\xe2\xcd\x0c\x25\x3c\x2f\x4a\xa5\x71\xae\xd7\xb4\xdc\x21\xaa\x88\xc0\xf6\x62\x10\xbc\x5c\x87\x31\x42\x32\x3b\x51\x77\x73\xc3\x66\xc3\x15\x8a\xd3\x54\x43\x79\x65\x90\xf4\xca\x5d\xc0\xb2\xcc\xbd\x10\xa9\x41\x06\xe0\x2f\xc7\x2a\xd9\x58\x39\x21\xe1\x42\x10\x59\x70\x06\x10\xe1\x2f\x97\xf5\x5a\xfe\x5b\x90\x18\x34\xb0\xd7\xf2\x0d\x6c\x2e\x00\xdb\xd0\xf5\xc6\xed\x21\x16\x04\x7e\x6b\xd3\x44\xdf\xe1\x85\xe9\x29\x92\x7b\xce\x2e\xda\x3f\x78\x67\x0c\x91\xbc\x50\xbb\x06\xa5\x35\xf6\x58\x11\x91\x57\x2b\xc4\x20\xb5\xfa\x1e\x73\x9b\x48\x33\x7f\x9a\x17\x19\x4d\xa8\xb2\x94\x87\xde\xa2\xd7\x40\x7a\x54\x9d\x48\x38\x36\x73\x5e\xbc\x59\xa0\x33\x27\x0a\xfb\x9e\xe1\x49\x31\x5e\x8d\x6c\x87\xd0\x13\x95\x3c\x00\xb4\x1a\xdf\xfb\xce\x10\x07\x6c\x4e\x8e\xb0\x84\x84\xde\xda\xc7\xb7\xa1\x1a\x49\x32\x92\x28\xcd\x87\x89\xc8\x67\x08\x4b\xc9\x13\xaa\x25\x89\x6a\xff\x83\x20\xd1\x1e\xa9\x19\x34\xfb\x17\x14\xbf\x28\xfd\xec\x13\xee\xd0\xfb\x9d\x25\x6a\x45\x43\x9f\xb4\xf6\x52\x9b\x0c\x63\x10\x22\xd2\x67\x5c\x7f\x7f\x22\x51\x86\x97\x24\xeb\xdc\x9b\xdd\x67\x80\xee\xbd\xd3\xf5\x4e\xd3\x8a\xa4\xf6\x2f\x11\x80\xed\xe5\xa3\xe5\x13\x4c\x99\xb4\x62\xf8\x0c\x61\xf4\x40\x76\x46\x62\xd7\x4a\x41\xa1\x59\x17\x5c\xc2\x58\x45\x41\x15\xc4\x5c\x2e\x9a\x07\x3c\x90\x1d\x00\xb2\x22\x7e\xc4\xf7\xf1\x3b\x6f\x9e\x07\xd2\x2b\x6c\xf4\x3d\x9d\x4b\x1c\xf6\x0a\xe6\x08\x98\x00\x4e\x3a\x06\x7f\x08\x34\xb5\x22\xa3\x04\x44\xed\xc8\x6f\x7a\x25\xdf\xd0\xe3\xb6\xe0\xa0\x75\xde\x56\xfa\x85\xd9\xd8\x13\x69\x36\x48\x9f\x95\x0d\x2d\xa2\xd7\xa9\x38\x50\x17\x1c\x15\xa7\xb0\x7d\xd1\x1a\x72\x35\x3d\x09\x9c\xff\x8a\xf9\xa5\x92\xfd\xe7\x9a\xab\x2b\x36\x43\x97\x4f\x54\xea\x0b\xff\x82\x13\x79\xcd\x15\xfc\x73\x81\xbe\x57\x86\x06\x3f\x0e\xb0\x8a\xc6\x14\xc7\x22\xd6\xac\xe3\x20\xb4\x9e\x31\x84\x85\xc0\x3b\x8d\x8e\xa6\x1a\x28\x17\x5a\xc2\x1e\x66\x89\xf5\x53\x1d\x30\x2a\xb5\x62\xc6\x85\x43\x0b\x28\xf3\x00\xd3\x0c\x15\x0d\x31\x2f\x25\xe8\x7b\x8c\xb3\x39\xdc\x97\x6e\x4e\xad\xb1\x0c\xd6\xe3\xa7\x29\x5a\xfb\xd3\x9d\x9e\x1b\x36\x1a\xa2\x7f\x6a\xdf\x2b\x3d\xdc\xc7\xd6\x20\xf1\x07\xb2\x9e\xcc\x06\x6f\x41\x08\xa3\x6c\x9d\x55\x62\xd5\x0c\x3d\x6e\x68\xb2\x01\xb9\x3d\x1a\xe8\x92\x18\x8b\x46\x21\x88\xbe\xf7\xb0\xd4\xac\x51\xff\xb2\x26\x42\x8b\xc3\xd4\x21\x81\xc6\x4f\x54\x90\x22\xc3\x09\x49\x51\x0a\x42\xa7\xb1\x27\x60\x45\xd6\x34\x41\x39\x11\x6b\x82\x0a\x7d\xb7\xc5\x52\x7f\xf4\x85\x62\x9e\xd1\x87\xc5\x7d\x12\x4b\x8b\x4e\xa4\x8e\x99\xd2\x5c\x73\xa6\xa8\xf7\x1c\x99\x44\xbc\xdc\x6b\x38\x08\xbf\x1c\xb3\x36\x10\x38\xac\xfd\xf0\x2b\xcb\x1a\xa0\x17\x4c\xb2\xc6\x24\x6b\x78\x9f\x49\xd6\x70\xcf\x24\x6b\x4c\xb2\xc6\x24\x6b\x4c\xb2\xc6\xbf\x90\xac\x11\x09\xd4\xd8\x53\x46\x98\x75\x7e\x34\x76\xae\x7d\x3b\x0e\x08\x36\xce\x79\xd5\x32\xd9\x0c\xac\x48\x8b\x09\x77\xf6\x2e\xbb\x07\x13\x11\x65\x00\x44\x60\xb6\x26\xe8\xdd\xfc\xdd\xdb\xb7\x61\xca\x5a\x71\x91\x63\xf5\x5e\x53\xf9\xef\x7f\x17\x81\x13\x7b\x1a\xbc\x6f\x0e\xd3\xc3\xbc\x61\x11\x0b\xbc\x64\x70\xeb\xb7\xd6\x0e\xef\xd0\xd0\x66\xfb\x2c\xcf\xcf\xf0\x4f\x58\x2e\x57\x99\xa8\x5b\xc6\xef\x8e\x2b\xc1\xbb\x38\x6b\x75\x16\x9a\xb9\x2b\x94\x13\x85\xb0\x6a\x99\x36\x69\x4e\x2a\x0f\x92\x71\x83\x18\x47\xa3\x17\xa2\xf3\x8d\xa4\x88\x33\x6b\xb9\xd6\xb4\xb3\x88\x9c\xb1\xdf\xdb\xd1\x74\x8a\xa0\x84\x60\x49\xb4\x0c\xb1\x24\xd5\xac\x79\xae\x67\x49\x99\x72\x0c\x50\x4f\x99\x38\xac\x7a\x01\xbf\x26\x8b\xf5\x02\xa5\x25\x80\xc3\xcc\x7a\x50\xdf\x98\x55\xcb\x9d\x54\x24\x07\x1f\x0b\x17\xf0\x3f\x7a\xf9\x4a\xec\x90\xf2\x5b\x74\xc9\x96\x30\x55\xe2\x2c\xdb\x21\xb2\xa5\x89\xaa\xf0\x07\x4e\x5e\xaa\x8c\x3f\xcc\x77\x5a\x62\x04\xd6\xfd\xd3\x18\xe4\xd3\x7b\xe2\x9b\x21\xc5\x85\x57\x53\x51\x1a\x1e\xb8\x7f\xc2\x87\x54\xbf\x06\x94\xf3\xf9\xd6\x6f\xf9\x47\x71\x17\xc9\xbe\x4e\x52\x66\x99\xc6\xb7\x71\x04\x74\xa7\xe7\x8c\xed\x83\x3c\xcb\x99\xe2\x8d\x37\xab\x45\x71\xc6\x7f\x64\x3c\x19\x67\xd7\x17\x1a\x23\x43\x4b\x46\xe8\x9e\x17\x3c\xe3\xeb\x5d\x13\xf7\x70\xfa\xc1\xc1\x60\x21\x63\x24\xcb\xa5\x95\x6c\x87\x05\xb7\xeb\xbd\xad\x9c\x6c\xe6\x93\x1e\xdb\xf7\x4c\x7a\x6c\xe7\x99\xf4\xd8\xc8\x29\x4e\x7a\x2c\x3c\x93\x1e\x3b\xe9\xb1\x83\xcf\xa4\xc7\xf6\xbc\x3c\xd9\xcc\x27\x59\x23\xf0\x4c\xb2\x46\xe7\x99\x64\x8d\x49\xd6\x98\x64\x8d\x49\xd6\x08\x3e\x93\xac\xd1\xf3\xf2\xd1\x6c\xe6\xc3\xe0\x86\xd0\x33\xef\x1a\xda\x82\x16\x60\xef\x94\x82\x7f\x2e\x78\x7a\x40\x48\x7d\xc1\xd3\x40\x44\xbd\x31\x6a\x26\x7c\x9e\xf1\x04\xab\x7e\x7e\x00\xe6\x54\x0d\xc6\x5a\xf2\x25\xce\x8d\xad\x76\x86\xfe\xc1\x19\x31\x91\xce\xfa\x98\x81\x65\x95\xab\x0d\x11\xfa\xf5\xd7\xf2\x4d\x6f\xa4\xea\x14\xa5\xdf\xfb\x4c\x51\xfa\x53\x94\xbe\x7d\x9a\x51\xfa\x1b\x2c\x0d\x5d\x9a\x8b\xd0\x1f\xb4\xdf\xe0\x0e\x9a\x01\xfd\xb7\xe0\x7c\xbf\x52\xcc\xbe\x26\x42\x4b\x2c\x90\x66\x58\x6f\xbc\x59\x57\x6a\xdd\x91\x24\xbd\x69\xaf\x26\xc0\xbd\x8d\x0e\x07\x93\xc6\x69\x4a\x52\x54\x10\x31\x37\xa4\xc7\xd1\x8a\xb2\xb4\x67\x2d\x6e\xfd\x5e\xb0\x91\x71\xf4\xed\x49\x8e\x70\x5d\x34\xbd\x2b\x2d\x06\xbd\x1f\x55\x3f\x70\x17\x56\xfb\xf7\x92\x51\xf5\xa0\x79\xb9\xcb\x6d\xbc\xca\x0e\x7a\xdb\xdf\x4b\x22\x76\x88\x6f\x89\xa8\x35\x93\x2a\x07\x33\x46\x09\x81\xbb\x87\x4a\x94\x60\x69\x18\xf5\xb0\xa8\x35\x4e\x3b\x1d\xef\x07\xe9\x2c\x76\x1f\x84\xd1\xf2\x9d\xcd\x02\x10\x11\x29\xbd\xf5\x9a\x36\x7a\x9c\x53\x58\xc4\x8a\xf0\xc6\x75\x15\xf5\xf2\x28\xe1\xb4\x77\xb7\x3d\x26\x8f\x78\xb5\xa0\xe1\xc6\x1b\x30\x7b\xc4\xc3\xdc\x33\x8f\x3c\xd3\xf4\x81\x0e\x30\x7f\xa0\x71\x26\x10\xb4\x8f\x5e\x3d\x4b\x7b\x4f\x77\xad\x21\x23\x80\x36\xe8\x6b\xbc\x45\x04\x1d\xa6\x8f\x8c\xb7\x8c\xa0\xfd\xe5\x57\xdb\x27\x3a\x66\x92\x51\x8b\x6f\x9a\x54\xfc\xa6\x92\x51\x20\x3b\x66\x95\xb6\xb9\x04\x68\xab\x65\x31\x79\x69\x64\x8f\xb3\x96\xa0\x7d\x54\x5b\x5b\x01\x05\xd5\x79\xcf\x76\x32\x0a\x31\x6d\x3b\x8b\xd7\x7e\x32\x0a\xa6\xcf\x98\xd1\xb6\xa1\x8c\x06\xd9\xb5\xb7\x74\xec\x28\xc7\x99\xa6\x9d\x62\x6d\x88\x18\x05\xd6\x14\x6f\x38\xa6\x31\x02\x8d\x37\x48\xa0\x43\xe9\x72\xac\x61\x02\x8d\x34\x4e\xa0\x11\x06\x0a\x34\xd6\x48\x81\xc6\x1a\x2a\xd0\xe8\xf5\x82\x08\xf1\x11\x42\x20\xe2\x96\xab\xd5\x0b\x7d\x66\x71\x76\x33\xfa\x36\x1a\xbd\x83\x5d\x69\xc7\x4c\xd5\x08\x3a\x39\x2e\x34\x97\xf8\xdf\xfa\x6a\x06\xc2\xff\x3f\xb1\xf7\x28\xa6\x42\x6a\x51\xd8\x1a\xff\x1a\x10\x9c\xcd\xa1\x31\x58\x24\x50\x3d\x1b\x2a\x91\xa6\x9d\x2d\xce\xb4\x00\x62\xc2\xb6\xac\xaa\xa6\x67\xba\x2f\xaf\xc5\x9e\xef\xc7\x8d\x56\xcf\xf5\xe5\x6b\xd4\x3c\x2a\xd1\xab\x07\xb2\x7b\x35\xeb\xf0\x91\x57\x57\xec\x55\x2c\x54\x6c\x55\x95\x16\xcf\xa8\x24\x1f\xce\xb2\x1d\x7a\x05\x7f\x7b\x15\x7b\xb0\xfb\xc4\xc5\x31\x82\xe0\x01\x46\xb9\xa8\x97\x99\xab\xac\x33\xd6\x01\x58\x7f\x58\xd9\x57\x9c\x62\x5c\xff\x29\xc6\xda\xe8\x24\xa8\xbb\xae\x1c\x84\x5e\x57\x69\xe3\x6b\x8d\x79\xf5\xc6\xaf\x4a\x37\x96\xd4\x8a\x44\x03\x91\x3f\x27\x98\x49\xf4\xca\x59\xcf\x4e\x64\x3d\xc7\x57\xc7\xf3\x38\x8e\x3a\xc3\xf1\xbc\x48\xd9\x00\xb6\xbf\xc6\x88\xab\x7b\x3a\xbe\xb5\x16\xda\x8a\x41\x4b\x52\x9b\x17\x53\xf4\xda\x69\xba\x7e\xdd\xbb\x7e\xb8\x80\x28\xca\xd6\xe7\x4c\xd1\x79\x05\xa3\xd6\x7f\xb5\x46\x18\xcb\x5e\x5d\x58\x73\x9b\x02\x9c\x71\xb3\xb2\xdb\xd5\x14\x15\x73\x82\x1f\x37\x44\xb4\x56\x4a\xa5\xad\xc4\x04\x1e\x08\x51\x32\xa6\xc7\xe5\xcc\x9a\xf5\xa2\x40\x6a\x36\x63\x0a\x0a\x59\x33\x89\x11\xfb\x61\xd5\x20\xfb\xd7\xbb\x14\x19\xea\x88\x9c\x01\x13\xaa\x3c\xd9\x98\x49\xce\xec\x21\xd2\xbf\x38\x4b\x1c\xe0\x85\xa4\xb1\x98\xa5\xd5\x1a\x17\xe8\x12\x0e\x41\x73\x72\x54\xc2\x4e\xe2\x2c\xe3\x8f\x31\xdc\x27\x9a\xaa\xe3\x64\x83\x79\x73\x32\xc7\x70\x19\x8c\x0e\xb3\x7f\x3c\x72\x98\xfd\x9e\xe9\xe9\x5f\x24\xca\x3e\xd2\xa8\x37\x85\xda\x4f\xa1\xf6\x8d\x50\x7b\xf8\xc8\x70\xbe\xe1\x98\x7b\x3f\xcd\x40\x2c\x7e\x6c\xcc\x3d\xfa\x71\x43\xe0\x44\x05\x0c\x6c\x7a\x8b\xf2\x32\x53\xb4\xa8\x1d\xd6\xd2\x4c\x2d\x33\xea\xa3\x09\x54\x92\x7b\xd6\xd9\x50\x46\x00\x4e\x36\xfb\xc7\x04\xc6\x01\x87\xb6\x04\x8e\x6c\xdd\x2c\x38\xcb\x6c\x6c\xbd\xd6\x2b\xfd\x7b\x44\xac\xaf\x8a\x1e\xc7\x84\x7f\x51\x15\x32\xb4\x46\x13\x70\x4e\xbc\xd6\x97\x65\xa6\xc9\x41\x5f\x59\x8e\xab\x85\x7c\xae\x9d\xfb\xd7\x58\x65\xb6\xc4\x39\x48\xd6\x74\x4b\x58\x7d\x09\xbf\x96\x6f\xde\x0c\x85\x35\xa9\x48\xd1\xa3\x2b\x58\x04\x80\xf6\x89\x1c\xb3\xc8\xeb\x3e\x00\xb6\x12\x04\x22\xae\xf9\x3f\x37\x6e\xaf\xff\x1e\x80\x59\x3b\x87\xbc\x17\x3c\xa0\xa7\xba\xe2\xab\x0d\x0c\x00\xa5\xc3\xab\x89\xb3\x83\x8e\x70\x23\x1c\xe0\x42\x40\xd4\xcf\x4e\xcc\x33\xc6\x7d\xf0\x8b\xa5\x4f\x44\xb8\x0c\xc6\x84\xb9\x0d\xbb\x0b\x62\xf5\xbf\x43\x43\x1e\x83\x0e\x80\x29\xe6\x31\xf8\xc4\x1b\xfb\xff\xfd\x42\x1f\x03\xc6\xfd\x6f\x34\x06\xf2\x60\xa3\xfe\x2f\x19\xfa\x18\x32\xe4\x8f\xf4\x76\xa1\x21\x23\xfe\x33\x03\x00\x87\x82\x20\xa3\x61\x7a\x8c\xf7\xfd\x06\xf9\x68\xa8\x7d\x86\xfb\x5e\x63\x7c\x34\xc4\x29\x82\x70\xf0\xbd\xaf\x1d\x41\x38\xd2\x20\x7f\xa8\x31\x7e\xd4\xee\x8c\x35\xc2\x5b\xf3\x7a\xc4\x34\x22\x0d\xf0\x5d\xd3\x7a\xcc\x12\x07\x8d\xef\xfb\x66\xf5\x38\xa3\x53\xc8\xf0\xde\x6b\x52\x8f\x00\xdb\x6f\x74\x7f\x96\x38\x15\x4d\x9d\x91\x2f\xc6\x9a\xd0\xc7\x9b\xcf\x23\x62\x09\x46\x98\xce\x9d\x61\x7c\x00\xe2\x31\xcc\xe6\x51\x1c\x31\xfa\xa4\xc5\x71\x88\x68\x33\xf9\x4b\x98\xc8\x47\x9a\xc7\x63\xd4\x72\xd4\xab\x9a\x87\x4c\xe3\x46\x13\x1e\x00\x19\x6f\x16\x6f\x6a\xc3\x43\xcb\x8f\x35\x89\x37\xf5\xe1\x21\xcf\x54\x94\x39\xbc\x6b\xec\x8e\xf7\xa6\x8c\x32\x85\x47\x51\x6b\x8c\xe5\x35\xc6\xfc\xfd\x6c\xa3\xea\x60\xf0\x3a\x53\xf4\xd0\x00\xf6\x26\x5d\x7b\xa2\xd8\x7b\xe7\x8c\xb7\x9c\xa6\xa8\x28\x95\x0d\xe5\x1d\x1d\xc9\xde\x0b\xf5\x57\x15\xdd\xde\x42\x7d\x30\xc4\x3d\x6c\xd2\x9e\x1d\x10\xe2\xee\x85\x68\x8f\xe5\x01\x21\xee\x7e\x90\x36\xf4\xfd\xa0\x10\x77\x2f\x54\x08\x7d\x3f\x2c\xc4\x7d\xf0\xc4\xef\x93\x90\x7f\xaf\x5c\x9c\xbb\x17\xe4\x70\xfc\x7b\x20\xce\xdd\x6f\x21\x0f\xc6\xbf\x07\xe2\xdc\xfd\xe8\x8c\x8e\x7f\xef\xc4\xb9\x07\x48\x7e\x8a\x7f\xdf\x7b\xa6\xf8\xf7\xc6\x33\xc5\xbf\x47\x2e\x76\x8a\x7f\x9f\xe2\xdf\x87\x9e\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x29\xfe\x7d\x8a\x7f\xef\x79\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x6f\x3c\x53\xfc\xfb\xc0\x52\xa6\xf8\xf7\x29\xfe\x7d\x8a\x7f\x9f\xe2\xdf\xa7\xf8\xf7\x9e\x57\xbe\x4a\xfc\x7b\xcb\x08\xed\x0d\x82\x0f\x98\x63\xeb\xfa\x29\x23\x83\xe0\xbd\x30\x97\x64\x38\x08\xde\x3b\x6d\x2f\x54\x4f\x8d\x9f\xa8\x48\x78\xbf\xe9\xb5\x19\x21\x3f\x2a\x12\x3e\x60\x34\xef\xa9\x4a\xff\xcc\xea\xf3\xa8\x11\x21\x7f\x68\x24\xbc\x9f\x04\xf8\x14\x09\x3f\x45\xc2\x4f\x91\xf0\x53\x24\xfc\x14\x09\x6f\x9e\x29\x12\x7e\x8a\x84\x9f\x22\xe1\xa7\x48\xf8\x29\x12\xbe\xf3\x4c\x91\xf0\xbd\xd3\x9d\x22\xe1\xa7\x48\xf8\x29\x12\xbe\x7e\xa6\x48\xf8\xf6\x33\x45\xc2\x4f\x91\xf0\x81\x67\x8a\x84\x7f\x99\x48\x78\xef\x9f\x70\x46\x84\xba\x10\xbc\xe8\xbf\x62\xdb\xca\x65\xfb\x5d\xcd\xa6\x57\x74\x5d\xda\xb8\x55\x43\x07\x40\x99\x76\xfb\xcc\xe9\xea\x4c\x74\x49\x50\x2a\x78\x51\x10\x08\x88\xbf\xdf\x60\xc6\xe5\x2d\xc4\x90\xc3\x64\x4c\xd8\xca\xcf\xa6\x21\xdf\xcf\xb5\xaf\x57\x6f\x5a\x21\xf8\x96\xa6\xa4\xa7\x9e\xf9\xcf\x0a\xe0\xfc\x24\x34\xa0\x9f\xb4\x4c\x48\x13\xfc\xb3\x31\xd1\xb6\x07\x34\x83\xa0\xe5\x4e\x9f\x03\x5c\x66\x1d\xb5\xc1\xc3\xc7\x02\xb4\xe0\xdb\x16\x18\xea\x7f\x96\x44\xec\x7e\x10\x59\x10\xb5\xf7\x10\x55\xae\x88\x60\x38\x43\xf0\x05\xfa\xe1\xf6\x23\xe0\xd5\x20\x08\xdd\xd6\x51\xf6\x5a\xa9\x32\x2c\xa1\x33\xc9\x93\x3b\x30\xc7\x9c\x58\xb4\xd9\x68\x5f\x87\xd7\x4f\xb8\x90\xce\xbc\x77\x32\x9f\xc3\xcf\x0b\x30\xeb\xcc\x4b\x91\x9d\xa0\xf3\x8f\x57\x1d\x88\x58\x74\x72\x1c\xbc\x98\x00\x80\x39\x66\x78\x4d\x84\x3c\x07\xea\x08\xae\xda\xd8\x32\x2b\x3a\x02\x1d\x13\xa2\xdc\x13\xce\x18\x49\x4c\x1c\x38\x6f\x81\x5d\x20\xf4\x99\x65\x5d\xea\xc7\x5b\x4c\x33\xbc\xcc\xaa\x60\x7a\x40\xda\xf6\xed\xe2\xdd\xdb\xc5\x5b\x90\x43\x20\xd6\x5a\x7f\xdf\xc4\xc2\xcf\xad\x29\x2f\xcc\x4c\x7e\x8e\x41\x42\xc8\x0c\xe1\x31\x39\x74\x76\x5c\xf3\xcb\x8a\xbf\x25\x82\x40\xb0\x84\xe1\x74\x60\x0e\xd7\x93\xb5\x9a\x19\xd6\x2c\xd9\x13\x1e\x67\xbf\x7d\x20\xbb\x3e\x6e\x16\xe4\x61\xfa\xb8\x0e\x4e\xf5\xe4\x1a\xe7\x95\x69\xd4\xb6\x2c\x56\x0b\xf4\x89\x83\x5d\x7c\xc5\xdf\xa3\x8d\x52\x85\x7c\x7f\x7a\xfa\x50\x2e\x89\x60\x44\x11\xb9\xa0\xfc\x34\xe5\x89\x3c\x4d\x38\x4b\x48\xa1\xe4\x29\xdf\x12\xb1\xa5\xe4\xf1\xf4\x91\x8b\x07\xca\xd6\x73\xbd\x51\x73\xdb\x01\xf5\x14\xf8\xc6\xe9\x77\xf0\x3f\xbd\x8b\xbc\xff\x7c\xf1\xf9\x3d\x3a\x4b\x53\xdb\xea\xa1\x94\x64\x55\x66\xae\x97\x16\xc2\x05\xfd\x42\x84\x16\x64\x67\xe8\x81\xb2\x74\x86\x4a\x9a\xfe\x8f\x93\xb1\xf8\xe0\x85\x51\x1f\x06\x71\x72\x07\x77\xf1\x4e\xdf\xbe\x30\x1d\x8d\x9a\x3b\xb3\x0f\xfa\xc2\x56\x12\x36\xd7\xe9\xd5\xf6\xc6\xf5\xce\x66\xc9\x79\x46\xf0\xbe\x01\xd5\x77\xb1\xf4\xa9\x6f\x61\x06\xef\x08\x7c\x88\x0d\x9d\xd8\x13\xf9\xc3\xed\x47\x69\x68\x91\xa5\x8e\x61\x2a\x6e\x2e\x80\xfa\x20\x7e\xe0\xc2\x72\xa7\xce\xc2\xba\x07\x6f\x66\xbe\xfe\xd4\xe2\x0e\x0d\x01\xac\x94\xc0\x9e\xa5\x22\x38\x5d\x80\xa5\xa7\x87\x30\x1b\xde\x2e\xc7\xd9\xa9\xf1\x1c\x22\xba\xea\x1d\x80\x36\xdc\x7f\x86\x01\x76\x81\xf6\xb2\x82\x52\x64\x3f\xc3\xb9\xdf\xa7\xa1\xe3\x5d\x0f\x56\xcd\x21\x22\x7c\xed\x9e\x9c\x57\xef\x19\xa9\x45\x22\xca\xfe\xd3\xb2\xc7\x5a\xe3\x6d\x80\x33\x79\x4c\x29\x5d\xed\xfa\x69\xdc\xaa\x69\x6b\xc2\xf4\x7f\x91\xb4\xf1\xa9\xb5\xae\x24\x98\x55\x9b\x02\x1c\x38\xe3\x8f\x2e\xa7\xa6\x43\xa7\x08\xe1\x52\x6d\x08\x53\x34\x31\x2c\xbc\x10\xfc\x69\x67\x0c\x80\xcd\xeb\x1d\x5c\x1f\x90\x1d\x96\x6c\xc0\x61\xae\xd1\xbe\x24\x1b\xbc\xa5\x3d\x0a\x0a\xc8\x8b\xc1\xc9\x2e\x50\x03\x33\xa9\xcd\xdc\x4b\x11\x78\x86\xcc\xf2\xbb\x13\x0d\x43\xb4\xb9\x41\x3b\x24\x37\x2e\x1d\xc7\x24\xeb\xe9\xff\xa7\x69\x19\xc0\xda\x65\x76\x29\x49\x7f\x93\x72\x46\xd0\x96\x62\x6f\x78\x28\x70\xfe\xa4\x14\x9a\x89\x36\x46\xee\xe7\x7c\x58\x90\xf7\x4e\xb6\x99\x83\x6c\xf3\x33\xcc\xe3\x67\xc8\x40\x9c\x9b\xfb\x2a\xc7\xc5\x5c\x90\x8c\xe3\x94\x88\x9f\x17\xe8\xf3\x96\x08\x41\x61\xab\xea\x7d\xed\x40\xa6\x12\xe9\x1d\x13\x24\xdb\x21\x5e\x2a\x49\x53\xbb\xde\x84\x17\xc0\xec\x1f\x9d\xa9\x3b\xc7\xb4\xc2\xb2\x91\x3f\xca\xa2\xe0\xa2\x2b\xa3\xea\x89\x69\xb1\x8a\xeb\xa1\x25\x9f\xa1\x1d\x2f\x11\x4e\x34\xfb\x77\x86\x73\x2a\xdd\x86\x97\xc6\x33\xbc\x14\x04\x3f\x20\xac\x40\xd6\x57\x34\xef\x8a\x34\xfa\x9a\xe0\xa5\xd2\xf2\x1f\x4d\x48\xec\x71\xdc\xf3\x8a\x58\xbb\x0a\xa8\xca\x96\x48\x6b\xd4\xc3\xdc\xf4\x5c\x1f\xb1\x89\x57\x14\x25\x83\x61\x7b\x5d\x5a\xe0\xc2\xeb\x5e\xb4\x61\xb7\x04\x16\x6b\x8f\x6a\xdc\x3e\xea\x67\x62\x5d\x1a\xdb\x86\xe5\x4a\x84\x29\xb1\x03\x0f\xbe\x21\x9c\x94\x27\x0f\x9a\x4e\x73\xbc\x26\x27\xde\x08\xfc\xf3\x4f\x17\x7a\x83\x0d\x4f\xb5\x39\x73\x7b\x22\xf4\x02\x7d\xc1\x82\x82\xc4\x64\xaf\xf4\x84\x48\xf4\xdb\xd7\x5f\xce\x6e\x7f\xba\x3e\xfb\x74\xe9\x53\x7e\x35\x8d\x93\xa7\x02\xb3\x94\xa4\xa8\x94\x75\x14\x8d\xc5\xe6\xc9\x89\x26\xac\x2d\x15\x9c\xe5\x20\x26\x5c\xad\x40\x78\x31\x63\x79\x80\x26\x98\x99\x62\x82\xe0\x50\xcc\xb6\x24\x9d\x35\x85\x8d\x84\x38\x15\x98\xb2\xa2\x54\xce\x7c\x6e\xaf\x00\x0f\xcc\x92\x19\x2e\x63\x3a\xa7\x37\x57\x86\xe4\x8e\x29\xfc\xe4\x98\x1c\x91\x09\x2e\x5c\x68\x10\x46\x29\x2f\xfd\x13\xfd\xed\x6f\x67\x88\x92\xf7\xe8\xb7\x0d\x70\x0b\x74\x69\x21\x34\x10\x69\x62\x43\xc8\x96\x08\x18\xc2\x22\xcc\xe7\xe9\x10\x64\x8d\x45\x9a\x11\x29\xcd\xc9\xab\x65\x0a\x87\x38\x44\x2a\xa3\x3a\xe3\x6a\x81\xce\x1d\xc6\x7c\xab\x87\x40\x8d\x34\x56\x4a\x53\x58\x3e\xc8\x53\x73\xad\xcc\x53\xac\xf0\xbc\x71\x54\x4e\x8d\xf8\x32\x4f\x78\x9e\x63\x96\xce\xb1\x25\xd2\x79\xb5\xe9\xa7\xdf\x59\x75\x7c\x8e\xab\xb7\x28\x9b\xe3\xb9\xdc\x90\x2c\xeb\x93\xc2\x06\xcc\x45\x83\x8a\x77\x58\x13\xb6\x73\x88\x39\x71\x97\xd5\x01\x33\xd0\x16\x5a\xf4\xb0\xa1\x30\x96\x28\xb4\xd2\x88\x60\x25\xa1\x26\xfc\x7b\x27\x13\x5d\x5e\xdf\xdf\xfe\xed\xe6\xf3\xd5\xf5\xfd\xe0\x51\xf4\x40\x1c\x38\xa0\x31\x47\xd1\x03\xd9\x7f\x40\x87\x8f\xa2\x07\x64\xe0\x80\x0e\x1f\x45\x3f\x5b\xf0\x1e\xd0\xe8\xa3\xe8\x81\xed\x39\xa0\xf1\x47\xd1\x03\xb7\x73\x40\x7f\xe5\x47\x91\xb0\x6d\xc4\x31\xfc\x68\x03\x2e\x1a\x84\x59\xe1\xdb\x6a\x22\xce\xe6\xd1\x90\xff\x7c\xb7\x5f\x07\xf5\xe3\x57\xdd\x9a\xdd\x25\xdb\x7e\xc1\x6d\xcf\x38\xeb\x9d\x2a\xb2\x2f\x78\x6d\x7c\xc0\x4a\xce\x87\x16\x10\x13\xe2\xe0\xd3\xdc\x7b\x17\xd0\x54\xe0\xfb\xe6\xbd\xa8\xed\x0c\x41\x7b\xe8\xf9\x4f\x57\x17\x97\xd7\xf7\x57\x1f\xae\x2e\x6f\x43\x96\xd3\x28\xbb\x29\xd8\x98\xa3\x97\x70\x32\x86\x1b\x06\x17\x51\x73\xca\x42\x10\x2d\x89\xd6\x16\xf1\x7e\xf2\xf3\xd8\xda\x9a\x4f\x2d\x4c\x9a\xa8\x98\x1d\x92\x44\x6c\x69\xd2\x8f\x6e\x63\xe2\x0c\xa3\x3a\x9e\x21\xb7\x58\x6f\x10\xe6\x58\xb6\x6c\x19\x70\x10\xe6\x8b\x30\x67\xf3\x1c\xce\xa2\xc3\x33\x6e\x4b\x52\x17\xc6\x0a\x0c\x5c\xe6\xd5\xab\x8e\x7e\xd1\x7c\xe2\xc9\xfa\x83\xe0\xc1\xc2\x04\x6d\x5b\x92\x29\xc0\xb1\xe2\xc2\x7b\x40\x4f\x6c\xf4\x55\xd8\x5d\xd1\x60\x7c\x56\xdc\x30\x51\x8d\x56\xde\x30\xe1\x13\x01\x08\xb1\xa1\x55\x46\xed\xfc\x84\x8b\xbf\x92\xdd\x2d\x59\x0d\xf9\xfc\xda\x8b\x05\xf3\xa6\x8d\x2d\x02\x25\x1f\x9d\x3b\x70\x43\x6e\xdc\x31\xa1\x5f\x91\x61\x5f\xbd\x36\xd9\xca\x0a\x1b\xe3\xb4\x1f\x15\x3b\x30\xc4\xb5\x7b\xa7\xf5\x4d\xd8\x5f\xf7\x9f\xb1\xf6\xd8\x28\xa0\x3e\x9b\xed\xfe\x33\x0a\xe7\x21\x9b\xee\xfe\x33\x68\xe3\xad\x68\xd5\x9a\x79\xa3\x96\x15\x67\x0a\xee\x5f\x64\xbf\x69\x78\xff\x89\x8d\xfe\x89\x89\xfc\x89\x0e\x95\x80\xbd\x1e\x7b\xfe\x4f\x6a\x06\x50\xf9\xa8\xac\x87\xfc\xbd\xb3\x2c\x49\x94\x13\x85\xb5\xec\xbb\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\x31\x3e\xab\x7f\x33\x9e\xc4\xc6\x0f\xc0\x25\x8d\x09\x6f\x18\xb4\x2c\x48\xb2\x60\x3c\x25\xfa\x10\xce\xcc\x3f\xed\xdd\x7e\x96\x24\xbc\x64\xca\xfe\x41\x61\x55\xca\xc5\x86\x4b\x75\x75\x13\x01\xd6\xbc\x5e\xf0\xf4\xea\x66\xd6\xfa\x97\x0c\x5e\x41\x68\x24\x1b\xac\xcf\xe1\x68\xf2\xb7\xdf\x35\x2b\x48\xe5\x18\xfe\xf3\x83\xde\xb8\x1b\x1c\x28\x6e\xd4\x7c\xa8\x44\x8f\x82\x2a\x45\x18\x48\x2a\x90\x32\xc1\x57\x33\xe7\x7e\x35\x17\xef\xf6\x5d\x54\x7e\xed\xa8\x83\xbf\x72\xd3\x1c\xbd\x74\xfd\x91\x5b\xb7\xa1\xd2\xda\x31\x17\x21\x0d\xba\xa7\x0e\xd8\x38\xbb\xb9\x42\x5b\x83\xcf\x23\x2f\x33\xfe\xe4\xaf\x22\x77\x2d\xfa\xfc\xbb\xe0\xff\x0f\xcf\xe4\x03\x55\x09\x32\x8b\xf1\x4a\x98\x7e\x0f\x01\x60\x83\xf8\xaa\x92\x10\x50\x46\x73\x6a\x03\x83\x6d\x39\x33\x89\x5e\x9b\x1f\x17\x49\x51\xce\xec\x0b\x8b\x9c\xe4\x5c\xec\x86\x4f\xa9\x7d\x9d\x14\x1b\x92\x13\x81\xb3\xb9\x54\x5c\xe0\x35\x99\x55\xe0\x0d\xd8\xea\x5f\x06\xf0\xf0\xa9\x6c\x4c\xb0\x0b\xdd\xe8\x32\xd6\x45\x90\xed\x1c\x57\x24\xe9\x51\x39\x43\x85\xe5\xeb\x83\x64\x92\xf3\x96\xe7\xe2\x7d\x45\x87\x20\xc6\x6e\x79\x56\xe6\x71\x19\xbc\xf5\xfd\x6c\xea\xdb\xb1\xad\x16\x7a\xe5\xd1\xa5\x80\x94\x6e\xa9\x8c\x8b\x8d\xef\x11\x02\xa8\x4d\x57\xe0\xa5\x2a\x4a\x65\xd3\x38\x87\x3a\xe1\x37\x1f\xf2\x54\x70\x09\xaa\x4f\x95\x30\xd3\xe2\x7f\xef\x86\x93\xd3\x47\x2e\xd8\x8d\x34\x7e\x6b\x5d\x99\xb4\xf7\xf5\xc9\xac\xd8\xdf\x91\xf7\x25\x9e\x7b\xb9\xa9\x1c\x8b\x79\x99\xa0\x89\xe3\x28\x30\x36\x00\xc3\xea\xe1\x10\x34\x19\xa5\x09\x80\xa4\xf2\x8d\xe8\x3c\x11\x71\x28\x51\x84\x5e\xc7\xaa\x0c\xc4\xa5\xec\x3f\x93\x1e\xf5\x6b\xd2\xa3\x3a\xb1\x32\x51\xeb\xfa\xb7\x53\xa2\x22\x5e\x1b\x9a\xd5\x1c\x0e\x43\xd0\x78\x1f\x80\x3f\x68\xbc\xf7\x5b\xb2\x7a\x0d\xf8\x4e\x12\x53\x1c\x15\xbc\x28\x33\xac\x3c\x26\xd0\xb0\x1b\xa9\x11\xe3\x61\x19\x54\x6d\xa4\xad\x5d\x72\xe6\x6e\xca\x07\x4c\xd7\x2d\xa3\x35\x3a\xcb\x32\x44\x99\x61\x50\x00\xd6\x59\x43\x05\x31\x42\x16\xc2\xc6\xbc\xbf\xf5\xdb\xf1\x1f\x6d\x0e\x7a\x33\x70\x44\x6a\x25\x4e\x28\x08\x49\x86\x1c\x75\x73\x3f\x58\x63\x23\x65\x55\xa6\xba\x07\x66\x25\x16\x54\xf9\x12\x9d\xb2\x15\x26\xca\x56\x2a\xb7\x70\x98\xb9\xc2\x0f\x3e\x90\x85\x20\x09\x49\x09\x4b\x08\x64\xde\x95\xa4\xc6\xe1\x72\xa7\xd7\x78\xc9\xb6\x95\xdd\xb6\x34\x3e\x26\x73\x19\x68\xc8\x3e\x8a\xc2\x0f\xa4\x05\xf9\x25\xbc\x2d\x9a\xe8\xee\x5c\x59\xe2\xca\xe9\x02\xf7\x53\xa5\x29\xb8\xe4\x42\xef\xe9\xaa\x4c\x35\x3e\x5a\x8b\xb9\x5a\x2b\x53\xe7\x80\x98\xd0\xb9\x53\x6b\x43\x51\xfb\x2e\x3d\x82\xf9\x35\xe6\xf2\xfb\xb6\x2f\xbe\xa3\x05\x73\x36\x9f\xe8\xcb\x2c\xf6\x22\x1b\x61\x0c\x1c\x77\x31\xc5\x5e\x4a\x51\x97\x48\x21\xc8\x8a\x3e\x45\xd3\xe6\x19\xab\x15\x2e\x9a\x12\xa6\xb4\x72\x03\x41\x79\x85\x20\x05\x61\x69\x55\x06\x63\xe8\x92\xb3\xac\xba\xb6\xde\x37\x82\x95\x8f\xea\x28\x34\x72\xe4\xd8\x03\x78\xd7\x27\xc9\x4e\xa7\xef\xdf\xe7\xf4\xd9\x0d\xfe\x6a\x47\xef\x99\xb2\x15\x04\x0a\xc5\x44\x28\x5d\x34\x02\x8b\x80\xfa\x46\xd3\x4e\x1d\x06\x7a\x0a\x50\x7c\x24\x72\x5f\x87\x57\x53\x59\xb3\x89\x2a\x00\xd8\x44\x72\xa3\x8c\x6c\x49\x66\x6f\x46\x64\x02\xa6\x73\xbf\xb0\xa4\xb8\xb3\x74\x68\x69\x9f\x9b\xe0\xd4\x96\xe8\x04\x53\xd2\xec\x44\x93\x76\xc6\xb1\x09\xc8\x15\x3c\xcb\xfa\x02\x57\xcd\x93\xd1\x07\x82\x2e\x48\x91\xf1\x9d\xcd\x05\x65\x29\xba\x53\x58\x69\x52\xbe\x23\xca\x67\x45\x1f\x20\x53\x98\xcb\x4d\x99\x65\x37\x3c\xa3\x89\x47\x9b\x6e\x6f\xcf\x15\xec\x4b\x51\x66\x19\x2a\xe0\xa3\x05\xfa\xcc\xe0\xbc\x9f\x65\x8f\x78\x27\x67\xe8\x9a\x6c\x89\x98\xa1\xab\xd5\x35\x57\x37\x46\x98\xf1\xf1\xc4\xa6\x33\xda\x7c\x8e\xe8\x0a\xbd\xcf\x4c\x57\x08\x85\xdb\x01\xed\x33\x8d\xd1\x26\x58\x0f\x54\x38\xe6\x8f\x54\xf6\x4a\x6b\xcf\x26\xa6\xef\x00\x92\x66\x49\xe6\xdf\x07\x21\x3e\xa3\x2b\x92\xec\x92\x2c\xe6\x44\x9c\x25\xe0\xbb\xa9\x8b\x71\xd4\x34\xe8\xba\x33\xdb\xbc\x02\x10\x56\xbd\x85\x69\x4c\x49\x28\x53\x33\xab\x26\xc7\x6a\x26\x46\x05\x90\xd1\x12\xee\xf0\x05\x52\x70\xa9\xee\xb4\x96\x10\x59\xeb\xe9\xe4\xc6\x7d\x80\x20\x26\x3f\xcb\x48\x8a\x68\x9e\x93\x54\x6b\x05\xd9\x0e\xe1\x95\x82\x6a\x3c\xd5\xec\x03\x1c\x4d\x43\x80\xf6\x22\x69\x55\xdc\x61\x83\x59\x9a\x11\x81\x56\x98\x66\x56\xf3\x68\x69\x34\x8a\x88\x9c\xb2\x81\xfa\x4c\xc6\x96\x0d\xca\x8f\x56\x9e\x92\x84\x0b\xdb\x6f\x1a\x54\x7b\xfb\xa7\xfa\x6c\x00\xff\x1e\xe4\x1a\xa8\x4e\x30\xad\xa7\xb4\xcc\x78\xf2\x20\x51\xc9\x14\xcd\xcc\x02\x38\x7f\x80\x26\x22\x19\xd0\x6a\x83\x94\x03\x60\x47\x12\x79\xf5\x9f\xf3\x8a\x32\xe6\x7a\x5c\x79\xfa\x5d\xfd\x27\xf8\xc1\x7f\x45\xc6\xc9\x16\xe4\x89\x24\x23\xb2\x98\x35\x97\xd1\xc8\x87\x24\x79\xce\x2a\x11\x63\xc5\x35\xb3\x86\x18\xfc\xfe\x04\xcc\xf6\xb3\x24\xcd\x0c\x99\xcb\x27\x92\x34\x92\xd3\xa1\x44\x1d\x1c\x37\x08\x48\xc7\x0f\x03\x11\x28\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\x98\xc7\x02\x41\x19\x65\x70\x8a\x6d\xd8\x6e\x84\x5d\x88\xb2\x2a\xe3\xa1\xda\x45\x73\x02\xac\x7c\x85\x52\x2a\x20\xfb\x7a\x87\x56\x71\xf5\x2f\x1a\xf3\x81\x04\x65\xce\x15\x7a\x7d\x72\x7a\xf2\xa6\x63\xd4\x38\xd1\xb7\x6c\x46\x0c\xaf\x8a\xb1\x8d\xde\x37\x60\xeb\x0b\x80\xe6\x45\xb6\x83\xd5\x9e\xa4\x33\x44\x95\x8b\xf0\x11\x25\xb3\x2b\x8b\x00\x6a\x63\x9a\x67\x48\x72\xa4\x04\xae\xf2\x88\xe0\x57\x48\xc5\x12\xa5\xe5\xb4\xaf\x4f\xfe\x79\x12\x63\x79\x24\x2a\x79\x83\x1e\x39\x3b\x51\x80\xc6\x05\xba\xe7\x5a\xba\xac\x87\xda\xf1\x12\x31\x62\x92\x8a\xc8\x53\x91\xd1\x84\xaa\x08\x0f\x1f\x02\xe6\x87\x78\xa9\x4c\x5e\x04\x56\x2e\x1e\xfb\xf2\x89\x2a\xeb\x3e\xd7\xf4\xff\x16\x28\xc3\xb0\xb9\x18\x14\x48\x94\xd1\x2d\x39\xdd\x10\x9c\xa9\x8d\xa9\x44\xc5\x38\x9b\xff\x83\x08\x0e\x51\xdb\xcc\xfe\xe5\x88\xf5\xba\x5e\xa4\x74\x70\xa4\xb9\x51\xb3\xbe\xef\xc9\x98\x0a\xaa\xff\x71\x7f\x7f\xf3\x3d\x51\x7b\x2c\x41\xc3\x71\x0e\x4c\x50\x1d\x89\x58\x71\x31\x40\xca\xf1\xbc\x61\xc3\xe5\xc0\x1c\xbb\xf3\xe4\x52\x99\x34\x2d\x73\x99\x33\xad\xf1\x29\xde\xf2\xb2\x45\x1e\xe2\x82\xa7\xe8\xea\x66\x81\xfe\xc6\x4b\x3d\xe7\x25\x5e\x66\xbb\x2a\x35\x48\x12\x85\x5e\xe9\xc1\x5e\xe9\x53\xad\xf1\xf0\x1f\x04\xa7\x7e\x39\xb5\xf9\xb8\xec\xc6\xc8\x5d\x8f\x22\x91\xc6\x0c\xc6\xb2\xd2\x52\x2a\x9e\xa3\x8d\xf9\x78\x2f\xc6\xda\xee\x6d\x0c\x6f\xd2\x14\xe2\xf2\x12\x05\x29\xe0\xe8\x39\xa8\x2f\x55\xe6\x4e\x8f\x69\x56\x5d\xe5\xfd\x49\x2d\x06\x35\x97\x14\xe5\x50\x30\xd5\x52\x6d\xee\xa9\x59\x8a\xde\xf2\x28\xdf\xcd\xd8\x42\x74\xb1\x3e\x2b\xd4\x67\xcd\x30\x6b\xb2\xca\x59\xc0\xe0\xbf\xff\x1c\x56\xeb\xec\x38\xd3\x8c\x29\x22\x72\xe0\x3c\xc7\x55\xbb\x8a\xc4\xd7\x3c\x7a\xc6\x2f\x54\xeb\xaa\x88\x8a\x55\xea\x46\x2a\x69\x05\x3d\x49\x20\x1e\xda\x1c\x5f\x20\x64\x49\xc4\xd6\x9f\x63\xb0\x3f\xbf\x28\xd4\x17\x3c\xa4\xbb\xb8\x07\xb3\xdd\xe7\x41\x9f\x3a\x54\x45\x89\xaa\x71\xbd\xff\xfe\x21\x65\xba\x8c\x09\x4e\x20\x56\xe6\x4b\x22\xea\x98\x43\xa1\x6a\xe4\x45\xec\x3b\xef\x78\xa7\xae\x0d\x40\x67\x84\x6a\xd7\x03\x8f\xa1\x24\x8e\xfe\xf8\x5f\xfe\xcb\xef\xff\xcb\xc2\x4c\xb1\xf2\x65\x31\x74\x75\x76\x7d\xf6\xd3\xdd\x97\x73\x08\x9e\x1f\xde\xc5\xa7\x79\xad\xcf\xcc\x29\x53\x73\x2e\xe6\x06\x53\xef\x91\x12\x83\x54\x0d\xd1\x7d\x11\xe7\xbe\x6d\x95\x83\x8f\xf4\x1a\xb4\x90\xd7\x2d\xdc\x61\x54\xb4\xb8\x6b\xa4\x69\xf9\xd0\xe4\xfb\x15\xaa\xd5\xf7\x26\x35\x77\x47\x1c\x76\xea\x26\xc5\x1d\x4f\x1e\x46\xc9\x59\x27\xf7\xe7\x37\xe6\xa3\x86\xa8\x85\x99\x53\xbe\x28\xdb\xf2\x6c\x3b\x4c\xf6\x18\xdd\x9f\xdf\xc0\x42\x16\xf0\x5f\xa0\x97\x82\x6a\xb0\xd3\x90\x5d\x20\x99\x35\x01\x6b\x35\x62\x48\x09\x37\x50\x05\xc1\x19\x95\x8a\x26\x00\xb5\x36\x91\x68\xf8\x61\xcb\xf0\x8b\x4a\x7d\x27\x9f\x9d\x31\x79\x58\x00\x8c\x3b\x8c\x0d\x01\x70\x38\x80\xe2\x57\xc1\x39\x2d\xc7\x34\x71\x7e\x13\xe7\xdc\x7b\x7e\x59\xde\x12\xf1\x52\x21\xc8\x9d\xe2\x45\xb4\x85\xd1\xbc\xee\xb1\x2f\x2e\xc9\x8a\x0b\x12\x6f\x60\xac\x0d\x86\x55\xf3\x00\x06\xb1\xcf\x4e\x57\xe4\x4d\xd3\x5f\x30\xc6\x42\x3f\xb2\x4c\x36\x4e\x47\x67\x44\xca\x53\x30\x25\x96\x85\x91\xd1\xc1\x6c\x59\x0a\x32\xd3\x6b\x26\x39\xac\x68\x16\x13\x27\xa8\x17\x43\x98\x79\x1d\x5a\x6f\xdf\x37\x6c\xa1\xd6\x92\xe2\x90\xb1\x67\x82\x0c\x41\x15\x58\x6e\x08\xe4\x95\x91\x27\x5a\x97\xff\xc6\xd2\x16\xb5\x72\xc8\x01\x7e\x2e\x51\x81\xa5\xa9\xae\x12\xba\x49\xea\x89\x19\x70\x37\x3c\x3d\x39\x91\x2d\x50\x6b\x81\x13\xa2\x35\x70\xca\x53\x04\x09\x09\x29\x7f\x0c\xb9\xb6\x96\x64\x4d\x99\x74\x7b\xab\x87\x70\x44\xa0\xb9\xb9\x29\x11\xe8\xf2\xdf\x17\xe8\xb6\x4a\xb6\x1b\xb6\xd4\xf2\x52\x25\xbc\x66\x12\x76\xe6\xfb\x86\x65\x08\x5b\xa9\xdb\x40\x84\x96\xef\xc8\xc9\xc5\xfc\xa8\x61\x14\x58\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x10\x8d\xaf\xbc\xfb\x03\xf5\x8a\x71\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xde\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe7\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf7\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xce\xea\x7b\xa3\x65\xdc\x98\x48\xec\x1b\xb0\xb1\xd1\xc4\x9a\x87\xf9\xaa\x15\xd5\x6b\x80\x35\x6a\x46\x7b\x26\x5e\xe7\x03\xba\x98\x56\x6b\x04\xae\x8d\xce\xbd\x31\xc1\x60\xcf\xf3\xc0\x8c\x8f\xae\x76\x21\xf0\xf2\xb4\xe0\xe6\xff\xd5\x96\xbc\x86\x09\xcf\xc8\xfd\xfd\x87\x7e\x98\x89\x85\x6d\x77\x07\xd9\xed\xda\x96\xb9\x00\xf1\x3c\xc3\x66\x17\xc7\x9d\xa3\x6c\x75\x07\xd8\xe9\xe2\x6c\x55\xb1\x36\xba\x7d\x0b\xdc\x00\xd8\x68\xfb\x5c\xd3\xfa\x36\x00\x33\xce\x36\xe7\xb3\xbc\x0d\x89\x68\x1e\xbb\xdc\xa0\xd5\x6d\x00\x6e\xbf\x4d\x2e\x68\x71\x1b\x9a\x69\xaf\x3d\x2e\x68\x6d\x1b\x46\x6c\xa4\x2d\xee\x97\x6f\x99\x15\xc1\xb9\xad\x5b\xed\x7e\x23\x88\xdc\xf0\x2c\x70\x92\x5a\xa7\xe8\x13\x65\x34\x2f\x73\x4d\x98\x12\xfa\x88\x6f\x2b\x0f\x9d\xac\x28\xde\xf0\xd0\xa0\x75\x0b\x9a\x71\x01\xe9\x41\x35\x19\x4c\x33\xbd\x1b\x90\xe8\xb0\xc1\x5b\xe0\x38\x65\x92\x10\x02\x35\xcc\x2f\xa2\x0c\x66\xbf\x5f\x54\xb3\xab\x0a\x22\xbe\xf3\xef\x4c\x5c\x93\xfe\x18\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\x23\xbb\x6b\x0e\x99\x17\x87\x4d\x8b\xc7\x34\x2b\x46\xa2\x76\x58\x29\x8e\x50\x88\xc7\x28\xc3\x23\x14\xe1\xd1\xe6\x43\x8b\xa4\x81\x6d\x8d\x55\x80\xf7\xd4\xdb\x01\xa8\x87\x29\xbf\xcf\x50\x7c\x63\xcc\x85\x2f\x62\x2a\x1c\x67\x26\x3c\x5a\xb3\xc9\xa0\xfa\x1e\x71\x54\x29\xa3\x8a\xe2\xec\x82\x64\x78\x77\x47\x12\xce\xd2\x00\xa7\xde\x2b\x75\x50\xd1\x9c\x34\x1f\x5a\xc9\xad\x1d\x65\xb3\xc1\xb6\x5a\x4e\xd0\xef\x6d\x03\x94\x9c\xe6\x6e\x2f\x17\xa8\x8d\x68\x66\x78\x48\xf6\xf2\x11\xf4\x6b\x74\x54\x11\xd1\x04\x06\x8d\x43\xf3\x7f\xf0\x47\xc4\x57\x8a\x30\xf4\x9a\x32\x87\xe9\x37\x0d\xe1\xb0\x96\xb5\x43\x24\x67\xc9\x53\x7f\xf7\xee\xad\x03\xf3\xb5\x44\x65\x10\xea\xa5\x3c\x86\xd6\x61\x41\x3d\x47\xed\xb0\x20\x56\x65\xd6\x56\x3d\x8c\x3a\x12\xab\x77\xbc\xab\x4b\xa2\xbc\x83\xb9\x54\xb4\xac\xb5\x49\x1b\xcc\xd8\x45\x78\x10\xe2\x2f\xb0\x15\x11\x2e\x81\x83\xdc\x01\xc6\xe0\x3f\x70\xc5\x8e\x72\x05\x34\x8d\xfd\x01\xb8\x63\xdc\x00\x2f\xa2\x3d\x1d\xd1\xf4\x3f\xc6\xec\xff\x6f\x27\xd9\x44\x98\xf7\x7f\x45\x92\xcd\x2f\x21\x0b\x28\x9a\x13\x5e\xaa\x23\x89\x01\xa6\x2f\x74\x83\x23\xd3\x70\xbd\x22\x5e\xee\x35\xe8\x78\x67\x01\xf6\xde\x52\xc7\x8b\xa8\xfd\xc6\xa4\x84\x81\x7d\xf2\x2b\xc9\xde\x26\x40\xb5\x2c\x56\xd7\x28\xc7\x12\x61\x74\x71\x7d\xf7\xd3\xc7\xb3\xbf\x5c\x7e\x5c\xa0\x4b\x9c\xf8\x4a\x85\x37\xaa\x84\x30\xd3\x10\xd1\xd0\xfe\x06\x6f\x09\xc2\xa8\x64\xf4\xef\xa5\xed\x9a\xf9\xba\x82\xf8\xc6\x79\x4d\x3c\x40\x87\xea\xab\x0c\xf0\x0c\x68\x1c\x30\xa2\x52\xa5\x69\x34\x60\xcc\xc8\x5c\x8b\xf9\x82\xe7\xfb\x6e\xbf\x4b\xfd\x27\x3f\x8b\xc2\x86\xf7\x40\xc3\xd1\x35\xdd\x5a\x83\x9d\x2d\x41\xd3\xe8\xcc\xaa\x49\x52\x53\x82\xbe\x0d\xf1\x12\xcc\xd4\x5e\x0e\xc5\x88\xd2\xd4\x57\x69\x1c\x9c\xc9\x66\xfe\x85\xd6\x48\xe4\x0c\x2d\x4b\x30\xd5\x17\x82\xe6\x58\xd0\x6c\xd7\x1c\x02\x67\x3e\x7e\x73\xcd\xdd\x0d\xbd\x33\xd7\x71\x3d\xfd\x8b\xcf\x97\x77\xe8\xfa\xf3\x3d\xf4\x44\xd2\x37\x2b\x58\xd1\xe1\xef\x80\x98\x25\xf1\xa3\xc1\xd6\xb6\x5e\xa0\x33\xb6\x33\x9f\x98\x73\x4e\x25\xd2\x57\x33\x61\x7a\x30\xab\x95\xbb\x52\x50\xaf\xde\x2e\xe0\xff\x7c\x65\xaf\x71\x9a\x0a\xcd\xcd\x2b\x27\xc4\x5e\xfe\x80\xe6\xb2\xc0\xef\xe9\x32\x6b\xec\x9d\xc5\xde\x2f\xd6\x19\xac\x72\x26\xde\xe8\x65\x37\x1b\x84\x55\x1b\x09\x08\x31\xf5\x4a\xa1\x09\xa9\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xdd\x65\x6a\x0f\x05\x6f\x94\xb4\x46\x57\x37\x6e\x5b\xc2\x17\x1a\x94\x11\xcb\xdb\x8d\xcb\x0d\x60\x63\x92\x98\xa1\xb7\xe8\xcf\xe8\x09\xfd\x19\xae\xd6\x3f\x86\x80\xc5\x71\xd0\x38\xb1\xd6\x48\x6d\x57\x37\xd1\x58\xf9\x51\x1f\x01\xfd\x8d\x5e\xb9\xe2\x68\x49\x59\x6a\x3a\x34\xb9\x4e\xfd\x16\x5b\xcf\xae\x70\xa8\x07\x39\xea\x86\x81\x75\x02\x5d\xad\x1a\xb5\xc2\xc2\x92\xe2\xc8\x2d\xd3\xa0\xb5\x24\x7b\x6d\x88\x3c\x6c\x9e\x6e\x55\x2c\xab\x47\xca\xb1\x4a\x36\xed\x13\xa4\xaf\x70\xa9\x42\x6d\x8b\x5b\x18\xe1\xa0\x21\x18\x77\xe0\x86\x06\xa9\xf2\xb8\x84\x34\xaa\xf9\x5e\x6b\x17\xf6\x30\xbd\x27\x28\x0e\x08\xe1\xa9\xbb\x59\x1b\xe9\x50\x05\x4f\xcd\x55\x0d\x93\x4a\x1b\xec\xc6\xdd\xca\x41\xa0\xdd\x1b\xdb\x86\xa8\x54\xaa\x33\xd0\x97\x3e\x09\xb6\x1b\x27\x54\xb0\x14\x03\x19\x0b\xfa\xb4\x54\x3d\xf0\x82\x1b\x13\x75\x3e\x0a\xc1\x15\x4f\x78\xb0\x66\x64\xdb\x24\x6c\x3f\x80\x65\x18\xb5\xd2\x69\xe2\x3f\x5c\xdc\xcc\xb4\x46\x08\xc5\xf3\xee\xce\x87\xac\x72\xad\xf6\x70\xf7\xe7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xce\x79\x5e\x94\x8a\xa0\xdb\xaa\x5d\x7d\xd5\x33\x7d\xb9\x33\x7e\xc1\xc6\xe1\x78\x29\x37\x87\x69\xdb\x55\x0a\x08\x15\x39\x35\xb5\x10\xe7\x89\x99\xda\xbc\x5a\xcf\xbc\x9a\xc9\xe9\xa1\xae\x0e\xd3\x3b\xdf\x4f\x0f\x75\x7c\xcc\x4d\x14\xe3\x8f\x62\x5c\x6d\x8c\x7f\x84\x29\x34\x0c\x2d\xa6\x59\xd4\x13\x90\x2f\xce\x79\x69\x4a\x40\xda\xd5\x07\xc6\xae\xf0\x62\xcc\x44\x5f\x0f\xed\x28\xbe\x67\x30\x91\x5f\x19\xfb\xb7\x76\x12\xfb\xf8\xb7\xec\xe3\x30\xfc\xbb\x23\x03\x11\x08\xd5\x08\x54\x22\x9e\x53\xa5\xe5\x14\x2d\xec\x35\xa2\x85\x42\x5e\x0d\xaa\x5a\x36\x54\x4b\x2d\xe0\x73\xc4\xca\x54\x41\xad\xdc\x1c\xcd\x9e\x6b\xae\x9b\x5a\x08\x5d\x50\xf9\xb6\x92\x96\x60\xd7\xe7\xae\xf9\x2e\x30\xce\x6f\x9a\x82\x06\x5e\xd0\xf2\xbe\xa0\x6a\x77\xce\x99\x22\x4f\x1e\x09\xa6\x4d\x0c\x77\xf6\x13\xdb\x55\x50\x56\xa2\x94\x75\x62\x8a\x92\x41\x54\x43\xc4\x55\x12\x83\x2c\xd3\x6d\xec\xd4\x4d\x14\xb0\x42\x9e\xd4\xa9\x07\x64\xdc\x56\x28\x2c\x1f\xea\x7d\x20\x73\x7d\x39\xd5\xe8\xee\x8c\x75\x28\xe3\x04\x16\x73\x23\xe8\x96\x66\x64\x4d\x2e\x65\x82\x33\xd8\xf3\x58\x11\xe0\xcc\xf3\xbd\xeb\xaa\x28\xab\x2e\x9a\xbe\x8e\xd9\x76\x9e\x20\xd4\x25\x98\xa1\x35\xa6\x0c\xe5\x1a\x47\x85\x03\x0b\xdd\xf7\x18\x74\x78\x2b\xb0\xd0\x0a\x81\xfd\x20\x24\x71\x41\x60\xd8\x92\xf3\xcc\x7a\x64\xb3\x5d\x3d\x27\xeb\xea\x67\xfc\x27\x46\x1e\x7f\xd2\xe3\x48\xb4\xca\xf0\x3a\xd4\x8b\x1a\xd9\x8a\xb0\x44\x75\x4a\xb6\x54\xd3\x41\x3e\x74\x84\x18\x83\x04\xf1\x0f\x61\xd3\x81\xb1\xb7\xdd\xf7\x7b\xf4\xee\x0d\x50\x2d\x96\xa8\x82\x1e\x32\xaa\xfc\xee\x0d\x58\x5f\xce\xcf\x6e\x7e\xba\xfb\xdb\xdd\x4f\x67\x17\x9f\xae\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4d\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4b\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\xb9\x03\xbd\xab\x23\x46\xd1\xcd\xe7\xbb\xab\xff\x15\x3f\x2a\xb2\x34\x12\xe5\x1e\x38\x92\x07\x1b\x21\x4d\x26\x23\x30\x79\x6b\xa3\x7b\x26\x5c\x7a\xde\x19\xa8\xe4\xef\xb8\x4a\xe4\xe1\xbe\x2d\x59\x3b\x32\xbf\x86\x80\x72\x9e\x92\x05\xba\x31\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\xab\x3f\x66\x8a\xe2\x2c\xdb\x21\x2d\x89\x6d\x71\x46\x8c\x0b\x59\x70\xaf\xb6\x82\xea\x92\x5a\x26\x2e\xb5\xc9\x35\x56\x38\x93\x81\x03\x1e\xc3\x07\x35\xab\xff\xa4\x85\xc9\x48\x3c\x55\xef\xa3\x94\x30\xae\xac\x5c\xaa\x47\x82\x80\x5a\xc1\x13\x64\x64\x53\xe3\x86\x08\xac\xaa\x0e\x27\xaa\x98\x25\xb0\x58\xc7\x06\xa9\x74\x6b\xbd\xa9\xc6\x04\x4d\x3c\x00\xb3\x94\x44\xee\xdd\x36\x96\x0d\xd6\xd2\xaa\x1e\x57\x10\x9c\x42\x6c\x58\x81\xd5\x06\xec\x9a\x01\xa0\x39\x96\x0f\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x6b\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x67\x96\xed\x6e\x39\x57\x1f\xaa\x90\xaa\xc8\xed\xfc\xb1\xea\x09\xde\xd4\xa0\xe1\xb2\x05\x23\x65\x3a\x07\x34\x41\x20\x57\x5c\x25\xf3\x8b\x7a\xfb\x8e\x40\x9e\xa2\x64\x67\xf2\x7b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbf\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\x83\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x09\xef\x10\xce\x24\xb7\xc2\x54\x48\x32\x62\xe8\x06\x7c\x26\x4d\xf9\x7f\x81\x20\xc6\xd9\xc4\x5d\x2c\xb9\xda\xa0\xbd\x17\x06\x88\xb3\x0b\xd1\x84\xef\x19\x03\x53\x9d\xa0\x44\xd9\x3e\xe0\x10\x71\xe2\x07\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\xb3\xcc\xf7\xb0\xd3\xd7\x9c\x69\x32\x8e\xdc\xeb\x2b\x96\xd2\x04\x1b\x1e\x64\xbb\x59\xd7\x24\x0c\x56\x4d\x2b\x63\x62\x88\x81\x1b\xe0\xb2\xa5\x24\xc2\x74\x77\x16\x25\x31\x48\xfc\x6b\xb9\x24\x19\x51\x26\xe2\x16\xe2\xfa\xb1\x32\xad\x04\x4c\x43\x79\xac\x1c\x61\x84\x4f\x3a\x61\xb2\x84\x76\x21\x5a\x35\x56\x28\xe5\xa4\x8e\x57\xc4\x12\xfd\x70\x75\x81\xde\xa2\xd7\x7a\x7e\x6f\xc0\xc7\xb2\xc2\x34\x24\xb6\x2b\x6e\xbc\x30\xfb\x72\xf5\xca\x01\x87\x65\x00\x7d\x22\x2e\xcc\x31\x9c\x21\x16\xf2\xf9\x40\xb7\x18\xbb\x42\xad\xee\xb8\x18\x63\xeb\x99\x03\xa3\x4d\x9b\xd0\x03\xe4\x1c\x1a\x27\x4c\xe8\x3e\x72\x0e\x40\x1c\x26\xf4\x11\xe4\x1c\xcd\x92\x7e\x90\x44\x8c\xe0\x48\x3f\x1c\x95\x23\x35\x45\x00\x4d\xb5\xed\xd5\x1b\xd2\xcc\x89\xc2\x29\x56\x18\xd1\xd0\x76\x94\xac\xd1\x11\xe4\xd7\xb0\xc1\xc7\xe3\x57\x92\x7c\xa4\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\x25\x7c\x88\x12\x37\x79\x40\x38\x2e\x8a\x8c\x9a\x00\xe1\x76\x1e\x65\x00\x33\xe6\x90\x37\xd3\x63\xfa\x04\x1f\x38\xca\x38\xcb\xb8\x66\x95\xfa\x56\xc7\x2c\xe5\x79\x00\xec\xfe\x04\xb5\xc0\x44\x70\xb2\x69\x5a\xd8\x7b\x88\x65\xd4\x25\xf5\x2f\x7e\xed\xc5\xa9\xce\x19\xd9\x92\x60\xda\xcd\x7e\x76\xad\x7e\x5f\x0b\x4e\x6e\x07\x00\x00\xca\xf0\x92\x64\xe6\xf2\x30\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xf0\x6c\x4c\x30\xd2\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\x9f\x0b\x0d\x4b\x51\x9c\xdd\x15\xa3\xda\x9e\x7d\xff\xe9\xee\xac\xfd\xb1\x26\xdc\x47\x48\xb9\xd7\xeb\xd1\x7f\x47\x38\xcd\xa9\x94\x61\x93\x34\xe0\x97\x2c\xa1\x1d\xdd\x6b\xe7\xa3\x58\x53\xb5\x29\x97\x8b\x84\xe7\x0d\x77\xc5\x5c\xd2\xb5\x3c\xb5\x54\x36\xd7\xb3\x7f\x33\x00\x97\xb2\x8c\xb2\x86\xd1\x01\x12\xd8\xad\x50\x07\x13\x4c\xaa\x15\x00\xea\x4d\xa6\xe9\x00\x50\x63\xe5\xed\x41\x80\xc9\x2e\xa5\x24\x4b\xad\x21\xc2\x84\x63\xeb\xf3\x9c\x15\x1b\x3c\x87\x0b\x63\x00\xb8\xcd\x19\x03\xbd\x7e\xc3\x19\xb7\x3e\x74\x13\x73\x6c\x55\x29\x63\x97\x80\x49\xd8\x93\xa3\xe7\x32\x00\xb8\x69\xf9\x38\x0a\x6b\xeb\x52\xcf\xf5\x60\x60\xfd\x00\x05\x01\x02\x6d\xc6\x5c\x23\x1a\x67\x60\x65\xbd\x1b\x69\x84\xef\x5f\xc3\x3e\x54\x1a\xcf\x48\xf4\x83\xe6\x63\x3f\xd3\xdc\xc6\x31\xe1\x5e\x4d\x68\x60\x51\x9d\xda\x2b\xbd\xda\x90\x7e\xa5\xad\x11\x0d\x1e\xdf\xae\xbe\x34\xa4\x15\x0d\x80\xec\x13\x76\x9f\x25\xeb\xf6\x03\x3d\x82\xbc\x8b\xfa\x64\xde\x3d\x7a\x5e\x12\x65\xc9\x19\x08\x36\xc7\x3b\xb4\x1c\x3a\x2e\x29\x95\x60\xd6\x04\xa7\x74\x93\x78\x6f\x9b\x84\x74\x6c\x3a\x7d\xb6\x63\xde\x04\xb6\x46\x67\x75\xdf\x35\xde\x47\xb4\x6b\x8a\xba\xe1\xa9\x09\x19\xaf\x82\x72\xbd\xfd\x0f\x6d\xe8\x3a\xfd\x87\xbb\xfb\x6b\xc9\x82\x71\x13\x33\xd1\x8c\x23\x77\x0d\x66\x4d\xd3\x54\x0f\x4c\x6b\xd1\xb5\xcd\x57\x5b\xb3\x30\x56\xae\x0d\x95\xcd\xe4\xf0\x59\x35\xe9\x80\xd3\xb8\xd9\xda\x61\x86\xfe\xb3\x94\x0a\xe1\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x39\x25\x5e\x6b\x8a\xcb\xc5\x52\x5c\x4f\x66\x4b\x53\x82\x52\xba\x5a\x11\xe7\x16\x5f\x12\x54\x60\x81\x73\xa2\xc0\x8d\x62\x50\x0b\x5d\x78\x99\x9f\x18\xf8\x0a\x61\xd7\xeb\xb6\x8a\x80\x9b\x19\x1f\x2d\x55\x28\xa7\xeb\x8d\x91\x75\x10\x46\x19\x67\x6b\x88\xe8\xd3\x53\xc8\x38\xf6\x9d\x44\x60\x0e\x5c\xa0\x47\x2c\x72\x84\x51\x82\x93\x0d\x58\x09\x31\x43\x69\x29\x20\xc1\x53\x11\x9c\xee\xe6\x52\x69\x3d\x5b\x4b\x47\x60\x4a\x33\x18\xf0\x7a\xa1\x3b\x9d\x30\x00\x5f\xd4\x44\x22\xeb\xbb\xa4\x3a\x26\xd6\x57\xe0\x84\x83\x26\xf9\x79\xa0\xb7\x0e\xd8\x94\xd2\xbf\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\xef\xde\x9c\x52\xfa\x3b\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\x3f\x3c\x53\x4a\xff\xf8\xb9\x4d\x29\xfd\x53\x4a\xff\x94\xd2\xdf\x78\xa6\x94\xfe\xce\x28\x53\x4a\xff\xb7\x91\xac\x37\xa5\xf4\xbb\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xc8\x85\x96\x52\x4f\xaa\x65\x4c\xd6\x81\x35\xe0\x37\x62\x15\x97\xe5\x6a\xa5\x35\x54\xee\xbd\xac\xf5\x88\x1d\x4b\x74\x95\xfb\x56\x39\xba\xac\x35\x59\x12\x35\x83\xb4\x06\x13\xa6\x33\x0e\xa8\x0d\xa4\x84\xb4\x46\x41\x24\xa4\x01\x30\x74\xf9\xf9\xc3\xa2\x91\xf4\xe0\x35\x65\x7a\x53\x21\x86\x62\x8e\x61\x36\x9f\x59\x12\xe3\x94\xac\x11\xdb\x17\x09\x6a\xf1\x9b\x64\x5c\x9a\x98\x02\x00\xed\x73\x4d\x6d\x30\x63\xc4\x49\x1d\x54\x81\xac\xbc\x24\x84\x21\x5e\x10\x66\xfc\x50\xae\x2d\x03\xc2\x4a\xe1\x64\xb3\xd0\xe3\xb3\x20\x54\x97\x1d\x5a\x8d\xae\x59\x2f\xc1\xb9\x41\xae\x20\x39\xa6\x66\x00\x84\x13\xc1\xa5\x44\x79\x99\x29\x5a\x54\x43\xf8\x76\x8c\x40\x0c\x90\x89\xcc\xaa\x10\x06\x8e\x05\x62\x4c\xf1\x10\xd3\x6f\x37\x56\xba\x25\x70\x36\x18\x78\x0d\xb2\xd1\x0c\x12\xda\xf3\x42\xed\x8c\xcb\xd5\x38\x9e\xa8\x90\x0a\x25\x19\x85\xeb\x1f\x66\x67\x72\x42\x61\x94\x59\xc0\xa9\xaf\x20\x57\x14\xd6\x2a\xed\x62\x59\x0a\xb7\x46\xa1\xa4\x71\x34\xd6\xc3\xd8\x01\x52\x2a\xed\x1d\x2d\x7d\x9e\x09\xec\x7a\x87\x98\xcd\x76\x6b\x85\xed\x4e\x61\x08\x37\xa6\xfd\xa9\x31\xc8\x00\x16\x20\xe5\xc9\x2a\x4a\xf5\xa1\x82\x14\x63\x97\xe7\x33\x6b\xf5\x19\x29\xaa\x64\x39\xb5\xc1\xfe\x4a\x0b\xee\x20\xda\xd9\x02\x11\x30\xb2\xd5\x34\x4b\x12\xa2\x45\x68\xdc\x39\x61\x66\xb8\x83\x8e\x92\x22\x22\xa7\x0c\xdc\xb2\x9f\x88\x94\x78\x4d\x6e\xbc\x06\x1e\x9f\xd8\x04\x36\x9e\x1a\xd5\x40\x08\x19\xc8\x50\xf5\x2f\xb5\x4b\xec\xc4\xc7\x10\x1a\x53\x41\xb9\x99\x4b\x15\x03\xf8\x28\xa8\xd2\x3a\x15\x95\x26\x97\x0e\xec\x9a\xfb\x01\x97\x7e\xd0\x4d\x27\xdc\x27\x07\xba\x06\xa9\xf9\x3b\x4b\x8d\xe3\x6a\x49\xd0\x52\x50\xb2\x42\x2b\xca\x70\x66\x3d\x50\x3e\xfa\x82\x1c\x11\x6c\x04\x6a\x29\xb5\x68\xca\x99\x73\xac\xb8\x35\x2c\xd0\x8f\x76\x11\x4a\x94\x2c\xc1\x83\x39\xcb\x8c\xa7\x04\xd1\x15\x5a\x83\xb7\x4b\x18\x87\xfa\x1f\xde\xfe\xd7\x3f\xa2\xe5\x4e\xdf\x88\x60\xa8\x54\x5c\xe1\xac\x42\x53\x46\xd8\x5a\xef\x01\x30\x08\xdf\x59\xc8\xb2\x66\xfa\xa5\xc3\x2c\xd4\x55\x31\x4b\x7f\xf7\xbb\x87\x65\xfb\x4a\x3f\x4d\xc9\xf6\xb4\xb1\x2f\xf3\x8c\x7b\xe3\x52\xba\xcd\x70\xfa\x2f\xdf\x01\xf1\xb2\x87\x20\xa1\xf8\x42\x04\x49\xba\xe4\x27\xb4\xe1\x8f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x83\xa6\x62\xc0\x53\x69\x6f\x87\x56\x38\x63\xef\xc9\x01\x45\xdf\x02\xf6\xf3\xba\xe6\x0d\x6f\x5c\x9c\x6e\x7a\xdc\xc6\x43\x59\x25\xb7\xca\x7d\x2a\x05\x59\xa0\x0f\x38\xcb\x96\x38\x79\xb8\xe7\x1f\xf9\x5a\x7e\x66\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\x0f\xed\x56\x0b\x19\x5f\x6b\x39\xae\x28\x95\x8b\x58\x69\xac\xca\x03\xd8\xcd\x14\xce\x78\x75\x09\x60\xdb\xcb\xa6\x86\x4d\x9e\x80\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xef\xde\xfe\xe1\x4f\x86\xf4\xb5\x76\xf1\xa7\xb7\xe0\xfc\x97\x33\xc3\x5c\x34\x67\xf4\x73\x68\x99\xe3\x2c\xd3\x8a\x44\x93\xa8\xf5\xb6\x2e\x62\x7b\x37\x0d\x51\xab\x8a\x21\xcc\x68\xe1\xee\xfe\xfe\x6f\x01\xc9\x8e\x2a\x49\xb2\xd5\xcc\xc4\xde\x55\xf9\xb6\x27\x70\x51\x9c\x58\xde\xa5\x6f\xf5\xee\xd5\x70\x98\x98\xb5\xe5\x59\x99\x93\x0b\x02\x4d\x57\x22\x96\xd9\x7a\xdf\x45\x6c\x64\xb6\x3f\xda\x32\xe3\xc9\x03\x4a\xed\x1f\x61\xb2\x9e\x65\x82\xd7\xca\x86\xf4\x34\x74\xc1\x2a\x0a\x08\x02\xf0\x5c\x24\xcf\x73\x3b\x6e\x35\xe7\xdc\xf2\xb7\xe5\xb8\x28\xa0\xd1\xd8\x0a\x12\x84\x1e\xcd\x02\x02\x3a\x16\x40\xb0\x9d\x74\xf0\x71\xba\x6f\x19\xa0\xfe\x0b\xb9\x67\x3d\xf5\x27\x6e\x03\x0a\xf8\x6f\x13\x2f\x32\x22\xb5\x0e\xd5\x61\x7b\xd5\xda\xcc\x8d\xa1\x31\x03\x27\xf3\xd9\x7d\x78\x46\xf5\x3d\x02\xb3\x42\xa3\xd3\x53\x33\x5e\x19\xa3\x82\x08\x09\xcd\xe1\xd4\x17\xd8\xd1\xf3\x0c\xd3\x50\x46\x17\x42\x75\xc3\xa3\xe7\x2d\x63\xb8\x03\x4f\xbd\x27\xde\x57\x02\xde\xbe\x67\xf6\xe6\x31\x04\x0e\xc9\xf8\x31\x67\xf8\x86\xa7\xf6\x13\x38\xa4\xa6\x70\x41\x8f\xa8\x25\x23\x72\xdf\x8f\xde\x1e\xef\x4b\xbd\x96\xf6\x59\xd5\xbf\x54\x87\xd5\xbc\x65\x8f\xa2\x77\x6f\x8f\x74\x44\x61\xe8\x51\x27\x14\xce\x66\xa3\xe3\x56\x7d\x1f\xb4\x44\x68\xb3\x09\x41\x0a\xae\x45\x19\x2b\x13\x2f\x90\xb1\x69\x6b\xac\x5b\xb0\xe8\xe4\xfd\xc9\xb3\xcf\xa9\x59\xa4\xe0\x05\x5e\x0f\x94\x8e\xda\x5b\xeb\xfe\x87\x28\x25\x46\xc0\x20\x12\x84\x34\xf8\x3b\xb8\x8d\x82\x0b\x2d\x2c\x04\xd7\xd9\xc9\xf9\xf8\xac\x99\xd6\xa1\xcf\x8a\x20\x26\x38\xf8\x31\xe8\xc5\x46\x08\x0b\x5e\xb2\xd4\xea\xe7\x95\x21\xe4\xd3\xde\x84\xaf\x39\x03\x21\xc7\xe4\x20\x05\xc2\x56\xcd\xd3\x8a\x11\xd7\x1c\xe6\xdd\xe2\xdd\xdb\x5f\x96\x4d\xde\xef\x35\xc4\xd3\x18\xb9\xae\xd8\xa4\x39\x1b\xcf\x9e\x91\x2b\xb0\x11\x3d\xab\x4f\x56\x69\xab\xeb\x67\x50\x57\x55\x00\x7e\xd2\xca\x18\x89\x2a\x85\x87\xd0\x6b\x10\x69\xb4\x2c\xd8\xc8\x4a\x78\x33\xaa\x0c\x4c\x5c\x5a\xbb\xd6\xef\x96\xcf\x3a\xdb\xe6\x10\x1b\xa2\xed\xd3\x85\xc3\xd4\x64\xbf\xee\x39\xe6\xad\x2e\x72\xaf\xd0\x6b\xf3\xe6\x89\x84\x58\xd4\x37\xcf\xde\x5e\xbb\xec\xcb\xa7\x22\x98\x47\xd9\x5a\xfa\xe5\x53\x81\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x19\x3f\x0e\xfe\x42\x36\x78\x4b\x20\x4e\x96\x66\x58\x78\x33\x09\x2c\x5c\x8e\xee\xcc\xaa\xa0\xd9\x2d\x61\x5b\x2a\x38\x03\x3f\xd5\x16\x0b\x0a\x39\x45\xd0\x8a\x90\x30\x2d\x9f\xfe\xf6\xf5\x97\xb3\x5b\xf0\x0f\x84\xb3\xdd\x4c\xee\x81\x5d\x79\x29\x21\x06\x61\x6f\x05\x8d\xa1\xea\x8d\x1b\x9a\x6b\xcf\xa6\xba\xf9\xeb\x5d\x01\x5e\xe7\xd6\xa3\xe7\x90\x97\xaa\xc4\xfe\x6c\x0a\xf3\x90\xa7\x24\x2b\x25\xdd\x3e\xf7\xfc\x0f\x4b\x3c\xd5\xad\xf8\x15\x04\x1e\x1b\xd2\x7d\x41\x3d\xb4\xdb\xdf\x70\xf7\x44\x76\x63\xc1\xc1\xac\xc7\xb8\x1a\xee\x7a\xda\x6b\x5c\x3e\x91\x55\x6d\x9c\x66\x2a\xab\x55\x5c\x6d\xca\x85\x57\x0b\xaa\xea\x42\xa6\x5d\xb3\x3b\xe4\x67\x1d\x47\x85\xf5\xef\xa5\x67\x8f\x02\xbb\xe3\xdb\x17\xc2\x56\x5c\x24\x24\xd5\xd7\x90\x2c\x70\x42\x3e\xe2\x65\xb7\x0a\x40\x9b\x9b\xf4\x7e\xe2\x20\x49\xa8\x37\x0b\x4e\x6b\xe6\x5e\x30\xf9\xda\x9d\xe9\xf2\x15\xe2\x82\xae\x29\xab\x6b\x36\xe0\x8c\x08\x93\x30\x9c\x13\x25\x68\x52\xd5\x67\x85\x34\xb9\xc4\xc4\x98\x1b\x2b\x5b\x3f\x4c\xe3\xd6\x6a\xfa\x3e\x96\xa4\x52\x47\xcc\x64\xac\xa2\x65\xd0\x54\x0d\x00\x5d\xaf\xab\x11\x7a\xb1\xd7\xb3\x4d\x44\x8f\x07\xd2\xc8\x15\x53\x44\x6c\x71\x18\x75\xee\x25\x2d\x83\x3c\x12\xc2\x5a\xe1\x17\x35\xac\x4e\xdc\xaa\x7f\x7c\xdb\x9e\xf8\x46\x90\x15\x7d\x0a\x8e\x7d\xdf\xec\x66\xfc\xc3\xed\x47\x40\xc2\xfd\x06\x33\x2e\xd1\x6d\x99\x41\x19\x39\xa9\x30\xb0\xd8\xaa\xef\xf6\x16\xd3\x4c\xf3\xdf\x0e\x9e\x4b\x96\x36\x15\x7f\x46\x12\x22\x25\x16\x3b\xcd\x20\xd7\x84\x11\x81\x95\x3e\x15\x42\x1f\x57\x3d\x9a\xec\x79\xb7\x03\x94\xae\xf6\x26\xe4\xdc\x60\xa2\x6a\x1c\x0a\x09\x1d\x20\x2e\x5d\x5c\xdf\x99\x26\xb6\xb1\xb8\x5a\x8b\x22\xb9\x83\xb8\xc6\xfb\x4c\x9e\xc3\x11\x0e\x22\xec\xe4\xfb\xdb\x9b\x73\xfb\xc1\xc7\x3b\xf3\x41\x7d\xf4\x8d\x02\xbf\xbe\xbd\x39\xb7\xc1\x92\xa1\x5b\xd4\xae\xea\x7f\x96\x44\x50\x22\xac\x27\x41\x90\x84\x0b\x7d\x37\x89\x32\x23\xe0\x47\x59\xa0\x6b\xae\xc8\x7b\x74\x5e\x0a\x41\x98\x82\xcc\xa1\xac\xdf\x1c\x7d\x7e\xf6\x81\x66\x64\x86\xce\x89\x50\xe6\xbf\xf4\xa1\xf9\x2b\xd9\x81\x61\x14\x64\x5d\x13\xf2\x55\xc5\x80\x2c\xd0\x27\x5c\x54\x69\xa7\x27\x27\xf3\xb9\x46\xc8\xdc\x4c\x7e\xae\x32\x39\xff\xff\x9d\x74\xad\xc2\xe7\x1f\xaf\x10\x16\x6b\xd9\x31\x18\x87\x14\xb0\x04\xf7\xb1\xf7\x76\xa8\xa0\x2a\x93\x4a\x11\x72\x57\xf3\xf9\x19\x4a\x88\x50\xcd\x00\x42\xb0\x7b\x62\xb1\x26\xaa\x37\x98\x7b\x48\x0d\x34\xdb\xf5\x09\x7b\xeb\xb1\xed\xdf\x38\xe6\xed\xe6\xc4\xc0\xc1\x15\x3f\xa3\x98\x59\xe9\xe7\x81\xc4\x4b\xe8\xfa\xe8\x3e\x90\x9d\x89\x8f\xcf\x48\x12\x0c\xa0\x3c\xbe\xda\x72\x72\xdd\x88\x1a\xb1\x82\x98\x1a\x1d\x41\xc8\xb7\x44\x6c\x29\x79\x3c\xb5\x77\xf9\x5c\xcb\xa1\x73\xc3\x85\xe5\x29\xb0\xe7\xd3\xef\xe0\x7f\x82\x82\x92\x89\x64\x3a\x4b\x53\xab\x4b\x96\x92\xac\xca\xcc\x52\xfc\x02\xe1\x82\x7e\x21\x42\x52\xce\x66\xe8\x81\xb2\x74\x86\x4a\x9a\xfe\x8f\x50\xb8\x4f\x14\xbe\xb8\x73\xa8\xc5\xe2\xec\x0e\xc4\x92\x5d\x55\x7f\x19\xc8\xbb\x22\x2f\x2e\xa0\x9c\xb2\xde\xd3\xc1\xb6\xdd\x4b\x28\xe3\x47\x59\x30\xe6\x33\xaa\x12\xd8\xa0\x68\xf8\x40\x7c\x42\xea\xa0\xdc\x27\x49\x22\xfc\x81\x6f\x6d\xd4\xc0\xab\xdf\xe8\x11\xb3\x54\x6e\x96\x53\x1f\x38\x60\xee\xd6\x84\x33\xb4\x5b\xae\xa7\xbe\x85\xf1\x40\x82\xc9\x6c\xd3\x71\xfd\x56\x8f\xab\xa5\xd3\x7f\xb7\xb3\x1a\xfc\x73\x82\xb5\xfc\x30\x78\x7b\x3b\x6f\x6a\xf3\xd2\xb6\x9a\xd0\x8d\xe0\xb9\xc6\x61\xd9\xf4\xa6\x79\xa2\x7d\x23\xcf\x7b\x70\xcb\xf5\xd8\x11\xd2\x86\xe8\x11\x37\x6c\xac\x0a\xcc\x1e\x3c\xa6\x93\xc0\x31\x09\x1c\x9d\xe7\x5f\x98\x83\x4d\x02\xc7\x24\x70\x74\x9e\xe9\xb8\x7e\xab\xc7\xf5\x57\x29\x70\x58\xfb\xc5\x28\x91\xa3\x73\x71\x07\x64\x8f\xde\x39\x3f\x57\xe8\xa0\x60\xb5\x13\xe4\xee\x81\x16\x5f\x88\xa0\xab\xde\x73\xdf\x9a\xff\x85\xa9\x32\x65\x87\x84\xb9\xd3\x95\x09\x89\xab\x0b\x59\xfb\x27\xe2\xdb\xbd\x07\x63\xf1\x39\x04\x7d\x9a\xc0\xbe\x0a\xf6\x1e\xc8\xee\xce\xcb\xbd\x07\x38\x77\xdf\xfc\x8f\x20\xb6\x05\x38\xf7\xa1\x5c\x3b\x54\x78\x2c\x9e\x63\x0f\x72\x9f\x10\xa7\xfe\x36\xb9\xf4\x51\x39\xf4\x20\x7e\x86\x38\xf3\x81\x5c\x79\x98\xf3\x0e\x71\xdd\x10\xc7\xf5\x71\xdb\x20\x2b\x35\x96\x5c\x5f\xd1\xc3\xfd\xb2\xba\x10\xbe\xb9\x05\xde\x55\xc5\x6c\x40\xc8\xd6\xf3\x4e\xb7\x77\x86\xe0\x17\x1b\x70\x50\x80\x91\x7c\xcf\x95\x86\x7e\xb8\xfd\x18\x6d\xe2\x87\x2f\x6e\xca\x2c\x33\x9b\xd6\x39\xec\xed\xe6\x4f\xac\x22\x8e\x2a\x12\xb2\xe1\x66\x86\x43\x0d\x50\x1c\x83\x94\x1a\x3d\x95\x1f\xa9\x83\x97\x86\x3c\x59\x94\x59\x66\xb8\x15\x2c\x09\xa6\x65\x53\x07\x04\x59\x53\x3d\x73\x22\x91\x24\xa6\x4a\x4d\xff\x91\x2b\x25\x11\xf3\x75\x49\x53\x72\x6a\xbe\xff\xce\xb8\x3a\x77\xfa\xd4\xc1\x2f\x7a\x14\x3b\xc5\x39\x67\x73\x3c\xef\xc6\xcb\x79\xe2\xb7\xda\x75\xbc\x79\x82\xb3\xcf\xb0\x63\xb7\x6e\xf9\x6e\x17\x24\x22\x8c\x97\xeb\x0d\x70\x08\x91\x63\x57\x70\x2c\xeb\x6d\x1d\xb2\xe3\x25\xb2\xf1\xb2\x0d\x26\x93\x90\xd4\x39\xdb\x6c\xa8\x63\x17\x99\x5d\x2a\x0b\x73\x6c\x3f\xd7\xfb\x16\x79\xde\x11\x39\x5e\x90\xdf\x1d\xe0\xff\xa5\x8c\xaa\xca\xd1\x1e\x3e\x2f\x27\x57\xad\x77\x5d\xcd\x1d\xeb\xee\x6d\x03\x6a\xa4\xdb\xf6\x10\xdf\x0a\xea\x10\x98\x62\x83\x5c\x12\x68\x3c\xd8\xa8\xac\x48\x16\xeb\x05\x5a\x11\x95\x6c\xaa\x13\xa8\x0f\x15\x65\x7a\x5d\x7d\xc1\xef\x55\x0c\xa4\x61\x21\xc6\x79\xd8\x6a\xa2\x69\xce\x5e\xe5\xfe\xb4\x1d\x34\x17\xe8\x8c\xed\x4c\xf4\x7b\x77\xeb\x6c\x99\x44\x28\xfb\x0a\x95\xec\x34\x18\xbe\x82\x66\x9f\xcd\xb5\x1a\x67\x69\x46\xb0\x29\xca\xed\x32\x8f\x10\xef\xf6\x9d\xb0\x25\x2b\x9f\x5b\x7c\x41\x0f\x5f\x77\xa3\x94\xdd\x4e\x97\x3f\xc8\x9e\x1d\x81\x6e\xa9\x6c\x07\x3c\x2a\xc1\xd2\xc5\xe2\x41\x76\x97\x95\x43\x00\xe7\xf0\x69\x17\x1d\x84\x29\x2a\x48\xb6\x43\xbc\x54\xf5\x21\x4e\xb8\xe9\xa4\xf5\xe8\xe2\x91\x73\x4c\xdb\x69\x2c\xd6\xff\xd8\x9b\x5f\xb6\xdc\xa1\x94\x43\x65\x32\x3e\x03\xe6\x61\x92\xca\x5c\x74\x33\x78\xe5\x37\x78\x4b\x79\x29\x4c\x29\x57\x41\xf0\x03\xc2\x0a\xd6\xd1\xdb\xc7\x46\x9f\x4c\x5e\x42\x94\x25\x4d\x48\xc7\x69\x19\xc3\x0e\xcf\xaa\x2c\xc1\xa2\xc8\xb4\x80\x4e\x9b\x79\x77\x66\x6e\x7a\xae\xae\xfa\x96\x6b\x67\xda\x1b\xcf\x8a\xf5\x09\x18\xcb\xdc\xb0\x58\x47\x75\x99\x3e\x13\xeb\x32\x87\x94\x17\x4b\xfe\x75\x79\x62\xdb\x9b\x8c\x27\x0f\xee\x1e\xf5\x27\x60\x9d\x7f\xba\x70\x61\x94\x26\xd3\xa4\x4e\x40\xb5\x35\x4e\xd3\x05\xfa\x72\x50\x20\xd6\x60\x08\xd6\x7e\x0c\xd6\xd5\x0a\x64\x63\x33\x96\x07\x68\x5d\x85\x54\x10\xc9\xb3\xad\xab\x68\x5f\xcd\xcc\xdd\xd7\x94\x15\xa5\xb2\xbc\xd2\x85\x34\x78\x60\x96\x2c\xd9\x60\xb6\x76\xb1\x25\x8d\x95\x21\xb9\x63\x0a\x3f\x39\x1e\x45\x64\x82\x8b\x2a\x75\x06\xa5\xbc\xf4\x4f\xf4\xb7\xbf\x9d\x21\x4a\xde\xa3\xdf\x36\xc0\x2d\xd0\xa5\x85\xd0\x40\x64\x23\x91\x70\x59\x23\xcc\x17\xd0\x24\xc8\x1a\x8b\x34\x83\x9c\xfd\x55\x4b\x54\xad\xa2\xe5\xc8\x13\x95\x0a\x52\x72\x18\x57\x8d\x60\x24\xdf\xea\xc7\x35\x18\x37\xcd\x71\x0d\x3b\x9e\xa7\x58\xe1\x79\xe3\xa8\x9c\x1a\xa9\x78\x6e\x6b\x69\xce\xb1\x25\xd2\x46\xfb\xdc\xef\x6c\xe3\xd1\x39\xae\xde\xa2\x5a\x7c\x81\xda\x93\xfd\xd7\x5e\x30\x0e\x7d\x50\x07\x08\x07\xa5\x05\x0b\x9f\xb6\x4f\xdc\x65\xdd\x09\x09\xa0\x41\xc0\x46\x5d\xe0\xb8\xca\x30\xb1\x55\x34\xef\xbd\x79\x84\x7b\x27\x13\x5d\x5e\xdf\xdf\xfe\xed\xe6\xf3\xd5\xf5\xfd\xe0\x51\xf4\x40\x1c\x38\xa0\x31\x47\xd1\x03\xd9\x7f\x40\x87\x8f\xa2\x07\x64\xe0\x80\x0e\x1f\x45\x3f\x5b\xf0\x1e\xd0\xe8\xa3\xe8\x81\xed\x39\xa0\xf1\x47\xd1\x03\xb7\x73\x40\x7f\xe5\x47\x91\xb0\x6d\xc4\x31\xfc\x68\x95\xb5\xbe\x40\xe1\xfd\x22\x92\x83\x89\x24\x47\x4f\x84\xb9\x64\xdb\x2f\x58\xd4\x2d\x6a\x21\x03\xb9\x37\xa6\xd9\xbe\xe0\x35\x94\x00\x2b\x39\x3f\x46\x26\xcc\x28\x73\x7e\x53\x67\xea\x9b\x77\x5d\x9c\x29\xd4\x54\x1c\xa1\xf3\x9f\xae\x2e\x2e\xaf\xef\xaf\x3e\x5c\x5d\xde\x3e\xdb\x21\x31\x58\x36\xb2\xcd\xa8\xc7\x70\xc3\xe0\x22\x6a\x4e\x59\x08\xa2\x25\x51\xe9\xcc\x3e\x1e\xf2\xa3\xc3\x65\x74\xda\x69\x31\x5a\x96\x95\x5a\xc1\x4c\xfa\xd1\x6d\xaa\x44\x84\x51\x1d\xcf\x90\x5b\xac\x37\x08\x73\x2c\x5b\xb6\x0c\x38\x08\xf3\x45\x98\xb3\x79\x0e\x67\xd1\xe1\x19\xb7\x25\xa9\x76\x72\x47\xb0\x8c\x54\x3c\x59\x7f\x10\x3c\xd0\x00\x77\xdf\x44\x09\xaa\x6b\x65\xa5\xeb\xa3\x98\x13\x69\xe0\x86\xcb\x27\x35\x18\x9f\x15\x37\xaa\x92\x40\xfa\x77\x48\x1d\x0f\x41\x88\x2d\x47\x5b\x45\x44\xfc\x95\xec\x6e\xc9\x40\x35\xac\x8e\xfd\x3f\x23\x89\xe6\xa0\xce\xe8\x8e\x6b\x9f\xf6\x50\x11\xc9\x31\xe5\x72\x07\x1c\xb7\xbd\x73\x1b\x15\x23\xe1\x9e\x51\xa5\x72\x0f\x2a\xe2\xfb\x8d\x98\xbc\xda\xcf\x58\x03\x58\x14\xd0\x21\xc7\xad\x7b\x46\xe1\x3c\xc6\x91\xeb\x9e\xd1\xf1\x17\x51\xcb\x8a\xf7\x30\x74\x17\x39\x94\x33\x67\x9e\xf8\x42\xc7\x7e\x9f\x6f\x7b\xdc\x88\x0a\xc6\xb0\xd7\x63\xcf\xff\x49\xcd\x00\x4c\xfa\x66\x55\xba\x2e\x7d\xef\x2c\x4b\xb2\x6a\x86\xb4\xd0\x04\x39\x4c\x3b\xad\xd7\xc1\xfa\x3c\xab\x7f\x83\xac\x12\xd9\xf8\x01\xb8\xa4\xc9\xca\x18\x06\x2d\x0b\x92\x2c\x18\x4f\x89\x3e\x84\x33\xf3\x4f\x7b\xb7\x9f\x25\x09\x2f\x99\xb2\x7f\x80\xc2\x22\x8b\x0d\x97\xea\xea\x26\x02\xac\x79\xbd\xe0\xe9\xd5\xcd\xac\xf5\xaf\x6e\x5c\xfe\xfe\x33\x86\x0d\xd6\xe7\x70\x34\xf9\xdb\xef\x2a\xc7\x68\xb2\x21\x39\x86\xff\xfc\xa0\x37\x2e\x90\x6f\xd6\x7e\xa8\xac\x8b\xff\x30\xa8\x78\xa2\xef\xed\x76\xb9\xfc\x57\xdb\x77\xaf\x8e\xce\x6c\x57\x6e\x9a\xa3\x97\x0e\xae\x75\xd7\xde\x05\xa8\xb4\xf6\x07\x47\x48\x83\xee\xa9\xbb\x62\x9d\xdd\x5c\xa1\xad\xc1\xe7\x91\x97\x19\x7f\xf2\x57\x91\xbb\x16\x7d\xfe\xb5\x3c\xaa\x25\x97\x0f\xcf\xe4\x03\x0e\x4e\xa7\x5e\xc6\x7b\x48\x96\x19\xc4\x97\xfb\xde\x96\xb1\x91\xb6\xd2\x18\xb4\x1a\x90\xe8\xb5\xf9\x71\x91\x14\xe5\xcc\xbe\xb0\xc8\x49\xce\xc5\x6e\xf8\x94\xda\xd7\x49\xb1\x21\x39\x11\x38\x9b\x4b\xc5\x05\x5e\x43\x1a\xb5\x01\x6f\xc0\x56\xff\x32\x80\x87\x4f\x65\x63\x82\x5d\xe8\x46\x97\x49\xaa\x8c\xa1\x3a\xdf\xe7\x98\x9c\xa1\xc2\xf2\x70\x4f\x3d\xf3\xb4\xb7\xaf\x76\x96\x80\x4c\x53\xd1\x21\x88\xb1\xb6\xa4\x45\xdc\xa5\x5f\x79\x6c\x21\x65\x90\x6d\xb5\xd0\x1b\xa8\x24\x59\x3f\xa3\x98\x41\x4a\xb7\x54\xf2\x81\x46\xb5\x3d\x0b\xbd\x6b\x75\x20\xb1\x15\x93\x8c\xe3\x34\xae\x75\xa3\x79\xc8\x53\x01\x15\xef\x2a\x5a\xdd\xe3\x7f\xef\x5e\x1d\x7b\xc1\x6e\xa4\xf1\x5b\x7b\xeb\x58\x4a\x7d\x32\x2b\xf6\x77\xe4\x7d\x89\xe7\x5e\x6e\x2a\xc7\x62\x5e\xc6\x3f\x76\x1c\x05\xc6\xfa\xda\xea\x12\x37\x03\x95\x06\x90\xd5\x04\xfa\x83\x0e\xda\xcf\x2f\xa5\xf3\x3c\x37\x68\xd5\x3d\xa3\x83\x57\xdd\x33\xe9\x51\xbf\x26\x3d\xaa\x13\x82\x15\xb5\xae\x7f\x3b\x25\x2a\xe2\xb5\xe1\x30\xde\x97\x2b\xee\x40\xd8\xd6\x6f\xc9\xea\x35\xe0\x3b\x49\xac\x51\x97\xb1\xdf\x04\x1a\x76\x23\xb5\x0a\xd1\x01\x83\xaa\x8d\xb4\xb5\x4b\xce\xdc\x4d\xf9\x80\xe9\xba\x65\xb4\x46\x67\xd0\x8b\xcf\x30\x28\x00\xeb\xac\xa1\x82\xd8\xc2\xfa\xa6\xc0\x28\xd9\xfa\xed\xf8\xd0\xc6\x73\xaf\x46\x84\x6d\xe3\x41\xd9\xda\x16\x39\x32\xf7\x83\x35\x36\x52\x56\xd5\x11\xf6\xc0\xac\xc4\x02\x55\x35\xd5\xc5\x52\xf2\x04\x7a\x7b\xd4\x7d\x6c\xa1\xb4\xa4\x5d\x38\xcc\x5c\xe1\x07\x1f\xc8\x66\x4f\xdd\x2f\x1a\x62\x8d\xc3\xe5\x0e\xea\xda\xb2\x6d\x65\xb7\x2d\x8d\x8f\xc9\x5c\x06\x81\x06\xac\xd0\xb4\xb4\x09\xf9\x25\xbc\x2d\x9a\xe8\xac\x55\xb4\xe1\x74\x81\xfb\xa9\xd2\x14\x30\xf8\x84\x7a\x42\x72\xdc\x53\x99\x6a\x7c\xb4\x16\x73\xb5\x56\xa6\xce\x01\x31\xa1\x73\xa7\xd6\x86\xa2\xf6\x5d\x7a\x04\xf3\x6b\xcc\xe5\xf7\x6d\x5f\x7c\x47\xcf\xe8\x40\x63\x2e\xb3\xd8\x8b\x6c\x84\x31\x70\xdc\xc5\x14\x7b\x29\x45\x5d\x22\x45\x6f\x9d\x10\xef\x3a\x9a\x21\xb2\x14\xda\xc9\xaf\x28\xa4\x73\x6a\x40\x05\x61\x26\x5c\x0f\x27\x9b\xc1\x4b\xce\xb2\xea\xda\x7a\x5f\x3b\x11\x8f\xeb\x28\x34\x72\xe4\xd8\x03\x78\xd7\x27\xc9\x4e\xa7\xef\xdf\xe7\xf4\xd9\x0d\xfe\x6a\x47\xef\x99\xb2\x55\x6f\xf4\x7c\xcf\xd2\x4f\x2e\x1a\x81\x45\xa6\x3c\xce\x58\xda\x69\x04\x96\x9a\xb8\x73\xcf\x8a\xda\x8d\xf7\x2b\x36\xa1\xb8\x09\x0c\x46\x1b\xba\xd6\xc8\x37\xcd\xf8\xcd\xcd\x88\x72\xcc\xf0\x1a\x3a\x10\xf9\xd0\xc4\xab\xba\x5c\x5c\x20\x4d\xc6\x82\xa6\x9d\xf2\x5a\x20\x22\xb9\xa0\x58\xf8\xa3\xe0\x59\xe6\x6f\x78\x9a\xd1\x07\x82\x2e\x48\x91\xf1\x5d\x6e\x23\x32\x52\x74\xa7\xb0\xd2\xa4\x7c\x47\x94\xcf\x8a\x3e\x40\xa6\x55\xb6\x41\x74\x15\xf4\x93\x2b\xd8\x97\xa2\xcc\x32\x54\xc0\x47\x0b\xe8\x14\xce\x57\xe8\x0c\xaa\x55\xcd\xd0\x35\xd9\x12\x31\x43\x57\xab\x6b\xae\x6e\x8c\x30\xe3\xe3\x89\x4d\x67\xb4\xf9\x1c\xd1\x15\x7a\xaf\xc5\x68\xa9\x90\x32\xdd\x0e\x1a\xcd\xf9\xb9\x68\x81\xf5\x40\xad\x0a\x3d\x3e\x23\x2c\xc9\x4f\x4c\xdf\x01\xa4\x2a\x85\xc1\x63\xba\x1b\x40\x7c\xd5\x53\x26\x02\xe5\x67\xb6\x8b\xb6\xaa\x23\x94\x1d\x0d\x22\x53\x22\xd7\x15\x30\x04\x61\xd5\x5b\x95\x56\x10\x59\x70\x26\x49\xbb\xae\x69\xdd\x1d\x0b\x54\x00\x19\x2d\xe1\x0e\x5f\x20\x05\x97\x0a\xba\xe6\xc7\x36\x0f\xba\x71\x1f\x40\x1b\x0d\x9c\x65\x24\x45\x34\xcf\x49\xaa\xb5\x82\x6c\x67\x5b\xa3\xe0\xa8\x0a\xd3\x1a\x82\x2b\xb6\x76\x65\x2e\xa3\x0d\x66\x69\x46\x04\x54\xbc\xb7\x9a\x47\x4b\xa3\x71\xd5\xe9\x83\x5c\xd5\xd8\xb2\x6d\x6b\x0e\x84\x93\x84\x8b\xd4\x36\x87\xd4\xaa\xbd\x8b\x9d\xaf\xce\x06\xf0\xef\x41\xae\x81\x4c\x31\xb9\xf6\x94\xa0\x26\xb8\x6c\x74\x0d\xd9\x70\xfe\x80\x12\x9e\x17\x19\xd0\xea\xf1\xba\x1e\x35\x88\xbc\xee\x71\x54\x51\xc6\x1c\x7a\xb2\x9d\x36\xda\x1f\xc1\x0f\xcf\xed\xa4\x46\x9e\x48\x12\xbe\x15\x5b\xd4\xa1\xb9\x8c\x46\x3e\x14\x14\xe3\xac\x12\x31\x56\x5c\x33\x6b\x88\xc1\x87\x53\x30\x70\x23\x2e\x49\xcd\x50\x16\xe8\xf2\x89\x24\x7b\x5d\xb7\x6d\xef\x3a\xc5\xe1\x38\x85\x4d\x79\xf1\xd6\xca\x60\x88\xae\x77\xcd\xe7\xe6\x2b\x57\x6c\xdd\x02\x81\x16\x05\xa6\x0d\x3e\x84\xed\x46\xd8\x85\x1a\x69\x4b\xd5\x2e\x9a\x13\xd0\xa9\x4b\x19\x68\x11\xd0\x7c\x9a\xf3\x81\x76\x35\x9c\x2b\xf4\xfa\xe4\xf4\xe4\x4d\xc7\xa8\x11\x55\xce\xbb\xf9\xdc\x37\x60\x53\xa8\xc1\x5a\x64\x3b\x58\xed\x49\x3a\x43\x54\xb9\x08\x1f\x51\x32\xbb\xb2\x08\xa0\x36\xa6\x79\x86\x24\x47\x4a\xe0\x94\xda\xeb\x1e\x7e\x85\xca\x81\xa2\xb4\x9c\xf6\xf5\xc9\x3f\x4f\x62\x2c\x8f\x44\x25\x6f\xd0\x23\x67\x27\x0a\xd0\xb8\x40\xf7\x26\x81\xae\x1a\x6a\xc7\x4b\xc4\x88\xcd\x09\x7a\x2a\x32\x9a\x50\x15\xe1\xe1\x43\xc0\xfc\x10\x2f\x4d\x2b\x25\xcd\xf7\x6d\x3c\xf6\xe5\x13\x55\xae\xa9\x07\x5f\xa1\xb7\xa6\xbf\x13\x19\xe0\x59\x15\x0a\x24\xf4\xa1\x3c\xdd\x10\x9c\xa9\x8d\x69\xab\xc1\x38\x9b\xff\x83\x08\x0e\x51\xdb\xcc\xfe\x65\x78\x93\xa2\x3a\x8f\xa3\xb1\x36\xd7\xb8\x26\xd1\xd1\xe6\xc6\xc1\x26\xfc\xe8\x85\x1a\xf1\xa3\x51\xbc\x61\xb8\xa5\x64\x77\x9e\x11\x4d\xf9\x23\x0f\xf1\x8b\x34\xe6\x47\xb1\xcd\xf9\xd1\x38\x12\x89\x6e\xd2\x8f\x0e\x6a\xd4\x1f\xb1\x2a\x68\x2e\x7e\x50\xb3\x7e\x34\xe6\xd8\x8c\x6e\xda\x1f\xe5\x50\x30\x5d\x5c\xc6\x37\xee\x47\x23\x3d\x73\x68\x84\xcf\x0a\x1d\xab\x89\x3f\x1a\xcb\x6d\xd0\x98\x66\xfe\xc3\xd3\x8c\x6d\xe8\x7f\xc0\x3c\x63\x5d\x35\x28\xb6\xb9\x3f\x8a\x6e\xf0\x8f\xc6\x78\x99\xd1\x08\x1e\x1e\xd3\xec\x1f\x1d\xb9\xe1\x3f\x1a\x87\xfa\xe1\xf6\xb8\x28\xae\x45\x2e\x1a\xd9\x26\x17\x8d\x6b\x95\x8b\xfa\x13\x20\x04\x62\x55\x37\x56\xd5\x69\x97\x1b\xb1\xef\xbc\xe3\x9d\x0a\xb6\xcc\x8d\xa1\xa4\x56\x53\xdd\x03\xdb\xe6\xa2\xe7\xb4\xce\x35\x0f\x44\xf7\x45\x9c\xfb\xb6\x55\x0e\x3e\x6a\x56\x49\xb0\x37\xaf\xd5\xff\x5c\x11\x8a\x98\x6b\xa4\x69\xf9\xd0\xe4\x7b\x44\xba\x8d\x63\x16\x03\x0d\x82\xd1\x08\xa7\xee\x70\xd3\x70\x74\x68\xe3\xf0\x01\xac\x40\x5b\xf1\xf1\xcd\xc3\x07\xa1\x56\xad\xc5\x47\x35\x10\x47\x2f\x2d\xf5\x1d\xb1\x99\x38\x1a\xd9\x50\x1c\xfd\x5a\x38\x67\x44\xa3\xf1\x5f\x31\xe7\xfc\x65\x79\x4b\xc4\x4b\x85\x20\x77\x8a\x7b\x6b\x95\x76\x2c\x8c\xe6\x75\x8f\x7d\x71\x49\x56\x5c\x90\x78\x03\x63\x6d\x30\x44\x69\x09\x27\x11\x33\x88\x7d\x76\xba\x22\x6f\x9a\xfe\x82\x31\x16\xa8\xd1\xef\x55\xeb\xe8\x8c\x48\x79\x0a\xa6\xc4\xb2\xb0\x2d\xd3\x6d\xa3\xce\x99\x5e\x33\xc9\x61\x45\xb3\x98\x38\x41\xdb\x56\x14\x5e\x27\x2a\x31\x21\x26\xce\x16\x6a\x2d\x29\x0e\x19\xf1\x1d\xfc\x12\x81\xe5\xc6\x34\xcd\x24\x4f\x54\xd9\xc6\xb1\x82\x60\xc9\x4d\x37\x8c\x66\x7b\x54\x2a\x51\x81\xa5\x29\x8e\x12\xba\x49\xea\x89\x19\x70\x37\x3c\x3d\x39\x91\x2d\x50\x6b\x81\x13\xa2\x35\x70\xca\x53\x04\x09\x09\x29\x7f\x0c\xb9\xb6\x96\x64\x4d\x99\x74\x7b\x6b\xca\xc4\x19\x22\xd0\xdc\x9c\x80\x85\xc9\xe5\xbf\x2f\xd0\x6d\x95\x6c\x37\x6c\xa9\xe5\xa5\x4a\x78\xcd\x24\xec\xcc\xf7\x0d\xcb\x10\xb6\x02\x5b\x3f\xd4\x43\xa7\x22\xa7\x66\x83\xa3\x01\x14\x58\x0b\x73\x00\x6a\x83\x00\xc7\x5a\x98\x43\x28\x10\x8d\xaf\xbc\xfb\x03\x6d\xac\x71\xb2\x69\xfb\x5d\x26\x63\xf5\x64\xac\x0e\x3d\x93\xb1\x7a\x32\x56\x4f\xc6\xea\xde\x67\x32\x56\x4f\xc6\xea\xc9\x58\x3d\xfc\xed\x64\xac\x9e\x8c\xd5\x93\xb1\xba\xe7\xf9\x16\x4d\x2e\x93\xb1\x3a\xfc\xf9\x64\xac\x9e\x8c\xd5\x01\xa8\x93\xb1\xba\xf7\xfd\x5f\x03\xe7\x9c\x8c\xd5\xa1\x8f\xbf\x31\x63\xf5\xc0\x0b\xce\xea\x7b\xa3\x65\xdc\x98\x48\xec\x1b\xb0\xb1\xd1\xc4\x9a\x87\xf9\xaa\x15\xd5\x6b\x80\x2d\xea\xea\x7b\x9e\x89\xd7\xf9\x80\x2e\xa6\xd5\x1a\x81\x6b\xa3\x73\x6f\x4c\x30\xd8\xf3\x3c\x30\x0f\xae\x0b\x5d\xf0\xb4\xb6\xe4\x35\x4c\x78\x46\xee\xef\x3f\xf4\xc3\x4c\x2c\x6c\xbb\x3b\xc8\x6e\xd7\xb6\xcc\x05\x88\xe7\x19\x36\xbb\x38\xee\x1c\x65\xab\x3b\xc0\x4e\x17\x67\xab\x8a\xb5\xd1\xed\x5b\xe0\x06\xc0\x46\xdb\xe7\x9a\xd6\xb7\x01\x98\x71\xb6\x39\x9f\xe5\x6d\x48\x44\xf3\xd8\xe5\x06\xad\x6e\x03\x70\xfb\x6d\x72\x41\x8b\xdb\xd0\x4c\x7b\xed\x71\x41\x6b\xdb\x30\x62\x23\x6d\x71\x51\x06\x85\xe8\xeb\x30\x46\x77\x8b\xe0\xdc\xd6\xad\x76\xbf\x11\x44\x6e\x78\x16\x38\x49\xad\x53\xf4\x89\x32\x9a\x97\x79\xab\xff\xb9\x05\x25\x2b\x8a\x37\x3c\x34\x68\xdd\x5a\x02\x6d\x6b\xd2\x83\x6a\x32\x98\x66\x7a\x37\x20\xd1\x61\x83\xb7\xc0\x71\xca\x24\x21\x04\x6a\x98\x5f\x44\x19\xcc\x7e\xbf\xa8\x66\x57\x15\x44\x7c\xe7\xdf\x19\x53\xdd\x05\x24\x96\xdf\xff\x6e\x00\x93\x61\xa9\x66\xd0\x84\xf9\x12\xe6\xcb\x38\x36\x39\x2c\xc0\x8e\x36\x59\x46\x14\xc3\x79\x11\x73\x65\x94\xa9\x32\xf2\x14\x45\x9b\x28\xc7\x9b\x27\x61\x7f\x87\x94\x97\x43\x4c\x93\x51\x5c\x64\xb4\x49\x32\xc6\x06\x7d\x90\x39\x72\x8c\x29\xf2\xa0\x3a\x2f\x87\x9a\x20\x47\xe9\x1d\xd1\xa6\xc7\xe3\x98\x1d\x5f\xa4\xa6\x52\x04\x5e\xe2\xcc\x8c\xd1\x26\xc6\x38\xf3\xe2\xb0\x69\xf1\x98\x66\xc5\x48\xd4\x0e\x2b\xc5\x11\x0a\xf1\x18\x65\x78\x84\x22\x3c\xda\x7c\x68\x91\x34\xb0\xad\xb1\x0a\xf0\x9e\x7a\x3b\x00\xf5\x30\xe5\xf7\x19\x8a\x6f\x8c\xb9\xf0\x45\x4c\x85\xe3\xcc\x84\x51\xbb\x3d\x7c\xb8\x07\xd4\xf7\x88\xa3\x0a\xad\x9c\x70\x76\x41\x32\xbc\xbb\x23\x09\x67\x69\x80\x53\xef\x95\x3a\xa8\x68\x4e\x9a\x0f\xad\xe4\xd6\x8e\xb2\xd9\x60\x5b\x2d\x27\xe8\xf7\xb6\x01\x4a\x4e\x73\xb7\x97\x0b\xd4\x46\x34\x33\x3c\x24\x7b\xf9\x08\xfa\x35\x3a\xaa\x88\x68\x02\x83\xc6\xa1\xf9\x3f\xf8\x23\xe2\x2b\x45\x18\x7a\x4d\x99\xc3\xf4\x9b\x86\x70\x58\xcb\xda\x21\x92\xb3\xe4\xa9\xbf\x7b\xf7\xd6\x81\xf9\x5a\xa2\x32\x08\xf5\x52\x1e\x43\xeb\xb0\xa0\x9e\xa3\x76\x58\x10\xab\x32\x6b\xab\x1e\x46\x1d\x89\xd5\x3b\xde\xd5\x25\x51\xde\xc1\x5c\x2a\x5a\xd6\xda\xa4\x0d\x66\xec\x22\x3c\x08\xf1\x17\xd8\x8a\x08\x97\xc0\x41\xee\x00\x63\xf0\x1f\xb8\x62\x47\xb9\x02\x9a\xc6\xfe\x00\xdc\x31\x6e\x80\x17\xd1\x9e\x8e\x68\xfa\x1f\x63\xf6\xff\xb7\x93\x6c\x22\xcc\xfb\xbf\x22\xc9\xe6\x97\x90\x05\x14\xcd\x09\x2f\xd5\x91\xc4\x80\xc7\x0d\x4d\x36\x4d\x8e\x4c\xc3\xf5\x8a\x78\xb9\xd7\xa0\xe3\x9d\x05\xd8\x7b\x4b\x1d\x2f\xa2\xf6\x1b\x93\x12\x06\xf6\x29\xb2\x73\x6a\xb3\x0c\x55\x2d\x8b\xd5\x35\xca\xb1\x44\x18\x5d\x5c\xdf\xfd\xf4\xf1\xec\x2f\x97\x1f\x17\xe8\x12\x27\xbe\x52\xe1\x8d\x2a\x21\xcc\x34\x44\x34\xb4\xbf\xc1\x5b\x82\x30\x2a\x19\xfd\x7b\x69\x6a\x15\xa1\xd7\x15\xc4\x37\xce\x6b\xe2\x01\x3a\x54\x5f\x65\x80\x67\x40\xe3\x80\x11\x95\x2a\x4d\xa3\x01\x63\x46\xe6\x5a\xcc\x17\x3c\xdf\x77\xfb\x5d\xea\x3f\xf9\x59\x14\x36\xbc\x67\x43\x04\x41\x6b\xba\xb5\x06\x3b\x5b\x82\x06\xa7\x55\x90\x6a\xb3\xd3\x2e\x5e\x82\x99\xda\xcb\xa1\x18\x51\x9a\xfa\x2a\x8d\x83\x33\xd9\xcc\xbf\xd0\x1a\x89\x9c\xa1\x65\x09\xa6\xfa\x42\xd0\x1c\x0b\x9a\xed\x9a\x43\xe0\xcc\xc7\x6f\xae\xb9\xbb\xa1\x77\xe6\x3a\xae\xa7\x7f\xf1\xf9\xf2\x0e\x5d\x7f\xbe\x87\x9e\x48\xfa\x66\x05\x2b\x3a\xfc\x1d\x10\xb3\x24\x7e\x34\xd8\xda\xd6\xa6\xf5\x2a\x7c\x62\xce\x39\x95\xd0\x84\x99\x40\x97\x77\xab\x95\xbb\x52\x50\xaf\xde\x2e\xe0\xff\x7c\x65\xaf\x71\x9a\x0a\xcd\xcd\x2b\x27\xc4\x5e\xfe\x80\xe6\xb2\xc0\xef\xe9\x32\x6b\xec\x9d\xc5\xde\x2f\xd6\x19\xac\x72\x26\xde\xe8\x65\x37\x1b\x84\x55\x1b\x09\x08\x31\xf5\x4a\xa1\x09\xa9\x97\x0f\x0c\xf6\x35\x8b\xac\x57\x59\x4f\x28\xba\x5e\x5e\xcd\xaf\xdd\x65\x6a\x0f\x05\x6f\x94\xb4\x46\x57\x37\x6e\x5b\xc2\x17\x1a\x94\x11\xab\xee\x42\x5b\x0c\x1a\x00\x1b\x93\xc4\x0c\xbd\x45\x7f\x46\x4f\xe8\xcf\x70\xb5\xfe\x31\x04\x2c\x8e\x83\xc6\x89\xb5\x46\x6a\xbb\xba\x89\xc6\xca\x8f\xfa\x08\xe8\x6f\xf4\xca\x15\x47\x4b\xca\x52\xd3\xa1\xc9\x35\x1d\xb6\xd8\x7a\x76\x85\x43\x3d\xc8\x51\x37\x0c\xac\x13\xe8\x6a\xd5\xa8\x15\x16\x96\x14\x47\x6e\x99\x06\xad\x25\xd9\x6b\x43\xe4\x61\xf3\x74\xab\x62\x59\x3d\x52\x8e\x55\xb2\x69\x9f\x20\x7d\x85\x4b\x55\x13\x71\x58\x18\x4e\x39\x68\x08\xc6\x1d\xb8\xa1\x41\xaa\x3c\x2e\x21\x8d\x6a\xbe\xd7\xda\x85\x3d\x4c\xef\x09\x8a\x03\x42\x78\xea\x6e\xd6\x46\x3a\x54\xc1\x53\x73\x55\xc3\xa4\xd2\x06\xbb\x71\xb7\x72\x10\x68\xf7\xc6\xb6\x21\x2a\x95\xea\x0c\xf4\xa5\x4f\x82\xed\xc6\x09\x15\x2c\xc5\x40\xc6\x82\x3e\x2d\x55\x0f\xbc\xe0\xc6\x44\x9d\x8f\x42\x70\xc5\x13\x1e\xac\x19\xd9\x36\x09\xdb\x0f\x4c\xeb\x7e\x43\x59\x16\xe7\x3f\x5c\xdc\xcc\xb4\x46\x08\xc5\xf3\xee\xce\x87\xac\x72\xad\xf6\x70\xf7\xe7\x37\xc1\x36\x35\x11\x8b\x19\x2e\xe7\xdd\x62\xe1\x3e\xb1\xfc\x79\xb5\x27\x05\xc1\x29\x3d\x5a\x6c\x8d\x6b\x75\x58\x41\x1d\x13\x64\x93\xf3\x2d\x49\xcd\x05\x5e\xb7\x4c\x4c\xa1\x21\xaf\x0c\x44\xde\x0c\xcb\x90\x5f\xc1\x32\x38\x45\xde\x4c\x91\x37\x53\xe4\xcd\x14\x79\x13\x78\x67\x8a\xbc\x99\x22\x6f\xa6\xc8\x9b\x5e\xb4\x4c\x91\x37\x53\xe4\xcd\x14\x79\xd3\x78\x69\x8a\xbc\xb1\x93\xfa\x97\xf1\x4f\x4d\x91\x37\xed\x67\x8a\xbc\xe9\x8c\x32\x45\xde\x7c\x1b\x3e\xb5\x29\xf2\xc6\x3d\x53\xe4\xcd\x14\x79\x33\x45\xde\x4c\x91\x37\x7b\xcf\x14\x79\x33\x45\xde\x4c\x91\x37\xe1\x7d\xaa\xba\x79\xc7\xb8\x50\xce\x79\x5e\x94\x8a\xa0\xdb\xaa\x5d\x7d\xd5\x33\x7d\xb9\x33\x7e\xc1\xc6\xe1\x78\x29\x37\x87\x69\xdb\x55\x0a\x08\x15\x39\x35\xb5\x10\xe7\x89\x99\xda\xbc\x5a\xcf\xbc\x9a\xc9\xe9\xa1\xae\x0e\xd3\x3b\xdf\x4f\x0f\x75\x7c\xcc\x4d\x14\xe3\x8f\x62\x5c\x6d\x8c\x7f\x84\x29\x34\x0c\x2d\xa6\x59\xd4\x13\x90\x2f\xce\x79\x69\x4a\x40\xda\xd5\x07\xc6\xae\xf0\x62\xcc\x44\x5f\x0f\xed\x28\xbe\x67\x30\x91\x5f\x19\xfb\xb7\x76\x12\xfb\xf8\xb7\xec\xe3\x30\xfc\xbb\x23\x03\x11\x08\xd5\x08\x54\x22\x9e\x53\xa5\xe5\x14\x2d\xec\x35\xa2\x85\x42\x5e\x0d\xaa\x5a\x36\x54\x4b\x2d\xe0\x73\xc4\xca\x54\x41\xad\xdc\x1c\xcd\x9e\x6b\xae\x9b\x5a\x08\x5d\x50\xf9\xb6\x92\x96\x60\xd7\xe7\xae\xf9\x2e\x30\xce\x6f\x9a\x82\x06\x5e\xd0\xf2\xbe\xa0\x6a\x77\xce\x99\x22\x4f\x1e\x09\xa6\x4d\x0c\x77\xf6\x13\xdb\x55\x50\x56\xa2\x94\x75\x62\x8a\x92\x41\x54\x43\xc4\x55\x12\x83\x2c\xd3\x6d\xec\xd4\x4d\x14\xb0\x42\x9e\xd4\xa9\x07\x64\xdc\x56\x28\x2c\x1f\xea\x7d\x20\x73\x7d\x39\xd5\xe8\xee\x8c\x75\x28\xe3\x04\x16\x73\x23\xe8\x96\x66\x64\x4d\x2e\x65\x82\x33\xd8\xf3\x58\x11\xe0\xcc\xf3\xbd\xeb\xaa\x28\xab\x2e\x9a\xbe\x8e\xd9\x76\x9e\x20\xd4\x25\x98\xa1\x35\xa6\x0c\xe5\x1a\x47\x85\x03\x0b\xdd\xf7\x18\x74\x78\x2b\xb0\xd0\x0a\x81\xfd\x20\x24\x71\x41\x60\xd8\x92\xf3\xcc\x7a\x64\xb3\x5d\x3d\x27\xeb\xea\x67\xfc\x27\x46\x1e\x7f\xd2\xe3\x48\xb4\xca\xf0\x3a\xd4\x8b\x1a\xd9\x8a\xb0\x44\x75\x4a\xb6\x54\xd3\x41\x3e\x74\x84\x18\x83\x04\xf1\x0f\x61\xd3\x81\xb1\xb7\xdd\xf7\x7b\xf4\xee\x0d\x50\x2d\x96\xa8\x82\x1e\x32\xaa\xfc\xee\x0d\x58\x5f\xce\xcf\x6e\x7e\xba\xfb\xdb\xdd\x4f\x67\x17\x9f\xae\xae\x87\x8e\x68\xb8\x4f\x69\x82\x0b\xbc\xa4\x19\x0d\xf3\xee\x8e\x15\xbc\xf9\x19\x30\xaa\x34\x3d\x4d\x05\x2f\xcc\x3a\x45\xc9\x20\x5e\xb3\x8e\xc1\x8a\x30\x64\x38\x1f\x54\x15\xde\x69\x5a\x73\xb7\x87\x5a\x0b\xcc\x94\x13\x76\x86\xea\x73\x1b\x34\x8b\x92\x69\x41\xf5\xb9\x1e\x37\x9c\x8e\x09\x4a\x38\x4b\x53\x92\xb6\xa6\x7e\x64\x1f\xd0\xb9\x03\xbd\xab\x23\x46\xd1\xcd\xe7\xbb\xab\xff\x15\x3f\x2a\xb2\x34\x12\xe5\x1e\x38\x92\x07\x1b\x21\x4d\x26\x23\x30\x79\x6b\xa3\x7b\x26\x5c\x7a\xde\x19\xa8\xe4\xef\xb8\x4a\xe4\xe1\xbe\x2d\x59\x3b\x32\xbf\x86\x80\x72\x9e\x92\x05\xba\x31\x4c\x11\xba\xed\x06\x79\x7f\xf5\x5d\xcd\x06\xc0\xfc\xab\x3f\x66\x8a\xe2\x2c\xdb\x21\x2d\x89\x6d\x71\x46\x8c\x0b\x59\x70\xaf\xb6\x82\xea\x92\x5a\x26\x2e\xb5\xc9\x35\x56\x38\x93\x81\x03\x1e\xc3\x07\x35\xab\xff\xa4\x85\xc9\x48\x3c\x55\xef\xa3\x94\x30\xae\xac\x5c\xaa\x47\x82\x80\x5a\xc1\x13\x64\x64\x53\xe3\x86\x08\xac\xaa\x0e\x27\xaa\x98\x25\xb0\x58\xc7\x06\xa9\x74\x6b\xbd\xa9\xc6\x04\x4d\x3c\x00\xb3\x94\x44\xee\xdd\x36\x96\x0d\xd6\xd2\xaa\x1e\x57\x10\x9c\x42\x6c\x58\x81\xd5\x06\xec\x9a\x01\xa0\x39\x96\x0f\x24\x35\xaf\x2e\xcc\x3d\x6c\x25\x69\x69\x3b\x00\xd8\xe9\xdd\x6b\x2c\xac\x08\x56\xa5\x20\x70\xff\x86\x85\xdc\x25\x41\x84\xe1\x65\x16\x8a\x3c\x8b\x0a\x8a\xc4\xe9\x67\x96\xed\x6e\x39\x57\x1f\xaa\x90\xaa\xc8\xed\xfc\xb1\xea\x09\xde\xd4\xa0\xe1\xb2\x05\x23\x65\x3a\x07\x34\x41\x20\x57\x5c\x25\xf3\x8b\x7a\xfb\x8e\x40\x9e\xa2\x64\x67\xf2\x7b\xc1\xcb\xd8\xa6\x1c\x9a\x82\xbe\xbf\xba\x80\x53\x55\x9a\x73\x43\x98\x12\x3b\x08\x8a\xec\x64\xf0\x0c\xcb\x70\x0b\xf4\x83\xa6\xa9\x3d\x2a\xd2\x12\x57\xc9\x24\x51\x0b\xf4\x09\xef\x10\xce\x24\xb7\xc2\x54\x48\x32\x62\xe8\x06\x7c\x26\x4d\xf9\x7f\x81\x20\xc6\xd9\xc4\x5d\x2c\xb9\xda\xa0\xbd\x17\x06\x88\xb3\x0b\xd1\x84\xef\x19\x03\x53\x9d\xa0\x44\xd9\x3e\xe0\x10\x71\xe2\x07\x22\x51\x21\x48\x42\x52\xc2\x92\xc0\x1e\x36\x6c\x45\x7f\xfc\xc3\xb3\xcc\xf7\xb0\xd3\xd7\x9c\x69\x32\x8e\xdc\xeb\x2b\x96\xd2\x04\x1b\x1e\x64\xbb\x59\xd7\x24\x0c\x56\x4d\x2b\x63\x62\x88\x81\x1b\xe0\xb2\xa5\x24\xc2\x74\x77\x16\x25\x31\x48\xfc\x6b\xb9\x24\x19\x51\x26\xe2\x16\xe2\xfa\xb1\x32\xad\x04\x4c\x43\x79\xac\x1c\x61\x84\x4f\x3a\x61\xb2\x84\x76\x21\x5a\x35\x56\x28\xe5\xa4\x8e\x57\xc4\x12\xfd\x70\x75\x81\xde\xa2\xd7\x7a\x7e\x6f\xc0\xc7\xb2\xc2\x34\x24\xb6\x2b\x6e\xbc\x30\xfb\x72\xf5\xca\x01\x87\x65\x00\x7d\x22\x2e\xcc\x31\x9c\x21\x16\xf2\xf9\x40\xb7\x18\xbb\x42\xad\xee\xb8\x18\x63\xeb\x99\x03\xa3\x4d\x9b\xd0\x03\xe4\x1c\x1a\x27\x4c\xe8\x3e\x72\x0e\x40\x1c\x26\xf4\x11\xe4\x1c\xcd\x92\x7e\x90\x44\x8c\xe0\x48\x3f\x1c\x95\x23\x35\x45\x00\x4d\xb5\xed\xd5\x1b\xd2\xcc\x89\xc2\x29\x56\x18\xd1\xd0\x76\x94\xac\xd1\x11\xe4\xd7\xb0\xc1\xc7\xe3\x57\x92\x7c\xa4\xac\x7c\x32\x2e\xb2\x31\x2a\xe4\xdd\x25\x7c\x88\x12\x37\x79\x40\x38\x2e\x8a\x8c\x9a\x00\xe1\x76\x1e\x65\x00\x33\xe6\x90\x37\xd3\x63\xfa\x04\x1f\x38\xca\x38\xcb\xb8\x66\x95\xfa\x56\xc7\x2c\xe5\x79\x00\xec\xfe\x04\xb5\xc0\x44\x70\xb2\x69\x5a\xd8\x7b\x88\x65\xd4\x25\xf5\x2f\x7e\xed\xc5\xa9\xce\x19\xd9\x92\x60\xda\xcd\x7e\x76\xad\x7e\x5f\x0b\x4e\x6e\x07\x00\x00\xca\xf0\x92\x64\xe6\xf2\x30\x54\x12\xe9\x6c\x8d\xa2\xa1\x68\xd5\x4c\xf0\x6c\x4c\x30\xd2\x2d\xcf\xc0\xbf\x85\xab\xc5\x68\x00\xdf\xc8\x5a\xe0\xb5\xf8\xb5\x80\x5c\xdf\x5a\x0b\xe8\x3b\xdf\xc6\x5a\xca\xe0\x4d\xd4\x59\x8b\xbe\xb8\xda\x6b\x81\x1b\xe4\x5b\x58\x4b\x84\x5a\xff\x48\x59\xca\x1f\xe5\x78\xa6\xfb\xa3\xf9\xd0\x71\x86\x44\xb3\x1e\x45\xd9\x5a\x36\x19\x2f\x0e\x1a\x4b\x9b\x7a\x6a\x1f\xe7\x75\xc6\xf9\x2a\x9f\xba\xcb\xa3\x02\xd0\x9d\xc0\x55\x4a\xeb\x9f\x39\xe0\x22\x0d\x51\x7c\x14\x6f\x3c\x3a\x07\x5c\xe7\x12\x9f\x0b\x0d\x4b\x51\x9c\xdd\x15\xa3\xda\x9e\x7d\xff\xe9\xee\xac\xfd\xb1\x26\xdc\x47\x48\xb9\xd7\xeb\xd1\x7f\x47\x38\xcd\xa9\x94\x61\x93\x34\xe0\x97\x2c\xa1\x1d\xdd\x6b\xe7\xa3\x58\x53\xb5\x29\x97\x8b\x84\xe7\x0d\x77\xc5\x5c\xd2\xb5\x3c\xb5\x54\x36\xd7\xb3\x7f\x33\x00\x97\xb2\x8c\xb2\x86\xd1\x01\x12\xd8\xad\x50\x07\x13\x4c\xaa\x15\x00\xea\x4d\xa6\xe9\x00\x50\x63\xe5\xed\x41\x80\xc9\x2e\xa5\x24\x4b\xad\x21\xc2\x84\x63\xeb\xf3\x9c\x15\x1b\x3c\x87\x0b\x63\x00\xb8\xcd\x19\x03\xbd\x7e\xc3\x19\xb7\x3e\x74\x13\x73\x6c\x55\x29\x63\x97\x80\x49\xd8\x93\xa3\xe7\x32\x00\xb8\x69\xf9\x38\x0a\x6b\xeb\x52\xcf\xf5\x60\x60\xfd\x00\x05\x01\x02\x6d\xc6\x5c\x23\x1a\x67\x60\x65\xbd\x1b\x69\x84\xef\x5f\xc3\x3e\x54\x1a\xcf\x48\xf4\x83\xe6\x63\x3f\xd3\xdc\xc6\x31\xe1\x5e\x4d\x68\x60\x51\x9d\xda\x2b\xbd\xda\x90\x7e\xa5\xad\x11\x0d\x1e\xdf\xae\xbe\x34\xa4\x15\x0d\x80\xec\x13\x76\x9f\x25\xeb\xf6\x03\x3d\x82\xbc\x8b\xfa\x64\xde\x3d\x7a\x5e\x12\x65\xc9\x19\x08\x36\xc7\x3b\xb4\x1c\x3a\x2e\x29\x95\x60\xd6\x04\xa7\x74\x93\x78\x6f\x9b\x84\x74\x6c\x3a\x7d\xb6\x63\xde\x04\xb6\x46\x67\x75\xdf\x35\xde\x47\xb4\x6b\x8a\xba\xe1\xa9\x09\x19\xaf\x82\x72\xbd\xfd\x0f\x6d\xe8\x3a\xfd\x87\xbb\xfb\x6b\xc9\x82\x71\x13\x33\xd1\x8c\x23\x77\x0d\x66\x4d\xd3\x54\x0f\x4c\x6b\xd1\xb5\xcd\x57\x5b\xb3\x30\x56\xae\x0d\x95\xcd\xe4\xf0\x59\x35\xe9\x80\xd3\xb8\xd9\xda\x61\x86\xfe\xb3\x94\x0a\xe1\xca\xfd\xdc\xea\x39\x51\xc5\x1c\x03\x39\x25\x5e\x6b\x8a\xcb\xc5\x52\x5c\x4f\x66\x4b\x53\x82\x52\xba\x5a\x11\xe7\x16\x5f\x12\x54\x60\x81\x73\xa2\xc0\x8d\x62\x50\x0b\x5d\x78\x99\x9f\x18\xf8\x0a\x61\xd7\xeb\xb6\x8a\x80\x9b\x19\x1f\x2d\x55\x28\xa7\xeb\x8d\x91\x75\x10\x46\x19\x67\x6b\x88\xe8\xd3\x53\xc8\x38\xf6\x9d\x44\x60\x0e\x5c\xa0\x47\x2c\x72\x84\x51\x82\x93\x0d\x58\x09\x31\x43\x69\x29\x20\xc1\x53\x11\x9c\xee\xe6\x52\x69\x3d\x5b\x4b\x47\x60\x4a\x33\x18\xf0\x7a\xa1\x3b\x9d\x30\x00\x5f\xd4\x44\x22\xeb\xbb\xa4\x3a\x26\xd6\x57\xe0\x84\x83\x26\xf9\x79\xa0\xb7\x0e\xd8\x94\xd2\xbf\xf7\x4c\x29\xfd\x53\x4a\xff\x94\xd2\xef\xde\x9c\x52\xfa\x3b\xcf\x94\xd2\x3f\xa5\xf4\x4f\x29\xfd\x53\x4a\x3f\x3c\x53\x4a\xff\xf8\xb9\x4d\x29\xfd\x53\x4a\xff\x94\xd2\xdf\x78\xa6\x94\xfe\xce\x28\x53\x4a\xff\xb7\x91\xac\x37\xa5\xf4\xbb\x67\x4a\xe9\x9f\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xef\x99\x52\xfa\xa7\x94\xfe\x29\xa5\x7f\xc8\x85\x96\x52\x4f\xaa\x65\x4c\xd6\x81\x35\xe0\x37\x62\x15\x97\xe5\x6a\xa5\x35\x54\xee\xbd\xac\xf5\x88\x1d\x4b\x74\x95\xfb\x56\x39\xba\xac\x35\x59\x12\x35\x83\xb4\x06\x13\xa6\x33\x0e\xa8\x0d\xa4\x84\xb4\x46\x41\x24\xa4\x01\x30\x74\xf9\xf9\xc3\xa2\x91\xf4\xe0\x35\x65\x7a\x53\x21\x86\x62\x8e\x61\x36\x9f\x59\x12\xe3\x94\xac\x11\xdb\x17\x09\x6a\xf1\x9b\x64\x5c\x9a\x98\x02\x00\xed\x73\x4d\x6d\x30\x63\xc4\x49\x1d\x54\x81\xac\xbc\x24\x84\x21\x5e\x10\x66\xfc\x50\xae\x2d\x03\xc2\x4a\xe1\x64\xb3\xd0\xe3\xb3\x20\x54\x97\x1d\x5a\x8d\xae\x59\x2f\xc1\xb9\x41\xae\x20\x39\xa6\x66\x00\x84\x13\xc1\xa5\x44\x79\x99\x29\x5a\x54\x43\xf8\x76\x8c\x40\x0c\x90\x89\xcc\xaa\x10\x06\x8e\x05\x62\x4c\xf1\x10\xd3\x6f\x37\x56\xba\x25\x70\x36\x18\x78\x0d\xb2\xd1\x0c\x12\xda\xf3\x42\xed\x8c\xcb\xd5\x38\x9e\xa8\x90\x0a\x25\x19\x85\xeb\x1f\x66\x67\x72\x42\x61\x94\x59\xc0\xa9\xaf\x20\x57\x14\xd6\x2a\xed\x62\x59\x0a\xb7\x46\xa1\xa4\x71\x34\xd6\xc3\xd8\x01\x52\x2a\xed\x1d\x2d\x7d\x9e\x09\xec\x7a\x87\x98\xcd\x76\x6b\x85\xed\x4e\x61\x08\x37\xa6\xfd\xa9\x31\xc8\x00\x16\x20\xe5\xc9\x2a\x4a\xf5\xa1\x82\x14\x63\x97\xe7\x33\x6b\xf5\x19\x29\xaa\x64\x39\xb5\xc1\xfe\x4a\x0b\xee\x20\xda\xd9\x02\x11\x30\xb2\xd5\x34\x4b\x12\xa2\x45\x68\xdc\x39\x61\x66\xb8\x83\x8e\x92\x22\x22\xa7\x0c\xdc\xb2\x9f\x88\x94\x78\x4d\x6e\xbc\x06\x1e\x9f\xd8\x04\x36\x9e\x1a\xd5\x40\x08\x19\xc8\x50\xf5\x2f\xb5\x4b\xec\xc4\xc7\x10\x1a\x53\x41\xb9\x99\x4b\x15\x03\xf8\x28\xa8\xd2\x3a\x15\x95\x26\x97\x0e\xec\x9a\xfb\x01\x97\x7e\xd0\x4d\x27\xdc\x27\x07\xba\x06\xa9\xf9\x3b\x4b\x8d\xe3\x6a\x49\xd0\x52\x50\xb2\x42\x2b\xca\x70\x66\x3d\x50\x3e\xfa\x82\x1c\x11\x6c\x04\x6a\x29\xb5\x68\xca\x99\x73\xac\xb8\x35\x2c\xd0\x8f\x76\x11\x4a\x94\x2c\xc1\x83\x39\xcb\x8c\xa7\x04\xd1\x15\x5a\x83\xb7\x4b\x18\x87\xfa\x1f\xde\xfe\xd7\x3f\xa2\xe5\x4e\xdf\x88\x60\xa8\x54\x5c\xe1\xac\x42\x53\x46\xd8\x5a\xef\x01\x30\x08\xdf\x59\xc8\xb2\x66\xfa\xa5\xc3\x2c\xd4\x55\x31\x4b\x7f\xf7\xbb\x87\x65\xfb\x4a\x3f\x4d\xc9\xf6\xb4\xb1\x2f\xf3\x8c\x7b\xe3\x52\xba\xcd\x70\xfa\x2f\xdf\x01\xf1\xb2\x87\x20\xa1\xf8\x42\x04\x49\xba\xe4\x27\xb4\xe1\x8f\x26\x07\xb3\x87\xa2\x6a\x97\x78\xc1\x8b\x32\xf3\x77\xed\x41\xe8\x83\xa6\x62\xc0\x53\x69\x6f\x87\x56\x38\x63\xef\xc9\x01\x45\xdf\x02\xf6\xf3\xba\xe6\x0d\x6f\x5c\x9c\x6e\x7a\xdc\xc6\x43\x59\x25\xb7\xca\x7d\x2a\x05\x59\xa0\x0f\x38\xcb\x96\x38\x79\xb8\xe7\x1f\xf9\x5a\x7e\x66\x97\x42\x78\xc5\x80\xd6\xbc\x33\xac\xf9\xf2\xa6\x64\x0f\xed\x56\x0b\x19\x5f\x6b\x39\xae\x28\x95\x8b\x58\x69\xac\xca\x03\xd8\xcd\x14\xce\x78\x75\x09\x60\xdb\xcb\xa6\x86\x4d\x9e\x80\xae\x20\xe0\x09\x33\x44\xf4\x5c\x7d\x98\xd6\x14\xdd\x9c\x8b\x6c\x92\xe5\xef\xde\xfe\xe1\x4f\x86\xf4\xb5\x76\xf1\xa7\xb7\xe0\xfc\x97\x33\xc3\x5c\x34\x67\xf4\x73\x68\x99\xe3\x2c\xd3\x8a\x44\x93\xa8\xf5\xb6\x2e\x62\x7b\x37\x0d\x51\xab\x8a\x21\xcc\x68\xe1\xee\xfe\xfe\x6f\x01\xc9\x8e\x2a\x49\xb2\xd5\xcc\xc4\xde\x55\xf9\xb6\x27\x70\x51\x9c\x58\xde\xa5\x6f\xf5\xee\xd5\x70\x98\x98\xb5\xe5\x59\x99\x93\x0b\x02\x4d\x57\x22\x96\xd9\x7a\xdf\x45\x6c\x64\xb6\x3f\xda\x32\xe3\xc9\x03\x4a\xed\x1f\x61\xb2\x9e\x65\x82\xd7\xca\x86\xf4\x34\x74\xc1\x2a\x0a\x08\x02\xf0\x5c\x24\xcf\x73\x3b\x6e\x35\xe7\xdc\xf2\xb7\xe5\xb8\x28\xa0\xd1\xd8\x0a\x12\x84\x1e\xcd\x02\x02\x3a\x16\x40\xb0\x9d\x74\xf0\x71\xba\x6f\x19\xa0\xfe\x0b\xb9\x67\x3d\xf5\x27\x6e\x03\x0a\xf8\x6f\x13\x2f\x32\x22\xb5\x0e\xd5\x61\x7b\xd5\xda\xcc\x8d\xa1\x31\x03\x27\xf3\xd9\x7d\x78\x46\xf5\x3d\x02\xb3\x42\xa3\xd3\x53\x33\x5e\x19\xa3\x82\x08\x09\xcd\xe1\xd4\x17\xd8\xd1\xf3\x0c\xd3\x50\x46\x17\x42\x75\xc3\xa3\xe7\x2d\x63\xb8\x03\x4f\xbd\x27\xde\x57\x02\xde\xbe\x67\xf6\xe6\x31\x04\x0e\xc9\xf8\x31\x67\xf8\x86\xa7\xf6\x13\x38\xa4\xa6\x70\x41\x8f\xa8\x25\x23\x72\xdf\x8f\xde\x1e\xef\x4b\xbd\x96\xf6\x59\xd5\xbf\x54\x87\xd5\xbc\x65\x8f\xa2\x77\x6f\x8f\x74\x44\x61\xe8\x51\x27\x14\xce\x66\xa3\xe3\x56\x7d\x1f\xb4\x44\x68\xb3\x09\x41\x0a\xae\x45\x19\x2b\x13\x2f\x90\xb1\x69\x6b\xac\x5b\xb0\xe8\xe4\xfd\xc9\xb3\xcf\xa9\x59\xa4\xe0\x05\x5e\x0f\x94\x8e\xda\x5b\xeb\xfe\x87\x28\x25\x46\xc0\x20\x12\x84\x34\xf8\x3b\xb8\x8d\x82\x0b\x2d\x2c\x04\xd7\xd9\xc9\xf9\xf8\xac\x99\xd6\xa1\xcf\x8a\x20\x26\x38\xf8\x31\xe8\xc5\x46\x08\x0b\x5e\xb2\xd4\xea\xe7\x95\x21\xe4\xd3\xde\x84\xaf\x39\x03\x21\xc7\xe4\x20\x05\xc2\x56\xcd\xd3\x8a\x11\xd7\x1c\xe6\xdd\xe2\xdd\xdb\x5f\x96\x4d\xde\xef\x35\xc4\xd3\x18\xb9\xae\xd8\xa4\x39\x1b\xcf\x9e\x91\x2b\xb0\x11\x3d\xab\x4f\x56\x69\xab\xeb\x67\x50\x57\x55\x00\x7e\xd2\xca\x18\x89\x2a\x85\x87\xd0\x6b\x10\x69\xb4\x2c\xd8\xc8\x4a\x78\x33\xaa\x0c\x4c\x5c\x5a\xbb\xd6\xef\x96\xcf\x3a\xdb\xe6\x10\x1b\xa2\xed\xd3\x85\xc3\xd4\x64\xbf\xee\x39\xe6\xad\x2e\x72\xaf\xd0\x6b\xf3\xe6\x89\x84\x58\xd4\x37\xcf\xde\x5e\xbb\xec\xcb\xa7\x22\x98\x47\xd9\x5a\xfa\xe5\x53\x81\x41\x87\x2e\x86\x70\x30\x20\x74\xb4\x6f\x19\x3f\x0e\xfe\x42\x36\x78\x4b\x20\x4e\x96\x66\x58\x78\x33\x09\x2c\x5c\x8e\xee\xcc\xaa\xa0\xd9\x2d\x61\x5b\x2a\x38\x03\x3f\xd5\x16\x0b\x0a\x39\x45\xd0\x8a\x90\x30\x2d\x9f\xfe\xf6\xf5\x97\xb3\x5b\xf0\x0f\x84\xb3\xdd\x4c\xee\x81\x5d\x79\x29\x21\x06\x61\x6f\x05\x8d\xa1\xea\x8d\x1b\x9a\x6b\xcf\xa6\xba\xf9\xeb\x5d\x01\x5e\xe7\xd6\xa3\xe7\x90\x97\xaa\xc4\xfe\x6c\x0a\xf3\x90\xa7\x24\x2b\x25\xdd\x3e\xf7\xfc\x0f\x4b\x3c\xd5\xad\xf8\x15\x04\x1e\x1b\xd2\x7d\x41\x3d\xb4\xdb\xdf\x70\xf7\x44\x76\x63\xc1\xc1\xac\xc7\xb8\x1a\xee\x7a\xda\x6b\x5c\x3e\x91\x55\x6d\x9c\x66\x2a\xab\x55\x5c\x6d\xca\x85\x57\x0b\xaa\xea\x42\xa6\x5d\xb3\x3b\xe4\x67\x1d\x47\x85\xf5\xef\xa5\x67\x8f\x02\xbb\xe3\xdb\x17\xc8\xa4\xee\xc8\x50\x71\x25\x63\x03\x93\x6f\x17\x0a\x80\x31\x6a\xac\x99\x54\x3a\xd7\x58\xd7\xe4\x72\x17\x98\x9a\x00\xd0\xfb\x0d\x66\x5c\xde\x96\x59\x9f\xec\x67\xf7\xdc\xa6\xde\xa4\x95\xf3\x17\x09\x52\x64\x34\xc1\x16\xd8\xcf\x0a\x80\xfc\x24\x34\x94\x9f\xec\xdf\x7e\xee\xcf\x14\x5a\x12\xbd\x5a\xd7\x13\xdd\x7c\xaf\x4f\xf0\x92\x40\x09\xbc\xc2\xec\x31\xce\x88\x50\x9d\x70\x52\x2f\xbe\x4d\x2f\xec\x8f\x3c\xc1\x9d\x82\x0a\x9d\x06\xe5\xf6\x3d\x94\x43\x6a\x9b\x46\x8d\x41\x01\x82\xd9\x5b\x50\x88\x33\x94\x71\x5e\x2c\x71\xf2\xd0\x25\x74\xc9\xbb\xc5\x7a\xa0\x83\x31\x5e\x63\xca\x64\x9d\xe0\x75\xd5\x09\xa5\xf2\xdf\xb5\x19\x5f\x7f\x30\x7e\xb8\xe0\x0a\xf8\xda\xba\xeb\x20\x50\xa3\xb1\x7b\xd6\xe8\xd1\x38\x2b\x50\xf4\xb5\x77\xfc\x1e\x1a\xca\xf8\xfa\x63\x5f\x41\x8a\xce\xe8\x26\xdb\xef\xb8\x83\x33\x9e\x92\x3b\x92\x01\xab\x79\xd9\xb3\x71\x01\x85\x82\x2d\xdb\xb9\xe6\xa9\x2b\xd2\xc6\x53\x13\xb1\x25\x93\x0d\x49\xcb\x0c\xbc\x3f\xd1\xe4\x67\x7e\xba\x53\x5c\xe0\x35\x39\x07\x1c\x04\xd1\xf8\xb9\xfb\x7e\x8d\x3a\x69\xc1\x21\x69\xfe\xae\x8f\x83\xc1\xf4\xfe\x7c\x42\x3a\xd9\x03\xe9\x15\x48\x3b\x41\xbe\x0f\x64\xe7\x2c\x21\x92\x24\x82\xd8\x00\x77\xbd\x15\x20\xa6\x38\x35\xaa\xee\x5d\xdd\xcb\x57\xed\xb7\x0f\xa4\x37\x91\x24\xc8\x75\x7d\x12\xfd\x9e\xa7\xbe\x11\x48\x61\x65\x13\x35\x3a\xa8\x8e\x6f\x89\xd8\x52\xf2\x78\x6a\xaf\xb7\xb9\x26\xd2\xb9\x41\xb7\x3c\xd5\x13\x91\xa7\xdf\xc1\xff\xf4\x2e\xd2\x04\xf5\x9c\xa5\xa9\x55\xab\x4a\x49\x56\x65\x66\x14\x1d\xb9\x40\xb8\xa0\x5f\x88\x90\x94\xb3\x19\x7a\xa0\x2c\x9d\xa1\x92\xa6\xff\xa3\xcf\xf0\x1f\xc4\x07\x77\xbe\xa4\x21\x9c\xdc\xc1\x4d\xbc\xab\x4a\x0e\x43\xda\x9f\xd9\x07\x2e\xa0\x7c\xb0\xde\x5c\x17\xeb\x61\x2b\x64\x7b\x67\xd3\x2f\xfe\xfb\xae\xc4\xb9\x86\x1d\x7b\x3c\x0a\xac\xef\xfa\xe0\x89\x00\xcd\x13\xb7\x38\x4a\x4a\x8a\x8c\xef\x40\x2a\xa5\xd2\xc2\x80\x84\x57\x6c\xf3\xb4\xc8\x93\xde\xd5\xce\x82\x34\x67\x4a\x49\x46\xfa\x0b\x95\xb9\xa8\xeb\x92\xa5\x44\x64\x3b\x30\x94\x98\xfd\x8f\xe7\xd4\x05\x4f\x3f\xd9\x7c\xf0\xe0\xa2\x6e\xea\xf7\x9c\xc0\x22\xdd\xe5\xac\xaf\xbc\x33\x2d\xb2\x60\xb3\x98\x35\x51\xb2\xa1\xdb\x77\xf9\x9b\x31\x3a\xa9\xe6\x55\x55\xf0\x74\x14\x4f\xc0\xf5\x78\x7d\xc4\x15\x5f\xb7\x7e\x40\x2e\xde\xab\x99\xdd\x58\xa5\x49\x5c\x2d\x6d\xb6\x1d\xdc\x13\x9a\x46\x4d\x6c\x4c\x8e\x0b\xe0\x79\x9e\x60\x5b\xe3\x3c\xa9\xea\xd5\x9b\x1b\xd8\x24\x9c\x83\x1b\x7f\xb9\xab\x65\x1c\xc5\x79\x66\x9d\xed\x9a\x43\xf8\x7c\xed\x82\x28\x41\xc9\x96\x20\x2c\x96\x54\x09\x2c\x76\x55\xa2\x3f\x78\x16\x77\x70\x25\xe8\xdb\xfd\xef\x25\x11\x3b\x50\x8c\x20\x22\x12\x34\xb0\x5e\x90\x9a\xd6\x04\x81\x70\xfe\xd4\x64\x14\xe7\x3c\xa5\xab\x16\xa1\xed\xb3\xad\x7e\xae\x55\x4a\x22\xe6\xeb\x92\xa6\xe4\xb4\xb1\x71\x7e\x76\xe2\x51\x12\xfa\x05\xce\x17\xdc\xef\x4f\xb8\x80\x80\x2a\x78\x5b\x6f\xaf\x21\x76\xd8\x63\xd9\x6a\x77\x6f\x33\xbb\x7b\x87\xe4\x62\x8d\x19\xfd\x87\xc1\x77\x82\x15\x59\x73\xa1\xff\xf9\x5a\x26\xbc\xb0\xbb\x00\xb7\xd4\x9b\x06\x5a\xf1\xce\x18\x7a\x3c\x57\x94\x91\x2f\xc0\x61\x69\x65\xd4\x66\xed\xf6\x0c\x32\xc8\x01\xae\x6d\xad\x3f\x14\xa7\x15\xb5\x77\x06\xff\xa3\xb7\x6d\xc4\xad\xe8\x38\x7c\xc9\xe8\xdf\xcb\x86\xdb\x05\x2e\xb2\x02\x27\x64\x81\xae\xea\xee\x0e\xfd\x67\x4b\x13\x6a\x22\x08\x06\xcb\x71\xd5\xf1\x60\x86\x70\xa6\x36\xbc\x5c\x6f\x90\xe4\x39\x69\xf4\x8a\xc8\xa1\xec\x45\xc6\x1f\x11\xb6\x21\x28\xfd\x84\xc3\xeb\x8c\xc0\x0d\x41\x6b\xc2\x6c\xda\x3b\x58\xe0\x18\xc2\x85\xe6\x57\x82\x62\x65\xfd\x17\xb8\x54\x3c\xc7\x8a\x26\x5a\x81\xef\x57\xe1\x5c\x8d\x96\x42\xd0\x1c\x0b\x9a\xed\xea\x90\x05\xc8\x80\x80\x55\x70\x86\x68\x4a\xf2\x82\x2b\xc2\x12\x4b\x44\xcd\x26\x0f\x1e\x6d\x78\x05\x01\xfb\x9c\xf5\xe9\x93\xa3\x4f\x2d\x85\x7a\x30\x2b\x4a\x84\x34\x42\xc5\x48\x51\xc0\x7f\x9f\x72\xa1\xfa\x6a\xad\xec\x5d\x3e\xc2\xc6\xef\xc2\x31\xab\x22\xcc\x41\xd0\x65\x29\x5a\x6b\x61\x08\xca\xd1\x5b\x7a\xf7\x98\x74\x9b\x79\x93\x8f\x64\x19\x2b\xd1\x17\x82\x72\x28\x33\x92\x61\x29\x87\x27\x6b\xdf\x46\x89\x7e\x1d\x61\x29\xe9\x9a\xd5\xe5\x0e\xb5\x74\x1e\x3b\x30\x70\xea\x08\x19\xdc\x2a\x02\x2d\xaa\xe8\x4d\xa1\x81\x0b\x17\xa0\x42\x02\x27\x66\x9a\x35\xf4\x69\xca\x2e\x92\xd0\x4a\x5a\x26\xa9\xfe\x7f\xea\x0f\x2f\x59\x0a\x45\x6c\x5c\xe1\x14\x27\x95\xd0\x35\xd4\xf5\xd1\x9c\xab\xe8\x62\xde\x2e\xfe\x67\x18\x7b\x61\x26\xfa\x33\x3a\xff\x78\x85\xb0\x58\x97\xc6\x86\xf6\x99\x65\x3b\x84\xb7\x98\x66\x70\x39\xd9\x8a\x2a\x30\xe5\xed\xdb\xc5\xbb\x77\x8b\xb7\x3d\x52\x40\x8a\x36\x74\xbd\xe9\xea\xfb\x93\x3e\x31\xe9\x13\xff\x0a\xfa\xc4\xdf\x5b\x67\x2a\x78\xca\xf7\x8e\x9f\x99\xb4\x74\x16\x1f\x0d\x88\x12\x81\x48\x7d\x3e\xfd\x96\x79\xc5\x2d\x17\xc8\xb5\xd4\x98\x48\x73\x6a\xdd\x29\x9d\xcf\xcd\x1f\x21\xe8\x11\xe8\xaa\x16\xd4\xf7\x49\xd8\xe3\xe4\x1d\xbc\x0a\xba\xd6\x44\x2b\xc6\x84\x71\x70\xdd\xc8\xaf\x6c\x68\x0f\x15\x33\xd3\x4b\x30\xca\xd6\xfe\x44\x43\x71\xe1\xfe\x68\x70\x6f\xe7\xb6\xbd\x06\x16\x4e\x96\x70\x9b\x62\x8e\xa2\x95\xee\x2d\xa1\xe4\x10\x61\xa6\xd9\xb2\x09\x25\xee\x20\x4d\x5f\x0d\x8b\xae\x9d\x92\x55\x82\x87\x3c\x35\xdd\xd2\x2a\xa6\xdb\xad\xc2\x1e\xe2\x7b\xfe\x56\x6b\x2f\x24\x3e\x8f\x6b\xac\x56\x23\xbb\x77\xe4\xaf\xda\x52\x2d\x28\xdf\x86\xda\xa8\xbd\x10\x66\xc7\x36\x4d\x1b\xc0\xed\xe8\x76\x69\xcd\xa6\x68\x3e\x69\x79\x74\xa3\xb4\x60\x3b\xb4\xde\x51\xbe\x62\x8b\xb4\x41\x7f\x49\xcf\x9f\x04\x51\x5a\x8c\xee\x06\x5a\xb4\x45\x0f\xe8\xbe\xe0\xc4\xb8\xa6\x19\x49\x6e\x30\xa4\x0e\x40\x00\x08\x98\x62\x56\xbc\x0e\x82\xec\x4c\x92\x4a\x74\xf2\xbb\x3f\x6c\x4e\x66\xa6\x9e\x5d\x3b\x76\x40\x90\x75\x99\x61\xa1\xf7\x44\x98\x94\x02\xf4\xf3\xff\xfd\x76\xfe\x5f\xff\xdf\xff\xff\xeb\x5c\xfe\x53\xfe\x33\xff\xe7\xe6\x9f\xe9\x3f\x1f\xff\xb9\x7b\xf3\x73\x07\xf0\xeb\x9c\x66\x19\x75\x69\x46\xee\x7f\x73\xca\x4a\x05\x01\x20\xa5\x90\x28\x85\x96\x58\x84\x3c\x48\xb4\x23\x58\xc8\x8e\xf7\xda\x4b\xef\x82\x97\x8a\xdc\x08\xb2\xa2\x4f\x61\x3c\xe9\x55\xe8\x77\x51\x01\x2f\xb7\x50\x25\xc8\x9a\x4a\x28\xa4\x06\x35\x09\x36\x98\xa5\xa0\x14\xaf\xfa\x82\x55\x21\xb6\xc2\x96\x01\xb1\xf7\xca\x0f\x57\xd6\x0d\x60\xcd\x1f\x5c\x6b\xa1\xb2\x5c\xce\x0b\x3c\xc2\x17\xa0\x6f\xa7\x6b\xa7\xba\xfa\x9c\x02\x9d\x42\x02\xf0\xb6\xac\xc6\xd7\x5f\xd9\x23\xa8\xd7\x26\x4d\x82\xc4\x96\x58\x47\x66\xb3\x3a\x6f\x57\x60\xd2\x32\x35\x08\xb0\x5a\x46\xac\xb4\x68\x84\x9b\xde\x22\x83\x31\x6b\xa9\x87\xb0\xf9\x2a\x34\x66\xc4\xed\x02\xa4\x75\x59\x51\x53\x2f\x97\x6b\x07\x11\xed\x7d\x60\x82\x40\x5d\x5c\xa9\xf1\xa6\x39\x43\x47\xeb\x0e\xed\xd7\xa5\xef\x37\x7b\x37\x2d\x16\x04\x9d\x5d\x5f\xf4\xbb\x4f\x03\xc1\x69\xed\x2e\x5f\x81\x89\x98\x09\x57\x7f\x31\xe6\x20\x6b\x1b\xed\x85\x6c\x19\x96\x9c\x21\xac\x65\x44\x73\x2e\x31\xb3\x15\xf4\x1c\x08\x41\x32\xec\xba\x0d\x69\x29\xb5\xb6\x38\xf5\x2f\x7c\x38\x9c\xcd\xa3\xf0\xf4\x2c\x57\x8f\xe7\x02\x7c\x61\xdd\xfa\x87\x2a\x60\xb4\x5a\xea\x70\xe1\xec\x50\x14\x69\x44\x28\x82\xc3\x48\xe4\xb4\x2b\x04\x56\xcd\xbd\xa4\x41\xf1\x89\x34\xe8\xd4\xf4\xb5\xa1\x05\xdc\x30\x81\x59\xdb\x7e\x74\x16\xdb\xe8\x8b\xd6\xe9\x2a\xe0\x86\xa2\xae\xd8\x0c\x5d\x73\xa5\xff\xe7\xf2\x89\xea\x6b\x32\x5c\xf5\xed\x82\x13\x79\xcd\x15\xbc\xfb\x2c\x94\x98\x49\x45\x22\xc4\x5a\x28\x6d\x71\x45\x2d\x6b\x37\xec\x98\x6e\x79\x57\x2b\x5b\xcd\xdb\xac\x2f\xb0\x08\x2a\xd1\x15\xd3\x9a\x93\x5d\x79\x55\x8f\x55\x5a\xe0\x4e\x93\x62\x9c\xcd\x21\x71\xc0\x41\x0f\x00\xad\x36\x8d\x4a\x87\x4a\x2e\x5a\xf8\xf2\x0c\x14\x80\xb9\x24\xc8\x0e\x6f\x78\x3a\x7c\x03\x29\x5d\x45\x86\x13\x92\xba\x02\x96\x58\xe3\x02\x2b\xb2\xa6\x09\xca\x89\x58\x87\xe6\x59\x68\x3e\xe5\xdf\xba\xc1\x4a\x50\x23\x4a\xba\xfa\x8b\xf4\x84\x63\x73\xfa\x54\x4e\xf7\x97\xe0\xf6\x0e\xc4\xe4\x84\x66\x05\xec\xfb\xe3\x2f\x6c\x91\x6f\x0c\x6a\xb8\x6f\x6e\x2c\xf4\xff\x5b\xb3\x53\x20\x94\xff\x63\xc2\x41\x16\xe8\xcc\xa7\x66\xe9\xa7\xf9\xbe\x0d\xc3\x69\x82\xd6\x50\xb5\xbc\xda\x6a\x5d\x87\x19\x22\x46\x30\xed\xb7\xf2\xaf\x3a\x37\xda\x0c\x3d\x6e\xb8\x34\x5c\xbc\x0a\x21\x7d\xf5\x40\x76\xaf\x66\xad\x93\xe7\x4b\xa6\x7d\x75\xc5\x5e\xcd\xaa\xf8\xd7\xd6\x39\xa8\x7c\x70\x70\xc3\xbf\x82\xbf\xbd\x5a\x74\x2e\xc1\x7e\x4d\x2a\x74\x31\x1e\x24\xd7\x96\x59\x9c\x74\xd3\xb9\x4d\x6b\x83\x9a\x89\x62\xb8\x11\x3c\x27\x6a\x43\x4a\x69\x44\x1d\x17\xaa\xde\x99\x28\x28\x24\x99\x26\x2b\x7d\x9a\x21\xe1\x33\xe1\x22\xa5\xac\x93\xc7\x36\xc9\x2c\x93\xcc\x32\xc9\x2c\x93\xcc\x32\xc9\x2c\x0d\xdc\x4c\x32\xcb\x24\xb3\xfc\xba\x65\x16\xd9\xee\x1d\x11\x14\x5b\xf6\x9b\x58\x6c\x78\x96\x4a\x04\x15\x6a\x20\x80\xd4\xc1\x42\x58\x29\x41\x97\x60\x05\xeb\xe3\xb0\x09\xcf\xf3\x66\x21\x8e\xaa\x35\x93\x3d\xfa\xa9\xa7\x4d\x7a\x4f\x9f\x8d\x11\x42\xce\xca\xdf\x55\xb6\xb5\xca\x57\x67\xc6\x2a\x8b\x33\x28\xfe\x65\x6d\xb0\x19\x5a\xeb\xaf\x5b\x0d\xb3\x6c\x07\xa9\x46\xd9\x81\xde\x3d\x83\xc8\x8d\x82\xa7\x0b\x74\xc7\xf3\x2a\x61\x44\xef\x88\xb5\xb6\xc1\x22\x5d\xe7\x51\xc5\xa1\x10\xcb\xda\x84\x78\xf3\x47\x0d\x76\x43\x0b\x1f\xdd\xc2\x7c\x1c\x48\xb0\x94\xe9\x4f\xaa\x04\xe3\x82\xa7\xef\xd1\xff\xc3\xd0\x3b\x43\x5f\xfc\x11\xc2\x03\xbe\xbf\xba\xf0\xf7\x7c\x58\x9a\x91\x3f\xdc\x01\xba\xd0\xef\xcc\x97\x92\xa8\x35\x4d\xd1\xd2\xd4\x69\xd7\x97\xed\x6b\x46\x1e\x4d\x96\xa4\x09\xd0\x80\x28\xef\x7e\x2e\x51\xa7\xc9\x38\x8f\x4d\x35\x49\x3b\xcc\x1b\xf4\x7b\x33\x4e\x41\x84\x6d\xef\xa4\xc7\xf2\xe7\xce\x7d\xbe\x3d\xb1\xc9\xf7\xe2\x71\x2e\x1e\xe7\xf3\xf9\x5c\xaf\xd3\x75\x41\xed\xe9\xe6\xca\xb8\xb2\x81\x5b\xde\xcb\xad\xc2\x36\x1c\xdc\x7a\x2a\xd2\xc4\xb6\xec\xec\x2a\x16\xaf\x7a\xbe\x1e\xea\x33\x19\x2e\xb5\x14\xee\x7a\xfc\x8c\x7e\xc7\x55\xd7\x9c\xde\x05\x8f\xeb\x74\xdc\xd3\x6b\xc6\xdf\x1c\xf4\xc0\xb6\xa0\x81\x9a\xbf\xa3\xfa\x98\xd9\xe8\x98\x5a\xac\xef\xcf\x83\x3d\xc2\xae\x05\x3a\x18\xbf\x48\xef\xe2\xe3\x77\x2d\x3e\xb0\x5f\x71\xd5\x95\xd8\x7b\xe8\x47\x74\x2a\xde\xef\x47\xdc\x0b\x33\xae\x47\xb1\xaf\xf1\xa8\x8f\x39\x1f\x46\xa2\x03\x0d\xa7\x0e\x6c\xb5\x17\xce\xdb\x0c\x36\x22\x7e\x46\x0b\xe2\x30\x93\x18\xd9\x7c\xb8\xd3\x4c\xab\x5f\x90\x89\xdb\x33\xdf\xfe\xf4\xc3\x8c\xdf\xb3\xd8\xb6\x59\x5f\x85\xad\x0c\x37\x1a\x1e\xdf\x62\xb8\x2d\xa7\xf4\x6f\xf4\x73\xba\x0b\xbb\x19\xf4\x02\x1e\xd9\x57\xf8\xdf\xed\x92\x19\xb2\xf2\x04\xbb\x06\x1f\xd6\x2f\x78\xa8\x25\xc6\x60\x71\x88\x41\xcd\x37\xd4\x1d\xf8\xb0\xbe\xc0\x2f\x3f\xe7\x50\x17\xe0\xc3\xfa\xff\xbe\xfc\x9c\x43\xdd\x7e\x0f\xeb\xf3\xfb\xd2\x73\x0e\x1a\x26\x9a\x2a\x15\xc8\xbb\xc3\xfc\xed\xac\x32\x2c\x83\x0a\x26\xf7\x3b\xa7\x9b\xb2\x8c\xf6\x0a\xb3\xed\xa3\x7a\x67\xde\x66\x3d\x33\x50\xcc\xac\xa9\xa3\xd3\xdd\xf8\xc4\x45\xa3\xef\xb4\xb0\xed\xe7\x40\x2d\x86\xc9\xb8\x9b\xa2\x93\x54\x4c\x5e\x2c\x58\x20\x76\x61\xc4\x06\x6c\x51\xc3\x2d\xec\x87\xea\xb8\x86\x8c\x41\x72\x27\x13\xd5\x6f\x08\x6a\x6b\xff\xe6\x3d\xd0\xfa\x1b\xc6\xfe\x2a\x98\x22\x75\x90\xaa\xe8\x74\xaf\x5c\x08\xca\x30\xe4\x67\x82\x06\x57\xb2\xba\xca\xb6\x83\xf1\x7a\xbf\x42\x96\xbb\x7f\xfa\x0b\x16\x98\x6c\x73\x27\x95\x66\xb8\x64\xfd\x76\xbf\x58\xdf\x81\x59\x6c\x15\xc7\x88\xd1\x03\x11\x0c\x72\xac\x6d\x67\xc2\x2a\x2c\xa5\x5f\x6e\x18\x36\xec\x87\xab\x9e\xf4\x74\xd5\x80\x32\x50\x06\xec\xce\xb6\xf9\x79\xb6\x4d\x3a\x72\x02\x5f\x40\x78\x3a\xee\x0c\x86\xac\xa2\xde\x0a\x0a\xa1\xb6\x30\xcf\xb0\x89\x0e\x37\x1a\x3f\xb8\xc5\xf8\x41\x82\x97\x6b\x2e\xde\x2d\xb9\x76\x22\xa3\x44\xd7\x17\xeb\x2f\x1e\x27\x4e\x47\xa9\x3b\x43\xc7\x24\xbe\x9b\xf8\x4b\xf4\x11\x3f\x7e\x07\xf1\xc3\x7a\x87\xa3\x65\xa0\xa9\xde\x0b\x74\x0d\x7f\x81\x3e\xd5\x31\x9d\x7f\x07\x59\xc6\xb8\xee\xe0\x87\xf5\x05\x47\xc1\x65\x8c\xee\x08\xde\xc4\xa5\x17\xea\x38\x1c\x1f\x07\x97\x51\x1d\xbe\x0f\xef\xed\x8d\x78\xbf\xb8\x84\x3a\x96\xa1\xc8\xae\xde\x95\xa9\xc1\x0b\x76\x44\x3f\xef\x08\x4f\x42\xfd\x1c\xc6\x39\x83\x12\xf6\x21\xdc\x33\x5c\x9d\x2d\xdc\xbd\x3b\xb2\x3f\xf7\x4b\x9e\xde\xc3\x7c\x53\x90\xc5\x78\x96\x24\xbc\x64\xc3\xe9\x91\x77\x9d\xd7\xfb\xce\x77\xfb\xad\xbe\x5c\xe5\xd2\x84\xe0\x3b\xa2\xb6\x89\x45\x26\x3a\xf8\xa6\x27\x3f\xdf\xbb\x72\x5b\xed\x23\x3c\x69\x5b\x11\xc4\xb1\x13\x69\x33\xb6\x36\xfc\xb1\xaa\x16\x62\xe2\xdd\xdd\x55\x3e\xc2\xe5\x05\xfe\x74\x4f\xa5\xa8\x76\x22\xc5\xa5\x7d\xd3\x14\xd0\xbb\xb3\xe9\xf8\xbc\x4a\xe9\xb6\xd2\x78\x1d\x97\xd4\x4b\x05\x77\x0a\x2b\xb2\x2a\xb3\x3b\xa2\xe4\x7e\x5b\x73\xd7\xac\x11\x9c\xf9\x6d\x7f\x0a\x14\x33\xbd\x27\x79\x91\x61\xe5\x29\xde\x35\x32\xb5\xc1\x62\xee\xd4\x96\xfa\x3c\xfd\x0e\x30\x91\x52\xd1\x97\xc2\x30\x24\x84\xe4\x24\xa5\x65\x1e\xc5\x23\x4f\x7e\x04\xd3\xfe\xae\x20\x26\x66\xc3\xec\x9f\x01\x50\x15\x79\xc3\xc9\x83\x49\x2c\xad\x2b\x71\x79\x4f\xde\x7d\xc3\xfd\x49\x25\x7a\xf5\xca\x55\xd7\x22\x98\x39\x83\xac\x21\x71\x9e\x92\x93\x46\x49\x2e\x33\xa6\x1f\xf0\xa7\xba\x5f\x8c\xa9\x70\x6d\x03\x4c\x5e\x5b\x00\x6f\x10\x17\xe8\x13\xc9\xa1\x4e\xd8\xf3\xb0\x1f\x44\x3e\x8a\xb9\xac\x24\xfd\x07\x81\x34\x9a\xb8\x4d\xb8\x87\xe2\xf1\x75\xf2\x4f\x06\xc5\xa1\xdc\x6e\x38\xc5\xc3\x1a\xef\x02\x4c\xd5\x1d\x0a\xe7\xf6\x33\x8e\x50\xfa\x0f\x5b\x55\xde\x5c\xf5\x92\x1b\x69\x3f\x81\xbb\x5a\xc3\xcc\x01\x6b\x81\x7b\x0a\x76\x06\x80\xb9\x24\xb0\xd2\x15\x47\x37\xdf\x3a\x8a\xa9\x26\xf0\xe8\x2d\x4e\x81\x6a\x8f\x6d\xde\x6a\x4b\xb3\x24\xea\x91\x10\xc3\xc2\xee\x1c\xfe\x1a\x77\x8e\x16\x86\x83\x12\x20\x44\x8d\x95\x39\x04\x47\x98\x59\xd9\xac\x3b\x7d\x76\xdb\xc5\xf6\x6b\x0f\xf7\x7d\xe0\xd6\x6b\xd0\x31\xa3\x59\x9b\x90\x9d\x47\xac\x42\x6c\xc9\x6c\xc2\x93\xa1\xbe\x80\x44\x1d\x9d\xbc\x7f\x24\x72\x0c\xea\x98\x3d\x0c\x2d\xc2\xbe\x75\xf3\xe5\xbc\xba\x00\xbc\x1c\xb7\xcd\x5d\x0f\xe0\x63\x75\xf2\x71\xdc\x31\x3a\xbb\xb9\xb2\xef\xb7\xf2\x39\xb7\xe6\x37\x92\x9a\xe6\x96\xd8\x5c\xac\x81\x63\x54\x05\xf6\x35\xcb\x44\x18\xfc\x2d\xe0\x3a\xd6\x24\xe4\x3a\xd5\x70\xb6\x25\x42\x41\x18\xeb\x9a\xd1\x7f\x04\xba\x34\x9a\xd1\x2b\x71\x11\x02\x2f\xa1\x96\xb3\xa9\x17\x03\xa7\x60\x56\x09\x41\x82\x40\x5a\x4f\xc9\x22\x20\xbb\x20\xbb\x1e\xb6\xb7\xa6\x6a\xf1\xf0\x27\x20\xaf\x84\xe7\x79\xc9\xa8\xda\x9d\x42\xb5\x11\xba\x2c\x15\x17\xf2\x34\xd5\xb2\xd7\xa9\xa4\xeb\x39\x16\xc9\x86\x2a\x02\x45\x71\x4e\x71\x41\xe7\xb0\x38\x48\x7c\x93\x8b\x3c\xfd\xae\x4a\xb1\x3b\x98\x2f\x3e\x50\xe6\xad\x52\xd9\xde\xcb\xbf\x52\xa3\x87\xe0\x56\x20\x61\xbd\x35\xae\xb2\xe7\xed\xe5\xdd\x7d\x95\x24\x19\x90\xe0\x69\x55\xd2\xac\x0e\xdb\xac\x37\x53\x23\x9c\xb2\x95\x6b\x09\x50\x15\x35\x76\x49\xd9\x61\xd5\xc0\xb4\xbf\x91\xe5\x12\xb8\x8d\xcb\x2a\x45\x8a\xf7\x96\xf0\xb8\x62\xe8\x1c\xe7\x24\x3b\xc7\xa1\x8a\xb8\x2f\xbc\x95\x10\xcc\x33\xd7\xdb\x71\xf8\x66\xe6\x9e\xfa\x53\xbd\x1b\x7a\x99\x2f\x49\x9a\x92\x9e\x62\x54\x95\x1a\x24\x48\x46\xb6\xb8\x5f\xc4\x75\x0f\x66\x15\x24\x97\xbc\xfd\x9c\x6a\xe1\x03\xd5\xa8\xaa\xd7\xa2\xe3\x0b\xdd\x13\xd9\xb3\xef\xf0\x2a\x55\xc1\xd1\x4d\x05\xab\xf1\xd5\xaa\xc2\x4b\x6a\x54\xb2\x8a\xaf\x5a\x15\x04\xd9\x57\xd1\x2a\xaa\x7a\x55\x10\xea\x91\x2b\x5b\x55\xeb\x8f\xe9\xdb\xed\xaf\x74\xe5\x9e\x5f\x88\x96\xa2\x2b\x60\x05\x87\xb6\xd5\xb1\x0e\xa9\x84\x15\xde\x22\x57\x25\xeb\x80\x8a\x58\x47\xdd\x7b\x7f\x65\xac\x36\xf6\x07\xb6\x7d\x54\x45\xf8\x11\x15\xb3\x82\x6b\xad\xf4\x82\xb1\x95\xb3\x82\x50\xbb\x55\xb5\xc6\x54\xd0\x0a\x82\xee\xa9\xae\x15\x5b\x49\x2b\x08\x37\x58\x65\x6b\xa0\xa2\xd6\x51\xa9\x29\xaa\xda\x96\x7b\x22\x8e\xf5\x20\xed\xc9\x58\x07\xc3\x09\xf8\x14\x9a\x52\x71\x4a\x24\x10\x4f\xb2\xc1\x02\x27\x8a\x08\x68\x0c\x6c\x94\x25\xbf\xa0\x69\x82\x62\x2d\x35\xb8\x0e\x8b\x05\x4f\xf5\xb6\x6e\xb8\x38\x58\xf3\xae\xdb\xc5\xcc\x9d\xd6\x53\xff\x64\x7e\x49\xb4\x8e\xe2\xc5\x68\xd4\x6d\x0f\x2d\xbc\x3e\xf1\x34\xcc\x71\xf7\x2e\xe5\xfa\xa3\x5a\x66\x69\x22\xd0\xb6\xd2\xcd\xf5\x1b\x61\x3e\x5e\x47\x15\xdb\xab\x6e\x83\xb7\xe3\xab\x60\x04\x50\x66\xa6\x32\x87\xa9\xcc\xdf\x85\x88\x6f\x30\x91\x24\xfa\xda\x19\x4a\x26\x01\x8c\x62\x85\x8d\x89\x6e\x5c\xdb\x0c\x63\x24\xae\x3a\x6b\x69\x04\x5a\x7b\x1f\xc3\x85\xdc\x70\x75\x51\x01\x0e\x2e\x05\xfc\x1b\x95\x51\x78\x0d\xb1\xa6\xa0\xb8\x1a\x87\x85\xe9\x3c\x99\x94\x42\x10\xa6\xb2\xdd\xde\x18\x61\xd6\x63\x66\x05\x9e\xa7\x3a\x26\x00\xc4\x59\x2b\x9d\xba\xcc\x27\xa8\x0b\x04\x7a\x68\xb8\xcb\x93\xbe\x95\x2d\xa4\xbd\x89\x34\xc1\x42\x21\x17\x70\x98\x9a\x50\xf6\xf0\xf2\x11\x23\x8f\x8e\xf4\xf4\x52\x01\x90\x73\xb7\x0a\x62\xc5\x45\xab\x97\xba\xf7\xc2\x0b\xaf\x6a\x53\x34\x9a\xd8\xb6\x16\x59\x87\xe4\xf6\xaf\x26\x08\xbd\xb5\xd2\x66\x24\xbe\xe5\xde\x2e\x7e\xdf\x99\x7d\x6c\x47\xbe\x20\xcc\x7a\xbd\x76\x97\x4c\x9f\x48\xb2\x85\xaa\x6b\x57\xc6\xf0\xb4\x2a\x35\x89\xcc\xd0\x23\x41\x45\x86\x59\xb8\x65\x3d\xaa\x96\x96\xeb\x23\xdc\x98\xb4\x4b\x96\xb0\xd3\x5b\x92\x0d\xde\x52\x6e\xeb\x5f\x0d\xf6\xd6\xa9\x50\xa8\xef\x62\x93\x5b\x11\xba\xa7\xe2\xba\xb0\x83\x39\xc5\x1b\xb0\xdf\x7c\xda\xb6\x9e\x9b\x2b\x93\x56\x61\x29\xdd\x24\x95\xb8\x4a\x8e\x83\x8a\xb7\x7b\x96\xc4\x88\x26\xb6\xa1\x87\xf1\xef\x37\x61\xb7\xdb\x3a\x0c\x62\x09\xb5\x22\x1f\xc1\x58\xb0\xd7\x94\x3c\xd1\x5b\x72\x76\x73\x65\x66\xbc\x40\x1f\x82\x49\x87\x16\x43\x6c\x67\xcb\xe0\xa9\x0d\x15\xe9\xbc\xc0\x10\x38\xa2\xf7\x72\xd6\x9a\x6d\x55\x77\x69\x00\x64\x74\xeb\xf6\x90\x61\xc4\x3d\xad\x7d\x71\xf6\x11\x28\xc8\x6c\xcd\xf7\x95\xa2\xb7\x8f\xed\x63\xcd\x72\x48\xcc\xed\xcc\xb2\xcf\xa7\xf5\xc2\xb3\x1c\x6e\xf4\x0e\x29\x8c\x34\x98\x48\x1b\xec\x87\x82\x62\xb5\x02\x6f\x11\xba\xe6\xb3\x5f\x1f\xcc\x55\xa4\x6b\x64\x17\x37\x6d\xe5\x71\x42\xfc\xcb\x8b\x1a\x83\xb6\x40\x34\x82\x33\xf9\x0b\xdc\x35\x9f\xf1\x9a\x33\x1a\x43\xdc\x87\x15\xc1\x1b\x1c\xbf\x53\xc8\xed\xeb\x16\xc4\xeb\xa2\x66\x80\x88\xd1\x40\xa1\xbc\xe6\xf3\x0b\xef\x50\x54\x31\xbd\xc1\xe1\xfb\x8a\xed\x0d\x16\xd6\x1b\x84\x1a\x2a\xbc\xd7\x5b\x64\x6f\x10\xe2\xd1\x8b\xf0\x35\x9f\xaf\x58\x90\xaf\xf9\x44\x52\x64\xd4\x6b\xd2\x53\xd8\xa4\xf9\xf4\x96\xdf\x30\x45\x54\xf9\x96\x88\x66\xe7\xcd\x84\x43\xcb\x56\x11\xe8\x07\x6c\x9e\x25\x65\x7d\xe5\x4c\x9a\x4f\x2c\x5f\x8c\x29\x73\xe2\x5d\xce\x98\x92\x27\x83\xf4\xd1\x2a\x89\x32\xb2\xfc\x49\xf3\x89\xd0\x3b\x3b\x0b\x89\x2f\x8b\x32\x08\x17\xb5\x0b\xa7\xc4\x94\x48\x89\x80\x39\xb6\x88\x4a\xf3\x89\x25\x05\xf3\x04\x8b\xab\x34\x9f\x03\x0a\xad\x44\xc1\x45\x8d\x9c\x8c\xe1\xc5\xa1\x71\xdc\x1d\x45\x15\x63\x69\x3e\x07\x15\x66\x89\x5c\xa8\xe6\xa7\x91\x45\x5a\x22\x21\x76\x4a\xb9\x44\x16\x6c\x69\xcd\x6a\x1c\x3a\x87\x0a\xb9\x34\x9f\xd1\x45\x5d\x22\x97\xbd\x57\xfa\x65\xb0\xc0\x4b\x24\x58\x6f\x19\x98\x9e\x62\x2f\x91\x20\xe3\x4a\xc2\xd4\x85\x5f\x22\xc1\x1e\xaf\x3c\x4c\xf3\x19\x28\x15\xd3\x7c\x22\xb9\xae\x79\x46\x52\x58\x9c\x05\xd0\x3d\x31\xda\x99\x79\xfc\x65\x66\xda\x6f\x45\x54\x14\x6a\x4e\x33\x42\xda\x8d\x5f\xd1\x40\x59\x9a\xe6\xf3\xcb\x8a\xc6\xf1\xa5\x6b\x06\xa7\xe0\x4a\xdb\x8c\x2e\x63\x33\xbc\xb8\x66\x99\x9b\xa8\x92\x36\x83\x20\xbd\x25\x6f\x02\xe5\x6d\x22\x34\xb8\xa8\xf2\x37\xf1\x42\xd0\x51\xa5\x5c\xdb\xc0\xcf\xd7\xe2\xa4\xf9\xf8\xbb\x4f\xdc\x35\xa0\xd4\x7e\x45\x97\xd1\x96\x61\x1a\x08\xcc\x44\x87\x47\xbb\xf6\xd8\x15\xa0\xf9\x4a\xd8\x77\x11\x75\x28\x5c\x9b\xfd\x34\x1e\x23\xf5\x27\x95\xa3\xec\xb1\x19\x1d\x6b\x0d\x2a\x74\xa0\x8f\x91\x7b\x5a\xd8\xab\x33\xd2\x3e\x54\x6d\xfa\xa1\x64\x73\x6e\xf2\xae\x1e\x6d\xd7\xf3\xb0\xb3\x81\x25\x59\x99\x9a\xa8\x64\x00\x0b\x8a\xa0\x4d\xe6\x80\x63\x0e\x6d\xce\xad\x9f\xe3\xd9\x5d\xa7\xcd\x7a\x47\x11\xd5\x97\xea\x13\x27\x70\x5a\x6d\xa8\x36\xf3\x0d\x25\xf3\xea\xe7\xa6\xa2\x0b\x03\x10\x42\x90\x4d\xc4\x17\x95\xc3\xf4\x78\x14\xcf\xaa\xc2\xaa\xf4\x72\xe8\x3d\xdf\x2a\xbc\xbb\x6f\xb1\xb3\xfe\x24\x38\x16\x22\x37\x2a\xb2\x81\xea\x9d\xba\x49\x58\xac\x16\xef\x28\xce\x92\xd0\xad\xeb\xd5\xfe\x6b\xf2\xb2\xe2\x44\x95\x38\x3b\xc8\xc9\x5a\x13\x0d\x81\x80\xd5\x0d\xee\x0f\x91\xfc\x37\x73\xb6\x26\xb8\xc0\x09\x55\x41\x45\xf1\x97\x09\x42\xba\x6d\x1f\x08\xbb\x95\xb5\x91\xcd\x5e\x3e\x75\x1b\xcc\xe0\x0c\x6c\x4c\xfb\x73\x2f\xcc\x84\x33\xb3\xf6\x78\xea\x3c\xb7\x27\xf9\xdc\x7d\xaa\x67\xee\x3b\xa6\xc1\x35\x40\xde\x6c\xd5\xf4\xb3\x0b\x02\xf2\xa1\x6c\x10\x0f\xfd\x07\x01\x61\x25\x1c\xfb\xa2\x11\x58\xcf\xab\xd1\x5f\x46\xf3\xd9\x93\x5b\x00\x73\xa7\xb0\x50\x24\x3d\x09\xcd\x2d\x82\x46\xdb\xdd\xd2\xf6\x58\x34\x44\x90\xd7\x13\x31\x67\x38\x93\x28\x25\xf0\xbf\x43\xd2\xf1\x92\x97\x0a\x78\x2e\xdc\x91\xc5\x36\x19\xf2\x91\x46\x8a\xd0\x19\x96\xea\x46\xf0\x25\xb9\xa7\xc3\xae\xab\x4e\x0b\x73\xa9\x90\xa9\x20\x03\x9e\xed\xa5\xd9\x8f\x9a\x82\x86\x85\x67\x57\x08\x21\xc5\x8a\xcc\xbd\xe5\xac\x9a\xcf\x08\x89\x5f\xaf\xed\x5e\x60\x26\x61\x32\xcf\x5a\x60\x6b\x59\x48\x55\x40\x23\x2c\xc7\xc8\x44\x4b\x73\x46\xec\x9d\x69\xe4\x7a\xb0\x4b\x7f\x65\x04\xe5\x44\xca\x9e\x74\xb6\xee\xd3\xc2\xca\x7f\x94\x39\x66\x73\x41\x70\x0a\x91\xa9\x16\x08\xa2\xa6\x1a\x9a\x3e\x9c\x71\x34\x8d\x2a\xba\xce\x00\xcf\x15\x52\x87\xb1\x32\x62\x8d\x82\x60\xe9\xcf\x8f\xf0\x2c\xf1\x07\x88\x39\x9c\x19\x71\xaa\x0e\xbb\xc5\xfa\xbf\x85\x9a\xa1\x1c\x27\x1b\xca\x62\x0c\x11\xc0\xcd\xa4\xc2\xcc\x20\xcb\xda\x87\xc0\xb6\xb8\xa6\xdb\xaa\xa1\x96\x9e\xe3\xa0\xe1\xdc\x3c\x15\x19\x9e\xc8\x0e\xe2\x34\xff\xa4\xca\x46\x70\x48\xf4\xaa\xc5\xde\xfa\x6a\x1c\xee\x3f\x26\x02\xda\x66\xf0\x90\x38\x5e\x1c\x65\x00\x06\x6e\x7d\xd4\x8d\x0d\x0b\xa0\x07\x81\x0c\x55\x13\xaa\x9f\x11\x6c\xde\x56\x1d\x8a\x39\x08\xa6\x52\x9e\x8d\x5f\xe7\xab\x01\xc0\x0b\x0d\xf9\x78\x4b\x8f\xb3\x3a\xcd\xd1\x80\x78\x6e\x5e\x52\x43\x53\x1b\xa5\xde\x87\x65\xb9\x62\x83\x65\xbc\xf6\x75\xa3\xdf\xf6\xa9\x21\x00\xca\x8b\xf9\x97\x55\xa7\x0e\xc9\xa5\x56\x3c\xb3\x51\xc6\xe1\x1e\x7e\xed\xa4\x5d\x5b\xac\xe7\x44\x36\xbf\x8f\xec\x7d\xd8\x29\x1e\x50\xf0\xd4\xb0\xc8\xfb\x0a\x16\xa8\xd9\x4a\xe1\x64\x63\x03\xe6\xcc\x5f\x20\xd6\xab\x6f\x1b\xb5\x22\xa3\x5c\xe2\x85\x4a\x36\x96\x23\x2a\x41\x8b\x8c\xa0\x3f\x57\x26\xb5\x19\x59\xad\x48\xa2\xfe\x3b\x2a\xa5\x53\x59\xe0\xfd\x7e\x94\x57\x86\xad\x3f\xbb\xff\xfa\xef\xdd\x0d\x0c\x0b\x49\x66\xbc\x88\xc2\x42\x97\xf0\xa2\xbb\xfe\xdc\xfc\x61\x59\x06\x06\xf4\x7a\x00\x5b\xb4\x49\xff\xf4\x90\x88\xe1\xba\x26\xe8\x1f\x67\x59\x0b\x84\x5c\x98\xe6\xfb\x8d\x8d\xb4\x41\x12\xd6\x52\xe7\x81\x89\x05\x41\xd7\xfc\x4e\x6f\x46\x99\x91\x19\xba\x01\x2b\x43\xfd\x0b\xd8\xfb\xae\xf9\xe5\x13\x49\x4a\x5f\xa2\xf6\x00\x75\x7b\x3d\x6e\xed\x68\xac\xda\xc3\x66\xd6\xd5\xf2\xb0\xd5\xa4\x38\xd0\xcc\x40\x71\x8b\x43\x0f\xb6\x1e\xc8\xae\x2e\xa5\x6f\xbd\x7a\xe0\x89\x98\x0d\x99\xc1\x9d\xdf\xc2\xb8\x43\xfe\x9b\x35\xa4\xf0\x7c\x49\x99\x99\x58\x95\x9f\x5d\x8f\xe9\x8c\xa4\xde\x48\x29\xfd\x12\x4c\xe9\x10\xc4\x86\x1d\x7d\x2d\xec\x7e\x1e\xd1\x71\xa1\xb2\xee\xfa\x38\x5a\x9f\x0b\xaf\xe1\x91\xbb\xfc\x7b\x89\xb3\x76\x6d\x0f\xfb\x53\xd0\x93\xd4\x29\xe0\xfe\x48\xb3\x34\xc1\xc2\x64\x31\xd8\xd4\x4e\xc9\x6d\x59\x3b\xe0\x2c\x09\x84\x97\x1a\xf6\x11\x40\x30\xec\xbc\xb4\xa6\x21\x2c\x14\x4d\xa0\xfd\x9f\x4d\xc2\xf1\xf8\xa0\x86\x32\x82\x2b\x82\xbc\x33\x3d\x00\x23\x36\xe1\x7e\xff\x9b\xfd\x8b\xa6\x20\x82\xf2\x14\x94\x7a\xab\x52\x78\xa9\xbc\x3a\x0e\xaf\x6d\x4e\xb5\xa5\x4e\xbe\x72\x3c\xa5\x3a\xb4\xad\x08\x17\x7f\xd2\x6e\x55\x4e\xc4\xb6\xb3\x7e\xd3\xe0\xcc\xd5\xa9\x5c\xa0\xbf\xec\x5c\x10\x0e\x04\xe4\x98\xb8\x53\x0f\x48\x28\xca\xdd\x2e\x5e\x60\x20\x36\x8e\xf9\x8a\x0b\xb2\x25\x02\xbd\x4e\x39\x44\xb0\x92\x2d\x4d\x54\xa7\x63\xa2\x7b\xfe\x2f\x22\x38\x10\x19\x23\x6b\xac\xe8\xb6\xf2\x43\x38\xb5\x5d\xb9\xb0\x66\x89\xde\xa2\xd7\x00\x0c\xd1\x3c\x27\x29\xc5\x8a\x64\x3b\x5f\x99\x26\x6b\x69\x36\x56\xe5\xfe\xc1\x9f\x5f\x91\x2f\x50\x7e\xad\xa7\xf4\x5a\x8b\x19\x1a\xa1\x6f\x8f\x13\x56\xd7\xa1\x37\x8e\xc0\xeb\xcd\x6d\x15\xc8\xad\xb4\x17\xc7\x08\x1d\xb9\x78\xa0\xfe\xa7\xa6\x35\x5c\xb5\xd1\x34\x67\xe4\x80\x53\x34\x28\xd3\x74\x25\x3b\x25\x70\x42\xd9\x3a\xa2\x31\xfc\x7d\xf3\xcd\x2a\x9f\x49\x63\xcb\xfc\x01\x51\xd7\x60\xb4\x61\xfd\xef\x1a\x8a\xc8\x93\x3e\x94\xb6\x1d\x80\x75\x0b\x00\xe1\xd7\x81\xe5\x50\x0a\x81\xed\x50\x59\x24\x3c\x37\x96\xa7\x8c\x68\x49\x11\x92\xd1\x96\x82\xe0\x87\xbe\xd5\x3f\xe2\x0e\xe7\x99\x3a\xb7\x4f\x9d\xdb\xff\x15\x3a\xb7\x5b\xfb\x7d\xf0\xfc\x7d\xb1\x71\x7f\xb6\xb7\x6c\x3b\xa1\x50\x5f\xc5\x95\xfd\xbc\x0a\x11\xe4\xac\xf7\xca\xe3\xa5\x2a\x4a\xd5\x2c\x85\xd1\x4a\x48\x74\x03\xd5\xb9\x0c\x55\x21\xd6\xa2\x80\x34\xc8\x2e\xe3\xe1\x76\xc3\xab\xe0\x44\x90\x29\x44\x95\x98\x69\x53\x5b\x90\x20\xb2\xcc\xc0\xb1\x6e\xdd\xbb\x90\x03\xe8\xc9\xcf\x8d\xd1\x89\xbe\xb8\xec\xbf\x86\x14\x66\xea\xfd\x39\x93\x89\x2d\xab\xd2\xcc\x34\xef\xd9\x62\xe3\x39\xb1\xd9\x83\xcd\x32\xb3\x2e\xae\xa0\xe0\x3d\xb6\x94\xb0\x3e\x83\x1f\xe5\x65\x86\xa5\xa2\xc9\x5f\x32\x9e\x3c\xe8\x15\xc7\xdc\x56\x27\x67\x3f\xde\x75\xbe\x6b\xad\x90\xa1\xb3\x1f\xef\xd0\x05\x95\x0f\x43\xd9\x2e\xae\x5b\x76\x53\x3f\xc4\xe8\xc1\xb4\x3a\x38\x39\x91\x68\xc3\xa1\x93\x33\xd8\xd6\x5c\x28\x02\xd3\x4c\x9a\x4b\xaf\xa1\xd5\x8a\xb4\x50\xab\xe6\x99\x55\x8d\xf0\xa3\x24\x66\xa9\x4b\xbd\x54\xc8\xfa\xea\x77\x5b\x0d\xdb\xd7\x57\xf2\x3e\x68\x4c\x6a\x23\xb9\xe1\xf3\x76\xce\xf4\x86\x9f\x0e\xf0\xb6\xe3\x25\x7a\xc4\xc1\xa8\x11\xd7\x53\x70\x81\xee\x69\xf1\x1e\x5d\x36\x3a\x40\x98\xaa\xca\xed\x41\xa8\xac\x33\xf2\x02\x50\xad\xf0\x04\x7b\x63\x44\x0d\x7d\x0b\x5a\x59\x0a\x5d\x3e\xe1\xbc\xc8\x88\x7c\x8f\x5e\x91\x27\xf5\x87\x57\x33\xf4\xea\x69\x25\xf5\xff\x30\xb5\x92\xaf\x42\x66\x93\xab\xbc\x8a\xd7\x86\xd2\x22\x36\xc5\x6e\x49\x2c\xa8\x6e\xd9\xbf\x6a\x7b\x03\x50\x8f\xb5\xf1\x81\x21\xcc\xc5\xb2\xe1\x8f\x28\xe5\xc6\xf5\x01\x39\x72\x88\x08\xc1\x4d\xed\xa4\x3d\x74\x83\x03\x20\xe1\x79\x21\x78\x4e\xe5\x80\x07\x13\x2c\x1b\x70\x04\xfc\x2e\xd3\x08\x8b\x13\xa8\x42\x2a\x50\x1a\xa8\x53\x63\x4b\x9f\x22\xf7\x91\x5b\x44\x1f\x05\x86\x73\xfe\x2c\x05\x5e\xad\x5c\x26\xc0\x0c\xa9\x76\xc9\x33\x47\xa6\x9a\xb2\x2c\x7c\xcd\x24\x43\xa4\x52\x53\xd9\x07\xee\xf8\x3a\x3a\x4d\xc9\xf6\x54\xa6\xf8\xdd\x0c\xa6\xe6\xea\xec\xa9\xe6\x3a\x02\x30\xb1\x44\xaf\xde\xfd\x7f\xec\x7d\x5b\x6f\x1b\x47\xd2\xf6\xfd\xfb\x2b\x1a\xce\x85\x64\x40\x94\x9d\x7d\x83\xec\xc2\x58\x2c\x20\x4b\x76\x56\xd8\xd8\xd6\x8a\x76\x72\xf1\xe1\xc3\xa2\x39\xd3\x14\x7b\x35\x9c\x9e\xcc\x41\x8a\xf6\xd7\xbf\xe8\xaa\x3e\xcd\x70\xa6\x0f\x24\x25\xd9\x1b\xce\x4d\x1c\x8a\x53\xec\x63\x55\x75\x75\xd5\xf3\xbc\x38\x25\x73\xbe\xe6\x05\xad\x8b\x87\x13\xb7\xc7\x76\x24\xe4\xf9\x54\xff\x94\x3f\x96\xfb\xe2\xf5\x0b\x72\x2c\x6a\x68\x8d\x3c\xbc\x16\x8c\xde\x31\x5d\xf6\x89\x18\xcb\xe0\x83\xbf\x3c\x9d\x9e\x59\xe7\x1c\xf2\xbf\x7f\x0a\xcc\xff\xf4\x59\x84\xe0\xc5\x47\xfe\xa9\x2c\x62\xc9\x26\x8f\xb4\x7f\xf2\xa2\xad\x3b\xf6\x42\xce\xd2\x52\xd4\x99\xc6\xae\x40\x15\x72\xad\x64\x7a\x06\xc1\x74\x95\x97\xca\x1e\x7e\x90\x93\x0d\xd3\x8e\xa2\x27\x17\x87\x47\x2a\x6f\xc8\x0b\x60\x96\x79\xf1\x84\x5a\x9e\x04\xe9\x5b\xf0\x41\xc9\x97\x17\xb1\x23\x8d\xb7\x4b\xe4\xf2\x42\xeb\x79\xe7\x6e\x25\x77\xed\xe8\x14\xec\x3d\x3e\xd2\xec\x1e\x9f\xad\xe9\x7f\x44\x49\xde\xbd\x9d\xab\x66\xbc\x7c\x96\x01\xda\x01\x16\x5c\x8f\x9e\xe7\x84\x39\x19\x37\xa7\xff\xe9\x6a\x26\x5d\x8f\x18\xf2\x58\xfd\xdd\xa1\xf7\x22\x3f\x27\x17\xb4\xa5\xe8\xc4\xa8\xc2\xb5\xa9\x91\x37\xb6\x50\xee\x8b\x05\xd4\xd5\x2a\xd8\xd1\x69\xcf\x8c\x44\xb9\x0c\x19\x68\xfd\x1b\x7f\x4a\x5e\x7f\x25\xfd\x5d\x36\xe4\x1c\xdf\x83\xdc\x9f\x37\xe4\xa3\x28\xd9\x09\x6c\x54\x22\x77\xaa\xfa\xe7\xaf\x35\x6f\x99\x47\xed\x44\x18\x14\xb9\x32\xfd\xb9\x6e\x1b\xa7\x55\xf7\x14\x08\xc5\xdf\xb0\xba\x95\x69\x59\x14\x62\xa1\xb3\x33\x77\x6d\xd7\x97\xeb\xcb\x84\x66\x7d\xb9\xbe\x7c\xdc\x26\x25\x39\x7f\x43\xdf\xcf\x7a\x71\xf6\x24\x6f\x7d\x89\xc0\x35\x94\x83\xb1\x10\xf2\xdb\x4e\xb5\xc7\xe6\xb3\x68\x3d\x5f\x2e\xd9\x63\xdb\x65\x0c\xfd\x05\xdf\x03\xac\xdb\xdf\x2b\x96\xb5\xe6\x32\x84\xcc\x57\x54\x2a\x1c\xb2\xee\x8a\x16\xee\x91\x60\x62\xe5\x4c\xfb\xcc\x77\xc5\x6a\x03\x29\x4a\x15\x98\x30\xb9\x60\x78\xad\x93\xbf\xd1\x69\xde\x46\x96\xfb\x82\xcf\xcf\xd0\xa2\x3e\x40\xf9\x5f\xfe\x06\xb5\x16\xc1\x6a\xc0\xdc\x59\x85\xc7\x90\x3f\xcd\x4b\xfd\x27\x9f\xd0\x3b\xca\x0b\xba\xe0\x05\x6f\x1f\xa4\x75\x7e\x79\xda\x2b\x9e\x6c\x60\x00\x76\xda\xee\x89\xee\x83\x7b\x1f\x00\x86\x9a\x1c\x4b\x09\xaf\xee\xa5\xe2\x79\x79\x6a\x3c\x07\x3f\x4a\xa9\x02\xa1\x40\xc7\xc3\x75\x38\x34\x11\xc3\xd0\xab\x08\x2d\x31\x9f\xe1\x0e\x19\x26\xad\xf0\x3c\x7f\xfe\x72\x7d\xb9\xb5\xd9\x92\xfb\x3e\xd6\x6c\xc9\xef\x8e\x9a\x2d\xf8\x83\x02\xc0\x9e\x20\x94\xc7\x07\xa3\x2f\x8f\x64\xb9\xfe\xfb\xd7\x8a\x0e\x99\x26\x18\x40\x17\xd2\x41\xc7\x6a\x7b\xb5\x95\x38\x83\xf3\xa0\x02\xd1\xc0\xe6\x60\x4d\xe5\xdc\xfd\xc3\x53\xf7\x13\xb1\xb3\x41\x39\x24\x74\x04\xb4\x29\xf1\xc2\xc9\xef\xec\x04\xda\xd1\x9d\xfa\x82\x6e\xf4\x36\xfb\x2d\x63\xd5\x6a\x19\x73\x87\x77\xce\xaa\xd5\xfb\x79\x3f\x80\x27\x3f\x23\xef\xe7\xc6\x2f\xb4\xfb\xc8\x53\xfd\x0a\xcd\x6d\x30\xd8\x77\xd4\x90\x82\x2f\xd9\x64\xf2\x5e\x78\x7f\xad\x45\xc9\x5b\x51\xc7\xf2\xcd\x43\xdd\x3f\x8c\x36\xf9\xa0\xde\xc4\xea\x87\x4c\x14\x05\xcb\x74\x8c\x16\x3a\xa6\x45\x7b\xd6\xdf\xc8\x71\x82\xa9\xf3\xb8\x86\x5b\xd5\xa8\xec\x38\xd0\xaf\xae\xdf\x9d\x5d\x7c\x78\x77\xba\xce\xbf\x5b\x89\xfb\x59\x2b\x66\x5d\xc3\x66\xbc\x9d\xb6\x47\x4f\x43\xdb\x0e\x25\x81\xab\xd8\x41\xfc\xa4\x03\xfb\xe4\x4b\x83\x11\x63\x08\xcd\xc8\x55\xc0\x72\x52\x0b\xd1\x9e\x90\x9a\xaa\x50\xfe\xa4\xda\x20\xea\xc8\xb0\xec\x8a\x02\x47\xbc\xad\x19\x3b\x71\xe3\x21\x9e\xa2\xff\xfd\xdb\x69\xa7\x5b\xb1\x6a\xd8\x17\x6c\x63\x35\x4b\x56\xc3\x7e\xf8\x6f\xf2\xc8\x4b\x2d\x5e\xd7\x4f\x1b\x68\xdf\xa8\xce\xcd\xbb\xfa\x8e\x57\x2e\x3a\x39\xc6\xb7\xec\x81\x04\x32\xf1\x96\xa2\x06\x46\x96\xfe\xfa\x60\x6d\x06\xdd\x05\x24\xc5\x53\x65\x4b\x9e\x60\x57\xc6\xd8\x12\x68\xcc\x35\x5b\x6e\x3b\x50\xd7\x6c\x89\x05\x63\xfd\xea\x27\x80\x4b\x64\x65\xab\xc0\x4e\x3d\x43\xa6\x86\x63\x74\xe4\x54\xd5\xf3\x13\x0c\x55\x5c\xc2\x7d\x18\x1e\xea\xeb\xbb\x45\xb5\xcf\xde\xee\x53\xed\x93\xa0\xd6\xbd\xe9\xa2\x3e\x4a\x4d\xaf\x5e\xaf\xf5\x26\xad\x69\x2e\x1a\x64\x28\x92\x63\x71\x12\x17\x93\xa4\xf9\x9a\x97\x5f\xc5\x56\x0c\x39\x58\x5e\x3b\x1f\x72\x9f\x78\x99\x4f\x8d\x6f\x7f\x6c\xcf\xe1\x9b\x7d\xff\x09\xdf\xb6\xa8\x89\xea\xee\x8f\xea\xf3\xc7\xe4\x39\x57\x94\xfa\x6e\xb0\x7f\x33\x18\xb5\xa1\xd7\x0f\xcd\x6f\xc5\x0c\x7f\x7b\x56\xe5\x76\xc4\x9f\xe7\x42\xef\xa9\x82\x3a\x83\xcb\xb8\x67\x08\xed\x44\xf9\x8b\x89\xb3\x43\x0e\xae\xd0\x5e\x47\x31\xc6\xfb\xd9\xca\xa6\x03\x17\x44\xa3\x91\x61\x30\xb7\x05\x49\x25\xd4\xa9\xd7\xef\xfe\x18\x2e\xd6\xc6\x00\xab\x67\xa2\x2c\x55\x0e\xf5\xa7\x8a\x95\xf3\x96\x66\xb7\x9e\x38\xf6\xc1\x0e\x3f\xab\x1d\x4e\xbd\x09\xd3\x69\x31\xb9\x99\x6f\x85\x10\xfe\xe0\xde\xc5\xf2\x52\x19\x91\xaf\x50\xeb\x3c\xe6\xed\x16\x66\x55\x7d\xa0\x13\x80\xb4\xfd\xc8\x85\xfe\xee\xc0\xf8\x9a\x8f\x21\xf6\xa4\x92\x41\x2b\x51\x75\xc5\x74\x56\x35\xe4\xbe\x63\xc3\xb7\x34\x96\xca\x79\x4a\xb9\xca\xb2\x4a\x64\x2d\x72\x46\x16\xbc\x35\x6c\x68\xa2\x34\x78\xc6\x60\x33\x3d\xab\x60\x61\xf2\x97\x4f\xfb\x89\x90\x0e\x7f\xd6\x6b\xf0\x3d\x5e\xff\xf9\xcf\x7f\xb6\x69\xec\x3e\x0b\x2c\xc8\xeb\x1f\x7f\xf8\xe1\x94\x5c\x28\x72\x37\xce\x0c\x87\xaf\x39\xde\x29\x32\x0f\x42\x21\x3b\xdb\x4f\xf0\xaa\x06\x58\xd9\x04\x95\x9f\x8a\x74\xd7\x88\xce\x2b\x27\xad\xe0\x59\x8b\xfc\x24\xb8\xc9\x15\x79\xb0\x57\x28\xd5\xbf\x6f\xf2\x4f\x60\x2c\x4f\x48\xc1\x6f\x19\x59\x36\x80\xce\x6b\x31\x5e\x30\xfd\xcd\x23\x11\xf9\x2f\x54\x03\xec\xac\x34\xac\x7d\x92\x04\x86\x40\x50\x68\x58\xe4\xd4\xe3\x5b\x06\x62\xf8\x5b\xf6\x30\xc3\xa9\xaf\x28\x37\xb9\x73\x17\xb4\x9d\xc6\xef\xd7\x89\xf2\x7d\x65\x9f\xb1\xdc\xd9\x60\x3a\x01\xb1\xaa\xc5\xbf\x71\xb2\x79\xe9\x4d\x89\x71\x41\xc3\x1b\xe5\xf8\x29\xe4\x9e\xd2\x41\x02\xd1\xc8\x78\x8a\x46\xd8\x9f\x6b\x62\xcb\x38\x46\x0a\xbc\x0a\x0e\xdc\x03\x40\x6a\xb2\xd1\x5a\xaf\xbb\xa1\x4e\xdf\x36\xdb\x52\xae\xee\x06\xd7\x4c\x57\x6e\xc8\x45\xb4\x71\x9f\x45\x47\x55\x04\x8d\xa4\xba\x22\xc7\xc9\xe5\x84\xea\x01\x85\x6e\xad\xbe\xab\xe6\xc9\x23\xd4\x4c\x45\x2f\x63\xa7\x61\x6d\xa7\x26\x07\x12\xb1\x64\x7b\x59\xd3\xa8\x32\x86\x35\xad\x6f\xbd\x7d\xd7\x79\xbc\xa7\xe4\x4a\x76\xd9\x24\xe2\x62\xfd\xcc\x1d\x33\xbc\x63\xb2\xa9\xca\x9b\x09\xb4\xf3\xe8\xf4\xf4\x08\xd5\x83\xa8\x49\xd3\xd2\x5a\xed\x68\xf9\xf9\xb4\x29\x0b\xc6\x42\x7b\x0b\xff\x03\xad\x1c\x0e\x30\xa8\xaa\x12\x50\x08\xd3\xae\x2c\x65\x4a\x18\x19\x22\x16\x30\x20\x02\x5f\x71\x34\x67\xbd\x15\x7a\x01\xee\x0d\x11\x7c\x1d\x80\x2e\xda\x68\x4b\xc0\xc4\x20\xb1\x19\x2f\x58\x18\xad\x70\x1d\x61\x59\x2e\x97\x03\xc8\xf6\xa0\x54\x67\x2d\x3b\xf6\x73\xc0\xfa\xde\x33\x16\x41\x91\x7e\x63\x32\x6a\x32\xc2\x9d\x0f\x9a\x94\x4d\xc3\x11\x14\x1a\x61\x58\xf0\x89\x33\x2f\xf8\xc4\x18\x19\x7c\xfc\xf7\x02\xf8\x6c\xac\x6b\xa3\x19\x70\x8b\x2f\xad\xd5\x85\x2a\xc1\x2a\x0a\xa3\x1f\x37\x07\x52\x5a\x2b\xee\x06\x5a\x12\xba\x68\x44\xd1\xb5\x28\xda\xfe\x51\xa9\x9d\xa8\x95\x04\x8d\xd2\xd8\x71\xa0\x71\x8c\x18\x47\x15\x81\xb2\x8f\x43\x32\xf4\x6b\x2d\xf5\xc3\x7b\x85\xa0\xf7\xc2\x1b\xce\xa0\x87\xc1\x2b\xa3\x40\x95\x79\xf8\xca\xc8\x7f\x56\xfc\x5a\xcf\x89\x7b\x3e\x23\x46\xcc\xab\xaf\x0e\x66\x64\xac\xc6\xaa\x61\xac\x8b\x65\x0b\x62\xd0\x10\xfb\x3c\x7e\x5f\xad\x8c\xdb\x7a\x5f\xd0\x23\x74\x10\x6b\x78\xcc\x11\x6c\x7e\x49\x8e\xcf\x4d\xa9\x86\xe6\x01\xbf\x2c\x5b\x56\x2f\x69\xc6\x5e\xba\x47\x33\x7f\xde\x90\xae\x94\x58\xd1\x32\x2f\x74\x1d\x88\xe5\x22\x94\xbf\x94\xd7\x1c\x0a\x2b\xcf\x5c\xea\x9e\x89\xca\xca\x88\x03\x1b\x48\x8b\xcd\xdf\xc0\x9f\x1e\xa1\x62\x77\x1a\x06\x5d\xc0\xf6\xfb\xfd\x58\x73\xd6\x3c\x95\x0b\x00\xec\x07\xa8\xa6\x07\xd1\xd5\x2a\xc0\xae\xd9\x54\x32\x51\xcb\x23\x58\x88\x7b\x82\x36\xa4\x66\x37\xd2\x57\xad\x11\x0b\x10\x61\x06\x3b\xf9\xc1\x4e\x39\x69\x7b\xca\xeb\x73\x72\xef\x54\x18\xd6\x17\xa7\xd5\x01\xda\xa5\x72\x92\xc5\x1d\xcf\xb5\xa3\x8f\x44\xdf\x77\xba\xa2\xb4\xa2\x4d\x63\x78\x8a\xbc\x03\xd4\x88\x8c\xc3\x81\xda\x99\x31\x74\xc6\xc1\xdd\xc8\x59\xcb\xea\x35\x2f\x59\x2f\x77\x3f\x2e\x60\x8d\xec\xd9\x1e\xec\xdf\x88\x81\x2e\x45\xce\xae\xba\x45\xc1\x9b\xd5\x3c\x31\x1a\xf9\x71\xe4\x55\xcc\x7e\xd8\xb8\x63\xc4\x08\xa5\xef\x4c\x30\x8c\x5d\x92\x86\x01\xd4\xce\x1d\x73\x51\x0b\xc1\xbb\xa5\x8d\x21\x2e\x3e\x9f\x8f\x67\x85\xa9\xd6\xaa\xfd\x21\xa0\x22\xa4\x60\xaa\x5e\x5a\x4e\x84\xd3\xf6\x5f\x2c\x19\x95\xfc\xf4\x4b\x59\xb9\x9f\x7b\x0f\xed\x45\xa1\x8b\x5e\x4d\xd1\xb7\x56\xce\xe8\xa9\x69\x8a\x53\x5c\x3d\x5c\x2e\xac\xf0\x58\xf0\x01\xe7\x83\x53\x82\xda\x1f\xa6\x06\xc9\x9e\xda\x15\x2d\x89\xf0\x62\x24\xe1\xeb\x00\x65\xa1\x45\x99\x39\x42\xdc\x01\x5c\xd0\xd3\x4b\xe9\x10\xee\x7d\xd6\x70\x6f\xe2\x85\xcb\x5c\x9d\x85\x70\x33\x2a\xac\xce\x41\xed\xa8\x56\xf5\xe1\x23\x6b\xe0\xce\x66\xa7\x2b\x10\xfc\xf5\xb3\x16\x99\xa3\xbd\x60\x9e\x89\x40\x91\x51\x43\x3f\x52\x54\x6a\xdb\x82\x24\xc3\x8d\xd2\x23\x33\x75\xc0\xcc\x9c\xbd\x10\x0c\x12\x9a\x9d\xe5\x68\x2c\x25\xcf\x1a\x61\xb0\xbf\xf8\xe1\x91\x4f\x64\x2e\xb2\xce\xf0\xa9\xc0\xfc\xd9\xeb\xca\x10\x0e\x7e\x70\x8d\x05\x73\x74\xa1\x7d\xdb\xf8\x74\xb9\xb8\x2f\xef\x69\x9d\x9f\x5d\x4d\x94\x0e\xf4\x5d\x1e\xfb\x6d\xd7\x8b\xd3\x42\x80\x47\x0d\xb1\xec\x54\x2a\xad\xcf\xb1\x1b\x44\xe1\x0f\xf1\xf6\xfe\x10\x1d\xe2\xed\xdf\x40\xbc\x5d\x7e\xb7\x4f\x98\xd3\xdb\x0b\x2a\x8e\xe5\x0d\x28\xa5\x05\x3a\x9d\x1d\x88\x1a\x71\x98\x13\xef\x38\x64\x7e\xe3\x27\xd4\xea\xb6\xb3\xe6\x38\x78\x6a\xfb\x06\xe1\xf4\x63\x03\xa6\x20\xc7\xeb\xbd\x8e\xf4\xd5\x49\xe0\x9d\x03\xb6\x07\xde\x1a\x38\x17\x13\x95\x88\x60\x88\x00\xf3\xea\x90\xb7\x9f\x28\xf6\xf5\x13\x45\x34\x5d\xe6\x96\x4c\x1b\x76\x94\x51\xdc\xc1\x30\x5c\x0a\x2b\x8f\xf5\x50\x62\x18\x36\xfa\xb6\x0f\xdf\x33\x90\x27\xd9\x8a\xad\x29\xfc\xf3\xbd\x1c\x8d\x2b\x7f\x04\xc8\x3e\xbc\x21\xd2\x2d\x68\x19\x16\x36\xb3\x7a\xdd\x10\xb1\x3c\xe9\xd5\xcc\xbc\xb8\xfb\xde\x5b\xae\xae\x9f\x24\xfa\x8f\xa5\x6e\x66\x72\xd7\xaf\x7a\x41\x45\x39\xf5\x16\xe9\x25\x78\xf3\x60\x1f\x7b\xd7\x02\xdb\x12\xc7\x73\xcf\xdd\x8c\xe5\x2c\x99\xd9\xe1\x88\x8a\x23\x46\x50\x91\x1c\x2e\x01\x0e\x97\x00\xfe\xef\x3e\xe2\x25\x80\xa3\xa6\x61\xb7\xf2\x86\xa8\x01\x70\x2f\x06\x02\xc1\x2a\x7c\x06\xb7\x07\x96\xc1\x59\xb9\x55\xfa\x6a\x40\xdf\x0b\x44\x20\x05\x3b\x77\x94\xe4\xe8\xe8\xf4\xf4\xe8\x48\xdf\x26\xa8\x85\xdb\xb5\xcb\xd9\x5f\x08\x2b\x33\x91\xe3\xa2\x0a\x37\x73\xc9\xeb\xa6\x05\xc3\x6d\xcf\xc7\x6e\x5f\xd7\xba\xad\xf6\x8a\x21\x7c\xaf\x00\x6d\x8b\x23\x3e\x8c\x82\xb2\xc5\xda\xf9\xf7\x5b\x19\x5e\x6b\x6e\x4d\x0d\xbe\xea\xa8\xc1\xe0\x79\x03\x76\x35\xd8\x2d\x8b\xe2\x8f\xe4\xad\xb0\x3d\x34\x4f\x28\x39\xc6\x0f\x4f\xb3\xaa\x3b\x51\x5f\x38\x5d\xb3\xb5\xa8\x1f\xc2\x2a\x42\x0b\x91\x2f\xf7\xa4\x2a\x09\x2f\xc1\x96\x5b\xb6\xf6\xc7\xb1\xea\x66\x3c\x42\xfc\x27\xfa\x19\x64\x0a\x9b\x38\x39\x44\x67\x2c\xa7\xce\xd2\x00\x7c\x34\x71\xb4\x71\x3a\xb6\x05\x6f\xb2\xf2\x8e\xdc\xd1\xda\x4b\xba\xab\x9f\x24\x43\x9e\xf3\x3b\xde\xc4\xb1\xee\x4d\xc4\x3c\x00\xaa\x0f\xc1\xae\x50\x7f\xc5\x90\x9d\xeb\x47\x61\x20\xd9\x55\x35\xf0\x5d\xbe\x8f\x02\xf7\x4e\xe9\xb0\xfe\xa5\xf4\xa9\xb5\x5a\xd1\xec\x21\xe3\xba\xec\x79\x5e\xe2\x3d\x8f\x48\x22\xf6\x48\xc7\x23\xee\x02\xf3\x29\x2e\x28\x03\x42\x20\xc4\x7b\xc1\xa3\x92\xf7\xdf\xa9\xef\xf6\x33\x08\x5b\xb6\xae\x44\x4d\xeb\x07\x92\xab\xf3\xf8\x83\x8e\x62\xd0\x7a\x1a\x78\x18\x0a\x1f\x9d\xca\xc7\x9d\x51\x49\xa0\x27\x39\xaf\xb7\xcd\xdf\x5f\xb3\x9c\x77\xeb\xd8\xe8\xc8\xaf\x2e\xaf\x95\x06\x05\x40\x11\x06\x51\x93\x66\xb7\x3e\xc4\x55\x10\xaa\x87\x0c\xd9\xd0\x9c\xd2\xa4\x17\x2f\x06\xd0\xa9\xe0\x81\xc2\x7d\x9a\xc8\xd9\x91\x3f\xe2\xa6\xc4\x60\x7b\x9c\xc0\x4b\xa9\x42\xfa\x2a\x1b\xe8\x58\x7d\xf1\x25\x11\x35\xf9\x00\xb6\x21\x31\x83\x76\x7f\x13\x44\x22\xeb\xc9\xf8\x7f\x18\x30\x3f\x47\xa3\x56\x89\x96\x16\x96\x6d\x9c\x14\x22\xa3\x85\x99\xb1\x9e\x55\x09\xcc\x95\x59\xfe\xfa\x36\x52\xce\x98\x6c\x0f\xda\x67\x08\x76\x14\x0d\xde\x6e\xf1\x0c\xd8\x1c\xa4\x54\xb4\xb9\x1e\xb9\x7a\x96\x3e\x3b\xec\xe8\x1d\x30\x66\x00\xaa\xb4\x7c\x5b\xaf\x2c\xd3\x84\x7b\xb9\xc2\x7c\x61\x37\x5c\x2a\x9a\xc8\xbb\x7f\x00\x01\x60\x49\x3d\x8e\xce\x01\x30\x50\x4d\xaf\xdd\xf7\xa6\x03\xe7\x4e\xb5\x4c\x39\x2f\x62\x09\xb7\x34\xc6\xe8\x37\x06\xca\xd0\xb7\xa2\x06\x6b\xbe\xe4\x45\x7f\xd1\x6b\x64\x3a\x33\xc0\x5d\xa9\xee\xf2\x13\xd6\xe9\xf8\x32\xed\x1a\x56\xcf\x6e\x3a\x9e\xef\x75\x81\x06\xb4\xed\x32\x8b\xd0\xb3\xef\xcf\xfb\x0a\xf6\x3d\x5f\xd4\x8c\x9c\xaf\x68\x59\xb2\xc2\x31\x99\x03\xb0\xc4\xa9\x80\xb2\x0b\xa1\x18\x40\x50\xdc\x03\xd2\xc3\xb7\x51\x05\xf5\x9c\xd0\x36\xdf\x08\x3c\x60\xd1\x45\x03\x03\xda\x88\xc9\xfb\x73\xd2\xd2\xfa\x86\xb5\xf2\x75\x52\x76\xeb\x05\xf3\xec\xa6\xe7\x83\xb2\x7b\xfe\xc2\xae\xdd\x2a\xb0\x70\x90\x7f\xfd\xf5\x63\x34\xe2\xc3\xd8\x1c\xdd\x8b\xba\xc8\xef\x79\x8e\x29\x3a\x0d\x39\x96\x02\x5f\x3e\x3f\x08\xc3\xfd\x3d\x9f\x02\xd4\x0f\x74\x4c\x05\xc6\xa0\x63\x04\x7a\xa6\xca\x85\xb8\xb4\x48\xc7\x20\x78\x0a\x03\x5e\x3e\xef\x38\x04\xa3\xe0\x7b\xd2\x27\x72\xf9\x1d\xe4\x61\xcc\x0c\x3b\xa8\x4e\xb9\xc6\x55\x90\xcf\x23\x13\x50\xf0\x17\x9d\x0a\xd1\x88\x76\x45\x1a\xbe\xee\x8a\x96\x96\x4c\x74\x4d\xf1\xe0\x59\x0a\x4f\x33\xe0\x21\x9b\x55\xb0\xdf\x71\xe9\xc6\xd8\x2e\xf3\xe5\xbe\x0d\x03\x60\x65\x9e\xe9\x09\xea\x19\xb1\xa9\xdb\xa6\x06\x73\x99\x1a\x60\x51\x7b\x65\xea\x82\x91\xdf\x05\xb2\xdd\x58\x46\x16\x54\xda\xad\xaa\xe8\x6e\xf8\x44\xd4\xfa\xc9\x72\xdb\x6c\xde\x8e\xf4\xd4\x23\x1c\xca\x50\x0a\xc3\x1f\x18\x48\xee\xf3\x68\x56\x19\xc9\x59\xc5\xca\x1c\xa0\xc2\xed\x4a\xf3\xed\x3d\xe8\xfc\x4e\x23\xac\xa2\xe0\xcf\x99\xe0\xe1\xe8\xb8\x77\xbf\xb7\x35\x95\x6a\x69\x2d\x15\x90\x8e\xd0\xf3\x25\xa1\xa5\x4f\x91\xec\x3f\x55\xe7\x9b\x37\xa1\x8f\x06\x4c\xf2\x58\x49\x83\xa8\xe3\x82\x8b\x5d\xa7\xf6\x4d\xa6\xf0\xe9\xdf\x77\xeb\xac\xbc\x28\xdc\xf1\xa9\x7c\x6e\xc2\x9e\xd7\x22\xca\x6f\x35\x23\x69\x46\xd8\x47\xd3\x93\x43\x19\xf7\x57\x99\xd7\xf7\x78\x39\x57\xcb\x42\x64\xb7\x51\x48\x22\xef\xf1\x9b\x83\x93\xb2\xfa\x70\x08\x25\x22\xcf\xc0\x13\xdd\x1d\x3f\x19\xab\x3d\xe4\x98\x1b\x48\x29\x50\xe2\xe5\xe2\xaf\xc5\xd4\x0a\x6f\x14\xd8\xa2\xa2\x21\xee\xca\x49\x4c\x83\x08\xcf\x84\xb6\xb4\x49\x02\x15\x1c\x22\xea\x36\xac\xc5\x7c\x40\x00\x28\x5b\xb3\x96\x02\x9c\xe8\xec\x6f\xa1\x6b\x47\xd5\x67\x2d\x43\xba\x33\xba\xff\x96\x31\x28\x13\x65\xc3\x73\xa6\xa4\xe7\x72\x2e\x00\x0b\x75\x17\x83\xab\x7e\xf1\xcb\x97\x68\x94\x00\xf9\xd5\x41\x9f\x2d\xa9\x4f\x87\x58\xda\xf6\x1c\xe0\xeb\xf3\xd2\x59\x44\x4a\xd2\xa3\xc5\x82\x6e\x32\x66\x89\x24\x23\x21\xaa\x8f\x7e\x3a\x7f\xd7\x7f\xa9\xbf\x01\x7e\x3a\x7f\xf7\x5f\x41\xb4\x71\x93\x31\x0b\x79\x9e\xf3\xe6\xf6\xc0\xb2\xf1\x07\x60\xd9\xd8\x98\xf5\x6f\x3d\x86\x76\xa0\xd8\xf8\x8a\x29\x36\x9e\x48\x47\x91\xbd\x06\x3a\xab\x3c\xc1\x17\xd0\x3c\x12\x6e\x90\xe2\xea\xc2\x25\x8f\x90\x06\xe3\x14\xe0\x4b\xfd\xfa\xac\x07\xba\xa3\x01\xf1\xe1\xdd\xa7\x1b\xc4\x47\xc0\xf7\xea\xe1\x48\x87\xce\x9f\x9e\x11\xda\x40\xed\xda\x38\x12\x3f\xfd\x40\xed\x02\x6c\x8e\xab\x6c\x2b\xa7\x86\xb7\xd7\xac\x9a\xb0\x0c\x03\x57\x06\xbf\x3a\x88\x13\x2a\x72\xfa\x86\x43\x1e\x01\x52\xbd\x1a\xce\xd6\xc9\x69\xc7\x28\xe1\x29\xb9\x78\x77\x75\xfd\xee\xfc\xec\xf3\xbb\x8b\x37\x44\xcb\xe7\xae\x63\x7a\x4a\x3e\x0b\x1b\x56\x9c\x3c\x15\x58\x3e\x35\xc8\x87\xb4\xed\x3a\x51\x6a\x93\x96\xf6\x2e\x16\x40\x51\x68\x49\x2e\x4b\xde\x9a\xac\x25\x9f\xe3\x95\x15\xa2\x34\xc4\xfe\x95\x50\x11\xcd\x1b\xde\x9e\xa0\x9b\xa5\x50\xd7\x57\xac\xff\x1b\x93\x22\x19\xb9\xc2\x5c\x0a\xd3\xec\x89\x93\x73\xc4\x81\x43\xe7\x23\xc4\xb2\x65\xe0\x4d\x82\xcd\xfc\x00\x2b\x62\x53\x12\x75\x8e\xa1\xc6\x37\xf1\x6c\x22\x8b\x7c\x02\x31\x87\xa3\xd3\x23\xed\x1a\x15\x06\xb7\x46\x27\xbe\x9a\x9f\x93\x7b\xd6\xe7\x34\xe1\x56\xee\xaf\xaa\x53\x42\x3e\x69\x8a\xd3\x13\xe9\xdd\x0c\xc0\x71\x3c\x85\x36\xba\xa5\xf6\xa6\x7b\x44\xbe\xb6\xdb\x4d\xb7\x70\x1b\xea\x4f\xf5\x01\x29\x77\xac\x0c\x98\xe1\x28\x25\xa8\x1b\x12\x39\x87\xd7\xb6\xe5\x5f\xae\x7f\xde\xed\xa7\x71\x5f\x45\xfe\xf0\xb9\x58\xaf\x79\x4b\x56\xb4\x59\x99\xb2\x3e\x9b\x8d\x60\x76\xf5\xf6\x2d\x0a\xe9\x39\x3b\x54\x5b\xe9\x3a\x2c\x18\x8f\xc2\x8d\x3f\xfa\x49\x7f\x79\x70\x60\x33\x1f\x6f\xa0\xc7\xfb\x34\x48\x0f\x3d\x3e\x94\x44\x35\x05\x35\x6b\xda\xbf\x3b\xf6\x29\x2b\x73\x44\x76\x8c\x26\x64\xd1\x2f\x7c\x74\xf0\xad\xb4\x14\x74\x58\xa0\xa3\x39\x6b\x29\x2f\x7c\x0e\x9f\x1d\xc1\x56\x54\xa2\x10\x37\x69\x78\xce\x23\x83\xf0\x1d\x66\x56\xcf\xe8\x4c\x8e\xee\x6e\xfe\x7f\x3c\x9a\xbc\x4e\x10\x97\x03\x61\xfb\x64\x3c\x61\xc8\xcb\x4e\x39\x78\x3d\x4b\x87\xf7\xea\x80\x0d\x47\xc1\xef\xa2\x2e\x2c\xf4\x3e\x58\x12\x5b\x3f\x5c\xb1\x7a\xcd\x1b\xa9\x4a\x46\x3d\x33\x8f\xd8\x27\x5c\x47\xbb\xb8\x6b\x66\xf7\x4d\xb9\x73\x53\x69\xa6\x01\x05\x27\xb5\xd0\x74\x69\xd2\x26\xd1\x18\x2c\xe1\x9e\x7a\xab\x6a\x36\x63\xbf\xf3\x06\x62\x15\x50\xbb\x20\x6a\x6b\xbd\xa7\x6e\xdc\x1c\x06\x0d\x1d\x82\xd2\x01\x2b\x7c\xb7\x78\x18\x66\x2c\x59\xcf\x67\x42\xa8\x0e\x07\x22\xc3\x6f\x51\x3c\x20\xa0\x28\x54\x23\x63\x80\x80\xde\x40\xa3\x45\xad\xc2\xed\x55\xcd\xef\x78\xc1\xa6\x69\x96\xda\x15\x2f\x6f\x1c\xf2\x60\xa0\x3a\x66\xaa\x0c\x8b\x6d\xf4\x41\xee\xdf\xa6\x75\x32\xe4\x26\xc4\xc2\x2e\xf8\xf8\xe9\x33\x29\x99\x14\xb6\xe2\xcd\xce\x87\x07\xd9\x0c\x4f\xae\xf1\x6c\x36\x83\x78\xca\xf1\xbf\xa5\x5f\x9a\x17\x2f\xc9\xaf\x4c\xfd\xba\x74\xcf\xe5\x8e\xcf\x5a\x72\xbf\x12\x70\xa2\xee\x1a\xd5\xaf\xd0\x3c\xae\x91\xd6\x91\x96\xb9\x7e\xf7\x95\x7c\x5f\xba\x85\x68\xec\x7a\x52\xa0\xea\xbf\x21\xf6\xe6\x70\x6b\x1f\x36\x59\xeb\xea\xd0\xb1\x71\xd6\x9c\x15\x68\xa0\x2c\x02\xb9\xda\x50\xe9\xda\x3c\xac\x0b\x5e\xde\x02\x41\xbc\x52\x66\x72\x4d\xa8\x14\xc6\xf2\x56\xaf\xd6\x9a\xd1\x02\x75\x7a\x9a\xf2\xd9\x66\xce\x77\xd2\xe7\x6d\x42\xf0\xf4\xf3\x43\x85\x59\x0f\x46\x15\xa8\x44\x10\x57\xe5\xbe\x78\x91\x86\x68\xfd\xc4\x3d\x0e\x1e\x8c\xb7\xd4\xa4\xbc\x89\x43\x88\x3a\xba\x9c\x9f\xcf\x2f\x07\x44\x5e\xf8\x59\x2f\xac\xaf\xf5\xe1\x44\x4f\xb7\x0b\xeb\xfb\x61\x81\xa6\xc2\xfa\x53\x06\x11\xba\xbc\xbb\x67\x99\xad\x68\x75\xd6\xb5\xab\x0b\xde\x64\xe2\x8e\x45\x1f\x6a\x34\x6c\x98\x0a\xad\x13\xae\x07\x11\xa5\x90\xf3\xbf\x9f\x5d\xc5\x72\x88\xc4\xa4\x13\xe8\x76\xce\x59\x93\x70\x02\x1a\x6f\xa5\x92\xb1\xf7\x36\x1e\x2e\x43\xbe\xa1\xcb\x10\xd8\x3f\xdf\xfa\x05\x08\x2f\x79\xcb\x69\x2b\x02\x35\x80\xfd\xa8\x40\xd7\xb4\x62\xad\xb6\xc2\xa5\x16\x00\x17\xdb\x60\x8c\x7b\x32\xfd\x16\xd9\xc1\x11\xe6\x70\xba\xca\x1a\x6e\xd0\xf6\x06\x69\x98\x27\xa4\x64\xf7\xf8\xab\x5e\xeb\xa4\xdf\xfe\xab\x4a\xa2\x95\x6b\x95\x16\x7f\x7b\xf3\x57\xe7\x1a\xe5\x6f\xa6\x1c\x5b\x15\xe9\x7a\x24\x5a\xe8\x3a\xe0\x31\xd8\x2d\xe0\x41\x08\xff\x2d\x56\xf7\xa8\xd0\x1d\x8e\xf3\x3f\x3b\x5a\xe0\x48\x7d\xdc\x35\xfe\xd4\x1f\xe5\xc8\xc6\xe8\xd9\xd6\xa3\xfb\xd1\x44\x00\xba\x86\x81\x15\xc4\x6f\xb4\x35\x2d\x1b\x39\xe4\xb1\xc0\x4f\x47\xea\xd2\xeb\x88\x1c\xb7\x59\x15\x44\x7d\xda\x53\x4a\x3c\x36\x56\x8d\xf0\xcf\x26\x15\x7e\xfa\xd7\xf7\x78\x43\x04\xeb\x31\x36\x10\xd3\x6b\xe8\x15\xbc\x4a\x7e\xe6\x4d\x8b\x19\x98\x28\x0b\x88\xb2\x20\x31\xda\x77\x93\x57\x92\xcb\x2b\x80\xe5\xac\xfe\x45\xf3\xbc\x7e\x83\xf6\x4c\x83\x91\xd4\x70\x7a\x13\x86\x0c\x2f\x82\x3d\xe9\xb8\x7d\xa8\x78\x06\x47\xb5\xcf\xe7\x57\x20\xa3\x21\x7f\xf9\x11\xd1\x13\xfe\xf7\x4f\x3f\xbe\xf6\x4c\xe6\x53\x65\xaa\x27\xc6\x3b\x9e\xf0\xbe\x69\x27\x47\x21\x35\x37\x12\x1c\x95\xb9\xe5\x59\x53\x7b\x15\x57\x95\x9c\x2e\xa3\xb3\x63\xdd\x99\x43\x7e\xdf\xb3\xe2\xf6\xe1\xd4\xa1\x3e\xd8\x5e\x93\xa0\x12\xb9\x1a\x28\x11\xe2\xa5\xc2\xdc\x46\x89\x38\xaa\xc2\xe7\x30\xa5\x2a\x91\x9d\x4f\x8b\xfc\xb7\xf1\x9e\xce\xa4\x25\x99\xf8\x8b\x3b\xf2\xdb\x9c\x34\xa7\xb7\x44\x7f\x2b\xa0\xfe\x90\x67\x42\xe7\xc6\x0e\x2a\x00\x2e\x3e\xce\xff\xf5\xf3\xd9\xdb\x77\x3f\x2b\x4e\x07\x48\x21\x40\x78\x35\xcf\x0d\xe4\x36\x59\x5f\xf1\x3b\x69\x7c\xd5\x07\x26\xa8\x8c\xbb\x99\xf9\x38\xe0\xf3\x2d\xc9\xc7\x49\x32\xdf\xc4\x9a\xf6\x5d\x63\x38\xe5\x72\xa2\xe7\x8f\x10\x04\xd3\x11\x56\xf6\x7b\xbf\xaa\x43\x0e\x46\xc3\x6a\x40\x7e\x7c\xb4\xd0\xcd\x64\x47\xc9\x33\xdc\x3b\xc8\x1e\xe3\x28\xe0\xd1\xcf\xd3\xe3\xed\x6e\x1c\x9e\x75\x1c\x43\x96\xbf\x8e\x2f\x85\x3a\x9a\xc3\xb7\xf5\xad\x95\xdc\x25\x98\x6a\x54\x4b\x35\x2e\x15\x38\x6b\x9a\x30\x88\xc9\x70\x85\x3d\xdb\x3a\xda\x3a\xfa\x37\x53\xed\xdf\x46\x61\xdb\xac\x1e\x54\xc9\xe7\x05\xe5\x13\x28\x14\x83\x5d\x3b\xf6\x22\xfe\x73\x8e\x41\xc2\xde\x55\x8c\xa9\x53\x99\x52\xe2\x82\x50\x32\x2a\xd3\xe4\x33\x50\x75\xbc\x05\x3c\xc0\x88\xd0\x47\xca\x0c\xda\x61\x98\xe9\xc9\xb4\x1f\xe1\x27\x99\x6c\xcc\xd6\x0a\x11\xde\x4e\x49\x9e\x3b\xd7\x2f\x0c\x6b\xfd\x26\x86\xc9\xef\xaf\x6f\x0e\xa0\x26\x0c\xaf\x84\xae\x69\xec\x41\xdd\xef\x5d\x47\xec\x38\xc2\xe4\x51\x34\xf1\xaf\x89\x35\x5f\xe1\x53\xff\xee\xe7\x9f\x90\x1a\x30\x2b\x69\xab\xed\xbe\x12\xad\x28\x93\x13\xff\xaf\x46\x5e\xeb\xef\x6f\xfc\xc6\x39\x96\xa6\x14\xd3\xe1\x01\x23\x02\xf3\x38\xc7\xe8\x76\x27\x89\x75\xb7\xdc\x7a\xff\xad\x45\xaa\x7b\x83\x84\x88\x49\x25\xc9\xa3\xcb\x61\x2e\x2f\x94\x33\xa7\x4b\x5e\x1a\xb5\x38\x88\x5d\x1d\xce\x3a\xf0\xf4\xd7\x9b\x83\xbf\xbb\x39\xcd\xb7\x63\xbd\x94\x13\x7a\x2f\xea\xf8\xa2\xf4\xab\xde\x0b\x83\x0c\x05\xf5\xb7\x61\xcd\xd8\x94\x8b\xff\xb5\xec\x92\x39\x5c\xb7\x3a\x5d\x19\xbb\x4d\xd1\x7b\xc7\x33\xc5\x63\x9b\x2a\x6a\xeb\x78\x64\x8e\x6c\x2a\xdc\x3a\xe1\x2d\xe3\xb3\x78\xfb\xdb\x4c\x89\x46\x2a\xb6\xc0\x39\x04\xa0\x94\x5a\xe0\xbc\x93\x27\x9f\xc8\xb4\xfb\x8b\xfa\xba\x3a\xf0\xcb\xf9\xb1\xea\x83\x9a\x2d\x14\x4a\xc5\x7a\x56\x3a\x5c\xc3\x60\x19\xa1\x13\x10\x9f\x7c\x29\x6a\x80\xad\xe2\x58\xbe\x6c\x21\x39\x55\x89\xf2\x89\x22\x9f\x58\xd3\x6a\x12\x6c\x52\xaa\x04\x17\xda\x7c\xcb\xed\x9f\x8e\xd0\xff\x21\x04\xcb\xef\x82\xef\x47\xa9\x00\x0f\x2c\xff\x28\xd4\xbe\x47\xe8\x14\x08\x7f\x00\x6a\xdf\x23\x31\x15\xa2\xd8\x81\x20\xf6\x48\x8d\x06\x27\xb6\xe0\xc3\x4f\x70\x89\xa3\x96\x61\xe4\x42\xd0\x00\xfb\x3a\x59\x14\xb7\x81\x97\x9d\x20\x0d\x5a\xff\xca\x48\xc4\x91\x56\xd8\x02\x96\xdf\x96\x16\xa2\xbc\x09\xa3\xf9\x0a\x37\xd9\x81\xe5\x26\x97\xe0\xa1\xf2\x06\xcb\x63\x51\x67\x03\x74\xd8\x13\x9d\x73\x21\x17\x2c\x43\x87\xe5\xc5\x86\x7a\x69\x6f\xb9\x9d\x69\x65\x10\x8d\x3c\x0d\x41\x37\x38\x49\xa3\xfd\x89\x60\x3a\x8e\x10\x49\x5c\x36\xe4\x30\xe7\x71\x94\xc4\x71\x5e\x64\x37\xab\x64\xc0\x7e\x1c\x25\xd5\xcf\x90\x8c\xd2\x47\x78\x90\xa3\x64\xb7\x21\xae\xe4\x11\x46\xe4\x28\xc1\x31\xac\xc9\x86\x1b\x39\x4a\x62\x12\x7f\x72\x74\xe7\x93\x98\x94\xe3\x96\x95\xc3\xb6\x1c\xe4\x54\x8e\x92\x38\xc1\xbb\x3c\xc5\xae\x1c\x25\x33\x86\xcb\x94\xa4\x6c\xd1\x64\x56\xe6\x28\x99\x24\x8a\xbb\xd9\x3e\x29\xda\x07\x9f\x08\x3e\x67\xfb\xec\xc8\xec\x6c\x9f\x24\x20\x6a\x7c\x62\x88\x1e\x26\x5a\xea\xa7\x7c\x88\x96\x49\x1c\x72\x08\x3f\xf9\x43\x82\xc8\x09\x9a\x88\x09\x1a\x88\x04\xc1\x1e\xc2\x08\x97\x10\x22\x49\xe2\x7e\xa8\x23\xec\x13\x4d\x22\x91\x20\x33\x8d\x3c\x69\xf8\xa4\x10\x4b\xd8\x27\x9e\x62\xc2\x3e\x31\x64\x13\xf6\x89\xe7\x9e\x4e\x59\xce\x86\xa5\x3a\xc0\x42\x9d\x20\x73\x94\xaf\xda\xd2\x76\xf5\xf8\xa8\x13\xc4\x7a\x99\xab\x13\xa5\x25\x2b\x9f\x58\x90\x79\x7c\x42\xbc\xd5\xee\x37\x03\x45\x07\xf6\x89\xe6\xc3\x71\xbf\xee\xcb\x6c\xb2\x4f\x38\xc9\x06\x9f\xaf\x39\xd5\x06\x9f\xd4\x84\x9b\x28\xa1\xe1\xa4\x1c\x7c\x92\x56\x55\x98\x2b\xdb\x3e\xc9\xac\xd9\x51\xdd\x32\xcc\xda\x31\xfc\xd9\xc3\x5e\xfa\x23\x53\xfd\xef\x46\xac\xd9\x20\x13\xa3\xf3\xd5\xf0\xc9\xce\x91\x06\x67\xbb\x60\xaf\xac\x03\xf3\xfc\x67\xbb\x4d\x56\xbd\x0d\xda\xbb\xa8\xe9\x8d\xb4\x04\xdb\xba\xb7\x21\x2e\xbe\x48\x5d\x3c\x40\x43\xf4\xb3\xf2\xc5\xda\xd5\x08\xee\x3e\xe7\xdb\xc9\x0e\x73\x2c\x9f\x9f\x7d\xe2\x99\xfd\x92\x5c\x51\xe4\x00\x0c\x70\xfc\x25\x48\xdc\x85\x0d\xd0\x3e\xe9\x03\x4a\x92\x19\x02\xed\x13\xc7\x15\x98\x24\x92\x58\x66\xc1\x20\x6b\x60\xa2\xe0\x04\x8e\x41\xe7\xa5\xf4\xa3\x12\x49\xe5\x1d\xb4\x4f\x2c\x03\x61\x62\xcf\x75\x82\xc4\xb6\x5c\x84\xf6\xd9\x6a\x38\xd2\x1c\x38\x92\xc4\x54\x38\x6c\x5a\xb4\x8f\x46\x0e\x87\xda\xc3\xa1\x36\xf2\xf9\x03\x1c\x6a\x43\x5c\x8a\x89\x67\xd0\x1e\x28\xda\x14\xab\x62\x82\xcc\x4d\xfe\xc5\x49\x7e\xc5\x94\x63\xed\x24\x13\x63\x9f\x69\x31\xd1\x31\x08\x72\x32\x46\x72\x2e\x3a\x52\xd3\xd5\x6e\x2a\x0f\xa3\x7d\xd2\x19\x19\x53\xb6\x92\xf4\x97\xe2\xb9\x19\x13\x24\xf7\x59\x1c\xc3\x2c\x8d\x29\xfe\xd1\x96\x7c\x8e\xf6\xd9\xce\x2f\x4b\xe6\x78\xb4\x4f\x1c\xdb\x63\xa2\x1f\xe1\x72\x43\x6e\xcf\xfb\x68\x9f\x2d\x9d\xab\x04\x2e\x48\xe7\xa5\x48\x56\xc8\xc4\x21\x51\x7b\xc1\xcf\x0f\x99\x28\x33\x8e\x4d\xd2\x3e\x5b\x0e\x63\x0a\xc3\xa4\x7d\xf6\xcb\x35\xb9\x63\x27\xb6\xf1\x2c\x23\x99\x28\x87\x2d\x4b\x70\x2c\x53\x03\x96\xcf\x1f\x86\x8c\x16\x8c\x89\x3b\x7b\x08\x13\x29\xbe\x03\x75\xfb\xff\xf5\x44\x80\x9e\xf0\x76\x5f\x55\x74\x06\x30\x16\xed\x93\x72\xb5\x1f\x1f\x7d\x38\x5c\xed\x3f\xce\xd5\xfe\x5c\x71\x75\x1c\xee\xf5\x47\x7b\x73\xb8\xd7\xb7\xcf\xe1\x5e\xff\x10\x02\x39\x84\x40\x36\x9f\xc3\xbd\x7e\xaf\x5b\x87\x7b\xfd\xc3\xbd\xfe\xe1\x5e\xdf\xf7\xec\xf5\x5e\x5f\xb9\xe7\x78\xa9\x1f\xbd\xf8\xbe\x92\x3b\x7d\xc5\x92\x75\x96\x65\xa2\x2b\xdb\xcf\xe2\x96\x05\xaf\xf6\xa2\x0e\x6d\x1b\x52\x83\x1d\x7c\xbc\x13\x1e\xed\x72\x2e\x4f\x52\xc9\xb3\x7d\xa6\x5e\xd4\x87\x1c\x69\x61\xca\x9c\xe5\x46\x62\x6c\xc8\x57\xbe\xdc\xca\x51\x38\x25\x67\xa4\x66\x19\xaf\x38\x43\x1a\x7c\x8a\x9f\xe3\x72\xd0\xf4\x1e\x91\x8e\x7e\xc3\x8a\xa5\x22\x46\x28\x1d\x62\x2d\xe7\x6c\xa2\x54\xbf\x6e\x6e\x94\x5c\xa5\x54\xa0\x59\xe8\x0e\x08\x8d\xd2\xaf\x19\xc7\x6a\xf6\x6f\xe5\x71\xc4\xf5\x1e\x7b\xfe\xd9\x69\x89\x1b\xf4\xc2\xa1\x8d\xe1\x05\xdb\x68\x24\xad\xb8\x42\x2c\xd8\xb7\x86\x60\xbf\x57\xbc\x86\x65\x3d\x67\x99\x28\x7d\x3c\xc8\xf6\xe9\x2d\x9e\x77\x43\x09\x7a\x15\xa9\xf8\x72\xe4\x31\x36\xef\x6a\xc3\x7b\x7c\x47\x0b\x9e\xf3\xf6\xc1\x5c\x9d\x2b\x8a\x3b\x8a\xfb\x4c\x0d\x74\x94\xd8\xb3\xc6\xce\x32\xa1\x55\x55\x0b\x9a\xad\x58\xe3\xf4\x1b\x7d\x60\x55\x59\x19\x25\x53\xd7\xbd\x20\x79\x24\x38\xc0\x20\x57\xfa\x49\xc5\x03\xa9\x45\xab\xd3\x46\x54\xc3\xe3\x8e\x9f\xbd\xce\xe1\xb1\x07\x1b\x85\x3f\x81\x2e\x49\x5b\x3f\x40\xfe\x49\x5c\x08\xd5\x69\x0a\x8e\x00\x5f\xba\xff\xd3\x10\x51\xe4\x1a\xdc\xe8\x2f\xaf\xe3\x8e\x7e\xac\xce\xd4\x9e\x86\xe3\x0d\x5f\x43\x84\xb3\x90\x3e\xa2\x34\x0d\xfd\x1f\x88\x5b\xe4\xb6\x11\x7f\xfa\x81\xac\x44\x57\x37\xa7\x6e\x0d\xe4\xf7\xf0\x19\x9e\xcf\x63\x6f\xc9\xa4\x63\xd9\x92\x82\xd1\xa6\x25\xdf\xbf\x26\x6b\x5e\x76\xd2\x35\x88\x78\xd7\x71\xcd\x7f\xfc\x21\x7a\xbb\xc5\x3a\xe5\xb1\xee\xf8\x66\xe2\x83\xda\x55\x15\x82\x9e\x2b\xaf\x5c\x69\x95\x50\xd5\xad\xf3\xfb\x40\x78\x30\xb8\x87\x54\xa6\xc8\x9d\xb9\xb2\x15\x7b\xd6\x35\xb1\xde\x6d\x94\xb7\x1a\x69\xf7\xa3\xbe\x16\x72\x62\x43\x25\xa4\xea\x82\x63\xf4\xaf\x81\x06\xfc\xd6\x89\xc5\x43\x1b\x53\x53\xfe\x4f\xfc\x66\xbf\x98\x5c\x7f\x38\x0e\x1e\x35\xd1\xe1\x1e\x97\x87\xc5\x8e\x1a\xfd\x76\xd8\xfb\xb8\x91\xa7\xe9\xc8\xba\x41\x38\x79\xeb\xd3\xa0\x0e\xd3\x66\x19\x43\xce\xe1\x0b\xcb\x16\x57\x0a\x94\x1b\x98\xb2\x7d\xd6\x5c\x7b\x11\x9a\xf4\x38\xeb\xfa\x41\x9f\xf2\xdd\x3f\x2f\x44\x8c\x3f\x5c\xb3\x1b\xde\xb4\x09\x14\x3c\xf8\xf5\xfe\x72\x6a\x78\x79\x83\x94\x09\xeb\xae\x68\x79\x55\x98\x9e\x7b\xfa\x6b\x44\x29\x5b\xe7\x86\x8c\xa9\x13\x9b\xa4\x08\x5a\x80\x10\x7b\x81\x6b\x83\x63\xf3\xfb\xac\x6c\x11\xa9\xbf\x96\xc6\xb4\xa2\x35\x35\x03\x0b\xa4\xe4\xcd\x4b\x15\x97\xa6\x99\x37\xfd\x4d\x61\xdf\x48\xcb\x55\xd3\xc2\x0c\x97\x7b\x81\xbb\xcb\x62\x6b\x59\x49\x4b\xcf\x2d\x50\x3f\xac\x02\x5f\x26\xe2\x5e\x67\x92\x2a\x26\xa6\xc1\x2a\x0b\x96\x3c\xbf\xa5\xd9\x2d\x2b\x73\xa0\xd3\xc3\x21\xc9\x1f\x4a\xba\x56\x18\xa6\x86\x74\x8c\xe5\x03\xc9\x93\x95\xe5\xf2\xc1\x28\x23\x96\x4c\x6b\x20\x86\x00\x13\x78\xc4\xf8\x74\x4d\x34\xc8\xd7\x97\x46\xfa\x02\x7e\x1d\xd1\xe0\x9d\x6a\xcd\xef\x32\xa6\xdc\x26\x4f\x97\xe4\x8f\xef\xd2\xf8\x3b\x0f\xee\xc7\x46\xf3\x15\xe6\x07\x77\x56\x3e\x04\x2f\xcd\x35\x17\x20\xfe\xd1\x42\xaa\x05\xdf\xf9\x47\x17\xd6\x0f\x16\xc5\xe2\x61\x57\xc2\xae\x30\x47\x15\x6e\x8d\x89\x3f\x7b\xf0\x18\x02\xb6\xae\x5e\xc4\xe0\x24\x1c\x5d\xbf\xbd\xe8\x6b\xa5\x6b\x9a\x8b\x86\xbc\x2d\x44\x76\x4b\x2e\x18\x9c\x03\x5c\x7b\x37\x31\x12\x43\x08\xc5\x1d\xb9\xab\xea\x45\xbe\x3b\xb7\xc0\x01\x0f\xff\x1b\xc2\xc3\xaf\x17\xbe\x01\xf8\x36\xd0\xf0\xd7\xf4\x26\x9e\x4e\x45\x9e\xd8\x61\xab\xc1\x6b\x1a\xa6\x75\xcb\x2d\xf2\xdd\x4a\xdc\xcf\x5a\x31\xeb\x1a\x36\xe3\x9e\xc4\x97\x88\x5e\xdc\xb2\x07\xf9\xd7\xd8\x7e\xfc\x03\xbf\xde\x3b\x2e\xb5\x02\x2e\x1e\xe0\x73\x69\xf1\xaf\xdf\x5e\x48\x33\x13\x83\xee\xc6\x1b\xf2\x8a\xb5\xd9\xab\x8c\x55\xab\x57\xaa\x29\x5f\xc5\xb0\xac\x45\xc9\x5b\x51\x47\x33\xe0\x9d\x91\x4c\x14\x85\x42\xd5\x10\x4b\x72\xce\xaa\x95\x11\xf2\xf8\x3d\x7a\x2a\x84\xf4\x4a\x88\x58\x04\x69\x67\xc9\xcb\xb7\xd4\x8a\x77\x26\xbe\x5e\xa4\x2a\x98\xa7\x5e\x04\xdf\x18\x01\xf1\x23\x0c\xcf\x7e\x81\xe5\x8f\xe6\xfa\x05\x38\x86\x3a\x77\x4f\x7d\x1c\x79\x25\xd8\x33\x42\xae\x9a\x21\x97\x4b\x74\xc7\x73\x96\x13\x71\xc7\xea\x9a\xe7\xac\x21\x46\x9b\xb8\x27\x5f\x5e\xec\x89\x20\x70\xab\x31\x3d\xc0\xe0\x3f\x2b\x0c\x7e\xc2\x31\xc9\x51\x5e\xf2\xad\x4d\xe5\x45\xf3\x35\x2f\x13\x61\x5d\x9f\x56\x7d\x05\xe1\xec\xa5\x1f\x32\xf1\x37\x6d\xb8\xb6\x39\x88\x34\x19\x2d\xd8\xe5\xa7\x88\xc3\xc8\x1c\xbf\xd9\x3f\x8f\xe8\x0f\x1d\x64\xd3\xad\xb0\x1c\xff\x61\x16\x3b\x29\x45\x3e\x15\x9b\xfe\xe3\xa2\x9d\x3a\x6b\x19\xc1\x1c\x77\x31\x94\x37\xb4\x65\xf7\x34\x9a\x65\x5c\x77\xa5\x8f\x29\x6e\xa6\xfe\xec\xea\x92\xfc\x84\x12\x77\x03\x59\xad\x45\x8b\x1e\xd9\x85\x58\x53\x1e\xcd\xa4\xe4\x80\x43\xbb\xcd\xba\x32\xe2\x08\xca\x93\x56\x28\x70\xce\x40\xdc\xb1\x4e\x9e\xb3\xd4\x09\xe8\x80\x74\xb9\x67\xa7\xc2\xfa\x14\x4e\x10\x48\xa7\xfa\x5a\x12\x1b\x35\x8b\x81\x40\x96\xbd\xa8\x26\x0d\x2b\x1b\x0e\xb7\x40\x4e\x72\x82\xe2\x0f\x45\xf2\x59\xcc\xd4\x45\xc7\xc3\xb7\xf3\x7e\x16\x37\xbc\xd4\xfb\x56\xa8\x2b\xcd\x25\xf5\xf9\x22\x07\x4f\xe1\x59\x3d\x85\xa6\x29\xde\x95\x74\x51\xf8\xae\xd3\xfa\x8a\xbf\xa0\x37\x72\xd1\x31\x78\xeb\x55\xce\x1b\xf9\x5f\x32\x9f\xff\x0c\x81\xf4\xae\xd4\x9e\x6d\x20\xb5\x59\xa9\x3d\x53\xcd\x83\xdb\x76\xb7\xfd\x84\x7a\x27\x01\x89\xf4\xb2\xcc\x65\x73\x59\xd3\xcb\x4f\x52\x72\x10\x64\xd5\xa4\x98\x43\x26\x87\xff\xbe\xe6\xf3\x8a\x67\xb7\x57\x4e\xbc\x5c\xd4\xf2\xb3\xd2\xf9\xa8\x67\x8e\x86\x7f\xdb\x45\x61\xaa\x46\x5f\xc5\x1f\x5b\x3f\x3b\x1a\x7f\xae\xba\x2c\x5f\x27\xb4\x69\x44\xc6\xed\x05\x49\x00\x30\xd5\x1a\x8b\x1c\x8c\xc5\x6e\xdd\x00\x4b\xbf\xa5\xfd\xd2\x13\xa7\x89\xb1\x1b\xc7\x2a\xf9\x0f\xa1\x6a\x1c\x76\x6a\x3a\x2e\x94\x04\xa6\x86\xcf\x3d\x6e\x06\xed\xfb\x61\x44\xdf\xc4\xed\x55\x04\x30\xac\xd4\xb5\x37\xa6\xe8\x70\x36\x27\xd1\x70\x34\xa8\x8b\xe6\x47\x8c\xfd\x2b\x2f\x69\xe2\xaf\xc6\xee\x4d\xfd\x7d\xda\x67\x0c\x79\xe4\x9e\x22\xaa\xb1\xf3\xf9\xe0\xda\x12\x3f\x53\xc1\x7e\x48\xdc\xaa\x44\xd5\x15\x74\xf2\xde\x72\x83\xf8\x62\x07\x0a\x18\xfc\xf5\x6d\xaf\x04\xd2\x51\x98\xfd\x45\x06\x7d\x40\x66\x7f\x04\x5f\x43\x35\xc7\x01\x32\x87\x21\x46\x5a\x41\x5e\xff\xf8\xc3\x0f\x53\xe0\xcd\x93\x10\xcd\x5e\x0f\xd5\x07\xde\xec\x83\x68\xf6\x0a\xf5\x82\x37\x4f\x95\x08\xf8\x2e\xeb\xa6\xc1\x9b\xa7\xdd\x81\xfd\xa1\x37\x07\x62\xab\xa9\xf5\x7c\x6e\xad\x9e\x2f\xc2\x15\xae\xe2\x1b\xaf\x6f\xf3\xc8\xf4\xd4\xee\xf9\xeb\xf2\x7c\x32\x47\x2a\xf6\x22\xab\xf1\x02\x67\x27\x9b\xe8\xb0\xaf\x1a\xbc\xa4\xca\x3b\xb7\xaa\x2e\xd0\x52\x7f\xbd\xdd\x44\x2d\x9d\x47\xe6\x78\x95\x5d\xb8\x82\xce\x23\xb2\x57\x5b\x17\xa8\xb4\x48\x43\x13\x0f\xd7\xc8\x45\x55\xbf\xc5\x66\x62\x47\x54\xba\xed\x58\xdf\x16\x9d\x74\x17\x53\xcb\x96\x62\x5c\x6c\x5d\x5a\x40\x28\xf1\xd7\xad\x4d\x55\xa3\x05\xa5\x8e\x57\xab\xf9\x6a\xd0\x82\x22\xfd\x66\x64\xbb\xca\xb3\xe8\x7a\x33\xc7\x64\x04\x85\x46\x57\x99\xa5\xd4\x96\xc5\x27\xaf\xc6\x24\xae\xc6\x57\x8f\x39\x35\x61\xc1\x8e\xfb\x6b\xc6\xc6\x2b\xc1\xa2\x56\xd2\x66\xa5\x98\xbf\xfe\x2b\x28\x34\xa6\x3e\x2c\x72\xf3\xc6\x64\xcb\x86\x2a\xc0\x82\x99\xb4\x7b\x49\x8f\x8d\xa9\x32\x4a\xaf\x2d\x32\xd6\xc5\xab\xe5\xfd\x25\x45\xf1\xc1\xbc\x14\x9e\x3e\x37\x46\xa5\x8e\x1e\xda\xc1\xc5\x04\x23\x0b\x5a\xe8\xf5\x20\xba\x89\x4b\xd2\x7d\x1d\x3e\x48\xcc\x62\x0b\x1d\xcc\xf0\xf7\x44\x0c\xb1\xad\x8a\x45\x7c\x9a\x0f\xae\x4b\xcc\xc7\x87\x5b\x92\x6f\x9c\x13\xee\x10\xdc\xdf\xec\xa4\x0d\xee\x37\x3d\x08\x25\x1d\x94\x40\xdf\x69\x29\x6a\x22\x16\x0a\x3c\x36\xe0\xab\xdb\x0d\x73\x76\x75\x29\xcf\xf3\x50\x31\x46\x8b\xe6\x94\x8c\xd4\xef\x2b\x37\x28\x74\xfe\xb1\x27\x1c\xda\xb6\x6c\x5d\xb5\xbe\xa5\x70\x88\xed\x3f\x6b\x6c\x3f\x39\x20\xf9\x8b\x79\xc1\x50\x23\x77\x6b\x5a\xce\xe4\x6e\x83\x28\xbf\x13\x6c\xf5\xf4\x60\xa8\xa9\x4f\x89\xce\x66\x86\x01\x85\xd0\x0d\x14\x32\xf4\x38\xda\x89\x2f\x46\x60\xd9\x7b\xf7\x13\xa1\x05\x59\xc9\xa3\x82\xc6\x78\xb0\x3f\x33\x31\xcc\xa9\xf5\xaa\x20\xe8\xaa\x19\x21\xbd\x15\x1d\x5b\xdf\x3b\xb1\xb7\x2b\x16\xca\xde\xbf\x82\xea\x1b\xfb\x7e\xff\x0c\x83\x87\x18\x5a\x14\xe2\x1e\xdb\x6b\xed\x60\x60\xb8\xa1\x67\x58\x22\x08\xb5\x28\x5c\x1e\xf4\x55\x34\xd9\xed\x02\xe8\xa4\x56\x9e\x92\xbc\x8e\x3f\x1c\x0d\x6a\x75\xb5\x38\x67\xad\xbb\xd8\xe4\x31\xba\xc4\x84\x74\xf9\x6f\x9d\xd9\x14\xe8\xb8\xbe\x38\x5a\xb0\x15\xbd\xe3\xa2\xab\x51\x6e\x2b\xc8\x0b\xf5\x27\x30\x5a\x0f\xa2\x33\xc1\xc2\x2e\x90\x30\x6b\x46\xb1\x19\x99\xa9\x8f\xf6\x8f\x70\x98\xcb\x85\x8e\xa3\xcc\xd8\xef\xdc\x5b\x4e\xb8\x31\x66\x7a\x92\x34\x6a\xe7\xa3\x39\x5e\x77\x4d\x25\xad\x62\x34\xe5\xe8\x2f\xee\xf7\xfb\x0e\xd8\xdd\x1c\xfe\xf4\xad\x11\x8e\x1e\x5c\xb0\xb1\xc7\x5c\x17\x16\x3c\x7b\x88\x26\xdb\xb4\xd7\x84\xf2\x35\xf2\x96\x36\x2c\x27\x1f\x68\x49\x6f\xf0\xec\x7b\x3c\xbf\x7a\xfb\xe1\xa5\x9c\xc2\x40\x78\xe3\xf2\x62\xec\x96\x51\xcb\x47\xf1\x1f\x77\xab\x4f\x19\xf4\x31\xc1\x0c\xee\xad\x97\x3b\x56\xd8\x68\x83\xe5\x47\x3b\xdf\x2c\xf0\x1d\x92\x28\x0f\x36\xee\xdd\x3a\x7f\x44\x72\x64\xdb\xe4\x74\x75\x35\x2d\x7b\x36\x0e\xbb\xe7\x91\x36\x1e\x6d\x18\x7d\xa1\x69\x69\xdb\xf5\xb4\x4d\xdf\xe1\xfc\x20\xf7\x78\xcd\xb0\x5a\x7d\x01\xf8\x09\xb9\x7a\x49\x1b\xfe\xcf\x2b\x5a\x8a\xe6\xba\x2b\x58\x4d\xb2\xa2\x6b\x5a\x56\xe3\xb9\x04\x2a\x36\xfb\x6b\xe0\xa3\x90\x07\xfd\xac\xe8\x72\x08\xc9\xb3\x52\x03\x1c\x40\x55\x41\x2d\xd6\x7d\xa4\x86\x13\xf4\x95\xcc\x1f\x9c\x9f\xea\x89\xfd\x04\x4a\x48\xd4\xe0\xed\x23\xd6\xc5\xa8\x57\x7c\xc3\xdb\x55\xb7\x38\xcd\xc4\xda\x71\x90\x5f\xa9\xdc\x8d\xf6\xe1\xd5\xa2\x10\x8b\x57\x6b\x2a\xbb\x20\xdd\xe5\xb6\xe6\x8b\xae\x15\x75\xf3\x2a\x67\x77\xac\x78\xd5\xf0\x9b\x19\xad\xb3\x15\x6f\x59\xd6\x76\x35\x7b\x45\x2b\x3e\xcb\x44\x79\x27\x97\x9b\x28\x9b\xd3\x75\xfe\x9d\x54\x51\x33\x5a\xe6\x33\x1c\x24\xd7\xdb\x9d\xd2\xee\xf4\x8e\xf2\x42\xfa\x98\xd7\x4c\x2a\x41\xba\xa1\xfc\xfb\x21\x41\xd1\xd2\x82\x94\xdd\x7a\xc1\x6a\xb8\x3d\xd7\x6f\x93\x4a\xe4\x0d\x1e\x0f\xb1\x26\xd3\xd4\xee\xaf\x79\x29\xe7\xe3\x41\x61\x4b\x6c\x82\x14\xb7\xb4\xbe\x61\x2e\xd7\xab\x3b\xa7\x39\xab\x0a\xf1\xb0\x1e\xb9\x75\xf1\x05\x49\xa7\x83\xa2\x15\x95\xee\x99\xb7\x8f\xd7\xd6\xf6\xea\x00\x97\x74\x92\x28\x12\xa4\xea\x22\xed\xae\xcc\x59\x5d\x00\x94\xc3\x1a\x34\xd4\xa6\x3d\x56\x87\x1a\x70\x82\x16\x4c\x7e\xb3\x62\xb5\x6c\xb6\xf4\x0f\xe1\x00\x9c\x4b\xd3\xcc\x8c\x68\x73\x87\x65\xbe\x36\xda\xaf\xb1\xf3\x6f\xbd\xcd\xec\x95\xa2\x9c\xb5\xac\x5e\xf3\x12\xac\x01\x4c\xa1\x6f\x36\x36\x7a\x68\x67\x87\x1c\xb7\x2b\xc6\x6b\x45\x15\x42\xd6\xb4\xcd\x54\xe0\x15\x80\x73\x45\xfd\x72\x3f\xf3\xd7\x95\xbb\x2d\x58\xe7\xfd\x9d\xfa\xbb\xa7\xde\x54\xb9\x1c\xf9\xad\x7a\xb2\xcf\xc9\x03\xc3\xb5\xa2\x77\x18\x9f\xc9\x59\x23\x8d\x81\xa6\xd3\x80\x53\xd1\x3e\xfa\x3b\x66\x65\x66\x9b\x0a\xa8\xf7\x57\xdc\xaf\xbd\x8f\xea\xb1\xef\x8d\xac\x8b\xfe\xdf\xfb\x23\xed\xb7\x4c\xc3\x86\xce\x60\x08\xfe\x67\xf4\xfb\x6a\x90\xde\x90\xbb\xef\xed\xff\xc1\x4c\xce\x14\x32\x39\xfc\x01\xf1\xab\x58\xfe\x86\xb4\x75\x87\xf6\x54\x79\x49\xea\x13\x6b\x0b\x69\x96\xb1\xaa\x65\x39\x1c\x7b\xb0\x09\xb7\xbc\xcc\xdf\x90\x17\x88\xa1\x5d\x15\x5d\x4d\x0b\xf5\xbf\x52\xa7\x72\xd0\x1e\x6f\xc8\xff\xfb\xff\xff\x83\x52\x59\xfe\x8b\x6e\x87\xfc\xf0\xff\x02\x00\x00\xff\xff\xd7\x38\xde\xad\xdc\x44\x04\x00") func examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYamlBytes() ([]byte, error) { return bindataRead( @@ -197,7 +197,7 @@ func examplePrometheusOperatorCrdMonitoringCoreosCom_thanosrulersYaml() (*asset, return nil, err } - info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml", size: 277327, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml", size: 279772, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go index 01784693..964ed80f 100644 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go +++ b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/thanos_types.go @@ -58,7 +58,7 @@ type ThanosRulerList struct { // +k8s:openapi-gen=true type ThanosRulerSpec struct { // PodMetadata contains Labels and Annotations gets propagated to the thanos ruler pods. - PodMetadata *PodMeta `json:"podMetadata,omitempty"` + PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` // Thanos container image URL. Image string `json:"image,omitempty"` // An optional list of references to secrets in the same namespace @@ -170,6 +170,10 @@ type ThanosRulerSpec struct { // Note: Currently only the CAFile, CertFile, and KeyFile fields are supported. // Maps to the '--grpc-server-tls-*' CLI args. GRPCServerTLSConfig *TLSConfig `json:"grpcServerTlsConfig,omitempty"` + // The external Query URL the Thanos Ruler will set in the 'Source' field + // of all alerts. + // Maps to the '--alert.query-url' CLI arg. + AlertQueryURL string `json:"alertQueryUrl,omitempty"` } // ThanosRulerStatus is the most recent observed status of the ThanosRuler. Read-only. Not diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go index 5f022264..8e0aecd0 100644 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go +++ b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/types.go @@ -45,25 +45,6 @@ const ( PrometheusRuleKindKey = "prometheusrule" ) -// PodMeta is a subset of k8s.io/apimachinery/pkg/apis/meta/v1/ObjectMeta which only -// includes fields applicable to the generated stateful set pod template of the -// custom resource types. -type PodMeta struct { - // Map of string keys and values that can be used to organize and categorize - // (scope and select) objects. May match selectors of replication controllers - // and services. - // More info: http://kubernetes.io/docs/user-guide/labels - // +optional - Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"` - - // Annotations is an unstructured key value map stored with a resource that may be - // set by external tools to store and retrieve arbitrary metadata. They are not - // queryable and should be preserved when modifying objects. - // More info: http://kubernetes.io/docs/user-guide/annotations - // +optional - Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"` -} - // Prometheus defines a Prometheus deployment. // +genclient // +k8s:openapi-gen=true @@ -99,8 +80,10 @@ type PrometheusList struct { // +k8s:openapi-gen=true type PrometheusSpec struct { // PodMetadata configures Labels and Annotations which are propagated to the prometheus pods. - PodMetadata *PodMeta `json:"podMetadata,omitempty"` - // ServiceMonitors to be selected for target discovery. + PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` + // ServiceMonitors to be selected for target discovery. *Deprecated:* if + // neither this nor podMonitorSelector are specified, configuration is + // unmanaged. ServiceMonitorSelector *metav1.LabelSelector `json:"serviceMonitorSelector,omitempty"` // Namespaces to be selected for ServiceMonitor discovery. If nil, only // check own namespace. @@ -372,7 +355,54 @@ type StorageSpec struct { // info: https://kubernetes.io/docs/concepts/storage/volumes/#emptydir EmptyDir *v1.EmptyDirVolumeSource `json:"emptyDir,omitempty"` // A PVC spec to be used by the Prometheus StatefulSets. - VolumeClaimTemplate v1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` + VolumeClaimTemplate EmbeddedPersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` +} + +// EmbeddedPersistentVolumeClaim is an embedded version of k8s.io/api/core/v1.PersistentVolumeClaim. +// It contains TypeMeta and a reduced ObjectMeta. +type EmbeddedPersistentVolumeClaim struct { + metav1.TypeMeta `json:",inline"` + + // EmbeddedMetadata contains metadata relevant to an EmbeddedResource. + EmbeddedObjectMetadata `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Spec defines the desired characteristics of a volume requested by a pod author. + // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + // +optional + Spec v1.PersistentVolumeClaimSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` + + // Status represents the current information/status of a persistent volume claim. + // Read-only. + // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims + // +optional + Status v1.PersistentVolumeClaimStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// EmbeddedObjectMetadata contains a subset of the fields included in k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta +// Only fields which are relevant to embedded resources are included. +type EmbeddedObjectMetadata struct { + // Name must be unique within a namespace. Is required when creating resources, although + // some resources may allow a client to request the generation of an appropriate name + // automatically. Name is primarily intended for creation idempotence and configuration + // definition. + // Cannot be updated. + // More info: http://kubernetes.io/docs/user-guide/identifiers#names + // +optional + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + + // Map of string keys and values that can be used to organize and categorize + // (scope and select) objects. May match selectors of replication controllers + // and services. + // More info: http://kubernetes.io/docs/user-guide/labels + // +optional + Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"` + + // Annotations is an unstructured key value map stored with a resource that may be + // set by external tools to store and retrieve arbitrary metadata. They are not + // queryable and should be preserved when modifying objects. + // More info: http://kubernetes.io/docs/user-guide/annotations + // +optional + Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"` } // QuerySpec defines the query command line flags when starting Prometheus. @@ -890,7 +920,7 @@ type Alertmanager struct { // +k8s:openapi-gen=true type AlertmanagerSpec struct { // PodMetadata configures Labels and Annotations which are propagated to the alertmanager pods. - PodMetadata *PodMeta `json:"podMetadata,omitempty"` + PodMetadata *EmbeddedObjectMetadata `json:"podMetadata,omitempty"` // Image if specified has precedence over baseImage, tag and sha // combinations. Specifying the version is still necessary to ensure the // Prometheus Operator knows what version of Alertmanager is being diff --git a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go index 5d67ca7b..c8619fa6 100644 --- a/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1/zz_generated.deepcopy.go @@ -144,7 +144,7 @@ func (in *AlertmanagerSpec) DeepCopyInto(out *AlertmanagerSpec) { *out = *in if in.PodMetadata != nil { in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) + *out = new(EmbeddedObjectMetadata) (*in).DeepCopyInto(*out) } if in.Image != nil { @@ -330,6 +330,54 @@ func (in *CrdKinds) DeepCopy() *CrdKinds { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EmbeddedObjectMetadata) DeepCopyInto(out *EmbeddedObjectMetadata) { + *out = *in + if in.Labels != nil { + in, out := &in.Labels, &out.Labels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Annotations != nil { + in, out := &in.Annotations, &out.Annotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbeddedObjectMetadata. +func (in *EmbeddedObjectMetadata) DeepCopy() *EmbeddedObjectMetadata { + if in == nil { + return nil + } + out := new(EmbeddedObjectMetadata) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EmbeddedPersistentVolumeClaim) DeepCopyInto(out *EmbeddedPersistentVolumeClaim) { + *out = *in + out.TypeMeta = in.TypeMeta + in.EmbeddedObjectMetadata.DeepCopyInto(&out.EmbeddedObjectMetadata) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmbeddedPersistentVolumeClaim. +func (in *EmbeddedPersistentVolumeClaim) DeepCopy() *EmbeddedPersistentVolumeClaim { + if in == nil { + return nil + } + out := new(EmbeddedPersistentVolumeClaim) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Endpoint) DeepCopyInto(out *Endpoint) { *out = *in @@ -428,35 +476,6 @@ func (in *NamespaceSelector) DeepCopy() *NamespaceSelector { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMeta) DeepCopyInto(out *PodMeta) { - *out = *in - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Annotations != nil { - in, out := &in.Annotations, &out.Annotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMeta. -func (in *PodMeta) DeepCopy() *PodMeta { - if in == nil { - return nil - } - out := new(PodMeta) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodMetricsEndpoint) DeepCopyInto(out *PodMetricsEndpoint) { *out = *in @@ -723,7 +742,7 @@ func (in *PrometheusSpec) DeepCopyInto(out *PrometheusSpec) { *out = *in if in.PodMetadata != nil { in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) + *out = new(EmbeddedObjectMetadata) (*in).DeepCopyInto(*out) } if in.ServiceMonitorSelector != nil { @@ -1395,7 +1414,7 @@ func (in *ThanosRulerSpec) DeepCopyInto(out *ThanosRulerSpec) { *out = *in if in.PodMetadata != nil { in, out := &in.PodMetadata, &out.PodMetadata - *out = new(PodMeta) + *out = new(EmbeddedObjectMetadata) (*in).DeepCopyInto(*out) } if in.ImagePullSecrets != nil { diff --git a/vendor/github.com/emicklei/go-restful/v3/.gitignore b/vendor/github.com/emicklei/go-restful/v3/.gitignore new file mode 100644 index 00000000..446be09b --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/.gitignore @@ -0,0 +1,71 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe + +restful.html + +*.out + +tmp.prof + +go-restful.test + +examples/restful-basic-authentication + +examples/restful-encoding-filter + +examples/restful-filters + +examples/restful-hello-world + +examples/restful-resource-functions + +examples/restful-serve-static + +examples/restful-user-service + +*.DS_Store +examples/restful-user-resource + +examples/restful-multi-containers + +examples/restful-form-handling + +examples/restful-CORS-filter + +examples/restful-options-filter + +examples/restful-curly-router + +examples/restful-cpuprofiler-service + +examples/restful-pre-post-filters + +curly.prof + +examples/restful-NCSA-logging + +examples/restful-html-template + +s.html +restful-path-tail +.idea diff --git a/vendor/github.com/emicklei/go-restful/v3/.goconvey b/vendor/github.com/emicklei/go-restful/v3/.goconvey new file mode 100644 index 00000000..8485e986 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/.goconvey @@ -0,0 +1 @@ +ignore \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/.travis.yml b/vendor/github.com/emicklei/go-restful/v3/.travis.yml new file mode 100644 index 00000000..3a0bf5ff --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - 1.x + +before_install: + - go test -v + +script: + - go test -race -coverprofile=coverage.txt -covermode=atomic + +after_success: + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/CHANGES.md b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md new file mode 100644 index 00000000..74a37815 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/CHANGES.md @@ -0,0 +1,376 @@ +# Change history of go-restful + +## [v3.9.0] - 20221-07-21 + +- add support for http.Handler implementations to work as FilterFunction, issue #504 (thanks to https://github.com/ggicci) + +## [v3.8.0] - 20221-06-06 + +- use exact matching of allowed domain entries, issue #489 (#493) + - this changes fixes [security] Authorization Bypass Through User-Controlled Key + by changing the behaviour of the AllowedDomains setting in the CORS filter. + To support the previous behaviour, the CORS filter type now has a AllowedDomainFunc + callback mechanism which is called when a simple domain match fails. +- add test and fix for POST without body and Content-type, issue #492 (#496) +- [Minor] Bad practice to have a mix of Receiver types. (#491) + +## [v3.7.2] - 2021-11-24 + +- restored FilterChain (#482 by SVilgelm) + + +## [v3.7.1] - 2021-10-04 + +- fix problem with contentEncodingEnabled setting (#479) + +## [v3.7.0] - 2021-09-24 + +- feat(parameter): adds additional openapi mappings (#478) + +## [v3.6.0] - 2021-09-18 + +- add support for vendor extensions (#477 thx erraggy) + +## [v3.5.2] - 2021-07-14 + +- fix removing absent route from webservice (#472) + +## [v3.5.1] - 2021-04-12 + +- fix handling no match access selected path +- remove obsolete field + +## [v3.5.0] - 2021-04-10 + +- add check for wildcard (#463) in CORS +- add access to Route from Request, issue #459 (#462) + +## [v3.4.0] - 2020-11-10 + +- Added OPTIONS to WebService + +## [v3.3.2] - 2020-01-23 + +- Fixed duplicate compression in dispatch. #449 + + +## [v3.3.1] - 2020-08-31 + +- Added check on writer to prevent compression of response twice. #447 + +## [v3.3.0] - 2020-08-19 + +- Enable content encoding on Handle and ServeHTTP (#446) +- List available representations in 406 body (#437) +- Convert to string using rune() (#443) + +## [v3.2.0] - 2020-06-21 + +- 405 Method Not Allowed must have Allow header (#436) (thx Bracken ) +- add field allowedMethodsWithoutContentType (#424) + +## [v3.1.0] + +- support describing response headers (#426) +- fix openapi examples (#425) + +v3.0.0 + +- fix: use request/response resulting from filter chain +- add Go module + Module consumer should use github.com/emicklei/go-restful/v3 as import path + +v2.10.0 + +- support for Custom Verbs (thanks Vinci Xu <277040271@qq.com>) +- fixed static example (thanks Arthur ) +- simplify code (thanks Christian Muehlhaeuser ) +- added JWT HMAC with SHA-512 authentication code example (thanks Amim Knabben ) + +v2.9.6 + +- small optimization in filter code + +v2.11.1 + +- fix WriteError return value (#415) + +v2.11.0 + +- allow prefix and suffix in path variable expression (#414) + +v2.9.6 + +- support google custome verb (#413) + +v2.9.5 + +- fix panic in Response.WriteError if err == nil + +v2.9.4 + +- fix issue #400 , parsing mime type quality +- Route Builder added option for contentEncodingEnabled (#398) + +v2.9.3 + +- Avoid return of 415 Unsupported Media Type when request body is empty (#396) + +v2.9.2 + +- Reduce allocations in per-request methods to improve performance (#395) + +v2.9.1 + +- Fix issue with default responses and invalid status code 0. (#393) + +v2.9.0 + +- add per Route content encoding setting (overrides container setting) + +v2.8.0 + +- add Request.QueryParameters() +- add json-iterator (via build tag) +- disable vgo module (until log is moved) + +v2.7.1 + +- add vgo module + +v2.6.1 + +- add JSONNewDecoderFunc to allow custom JSON Decoder usage (go 1.10+) + +v2.6.0 + +- Make JSR 311 routing and path param processing consistent +- Adding description to RouteBuilder.Reads() +- Update example for Swagger12 and OpenAPI + +2017-09-13 + +- added route condition functions using `.If(func)` in route building. + +2017-02-16 + +- solved issue #304, make operation names unique + +2017-01-30 + + [IMPORTANT] For swagger users, change your import statement to: + swagger "github.com/emicklei/go-restful-swagger12" + +- moved swagger 1.2 code to go-restful-swagger12 +- created TAG 2.0.0 + +2017-01-27 + +- remove defer request body close +- expose Dispatch for testing filters and Routefunctions +- swagger response model cannot be array +- created TAG 1.0.0 + +2016-12-22 + +- (API change) Remove code related to caching request content. Removes SetCacheReadEntity(doCache bool) + +2016-11-26 + +- Default change! now use CurlyRouter (was RouterJSR311) +- Default change! no more caching of request content +- Default change! do not recover from panics + +2016-09-22 + +- fix the DefaultRequestContentType feature + +2016-02-14 + +- take the qualify factor of the Accept header mediatype into account when deciding the contentype of the response +- add constructors for custom entity accessors for xml and json + +2015-09-27 + +- rename new WriteStatusAnd... to WriteHeaderAnd... for consistency + +2015-09-25 + +- fixed problem with changing Header after WriteHeader (issue 235) + +2015-09-14 + +- changed behavior of WriteHeader (immediate write) and WriteEntity (no status write) +- added support for custom EntityReaderWriters. + +2015-08-06 + +- add support for reading entities from compressed request content +- use sync.Pool for compressors of http response and request body +- add Description to Parameter for documentation in Swagger UI + +2015-03-20 + +- add configurable logging + +2015-03-18 + +- if not specified, the Operation is derived from the Route function + +2015-03-17 + +- expose Parameter creation functions +- make trace logger an interface +- fix OPTIONSFilter +- customize rendering of ServiceError +- JSR311 router now handles wildcards +- add Notes to Route + +2014-11-27 + +- (api add) PrettyPrint per response. (as proposed in #167) + +2014-11-12 + +- (api add) ApiVersion(.) for documentation in Swagger UI + +2014-11-10 + +- (api change) struct fields tagged with "description" show up in Swagger UI + +2014-10-31 + +- (api change) ReturnsError -> Returns +- (api add) RouteBuilder.Do(aBuilder) for DRY use of RouteBuilder +- fix swagger nested structs +- sort Swagger response messages by code + +2014-10-23 + +- (api add) ReturnsError allows you to document Http codes in swagger +- fixed problem with greedy CurlyRouter +- (api add) Access-Control-Max-Age in CORS +- add tracing functionality (injectable) for debugging purposes +- support JSON parse 64bit int +- fix empty parameters for swagger +- WebServicesUrl is now optional for swagger +- fixed duplicate AccessControlAllowOrigin in CORS +- (api change) expose ServeMux in container +- (api add) added AllowedDomains in CORS +- (api add) ParameterNamed for detailed documentation + +2014-04-16 + +- (api add) expose constructor of Request for testing. + +2014-06-27 + +- (api add) ParameterNamed gives access to a Parameter definition and its data (for further specification). +- (api add) SetCacheReadEntity allow scontrol over whether or not the request body is being cached (default true for compatibility reasons). + +2014-07-03 + +- (api add) CORS can be configured with a list of allowed domains + +2014-03-12 + +- (api add) Route path parameters can use wildcard or regular expressions. (requires CurlyRouter) + +2014-02-26 + +- (api add) Request now provides information about the matched Route, see method SelectedRoutePath + +2014-02-17 + +- (api change) renamed parameter constants (go-lint checks) + +2014-01-10 + +- (api add) support for CloseNotify, see http://golang.org/pkg/net/http/#CloseNotifier + +2014-01-07 + +- (api change) Write* methods in Response now return the error or nil. +- added example of serving HTML from a Go template. +- fixed comparing Allowed headers in CORS (is now case-insensitive) + +2013-11-13 + +- (api add) Response knows how many bytes are written to the response body. + +2013-10-29 + +- (api add) RecoverHandler(handler RecoverHandleFunction) to change how panic recovery is handled. Default behavior is to log and return a stacktrace. This may be a security issue as it exposes sourcecode information. + +2013-10-04 + +- (api add) Response knows what HTTP status has been written +- (api add) Request can have attributes (map of string->interface, also called request-scoped variables + +2013-09-12 + +- (api change) Router interface simplified +- Implemented CurlyRouter, a Router that does not use|allow regular expressions in paths + +2013-08-05 + - add OPTIONS support + - add CORS support + +2013-08-27 + +- fixed some reported issues (see github) +- (api change) deprecated use of WriteError; use WriteErrorString instead + +2014-04-15 + +- (fix) v1.0.1 tag: fix Issue 111: WriteErrorString + +2013-08-08 + +- (api add) Added implementation Container: a WebServices collection with its own http.ServeMux allowing multiple endpoints per program. Existing uses of go-restful will register their services to the DefaultContainer. +- (api add) the swagger package has be extended to have a UI per container. +- if panic is detected then a small stack trace is printed (thanks to runner-mei) +- (api add) WriteErrorString to Response + +Important API changes: + +- (api remove) package variable DoNotRecover no longer works ; use restful.DefaultContainer.DoNotRecover(true) instead. +- (api remove) package variable EnableContentEncoding no longer works ; use restful.DefaultContainer.EnableContentEncoding(true) instead. + + +2013-07-06 + +- (api add) Added support for response encoding (gzip and deflate(zlib)). This feature is disabled on default (for backwards compatibility). Use restful.EnableContentEncoding = true in your initialization to enable this feature. + +2013-06-19 + +- (improve) DoNotRecover option, moved request body closer, improved ReadEntity + +2013-06-03 + +- (api change) removed Dispatcher interface, hide PathExpression +- changed receiver names of type functions to be more idiomatic Go + +2013-06-02 + +- (optimize) Cache the RegExp compilation of Paths. + +2013-05-22 + +- (api add) Added support for request/response filter functions + +2013-05-18 + + +- (api add) Added feature to change the default Http Request Dispatch function (travis cline) +- (api change) Moved Swagger Webservice to swagger package (see example restful-user) + +[2012-11-14 .. 2013-05-18> + +- See https://github.com/emicklei/go-restful/commits + +2012-11-14 + +- Initial commit + + diff --git a/vendor/github.com/emicklei/go-restful/v3/LICENSE b/vendor/github.com/emicklei/go-restful/v3/LICENSE new file mode 100644 index 00000000..ece7ec61 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012,2013 Ernest Micklei + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/Makefile b/vendor/github.com/emicklei/go-restful/v3/Makefile new file mode 100644 index 00000000..16d0b80b --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/Makefile @@ -0,0 +1,8 @@ +all: test + +test: + go vet . + go test -cover -v . + +ex: + find ./examples -type f -name "*.go" | xargs -I {} go build -o /tmp/ignore {} \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/README.md b/vendor/github.com/emicklei/go-restful/v3/README.md new file mode 100644 index 00000000..0625359d --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/README.md @@ -0,0 +1,111 @@ +go-restful +========== +package for building REST-style Web Services using Google Go + +[![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful) +[![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful) +[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://pkg.go.dev/github.com/emicklei/go-restful) +[![codecov](https://codecov.io/gh/emicklei/go-restful/branch/master/graph/badge.svg)](https://codecov.io/gh/emicklei/go-restful) + +- [Code examples use v3](https://github.com/emicklei/go-restful/tree/v3/examples) + +REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping: + +- GET = Retrieve a representation of a resource +- POST = Create if you are sending content to the server to create a subordinate of the specified resource collection, using some server-side algorithm. +- PUT = Create if you are sending the full content of the specified resource (URI). +- PUT = Update if you are updating the full content of the specified resource. +- DELETE = Delete if you are requesting the server to delete the resource +- PATCH = Update partial content of a resource +- OPTIONS = Get information about the communication options for the request URI + +### Usage + +#### Without Go Modules + +All versions up to `v2.*.*` (on the master) are not supporting Go modules. + +``` +import ( + restful "github.com/emicklei/go-restful" +) +``` + +#### Using Go Modules + +As of version `v3.0.0` (on the v3 branch), this package supports Go modules. + +``` +import ( + restful "github.com/emicklei/go-restful/v3" +) +``` + +### Example + +```Go +ws := new(restful.WebService) +ws. + Path("/users"). + Consumes(restful.MIME_XML, restful.MIME_JSON). + Produces(restful.MIME_JSON, restful.MIME_XML) + +ws.Route(ws.GET("/{user-id}").To(u.findUser). + Doc("get a user"). + Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). + Writes(User{})) +... + +func (u UserResource) findUser(request *restful.Request, response *restful.Response) { + id := request.PathParameter("user-id") + ... +} +``` + +[Full API of a UserResource](https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go) + +### Features + +- Routes for request → function mapping with path parameter (e.g. {id} but also prefix_{var} and {var}_suffix) support +- Configurable router: + - (default) Fast routing algorithm that allows static elements, [google custom method](https://cloud.google.com/apis/design/custom_methods), regular expressions and dynamic parameters in the URL path (e.g. /resource/name:customVerb, /meetings/{id} or /static/{subpath:*}) + - Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but does **not** accept) regular expressions +- Request API for reading structs from JSON/XML and accessing parameters (path,query,header) +- Response API for writing structs to JSON/XML and setting headers +- Customizable encoding using EntityReaderWriter registration +- Filters for intercepting the request → response flow on Service or Route level +- Request-scoped variables using attributes +- Containers for WebServices on different HTTP endpoints +- Content encoding (gzip,deflate) of request and response payloads +- Automatic responses on OPTIONS (using a filter) +- Automatic CORS request handling (using a filter) +- API declaration for Swagger UI ([go-restful-openapi](https://github.com/emicklei/go-restful-openapi), see [go-restful-swagger12](https://github.com/emicklei/go-restful-swagger12)) +- Panic recovery to produce HTTP 500, customizable using RecoverHandler(...) +- Route errors produce HTTP 404/405/406/415 errors, customizable using ServiceErrorHandler(...) +- Configurable (trace) logging +- Customizable gzip/deflate readers and writers using CompressorProvider registration +- Inject your own http.Handler using the `HttpMiddlewareHandlerToFilter` function + +## How to customize +There are several hooks to customize the behavior of the go-restful package. + +- Router algorithm +- Panic recovery +- JSON decoder +- Trace logging +- Compression +- Encoders for other serializers +- Use [jsoniter](https://github.com/json-iterator/go) by building this package using a build tag, e.g. `go build -tags=jsoniter .` + +## Resources + +- [Example programs](./examples) +- [Example posted on blog](http://ernestmicklei.com/2012/11/go-restful-first-working-example/) +- [Design explained on blog](http://ernestmicklei.com/2012/11/go-restful-api-design/) +- [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful) +- [showcase: Zazkia - tcp proxy for testing resiliency](https://github.com/emicklei/zazkia) +- [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora) + +Type ```git shortlog -s``` for a full list of contributors. + +© 2012 - 2022, http://ernestmicklei.com. MIT License. Contributions are welcome. diff --git a/vendor/github.com/emicklei/go-restful/v3/SECURITY.md b/vendor/github.com/emicklei/go-restful/v3/SECURITY.md new file mode 100644 index 00000000..810d3b51 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| v3.7.x | :white_check_mark: | +| < v3.0.1 | :x: | + +## Reporting a Vulnerability + +Create an Issue and put the label `[security]` in the title of the issue. +Valid reported security issues are expected to be solved within a week. diff --git a/vendor/github.com/emicklei/go-restful/v3/Srcfile b/vendor/github.com/emicklei/go-restful/v3/Srcfile new file mode 100644 index 00000000..16fd1868 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/Srcfile @@ -0,0 +1 @@ +{"SkipDirs": ["examples"]} diff --git a/vendor/github.com/emicklei/go-restful/v3/bench_test.sh b/vendor/github.com/emicklei/go-restful/v3/bench_test.sh new file mode 100644 index 00000000..47ffbe4a --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/bench_test.sh @@ -0,0 +1,10 @@ +#go test -run=none -file bench_test.go -test.bench . -cpuprofile=bench_test.out + +go test -c +./go-restful.test -test.run=none -test.cpuprofile=tmp.prof -test.bench=BenchmarkMany +./go-restful.test -test.run=none -test.cpuprofile=curly.prof -test.bench=BenchmarkManyCurly + +#go tool pprof go-restful.test tmp.prof +go tool pprof go-restful.test curly.prof + + diff --git a/vendor/github.com/emicklei/go-restful/v3/compress.go b/vendor/github.com/emicklei/go-restful/v3/compress.go new file mode 100644 index 00000000..1ff239f9 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/compress.go @@ -0,0 +1,127 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "bufio" + "compress/gzip" + "compress/zlib" + "errors" + "io" + "net" + "net/http" + "strings" +) + +// OBSOLETE : use restful.DefaultContainer.EnableContentEncoding(true) to change this setting. +var EnableContentEncoding = false + +// CompressingResponseWriter is a http.ResponseWriter that can perform content encoding (gzip and zlib) +type CompressingResponseWriter struct { + writer http.ResponseWriter + compressor io.WriteCloser + encoding string +} + +// Header is part of http.ResponseWriter interface +func (c *CompressingResponseWriter) Header() http.Header { + return c.writer.Header() +} + +// WriteHeader is part of http.ResponseWriter interface +func (c *CompressingResponseWriter) WriteHeader(status int) { + c.writer.WriteHeader(status) +} + +// Write is part of http.ResponseWriter interface +// It is passed through the compressor +func (c *CompressingResponseWriter) Write(bytes []byte) (int, error) { + if c.isCompressorClosed() { + return -1, errors.New("Compressing error: tried to write data using closed compressor") + } + return c.compressor.Write(bytes) +} + +// CloseNotify is part of http.CloseNotifier interface +func (c *CompressingResponseWriter) CloseNotify() <-chan bool { + return c.writer.(http.CloseNotifier).CloseNotify() +} + +// Close the underlying compressor +func (c *CompressingResponseWriter) Close() error { + if c.isCompressorClosed() { + return errors.New("Compressing error: tried to close already closed compressor") + } + + c.compressor.Close() + if ENCODING_GZIP == c.encoding { + currentCompressorProvider.ReleaseGzipWriter(c.compressor.(*gzip.Writer)) + } + if ENCODING_DEFLATE == c.encoding { + currentCompressorProvider.ReleaseZlibWriter(c.compressor.(*zlib.Writer)) + } + // gc hint needed? + c.compressor = nil + return nil +} + +func (c *CompressingResponseWriter) isCompressorClosed() bool { + return nil == c.compressor +} + +// Hijack implements the Hijacker interface +// This is especially useful when combining Container.EnabledContentEncoding +// in combination with websockets (for instance gorilla/websocket) +func (c *CompressingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hijacker, ok := c.writer.(http.Hijacker) + if !ok { + return nil, nil, errors.New("ResponseWriter doesn't support Hijacker interface") + } + return hijacker.Hijack() +} + +// WantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested. +// It also inspects the httpWriter whether its content-encoding is already set (non-empty). +func wantsCompressedResponse(httpRequest *http.Request, httpWriter http.ResponseWriter) (bool, string) { + if contentEncoding := httpWriter.Header().Get(HEADER_ContentEncoding); contentEncoding != "" { + return false, "" + } + header := httpRequest.Header.Get(HEADER_AcceptEncoding) + gi := strings.Index(header, ENCODING_GZIP) + zi := strings.Index(header, ENCODING_DEFLATE) + // use in order of appearance + if gi == -1 { + return zi != -1, ENCODING_DEFLATE + } else if zi == -1 { + return gi != -1, ENCODING_GZIP + } else { + if gi < zi { + return true, ENCODING_GZIP + } + return true, ENCODING_DEFLATE + } +} + +// NewCompressingResponseWriter create a CompressingResponseWriter for a known encoding = {gzip,deflate} +func NewCompressingResponseWriter(httpWriter http.ResponseWriter, encoding string) (*CompressingResponseWriter, error) { + httpWriter.Header().Set(HEADER_ContentEncoding, encoding) + c := new(CompressingResponseWriter) + c.writer = httpWriter + var err error + if ENCODING_GZIP == encoding { + w := currentCompressorProvider.AcquireGzipWriter() + w.Reset(httpWriter) + c.compressor = w + c.encoding = ENCODING_GZIP + } else if ENCODING_DEFLATE == encoding { + w := currentCompressorProvider.AcquireZlibWriter() + w.Reset(httpWriter) + c.compressor = w + c.encoding = ENCODING_DEFLATE + } else { + return nil, errors.New("Unknown encoding:" + encoding) + } + return c, err +} diff --git a/vendor/github.com/emicklei/go-restful/v3/compressor_cache.go b/vendor/github.com/emicklei/go-restful/v3/compressor_cache.go new file mode 100644 index 00000000..ee426010 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/compressor_cache.go @@ -0,0 +1,103 @@ +package restful + +// Copyright 2015 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "compress/gzip" + "compress/zlib" +) + +// BoundedCachedCompressors is a CompressorProvider that uses a cache with a fixed amount +// of writers and readers (resources). +// If a new resource is acquired and all are in use, it will return a new unmanaged resource. +type BoundedCachedCompressors struct { + gzipWriters chan *gzip.Writer + gzipReaders chan *gzip.Reader + zlibWriters chan *zlib.Writer + writersCapacity int + readersCapacity int +} + +// NewBoundedCachedCompressors returns a new, with filled cache, BoundedCachedCompressors. +func NewBoundedCachedCompressors(writersCapacity, readersCapacity int) *BoundedCachedCompressors { + b := &BoundedCachedCompressors{ + gzipWriters: make(chan *gzip.Writer, writersCapacity), + gzipReaders: make(chan *gzip.Reader, readersCapacity), + zlibWriters: make(chan *zlib.Writer, writersCapacity), + writersCapacity: writersCapacity, + readersCapacity: readersCapacity, + } + for ix := 0; ix < writersCapacity; ix++ { + b.gzipWriters <- newGzipWriter() + b.zlibWriters <- newZlibWriter() + } + for ix := 0; ix < readersCapacity; ix++ { + b.gzipReaders <- newGzipReader() + } + return b +} + +// AcquireGzipWriter returns an resettable *gzip.Writer. Needs to be released. +func (b *BoundedCachedCompressors) AcquireGzipWriter() *gzip.Writer { + var writer *gzip.Writer + select { + case writer, _ = <-b.gzipWriters: + default: + // return a new unmanaged one + writer = newGzipWriter() + } + return writer +} + +// ReleaseGzipWriter accepts a writer (does not have to be one that was cached) +// only when the cache has room for it. It will ignore it otherwise. +func (b *BoundedCachedCompressors) ReleaseGzipWriter(w *gzip.Writer) { + // forget the unmanaged ones + if len(b.gzipWriters) < b.writersCapacity { + b.gzipWriters <- w + } +} + +// AcquireGzipReader returns a *gzip.Reader. Needs to be released. +func (b *BoundedCachedCompressors) AcquireGzipReader() *gzip.Reader { + var reader *gzip.Reader + select { + case reader, _ = <-b.gzipReaders: + default: + // return a new unmanaged one + reader = newGzipReader() + } + return reader +} + +// ReleaseGzipReader accepts a reader (does not have to be one that was cached) +// only when the cache has room for it. It will ignore it otherwise. +func (b *BoundedCachedCompressors) ReleaseGzipReader(r *gzip.Reader) { + // forget the unmanaged ones + if len(b.gzipReaders) < b.readersCapacity { + b.gzipReaders <- r + } +} + +// AcquireZlibWriter returns an resettable *zlib.Writer. Needs to be released. +func (b *BoundedCachedCompressors) AcquireZlibWriter() *zlib.Writer { + var writer *zlib.Writer + select { + case writer, _ = <-b.zlibWriters: + default: + // return a new unmanaged one + writer = newZlibWriter() + } + return writer +} + +// ReleaseZlibWriter accepts a writer (does not have to be one that was cached) +// only when the cache has room for it. It will ignore it otherwise. +func (b *BoundedCachedCompressors) ReleaseZlibWriter(w *zlib.Writer) { + // forget the unmanaged ones + if len(b.zlibWriters) < b.writersCapacity { + b.zlibWriters <- w + } +} diff --git a/vendor/github.com/emicklei/go-restful/v3/compressor_pools.go b/vendor/github.com/emicklei/go-restful/v3/compressor_pools.go new file mode 100644 index 00000000..d866ce64 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/compressor_pools.go @@ -0,0 +1,91 @@ +package restful + +// Copyright 2015 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "bytes" + "compress/gzip" + "compress/zlib" + "sync" +) + +// SyncPoolCompessors is a CompressorProvider that use the standard sync.Pool. +type SyncPoolCompessors struct { + GzipWriterPool *sync.Pool + GzipReaderPool *sync.Pool + ZlibWriterPool *sync.Pool +} + +// NewSyncPoolCompessors returns a new ("empty") SyncPoolCompessors. +func NewSyncPoolCompessors() *SyncPoolCompessors { + return &SyncPoolCompessors{ + GzipWriterPool: &sync.Pool{ + New: func() interface{} { return newGzipWriter() }, + }, + GzipReaderPool: &sync.Pool{ + New: func() interface{} { return newGzipReader() }, + }, + ZlibWriterPool: &sync.Pool{ + New: func() interface{} { return newZlibWriter() }, + }, + } +} + +func (s *SyncPoolCompessors) AcquireGzipWriter() *gzip.Writer { + return s.GzipWriterPool.Get().(*gzip.Writer) +} + +func (s *SyncPoolCompessors) ReleaseGzipWriter(w *gzip.Writer) { + s.GzipWriterPool.Put(w) +} + +func (s *SyncPoolCompessors) AcquireGzipReader() *gzip.Reader { + return s.GzipReaderPool.Get().(*gzip.Reader) +} + +func (s *SyncPoolCompessors) ReleaseGzipReader(r *gzip.Reader) { + s.GzipReaderPool.Put(r) +} + +func (s *SyncPoolCompessors) AcquireZlibWriter() *zlib.Writer { + return s.ZlibWriterPool.Get().(*zlib.Writer) +} + +func (s *SyncPoolCompessors) ReleaseZlibWriter(w *zlib.Writer) { + s.ZlibWriterPool.Put(w) +} + +func newGzipWriter() *gzip.Writer { + // create with an empty bytes writer; it will be replaced before using the gzipWriter + writer, err := gzip.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed) + if err != nil { + panic(err.Error()) + } + return writer +} + +func newGzipReader() *gzip.Reader { + // create with an empty reader (but with GZIP header); it will be replaced before using the gzipReader + // we can safely use currentCompressProvider because it is set on package initialization. + w := currentCompressorProvider.AcquireGzipWriter() + defer currentCompressorProvider.ReleaseGzipWriter(w) + b := new(bytes.Buffer) + w.Reset(b) + w.Flush() + w.Close() + reader, err := gzip.NewReader(bytes.NewReader(b.Bytes())) + if err != nil { + panic(err.Error()) + } + return reader +} + +func newZlibWriter() *zlib.Writer { + writer, err := zlib.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed) + if err != nil { + panic(err.Error()) + } + return writer +} diff --git a/vendor/github.com/emicklei/go-restful/v3/compressors.go b/vendor/github.com/emicklei/go-restful/v3/compressors.go new file mode 100644 index 00000000..9db4a8c8 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/compressors.go @@ -0,0 +1,54 @@ +package restful + +// Copyright 2015 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "compress/gzip" + "compress/zlib" +) + +// CompressorProvider describes a component that can provider compressors for the std methods. +type CompressorProvider interface { + // Returns a *gzip.Writer which needs to be released later. + // Before using it, call Reset(). + AcquireGzipWriter() *gzip.Writer + + // Releases an acquired *gzip.Writer. + ReleaseGzipWriter(w *gzip.Writer) + + // Returns a *gzip.Reader which needs to be released later. + AcquireGzipReader() *gzip.Reader + + // Releases an acquired *gzip.Reader. + ReleaseGzipReader(w *gzip.Reader) + + // Returns a *zlib.Writer which needs to be released later. + // Before using it, call Reset(). + AcquireZlibWriter() *zlib.Writer + + // Releases an acquired *zlib.Writer. + ReleaseZlibWriter(w *zlib.Writer) +} + +// DefaultCompressorProvider is the actual provider of compressors (zlib or gzip). +var currentCompressorProvider CompressorProvider + +func init() { + currentCompressorProvider = NewSyncPoolCompessors() +} + +// CurrentCompressorProvider returns the current CompressorProvider. +// It is initialized using a SyncPoolCompessors. +func CurrentCompressorProvider() CompressorProvider { + return currentCompressorProvider +} + +// SetCompressorProvider sets the actual provider of compressors (zlib or gzip). +func SetCompressorProvider(p CompressorProvider) { + if p == nil { + panic("cannot set compressor provider to nil") + } + currentCompressorProvider = p +} diff --git a/vendor/github.com/emicklei/go-restful/v3/constants.go b/vendor/github.com/emicklei/go-restful/v3/constants.go new file mode 100644 index 00000000..203439c5 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/constants.go @@ -0,0 +1,30 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +const ( + MIME_XML = "application/xml" // Accept or Content-Type used in Consumes() and/or Produces() + MIME_JSON = "application/json" // Accept or Content-Type used in Consumes() and/or Produces() + MIME_OCTET = "application/octet-stream" // If Content-Type is not present in request, use the default + + HEADER_Allow = "Allow" + HEADER_Accept = "Accept" + HEADER_Origin = "Origin" + HEADER_ContentType = "Content-Type" + HEADER_LastModified = "Last-Modified" + HEADER_AcceptEncoding = "Accept-Encoding" + HEADER_ContentEncoding = "Content-Encoding" + HEADER_AccessControlExposeHeaders = "Access-Control-Expose-Headers" + HEADER_AccessControlRequestMethod = "Access-Control-Request-Method" + HEADER_AccessControlRequestHeaders = "Access-Control-Request-Headers" + HEADER_AccessControlAllowMethods = "Access-Control-Allow-Methods" + HEADER_AccessControlAllowOrigin = "Access-Control-Allow-Origin" + HEADER_AccessControlAllowCredentials = "Access-Control-Allow-Credentials" + HEADER_AccessControlAllowHeaders = "Access-Control-Allow-Headers" + HEADER_AccessControlMaxAge = "Access-Control-Max-Age" + + ENCODING_GZIP = "gzip" + ENCODING_DEFLATE = "deflate" +) diff --git a/vendor/github.com/emicklei/go-restful/v3/container.go b/vendor/github.com/emicklei/go-restful/v3/container.go new file mode 100644 index 00000000..dd56246d --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/container.go @@ -0,0 +1,450 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "bytes" + "errors" + "fmt" + "net/http" + "os" + "runtime" + "strings" + "sync" + + "github.com/emicklei/go-restful/v3/log" +) + +// Container holds a collection of WebServices and a http.ServeMux to dispatch http requests. +// The requests are further dispatched to routes of WebServices using a RouteSelector +type Container struct { + webServicesLock sync.RWMutex + webServices []*WebService + ServeMux *http.ServeMux + isRegisteredOnRoot bool + containerFilters []FilterFunction + doNotRecover bool // default is true + recoverHandleFunc RecoverHandleFunction + serviceErrorHandleFunc ServiceErrorHandleFunction + router RouteSelector // default is a CurlyRouter (RouterJSR311 is a slower alternative) + contentEncodingEnabled bool // default is false +} + +// NewContainer creates a new Container using a new ServeMux and default router (CurlyRouter) +func NewContainer() *Container { + return &Container{ + webServices: []*WebService{}, + ServeMux: http.NewServeMux(), + isRegisteredOnRoot: false, + containerFilters: []FilterFunction{}, + doNotRecover: true, + recoverHandleFunc: logStackOnRecover, + serviceErrorHandleFunc: writeServiceError, + router: CurlyRouter{}, + contentEncodingEnabled: false} +} + +// RecoverHandleFunction declares functions that can be used to handle a panic situation. +// The first argument is what recover() returns. The second must be used to communicate an error response. +type RecoverHandleFunction func(interface{}, http.ResponseWriter) + +// RecoverHandler changes the default function (logStackOnRecover) to be called +// when a panic is detected. DoNotRecover must be have its default value (=false). +func (c *Container) RecoverHandler(handler RecoverHandleFunction) { + c.recoverHandleFunc = handler +} + +// ServiceErrorHandleFunction declares functions that can be used to handle a service error situation. +// The first argument is the service error, the second is the request that resulted in the error and +// the third must be used to communicate an error response. +type ServiceErrorHandleFunction func(ServiceError, *Request, *Response) + +// ServiceErrorHandler changes the default function (writeServiceError) to be called +// when a ServiceError is detected. +func (c *Container) ServiceErrorHandler(handler ServiceErrorHandleFunction) { + c.serviceErrorHandleFunc = handler +} + +// DoNotRecover controls whether panics will be caught to return HTTP 500. +// If set to true, Route functions are responsible for handling any error situation. +// Default value is true. +func (c *Container) DoNotRecover(doNot bool) { + c.doNotRecover = doNot +} + +// Router changes the default Router (currently CurlyRouter) +func (c *Container) Router(aRouter RouteSelector) { + c.router = aRouter +} + +// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses. +func (c *Container) EnableContentEncoding(enabled bool) { + c.contentEncodingEnabled = enabled +} + +// Add a WebService to the Container. It will detect duplicate root paths and exit in that case. +func (c *Container) Add(service *WebService) *Container { + c.webServicesLock.Lock() + defer c.webServicesLock.Unlock() + + // if rootPath was not set then lazy initialize it + if len(service.rootPath) == 0 { + service.Path("/") + } + + // cannot have duplicate root paths + for _, each := range c.webServices { + if each.RootPath() == service.RootPath() { + log.Printf("WebService with duplicate root path detected:['%v']", each) + os.Exit(1) + } + } + + // If not registered on root then add specific mapping + if !c.isRegisteredOnRoot { + c.isRegisteredOnRoot = c.addHandler(service, c.ServeMux) + } + c.webServices = append(c.webServices, service) + return c +} + +// addHandler may set a new HandleFunc for the serveMux +// this function must run inside the critical region protected by the webServicesLock. +// returns true if the function was registered on root ("/") +func (c *Container) addHandler(service *WebService, serveMux *http.ServeMux) bool { + pattern := fixedPrefixPath(service.RootPath()) + // check if root path registration is needed + if "/" == pattern || "" == pattern { + serveMux.HandleFunc("/", c.dispatch) + return true + } + // detect if registration already exists + alreadyMapped := false + for _, each := range c.webServices { + if each.RootPath() == service.RootPath() { + alreadyMapped = true + break + } + } + if !alreadyMapped { + serveMux.HandleFunc(pattern, c.dispatch) + if !strings.HasSuffix(pattern, "/") { + serveMux.HandleFunc(pattern+"/", c.dispatch) + } + } + return false +} + +func (c *Container) Remove(ws *WebService) error { + if c.ServeMux == http.DefaultServeMux { + errMsg := fmt.Sprintf("cannot remove a WebService from a Container using the DefaultServeMux: ['%v']", ws) + log.Print(errMsg) + return errors.New(errMsg) + } + c.webServicesLock.Lock() + defer c.webServicesLock.Unlock() + // build a new ServeMux and re-register all WebServices + newServeMux := http.NewServeMux() + newServices := []*WebService{} + newIsRegisteredOnRoot := false + for _, each := range c.webServices { + if each.rootPath != ws.rootPath { + // If not registered on root then add specific mapping + if !newIsRegisteredOnRoot { + newIsRegisteredOnRoot = c.addHandler(each, newServeMux) + } + newServices = append(newServices, each) + } + } + c.webServices, c.ServeMux, c.isRegisteredOnRoot = newServices, newServeMux, newIsRegisteredOnRoot + return nil +} + +// logStackOnRecover is the default RecoverHandleFunction and is called +// when DoNotRecover is false and the recoverHandleFunc is not set for the container. +// Default implementation logs the stacktrace and writes the stacktrace on the response. +// This may be a security issue as it exposes sourcecode information. +func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter) { + var buffer bytes.Buffer + buffer.WriteString(fmt.Sprintf("recover from panic situation: - %v\r\n", panicReason)) + for i := 2; ; i += 1 { + _, file, line, ok := runtime.Caller(i) + if !ok { + break + } + buffer.WriteString(fmt.Sprintf(" %s:%d\r\n", file, line)) + } + log.Print(buffer.String()) + httpWriter.WriteHeader(http.StatusInternalServerError) + httpWriter.Write(buffer.Bytes()) +} + +// writeServiceError is the default ServiceErrorHandleFunction and is called +// when a ServiceError is returned during route selection. Default implementation +// calls resp.WriteErrorString(err.Code, err.Message) +func writeServiceError(err ServiceError, req *Request, resp *Response) { + for header, values := range err.Header { + for _, value := range values { + resp.Header().Add(header, value) + } + } + resp.WriteErrorString(err.Code, err.Message) +} + +// Dispatch the incoming Http Request to a matching WebService. +func (c *Container) Dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) { + if httpWriter == nil { + panic("httpWriter cannot be nil") + } + if httpRequest == nil { + panic("httpRequest cannot be nil") + } + c.dispatch(httpWriter, httpRequest) +} + +// Dispatch the incoming Http Request to a matching WebService. +func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // so we can assign a compressing one later + writer := httpWriter + + // CompressingResponseWriter should be closed after all operations are done + defer func() { + if compressWriter, ok := writer.(*CompressingResponseWriter); ok { + compressWriter.Close() + } + }() + + // Instal panic recovery unless told otherwise + if !c.doNotRecover { // catch all for 500 response + defer func() { + if r := recover(); r != nil { + c.recoverHandleFunc(r, writer) + return + } + }() + } + + // Find best match Route ; err is non nil if no match was found + var webService *WebService + var route *Route + var err error + func() { + c.webServicesLock.RLock() + defer c.webServicesLock.RUnlock() + webService, route, err = c.router.SelectRoute( + c.webServices, + httpRequest) + }() + if err != nil { + // a non-200 response (may be compressed) has already been written + // run container filters anyway ; they should not touch the response... + chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { + switch err.(type) { + case ServiceError: + ser := err.(ServiceError) + c.serviceErrorHandleFunc(ser, req, resp) + } + // TODO + }} + chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer)) + return + } + + // Unless httpWriter is already an CompressingResponseWriter see if we need to install one + if _, isCompressing := httpWriter.(*CompressingResponseWriter); !isCompressing { + // Detect if compression is needed + // assume without compression, test for override + contentEncodingEnabled := c.contentEncodingEnabled + if route != nil && route.contentEncodingEnabled != nil { + contentEncodingEnabled = *route.contentEncodingEnabled + } + if contentEncodingEnabled { + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + } + } + + pathProcessor, routerProcessesPath := c.router.(PathProcessor) + if !routerProcessesPath { + pathProcessor = defaultPathProcessor{} + } + pathParams := pathProcessor.ExtractParameters(route, webService, httpRequest.URL.Path) + wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer, httpRequest, pathParams) + // pass through filters (if any) + if size := len(c.containerFilters) + len(webService.filters) + len(route.Filters); size > 0 { + // compose filter chain + allFilters := make([]FilterFunction, 0, size) + allFilters = append(allFilters, c.containerFilters...) + allFilters = append(allFilters, webService.filters...) + allFilters = append(allFilters, route.Filters...) + chain := FilterChain{ + Filters: allFilters, + Target: route.Function, + ParameterDocs: route.ParameterDocs, + Operation: route.Operation, + } + chain.ProcessFilter(wrappedRequest, wrappedResponse) + } else { + // no filters, handle request by route + route.Function(wrappedRequest, wrappedResponse) + } +} + +// fixedPrefixPath returns the fixed part of the partspec ; it may include template vars {} +func fixedPrefixPath(pathspec string) string { + varBegin := strings.Index(pathspec, "{") + if -1 == varBegin { + return pathspec + } + return pathspec[:varBegin] +} + +// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server +func (c *Container) ServeHTTP(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // Skip, if content encoding is disabled + if !c.contentEncodingEnabled { + c.ServeMux.ServeHTTP(httpWriter, httpRequest) + return + } + // content encoding is enabled + + // Skip, if httpWriter is already an CompressingResponseWriter + if _, ok := httpWriter.(*CompressingResponseWriter); ok { + c.ServeMux.ServeHTTP(httpWriter, httpRequest) + return + } + + writer := httpWriter + // CompressingResponseWriter should be closed after all operations are done + defer func() { + if compressWriter, ok := writer.(*CompressingResponseWriter); ok { + compressWriter.Close() + } + }() + + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + + c.ServeMux.ServeHTTP(writer, httpRequest) +} + +// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics. +func (c *Container) Handle(pattern string, handler http.Handler) { + c.ServeMux.Handle(pattern, http.HandlerFunc(func(httpWriter http.ResponseWriter, httpRequest *http.Request) { + // Skip, if httpWriter is already an CompressingResponseWriter + if _, ok := httpWriter.(*CompressingResponseWriter); ok { + handler.ServeHTTP(httpWriter, httpRequest) + return + } + + writer := httpWriter + + // CompressingResponseWriter should be closed after all operations are done + defer func() { + if compressWriter, ok := writer.(*CompressingResponseWriter); ok { + compressWriter.Close() + } + }() + + if c.contentEncodingEnabled { + doCompress, encoding := wantsCompressedResponse(httpRequest, httpWriter) + if doCompress { + var err error + writer, err = NewCompressingResponseWriter(httpWriter, encoding) + if err != nil { + log.Print("unable to install compressor: ", err) + httpWriter.WriteHeader(http.StatusInternalServerError) + return + } + } + } + + handler.ServeHTTP(writer, httpRequest) + })) +} + +// HandleWithFilter registers the handler for the given pattern. +// Container's filter chain is applied for handler. +// If a handler already exists for pattern, HandleWithFilter panics. +func (c *Container) HandleWithFilter(pattern string, handler http.Handler) { + f := func(httpResponse http.ResponseWriter, httpRequest *http.Request) { + if len(c.containerFilters) == 0 { + handler.ServeHTTP(httpResponse, httpRequest) + return + } + + chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { + handler.ServeHTTP(resp, req.Request) + }} + chain.ProcessFilter(NewRequest(httpRequest), NewResponse(httpResponse)) + } + + c.Handle(pattern, http.HandlerFunc(f)) +} + +// Filter appends a container FilterFunction. These are called before dispatching +// a http.Request to a WebService from the container +func (c *Container) Filter(filter FilterFunction) { + c.containerFilters = append(c.containerFilters, filter) +} + +// RegisteredWebServices returns the collections of added WebServices +func (c *Container) RegisteredWebServices() []*WebService { + c.webServicesLock.RLock() + defer c.webServicesLock.RUnlock() + result := make([]*WebService, len(c.webServices)) + for ix := range c.webServices { + result[ix] = c.webServices[ix] + } + return result +} + +// computeAllowedMethods returns a list of HTTP methods that are valid for a Request +func (c *Container) computeAllowedMethods(req *Request) []string { + // Go through all RegisteredWebServices() and all its Routes to collect the options + methods := []string{} + requestPath := req.Request.URL.Path + for _, ws := range c.RegisteredWebServices() { + matches := ws.pathExpr.Matcher.FindStringSubmatch(requestPath) + if matches != nil { + finalMatch := matches[len(matches)-1] + for _, rt := range ws.Routes() { + matches := rt.pathExpr.Matcher.FindStringSubmatch(finalMatch) + if matches != nil { + lastMatch := matches[len(matches)-1] + if lastMatch == "" || lastMatch == "/" { // do not include if value is neither empty nor ‘/’. + methods = append(methods, rt.Method) + } + } + } + } + } + // methods = append(methods, "OPTIONS") not sure about this + return methods +} + +// newBasicRequestResponse creates a pair of Request,Response from its http versions. +// It is basic because no parameter or (produces) content-type information is given. +func newBasicRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) { + resp := NewResponse(httpWriter) + resp.requestAccept = httpRequest.Header.Get(HEADER_Accept) + return NewRequest(httpRequest), resp +} diff --git a/vendor/github.com/emicklei/go-restful/v3/cors_filter.go b/vendor/github.com/emicklei/go-restful/v3/cors_filter.go new file mode 100644 index 00000000..9d18dfb7 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/cors_filter.go @@ -0,0 +1,193 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "regexp" + "strconv" + "strings" +) + +// CrossOriginResourceSharing is used to create a Container Filter that implements CORS. +// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page +// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from. +// +// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing +// http://enable-cors.org/server.html +// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request +type CrossOriginResourceSharing struct { + ExposeHeaders []string // list of Header names + + // AllowedHeaders is alist of Header names. Checking is case-insensitive. + // The list may contain the special wildcard string ".*" ; all is allowed + AllowedHeaders []string + + // AllowedDomains is a list of allowed values for Http Origin. + // The list may contain the special wildcard string ".*" ; all is allowed + // If empty all are allowed. + AllowedDomains []string + + // AllowedDomainFunc is optional and is a function that will do the check + // when the origin is not part of the AllowedDomains and it does not contain the wildcard ".*". + AllowedDomainFunc func(origin string) bool + + // AllowedMethods is either empty or has a list of http methods names. Checking is case-insensitive. + AllowedMethods []string + MaxAge int // number of seconds before requiring new Options request + CookiesAllowed bool + Container *Container + + allowedOriginPatterns []*regexp.Regexp // internal field for origin regexp check. +} + +// Filter is a filter function that implements the CORS flow as documented on http://enable-cors.org/server.html +// and http://www.html5rocks.com/static/images/cors_server_flowchart.png +func (c CrossOriginResourceSharing) Filter(req *Request, resp *Response, chain *FilterChain) { + origin := req.Request.Header.Get(HEADER_Origin) + if len(origin) == 0 { + if trace { + traceLogger.Print("no Http header Origin set") + } + chain.ProcessFilter(req, resp) + return + } + if !c.isOriginAllowed(origin) { // check whether this origin is allowed + if trace { + traceLogger.Printf("HTTP Origin:%s is not part of %v, neither matches any part of %v", origin, c.AllowedDomains, c.allowedOriginPatterns) + } + chain.ProcessFilter(req, resp) + return + } + if req.Request.Method != "OPTIONS" { + c.doActualRequest(req, resp) + chain.ProcessFilter(req, resp) + return + } + if acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod); acrm != "" { + c.doPreflightRequest(req, resp) + } else { + c.doActualRequest(req, resp) + chain.ProcessFilter(req, resp) + return + } +} + +func (c CrossOriginResourceSharing) doActualRequest(req *Request, resp *Response) { + c.setOptionsHeaders(req, resp) + // continue processing the response +} + +func (c *CrossOriginResourceSharing) doPreflightRequest(req *Request, resp *Response) { + if len(c.AllowedMethods) == 0 { + if c.Container == nil { + c.AllowedMethods = DefaultContainer.computeAllowedMethods(req) + } else { + c.AllowedMethods = c.Container.computeAllowedMethods(req) + } + } + + acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod) + if !c.isValidAccessControlRequestMethod(acrm, c.AllowedMethods) { + if trace { + traceLogger.Printf("Http header %s:%s is not in %v", + HEADER_AccessControlRequestMethod, + acrm, + c.AllowedMethods) + } + return + } + acrhs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders) + if len(acrhs) > 0 { + for _, each := range strings.Split(acrhs, ",") { + if !c.isValidAccessControlRequestHeader(strings.Trim(each, " ")) { + if trace { + traceLogger.Printf("Http header %s:%s is not in %v", + HEADER_AccessControlRequestHeaders, + acrhs, + c.AllowedHeaders) + } + return + } + } + } + resp.AddHeader(HEADER_AccessControlAllowMethods, strings.Join(c.AllowedMethods, ",")) + resp.AddHeader(HEADER_AccessControlAllowHeaders, acrhs) + c.setOptionsHeaders(req, resp) + + // return http 200 response, no body +} + +func (c CrossOriginResourceSharing) setOptionsHeaders(req *Request, resp *Response) { + c.checkAndSetExposeHeaders(resp) + c.setAllowOriginHeader(req, resp) + c.checkAndSetAllowCredentials(resp) + if c.MaxAge > 0 { + resp.AddHeader(HEADER_AccessControlMaxAge, strconv.Itoa(c.MaxAge)) + } +} + +func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool { + if len(origin) == 0 { + return false + } + lowerOrigin := strings.ToLower(origin) + if len(c.AllowedDomains) == 0 { + if c.AllowedDomainFunc != nil { + return c.AllowedDomainFunc(lowerOrigin) + } + return true + } + + // exact match on each allowed domain + for _, domain := range c.AllowedDomains { + if domain == ".*" || strings.ToLower(domain) == lowerOrigin { + return true + } + } + if c.AllowedDomainFunc != nil { + return c.AllowedDomainFunc(origin) + } + return false +} + +func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) { + origin := req.Request.Header.Get(HEADER_Origin) + if c.isOriginAllowed(origin) { + resp.AddHeader(HEADER_AccessControlAllowOrigin, origin) + } +} + +func (c CrossOriginResourceSharing) checkAndSetExposeHeaders(resp *Response) { + if len(c.ExposeHeaders) > 0 { + resp.AddHeader(HEADER_AccessControlExposeHeaders, strings.Join(c.ExposeHeaders, ",")) + } +} + +func (c CrossOriginResourceSharing) checkAndSetAllowCredentials(resp *Response) { + if c.CookiesAllowed { + resp.AddHeader(HEADER_AccessControlAllowCredentials, "true") + } +} + +func (c CrossOriginResourceSharing) isValidAccessControlRequestMethod(method string, allowedMethods []string) bool { + for _, each := range allowedMethods { + if each == method { + return true + } + } + return false +} + +func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header string) bool { + for _, each := range c.AllowedHeaders { + if strings.ToLower(each) == strings.ToLower(header) { + return true + } + if each == "*" { + return true + } + } + return false +} diff --git a/vendor/github.com/emicklei/go-restful/v3/coverage.sh b/vendor/github.com/emicklei/go-restful/v3/coverage.sh new file mode 100644 index 00000000..e27dbf1a --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/coverage.sh @@ -0,0 +1,2 @@ +go test -coverprofile=coverage.out +go tool cover -html=coverage.out \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/v3/curly.go b/vendor/github.com/emicklei/go-restful/v3/curly.go new file mode 100644 index 00000000..ba1fc5d5 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/curly.go @@ -0,0 +1,173 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "net/http" + "regexp" + "sort" + "strings" +) + +// CurlyRouter expects Routes with paths that contain zero or more parameters in curly brackets. +type CurlyRouter struct{} + +// SelectRoute is part of the Router interface and returns the best match +// for the WebService and its Route for the given Request. +func (c CurlyRouter) SelectRoute( + webServices []*WebService, + httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) { + + requestTokens := tokenizePath(httpRequest.URL.Path) + + detectedService := c.detectWebService(requestTokens, webServices) + if detectedService == nil { + if trace { + traceLogger.Printf("no WebService was found to match URL path:%s\n", httpRequest.URL.Path) + } + return nil, nil, NewError(http.StatusNotFound, "404: Page Not Found") + } + candidateRoutes := c.selectRoutes(detectedService, requestTokens) + if len(candidateRoutes) == 0 { + if trace { + traceLogger.Printf("no Route in WebService with path %s was found to match URL path:%s\n", detectedService.rootPath, httpRequest.URL.Path) + } + return detectedService, nil, NewError(http.StatusNotFound, "404: Page Not Found") + } + selectedRoute, err := c.detectRoute(candidateRoutes, httpRequest) + if selectedRoute == nil { + return detectedService, nil, err + } + return detectedService, selectedRoute, nil +} + +// selectRoutes return a collection of Route from a WebService that matches the path tokens from the request. +func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) sortableCurlyRoutes { + candidates := make(sortableCurlyRoutes, 0, 8) + for _, each := range ws.routes { + matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens, each.hasCustomVerb) + if matches { + candidates.add(curlyRoute{each, paramCount, staticCount}) // TODO make sure Routes() return pointers? + } + } + sort.Sort(candidates) + return candidates +} + +// matchesRouteByPathTokens computes whether it matches, howmany parameters do match and what the number of static path elements are. +func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string, routeHasCustomVerb bool) (matches bool, paramCount int, staticCount int) { + if len(routeTokens) < len(requestTokens) { + // proceed in matching only if last routeToken is wildcard + count := len(routeTokens) + if count == 0 || !strings.HasSuffix(routeTokens[count-1], "*}") { + return false, 0, 0 + } + // proceed + } + for i, routeToken := range routeTokens { + if i == len(requestTokens) { + // reached end of request path + return false, 0, 0 + } + requestToken := requestTokens[i] + if routeHasCustomVerb && hasCustomVerb(routeToken){ + if !isMatchCustomVerb(routeToken, requestToken) { + return false, 0, 0 + } + staticCount++ + requestToken = removeCustomVerb(requestToken) + routeToken = removeCustomVerb(routeToken) + } + + if strings.HasPrefix(routeToken, "{") { + paramCount++ + if colon := strings.Index(routeToken, ":"); colon != -1 { + // match by regex + matchesToken, matchesRemainder := c.regularMatchesPathToken(routeToken, colon, requestToken) + if !matchesToken { + return false, 0, 0 + } + if matchesRemainder { + break + } + } + } else { // no { prefix + if requestToken != routeToken { + return false, 0, 0 + } + staticCount++ + } + } + return true, paramCount, staticCount +} + +// regularMatchesPathToken tests whether the regular expression part of routeToken matches the requestToken or all remaining tokens +// format routeToken is {someVar:someExpression}, e.g. {zipcode:[\d][\d][\d][\d][A-Z][A-Z]} +func (c CurlyRouter) regularMatchesPathToken(routeToken string, colon int, requestToken string) (matchesToken bool, matchesRemainder bool) { + regPart := routeToken[colon+1 : len(routeToken)-1] + if regPart == "*" { + if trace { + traceLogger.Printf("wildcard parameter detected in route token %s that matches %s\n", routeToken, requestToken) + } + return true, true + } + matched, err := regexp.MatchString(regPart, requestToken) + return (matched && err == nil), false +} + +var jsr311Router = RouterJSR311{} + +// detectRoute selectes from a list of Route the first match by inspecting both the Accept and Content-Type +// headers of the Request. See also RouterJSR311 in jsr311.go +func (c CurlyRouter) detectRoute(candidateRoutes sortableCurlyRoutes, httpRequest *http.Request) (*Route, error) { + // tracing is done inside detectRoute + return jsr311Router.detectRoute(candidateRoutes.routes(), httpRequest) +} + +// detectWebService returns the best matching webService given the list of path tokens. +// see also computeWebserviceScore +func (c CurlyRouter) detectWebService(requestTokens []string, webServices []*WebService) *WebService { + var best *WebService + score := -1 + for _, each := range webServices { + matches, eachScore := c.computeWebserviceScore(requestTokens, each.pathExpr.tokens) + if matches && (eachScore > score) { + best = each + score = eachScore + } + } + return best +} + +// computeWebserviceScore returns whether tokens match and +// the weighted score of the longest matching consecutive tokens from the beginning. +func (c CurlyRouter) computeWebserviceScore(requestTokens []string, tokens []string) (bool, int) { + if len(tokens) > len(requestTokens) { + return false, 0 + } + score := 0 + for i := 0; i < len(tokens); i++ { + each := requestTokens[i] + other := tokens[i] + if len(each) == 0 && len(other) == 0 { + score++ + continue + } + if len(other) > 0 && strings.HasPrefix(other, "{") { + // no empty match + if len(each) == 0 { + return false, score + } + score += 1 + } else { + // not a parameter + if each != other { + return false, score + } + score += (len(tokens) - i) * 10 //fuzzy + } + } + return true, score +} diff --git a/vendor/github.com/emicklei/go-restful/v3/curly_route.go b/vendor/github.com/emicklei/go-restful/v3/curly_route.go new file mode 100644 index 00000000..403dd3be --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/curly_route.go @@ -0,0 +1,54 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// curlyRoute exits for sorting Routes by the CurlyRouter based on number of parameters and number of static path elements. +type curlyRoute struct { + route Route + paramCount int + staticCount int +} + +// sortableCurlyRoutes orders by most parameters and path elements first. +type sortableCurlyRoutes []curlyRoute + +func (s *sortableCurlyRoutes) add(route curlyRoute) { + *s = append(*s, route) +} + +func (s sortableCurlyRoutes) routes() (routes []Route) { + routes = make([]Route, 0, len(s)) + for _, each := range s { + routes = append(routes, each.route) // TODO change return type + } + return routes +} + +func (s sortableCurlyRoutes) Len() int { + return len(s) +} +func (s sortableCurlyRoutes) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} +func (s sortableCurlyRoutes) Less(i, j int) bool { + a := s[j] + b := s[i] + + // primary key + if a.staticCount < b.staticCount { + return true + } + if a.staticCount > b.staticCount { + return false + } + // secundary key + if a.paramCount < b.paramCount { + return true + } + if a.paramCount > b.paramCount { + return false + } + return a.route.Path < b.route.Path +} diff --git a/vendor/github.com/emicklei/go-restful/v3/custom_verb.go b/vendor/github.com/emicklei/go-restful/v3/custom_verb.go new file mode 100644 index 00000000..bfc17efd --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/custom_verb.go @@ -0,0 +1,29 @@ +package restful + +import ( + "fmt" + "regexp" +) + +var ( + customVerbReg = regexp.MustCompile(":([A-Za-z]+)$") +) + +func hasCustomVerb(routeToken string) bool { + return customVerbReg.MatchString(routeToken) +} + +func isMatchCustomVerb(routeToken string, pathToken string) bool { + rs := customVerbReg.FindStringSubmatch(routeToken) + if len(rs) < 2 { + return false + } + + customVerb := rs[1] + specificVerbReg := regexp.MustCompile(fmt.Sprintf(":%s$", customVerb)) + return specificVerbReg.MatchString(pathToken) +} + +func removeCustomVerb(str string) string { + return customVerbReg.ReplaceAllString(str, "") +} diff --git a/vendor/github.com/emicklei/go-restful/v3/doc.go b/vendor/github.com/emicklei/go-restful/v3/doc.go new file mode 100644 index 00000000..69b13057 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/doc.go @@ -0,0 +1,185 @@ +/* +Package restful , a lean package for creating REST-style WebServices without magic. + +WebServices and Routes + +A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls. +Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes. +WebServices must be added to a container (see below) in order to handler Http requests from a server. + +A Route is defined by a HTTP method, an URL path and (optionally) the MIME types it consumes (Content-Type) and produces (Accept). +This package has the logic to find the best matching Route and if found, call its Function. + + ws := new(restful.WebService) + ws. + Path("/users"). + Consumes(restful.MIME_JSON, restful.MIME_XML). + Produces(restful.MIME_JSON, restful.MIME_XML) + + ws.Route(ws.GET("/{user-id}").To(u.findUser)) // u is a UserResource + + ... + + // GET http://localhost:8080/users/1 + func (u UserResource) findUser(request *restful.Request, response *restful.Response) { + id := request.PathParameter("user-id") + ... + } + +The (*Request, *Response) arguments provide functions for reading information from the request and writing information back to the response. + +See the example https://github.com/emicklei/go-restful/blob/v3/examples/user-resource/restful-user-resource.go with a full implementation. + +Regular expression matching Routes + +A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path. +For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters. +Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax) +This feature requires the use of a CurlyRouter. + +Containers + +A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests. +Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container. +The Default container of go-restful uses the http.DefaultServeMux. +You can create your own Container and create a new http.Server for that particular container. + + container := restful.NewContainer() + server := &http.Server{Addr: ":8081", Handler: container} + +Filters + +A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses. +You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc. +In the restful package there are three hooks into the request,response flow where filters can be added. +Each filter must define a FilterFunction: + + func (req *restful.Request, resp *restful.Response, chain *restful.FilterChain) + +Use the following statement to pass the request,response pair to the next filter or RouteFunction + + chain.ProcessFilter(req, resp) + +Container Filters + +These are processed before any registered WebService. + + // install a (global) filter for the default container (processed before any webservice) + restful.Filter(globalLogging) + +WebService Filters + +These are processed before any Route of a WebService. + + // install a webservice filter (processed before any route) + ws.Filter(webserviceLogging).Filter(measureTime) + + +Route Filters + +These are processed before calling the function associated with the Route. + + // install 2 chained route filters (processed before calling findUser) + ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser)) + +See the example https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go with full implementations. + +Response Encoding + +Two encodings are supported: gzip and deflate. To enable this for all responses: + + restful.DefaultContainer.EnableContentEncoding(true) + +If a Http request includes the Accept-Encoding header then the response content will be compressed using the specified encoding. +Alternatively, you can create a Filter that performs the encoding and install it per WebService or Route. + +See the example https://github.com/emicklei/go-restful/blob/v3/examples/encoding/restful-encoding-filter.go + +OPTIONS support + +By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request. + + Filter(OPTIONSFilter()) + +CORS + +By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests. + + cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer} + Filter(cors.Filter) + +Error Handling + +Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why. +For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation. + + 400: Bad Request + +If path or query parameters are not valid (content or type) then use http.StatusBadRequest. + + 404: Not Found + +Despite a valid URI, the resource requested may not be available + + 500: Internal Server Error + +If the application logic could not process the request (or write the response) then use http.StatusInternalServerError. + + 405: Method Not Allowed + +The request has a valid URL but the method (GET,PUT,POST,...) is not allowed. + + 406: Not Acceptable + +The request does not have or has an unknown Accept Header set for this operation. + + 415: Unsupported Media Type + +The request does not have or has an unknown Content-Type Header set for this operation. + +ServiceError + +In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response. + +Performance options + +This package has several options that affect the performance of your service. It is important to understand them and how you can change it. + + restful.DefaultContainer.DoNotRecover(false) + +DoNotRecover controls whether panics will be caught to return HTTP 500. +If set to false, the container will recover from panics. +Default value is true + + restful.SetCompressorProvider(NewBoundedCachedCompressors(20, 20)) + +If content encoding is enabled then the default strategy for getting new gzip/zlib writers and readers is to use a sync.Pool. +Because writers are expensive structures, performance is even more improved when using a preloaded cache. You can also inject your own implementation. + +Trouble shooting + +This package has the means to produce detail logging of the complete Http request matching process and filter invocation. +Enabling this feature requires you to set an implementation of restful.StdLogger (e.g. log.Logger) instance such as: + + restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile)) + +Logging + +The restful.SetLogger() method allows you to override the logger used by the package. By default restful +uses the standard library `log` package and logs to stdout. Different logging packages are supported as +long as they conform to `StdLogger` interface defined in the `log` sub-package, writing an adapter for your +preferred package is simple. + +Resources + +[project]: https://github.com/emicklei/go-restful + +[examples]: https://github.com/emicklei/go-restful/blob/master/examples + +[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/ + +[showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape + +(c) 2012-2015, http://ernestmicklei.com. MIT License +*/ +package restful diff --git a/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go new file mode 100644 index 00000000..66dfc824 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/entity_accessors.go @@ -0,0 +1,162 @@ +package restful + +// Copyright 2015 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "encoding/xml" + "strings" + "sync" +) + +// EntityReaderWriter can read and write values using an encoding such as JSON,XML. +type EntityReaderWriter interface { + // Read a serialized version of the value from the request. + // The Request may have a decompressing reader. Depends on Content-Encoding. + Read(req *Request, v interface{}) error + + // Write a serialized version of the value on the response. + // The Response may have a compressing writer. Depends on Accept-Encoding. + // status should be a valid Http Status code + Write(resp *Response, status int, v interface{}) error +} + +// entityAccessRegistry is a singleton +var entityAccessRegistry = &entityReaderWriters{ + protection: new(sync.RWMutex), + accessors: map[string]EntityReaderWriter{}, +} + +// entityReaderWriters associates MIME to an EntityReaderWriter +type entityReaderWriters struct { + protection *sync.RWMutex + accessors map[string]EntityReaderWriter +} + +func init() { + RegisterEntityAccessor(MIME_JSON, NewEntityAccessorJSON(MIME_JSON)) + RegisterEntityAccessor(MIME_XML, NewEntityAccessorXML(MIME_XML)) +} + +// RegisterEntityAccessor add/overrides the ReaderWriter for encoding content with this MIME type. +func RegisterEntityAccessor(mime string, erw EntityReaderWriter) { + entityAccessRegistry.protection.Lock() + defer entityAccessRegistry.protection.Unlock() + entityAccessRegistry.accessors[mime] = erw +} + +// NewEntityAccessorJSON returns a new EntityReaderWriter for accessing JSON content. +// This package is already initialized with such an accessor using the MIME_JSON contentType. +func NewEntityAccessorJSON(contentType string) EntityReaderWriter { + return entityJSONAccess{ContentType: contentType} +} + +// NewEntityAccessorXML returns a new EntityReaderWriter for accessing XML content. +// This package is already initialized with such an accessor using the MIME_XML contentType. +func NewEntityAccessorXML(contentType string) EntityReaderWriter { + return entityXMLAccess{ContentType: contentType} +} + +// accessorAt returns the registered ReaderWriter for this MIME type. +func (r *entityReaderWriters) accessorAt(mime string) (EntityReaderWriter, bool) { + r.protection.RLock() + defer r.protection.RUnlock() + er, ok := r.accessors[mime] + if !ok { + // retry with reverse lookup + // more expensive but we are in an exceptional situation anyway + for k, v := range r.accessors { + if strings.Contains(mime, k) { + return v, true + } + } + } + return er, ok +} + +// entityXMLAccess is a EntityReaderWriter for XML encoding +type entityXMLAccess struct { + // This is used for setting the Content-Type header when writing + ContentType string +} + +// Read unmarshalls the value from XML +func (e entityXMLAccess) Read(req *Request, v interface{}) error { + return xml.NewDecoder(req.Request.Body).Decode(v) +} + +// Write marshalls the value to JSON and set the Content-Type Header. +func (e entityXMLAccess) Write(resp *Response, status int, v interface{}) error { + return writeXML(resp, status, e.ContentType, v) +} + +// writeXML marshalls the value to JSON and set the Content-Type Header. +func writeXML(resp *Response, status int, contentType string, v interface{}) error { + if v == nil { + resp.WriteHeader(status) + // do not write a nil representation + return nil + } + if resp.prettyPrint { + // pretty output must be created and written explicitly + output, err := xml.MarshalIndent(v, " ", " ") + if err != nil { + return err + } + resp.Header().Set(HEADER_ContentType, contentType) + resp.WriteHeader(status) + _, err = resp.Write([]byte(xml.Header)) + if err != nil { + return err + } + _, err = resp.Write(output) + return err + } + // not-so-pretty + resp.Header().Set(HEADER_ContentType, contentType) + resp.WriteHeader(status) + return xml.NewEncoder(resp).Encode(v) +} + +// entityJSONAccess is a EntityReaderWriter for JSON encoding +type entityJSONAccess struct { + // This is used for setting the Content-Type header when writing + ContentType string +} + +// Read unmarshalls the value from JSON +func (e entityJSONAccess) Read(req *Request, v interface{}) error { + decoder := NewDecoder(req.Request.Body) + decoder.UseNumber() + return decoder.Decode(v) +} + +// Write marshalls the value to JSON and set the Content-Type Header. +func (e entityJSONAccess) Write(resp *Response, status int, v interface{}) error { + return writeJSON(resp, status, e.ContentType, v) +} + +// write marshalls the value to JSON and set the Content-Type Header. +func writeJSON(resp *Response, status int, contentType string, v interface{}) error { + if v == nil { + resp.WriteHeader(status) + // do not write a nil representation + return nil + } + if resp.prettyPrint { + // pretty output must be created and written explicitly + output, err := MarshalIndent(v, "", " ") + if err != nil { + return err + } + resp.Header().Set(HEADER_ContentType, contentType) + resp.WriteHeader(status) + _, err = resp.Write(output) + return err + } + // not-so-pretty + resp.Header().Set(HEADER_ContentType, contentType) + resp.WriteHeader(status) + return NewEncoder(resp).Encode(v) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/extensions.go b/vendor/github.com/emicklei/go-restful/v3/extensions.go new file mode 100644 index 00000000..5023fa04 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/extensions.go @@ -0,0 +1,21 @@ +package restful + +// Copyright 2021 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// ExtensionProperties provides storage of vendor extensions for entities +type ExtensionProperties struct { + // Extensions vendor extensions used to describe extra functionality + // (https://swagger.io/docs/specification/2-0/swagger-extensions/) + Extensions map[string]interface{} +} + +// AddExtension adds or updates a key=value pair to the extension map. +func (ep *ExtensionProperties) AddExtension(key string, value interface{}) { + if ep.Extensions == nil { + ep.Extensions = map[string]interface{}{key: value} + } else { + ep.Extensions[key] = value + } +} diff --git a/vendor/github.com/emicklei/go-restful/v3/filter.go b/vendor/github.com/emicklei/go-restful/v3/filter.go new file mode 100644 index 00000000..fd88c536 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/filter.go @@ -0,0 +1,37 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// FilterChain is a request scoped object to process one or more filters before calling the target RouteFunction. +type FilterChain struct { + Filters []FilterFunction // ordered list of FilterFunction + Index int // index into filters that is currently in progress + Target RouteFunction // function to call after passing all filters + ParameterDocs []*Parameter // the parameter docs for the route + Operation string // the name of the operation +} + +// ProcessFilter passes the request,response pair through the next of Filters. +// Each filter can decide to proceed to the next Filter or handle the Response itself. +func (f *FilterChain) ProcessFilter(request *Request, response *Response) { + if f.Index < len(f.Filters) { + f.Index++ + f.Filters[f.Index-1](request, response, f) + } else { + f.Target(request, response) + } +} + +// FilterFunction definitions must call ProcessFilter on the FilterChain to pass on the control and eventually call the RouteFunction +type FilterFunction func(*Request, *Response, *FilterChain) + +// NoBrowserCacheFilter is a filter function to set HTTP headers that disable browser caching +// See examples/restful-no-cache-filter.go for usage +func NoBrowserCacheFilter(req *Request, resp *Response, chain *FilterChain) { + resp.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1. + resp.Header().Set("Pragma", "no-cache") // HTTP 1.0. + resp.Header().Set("Expires", "0") // Proxies. + chain.ProcessFilter(req, resp) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go b/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go new file mode 100644 index 00000000..c246512f --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/filter_adapter.go @@ -0,0 +1,21 @@ +package restful + +import ( + "net/http" +) + +// HttpMiddlewareHandler is a function that takes a http.Handler and returns a http.Handler +type HttpMiddlewareHandler func(http.Handler) http.Handler + +// HttpMiddlewareHandlerToFilter converts a HttpMiddlewareHandler to a FilterFunction. +func HttpMiddlewareHandlerToFilter(middleware HttpMiddlewareHandler) FilterFunction { + return func(req *Request, resp *Response, chain *FilterChain) { + next := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + req.Request = r + resp.ResponseWriter = rw + chain.ProcessFilter(req, resp) + }) + + middleware(next).ServeHTTP(resp.ResponseWriter, req.Request) + } +} diff --git a/vendor/github.com/emicklei/go-restful/v3/json.go b/vendor/github.com/emicklei/go-restful/v3/json.go new file mode 100644 index 00000000..87116516 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/json.go @@ -0,0 +1,11 @@ +// +build !jsoniter + +package restful + +import "encoding/json" + +var ( + MarshalIndent = json.MarshalIndent + NewDecoder = json.NewDecoder + NewEncoder = json.NewEncoder +) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsoniter.go b/vendor/github.com/emicklei/go-restful/v3/jsoniter.go new file mode 100644 index 00000000..11b8f8ae --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/jsoniter.go @@ -0,0 +1,12 @@ +// +build jsoniter + +package restful + +import "github.com/json-iterator/go" + +var ( + json = jsoniter.ConfigCompatibleWithStandardLibrary + MarshalIndent = json.MarshalIndent + NewDecoder = json.NewDecoder + NewEncoder = json.NewEncoder +) diff --git a/vendor/github.com/emicklei/go-restful/v3/jsr311.go b/vendor/github.com/emicklei/go-restful/v3/jsr311.go new file mode 100644 index 00000000..07a0c91e --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/jsr311.go @@ -0,0 +1,326 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "errors" + "fmt" + "net/http" + "sort" + "strings" +) + +// RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions) +// as specified by the JSR311 http://jsr311.java.net/nonav/releases/1.1/spec/spec.html. +// RouterJSR311 implements the Router interface. +// Concept of locators is not implemented. +type RouterJSR311 struct{} + +// SelectRoute is part of the Router interface and returns the best match +// for the WebService and its Route for the given Request. +func (r RouterJSR311) SelectRoute( + webServices []*WebService, + httpRequest *http.Request) (selectedService *WebService, selectedRoute *Route, err error) { + + // Identify the root resource class (WebService) + dispatcher, finalMatch, err := r.detectDispatcher(httpRequest.URL.Path, webServices) + if err != nil { + return nil, nil, NewError(http.StatusNotFound, "") + } + // Obtain the set of candidate methods (Routes) + routes := r.selectRoutes(dispatcher, finalMatch) + if len(routes) == 0 { + return dispatcher, nil, NewError(http.StatusNotFound, "404: Page Not Found") + } + + // Identify the method (Route) that will handle the request + route, ok := r.detectRoute(routes, httpRequest) + return dispatcher, route, ok +} + +// ExtractParameters is used to obtain the path parameters from the route using the same matching +// engine as the JSR 311 router. +func (r RouterJSR311) ExtractParameters(route *Route, webService *WebService, urlPath string) map[string]string { + webServiceExpr := webService.pathExpr + webServiceMatches := webServiceExpr.Matcher.FindStringSubmatch(urlPath) + pathParameters := r.extractParams(webServiceExpr, webServiceMatches) + routeExpr := route.pathExpr + routeMatches := routeExpr.Matcher.FindStringSubmatch(webServiceMatches[len(webServiceMatches)-1]) + routeParams := r.extractParams(routeExpr, routeMatches) + for key, value := range routeParams { + pathParameters[key] = value + } + return pathParameters +} + +func (RouterJSR311) extractParams(pathExpr *pathExpression, matches []string) map[string]string { + params := map[string]string{} + for i := 1; i < len(matches); i++ { + if len(pathExpr.VarNames) >= i { + params[pathExpr.VarNames[i-1]] = matches[i] + } + } + return params +} + +// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 +func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*Route, error) { + candidates := make([]*Route, 0, 8) + for i, each := range routes { + ok := true + for _, fn := range each.If { + if !fn(httpRequest) { + ok = false + break + } + } + if ok { + candidates = append(candidates, &routes[i]) + } + } + if len(candidates) == 0 { + if trace { + traceLogger.Printf("no Route found (from %d) that passes conditional checks", len(routes)) + } + return nil, NewError(http.StatusNotFound, "404: Not Found") + } + + // http method + previous := candidates + candidates = candidates[:0] + for _, each := range previous { + if httpRequest.Method == each.Method { + candidates = append(candidates, each) + } + } + if len(candidates) == 0 { + if trace { + traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(previous), httpRequest.Method) + } + allowed := []string{} + allowedLoop: + for _, candidate := range previous { + for _, method := range allowed { + if method == candidate.Method { + continue allowedLoop + } + } + allowed = append(allowed, candidate.Method) + } + header := http.Header{"Allow": []string{strings.Join(allowed, ", ")}} + return nil, NewErrorWithHeader(http.StatusMethodNotAllowed, "405: Method Not Allowed", header) + } + + // content-type + contentType := httpRequest.Header.Get(HEADER_ContentType) + previous = candidates + candidates = candidates[:0] + for _, each := range previous { + if each.matchesContentType(contentType) { + candidates = append(candidates, each) + } + } + if len(candidates) == 0 { + if trace { + traceLogger.Printf("no Route found (from %d) that matches HTTP Content-Type: %s\n", len(previous), contentType) + } + if httpRequest.ContentLength > 0 { + return nil, NewError(http.StatusUnsupportedMediaType, "415: Unsupported Media Type") + } + } + + // accept + previous = candidates + candidates = candidates[:0] + accept := httpRequest.Header.Get(HEADER_Accept) + if len(accept) == 0 { + accept = "*/*" + } + for _, each := range previous { + if each.matchesAccept(accept) { + candidates = append(candidates, each) + } + } + if len(candidates) == 0 { + if trace { + traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(previous), accept) + } + available := []string{} + for _, candidate := range previous { + available = append(available, candidate.Produces...) + } + // if POST,PUT,PATCH without body + method, length := httpRequest.Method, httpRequest.Header.Get("Content-Length") + if (method == http.MethodPost || + method == http.MethodPut || + method == http.MethodPatch) && length == "" { + return nil, NewError( + http.StatusUnsupportedMediaType, + fmt.Sprintf("415: Unsupported Media Type\n\nAvailable representations: %s", strings.Join(available, ", ")), + ) + } + return nil, NewError( + http.StatusNotAcceptable, + fmt.Sprintf("406: Not Acceptable\n\nAvailable representations: %s", strings.Join(available, ", ")), + ) + } + // return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil + return candidates[0], nil +} + +// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 +// n/m > n/* > */* +func (r RouterJSR311) bestMatchByMedia(routes []Route, contentType string, accept string) *Route { + // TODO + return &routes[0] +} + +// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 2) +func (r RouterJSR311) selectRoutes(dispatcher *WebService, pathRemainder string) []Route { + filtered := &sortableRouteCandidates{} + for _, each := range dispatcher.Routes() { + pathExpr := each.pathExpr + matches := pathExpr.Matcher.FindStringSubmatch(pathRemainder) + if matches != nil { + lastMatch := matches[len(matches)-1] + if len(lastMatch) == 0 || lastMatch == "/" { // do not include if value is neither empty nor ‘/’. + filtered.candidates = append(filtered.candidates, + routeCandidate{each, len(matches) - 1, pathExpr.LiteralCount, pathExpr.VarCount}) + } + } + } + if len(filtered.candidates) == 0 { + if trace { + traceLogger.Printf("WebService on path %s has no routes that match URL path remainder:%s\n", dispatcher.rootPath, pathRemainder) + } + return []Route{} + } + sort.Sort(sort.Reverse(filtered)) + + // select other routes from candidates whoes expression matches rmatch + matchingRoutes := []Route{filtered.candidates[0].route} + for c := 1; c < len(filtered.candidates); c++ { + each := filtered.candidates[c] + if each.route.pathExpr.Matcher.MatchString(pathRemainder) { + matchingRoutes = append(matchingRoutes, each.route) + } + } + return matchingRoutes +} + +// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 1) +func (r RouterJSR311) detectDispatcher(requestPath string, dispatchers []*WebService) (*WebService, string, error) { + filtered := &sortableDispatcherCandidates{} + for _, each := range dispatchers { + matches := each.pathExpr.Matcher.FindStringSubmatch(requestPath) + if matches != nil { + filtered.candidates = append(filtered.candidates, + dispatcherCandidate{each, matches[len(matches)-1], len(matches), each.pathExpr.LiteralCount, each.pathExpr.VarCount}) + } + } + if len(filtered.candidates) == 0 { + if trace { + traceLogger.Printf("no WebService was found to match URL path:%s\n", requestPath) + } + return nil, "", errors.New("not found") + } + sort.Sort(sort.Reverse(filtered)) + return filtered.candidates[0].dispatcher, filtered.candidates[0].finalMatch, nil +} + +// Types and functions to support the sorting of Routes + +type routeCandidate struct { + route Route + matchesCount int // the number of capturing groups + literalCount int // the number of literal characters (means those not resulting from template variable substitution) + nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) +} + +func (r routeCandidate) expressionToMatch() string { + return r.route.pathExpr.Source +} + +func (r routeCandidate) String() string { + return fmt.Sprintf("(m=%d,l=%d,n=%d)", r.matchesCount, r.literalCount, r.nonDefaultCount) +} + +type sortableRouteCandidates struct { + candidates []routeCandidate +} + +func (rcs *sortableRouteCandidates) Len() int { + return len(rcs.candidates) +} +func (rcs *sortableRouteCandidates) Swap(i, j int) { + rcs.candidates[i], rcs.candidates[j] = rcs.candidates[j], rcs.candidates[i] +} +func (rcs *sortableRouteCandidates) Less(i, j int) bool { + ci := rcs.candidates[i] + cj := rcs.candidates[j] + // primary key + if ci.literalCount < cj.literalCount { + return true + } + if ci.literalCount > cj.literalCount { + return false + } + // secundary key + if ci.matchesCount < cj.matchesCount { + return true + } + if ci.matchesCount > cj.matchesCount { + return false + } + // tertiary key + if ci.nonDefaultCount < cj.nonDefaultCount { + return true + } + if ci.nonDefaultCount > cj.nonDefaultCount { + return false + } + // quaternary key ("source" is interpreted as Path) + return ci.route.Path < cj.route.Path +} + +// Types and functions to support the sorting of Dispatchers + +type dispatcherCandidate struct { + dispatcher *WebService + finalMatch string + matchesCount int // the number of capturing groups + literalCount int // the number of literal characters (means those not resulting from template variable substitution) + nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) +} +type sortableDispatcherCandidates struct { + candidates []dispatcherCandidate +} + +func (dc *sortableDispatcherCandidates) Len() int { + return len(dc.candidates) +} +func (dc *sortableDispatcherCandidates) Swap(i, j int) { + dc.candidates[i], dc.candidates[j] = dc.candidates[j], dc.candidates[i] +} +func (dc *sortableDispatcherCandidates) Less(i, j int) bool { + ci := dc.candidates[i] + cj := dc.candidates[j] + // primary key + if ci.matchesCount < cj.matchesCount { + return true + } + if ci.matchesCount > cj.matchesCount { + return false + } + // secundary key + if ci.literalCount < cj.literalCount { + return true + } + if ci.literalCount > cj.literalCount { + return false + } + // tertiary key + return ci.nonDefaultCount < cj.nonDefaultCount +} diff --git a/vendor/github.com/emicklei/go-restful/v3/log/log.go b/vendor/github.com/emicklei/go-restful/v3/log/log.go new file mode 100644 index 00000000..6cd44c7a --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/log/log.go @@ -0,0 +1,34 @@ +package log + +import ( + stdlog "log" + "os" +) + +// StdLogger corresponds to a minimal subset of the interface satisfied by stdlib log.Logger +type StdLogger interface { + Print(v ...interface{}) + Printf(format string, v ...interface{}) +} + +var Logger StdLogger + +func init() { + // default Logger + SetLogger(stdlog.New(os.Stderr, "[restful] ", stdlog.LstdFlags|stdlog.Lshortfile)) +} + +// SetLogger sets the logger for this package +func SetLogger(customLogger StdLogger) { + Logger = customLogger +} + +// Print delegates to the Logger +func Print(v ...interface{}) { + Logger.Print(v...) +} + +// Printf delegates to the Logger +func Printf(format string, v ...interface{}) { + Logger.Printf(format, v...) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/logger.go b/vendor/github.com/emicklei/go-restful/v3/logger.go new file mode 100644 index 00000000..29202726 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/logger.go @@ -0,0 +1,32 @@ +package restful + +// Copyright 2014 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. +import ( + "github.com/emicklei/go-restful/v3/log" +) + +var trace bool = false +var traceLogger log.StdLogger + +func init() { + traceLogger = log.Logger // use the package logger by default +} + +// TraceLogger enables detailed logging of Http request matching and filter invocation. Default no logger is set. +// You may call EnableTracing() directly to enable trace logging to the package-wide logger. +func TraceLogger(logger log.StdLogger) { + traceLogger = logger + EnableTracing(logger != nil) +} + +// SetLogger exposes the setter for the global logger on the top-level package +func SetLogger(customLogger log.StdLogger) { + log.SetLogger(customLogger) +} + +// EnableTracing can be used to Trace logging on and off. +func EnableTracing(enabled bool) { + trace = enabled +} diff --git a/vendor/github.com/emicklei/go-restful/v3/mime.go b/vendor/github.com/emicklei/go-restful/v3/mime.go new file mode 100644 index 00000000..33014471 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/mime.go @@ -0,0 +1,50 @@ +package restful + +import ( + "strconv" + "strings" +) + +type mime struct { + media string + quality float64 +} + +// insertMime adds a mime to a list and keeps it sorted by quality. +func insertMime(l []mime, e mime) []mime { + for i, each := range l { + // if current mime has lower quality then insert before + if e.quality > each.quality { + left := append([]mime{}, l[0:i]...) + return append(append(left, e), l[i:]...) + } + } + return append(l, e) +} + +const qFactorWeightingKey = "q" + +// sortedMimes returns a list of mime sorted (desc) by its specified quality. +// e.g. text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 +func sortedMimes(accept string) (sorted []mime) { + for _, each := range strings.Split(accept, ",") { + typeAndQuality := strings.Split(strings.Trim(each, " "), ";") + if len(typeAndQuality) == 1 { + sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0}) + } else { + // take factor + qAndWeight := strings.Split(typeAndQuality[1], "=") + if len(qAndWeight) == 2 && strings.Trim(qAndWeight[0], " ") == qFactorWeightingKey { + f, err := strconv.ParseFloat(qAndWeight[1], 64) + if err != nil { + traceLogger.Printf("unable to parse quality in %s, %v", each, err) + } else { + sorted = insertMime(sorted, mime{typeAndQuality[0], f}) + } + } else { + sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0}) + } + } + } + return +} diff --git a/vendor/github.com/emicklei/go-restful/v3/options_filter.go b/vendor/github.com/emicklei/go-restful/v3/options_filter.go new file mode 100644 index 00000000..5c1b3425 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/options_filter.go @@ -0,0 +1,34 @@ +package restful + +import "strings" + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method +// and provides the response with a set of allowed methods for the request URL Path. +// As for any filter, you can also install it for a particular WebService within a Container. +// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS). +func (c *Container) OPTIONSFilter(req *Request, resp *Response, chain *FilterChain) { + if "OPTIONS" != req.Request.Method { + chain.ProcessFilter(req, resp) + return + } + + archs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders) + methods := strings.Join(c.computeAllowedMethods(req), ",") + origin := req.Request.Header.Get(HEADER_Origin) + + resp.AddHeader(HEADER_Allow, methods) + resp.AddHeader(HEADER_AccessControlAllowOrigin, origin) + resp.AddHeader(HEADER_AccessControlAllowHeaders, archs) + resp.AddHeader(HEADER_AccessControlAllowMethods, methods) +} + +// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method +// and provides the response with a set of allowed methods for the request URL Path. +// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS). +func OPTIONSFilter() FilterFunction { + return DefaultContainer.OPTIONSFilter +} diff --git a/vendor/github.com/emicklei/go-restful/v3/parameter.go b/vendor/github.com/emicklei/go-restful/v3/parameter.go new file mode 100644 index 00000000..0b851bb4 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/parameter.go @@ -0,0 +1,242 @@ +package restful + +import "sort" + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +const ( + // PathParameterKind = indicator of Request parameter type "path" + PathParameterKind = iota + + // QueryParameterKind = indicator of Request parameter type "query" + QueryParameterKind + + // BodyParameterKind = indicator of Request parameter type "body" + BodyParameterKind + + // HeaderParameterKind = indicator of Request parameter type "header" + HeaderParameterKind + + // FormParameterKind = indicator of Request parameter type "form" + FormParameterKind + + // MultiPartFormParameterKind = indicator of Request parameter type "multipart/form-data" + MultiPartFormParameterKind + + // CollectionFormatCSV comma separated values `foo,bar` + CollectionFormatCSV = CollectionFormat("csv") + + // CollectionFormatSSV space separated values `foo bar` + CollectionFormatSSV = CollectionFormat("ssv") + + // CollectionFormatTSV tab separated values `foo\tbar` + CollectionFormatTSV = CollectionFormat("tsv") + + // CollectionFormatPipes pipe separated values `foo|bar` + CollectionFormatPipes = CollectionFormat("pipes") + + // CollectionFormatMulti corresponds to multiple parameter instances instead of multiple values for a single + // instance `foo=bar&foo=baz`. This is valid only for QueryParameters and FormParameters + CollectionFormatMulti = CollectionFormat("multi") +) + +type CollectionFormat string + +func (cf CollectionFormat) String() string { + return string(cf) +} + +// Parameter is for documententing the parameter used in a Http Request +// ParameterData kinds are Path,Query and Body +type Parameter struct { + data *ParameterData +} + +// ParameterData represents the state of a Parameter. +// It is made public to make it accessible to e.g. the Swagger package. +type ParameterData struct { + ExtensionProperties + Name, Description, DataType, DataFormat string + Kind int + Required bool + // AllowableValues is deprecated. Use PossibleValues instead + AllowableValues map[string]string + PossibleValues []string + AllowMultiple bool + AllowEmptyValue bool + DefaultValue string + CollectionFormat string + Pattern string + Minimum *float64 + Maximum *float64 + MinLength *int64 + MaxLength *int64 + MinItems *int64 + MaxItems *int64 + UniqueItems bool +} + +// Data returns the state of the Parameter +func (p *Parameter) Data() ParameterData { + return *p.data +} + +// Kind returns the parameter type indicator (see const for valid values) +func (p *Parameter) Kind() int { + return p.data.Kind +} + +func (p *Parameter) bePath() *Parameter { + p.data.Kind = PathParameterKind + return p +} +func (p *Parameter) beQuery() *Parameter { + p.data.Kind = QueryParameterKind + return p +} +func (p *Parameter) beBody() *Parameter { + p.data.Kind = BodyParameterKind + return p +} + +func (p *Parameter) beHeader() *Parameter { + p.data.Kind = HeaderParameterKind + return p +} + +func (p *Parameter) beForm() *Parameter { + p.data.Kind = FormParameterKind + return p +} + +func (p *Parameter) beMultiPartForm() *Parameter { + p.data.Kind = MultiPartFormParameterKind + return p +} + +// Required sets the required field and returns the receiver +func (p *Parameter) Required(required bool) *Parameter { + p.data.Required = required + return p +} + +// AllowMultiple sets the allowMultiple field and returns the receiver +func (p *Parameter) AllowMultiple(multiple bool) *Parameter { + p.data.AllowMultiple = multiple + return p +} + +// AddExtension adds or updates a key=value pair to the extension map +func (p *Parameter) AddExtension(key string, value interface{}) *Parameter { + p.data.AddExtension(key, value) + return p +} + +// AllowEmptyValue sets the AllowEmptyValue field and returns the receiver +func (p *Parameter) AllowEmptyValue(multiple bool) *Parameter { + p.data.AllowEmptyValue = multiple + return p +} + +// AllowableValues is deprecated. Use PossibleValues instead. Both will be set. +func (p *Parameter) AllowableValues(values map[string]string) *Parameter { + p.data.AllowableValues = values + + allowableSortedKeys := make([]string, 0, len(values)) + for k := range values { + allowableSortedKeys = append(allowableSortedKeys, k) + } + sort.Strings(allowableSortedKeys) + + p.data.PossibleValues = make([]string, 0, len(values)) + for _, k := range allowableSortedKeys { + p.data.PossibleValues = append(p.data.PossibleValues, values[k]) + } + return p +} + +// PossibleValues sets the possible values field and returns the receiver +func (p *Parameter) PossibleValues(values []string) *Parameter { + p.data.PossibleValues = values + return p +} + +// DataType sets the dataType field and returns the receiver +func (p *Parameter) DataType(typeName string) *Parameter { + p.data.DataType = typeName + return p +} + +// DataFormat sets the dataFormat field for Swagger UI +func (p *Parameter) DataFormat(formatName string) *Parameter { + p.data.DataFormat = formatName + return p +} + +// DefaultValue sets the default value field and returns the receiver +func (p *Parameter) DefaultValue(stringRepresentation string) *Parameter { + p.data.DefaultValue = stringRepresentation + return p +} + +// Description sets the description value field and returns the receiver +func (p *Parameter) Description(doc string) *Parameter { + p.data.Description = doc + return p +} + +// CollectionFormat sets the collection format for an array type +func (p *Parameter) CollectionFormat(format CollectionFormat) *Parameter { + p.data.CollectionFormat = format.String() + return p +} + +// Pattern sets the pattern field and returns the receiver +func (p *Parameter) Pattern(pattern string) *Parameter { + p.data.Pattern = pattern + return p +} + +// Minimum sets the minimum field and returns the receiver +func (p *Parameter) Minimum(minimum float64) *Parameter { + p.data.Minimum = &minimum + return p +} + +// Maximum sets the maximum field and returns the receiver +func (p *Parameter) Maximum(maximum float64) *Parameter { + p.data.Maximum = &maximum + return p +} + +// MinLength sets the minLength field and returns the receiver +func (p *Parameter) MinLength(minLength int64) *Parameter { + p.data.MinLength = &minLength + return p +} + +// MaxLength sets the maxLength field and returns the receiver +func (p *Parameter) MaxLength(maxLength int64) *Parameter { + p.data.MaxLength = &maxLength + return p +} + +// MinItems sets the minItems field and returns the receiver +func (p *Parameter) MinItems(minItems int64) *Parameter { + p.data.MinItems = &minItems + return p +} + +// MaxItems sets the maxItems field and returns the receiver +func (p *Parameter) MaxItems(maxItems int64) *Parameter { + p.data.MaxItems = &maxItems + return p +} + +// UniqueItems sets the uniqueItems field and returns the receiver +func (p *Parameter) UniqueItems(uniqueItems bool) *Parameter { + p.data.UniqueItems = uniqueItems + return p +} diff --git a/vendor/github.com/emicklei/go-restful/v3/path_expression.go b/vendor/github.com/emicklei/go-restful/v3/path_expression.go new file mode 100644 index 00000000..95a9a254 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/path_expression.go @@ -0,0 +1,74 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "bytes" + "fmt" + "regexp" + "strings" +) + +// PathExpression holds a compiled path expression (RegExp) needed to match against +// Http request paths and to extract path parameter values. +type pathExpression struct { + LiteralCount int // the number of literal characters (means those not resulting from template variable substitution) + VarNames []string // the names of parameters (enclosed by {}) in the path + VarCount int // the number of named parameters (enclosed by {}) in the path + Matcher *regexp.Regexp + Source string // Path as defined by the RouteBuilder + tokens []string +} + +// NewPathExpression creates a PathExpression from the input URL path. +// Returns an error if the path is invalid. +func newPathExpression(path string) (*pathExpression, error) { + expression, literalCount, varNames, varCount, tokens := templateToRegularExpression(path) + compiled, err := regexp.Compile(expression) + if err != nil { + return nil, err + } + return &pathExpression{literalCount, varNames, varCount, compiled, expression, tokens}, nil +} + +// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-370003.7.3 +func templateToRegularExpression(template string) (expression string, literalCount int, varNames []string, varCount int, tokens []string) { + var buffer bytes.Buffer + buffer.WriteString("^") + //tokens = strings.Split(template, "/") + tokens = tokenizePath(template) + for _, each := range tokens { + if each == "" { + continue + } + buffer.WriteString("/") + if strings.HasPrefix(each, "{") { + // check for regular expression in variable + colon := strings.Index(each, ":") + var varName string + if colon != -1 { + // extract expression + varName = strings.TrimSpace(each[1:colon]) + paramExpr := strings.TrimSpace(each[colon+1 : len(each)-1]) + if paramExpr == "*" { // special case + buffer.WriteString("(.*)") + } else { + buffer.WriteString(fmt.Sprintf("(%s)", paramExpr)) // between colon and closing moustache + } + } else { + // plain var + varName = strings.TrimSpace(each[1 : len(each)-1]) + buffer.WriteString("([^/]+?)") + } + varNames = append(varNames, varName) + varCount += 1 + } else { + literalCount += len(each) + encoded := each // TODO URI encode + buffer.WriteString(regexp.QuoteMeta(encoded)) + } + } + return strings.TrimRight(buffer.String(), "/") + "(/.*)?$", literalCount, varNames, varCount, tokens +} diff --git a/vendor/github.com/emicklei/go-restful/v3/path_processor.go b/vendor/github.com/emicklei/go-restful/v3/path_processor.go new file mode 100644 index 00000000..14157324 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/path_processor.go @@ -0,0 +1,74 @@ +package restful + +import ( + "bytes" + "strings" +) + +// Copyright 2018 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// PathProcessor is extra behaviour that a Router can provide to extract path parameters from the path. +// If a Router does not implement this interface then the default behaviour will be used. +type PathProcessor interface { + // ExtractParameters gets the path parameters defined in the route and webService from the urlPath + ExtractParameters(route *Route, webService *WebService, urlPath string) map[string]string +} + +type defaultPathProcessor struct{} + +// Extract the parameters from the request url path +func (d defaultPathProcessor) ExtractParameters(r *Route, _ *WebService, urlPath string) map[string]string { + urlParts := tokenizePath(urlPath) + pathParameters := map[string]string{} + for i, key := range r.pathParts { + var value string + if i >= len(urlParts) { + value = "" + } else { + value = urlParts[i] + } + if r.hasCustomVerb && hasCustomVerb(key) { + key = removeCustomVerb(key) + value = removeCustomVerb(value) + } + + if strings.Index(key, "{") > -1 { // path-parameter + if colon := strings.Index(key, ":"); colon != -1 { + // extract by regex + regPart := key[colon+1 : len(key)-1] + keyPart := key[1:colon] + if regPart == "*" { + pathParameters[keyPart] = untokenizePath(i, urlParts) + break + } else { + pathParameters[keyPart] = value + } + } else { + // without enclosing {} + startIndex := strings.Index(key, "{") + endKeyIndex := strings.Index(key, "}") + + suffixLength := len(key) - endKeyIndex - 1 + endValueIndex := len(value) - suffixLength + + pathParameters[key[startIndex+1:endKeyIndex]] = value[startIndex:endValueIndex] + } + } + } + return pathParameters +} + +// Untokenize back into an URL path using the slash separator +func untokenizePath(offset int, parts []string) string { + var buffer bytes.Buffer + for p := offset; p < len(parts); p++ { + buffer.WriteString(parts[p]) + // do not end + if p < len(parts)-1 { + buffer.WriteString("/") + } + } + return buffer.String() +} diff --git a/vendor/github.com/emicklei/go-restful/v3/request.go b/vendor/github.com/emicklei/go-restful/v3/request.go new file mode 100644 index 00000000..5725a075 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/request.go @@ -0,0 +1,132 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "compress/zlib" + "net/http" +) + +var defaultRequestContentType string + +// Request is a wrapper for a http Request that provides convenience methods +type Request struct { + Request *http.Request + pathParameters map[string]string + attributes map[string]interface{} // for storing request-scoped values + selectedRoute *Route // is nil when no route was matched +} + +func NewRequest(httpRequest *http.Request) *Request { + return &Request{ + Request: httpRequest, + pathParameters: map[string]string{}, + attributes: map[string]interface{}{}, + } // empty parameters, attributes +} + +// If ContentType is missing or */* is given then fall back to this type, otherwise +// a "Unable to unmarshal content of type:" response is returned. +// Valid values are restful.MIME_JSON and restful.MIME_XML +// Example: +// restful.DefaultRequestContentType(restful.MIME_JSON) +func DefaultRequestContentType(mime string) { + defaultRequestContentType = mime +} + +// PathParameter accesses the Path parameter value by its name +func (r *Request) PathParameter(name string) string { + return r.pathParameters[name] +} + +// PathParameters accesses the Path parameter values +func (r *Request) PathParameters() map[string]string { + return r.pathParameters +} + +// QueryParameter returns the (first) Query parameter value by its name +func (r *Request) QueryParameter(name string) string { + return r.Request.FormValue(name) +} + +// QueryParameters returns the all the query parameters values by name +func (r *Request) QueryParameters(name string) []string { + return r.Request.URL.Query()[name] +} + +// BodyParameter parses the body of the request (once for typically a POST or a PUT) and returns the value of the given name or an error. +func (r *Request) BodyParameter(name string) (string, error) { + err := r.Request.ParseForm() + if err != nil { + return "", err + } + return r.Request.PostFormValue(name), nil +} + +// HeaderParameter returns the HTTP Header value of a Header name or empty if missing +func (r *Request) HeaderParameter(name string) string { + return r.Request.Header.Get(name) +} + +// ReadEntity checks the Accept header and reads the content into the entityPointer. +func (r *Request) ReadEntity(entityPointer interface{}) (err error) { + contentType := r.Request.Header.Get(HEADER_ContentType) + contentEncoding := r.Request.Header.Get(HEADER_ContentEncoding) + + // check if the request body needs decompression + if ENCODING_GZIP == contentEncoding { + gzipReader := currentCompressorProvider.AcquireGzipReader() + defer currentCompressorProvider.ReleaseGzipReader(gzipReader) + gzipReader.Reset(r.Request.Body) + r.Request.Body = gzipReader + } else if ENCODING_DEFLATE == contentEncoding { + zlibReader, err := zlib.NewReader(r.Request.Body) + if err != nil { + return err + } + r.Request.Body = zlibReader + } + + // lookup the EntityReader, use defaultRequestContentType if needed and provided + entityReader, ok := entityAccessRegistry.accessorAt(contentType) + if !ok { + if len(defaultRequestContentType) != 0 { + entityReader, ok = entityAccessRegistry.accessorAt(defaultRequestContentType) + } + if !ok { + return NewError(http.StatusBadRequest, "Unable to unmarshal content of type:"+contentType) + } + } + return entityReader.Read(r, entityPointer) +} + +// SetAttribute adds or replaces the attribute with the given value. +func (r *Request) SetAttribute(name string, value interface{}) { + r.attributes[name] = value +} + +// Attribute returns the value associated to the given name. Returns nil if absent. +func (r Request) Attribute(name string) interface{} { + return r.attributes[name] +} + +// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees +// If no route was matched then return an empty string. +func (r Request) SelectedRoutePath() string { + if r.selectedRoute == nil { + return "" + } + // skip creating an accessor + return r.selectedRoute.Path +} + +// SelectedRoute returns a reader to access the selected Route by the container +// Returns nil if no route was matched. +func (r Request) SelectedRoute() RouteReader { + if r.selectedRoute == nil { + return nil + } + return routeAccessor{route: r.selectedRoute} +} diff --git a/vendor/github.com/emicklei/go-restful/v3/response.go b/vendor/github.com/emicklei/go-restful/v3/response.go new file mode 100644 index 00000000..8f0b56aa --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/response.go @@ -0,0 +1,256 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "bufio" + "errors" + "net" + "net/http" +) + +// DefaultResponseMimeType is DEPRECATED, use DefaultResponseContentType(mime) +var DefaultResponseMimeType string + +//PrettyPrintResponses controls the indentation feature of XML and JSON serialization +var PrettyPrintResponses = true + +// Response is a wrapper on the actual http ResponseWriter +// It provides several convenience methods to prepare and write response content. +type Response struct { + http.ResponseWriter + requestAccept string // mime-type what the Http Request says it wants to receive + routeProduces []string // mime-types what the Route says it can produce + statusCode int // HTTP status code that has been written explicitly (if zero then net/http has written 200) + contentLength int // number of bytes written for the response body + prettyPrint bool // controls the indentation feature of XML and JSON serialization. It is initialized using var PrettyPrintResponses. + err error // err property is kept when WriteError is called + hijacker http.Hijacker // if underlying ResponseWriter supports it +} + +// NewResponse creates a new response based on a http ResponseWriter. +func NewResponse(httpWriter http.ResponseWriter) *Response { + hijacker, _ := httpWriter.(http.Hijacker) + return &Response{ResponseWriter: httpWriter, routeProduces: []string{}, statusCode: http.StatusOK, prettyPrint: PrettyPrintResponses, hijacker: hijacker} +} + +// DefaultResponseContentType set a default. +// If Accept header matching fails, fall back to this type. +// Valid values are restful.MIME_JSON and restful.MIME_XML +// Example: +// restful.DefaultResponseContentType(restful.MIME_JSON) +func DefaultResponseContentType(mime string) { + DefaultResponseMimeType = mime +} + +// InternalServerError writes the StatusInternalServerError header. +// DEPRECATED, use WriteErrorString(http.StatusInternalServerError,reason) +func (r Response) InternalServerError() Response { + r.WriteHeader(http.StatusInternalServerError) + return r +} + +// Hijack implements the http.Hijacker interface. This expands +// the Response to fulfill http.Hijacker if the underlying +// http.ResponseWriter supports it. +func (r *Response) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if r.hijacker == nil { + return nil, nil, errors.New("http.Hijacker not implemented by underlying http.ResponseWriter") + } + return r.hijacker.Hijack() +} + +// PrettyPrint changes whether this response must produce pretty (line-by-line, indented) JSON or XML output. +func (r *Response) PrettyPrint(bePretty bool) { + r.prettyPrint = bePretty +} + +// AddHeader is a shortcut for .Header().Add(header,value) +func (r Response) AddHeader(header string, value string) Response { + r.Header().Add(header, value) + return r +} + +// SetRequestAccepts tells the response what Mime-type(s) the HTTP request said it wants to accept. Exposed for testing. +func (r *Response) SetRequestAccepts(mime string) { + r.requestAccept = mime +} + +// EntityWriter returns the registered EntityWriter that the entity (requested resource) +// can write according to what the request wants (Accept) and what the Route can produce or what the restful defaults say. +// If called before WriteEntity and WriteHeader then a false return value can be used to write a 406: Not Acceptable. +func (r *Response) EntityWriter() (EntityReaderWriter, bool) { + sorted := sortedMimes(r.requestAccept) + for _, eachAccept := range sorted { + for _, eachProduce := range r.routeProduces { + if eachProduce == eachAccept.media { + if w, ok := entityAccessRegistry.accessorAt(eachAccept.media); ok { + return w, true + } + } + } + if eachAccept.media == "*/*" { + for _, each := range r.routeProduces { + if w, ok := entityAccessRegistry.accessorAt(each); ok { + return w, true + } + } + } + } + // if requestAccept is empty + writer, ok := entityAccessRegistry.accessorAt(r.requestAccept) + if !ok { + // if not registered then fallback to the defaults (if set) + if DefaultResponseMimeType == MIME_JSON { + return entityAccessRegistry.accessorAt(MIME_JSON) + } + if DefaultResponseMimeType == MIME_XML { + return entityAccessRegistry.accessorAt(MIME_XML) + } + // Fallback to whatever the route says it can produce. + // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + for _, each := range r.routeProduces { + if w, ok := entityAccessRegistry.accessorAt(each); ok { + return w, true + } + } + if trace { + traceLogger.Printf("no registered EntityReaderWriter found for %s", r.requestAccept) + } + } + return writer, ok +} + +// WriteEntity calls WriteHeaderAndEntity with Http Status OK (200) +func (r *Response) WriteEntity(value interface{}) error { + return r.WriteHeaderAndEntity(http.StatusOK, value) +} + +// WriteHeaderAndEntity marshals the value using the representation denoted by the Accept Header and the registered EntityWriters. +// If no Accept header is specified (or */*) then respond with the Content-Type as specified by the first in the Route.Produces. +// If an Accept header is specified then respond with the Content-Type as specified by the first in the Route.Produces that is matched with the Accept header. +// If the value is nil then no response is send except for the Http status. You may want to call WriteHeader(http.StatusNotFound) instead. +// If there is no writer available that can represent the value in the requested MIME type then Http Status NotAcceptable is written. +// Current implementation ignores any q-parameters in the Accept Header. +// Returns an error if the value could not be written on the response. +func (r *Response) WriteHeaderAndEntity(status int, value interface{}) error { + writer, ok := r.EntityWriter() + if !ok { + r.WriteHeader(http.StatusNotAcceptable) + return nil + } + return writer.Write(r, status, value) +} + +// WriteAsXml is a convenience method for writing a value in xml (requires Xml tags on the value) +// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter. +func (r *Response) WriteAsXml(value interface{}) error { + return writeXML(r, http.StatusOK, MIME_XML, value) +} + +// WriteHeaderAndXml is a convenience method for writing a status and value in xml (requires Xml tags on the value) +// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter. +func (r *Response) WriteHeaderAndXml(status int, value interface{}) error { + return writeXML(r, status, MIME_XML, value) +} + +// WriteAsJson is a convenience method for writing a value in json. +// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. +func (r *Response) WriteAsJson(value interface{}) error { + return writeJSON(r, http.StatusOK, MIME_JSON, value) +} + +// WriteJson is a convenience method for writing a value in Json with a given Content-Type. +// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. +func (r *Response) WriteJson(value interface{}, contentType string) error { + return writeJSON(r, http.StatusOK, contentType, value) +} + +// WriteHeaderAndJson is a convenience method for writing the status and a value in Json with a given Content-Type. +// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. +func (r *Response) WriteHeaderAndJson(status int, value interface{}, contentType string) error { + return writeJSON(r, status, contentType, value) +} + +// WriteError writes the http status and the error string on the response. err can be nil. +// Return an error if writing was not successful. +func (r *Response) WriteError(httpStatus int, err error) (writeErr error) { + r.err = err + if err == nil { + writeErr = r.WriteErrorString(httpStatus, "") + } else { + writeErr = r.WriteErrorString(httpStatus, err.Error()) + } + return writeErr +} + +// WriteServiceError is a convenience method for a responding with a status and a ServiceError +func (r *Response) WriteServiceError(httpStatus int, err ServiceError) error { + r.err = err + return r.WriteHeaderAndEntity(httpStatus, err) +} + +// WriteErrorString is a convenience method for an error status with the actual error +func (r *Response) WriteErrorString(httpStatus int, errorReason string) error { + if r.err == nil { + // if not called from WriteError + r.err = errors.New(errorReason) + } + r.WriteHeader(httpStatus) + if _, err := r.Write([]byte(errorReason)); err != nil { + return err + } + return nil +} + +// Flush implements http.Flusher interface, which sends any buffered data to the client. +func (r *Response) Flush() { + if f, ok := r.ResponseWriter.(http.Flusher); ok { + f.Flush() + } else if trace { + traceLogger.Printf("ResponseWriter %v doesn't support Flush", r) + } +} + +// WriteHeader is overridden to remember the Status Code that has been written. +// Changes to the Header of the response have no effect after this. +func (r *Response) WriteHeader(httpStatus int) { + r.statusCode = httpStatus + r.ResponseWriter.WriteHeader(httpStatus) +} + +// StatusCode returns the code that has been written using WriteHeader. +func (r Response) StatusCode() int { + if 0 == r.statusCode { + // no status code has been written yet; assume OK + return http.StatusOK + } + return r.statusCode +} + +// Write writes the data to the connection as part of an HTTP reply. +// Write is part of http.ResponseWriter interface. +func (r *Response) Write(bytes []byte) (int, error) { + written, err := r.ResponseWriter.Write(bytes) + r.contentLength += written + return written, err +} + +// ContentLength returns the number of bytes written for the response content. +// Note that this value is only correct if all data is written through the Response using its Write* methods. +// Data written directly using the underlying http.ResponseWriter is not accounted for. +func (r Response) ContentLength() int { + return r.contentLength +} + +// CloseNotify is part of http.CloseNotifier interface +func (r Response) CloseNotify() <-chan bool { + return r.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +// Error returns the err created by WriteError +func (r Response) Error() error { + return r.err +} diff --git a/vendor/github.com/emicklei/go-restful/v3/route.go b/vendor/github.com/emicklei/go-restful/v3/route.go new file mode 100644 index 00000000..193f4a6b --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/route.go @@ -0,0 +1,178 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "net/http" + "strings" +) + +// RouteFunction declares the signature of a function that can be bound to a Route. +type RouteFunction func(*Request, *Response) + +// RouteSelectionConditionFunction declares the signature of a function that +// can be used to add extra conditional logic when selecting whether the route +// matches the HTTP request. +type RouteSelectionConditionFunction func(httpRequest *http.Request) bool + +// Route binds a HTTP Method,Path,Consumes combination to a RouteFunction. +type Route struct { + ExtensionProperties + Method string + Produces []string + Consumes []string + Path string // webservice root path + described path + Function RouteFunction + Filters []FilterFunction + If []RouteSelectionConditionFunction + + // cached values for dispatching + relativePath string + pathParts []string + pathExpr *pathExpression // cached compilation of relativePath as RegExp + + // documentation + Doc string + Notes string + Operation string + ParameterDocs []*Parameter + ResponseErrors map[int]ResponseError + DefaultResponse *ResponseError + ReadSample, WriteSample interface{} // structs that model an example request or response payload + + // Extra information used to store custom information about the route. + Metadata map[string]interface{} + + // marks a route as deprecated + Deprecated bool + + //Overrides the container.contentEncodingEnabled + contentEncodingEnabled *bool + + // indicate route path has custom verb + hasCustomVerb bool + + // if a request does not include a content-type header then + // depending on the method, it may return a 415 Unsupported Media + // Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,... + allowedMethodsWithoutContentType []string +} + +// Initialize for Route +func (r *Route) postBuild() { + r.pathParts = tokenizePath(r.Path) + r.hasCustomVerb = hasCustomVerb(r.Path) +} + +// Create Request and Response from their http versions +func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request, pathParams map[string]string) (*Request, *Response) { + wrappedRequest := NewRequest(httpRequest) + wrappedRequest.pathParameters = pathParams + wrappedRequest.selectedRoute = r + wrappedResponse := NewResponse(httpWriter) + wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept) + wrappedResponse.routeProduces = r.Produces + return wrappedRequest, wrappedResponse +} + +func stringTrimSpaceCutset(r rune) bool { + return r == ' ' +} + +// Return whether the mimeType matches to what this Route can produce. +func (r Route) matchesAccept(mimeTypesWithQuality string) bool { + remaining := mimeTypesWithQuality + for { + var mimeType string + if end := strings.Index(remaining, ","); end == -1 { + mimeType, remaining = remaining, "" + } else { + mimeType, remaining = remaining[:end], remaining[end+1:] + } + if quality := strings.Index(mimeType, ";"); quality != -1 { + mimeType = mimeType[:quality] + } + mimeType = strings.TrimFunc(mimeType, stringTrimSpaceCutset) + if mimeType == "*/*" { + return true + } + for _, producibleType := range r.Produces { + if producibleType == "*/*" || producibleType == mimeType { + return true + } + } + if len(remaining) == 0 { + return false + } + } +} + +// Return whether this Route can consume content with a type specified by mimeTypes (can be empty). +func (r Route) matchesContentType(mimeTypes string) bool { + + if len(r.Consumes) == 0 { + // did not specify what it can consume ; any media type (“*/*”) is assumed + return true + } + + if len(mimeTypes) == 0 { + // idempotent methods with (most-likely or guaranteed) empty content match missing Content-Type + m := r.Method + // if route specifies less or non-idempotent methods then use that + if len(r.allowedMethodsWithoutContentType) > 0 { + for _, each := range r.allowedMethodsWithoutContentType { + if m == each { + return true + } + } + } else { + if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" { + return true + } + } + // proceed with default + mimeTypes = MIME_OCTET + } + + remaining := mimeTypes + for { + var mimeType string + if end := strings.Index(remaining, ","); end == -1 { + mimeType, remaining = remaining, "" + } else { + mimeType, remaining = remaining[:end], remaining[end+1:] + } + if quality := strings.Index(mimeType, ";"); quality != -1 { + mimeType = mimeType[:quality] + } + mimeType = strings.TrimFunc(mimeType, stringTrimSpaceCutset) + for _, consumeableType := range r.Consumes { + if consumeableType == "*/*" || consumeableType == mimeType { + return true + } + } + if len(remaining) == 0 { + return false + } + } +} + +// Tokenize an URL path using the slash separator ; the result does not have empty tokens +func tokenizePath(path string) []string { + if "/" == path { + return nil + } + return strings.Split(strings.Trim(path, "/"), "/") +} + +// for debugging +func (r *Route) String() string { + return r.Method + " " + r.Path +} + +// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses. Overrides the container.contentEncodingEnabled value. +func (r *Route) EnableContentEncoding(enabled bool) { + r.contentEncodingEnabled = &enabled +} diff --git a/vendor/github.com/emicklei/go-restful/v3/route_builder.go b/vendor/github.com/emicklei/go-restful/v3/route_builder.go new file mode 100644 index 00000000..23641b6d --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/route_builder.go @@ -0,0 +1,376 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "fmt" + "os" + "reflect" + "runtime" + "strings" + "sync/atomic" + + "github.com/emicklei/go-restful/v3/log" +) + +// RouteBuilder is a helper to construct Routes. +type RouteBuilder struct { + rootPath string + currentPath string + produces []string + consumes []string + httpMethod string // required + function RouteFunction // required + filters []FilterFunction + conditions []RouteSelectionConditionFunction + allowedMethodsWithoutContentType []string // see Route + + typeNameHandleFunc TypeNameHandleFunction // required + + // documentation + doc string + notes string + operation string + readSample, writeSample interface{} + parameters []*Parameter + errorMap map[int]ResponseError + defaultResponse *ResponseError + metadata map[string]interface{} + extensions map[string]interface{} + deprecated bool + contentEncodingEnabled *bool +} + +// Do evaluates each argument with the RouteBuilder itself. +// This allows you to follow DRY principles without breaking the fluent programming style. +// Example: +// ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500)) +// +// func Returns500(b *RouteBuilder) { +// b.Returns(500, "Internal Server Error", restful.ServiceError{}) +// } +func (b *RouteBuilder) Do(oneArgBlocks ...func(*RouteBuilder)) *RouteBuilder { + for _, each := range oneArgBlocks { + each(b) + } + return b +} + +// To bind the route to a function. +// If this route is matched with the incoming Http Request then call this function with the *Request,*Response pair. Required. +func (b *RouteBuilder) To(function RouteFunction) *RouteBuilder { + b.function = function + return b +} + +// Method specifies what HTTP method to match. Required. +func (b *RouteBuilder) Method(method string) *RouteBuilder { + b.httpMethod = method + return b +} + +// Produces specifies what MIME types can be produced ; the matched one will appear in the Content-Type Http header. +func (b *RouteBuilder) Produces(mimeTypes ...string) *RouteBuilder { + b.produces = mimeTypes + return b +} + +// Consumes specifies what MIME types can be consumes ; the Accept Http header must matched any of these +func (b *RouteBuilder) Consumes(mimeTypes ...string) *RouteBuilder { + b.consumes = mimeTypes + return b +} + +// Path specifies the relative (w.r.t WebService root path) URL path to match. Default is "/". +func (b *RouteBuilder) Path(subPath string) *RouteBuilder { + b.currentPath = subPath + return b +} + +// Doc tells what this route is all about. Optional. +func (b *RouteBuilder) Doc(documentation string) *RouteBuilder { + b.doc = documentation + return b +} + +// Notes is a verbose explanation of the operation behavior. Optional. +func (b *RouteBuilder) Notes(notes string) *RouteBuilder { + b.notes = notes + return b +} + +// Reads tells what resource type will be read from the request payload. Optional. +// A parameter of type "body" is added ,required is set to true and the dataType is set to the qualified name of the sample's type. +func (b *RouteBuilder) Reads(sample interface{}, optionalDescription ...string) *RouteBuilder { + fn := b.typeNameHandleFunc + if fn == nil { + fn = reflectTypeName + } + typeAsName := fn(sample) + description := "" + if len(optionalDescription) > 0 { + description = optionalDescription[0] + } + b.readSample = sample + bodyParameter := &Parameter{&ParameterData{Name: "body", Description: description}} + bodyParameter.beBody() + bodyParameter.Required(true) + bodyParameter.DataType(typeAsName) + b.Param(bodyParameter) + return b +} + +// ParameterNamed returns a Parameter already known to the RouteBuilder. Returns nil if not. +// Use this to modify or extend information for the Parameter (through its Data()). +func (b RouteBuilder) ParameterNamed(name string) (p *Parameter) { + for _, each := range b.parameters { + if each.Data().Name == name { + return each + } + } + return p +} + +// Writes tells what resource type will be written as the response payload. Optional. +func (b *RouteBuilder) Writes(sample interface{}) *RouteBuilder { + b.writeSample = sample + return b +} + +// Param allows you to document the parameters of the Route. It adds a new Parameter (does not check for duplicates). +func (b *RouteBuilder) Param(parameter *Parameter) *RouteBuilder { + if b.parameters == nil { + b.parameters = []*Parameter{} + } + b.parameters = append(b.parameters, parameter) + return b +} + +// Operation allows you to document what the actual method/function call is of the Route. +// Unless called, the operation name is derived from the RouteFunction set using To(..). +func (b *RouteBuilder) Operation(name string) *RouteBuilder { + b.operation = name + return b +} + +// ReturnsError is deprecated, use Returns instead. +func (b *RouteBuilder) ReturnsError(code int, message string, model interface{}) *RouteBuilder { + log.Print("ReturnsError is deprecated, use Returns instead.") + return b.Returns(code, message, model) +} + +// Returns allows you to document what responses (errors or regular) can be expected. +// The model parameter is optional ; either pass a struct instance or use nil if not applicable. +func (b *RouteBuilder) Returns(code int, message string, model interface{}) *RouteBuilder { + err := ResponseError{ + Code: code, + Message: message, + Model: model, + IsDefault: false, // this field is deprecated, use default response instead. + } + // lazy init because there is no NewRouteBuilder (yet) + if b.errorMap == nil { + b.errorMap = map[int]ResponseError{} + } + b.errorMap[code] = err + return b +} + +// ReturnsWithHeaders is similar to Returns, but can specify response headers +func (b *RouteBuilder) ReturnsWithHeaders(code int, message string, model interface{}, headers map[string]Header) *RouteBuilder { + b.Returns(code, message, model) + err := b.errorMap[code] + err.Headers = headers + b.errorMap[code] = err + return b +} + +// DefaultReturns is a special Returns call that sets the default of the response. +func (b *RouteBuilder) DefaultReturns(message string, model interface{}) *RouteBuilder { + b.defaultResponse = &ResponseError{ + Message: message, + Model: model, + } + return b +} + +// Metadata adds or updates a key=value pair to the metadata map. +func (b *RouteBuilder) Metadata(key string, value interface{}) *RouteBuilder { + if b.metadata == nil { + b.metadata = map[string]interface{}{} + } + b.metadata[key] = value + return b +} + +// AddExtension adds or updates a key=value pair to the extensions map. +func (b *RouteBuilder) AddExtension(key string, value interface{}) *RouteBuilder { + if b.extensions == nil { + b.extensions = map[string]interface{}{} + } + b.extensions[key] = value + return b +} + +// Deprecate sets the value of deprecated to true. Deprecated routes have a special UI treatment to warn against use +func (b *RouteBuilder) Deprecate() *RouteBuilder { + b.deprecated = true + return b +} + +// AllowedMethodsWithoutContentType overrides the default list GET,HEAD,OPTIONS,DELETE,TRACE +// If a request does not include a content-type header then +// depending on the method, it may return a 415 Unsupported Media. +// Must have uppercase HTTP Method names such as GET,HEAD,OPTIONS,... +func (b *RouteBuilder) AllowedMethodsWithoutContentType(methods []string) *RouteBuilder { + b.allowedMethodsWithoutContentType = methods + return b +} + +// ResponseError represents a response; not necessarily an error. +type ResponseError struct { + ExtensionProperties + Code int + Message string + Model interface{} + Headers map[string]Header + IsDefault bool +} + +// Header describes a header for a response of the API +// +// For more information: http://goo.gl/8us55a#headerObject +type Header struct { + *Items + Description string +} + +// Items describe swagger simple schemas for headers +type Items struct { + Type string + Format string + Items *Items + CollectionFormat string + Default interface{} +} + +func (b *RouteBuilder) servicePath(path string) *RouteBuilder { + b.rootPath = path + return b +} + +// Filter appends a FilterFunction to the end of filters for this Route to build. +func (b *RouteBuilder) Filter(filter FilterFunction) *RouteBuilder { + b.filters = append(b.filters, filter) + return b +} + +// If sets a condition function that controls matching the Route based on custom logic. +// The condition function is provided the HTTP request and should return true if the route +// should be considered. +// +// Efficiency note: the condition function is called before checking the method, produces, and +// consumes criteria, so that the correct HTTP status code can be returned. +// +// Lifecycle note: no filter functions have been called prior to calling the condition function, +// so the condition function should not depend on any context that might be set up by container +// or route filters. +func (b *RouteBuilder) If(condition RouteSelectionConditionFunction) *RouteBuilder { + b.conditions = append(b.conditions, condition) + return b +} + +// ContentEncodingEnabled allows you to override the Containers value for auto-compressing this route response. +func (b *RouteBuilder) ContentEncodingEnabled(enabled bool) *RouteBuilder { + b.contentEncodingEnabled = &enabled + return b +} + +// If no specific Route path then set to rootPath +// If no specific Produces then set to rootProduces +// If no specific Consumes then set to rootConsumes +func (b *RouteBuilder) copyDefaults(rootProduces, rootConsumes []string) { + if len(b.produces) == 0 { + b.produces = rootProduces + } + if len(b.consumes) == 0 { + b.consumes = rootConsumes + } +} + +// typeNameHandler sets the function that will convert types to strings in the parameter +// and model definitions. +func (b *RouteBuilder) typeNameHandler(handler TypeNameHandleFunction) *RouteBuilder { + b.typeNameHandleFunc = handler + return b +} + +// Build creates a new Route using the specification details collected by the RouteBuilder +func (b *RouteBuilder) Build() Route { + pathExpr, err := newPathExpression(b.currentPath) + if err != nil { + log.Printf("Invalid path:%s because:%v", b.currentPath, err) + os.Exit(1) + } + if b.function == nil { + log.Printf("No function specified for route:" + b.currentPath) + os.Exit(1) + } + operationName := b.operation + if len(operationName) == 0 && b.function != nil { + // extract from definition + operationName = nameOfFunction(b.function) + } + route := Route{ + Method: b.httpMethod, + Path: concatPath(b.rootPath, b.currentPath), + Produces: b.produces, + Consumes: b.consumes, + Function: b.function, + Filters: b.filters, + If: b.conditions, + relativePath: b.currentPath, + pathExpr: pathExpr, + Doc: b.doc, + Notes: b.notes, + Operation: operationName, + ParameterDocs: b.parameters, + ResponseErrors: b.errorMap, + DefaultResponse: b.defaultResponse, + ReadSample: b.readSample, + WriteSample: b.writeSample, + Metadata: b.metadata, + Deprecated: b.deprecated, + contentEncodingEnabled: b.contentEncodingEnabled, + allowedMethodsWithoutContentType: b.allowedMethodsWithoutContentType, + } + route.Extensions = b.extensions + route.postBuild() + return route +} + +func concatPath(path1, path2 string) string { + return strings.TrimRight(path1, "/") + "/" + strings.TrimLeft(path2, "/") +} + +var anonymousFuncCount int32 + +// nameOfFunction returns the short name of the function f for documentation. +// It uses a runtime feature for debugging ; its value may change for later Go versions. +func nameOfFunction(f interface{}) string { + fun := runtime.FuncForPC(reflect.ValueOf(f).Pointer()) + tokenized := strings.Split(fun.Name(), ".") + last := tokenized[len(tokenized)-1] + last = strings.TrimSuffix(last, ")·fm") // < Go 1.5 + last = strings.TrimSuffix(last, ")-fm") // Go 1.5 + last = strings.TrimSuffix(last, "·fm") // < Go 1.5 + last = strings.TrimSuffix(last, "-fm") // Go 1.5 + if last == "func1" { // this could mean conflicts in API docs + val := atomic.AddInt32(&anonymousFuncCount, 1) + last = "func" + fmt.Sprintf("%d", val) + atomic.StoreInt32(&anonymousFuncCount, val) + } + return last +} diff --git a/vendor/github.com/emicklei/go-restful/v3/route_reader.go b/vendor/github.com/emicklei/go-restful/v3/route_reader.go new file mode 100644 index 00000000..c9f4ee75 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/route_reader.go @@ -0,0 +1,66 @@ +package restful + +// Copyright 2021 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +type RouteReader interface { + Method() string + Consumes() []string + Path() string + Doc() string + Notes() string + Operation() string + ParameterDocs() []*Parameter + // Returns a copy + Metadata() map[string]interface{} + Deprecated() bool +} + +type routeAccessor struct { + route *Route +} + +func (r routeAccessor) Method() string { + return r.route.Method +} +func (r routeAccessor) Consumes() []string { + return r.route.Consumes[:] +} +func (r routeAccessor) Path() string { + return r.route.Path +} +func (r routeAccessor) Doc() string { + return r.route.Doc +} +func (r routeAccessor) Notes() string { + return r.route.Notes +} +func (r routeAccessor) Operation() string { + return r.route.Operation +} +func (r routeAccessor) ParameterDocs() []*Parameter { + return r.route.ParameterDocs[:] +} + +// Returns a copy +func (r routeAccessor) Metadata() map[string]interface{} { + return copyMap(r.route.Metadata) +} +func (r routeAccessor) Deprecated() bool { + return r.route.Deprecated +} + +// https://stackoverflow.com/questions/23057785/how-to-copy-a-map +func copyMap(m map[string]interface{}) map[string]interface{} { + cp := make(map[string]interface{}) + for k, v := range m { + vm, ok := v.(map[string]interface{}) + if ok { + cp[k] = copyMap(vm) + } else { + cp[k] = v + } + } + return cp +} diff --git a/vendor/github.com/emicklei/go-restful/v3/router.go b/vendor/github.com/emicklei/go-restful/v3/router.go new file mode 100644 index 00000000..19078af1 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/router.go @@ -0,0 +1,20 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import "net/http" + +// A RouteSelector finds the best matching Route given the input HTTP Request +// RouteSelectors can optionally also implement the PathProcessor interface to also calculate the +// path parameters after the route has been selected. +type RouteSelector interface { + + // SelectRoute finds a Route given the input HTTP Request and a list of WebServices. + // It returns a selected Route and its containing WebService or an error indicating + // a problem. + SelectRoute( + webServices []*WebService, + httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/service_error.go b/vendor/github.com/emicklei/go-restful/v3/service_error.go new file mode 100644 index 00000000..a4157546 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/service_error.go @@ -0,0 +1,32 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "fmt" + "net/http" +) + +// ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request. +type ServiceError struct { + Code int + Message string + Header http.Header +} + +// NewError returns a ServiceError using the code and reason +func NewError(code int, message string) ServiceError { + return ServiceError{Code: code, Message: message} +} + +// NewErrorWithHeader returns a ServiceError using the code, reason and header +func NewErrorWithHeader(code int, message string, header http.Header) ServiceError { + return ServiceError{Code: code, Message: message, Header: header} +} + +// Error returns a text representation of the service error +func (s ServiceError) Error() string { + return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/web_service.go b/vendor/github.com/emicklei/go-restful/v3/web_service.go new file mode 100644 index 00000000..789c4df2 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/web_service.go @@ -0,0 +1,305 @@ +package restful + +import ( + "errors" + "os" + "reflect" + "sync" + + "github.com/emicklei/go-restful/v3/log" +) + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +// WebService holds a collection of Route values that bind a Http Method + URL Path to a function. +type WebService struct { + rootPath string + pathExpr *pathExpression // cached compilation of rootPath as RegExp + routes []Route + produces []string + consumes []string + pathParameters []*Parameter + filters []FilterFunction + documentation string + apiVersion string + + typeNameHandleFunc TypeNameHandleFunction + + dynamicRoutes bool + + // protects 'routes' if dynamic routes are enabled + routesLock sync.RWMutex +} + +func (w *WebService) SetDynamicRoutes(enable bool) { + w.dynamicRoutes = enable +} + +// TypeNameHandleFunction declares functions that can handle translating the name of a sample object +// into the restful documentation for the service. +type TypeNameHandleFunction func(sample interface{}) string + +// TypeNameHandler sets the function that will convert types to strings in the parameter +// and model definitions. If not set, the web service will invoke +// reflect.TypeOf(object).String(). +func (w *WebService) TypeNameHandler(handler TypeNameHandleFunction) *WebService { + w.typeNameHandleFunc = handler + return w +} + +// reflectTypeName is the default TypeNameHandleFunction and for a given object +// returns the name that Go identifies it with (e.g. "string" or "v1.Object") via +// the reflection API. +func reflectTypeName(sample interface{}) string { + return reflect.TypeOf(sample).String() +} + +// compilePathExpression ensures that the path is compiled into a RegEx for those routers that need it. +func (w *WebService) compilePathExpression() { + compiled, err := newPathExpression(w.rootPath) + if err != nil { + log.Printf("invalid path:%s because:%v", w.rootPath, err) + os.Exit(1) + } + w.pathExpr = compiled +} + +// ApiVersion sets the API version for documentation purposes. +func (w *WebService) ApiVersion(apiVersion string) *WebService { + w.apiVersion = apiVersion + return w +} + +// Version returns the API version for documentation purposes. +func (w *WebService) Version() string { return w.apiVersion } + +// Path specifies the root URL template path of the WebService. +// All Routes will be relative to this path. +func (w *WebService) Path(root string) *WebService { + w.rootPath = root + if len(w.rootPath) == 0 { + w.rootPath = "/" + } + w.compilePathExpression() + return w +} + +// Param adds a PathParameter to document parameters used in the root path. +func (w *WebService) Param(parameter *Parameter) *WebService { + if w.pathParameters == nil { + w.pathParameters = []*Parameter{} + } + w.pathParameters = append(w.pathParameters, parameter) + return w +} + +// PathParameter creates a new Parameter of kind Path for documentation purposes. +// It is initialized as required with string as its DataType. +func (w *WebService) PathParameter(name, description string) *Parameter { + return PathParameter(name, description) +} + +// PathParameter creates a new Parameter of kind Path for documentation purposes. +// It is initialized as required with string as its DataType. +func PathParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: true, DataType: "string"}} + p.bePath() + return p +} + +// QueryParameter creates a new Parameter of kind Query for documentation purposes. +// It is initialized as not required with string as its DataType. +func (w *WebService) QueryParameter(name, description string) *Parameter { + return QueryParameter(name, description) +} + +// QueryParameter creates a new Parameter of kind Query for documentation purposes. +// It is initialized as not required with string as its DataType. +func QueryParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string", CollectionFormat: CollectionFormatCSV.String()}} + p.beQuery() + return p +} + +// BodyParameter creates a new Parameter of kind Body for documentation purposes. +// It is initialized as required without a DataType. +func (w *WebService) BodyParameter(name, description string) *Parameter { + return BodyParameter(name, description) +} + +// BodyParameter creates a new Parameter of kind Body for documentation purposes. +// It is initialized as required without a DataType. +func BodyParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: true}} + p.beBody() + return p +} + +// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes. +// It is initialized as not required with string as its DataType. +func (w *WebService) HeaderParameter(name, description string) *Parameter { + return HeaderParameter(name, description) +} + +// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes. +// It is initialized as not required with string as its DataType. +func HeaderParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} + p.beHeader() + return p +} + +// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes. +// It is initialized as required with string as its DataType. +func (w *WebService) FormParameter(name, description string) *Parameter { + return FormParameter(name, description) +} + +// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes. +// It is initialized as required with string as its DataType. +func FormParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} + p.beForm() + return p +} + +// MultiPartFormParameter creates a new Parameter of kind Form (using multipart/form-data) for documentation purposes. +// It is initialized as required with string as its DataType. +func (w *WebService) MultiPartFormParameter(name, description string) *Parameter { + return MultiPartFormParameter(name, description) +} + +func MultiPartFormParameter(name, description string) *Parameter { + p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} + p.beMultiPartForm() + return p +} + +// Route creates a new Route using the RouteBuilder and add to the ordered list of Routes. +func (w *WebService) Route(builder *RouteBuilder) *WebService { + w.routesLock.Lock() + defer w.routesLock.Unlock() + builder.copyDefaults(w.produces, w.consumes) + w.routes = append(w.routes, builder.Build()) + return w +} + +// RemoveRoute removes the specified route, looks for something that matches 'path' and 'method' +func (w *WebService) RemoveRoute(path, method string) error { + if !w.dynamicRoutes { + return errors.New("dynamic routes are not enabled.") + } + w.routesLock.Lock() + defer w.routesLock.Unlock() + newRoutes := []Route{} + for _, route := range w.routes { + if route.Method == method && route.Path == path { + continue + } + newRoutes = append(newRoutes, route) + } + w.routes = newRoutes + return nil +} + +// Method creates a new RouteBuilder and initialize its http method +func (w *WebService) Method(httpMethod string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method(httpMethod) +} + +// Produces specifies that this WebService can produce one or more MIME types. +// Http requests must have one of these values set for the Accept header. +func (w *WebService) Produces(contentTypes ...string) *WebService { + w.produces = contentTypes + return w +} + +// Consumes specifies that this WebService can consume one or more MIME types. +// Http requests must have one of these values set for the Content-Type header. +func (w *WebService) Consumes(accepts ...string) *WebService { + w.consumes = accepts + return w +} + +// Routes returns the Routes associated with this WebService +func (w *WebService) Routes() []Route { + if !w.dynamicRoutes { + return w.routes + } + // Make a copy of the array to prevent concurrency problems + w.routesLock.RLock() + defer w.routesLock.RUnlock() + result := make([]Route, len(w.routes)) + for ix := range w.routes { + result[ix] = w.routes[ix] + } + return result +} + +// RootPath returns the RootPath associated with this WebService. Default "/" +func (w *WebService) RootPath() string { + return w.rootPath +} + +// PathParameters return the path parameter names for (shared among its Routes) +func (w *WebService) PathParameters() []*Parameter { + return w.pathParameters +} + +// Filter adds a filter function to the chain of filters applicable to all its Routes +func (w *WebService) Filter(filter FilterFunction) *WebService { + w.filters = append(w.filters, filter) + return w +} + +// Doc is used to set the documentation of this service. +func (w *WebService) Doc(plainText string) *WebService { + w.documentation = plainText + return w +} + +// Documentation returns it. +func (w *WebService) Documentation() string { + return w.documentation +} + +/* + Convenience methods +*/ + +// HEAD is a shortcut for .Method("HEAD").Path(subPath) +func (w *WebService) HEAD(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("HEAD").Path(subPath) +} + +// GET is a shortcut for .Method("GET").Path(subPath) +func (w *WebService) GET(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("GET").Path(subPath) +} + +// POST is a shortcut for .Method("POST").Path(subPath) +func (w *WebService) POST(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("POST").Path(subPath) +} + +// PUT is a shortcut for .Method("PUT").Path(subPath) +func (w *WebService) PUT(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PUT").Path(subPath) +} + +// PATCH is a shortcut for .Method("PATCH").Path(subPath) +func (w *WebService) PATCH(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PATCH").Path(subPath) +} + +// DELETE is a shortcut for .Method("DELETE").Path(subPath) +func (w *WebService) DELETE(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("DELETE").Path(subPath) +} + +// OPTIONS is a shortcut for .Method("OPTIONS").Path(subPath) +func (w *WebService) OPTIONS(subPath string) *RouteBuilder { + return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("OPTIONS").Path(subPath) +} diff --git a/vendor/github.com/emicklei/go-restful/v3/web_service_container.go b/vendor/github.com/emicklei/go-restful/v3/web_service_container.go new file mode 100644 index 00000000..c9d31b06 --- /dev/null +++ b/vendor/github.com/emicklei/go-restful/v3/web_service_container.go @@ -0,0 +1,39 @@ +package restful + +// Copyright 2013 Ernest Micklei. All rights reserved. +// Use of this source code is governed by a license +// that can be found in the LICENSE file. + +import ( + "net/http" +) + +// DefaultContainer is a restful.Container that uses http.DefaultServeMux +var DefaultContainer *Container + +func init() { + DefaultContainer = NewContainer() + DefaultContainer.ServeMux = http.DefaultServeMux +} + +// If set the true then panics will not be caught to return HTTP 500. +// In that case, Route functions are responsible for handling any error situation. +// Default value is false = recover from panics. This has performance implications. +// OBSOLETE ; use restful.DefaultContainer.DoNotRecover(true) +var DoNotRecover = false + +// Add registers a new WebService add it to the DefaultContainer. +func Add(service *WebService) { + DefaultContainer.Add(service) +} + +// Filter appends a container FilterFunction from the DefaultContainer. +// These are called before dispatching a http.Request to a WebService. +func Filter(filter FilterFunction) { + DefaultContainer.Filter(filter) +} + +// RegisteredWebServices returns the collections of WebServices from the DefaultContainer +func RegisteredWebServices() []*WebService { + return DefaultContainer.RegisteredWebServices() +} diff --git a/vendor/github.com/go-kit/kit/log/json_logger.go b/vendor/github.com/go-kit/kit/log/json_logger.go index 66094b4d..0cedbf82 100644 --- a/vendor/github.com/go-kit/kit/log/json_logger.go +++ b/vendor/github.com/go-kit/kit/log/json_logger.go @@ -31,7 +31,9 @@ func (l *jsonLogger) Log(keyvals ...interface{}) error { } merge(m, k, v) } - return json.NewEncoder(l.Writer).Encode(m) + enc := json.NewEncoder(l.Writer) + enc.SetEscapeHTML(false) + return enc.Encode(m) } func merge(dst map[string]interface{}, k, v interface{}) { diff --git a/vendor/github.com/go-logfmt/logfmt/.travis.yml b/vendor/github.com/go-logfmt/logfmt/.travis.yml deleted file mode 100644 index 51393098..00000000 --- a/vendor/github.com/go-logfmt/logfmt/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: go -sudo: false -go: - - "1.7.x" - - "1.8.x" - - "1.9.x" - - "1.10.x" - - "1.11.x" - - "1.12.x" - - "1.13.x" - - "tip" - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover - -script: - - goveralls -service=travis-ci diff --git a/vendor/github.com/go-logfmt/logfmt/README.md b/vendor/github.com/go-logfmt/logfmt/README.md index 3a8f10b7..8e48fcd3 100644 --- a/vendor/github.com/go-logfmt/logfmt/README.md +++ b/vendor/github.com/go-logfmt/logfmt/README.md @@ -1,33 +1,33 @@ -[![GoDoc](https://godoc.org/github.com/go-logfmt/logfmt?status.svg)](https://godoc.org/github.com/go-logfmt/logfmt) -[![Go Report Card](https://goreportcard.com/badge/go-logfmt/logfmt)](https://goreportcard.com/report/go-logfmt/logfmt) -[![TravisCI](https://travis-ci.org/go-logfmt/logfmt.svg?branch=master)](https://travis-ci.org/go-logfmt/logfmt) -[![Coverage Status](https://coveralls.io/repos/github/go-logfmt/logfmt/badge.svg?branch=master)](https://coveralls.io/github/go-logfmt/logfmt?branch=master) - -# logfmt - -Package logfmt implements utilities to marshal and unmarshal data in the [logfmt -format](https://brandur.org/logfmt). It provides an API similar to -[encoding/json](http://golang.org/pkg/encoding/json/) and -[encoding/xml](http://golang.org/pkg/encoding/xml/). - -The logfmt format was first documented by Brandur Leach in [this -article](https://brandur.org/logfmt). The format has not been formally -standardized. The most authoritative public specification to date has been the -documentation of a Go Language [package](http://godoc.org/github.com/kr/logfmt) -written by Blake Mizerany and Keith Rarick. - -## Goals - -This project attempts to conform as closely as possible to the prior art, while -also removing ambiguity where necessary to provide well behaved encoder and -decoder implementations. - -## Non-goals - -This project does not attempt to formally standardize the logfmt format. In the -event that logfmt is standardized this project would take conforming to the -standard as a goal. - -## Versioning - -Package logfmt publishes releases via [semver](http://semver.org/) compatible Git tags prefixed with a single 'v'. +[![Go Reference](https://pkg.go.dev/badge/github.com/go-logfmt/logfmt.svg)](https://pkg.go.dev/github.com/go-logfmt/logfmt) +[![Go Report Card](https://goreportcard.com/badge/go-logfmt/logfmt)](https://goreportcard.com/report/go-logfmt/logfmt) +[![Github Actions](https://github.com/go-logfmt/logfmt/actions/workflows/test.yml/badge.svg)](https://github.com/go-logfmt/logfmt/actions/workflows/test.yml) +[![Coverage Status](https://coveralls.io/repos/github/go-logfmt/logfmt/badge.svg?branch=master)](https://coveralls.io/github/go-logfmt/logfmt?branch=master) + +# logfmt + +Package logfmt implements utilities to marshal and unmarshal data in the [logfmt +format](https://brandur.org/logfmt). It provides an API similar to +[encoding/json](http://golang.org/pkg/encoding/json/) and +[encoding/xml](http://golang.org/pkg/encoding/xml/). + +The logfmt format was first documented by Brandur Leach in [this +article](https://brandur.org/logfmt). The format has not been formally +standardized. The most authoritative public specification to date has been the +documentation of a Go Language [package](http://godoc.org/github.com/kr/logfmt) +written by Blake Mizerany and Keith Rarick. + +## Goals + +This project attempts to conform as closely as possible to the prior art, while +also removing ambiguity where necessary to provide well behaved encoder and +decoder implementations. + +## Non-goals + +This project does not attempt to formally standardize the logfmt format. In the +event that logfmt is standardized this project would take conforming to the +standard as a goal. + +## Versioning + +Package logfmt publishes releases via [semver](http://semver.org/) compatible Git tags prefixed with a single 'v'. diff --git a/vendor/github.com/go-logr/logr/.golangci.yaml b/vendor/github.com/go-logr/logr/.golangci.yaml index 94ff801d..0cffafa7 100644 --- a/vendor/github.com/go-logr/logr/.golangci.yaml +++ b/vendor/github.com/go-logr/logr/.golangci.yaml @@ -6,7 +6,6 @@ linters: disable-all: true enable: - asciicheck - - deadcode - errcheck - forcetypeassert - gocritic @@ -18,10 +17,8 @@ linters: - misspell - revive - staticcheck - - structcheck - typecheck - unused - - varcheck issues: exclude-use-default: false diff --git a/vendor/github.com/go-logr/logr/discard.go b/vendor/github.com/go-logr/logr/discard.go index 9d92a38f..99fe8be9 100644 --- a/vendor/github.com/go-logr/logr/discard.go +++ b/vendor/github.com/go-logr/logr/discard.go @@ -20,35 +20,5 @@ package logr // used whenever the caller is not interested in the logs. Logger instances // produced by this function always compare as equal. func Discard() Logger { - return Logger{ - level: 0, - sink: discardLogSink{}, - } -} - -// discardLogSink is a LogSink that discards all messages. -type discardLogSink struct{} - -// Verify that it actually implements the interface -var _ LogSink = discardLogSink{} - -func (l discardLogSink) Init(RuntimeInfo) { -} - -func (l discardLogSink) Enabled(int) bool { - return false -} - -func (l discardLogSink) Info(int, string, ...interface{}) { -} - -func (l discardLogSink) Error(error, string, ...interface{}) { -} - -func (l discardLogSink) WithValues(...interface{}) LogSink { - return l -} - -func (l discardLogSink) WithName(string) LogSink { - return l + return New(nil) } diff --git a/vendor/github.com/go-logr/logr/funcr/funcr.go b/vendor/github.com/go-logr/logr/funcr/funcr.go index 7accdb0c..e52f0cd0 100644 --- a/vendor/github.com/go-logr/logr/funcr/funcr.go +++ b/vendor/github.com/go-logr/logr/funcr/funcr.go @@ -21,13 +21,13 @@ limitations under the License. // github.com/go-logr/logr.LogSink with output through an arbitrary // "write" function. See New and NewJSON for details. // -// Custom LogSinks +// # Custom LogSinks // // For users who need more control, a funcr.Formatter can be embedded inside // your own custom LogSink implementation. This is useful when the LogSink // needs to implement additional methods, for example. // -// Formatting +// # Formatting // // This will respect logr.Marshaler, fmt.Stringer, and error interfaces for // values which are being logged. When rendering a struct, funcr will use Go's @@ -37,6 +37,7 @@ package funcr import ( "bytes" "encoding" + "encoding/json" "fmt" "path/filepath" "reflect" @@ -217,7 +218,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter { prefix: "", values: nil, depth: 0, - opts: opts, + opts: &opts, } return f } @@ -231,7 +232,7 @@ type Formatter struct { values []interface{} valuesStr string depth int - opts Options + opts *Options } // outputFormat indicates which outputFormat to use. @@ -447,6 +448,7 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if flags&flagRawStruct == 0 { buf.WriteByte('{') } + printComma := false // testing i>0 is not enough because of JSON omitted fields for i := 0; i < t.NumField(); i++ { fld := t.Field(i) if fld.PkgPath != "" { @@ -478,9 +480,10 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s if omitempty && isEmpty(v.Field(i)) { continue } - if i > 0 { + if printComma { buf.WriteByte(',') } + printComma = true // if we got here, we are rendering a field if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" { buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1)) continue @@ -500,6 +503,20 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s } return buf.String() case reflect.Slice, reflect.Array: + // If this is outputing as JSON make sure this isn't really a json.RawMessage. + // If so just emit "as-is" and don't pretty it as that will just print + // it as [X,Y,Z,...] which isn't terribly useful vs the string form you really want. + if f.outputFormat == outputJSON { + if rm, ok := value.(json.RawMessage); ok { + // If it's empty make sure we emit an empty value as the array style would below. + if len(rm) > 0 { + buf.Write(rm) + } else { + buf.WriteString("null") + } + return buf.String() + } + } buf.WriteByte('[') for i := 0; i < v.Len(); i++ { if i > 0 { diff --git a/vendor/github.com/go-logr/logr/logr.go b/vendor/github.com/go-logr/logr/logr.go index c3b56b3d..e027aea3 100644 --- a/vendor/github.com/go-logr/logr/logr.go +++ b/vendor/github.com/go-logr/logr/logr.go @@ -21,7 +21,7 @@ limitations under the License. // to back that API. Packages in the Go ecosystem can depend on this package, // while callers can implement logging with whatever backend is appropriate. // -// Usage +// # Usage // // Logging is done using a Logger instance. Logger is a concrete type with // methods, which defers the actual logging to a LogSink interface. The main @@ -30,16 +30,20 @@ limitations under the License. // "structured logging". // // With Go's standard log package, we might write: -// log.Printf("setting target value %s", targetValue) +// +// log.Printf("setting target value %s", targetValue) // // With logr's structured logging, we'd write: -// logger.Info("setting target", "value", targetValue) +// +// logger.Info("setting target", "value", targetValue) // // Errors are much the same. Instead of: -// log.Printf("failed to open the pod bay door for user %s: %v", user, err) +// +// log.Printf("failed to open the pod bay door for user %s: %v", user, err) // // We'd write: -// logger.Error(err, "failed to open the pod bay door", "user", user) +// +// logger.Error(err, "failed to open the pod bay door", "user", user) // // Info() and Error() are very similar, but they are separate methods so that // LogSink implementations can choose to do things like attach additional @@ -47,7 +51,7 @@ limitations under the License. // always logged, regardless of the current verbosity. If there is no error // instance available, passing nil is valid. // -// Verbosity +// # Verbosity // // Often we want to log information only when the application in "verbose // mode". To write log lines that are more verbose, Logger has a V() method. @@ -58,20 +62,22 @@ limitations under the License. // Error messages do not have a verbosity level and are always logged. // // Where we might have written: -// if flVerbose >= 2 { -// log.Printf("an unusual thing happened") -// } +// +// if flVerbose >= 2 { +// log.Printf("an unusual thing happened") +// } // // We can write: -// logger.V(2).Info("an unusual thing happened") // -// Logger Names +// logger.V(2).Info("an unusual thing happened") +// +// # Logger Names // // Logger instances can have name strings so that all messages logged through // that instance have additional context. For example, you might want to add // a subsystem name: // -// logger.WithName("compactor").Info("started", "time", time.Now()) +// logger.WithName("compactor").Info("started", "time", time.Now()) // // The WithName() method returns a new Logger, which can be passed to // constructors or other functions for further use. Repeated use of WithName() @@ -82,25 +88,27 @@ limitations under the License. // joining operation (e.g. whitespace, commas, periods, slashes, brackets, // quotes, etc). // -// Saved Values +// # Saved Values // // Logger instances can store any number of key/value pairs, which will be // logged alongside all messages logged through that instance. For example, // you might want to create a Logger instance per managed object: // // With the standard log package, we might write: -// log.Printf("decided to set field foo to value %q for object %s/%s", -// targetValue, object.Namespace, object.Name) +// +// log.Printf("decided to set field foo to value %q for object %s/%s", +// targetValue, object.Namespace, object.Name) // // With logr we'd write: -// // Elsewhere: set up the logger to log the object name. -// obj.logger = mainLogger.WithValues( -// "name", obj.name, "namespace", obj.namespace) // -// // later on... -// obj.logger.Info("setting foo", "value", targetValue) +// // Elsewhere: set up the logger to log the object name. +// obj.logger = mainLogger.WithValues( +// "name", obj.name, "namespace", obj.namespace) +// +// // later on... +// obj.logger.Info("setting foo", "value", targetValue) // -// Best Practices +// # Best Practices // // Logger has very few hard rules, with the goal that LogSink implementations // might have a lot of freedom to differentiate. There are, however, some @@ -124,15 +132,15 @@ limitations under the License. // around. For cases where passing a logger is optional, a pointer to Logger // should be used. // -// Key Naming Conventions +// # Key Naming Conventions // // Keys are not strictly required to conform to any specification or regex, but // it is recommended that they: -// * be human-readable and meaningful (not auto-generated or simple ordinals) -// * be constant (not dependent on input data) -// * contain only printable characters -// * not contain whitespace or punctuation -// * use lower case for simple keys and lowerCamelCase for more complex ones +// - be human-readable and meaningful (not auto-generated or simple ordinals) +// - be constant (not dependent on input data) +// - contain only printable characters +// - not contain whitespace or punctuation +// - use lower case for simple keys and lowerCamelCase for more complex ones // // These guidelines help ensure that log data is processed properly regardless // of the log implementation. For example, log implementations will try to @@ -141,51 +149,54 @@ limitations under the License. // While users are generally free to use key names of their choice, it's // generally best to avoid using the following keys, as they're frequently used // by implementations: -// * "caller": the calling information (file/line) of a particular log line -// * "error": the underlying error value in the `Error` method -// * "level": the log level -// * "logger": the name of the associated logger -// * "msg": the log message -// * "stacktrace": the stack trace associated with a particular log line or -// error (often from the `Error` message) -// * "ts": the timestamp for a log line +// - "caller": the calling information (file/line) of a particular log line +// - "error": the underlying error value in the `Error` method +// - "level": the log level +// - "logger": the name of the associated logger +// - "msg": the log message +// - "stacktrace": the stack trace associated with a particular log line or +// error (often from the `Error` message) +// - "ts": the timestamp for a log line // // Implementations are encouraged to make use of these keys to represent the // above concepts, when necessary (for example, in a pure-JSON output form, it // would be necessary to represent at least message and timestamp as ordinary // named values). // -// Break Glass +// # Break Glass // // Implementations may choose to give callers access to the underlying // logging implementation. The recommended pattern for this is: -// // Underlier exposes access to the underlying logging implementation. -// // Since callers only have a logr.Logger, they have to know which -// // implementation is in use, so this interface is less of an abstraction -// // and more of way to test type conversion. -// type Underlier interface { -// GetUnderlying() -// } +// +// // Underlier exposes access to the underlying logging implementation. +// // Since callers only have a logr.Logger, they have to know which +// // implementation is in use, so this interface is less of an abstraction +// // and more of way to test type conversion. +// type Underlier interface { +// GetUnderlying() +// } // // Logger grants access to the sink to enable type assertions like this: -// func DoSomethingWithImpl(log logr.Logger) { -// if underlier, ok := log.GetSink()(impl.Underlier) { -// implLogger := underlier.GetUnderlying() -// ... -// } -// } +// +// func DoSomethingWithImpl(log logr.Logger) { +// if underlier, ok := log.GetSink().(impl.Underlier); ok { +// implLogger := underlier.GetUnderlying() +// ... +// } +// } // // Custom `With*` functions can be implemented by copying the complete // Logger struct and replacing the sink in the copy: -// // WithFooBar changes the foobar parameter in the log sink and returns a -// // new logger with that modified sink. It does nothing for loggers where -// // the sink doesn't support that parameter. -// func WithFoobar(log logr.Logger, foobar int) logr.Logger { -// if foobarLogSink, ok := log.GetSink()(FoobarSink); ok { -// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) -// } -// return log -// } +// +// // WithFooBar changes the foobar parameter in the log sink and returns a +// // new logger with that modified sink. It does nothing for loggers where +// // the sink doesn't support that parameter. +// func WithFoobar(log logr.Logger, foobar int) logr.Logger { +// if foobarLogSink, ok := log.GetSink().(FoobarSink); ok { +// log = log.WithSink(foobarLogSink.WithFooBar(foobar)) +// } +// return log +// } // // Don't use New to construct a new Logger with a LogSink retrieved from an // existing Logger. Source code attribution might not work correctly and @@ -201,11 +212,14 @@ import ( ) // New returns a new Logger instance. This is primarily used by libraries -// implementing LogSink, rather than end users. +// implementing LogSink, rather than end users. Passing a nil sink will create +// a Logger which discards all log lines. func New(sink LogSink) Logger { logger := Logger{} logger.setSink(sink) - sink.Init(runtimeInfo) + if sink != nil { + sink.Init(runtimeInfo) + } return logger } @@ -244,7 +258,7 @@ type Logger struct { // Enabled tests whether this Logger is enabled. For example, commandline // flags might be used to set the logging verbosity and disable some info logs. func (l Logger) Enabled() bool { - return l.sink.Enabled(l.level) + return l.sink != nil && l.sink.Enabled(l.level) } // Info logs a non-error message with the given key/value pairs as context. @@ -254,6 +268,9 @@ func (l Logger) Enabled() bool { // information. The key/value pairs must alternate string keys and arbitrary // values. func (l Logger) Info(msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if l.Enabled() { if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() @@ -273,6 +290,9 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) { // triggered this log line, if present. The err parameter is optional // and nil may be passed instead of an error instance. func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { + if l.sink == nil { + return + } if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { withHelper.GetCallStackHelper()() } @@ -284,6 +304,9 @@ func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { // level means a log message is less important. Negative V-levels are treated // as 0. func (l Logger) V(level int) Logger { + if l.sink == nil { + return l + } if level < 0 { level = 0 } @@ -294,6 +317,9 @@ func (l Logger) V(level int) Logger { // WithValues returns a new Logger instance with additional key/value pairs. // See Info for documentation on how key/value pairs work. func (l Logger) WithValues(keysAndValues ...interface{}) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithValues(keysAndValues...)) return l } @@ -304,6 +330,9 @@ func (l Logger) WithValues(keysAndValues ...interface{}) Logger { // contain only letters, digits, and hyphens (see the package documentation for // more information). func (l Logger) WithName(name string) Logger { + if l.sink == nil { + return l + } l.setSink(l.sink.WithName(name)) return l } @@ -324,6 +353,9 @@ func (l Logger) WithName(name string) Logger { // WithCallDepth(1) because it works with implementions that support the // CallDepthLogSink and/or CallStackHelperLogSink interfaces. func (l Logger) WithCallDepth(depth int) Logger { + if l.sink == nil { + return l + } if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(depth)) } @@ -345,6 +377,9 @@ func (l Logger) WithCallDepth(depth int) Logger { // implementation does not support either of these, the original Logger will be // returned. func (l Logger) WithCallStackHelper() (func(), Logger) { + if l.sink == nil { + return func() {}, l + } var helper func() if withCallDepth, ok := l.sink.(CallDepthLogSink); ok { l.setSink(withCallDepth.WithCallDepth(1)) @@ -357,6 +392,11 @@ func (l Logger) WithCallStackHelper() (func(), Logger) { return helper, l } +// IsZero returns true if this logger is an uninitialized zero value +func (l Logger) IsZero() bool { + return l.sink == nil +} + // contextKey is how we find Loggers in a context.Context. type contextKey struct{} @@ -442,7 +482,7 @@ type LogSink interface { WithName(name string) LogSink } -// CallDepthLogSink represents a Logger that knows how to climb the call stack +// CallDepthLogSink represents a LogSink that knows how to climb the call stack // to identify the original call site and can offset the depth by a specified // number of frames. This is useful for users who have helper functions // between the "real" call site and the actual calls to Logger methods. @@ -467,7 +507,7 @@ type CallDepthLogSink interface { WithCallDepth(depth int) LogSink } -// CallStackHelperLogSink represents a Logger that knows how to climb +// CallStackHelperLogSink represents a LogSink that knows how to climb // the call stack to identify the original call site and can skip // intermediate helper functions if they mark themselves as // helper. Go's testing package uses that approach. diff --git a/vendor/github.com/go-openapi/jsonpointer/.editorconfig b/vendor/github.com/go-openapi/jsonpointer/.editorconfig new file mode 100644 index 00000000..3152da69 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore new file mode 100644 index 00000000..769c2440 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.gitignore @@ -0,0 +1 @@ +secrets.yml diff --git a/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..9322b065 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonpointer/LICENSE b/vendor/github.com/go-openapi/jsonpointer/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md new file mode 100644 index 00000000..813788af --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/README.md @@ -0,0 +1,15 @@ +# gojsonpointer [![Build Status](https://travis-ci.org/go-openapi/jsonpointer.svg?branch=master)](https://travis-ci.org/go-openapi/jsonpointer) [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonpointer?status.svg)](http://godoc.org/github.com/go-openapi/jsonpointer) +An implementation of JSON Pointer - Go language + +## Status +Completed YES + +Tested YES + +## References +http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + +### Note +The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go new file mode 100644 index 00000000..7df9853d --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -0,0 +1,390 @@ +// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// +// 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. + +// author sigu-399 +// author-github https://github.com/sigu-399 +// author-mail sigu.399@gmail.com +// +// repository-name jsonpointer +// repository-desc An implementation of JSON Pointer - Go language +// +// description Main and unique file. +// +// created 25-02-2013 + +package jsonpointer + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "strings" + + "github.com/go-openapi/swag" +) + +const ( + emptyPointer = `` + pointerSeparator = `/` + + invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator +) + +var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() +var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() + +// JSONPointable is an interface for structs to implement when they need to customize the +// json pointer process +type JSONPointable interface { + JSONLookup(string) (interface{}, error) +} + +// JSONSetable is an interface for structs to implement when they need to customize the +// json pointer process +type JSONSetable interface { + JSONSet(string, interface{}) error +} + +// New creates a new json pointer for the given string +func New(jsonPointerString string) (Pointer, error) { + + var p Pointer + err := p.parse(jsonPointerString) + return p, err + +} + +// Pointer the json pointer reprsentation +type Pointer struct { + referenceTokens []string +} + +// "Constructor", parses the given string JSON pointer +func (p *Pointer) parse(jsonPointerString string) error { + + var err error + + if jsonPointerString != emptyPointer { + if !strings.HasPrefix(jsonPointerString, pointerSeparator) { + err = errors.New(invalidStart) + } else { + referenceTokens := strings.Split(jsonPointerString, pointerSeparator) + for _, referenceToken := range referenceTokens[1:] { + p.referenceTokens = append(p.referenceTokens, referenceToken) + } + } + } + + return err +} + +// Get uses the pointer to retrieve a value from a JSON document +func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) { + return p.get(document, swag.DefaultJSONNameProvider) +} + +// Set uses the pointer to set a value from a JSON document +func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) { + return document, p.set(document, value, swag.DefaultJSONNameProvider) +} + +// GetForToken gets a value for a json pointer token 1 level deep +func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) { + return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider) +} + +// SetForToken gets a value for a json pointer token 1 level deep +func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) { + return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider) +} + +func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return nil, kind, err + } + return r, kind, nil + } + + switch kind { + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return nil, kind, fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + return fld.Interface(), kind, nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) + + if mv.IsValid() { + return mv.Interface(), kind, nil + } + return nil, kind, fmt.Errorf("object has no key %q", decodedToken) + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return nil, kind, err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + return elem.Interface(), kind, nil + + default: + return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken) + } + +} + +func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { + rValue := reflect.Indirect(reflect.ValueOf(node)) + + if ns, ok := node.(JSONSetable); ok { // pointer impl + return ns.JSONSet(decodedToken, data) + } + + if rValue.Type().Implements(jsonSetableType) { + return node.(JSONSetable).JSONSet(decodedToken, data) + } + + switch rValue.Kind() { + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + if fld.IsValid() { + fld.Set(reflect.ValueOf(data)) + } + return nil + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + rValue.SetMapIndex(kv, reflect.ValueOf(data)) + return nil + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + if !elem.CanSet() { + return fmt.Errorf("can't set slice index %s to %v", decodedToken, data) + } + elem.Set(reflect.ValueOf(data)) + return nil + + default: + return fmt.Errorf("invalid token reference %q", decodedToken) + } + +} + +func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { + + if nameProvider == nil { + nameProvider = swag.DefaultJSONNameProvider + } + + kind := reflect.Invalid + + // Full document when empty + if len(p.referenceTokens) == 0 { + return node, kind, nil + } + + for _, token := range p.referenceTokens { + + decodedToken := Unescape(token) + + r, knd, err := getSingleImpl(node, decodedToken, nameProvider) + if err != nil { + return nil, knd, err + } + node, kind = r, knd + + } + + rValue := reflect.ValueOf(node) + kind = rValue.Kind() + + return node, kind, nil +} + +func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error { + knd := reflect.ValueOf(node).Kind() + + if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { + return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values") + } + + if nameProvider == nil { + nameProvider = swag.DefaultJSONNameProvider + } + + // Full document when empty + if len(p.referenceTokens) == 0 { + return nil + } + + lastI := len(p.referenceTokens) - 1 + for i, token := range p.referenceTokens { + isLastToken := i == lastI + decodedToken := Unescape(token) + + if isLastToken { + + return setSingleImpl(node, data, decodedToken, nameProvider) + } + + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return err + } + fld := reflect.ValueOf(r) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() + continue + } + node = r + continue + } + + switch kind { + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return fmt.Errorf("object has no field %q", decodedToken) + } + fld := rValue.FieldByName(nm) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() + continue + } + node = fld.Interface() + + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) + + if !mv.IsValid() { + return fmt.Errorf("object has no key %q", decodedToken) + } + if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr { + node = mv.Addr().Interface() + continue + } + node = mv.Interface() + + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return err + } + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) + } + + elem := rValue.Index(tokenIndex) + if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr { + node = elem.Addr().Interface() + continue + } + node = elem.Interface() + + default: + return fmt.Errorf("invalid token reference %q", decodedToken) + } + + } + + return nil +} + +// DecodedTokens returns the decoded tokens +func (p *Pointer) DecodedTokens() []string { + result := make([]string, 0, len(p.referenceTokens)) + for _, t := range p.referenceTokens { + result = append(result, Unescape(t)) + } + return result +} + +// IsEmpty returns true if this is an empty json pointer +// this indicates that it points to the root document +func (p *Pointer) IsEmpty() bool { + return len(p.referenceTokens) == 0 +} + +// Pointer to string representation function +func (p *Pointer) String() string { + + if len(p.referenceTokens) == 0 { + return emptyPointer + } + + pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator) + + return pointerString +} + +// Specific JSON pointer encoding here +// ~0 => ~ +// ~1 => / +// ... and vice versa + +const ( + encRefTok0 = `~0` + encRefTok1 = `~1` + decRefTok0 = `~` + decRefTok1 = `/` +) + +// Unescape unescapes a json pointer reference token string to the original representation +func Unescape(token string) string { + step1 := strings.Replace(token, encRefTok1, decRefTok1, -1) + step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1) + return step2 +} + +// Escape escapes a pointer reference token string +func Escape(token string) string { + step1 := strings.Replace(token, decRefTok0, encRefTok0, -1) + step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1) + return step2 +} diff --git a/vendor/github.com/go-openapi/jsonreference/.gitignore b/vendor/github.com/go-openapi/jsonreference/.gitignore new file mode 100644 index 00000000..769c2440 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.gitignore @@ -0,0 +1 @@ +secrets.yml diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml new file mode 100644 index 00000000..013fc194 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.golangci.yml @@ -0,0 +1,50 @@ +linters-settings: + govet: + check-shadowing: true + gocyclo: + min-complexity: 30 + maligned: + suggest-new: true + dupl: + threshold: 100 + goconst: + min-len: 2 + min-occurrences: 4 + paralleltest: + ignore-missing: true +linters: + enable-all: true + disable: + - maligned + - lll + - gochecknoglobals + - godox + - gocognit + - whitespace + - wsl + - funlen + - gochecknoglobals + - gochecknoinits + - scopelint + - wrapcheck + - exhaustivestruct + - exhaustive + - nlreturn + - testpackage + - gci + - gofumpt + - goerr113 + - gomnd + - tparallel + - nestif + - godot + - errorlint + - varcheck + - interfacer + - deadcode + - golint + - ifshort + - structcheck + - nosnakecase + - varnamelen + - exhaustruct diff --git a/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..9322b065 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonreference/LICENSE b/vendor/github.com/go-openapi/jsonreference/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md new file mode 100644 index 00000000..b94753aa --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -0,0 +1,15 @@ +# gojsonreference [![Build Status](https://travis-ci.org/go-openapi/jsonreference.svg?branch=master)](https://travis-ci.org/go-openapi/jsonreference) [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonreference?status.svg)](http://godoc.org/github.com/go-openapi/jsonreference) +An implementation of JSON Reference - Go language + +## Status +Feature complete. Stable API + +## Dependencies +https://github.com/go-openapi/jsonpointer + +## References +http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + +http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 diff --git a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go new file mode 100644 index 00000000..fb376fce --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -0,0 +1,64 @@ +package internal + +import ( + "net/url" + "regexp" + "strings" +) + +const ( + defaultHTTPPort = ":80" + defaultHTTPSPort = ":443" +) + +// Regular expressions used by the normalizations +var rxPort = regexp.MustCompile(`(:\d+)/?$`) +var rxDupSlashes = regexp.MustCompile(`/{2,}`) + +// NormalizeURL will normalize the specified URL +// This was added to replace a previous call to the no longer maintained purell library: +// The call that was used looked like the following: +// +// url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) +// +// To explain all that was included in the call above, purell.FlagsSafe was really just the following: +// - FlagLowercaseScheme +// - FlagLowercaseHost +// - FlagRemoveDefaultPort +// - FlagRemoveDuplicateSlashes (and this was mixed in with the |) +func NormalizeURL(u *url.URL) { + lowercaseScheme(u) + lowercaseHost(u) + removeDefaultPort(u) + removeDuplicateSlashes(u) +} + +func lowercaseScheme(u *url.URL) { + if len(u.Scheme) > 0 { + u.Scheme = strings.ToLower(u.Scheme) + } +} + +func lowercaseHost(u *url.URL) { + if len(u.Host) > 0 { + u.Host = strings.ToLower(u.Host) + } +} + +func removeDefaultPort(u *url.URL) { + if len(u.Host) > 0 { + scheme := strings.ToLower(u.Scheme) + u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string { + if (scheme == "http" && val == defaultHTTPPort) || (scheme == "https" && val == defaultHTTPSPort) { + return "" + } + return val + }) + } +} + +func removeDuplicateSlashes(u *url.URL) { + if len(u.Path) > 0 { + u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/") + } +} diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go new file mode 100644 index 00000000..cfdef03e --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -0,0 +1,158 @@ +// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// +// 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. + +// author sigu-399 +// author-github https://github.com/sigu-399 +// author-mail sigu.399@gmail.com +// +// repository-name jsonreference +// repository-desc An implementation of JSON Reference - Go language +// +// description Main and unique file. +// +// created 26-02-2013 + +package jsonreference + +import ( + "errors" + "net/url" + "strings" + + "github.com/go-openapi/jsonpointer" + "github.com/go-openapi/jsonreference/internal" +) + +const ( + fragmentRune = `#` +) + +// New creates a new reference for the given string +func New(jsonReferenceString string) (Ref, error) { + + var r Ref + err := r.parse(jsonReferenceString) + return r, err + +} + +// MustCreateRef parses the ref string and panics when it's invalid. +// Use the New method for a version that returns an error +func MustCreateRef(ref string) Ref { + r, err := New(ref) + if err != nil { + panic(err) + } + return r +} + +// Ref represents a json reference object +type Ref struct { + referenceURL *url.URL + referencePointer jsonpointer.Pointer + + HasFullURL bool + HasURLPathOnly bool + HasFragmentOnly bool + HasFileScheme bool + HasFullFilePath bool +} + +// GetURL gets the URL for this reference +func (r *Ref) GetURL() *url.URL { + return r.referenceURL +} + +// GetPointer gets the json pointer for this reference +func (r *Ref) GetPointer() *jsonpointer.Pointer { + return &r.referencePointer +} + +// String returns the best version of the url for this reference +func (r *Ref) String() string { + + if r.referenceURL != nil { + return r.referenceURL.String() + } + + if r.HasFragmentOnly { + return fragmentRune + r.referencePointer.String() + } + + return r.referencePointer.String() +} + +// IsRoot returns true if this reference is a root document +func (r *Ref) IsRoot() bool { + return r.referenceURL != nil && + !r.IsCanonical() && + !r.HasURLPathOnly && + r.referenceURL.Fragment == "" +} + +// IsCanonical returns true when this pointer starts with http(s):// or file:// +func (r *Ref) IsCanonical() bool { + return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL) +} + +// "Constructor", parses the given string JSON reference +func (r *Ref) parse(jsonReferenceString string) error { + + parsed, err := url.Parse(jsonReferenceString) + if err != nil { + return err + } + + internal.NormalizeURL(parsed) + + r.referenceURL = parsed + refURL := r.referenceURL + + if refURL.Scheme != "" && refURL.Host != "" { + r.HasFullURL = true + } else { + if refURL.Path != "" { + r.HasURLPathOnly = true + } else if refURL.RawQuery == "" && refURL.Fragment != "" { + r.HasFragmentOnly = true + } + } + + r.HasFileScheme = refURL.Scheme == "file" + r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/") + + // invalid json-pointer error means url has no json-pointer fragment. simply ignore error + r.referencePointer, _ = jsonpointer.New(refURL.Fragment) + + return nil +} + +// Inherits creates a new reference from a parent and a child +// If the child cannot inherit from the parent, an error is returned +func (r *Ref) Inherits(child Ref) (*Ref, error) { + childURL := child.GetURL() + parentURL := r.GetURL() + if childURL == nil { + return nil, errors.New("child url is nil") + } + if parentURL == nil { + return &child, nil + } + + ref, err := New(parentURL.ResolveReference(childURL).String()) + if err != nil { + return nil, err + } + return &ref, nil +} diff --git a/vendor/github.com/go-openapi/swag/.editorconfig b/vendor/github.com/go-openapi/swag/.editorconfig new file mode 100644 index 00000000..3152da69 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/swag/.gitattributes b/vendor/github.com/go-openapi/swag/.gitattributes new file mode 100644 index 00000000..49ad5276 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.gitattributes @@ -0,0 +1,2 @@ +# gofmt always uses LF, whereas Git uses CRLF on Windows. +*.go text eol=lf diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore new file mode 100644 index 00000000..d69b53ac --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.gitignore @@ -0,0 +1,4 @@ +secrets.yml +vendor +Godeps +.idea diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml new file mode 100644 index 00000000..bf503e40 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -0,0 +1,54 @@ +linters-settings: + govet: + check-shadowing: true + golint: + min-confidence: 0 + gocyclo: + min-complexity: 25 + maligned: + suggest-new: true + dupl: + threshold: 100 + goconst: + min-len: 3 + min-occurrences: 2 + +linters: + enable-all: true + disable: + - maligned + - lll + - gochecknoinits + - gochecknoglobals + - nlreturn + - testpackage + - wrapcheck + - gomnd + - exhaustive + - exhaustivestruct + - goerr113 + - wsl + - whitespace + - gofumpt + - godot + - nestif + - godox + - funlen + - gci + - gocognit + - paralleltest + - thelper + - ifshort + - gomoddirectives + - cyclop + - forcetypeassert + - ireturn + - tagliatelle + - varnamelen + - goimports + - tenv + - golint + - exhaustruct + - nilnil + - nonamedreturns + - nosnakecase diff --git a/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..9322b065 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at ivan+abuse@flanders.co.nz. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/swag/LICENSE b/vendor/github.com/go-openapi/swag/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md new file mode 100644 index 00000000..217f6fa5 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/README.md @@ -0,0 +1,21 @@ +# Swag [![Build Status](https://travis-ci.org/go-openapi/swag.svg?branch=master)](https://travis-ci.org/go-openapi/swag) [![codecov](https://codecov.io/gh/go-openapi/swag/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/swag) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) + +[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) +[![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/swag)](https://goreportcard.com/report/github.com/go-openapi/swag) + +Contains a bunch of helper functions for go-openapi and go-swagger projects. + +You may also use it standalone for your projects. + +* convert between value and pointers for builtin types +* convert from string to builtin types (wraps strconv) +* fast json concatenation +* search in path +* load from file or http +* name mangling + + +This repo has only few dependencies outside of the standard library: + +* YAML utilities depend on gopkg.in/yaml.v2 diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go new file mode 100644 index 00000000..fc085aeb --- /dev/null +++ b/vendor/github.com/go-openapi/swag/convert.go @@ -0,0 +1,208 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "math" + "strconv" + "strings" +) + +// same as ECMA Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER +const ( + maxJSONFloat = float64(1<<53 - 1) // 9007199254740991.0 2^53 - 1 + minJSONFloat = -float64(1<<53 - 1) //-9007199254740991.0 -2^53 - 1 + epsilon float64 = 1e-9 +) + +// IsFloat64AJSONInteger allow for integers [-2^53, 2^53-1] inclusive +func IsFloat64AJSONInteger(f float64) bool { + if math.IsNaN(f) || math.IsInf(f, 0) || f < minJSONFloat || f > maxJSONFloat { + return false + } + fa := math.Abs(f) + g := float64(uint64(f)) + ga := math.Abs(g) + + diff := math.Abs(f - g) + + // more info: https://floating-point-gui.de/errors/comparison/#look-out-for-edge-cases + switch { + case f == g: // best case + return true + case f == float64(int64(f)) || f == float64(uint64(f)): // optimistic case + return true + case f == 0 || g == 0 || diff < math.SmallestNonzeroFloat64: // very close to 0 values + return diff < (epsilon * math.SmallestNonzeroFloat64) + } + // check the relative error + return diff/math.Min(fa+ga, math.MaxFloat64) < epsilon +} + +var evaluatesAsTrue map[string]struct{} + +func init() { + evaluatesAsTrue = map[string]struct{}{ + "true": {}, + "1": {}, + "yes": {}, + "ok": {}, + "y": {}, + "on": {}, + "selected": {}, + "checked": {}, + "t": {}, + "enabled": {}, + } +} + +// ConvertBool turn a string into a boolean +func ConvertBool(str string) (bool, error) { + _, ok := evaluatesAsTrue[strings.ToLower(str)] + return ok, nil +} + +// ConvertFloat32 turn a string into a float32 +func ConvertFloat32(str string) (float32, error) { + f, err := strconv.ParseFloat(str, 32) + if err != nil { + return 0, err + } + return float32(f), nil +} + +// ConvertFloat64 turn a string into a float64 +func ConvertFloat64(str string) (float64, error) { + return strconv.ParseFloat(str, 64) +} + +// ConvertInt8 turn a string into an int8 +func ConvertInt8(str string) (int8, error) { + i, err := strconv.ParseInt(str, 10, 8) + if err != nil { + return 0, err + } + return int8(i), nil +} + +// ConvertInt16 turn a string into an int16 +func ConvertInt16(str string) (int16, error) { + i, err := strconv.ParseInt(str, 10, 16) + if err != nil { + return 0, err + } + return int16(i), nil +} + +// ConvertInt32 turn a string into an int32 +func ConvertInt32(str string) (int32, error) { + i, err := strconv.ParseInt(str, 10, 32) + if err != nil { + return 0, err + } + return int32(i), nil +} + +// ConvertInt64 turn a string into an int64 +func ConvertInt64(str string) (int64, error) { + return strconv.ParseInt(str, 10, 64) +} + +// ConvertUint8 turn a string into an uint8 +func ConvertUint8(str string) (uint8, error) { + i, err := strconv.ParseUint(str, 10, 8) + if err != nil { + return 0, err + } + return uint8(i), nil +} + +// ConvertUint16 turn a string into an uint16 +func ConvertUint16(str string) (uint16, error) { + i, err := strconv.ParseUint(str, 10, 16) + if err != nil { + return 0, err + } + return uint16(i), nil +} + +// ConvertUint32 turn a string into an uint32 +func ConvertUint32(str string) (uint32, error) { + i, err := strconv.ParseUint(str, 10, 32) + if err != nil { + return 0, err + } + return uint32(i), nil +} + +// ConvertUint64 turn a string into an uint64 +func ConvertUint64(str string) (uint64, error) { + return strconv.ParseUint(str, 10, 64) +} + +// FormatBool turns a boolean into a string +func FormatBool(value bool) string { + return strconv.FormatBool(value) +} + +// FormatFloat32 turns a float32 into a string +func FormatFloat32(value float32) string { + return strconv.FormatFloat(float64(value), 'f', -1, 32) +} + +// FormatFloat64 turns a float64 into a string +func FormatFloat64(value float64) string { + return strconv.FormatFloat(value, 'f', -1, 64) +} + +// FormatInt8 turns an int8 into a string +func FormatInt8(value int8) string { + return strconv.FormatInt(int64(value), 10) +} + +// FormatInt16 turns an int16 into a string +func FormatInt16(value int16) string { + return strconv.FormatInt(int64(value), 10) +} + +// FormatInt32 turns an int32 into a string +func FormatInt32(value int32) string { + return strconv.Itoa(int(value)) +} + +// FormatInt64 turns an int64 into a string +func FormatInt64(value int64) string { + return strconv.FormatInt(value, 10) +} + +// FormatUint8 turns an uint8 into a string +func FormatUint8(value uint8) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint16 turns an uint16 into a string +func FormatUint16(value uint16) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint32 turns an uint32 into a string +func FormatUint32(value uint32) string { + return strconv.FormatUint(uint64(value), 10) +} + +// FormatUint64 turns an uint64 into a string +func FormatUint64(value uint64) string { + return strconv.FormatUint(value, 10) +} diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go new file mode 100644 index 00000000..c49cc473 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/convert_types.go @@ -0,0 +1,730 @@ +package swag + +import "time" + +// This file was taken from the aws go sdk + +// String returns a pointer to of the string value passed in. +func String(v string) *string { + return &v +} + +// StringValue returns the value of the string pointer passed in or +// "" if the pointer is nil. +func StringValue(v *string) string { + if v != nil { + return *v + } + return "" +} + +// StringSlice converts a slice of string values into a slice of +// string pointers +func StringSlice(src []string) []*string { + dst := make([]*string, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// StringValueSlice converts a slice of string pointers into a slice of +// string values +func StringValueSlice(src []*string) []string { + dst := make([]string, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// StringMap converts a string map of string values into a string +// map of string pointers +func StringMap(src map[string]string) map[string]*string { + dst := make(map[string]*string) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// StringValueMap converts a string map of string pointers into a string +// map of string values +func StringValueMap(src map[string]*string) map[string]string { + dst := make(map[string]string) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Bool returns a pointer to of the bool value passed in. +func Bool(v bool) *bool { + return &v +} + +// BoolValue returns the value of the bool pointer passed in or +// false if the pointer is nil. +func BoolValue(v *bool) bool { + if v != nil { + return *v + } + return false +} + +// BoolSlice converts a slice of bool values into a slice of +// bool pointers +func BoolSlice(src []bool) []*bool { + dst := make([]*bool, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// BoolValueSlice converts a slice of bool pointers into a slice of +// bool values +func BoolValueSlice(src []*bool) []bool { + dst := make([]bool, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// BoolMap converts a string map of bool values into a string +// map of bool pointers +func BoolMap(src map[string]bool) map[string]*bool { + dst := make(map[string]*bool) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// BoolValueMap converts a string map of bool pointers into a string +// map of bool values +func BoolValueMap(src map[string]*bool) map[string]bool { + dst := make(map[string]bool) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int returns a pointer to of the int value passed in. +func Int(v int) *int { + return &v +} + +// IntValue returns the value of the int pointer passed in or +// 0 if the pointer is nil. +func IntValue(v *int) int { + if v != nil { + return *v + } + return 0 +} + +// IntSlice converts a slice of int values into a slice of +// int pointers +func IntSlice(src []int) []*int { + dst := make([]*int, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// IntValueSlice converts a slice of int pointers into a slice of +// int values +func IntValueSlice(src []*int) []int { + dst := make([]int, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// IntMap converts a string map of int values into a string +// map of int pointers +func IntMap(src map[string]int) map[string]*int { + dst := make(map[string]*int) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// IntValueMap converts a string map of int pointers into a string +// map of int values +func IntValueMap(src map[string]*int) map[string]int { + dst := make(map[string]int) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int32 returns a pointer to of the int32 value passed in. +func Int32(v int32) *int32 { + return &v +} + +// Int32Value returns the value of the int32 pointer passed in or +// 0 if the pointer is nil. +func Int32Value(v *int32) int32 { + if v != nil { + return *v + } + return 0 +} + +// Int32Slice converts a slice of int32 values into a slice of +// int32 pointers +func Int32Slice(src []int32) []*int32 { + dst := make([]*int32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int32ValueSlice converts a slice of int32 pointers into a slice of +// int32 values +func Int32ValueSlice(src []*int32) []int32 { + dst := make([]int32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int32Map converts a string map of int32 values into a string +// map of int32 pointers +func Int32Map(src map[string]int32) map[string]*int32 { + dst := make(map[string]*int32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int32ValueMap converts a string map of int32 pointers into a string +// map of int32 values +func Int32ValueMap(src map[string]*int32) map[string]int32 { + dst := make(map[string]int32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Int64 returns a pointer to of the int64 value passed in. +func Int64(v int64) *int64 { + return &v +} + +// Int64Value returns the value of the int64 pointer passed in or +// 0 if the pointer is nil. +func Int64Value(v *int64) int64 { + if v != nil { + return *v + } + return 0 +} + +// Int64Slice converts a slice of int64 values into a slice of +// int64 pointers +func Int64Slice(src []int64) []*int64 { + dst := make([]*int64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Int64ValueSlice converts a slice of int64 pointers into a slice of +// int64 values +func Int64ValueSlice(src []*int64) []int64 { + dst := make([]int64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Int64Map converts a string map of int64 values into a string +// map of int64 pointers +func Int64Map(src map[string]int64) map[string]*int64 { + dst := make(map[string]*int64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Int64ValueMap converts a string map of int64 pointers into a string +// map of int64 values +func Int64ValueMap(src map[string]*int64) map[string]int64 { + dst := make(map[string]int64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint16 returns a pointer to of the uint16 value passed in. +func Uint16(v uint16) *uint16 { + return &v +} + +// Uint16Value returns the value of the uint16 pointer passed in or +// 0 if the pointer is nil. +func Uint16Value(v *uint16) uint16 { + if v != nil { + return *v + } + + return 0 +} + +// Uint16Slice converts a slice of uint16 values into a slice of +// uint16 pointers +func Uint16Slice(src []uint16) []*uint16 { + dst := make([]*uint16, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Uint16ValueSlice converts a slice of uint16 pointers into a slice of +// uint16 values +func Uint16ValueSlice(src []*uint16) []uint16 { + dst := make([]uint16, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Uint16Map converts a string map of uint16 values into a string +// map of uint16 pointers +func Uint16Map(src map[string]uint16) map[string]*uint16 { + dst := make(map[string]*uint16) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Uint16ValueMap converts a string map of uint16 pointers into a string +// map of uint16 values +func Uint16ValueMap(src map[string]*uint16) map[string]uint16 { + dst := make(map[string]uint16) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + +// Uint returns a pointer to of the uint value passed in. +func Uint(v uint) *uint { + return &v +} + +// UintValue returns the value of the uint pointer passed in or +// 0 if the pointer is nil. +func UintValue(v *uint) uint { + if v != nil { + return *v + } + return 0 +} + +// UintSlice converts a slice of uint values into a slice of +// uint pointers +func UintSlice(src []uint) []*uint { + dst := make([]*uint, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// UintValueSlice converts a slice of uint pointers into a slice of +// uint values +func UintValueSlice(src []*uint) []uint { + dst := make([]uint, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// UintMap converts a string map of uint values into a string +// map of uint pointers +func UintMap(src map[string]uint) map[string]*uint { + dst := make(map[string]*uint) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// UintValueMap converts a string map of uint pointers into a string +// map of uint values +func UintValueMap(src map[string]*uint) map[string]uint { + dst := make(map[string]uint) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint32 returns a pointer to of the uint32 value passed in. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint32Value returns the value of the uint32 pointer passed in or +// 0 if the pointer is nil. +func Uint32Value(v *uint32) uint32 { + if v != nil { + return *v + } + return 0 +} + +// Uint32Slice converts a slice of uint32 values into a slice of +// uint32 pointers +func Uint32Slice(src []uint32) []*uint32 { + dst := make([]*uint32, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint32ValueSlice converts a slice of uint32 pointers into a slice of +// uint32 values +func Uint32ValueSlice(src []*uint32) []uint32 { + dst := make([]uint32, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint32Map converts a string map of uint32 values into a string +// map of uint32 pointers +func Uint32Map(src map[string]uint32) map[string]*uint32 { + dst := make(map[string]*uint32) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint32ValueMap converts a string map of uint32 pointers into a string +// map of uint32 values +func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { + dst := make(map[string]uint32) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Uint64 returns a pointer to of the uint64 value passed in. +func Uint64(v uint64) *uint64 { + return &v +} + +// Uint64Value returns the value of the uint64 pointer passed in or +// 0 if the pointer is nil. +func Uint64Value(v *uint64) uint64 { + if v != nil { + return *v + } + return 0 +} + +// Uint64Slice converts a slice of uint64 values into a slice of +// uint64 pointers +func Uint64Slice(src []uint64) []*uint64 { + dst := make([]*uint64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Uint64ValueSlice converts a slice of uint64 pointers into a slice of +// uint64 values +func Uint64ValueSlice(src []*uint64) []uint64 { + dst := make([]uint64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Uint64Map converts a string map of uint64 values into a string +// map of uint64 pointers +func Uint64Map(src map[string]uint64) map[string]*uint64 { + dst := make(map[string]*uint64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Uint64ValueMap converts a string map of uint64 pointers into a string +// map of uint64 values +func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { + dst := make(map[string]uint64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Float32 returns a pointer to of the float32 value passed in. +func Float32(v float32) *float32 { + return &v +} + +// Float32Value returns the value of the float32 pointer passed in or +// 0 if the pointer is nil. +func Float32Value(v *float32) float32 { + if v != nil { + return *v + } + + return 0 +} + +// Float32Slice converts a slice of float32 values into a slice of +// float32 pointers +func Float32Slice(src []float32) []*float32 { + dst := make([]*float32, len(src)) + + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Float32ValueSlice converts a slice of float32 pointers into a slice of +// float32 values +func Float32ValueSlice(src []*float32) []float32 { + dst := make([]float32, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Float32Map converts a string map of float32 values into a string +// map of float32 pointers +func Float32Map(src map[string]float32) map[string]*float32 { + dst := make(map[string]*float32) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Float32ValueMap converts a string map of float32 pointers into a string +// map of float32 values +func Float32ValueMap(src map[string]*float32) map[string]float32 { + dst := make(map[string]float32) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + +// Float64 returns a pointer to of the float64 value passed in. +func Float64(v float64) *float64 { + return &v +} + +// Float64Value returns the value of the float64 pointer passed in or +// 0 if the pointer is nil. +func Float64Value(v *float64) float64 { + if v != nil { + return *v + } + return 0 +} + +// Float64Slice converts a slice of float64 values into a slice of +// float64 pointers +func Float64Slice(src []float64) []*float64 { + dst := make([]*float64, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// Float64ValueSlice converts a slice of float64 pointers into a slice of +// float64 values +func Float64ValueSlice(src []*float64) []float64 { + dst := make([]float64, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// Float64Map converts a string map of float64 values into a string +// map of float64 pointers +func Float64Map(src map[string]float64) map[string]*float64 { + dst := make(map[string]*float64) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// Float64ValueMap converts a string map of float64 pointers into a string +// map of float64 values +func Float64ValueMap(src map[string]*float64) map[string]float64 { + dst := make(map[string]float64) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} + +// Time returns a pointer to of the time.Time value passed in. +func Time(v time.Time) *time.Time { + return &v +} + +// TimeValue returns the value of the time.Time pointer passed in or +// time.Time{} if the pointer is nil. +func TimeValue(v *time.Time) time.Time { + if v != nil { + return *v + } + return time.Time{} +} + +// TimeSlice converts a slice of time.Time values into a slice of +// time.Time pointers +func TimeSlice(src []time.Time) []*time.Time { + dst := make([]*time.Time, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + return dst +} + +// TimeValueSlice converts a slice of time.Time pointers into a slice of +// time.Time values +func TimeValueSlice(src []*time.Time) []time.Time { + dst := make([]time.Time, len(src)) + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + return dst +} + +// TimeMap converts a string map of time.Time values into a string +// map of time.Time pointers +func TimeMap(src map[string]time.Time) map[string]*time.Time { + dst := make(map[string]*time.Time) + for k, val := range src { + v := val + dst[k] = &v + } + return dst +} + +// TimeValueMap converts a string map of time.Time pointers into a string +// map of time.Time values +func TimeValueMap(src map[string]*time.Time) map[string]time.Time { + dst := make(map[string]time.Time) + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + return dst +} diff --git a/vendor/github.com/go-openapi/swag/doc.go b/vendor/github.com/go-openapi/swag/doc.go new file mode 100644 index 00000000..55094cb7 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/doc.go @@ -0,0 +1,31 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/* +Package swag contains a bunch of helper functions for go-openapi and go-swagger projects. + +You may also use it standalone for your projects. + + - convert between value and pointers for builtin types + - convert from string to builtin types (wraps strconv) + - fast json concatenation + - search in path + - load from file or http + - name mangling + +This repo has only few dependencies outside of the standard library: + + - YAML utilities depend on gopkg.in/yaml.v2 +*/ +package swag diff --git a/vendor/github.com/go-openapi/swag/file.go b/vendor/github.com/go-openapi/swag/file.go new file mode 100644 index 00000000..16accc55 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/file.go @@ -0,0 +1,33 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import "mime/multipart" + +// File represents an uploaded file. +type File struct { + Data multipart.File + Header *multipart.FileHeader +} + +// Read bytes from the file +func (f *File) Read(p []byte) (n int, err error) { + return f.Data.Read(p) +} + +// Close the file +func (f *File) Close() error { + return f.Data.Close() +} diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go new file mode 100644 index 00000000..7e9902ca --- /dev/null +++ b/vendor/github.com/go-openapi/swag/json.go @@ -0,0 +1,312 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "bytes" + "encoding/json" + "log" + "reflect" + "strings" + "sync" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// nullJSON represents a JSON object with null type +var nullJSON = []byte("null") + +// DefaultJSONNameProvider the default cache for types +var DefaultJSONNameProvider = NewNameProvider() + +const comma = byte(',') + +var closers map[byte]byte + +func init() { + closers = map[byte]byte{ + '{': '}', + '[': ']', + } +} + +type ejMarshaler interface { + MarshalEasyJSON(w *jwriter.Writer) +} + +type ejUnmarshaler interface { + UnmarshalEasyJSON(w *jlexer.Lexer) +} + +// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler +// so it takes the fastest option available. +func WriteJSON(data interface{}) ([]byte, error) { + if d, ok := data.(ejMarshaler); ok { + jw := new(jwriter.Writer) + d.MarshalEasyJSON(jw) + return jw.BuildBytes() + } + if d, ok := data.(json.Marshaler); ok { + return d.MarshalJSON() + } + return json.Marshal(data) +} + +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler +// so it takes the fastest option available +func ReadJSON(data []byte, value interface{}) error { + trimmedData := bytes.Trim(data, "\x00") + if d, ok := value.(ejUnmarshaler); ok { + jl := &jlexer.Lexer{Data: trimmedData} + d.UnmarshalEasyJSON(jl) + return jl.Error() + } + if d, ok := value.(json.Unmarshaler); ok { + return d.UnmarshalJSON(trimmedData) + } + return json.Unmarshal(trimmedData, value) +} + +// DynamicJSONToStruct converts an untyped json structure into a struct +func DynamicJSONToStruct(data interface{}, target interface{}) error { + // TODO: convert straight to a json typed map (mergo + iterate?) + b, err := WriteJSON(data) + if err != nil { + return err + } + return ReadJSON(b, target) +} + +// ConcatJSON concatenates multiple json objects efficiently +func ConcatJSON(blobs ...[]byte) []byte { + if len(blobs) == 0 { + return nil + } + + last := len(blobs) - 1 + for blobs[last] == nil || bytes.Equal(blobs[last], nullJSON) { + // strips trailing null objects + last-- + if last < 0 { + // there was nothing but "null"s or nil... + return nil + } + } + if last == 0 { + return blobs[0] + } + + var opening, closing byte + var idx, a int + buf := bytes.NewBuffer(nil) + + for i, b := range blobs[:last+1] { + if b == nil || bytes.Equal(b, nullJSON) { + // a null object is in the list: skip it + continue + } + if len(b) > 0 && opening == 0 { // is this an array or an object? + opening, closing = b[0], closers[b[0]] + } + + if opening != '{' && opening != '[' { + continue // don't know how to concatenate non container objects + } + + if len(b) < 3 { // yep empty but also the last one, so closing this thing + if i == last && a > 0 { + if err := buf.WriteByte(closing); err != nil { + log.Println(err) + } + } + continue + } + + idx = 0 + if a > 0 { // we need to join with a comma for everything beyond the first non-empty item + if err := buf.WriteByte(comma); err != nil { + log.Println(err) + } + idx = 1 // this is not the first or the last so we want to drop the leading bracket + } + + if i != last { // not the last one, strip brackets + if _, err := buf.Write(b[idx : len(b)-1]); err != nil { + log.Println(err) + } + } else { // last one, strip only the leading bracket + if _, err := buf.Write(b[idx:]); err != nil { + log.Println(err) + } + } + a++ + } + // somehow it ended up being empty, so provide a default value + if buf.Len() == 0 { + if err := buf.WriteByte(opening); err != nil { + log.Println(err) + } + if err := buf.WriteByte(closing); err != nil { + log.Println(err) + } + } + return buf.Bytes() +} + +// ToDynamicJSON turns an object into a properly JSON typed structure +func ToDynamicJSON(data interface{}) interface{} { + // TODO: convert straight to a json typed map (mergo + iterate?) + b, err := json.Marshal(data) + if err != nil { + log.Println(err) + } + var res interface{} + if err := json.Unmarshal(b, &res); err != nil { + log.Println(err) + } + return res +} + +// FromDynamicJSON turns an object into a properly JSON typed structure +func FromDynamicJSON(data, target interface{}) error { + b, err := json.Marshal(data) + if err != nil { + log.Println(err) + } + return json.Unmarshal(b, target) +} + +// NameProvider represents an object capable of translating from go property names +// to json property names +// This type is thread-safe. +type NameProvider struct { + lock *sync.Mutex + index map[reflect.Type]nameIndex +} + +type nameIndex struct { + jsonNames map[string]string + goNames map[string]string +} + +// NewNameProvider creates a new name provider +func NewNameProvider() *NameProvider { + return &NameProvider{ + lock: &sync.Mutex{}, + index: make(map[reflect.Type]nameIndex), + } +} + +func buildnameIndex(tpe reflect.Type, idx, reverseIdx map[string]string) { + for i := 0; i < tpe.NumField(); i++ { + targetDes := tpe.Field(i) + + if targetDes.PkgPath != "" { // unexported + continue + } + + if targetDes.Anonymous { // walk embedded structures tree down first + buildnameIndex(targetDes.Type, idx, reverseIdx) + continue + } + + if tag := targetDes.Tag.Get("json"); tag != "" { + + parts := strings.Split(tag, ",") + if len(parts) == 0 { + continue + } + + nm := parts[0] + if nm == "-" { + continue + } + if nm == "" { // empty string means we want to use the Go name + nm = targetDes.Name + } + + idx[nm] = targetDes.Name + reverseIdx[targetDes.Name] = nm + } + } +} + +func newNameIndex(tpe reflect.Type) nameIndex { + var idx = make(map[string]string, tpe.NumField()) + var reverseIdx = make(map[string]string, tpe.NumField()) + + buildnameIndex(tpe, idx, reverseIdx) + return nameIndex{jsonNames: idx, goNames: reverseIdx} +} + +// GetJSONNames gets all the json property names for a type +func (n *NameProvider) GetJSONNames(subject interface{}) []string { + n.lock.Lock() + defer n.lock.Unlock() + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + + res := make([]string, 0, len(names.jsonNames)) + for k := range names.jsonNames { + res = append(res, k) + } + return res +} + +// GetJSONName gets the json name for a go property name +func (n *NameProvider) GetJSONName(subject interface{}, name string) (string, bool) { + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + return n.GetJSONNameForType(tpe, name) +} + +// GetJSONNameForType gets the json name for a go property name on a given type +func (n *NameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) { + n.lock.Lock() + defer n.lock.Unlock() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + nme, ok := names.goNames[name] + return nme, ok +} + +func (n *NameProvider) makeNameIndex(tpe reflect.Type) nameIndex { + names := newNameIndex(tpe) + n.index[tpe] = names + return names +} + +// GetGoName gets the go name for a json property name +func (n *NameProvider) GetGoName(subject interface{}, name string) (string, bool) { + tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() + return n.GetGoNameForType(tpe, name) +} + +// GetGoNameForType gets the go name for a given type for a json property name +func (n *NameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) { + n.lock.Lock() + defer n.lock.Unlock() + names, ok := n.index[tpe] + if !ok { + names = n.makeNameIndex(tpe) + } + nme, ok := names.jsonNames[name] + return nme, ok +} diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go new file mode 100644 index 00000000..00038c37 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -0,0 +1,121 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "fmt" + "io" + "log" + "net/http" + "net/url" + "os" + "path/filepath" + "runtime" + "strings" + "time" +) + +// LoadHTTPTimeout the default timeout for load requests +var LoadHTTPTimeout = 30 * time.Second + +// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth +var LoadHTTPBasicAuthUsername = "" + +// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth +var LoadHTTPBasicAuthPassword = "" + +// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests +var LoadHTTPCustomHeaders = map[string]string{} + +// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in +func LoadFromFileOrHTTP(path string) ([]byte, error) { + return LoadStrategy(path, os.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) +} + +// LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in +// timeout arg allows for per request overriding of the request timeout +func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) { + return LoadStrategy(path, os.ReadFile, loadHTTPBytes(timeout))(path) +} + +// LoadStrategy returns a loader function for a given path or uri +func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) { + if strings.HasPrefix(path, "http") { + return remote + } + return func(pth string) ([]byte, error) { + upth, err := pathUnescape(pth) + if err != nil { + return nil, err + } + + if strings.HasPrefix(pth, `file://`) { + if runtime.GOOS == "windows" { + // support for canonical file URIs on windows. + // Zero tolerance here for dodgy URIs. + u, _ := url.Parse(upth) + if u.Host != "" { + // assume UNC name (volume share) + // file://host/share/folder\... ==> \\host\share\path\folder + // NOTE: UNC port not yet supported + upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`) + } else { + // file:///c:/folder/... ==> just remove the leading slash + upth = strings.TrimPrefix(upth, `file:///`) + } + } else { + upth = strings.TrimPrefix(upth, `file://`) + } + } + + return local(filepath.FromSlash(upth)) + } +} + +func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { + return func(path string) ([]byte, error) { + client := &http.Client{Timeout: timeout} + req, err := http.NewRequest(http.MethodGet, path, nil) //nolint:noctx + if err != nil { + return nil, err + } + + if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" { + req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword) + } + + for key, val := range LoadHTTPCustomHeaders { + req.Header.Set(key, val) + } + + resp, err := client.Do(req) + defer func() { + if resp != nil { + if e := resp.Body.Close(); e != nil { + log.Println(e) + } + } + }() + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("could not access document at %q [%s] ", path, resp.Status) + } + + return io.ReadAll(resp.Body) + } +} diff --git a/vendor/github.com/go-openapi/swag/name_lexem.go b/vendor/github.com/go-openapi/swag/name_lexem.go new file mode 100644 index 00000000..aa7f6a9b --- /dev/null +++ b/vendor/github.com/go-openapi/swag/name_lexem.go @@ -0,0 +1,87 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import "unicode" + +type ( + nameLexem interface { + GetUnsafeGoName() string + GetOriginal() string + IsInitialism() bool + } + + initialismNameLexem struct { + original string + matchedInitialism string + } + + casualNameLexem struct { + original string + } +) + +func newInitialismNameLexem(original, matchedInitialism string) *initialismNameLexem { + return &initialismNameLexem{ + original: original, + matchedInitialism: matchedInitialism, + } +} + +func newCasualNameLexem(original string) *casualNameLexem { + return &casualNameLexem{ + original: original, + } +} + +func (l *initialismNameLexem) GetUnsafeGoName() string { + return l.matchedInitialism +} + +func (l *casualNameLexem) GetUnsafeGoName() string { + var first rune + var rest string + for i, orig := range l.original { + if i == 0 { + first = orig + continue + } + if i > 0 { + rest = l.original[i:] + break + } + } + if len(l.original) > 1 { + return string(unicode.ToUpper(first)) + lower(rest) + } + + return l.original +} + +func (l *initialismNameLexem) GetOriginal() string { + return l.original +} + +func (l *casualNameLexem) GetOriginal() string { + return l.original +} + +func (l *initialismNameLexem) IsInitialism() bool { + return true +} + +func (l *casualNameLexem) IsInitialism() bool { + return false +} diff --git a/vendor/github.com/go-openapi/swag/net.go b/vendor/github.com/go-openapi/swag/net.go new file mode 100644 index 00000000..821235f8 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/net.go @@ -0,0 +1,38 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "net" + "strconv" +) + +// SplitHostPort splits a network address into a host and a port. +// The port is -1 when there is no port to be found +func SplitHostPort(addr string) (host string, port int, err error) { + h, p, err := net.SplitHostPort(addr) + if err != nil { + return "", -1, err + } + if p == "" { + return "", -1, &net.AddrError{Err: "missing port in address", Addr: addr} + } + + pi, err := strconv.Atoi(p) + if err != nil { + return "", -1, err + } + return h, pi, nil +} diff --git a/vendor/github.com/go-openapi/swag/path.go b/vendor/github.com/go-openapi/swag/path.go new file mode 100644 index 00000000..941bd017 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/path.go @@ -0,0 +1,59 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "os" + "path/filepath" + "runtime" + "strings" +) + +const ( + // GOPATHKey represents the env key for gopath + GOPATHKey = "GOPATH" +) + +// FindInSearchPath finds a package in a provided lists of paths +func FindInSearchPath(searchPath, pkg string) string { + pathsList := filepath.SplitList(searchPath) + for _, path := range pathsList { + if evaluatedPath, err := filepath.EvalSymlinks(filepath.Join(path, "src", pkg)); err == nil { + if _, err := os.Stat(evaluatedPath); err == nil { + return evaluatedPath + } + } + } + return "" +} + +// FindInGoSearchPath finds a package in the $GOPATH:$GOROOT +func FindInGoSearchPath(pkg string) string { + return FindInSearchPath(FullGoSearchPath(), pkg) +} + +// FullGoSearchPath gets the search paths for finding packages +func FullGoSearchPath() string { + allPaths := os.Getenv(GOPATHKey) + if allPaths == "" { + allPaths = filepath.Join(os.Getenv("HOME"), "go") + } + if allPaths != "" { + allPaths = strings.Join([]string{allPaths, runtime.GOROOT()}, ":") + } else { + allPaths = runtime.GOROOT() + } + return allPaths +} diff --git a/vendor/github.com/go-openapi/swag/post_go18.go b/vendor/github.com/go-openapi/swag/post_go18.go new file mode 100644 index 00000000..f5228b82 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/post_go18.go @@ -0,0 +1,24 @@ +// Copyright 2015 go-swagger maintainers +// +// 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. + +//go:build go1.8 +// +build go1.8 + +package swag + +import "net/url" + +func pathUnescape(path string) (string, error) { + return url.PathUnescape(path) +} diff --git a/vendor/github.com/go-openapi/swag/post_go19.go b/vendor/github.com/go-openapi/swag/post_go19.go new file mode 100644 index 00000000..7c7da9c0 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/post_go19.go @@ -0,0 +1,68 @@ +// Copyright 2015 go-swagger maintainers +// +// 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. + +//go:build go1.9 +// +build go1.9 + +package swag + +import ( + "sort" + "sync" +) + +// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. +// Since go1.9, this may be implemented with sync.Map. +type indexOfInitialisms struct { + sortMutex *sync.Mutex + index *sync.Map +} + +func newIndexOfInitialisms() *indexOfInitialisms { + return &indexOfInitialisms{ + sortMutex: new(sync.Mutex), + index: new(sync.Map), + } +} + +func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { + m.sortMutex.Lock() + defer m.sortMutex.Unlock() + for k, v := range initial { + m.index.Store(k, v) + } + return m +} + +func (m *indexOfInitialisms) isInitialism(key string) bool { + _, ok := m.index.Load(key) + return ok +} + +func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { + m.index.Store(key, true) + return m +} + +func (m *indexOfInitialisms) sorted() (result []string) { + m.sortMutex.Lock() + defer m.sortMutex.Unlock() + m.index.Range(func(key, value interface{}) bool { + k := key.(string) + result = append(result, k) + return true + }) + sort.Sort(sort.Reverse(byInitialism(result))) + return +} diff --git a/vendor/github.com/go-openapi/swag/pre_go18.go b/vendor/github.com/go-openapi/swag/pre_go18.go new file mode 100644 index 00000000..2757d9b9 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/pre_go18.go @@ -0,0 +1,24 @@ +// Copyright 2015 go-swagger maintainers +// +// 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. + +//go:build !go1.8 +// +build !go1.8 + +package swag + +import "net/url" + +func pathUnescape(path string) (string, error) { + return url.QueryUnescape(path) +} diff --git a/vendor/github.com/go-openapi/swag/pre_go19.go b/vendor/github.com/go-openapi/swag/pre_go19.go new file mode 100644 index 00000000..0565db37 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/pre_go19.go @@ -0,0 +1,70 @@ +// Copyright 2015 go-swagger maintainers +// +// 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. + +//go:build !go1.9 +// +build !go1.9 + +package swag + +import ( + "sort" + "sync" +) + +// indexOfInitialisms is a thread-safe implementation of the sorted index of initialisms. +// Before go1.9, this may be implemented with a mutex on the map. +type indexOfInitialisms struct { + getMutex *sync.Mutex + index map[string]bool +} + +func newIndexOfInitialisms() *indexOfInitialisms { + return &indexOfInitialisms{ + getMutex: new(sync.Mutex), + index: make(map[string]bool, 50), + } +} + +func (m *indexOfInitialisms) load(initial map[string]bool) *indexOfInitialisms { + m.getMutex.Lock() + defer m.getMutex.Unlock() + for k, v := range initial { + m.index[k] = v + } + return m +} + +func (m *indexOfInitialisms) isInitialism(key string) bool { + m.getMutex.Lock() + defer m.getMutex.Unlock() + _, ok := m.index[key] + return ok +} + +func (m *indexOfInitialisms) add(key string) *indexOfInitialisms { + m.getMutex.Lock() + defer m.getMutex.Unlock() + m.index[key] = true + return m +} + +func (m *indexOfInitialisms) sorted() (result []string) { + m.getMutex.Lock() + defer m.getMutex.Unlock() + for k := range m.index { + result = append(result, k) + } + sort.Sort(sort.Reverse(byInitialism(result))) + return +} diff --git a/vendor/github.com/go-openapi/swag/split.go b/vendor/github.com/go-openapi/swag/split.go new file mode 100644 index 00000000..a1825fb7 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/split.go @@ -0,0 +1,262 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "unicode" +) + +var nameReplaceTable = map[rune]string{ + '@': "At ", + '&': "And ", + '|': "Pipe ", + '$': "Dollar ", + '!': "Bang ", + '-': "", + '_': "", +} + +type ( + splitter struct { + postSplitInitialismCheck bool + initialisms []string + } + + splitterOption func(*splitter) *splitter +) + +// split calls the splitter; splitter provides more control and post options +func split(str string) []string { + lexems := newSplitter().split(str) + result := make([]string, 0, len(lexems)) + + for _, lexem := range lexems { + result = append(result, lexem.GetOriginal()) + } + + return result + +} + +func (s *splitter) split(str string) []nameLexem { + return s.toNameLexems(str) +} + +func newSplitter(options ...splitterOption) *splitter { + splitter := &splitter{ + postSplitInitialismCheck: false, + initialisms: initialisms, + } + + for _, option := range options { + splitter = option(splitter) + } + + return splitter +} + +// withPostSplitInitialismCheck allows to catch initialisms after main split process +func withPostSplitInitialismCheck(s *splitter) *splitter { + s.postSplitInitialismCheck = true + return s +} + +type ( + initialismMatch struct { + start, end int + body []rune + complete bool + } + initialismMatches []*initialismMatch +) + +func (s *splitter) toNameLexems(name string) []nameLexem { + nameRunes := []rune(name) + matches := s.gatherInitialismMatches(nameRunes) + return s.mapMatchesToNameLexems(nameRunes, matches) +} + +func (s *splitter) gatherInitialismMatches(nameRunes []rune) initialismMatches { + matches := make(initialismMatches, 0) + + for currentRunePosition, currentRune := range nameRunes { + newMatches := make(initialismMatches, 0, len(matches)) + + // check current initialism matches + for _, match := range matches { + if keepCompleteMatch := match.complete; keepCompleteMatch { + newMatches = append(newMatches, match) + continue + } + + // drop failed match + currentMatchRune := match.body[currentRunePosition-match.start] + if !s.initialismRuneEqual(currentMatchRune, currentRune) { + continue + } + + // try to complete ongoing match + if currentRunePosition-match.start == len(match.body)-1 { + // we are close; the next step is to check the symbol ahead + // if it is a small letter, then it is not the end of match + // but beginning of the next word + + if currentRunePosition < len(nameRunes)-1 { + nextRune := nameRunes[currentRunePosition+1] + if newWord := unicode.IsLower(nextRune); newWord { + // oh ok, it was the start of a new word + continue + } + } + + match.complete = true + match.end = currentRunePosition + } + + newMatches = append(newMatches, match) + } + + // check for new initialism matches + for _, initialism := range s.initialisms { + initialismRunes := []rune(initialism) + if s.initialismRuneEqual(initialismRunes[0], currentRune) { + newMatches = append(newMatches, &initialismMatch{ + start: currentRunePosition, + body: initialismRunes, + complete: false, + }) + } + } + + matches = newMatches + } + + return matches +} + +func (s *splitter) mapMatchesToNameLexems(nameRunes []rune, matches initialismMatches) []nameLexem { + nameLexems := make([]nameLexem, 0) + + var lastAcceptedMatch *initialismMatch + for _, match := range matches { + if !match.complete { + continue + } + + if firstMatch := lastAcceptedMatch == nil; firstMatch { + nameLexems = append(nameLexems, s.breakCasualString(nameRunes[:match.start])...) + nameLexems = append(nameLexems, s.breakInitialism(string(match.body))) + + lastAcceptedMatch = match + + continue + } + + if overlappedMatch := match.start <= lastAcceptedMatch.end; overlappedMatch { + continue + } + + middle := nameRunes[lastAcceptedMatch.end+1 : match.start] + nameLexems = append(nameLexems, s.breakCasualString(middle)...) + nameLexems = append(nameLexems, s.breakInitialism(string(match.body))) + + lastAcceptedMatch = match + } + + // we have not found any accepted matches + if lastAcceptedMatch == nil { + return s.breakCasualString(nameRunes) + } + + if lastAcceptedMatch.end+1 != len(nameRunes) { + rest := nameRunes[lastAcceptedMatch.end+1:] + nameLexems = append(nameLexems, s.breakCasualString(rest)...) + } + + return nameLexems +} + +func (s *splitter) initialismRuneEqual(a, b rune) bool { + return a == b +} + +func (s *splitter) breakInitialism(original string) nameLexem { + return newInitialismNameLexem(original, original) +} + +func (s *splitter) breakCasualString(str []rune) []nameLexem { + segments := make([]nameLexem, 0) + currentSegment := "" + + addCasualNameLexem := func(original string) { + segments = append(segments, newCasualNameLexem(original)) + } + + addInitialismNameLexem := func(original, match string) { + segments = append(segments, newInitialismNameLexem(original, match)) + } + + addNameLexem := func(original string) { + if s.postSplitInitialismCheck { + for _, initialism := range s.initialisms { + if upper(initialism) == upper(original) { + addInitialismNameLexem(original, initialism) + return + } + } + } + + addCasualNameLexem(original) + } + + for _, rn := range string(str) { + if replace, found := nameReplaceTable[rn]; found { + if currentSegment != "" { + addNameLexem(currentSegment) + currentSegment = "" + } + + if replace != "" { + addNameLexem(replace) + } + + continue + } + + if !unicode.In(rn, unicode.L, unicode.M, unicode.N, unicode.Pc) { + if currentSegment != "" { + addNameLexem(currentSegment) + currentSegment = "" + } + + continue + } + + if unicode.IsUpper(rn) { + if currentSegment != "" { + addNameLexem(currentSegment) + } + currentSegment = "" + } + + currentSegment += string(rn) + } + + if currentSegment != "" { + addNameLexem(currentSegment) + } + + return segments +} diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go new file mode 100644 index 00000000..f78ab684 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/util.go @@ -0,0 +1,386 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "reflect" + "strings" + "unicode" +) + +// commonInitialisms are common acronyms that are kept as whole uppercased words. +var commonInitialisms *indexOfInitialisms + +// initialisms is a slice of sorted initialisms +var initialisms []string + +var isInitialism func(string) bool + +// GoNamePrefixFunc sets an optional rule to prefix go names +// which do not start with a letter. +// +// e.g. to help convert "123" into "{prefix}123" +// +// The default is to prefix with "X" +var GoNamePrefixFunc func(string) string + +func init() { + // Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769 + var configuredInitialisms = map[string]bool{ + "ACL": true, + "API": true, + "ASCII": true, + "CPU": true, + "CSS": true, + "DNS": true, + "EOF": true, + "GUID": true, + "HTML": true, + "HTTPS": true, + "HTTP": true, + "ID": true, + "IP": true, + "IPv4": true, + "IPv6": true, + "JSON": true, + "LHS": true, + "OAI": true, + "QPS": true, + "RAM": true, + "RHS": true, + "RPC": true, + "SLA": true, + "SMTP": true, + "SQL": true, + "SSH": true, + "TCP": true, + "TLS": true, + "TTL": true, + "UDP": true, + "UI": true, + "UID": true, + "UUID": true, + "URI": true, + "URL": true, + "UTF8": true, + "VM": true, + "XML": true, + "XMPP": true, + "XSRF": true, + "XSS": true, + } + + // a thread-safe index of initialisms + commonInitialisms = newIndexOfInitialisms().load(configuredInitialisms) + initialisms = commonInitialisms.sorted() + + // a test function + isInitialism = commonInitialisms.isInitialism +} + +const ( + // collectionFormatComma = "csv" + collectionFormatSpace = "ssv" + collectionFormatTab = "tsv" + collectionFormatPipe = "pipes" + collectionFormatMulti = "multi" +) + +// JoinByFormat joins a string array by a known format (e.g. swagger's collectionFormat attribute): +// +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) +func JoinByFormat(data []string, format string) []string { + if len(data) == 0 { + return data + } + var sep string + switch format { + case collectionFormatSpace: + sep = " " + case collectionFormatTab: + sep = "\t" + case collectionFormatPipe: + sep = "|" + case collectionFormatMulti: + return data + default: + sep = "," + } + return []string{strings.Join(data, sep)} +} + +// SplitByFormat splits a string by a known format: +// +// ssv: space separated value +// tsv: tab separated value +// pipes: pipe (|) separated value +// csv: comma separated value (default) +func SplitByFormat(data, format string) []string { + if data == "" { + return nil + } + var sep string + switch format { + case collectionFormatSpace: + sep = " " + case collectionFormatTab: + sep = "\t" + case collectionFormatPipe: + sep = "|" + case collectionFormatMulti: + return nil + default: + sep = "," + } + var result []string + for _, s := range strings.Split(data, sep) { + if ts := strings.TrimSpace(s); ts != "" { + result = append(result, ts) + } + } + return result +} + +type byInitialism []string + +func (s byInitialism) Len() int { + return len(s) +} +func (s byInitialism) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} +func (s byInitialism) Less(i, j int) bool { + if len(s[i]) != len(s[j]) { + return len(s[i]) < len(s[j]) + } + + return strings.Compare(s[i], s[j]) > 0 +} + +// Removes leading whitespaces +func trim(str string) string { + return strings.Trim(str, " ") +} + +// Shortcut to strings.ToUpper() +func upper(str string) string { + return strings.ToUpper(trim(str)) +} + +// Shortcut to strings.ToLower() +func lower(str string) string { + return strings.ToLower(trim(str)) +} + +// Camelize an uppercased word +func Camelize(word string) (camelized string) { + for pos, ru := range []rune(word) { + if pos > 0 { + camelized += string(unicode.ToLower(ru)) + } else { + camelized += string(unicode.ToUpper(ru)) + } + } + return +} + +// ToFileName lowercases and underscores a go type name +func ToFileName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + out = append(out, lower(w)) + } + + return strings.Join(out, "_") +} + +// ToCommandName lowercases and underscores a go type name +func ToCommandName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + out = append(out, lower(w)) + } + return strings.Join(out, "-") +} + +// ToHumanNameLower represents a code name as a human series of words +func ToHumanNameLower(name string) string { + in := newSplitter(withPostSplitInitialismCheck).split(name) + out := make([]string, 0, len(in)) + + for _, w := range in { + if !w.IsInitialism() { + out = append(out, lower(w.GetOriginal())) + } else { + out = append(out, w.GetOriginal()) + } + } + + return strings.Join(out, " ") +} + +// ToHumanNameTitle represents a code name as a human series of words with the first letters titleized +func ToHumanNameTitle(name string) string { + in := newSplitter(withPostSplitInitialismCheck).split(name) + + out := make([]string, 0, len(in)) + for _, w := range in { + original := w.GetOriginal() + if !w.IsInitialism() { + out = append(out, Camelize(original)) + } else { + out = append(out, original) + } + } + return strings.Join(out, " ") +} + +// ToJSONName camelcases a name which can be underscored or pascal cased +func ToJSONName(name string) string { + in := split(name) + out := make([]string, 0, len(in)) + + for i, w := range in { + if i == 0 { + out = append(out, lower(w)) + continue + } + out = append(out, Camelize(w)) + } + return strings.Join(out, "") +} + +// ToVarName camelcases a name which can be underscored or pascal cased +func ToVarName(name string) string { + res := ToGoName(name) + if isInitialism(res) { + return lower(res) + } + if len(res) <= 1 { + return lower(res) + } + return lower(res[:1]) + res[1:] +} + +// ToGoName translates a swagger name which can be underscored or camel cased to a name that golint likes +func ToGoName(name string) string { + lexems := newSplitter(withPostSplitInitialismCheck).split(name) + + result := "" + for _, lexem := range lexems { + goName := lexem.GetUnsafeGoName() + + // to support old behavior + if lexem.IsInitialism() { + goName = upper(goName) + } + result += goName + } + + if len(result) > 0 { + // Only prefix with X when the first character isn't an ascii letter + first := []rune(result)[0] + if !unicode.IsLetter(first) || (first > unicode.MaxASCII && !unicode.IsUpper(first)) { + if GoNamePrefixFunc == nil { + return "X" + result + } + result = GoNamePrefixFunc(name) + result + } + first = []rune(result)[0] + if unicode.IsLetter(first) && !unicode.IsUpper(first) { + result = string(append([]rune{unicode.ToUpper(first)}, []rune(result)[1:]...)) + } + } + + return result +} + +// ContainsStrings searches a slice of strings for a case-sensitive match +func ContainsStrings(coll []string, item string) bool { + for _, a := range coll { + if a == item { + return true + } + } + return false +} + +// ContainsStringsCI searches a slice of strings for a case-insensitive match +func ContainsStringsCI(coll []string, item string) bool { + for _, a := range coll { + if strings.EqualFold(a, item) { + return true + } + } + return false +} + +type zeroable interface { + IsZero() bool +} + +// IsZero returns true when the value passed into the function is a zero value. +// This allows for safer checking of interface values. +func IsZero(data interface{}) bool { + // check for things that have an IsZero method instead + if vv, ok := data.(zeroable); ok { + return vv.IsZero() + } + // continue with slightly more complex reflection + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + case reflect.Struct, reflect.Array: + return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface()) + case reflect.Invalid: + return true + } + return false +} + +// AddInitialisms add additional initialisms +func AddInitialisms(words ...string) { + for _, word := range words { + // commonInitialisms[upper(word)] = true + commonInitialisms.add(upper(word)) + } + // sort again + initialisms = commonInitialisms.sorted() +} + +// CommandLineOptionsGroup represents a group of user-defined command line options +type CommandLineOptionsGroup struct { + ShortDescription string + LongDescription string + Options interface{} +} diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go new file mode 100644 index 00000000..f09ee609 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/yaml.go @@ -0,0 +1,450 @@ +// Copyright 2015 go-swagger maintainers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package swag + +import ( + "encoding/json" + "fmt" + "path/filepath" + "strconv" + + "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" + yaml "gopkg.in/yaml.v3" +) + +// YAMLMatcher matches yaml +func YAMLMatcher(path string) bool { + ext := filepath.Ext(path) + return ext == ".yaml" || ext == ".yml" +} + +// YAMLToJSON converts YAML unmarshaled data into json compatible data +func YAMLToJSON(data interface{}) (json.RawMessage, error) { + jm, err := transformData(data) + if err != nil { + return nil, err + } + b, err := WriteJSON(jm) + return json.RawMessage(b), err +} + +// BytesToYAMLDoc converts a byte slice into a YAML document +func BytesToYAMLDoc(data []byte) (interface{}, error) { + var document yaml.Node // preserve order that is present in the document + if err := yaml.Unmarshal(data, &document); err != nil { + return nil, err + } + if document.Kind != yaml.DocumentNode || len(document.Content) != 1 || document.Content[0].Kind != yaml.MappingNode { + return nil, fmt.Errorf("only YAML documents that are objects are supported") + } + return &document, nil +} + +func yamlNode(root *yaml.Node) (interface{}, error) { + switch root.Kind { + case yaml.DocumentNode: + return yamlDocument(root) + case yaml.SequenceNode: + return yamlSequence(root) + case yaml.MappingNode: + return yamlMapping(root) + case yaml.ScalarNode: + return yamlScalar(root) + case yaml.AliasNode: + return yamlNode(root.Alias) + default: + return nil, fmt.Errorf("unsupported YAML node type: %v", root.Kind) + } +} + +func yamlDocument(node *yaml.Node) (interface{}, error) { + if len(node.Content) != 1 { + return nil, fmt.Errorf("unexpected YAML Document node content length: %d", len(node.Content)) + } + return yamlNode(node.Content[0]) +} + +func yamlMapping(node *yaml.Node) (interface{}, error) { + m := make(JSONMapSlice, len(node.Content)/2) + + var j int + for i := 0; i < len(node.Content); i += 2 { + var nmi JSONMapItem + k, err := yamlStringScalarC(node.Content[i]) + if err != nil { + return nil, fmt.Errorf("unable to decode YAML map key: %w", err) + } + nmi.Key = k + v, err := yamlNode(node.Content[i+1]) + if err != nil { + return nil, fmt.Errorf("unable to process YAML map value for key %q: %w", k, err) + } + nmi.Value = v + m[j] = nmi + j++ + } + return m, nil +} + +func yamlSequence(node *yaml.Node) (interface{}, error) { + s := make([]interface{}, 0) + + for i := 0; i < len(node.Content); i++ { + + v, err := yamlNode(node.Content[i]) + if err != nil { + return nil, fmt.Errorf("unable to decode YAML sequence value: %w", err) + } + s = append(s, v) + } + return s, nil +} + +const ( // See https://yaml.org/type/ + yamlStringScalar = "tag:yaml.org,2002:str" + yamlIntScalar = "tag:yaml.org,2002:int" + yamlBoolScalar = "tag:yaml.org,2002:bool" + yamlFloatScalar = "tag:yaml.org,2002:float" + yamlTimestamp = "tag:yaml.org,2002:timestamp" + yamlNull = "tag:yaml.org,2002:null" +) + +func yamlScalar(node *yaml.Node) (interface{}, error) { + switch node.LongTag() { + case yamlStringScalar: + return node.Value, nil + case yamlBoolScalar: + b, err := strconv.ParseBool(node.Value) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting bool content: %w", node.Value, err) + } + return b, nil + case yamlIntScalar: + i, err := strconv.ParseInt(node.Value, 10, 64) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting integer content: %w", node.Value, err) + } + return i, nil + case yamlFloatScalar: + f, err := strconv.ParseFloat(node.Value, 64) + if err != nil { + return nil, fmt.Errorf("unable to process scalar node. Got %q. Expecting float content: %w", node.Value, err) + } + return f, nil + case yamlTimestamp: + return node.Value, nil + case yamlNull: + return nil, nil + default: + return nil, fmt.Errorf("YAML tag %q is not supported", node.LongTag()) + } +} + +func yamlStringScalarC(node *yaml.Node) (string, error) { + if node.Kind != yaml.ScalarNode { + return "", fmt.Errorf("expecting a string scalar but got %q", node.Kind) + } + switch node.LongTag() { + case yamlStringScalar, yamlIntScalar, yamlFloatScalar: + return node.Value, nil + default: + return "", fmt.Errorf("YAML tag %q is not supported as map key", node.LongTag()) + } +} + +// JSONMapSlice represent a JSON object, with the order of keys maintained +type JSONMapSlice []JSONMapItem + +// MarshalJSON renders a JSONMapSlice as JSON +func (s JSONMapSlice) MarshalJSON() ([]byte, error) { + w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} + s.MarshalEasyJSON(w) + return w.BuildBytes() +} + +// MarshalEasyJSON renders a JSONMapSlice as JSON, using easyJSON +func (s JSONMapSlice) MarshalEasyJSON(w *jwriter.Writer) { + w.RawByte('{') + + ln := len(s) + last := ln - 1 + for i := 0; i < ln; i++ { + s[i].MarshalEasyJSON(w) + if i != last { // last item + w.RawByte(',') + } + } + + w.RawByte('}') +} + +// UnmarshalJSON makes a JSONMapSlice from JSON +func (s *JSONMapSlice) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + s.UnmarshalEasyJSON(&l) + return l.Error() +} + +// UnmarshalEasyJSON makes a JSONMapSlice from JSON, using easyJSON +func (s *JSONMapSlice) UnmarshalEasyJSON(in *jlexer.Lexer) { + if in.IsNull() { + in.Skip() + return + } + + var result JSONMapSlice + in.Delim('{') + for !in.IsDelim('}') { + var mi JSONMapItem + mi.UnmarshalEasyJSON(in) + result = append(result, mi) + } + *s = result +} + +func (s JSONMapSlice) MarshalYAML() (interface{}, error) { + var n yaml.Node + n.Kind = yaml.DocumentNode + var nodes []*yaml.Node + for _, item := range s { + nn, err := json2yaml(item.Value) + if err != nil { + return nil, err + } + ns := []*yaml.Node{ + { + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: item.Key, + }, + nn, + } + nodes = append(nodes, ns...) + } + + n.Content = []*yaml.Node{ + { + Kind: yaml.MappingNode, + Content: nodes, + }, + } + + return yaml.Marshal(&n) +} + +func json2yaml(item interface{}) (*yaml.Node, error) { + switch val := item.(type) { + case JSONMapSlice: + var n yaml.Node + n.Kind = yaml.MappingNode + for i := range val { + childNode, err := json2yaml(&val[i].Value) + if err != nil { + return nil, err + } + n.Content = append(n.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: val[i].Key, + }, childNode) + } + return &n, nil + case map[string]interface{}: + var n yaml.Node + n.Kind = yaml.MappingNode + for k, v := range val { + childNode, err := json2yaml(v) + if err != nil { + return nil, err + } + n.Content = append(n.Content, &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: k, + }, childNode) + } + return &n, nil + case []interface{}: + var n yaml.Node + n.Kind = yaml.SequenceNode + for i := range val { + childNode, err := json2yaml(val[i]) + if err != nil { + return nil, err + } + n.Content = append(n.Content, childNode) + } + return &n, nil + case string: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlStringScalar, + Value: val, + }, nil + case float64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlFloatScalar, + Value: strconv.FormatFloat(val, 'f', -1, 64), + }, nil + case int64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlIntScalar, + Value: strconv.FormatInt(val, 10), + }, nil + case uint64: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlIntScalar, + Value: strconv.FormatUint(val, 10), + }, nil + case bool: + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: yamlBoolScalar, + Value: strconv.FormatBool(val), + }, nil + } + return nil, nil +} + +// JSONMapItem represents the value of a key in a JSON object held by JSONMapSlice +type JSONMapItem struct { + Key string + Value interface{} +} + +// MarshalJSON renders a JSONMapItem as JSON +func (s JSONMapItem) MarshalJSON() ([]byte, error) { + w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} + s.MarshalEasyJSON(w) + return w.BuildBytes() +} + +// MarshalEasyJSON renders a JSONMapItem as JSON, using easyJSON +func (s JSONMapItem) MarshalEasyJSON(w *jwriter.Writer) { + w.String(s.Key) + w.RawByte(':') + w.Raw(WriteJSON(s.Value)) +} + +// UnmarshalJSON makes a JSONMapItem from JSON +func (s *JSONMapItem) UnmarshalJSON(data []byte) error { + l := jlexer.Lexer{Data: data} + s.UnmarshalEasyJSON(&l) + return l.Error() +} + +// UnmarshalEasyJSON makes a JSONMapItem from JSON, using easyJSON +func (s *JSONMapItem) UnmarshalEasyJSON(in *jlexer.Lexer) { + key := in.UnsafeString() + in.WantColon() + value := in.Interface() + in.WantComma() + s.Key = key + s.Value = value +} + +func transformData(input interface{}) (out interface{}, err error) { + format := func(t interface{}) (string, error) { + switch k := t.(type) { + case string: + return k, nil + case uint: + return strconv.FormatUint(uint64(k), 10), nil + case uint8: + return strconv.FormatUint(uint64(k), 10), nil + case uint16: + return strconv.FormatUint(uint64(k), 10), nil + case uint32: + return strconv.FormatUint(uint64(k), 10), nil + case uint64: + return strconv.FormatUint(k, 10), nil + case int: + return strconv.Itoa(k), nil + case int8: + return strconv.FormatInt(int64(k), 10), nil + case int16: + return strconv.FormatInt(int64(k), 10), nil + case int32: + return strconv.FormatInt(int64(k), 10), nil + case int64: + return strconv.FormatInt(k, 10), nil + default: + return "", fmt.Errorf("unexpected map key type, got: %T", k) + } + } + + switch in := input.(type) { + case yaml.Node: + return yamlNode(&in) + case *yaml.Node: + return yamlNode(in) + case map[interface{}]interface{}: + o := make(JSONMapSlice, 0, len(in)) + for ke, va := range in { + var nmi JSONMapItem + if nmi.Key, err = format(ke); err != nil { + return nil, err + } + + v, ert := transformData(va) + if ert != nil { + return nil, ert + } + nmi.Value = v + o = append(o, nmi) + } + return o, nil + case []interface{}: + len1 := len(in) + o := make([]interface{}, len1) + for i := 0; i < len1; i++ { + o[i], err = transformData(in[i]) + if err != nil { + return nil, err + } + } + return o, nil + } + return input, nil +} + +// YAMLDoc loads a yaml document from either http or a file and converts it to json +func YAMLDoc(path string) (json.RawMessage, error) { + yamlDoc, err := YAMLData(path) + if err != nil { + return nil, err + } + + data, err := YAMLToJSON(yamlDoc) + if err != nil { + return nil, err + } + + return data, nil +} + +// YAMLData loads a yaml document from either http or a file +func YAMLData(path string) (interface{}, error) { + data, err := LoadFromFileOrHTTP(path) + if err != nil { + return nil, err + } + + return BytesToYAMLDoc(data) +} diff --git a/vendor/github.com/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go index b18cc2d6..13c9f44b 100644 --- a/vendor/github.com/golang/mock/gomock/call.go +++ b/vendor/github.com/golang/mock/gomock/call.go @@ -50,16 +50,16 @@ func newCall(t TestHelper, receiver interface{}, method string, methodType refle t.Helper() // TODO: check arity, types. - margs := make([]Matcher, len(args)) + mArgs := make([]Matcher, len(args)) for i, arg := range args { if m, ok := arg.(Matcher); ok { - margs[i] = m + mArgs[i] = m } else if arg == nil { // Handle nil specially so that passing a nil interface value // will match the typed nils of concrete args. - margs[i] = Nil() + mArgs[i] = Nil() } else { - margs[i] = Eq(arg) + mArgs[i] = Eq(arg) } } @@ -76,7 +76,7 @@ func newCall(t TestHelper, receiver interface{}, method string, methodType refle return rets }} return &Call{t: t, receiver: receiver, method: method, methodType: methodType, - args: margs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} + args: mArgs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions} } // AnyTimes allows the expectation to be called 0 or more times @@ -113,19 +113,25 @@ func (c *Call) DoAndReturn(f interface{}) *Call { v := reflect.ValueOf(f) c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) + c.t.Helper() + vArgs := make([]reflect.Value, len(args)) ft := v.Type() + if c.methodType.NumIn() != ft.NumIn() { + c.t.Fatalf("wrong number of arguments in DoAndReturn func for %T.%v: got %d, want %d [%s]", + c.receiver, c.method, ft.NumIn(), c.methodType.NumIn(), c.origin) + return nil + } for i := 0; i < len(args); i++ { if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) + vArgs[i] = reflect.ValueOf(args[i]) } else { // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) + vArgs[i] = reflect.Zero(ft.In(i)) } } - vrets := v.Call(vargs) - rets := make([]interface{}, len(vrets)) - for i, ret := range vrets { + vRets := v.Call(vArgs) + rets := make([]interface{}, len(vRets)) + for i, ret := range vRets { rets[i] = ret.Interface() } return rets @@ -142,17 +148,23 @@ func (c *Call) Do(f interface{}) *Call { v := reflect.ValueOf(f) c.addAction(func(args []interface{}) []interface{} { - vargs := make([]reflect.Value, len(args)) + c.t.Helper() + if c.methodType.NumIn() != v.Type().NumIn() { + c.t.Fatalf("wrong number of arguments in Do func for %T.%v: got %d, want %d [%s]", + c.receiver, c.method, v.Type().NumIn(), c.methodType.NumIn(), c.origin) + return nil + } + vArgs := make([]reflect.Value, len(args)) ft := v.Type() for i := 0; i < len(args); i++ { if args[i] != nil { - vargs[i] = reflect.ValueOf(args[i]) + vArgs[i] = reflect.ValueOf(args[i]) } else { // Use the zero value for the arg. - vargs[i] = reflect.Zero(ft.In(i)) + vArgs[i] = reflect.Zero(ft.In(i)) } } - v.Call(vargs) + v.Call(vArgs) return nil }) return c @@ -353,12 +365,12 @@ func (c *Call) matches(args []interface{}) error { // matches all the remaining arguments or the lack of any. // Convert the remaining arguments, if any, into a slice of the // expected type. - vargsType := c.methodType.In(c.methodType.NumIn() - 1) - vargs := reflect.MakeSlice(vargsType, 0, len(args)-i) + vArgsType := c.methodType.In(c.methodType.NumIn() - 1) + vArgs := reflect.MakeSlice(vArgsType, 0, len(args)-i) for _, arg := range args[i:] { - vargs = reflect.Append(vargs, reflect.ValueOf(arg)) + vArgs = reflect.Append(vArgs, reflect.ValueOf(arg)) } - if m.Matches(vargs.Interface()) { + if m.Matches(vArgs.Interface()) { // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, gomock.Any()) // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, someSliceMatcher) // Got Foo(a, b) want Foo(matcherA, matcherB, gomock.Any()) @@ -380,7 +392,7 @@ func (c *Call) matches(args []interface{}) error { // Check that all prerequisite calls have been satisfied. for _, preReqCall := range c.preReqs { if !preReqCall.satisfied() { - return fmt.Errorf("Expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", + return fmt.Errorf("expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v", c.origin, preReqCall, c) } } @@ -425,7 +437,7 @@ func (c *Call) addAction(action func([]interface{}) []interface{}) { } func formatGottenArg(m Matcher, arg interface{}) string { - got := fmt.Sprintf("%v", arg) + got := fmt.Sprintf("%v (%T)", arg, arg) if gs, ok := m.(GotFormatter); ok { got = gs.Got(arg) } diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go index e4e85d60..49dba787 100644 --- a/vendor/github.com/golang/mock/gomock/callset.go +++ b/vendor/github.com/golang/mock/gomock/callset.go @@ -16,6 +16,7 @@ package gomock import ( "bytes" + "errors" "fmt" ) @@ -95,7 +96,7 @@ func (cs callSet) FindMatch(receiver interface{}, method string, args []interfac _, _ = fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method) } - return nil, fmt.Errorf(callsErrors.String()) + return nil, errors.New(callsErrors.String()) } // Failures returns the calls that are not satisfied. diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go index 3b656909..f054200d 100644 --- a/vendor/github.com/golang/mock/gomock/controller.go +++ b/vendor/github.com/golang/mock/gomock/controller.go @@ -123,7 +123,7 @@ type Controller struct { // Controller. // // New in go1.14+, if you are passing a *testing.T into this function you no -// longer need to call ctrl.Finish() in your test methods +// longer need to call ctrl.Finish() in your test methods. func NewController(t TestReporter) *Controller { h, ok := t.(TestHelper) if !ok { @@ -259,6 +259,9 @@ func (ctrl *Controller) Call(receiver interface{}, method string, args ...interf // Finish checks to see if all the methods that were expected to be called // were called. It should be invoked for each Controller. It is not idempotent // and therefore can only be invoked once. +// +// New in go1.14+, if you are passing a *testing.T into NewController function you no +// longer need to call ctrl.Finish() in your test methods. func (ctrl *Controller) Finish() { // If we're currently panicking, probably because this is a deferred call. // This must be recovered in the deferred function. diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go index 770aba5a..2822fb2c 100644 --- a/vendor/github.com/golang/mock/gomock/matchers.go +++ b/vendor/github.com/golang/mock/gomock/matchers.go @@ -120,7 +120,7 @@ func (e eqMatcher) Matches(x interface{}) bool { } func (e eqMatcher) String() string { - return fmt.Sprintf("is equal to %v", e.x) + return fmt.Sprintf("is equal to %v (%T)", e.x, e.x) } type nilMatcher struct{} @@ -153,7 +153,6 @@ func (n notMatcher) Matches(x interface{}) bool { } func (n notMatcher) String() string { - // TODO: Improve this if we add a NotString method to the Matcher interface. return "not(" + n.m.String() + ")" } @@ -208,6 +207,70 @@ func (m lenMatcher) String() string { return fmt.Sprintf("has length %d", m.i) } +type inAnyOrderMatcher struct { + x interface{} +} + +func (m inAnyOrderMatcher) Matches(x interface{}) bool { + given, ok := m.prepareValue(x) + if !ok { + return false + } + wanted, ok := m.prepareValue(m.x) + if !ok { + return false + } + + if given.Len() != wanted.Len() { + return false + } + + usedFromGiven := make([]bool, given.Len()) + foundFromWanted := make([]bool, wanted.Len()) + for i := 0; i < wanted.Len(); i++ { + wantedMatcher := Eq(wanted.Index(i).Interface()) + for j := 0; j < given.Len(); j++ { + if usedFromGiven[j] { + continue + } + if wantedMatcher.Matches(given.Index(j).Interface()) { + foundFromWanted[i] = true + usedFromGiven[j] = true + break + } + } + } + + missingFromWanted := 0 + for _, found := range foundFromWanted { + if !found { + missingFromWanted++ + } + } + extraInGiven := 0 + for _, used := range usedFromGiven { + if !used { + extraInGiven++ + } + } + + return extraInGiven == 0 && missingFromWanted == 0 +} + +func (m inAnyOrderMatcher) prepareValue(x interface{}) (reflect.Value, bool) { + xValue := reflect.ValueOf(x) + switch xValue.Kind() { + case reflect.Slice, reflect.Array: + return xValue, true + default: + return reflect.Value{}, false + } +} + +func (m inAnyOrderMatcher) String() string { + return fmt.Sprintf("has the same elements as %v", m.x) +} + // Constructors // All returns a composite Matcher that returns true if and only all of the @@ -267,3 +330,12 @@ func AssignableToTypeOf(x interface{}) Matcher { } return assignableToTypeOfMatcher{reflect.TypeOf(x)} } + +// InAnyOrder is a Matcher that returns true for collections of the same elements ignoring the order. +// +// Example usage: +// InAnyOrder([]int{1, 2, 3}).Matches([]int{1, 3, 2}) // returns true +// InAnyOrder([]int{1, 2, 3}).Matches([]int{1, 2}) // returns false +func InAnyOrder(x interface{}) Matcher { + return inAnyOrderMatcher{x} +} diff --git a/vendor/github.com/googleapis/gnostic/LICENSE b/vendor/github.com/google/gnostic/LICENSE similarity index 100% rename from vendor/github.com/googleapis/gnostic/LICENSE rename to vendor/github.com/google/gnostic/LICENSE diff --git a/vendor/github.com/googleapis/gnostic/compiler/README.md b/vendor/github.com/google/gnostic/compiler/README.md similarity index 100% rename from vendor/github.com/googleapis/gnostic/compiler/README.md rename to vendor/github.com/google/gnostic/compiler/README.md diff --git a/vendor/github.com/googleapis/gnostic/compiler/context.go b/vendor/github.com/google/gnostic/compiler/context.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/compiler/context.go rename to vendor/github.com/google/gnostic/compiler/context.go diff --git a/vendor/github.com/googleapis/gnostic/compiler/error.go b/vendor/github.com/google/gnostic/compiler/error.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/compiler/error.go rename to vendor/github.com/google/gnostic/compiler/error.go diff --git a/vendor/github.com/googleapis/gnostic/compiler/extensions.go b/vendor/github.com/google/gnostic/compiler/extensions.go similarity index 97% rename from vendor/github.com/googleapis/gnostic/compiler/extensions.go rename to vendor/github.com/google/gnostic/compiler/extensions.go index 20848a0a..5b5a916d 100644 --- a/vendor/github.com/googleapis/gnostic/compiler/extensions.go +++ b/vendor/github.com/google/gnostic/compiler/extensions.go @@ -22,8 +22,9 @@ import ( "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes/any" - extensions "github.com/googleapis/gnostic/extensions" yaml "gopkg.in/yaml.v3" + + extensions "github.com/google/gnostic/extensions" ) // ExtensionHandler describes a binary that is called by the compiler to handle specification extensions. diff --git a/vendor/github.com/googleapis/gnostic/compiler/helpers.go b/vendor/github.com/google/gnostic/compiler/helpers.go similarity index 99% rename from vendor/github.com/googleapis/gnostic/compiler/helpers.go rename to vendor/github.com/google/gnostic/compiler/helpers.go index 48f02f39..97ffaa51 100644 --- a/vendor/github.com/googleapis/gnostic/compiler/helpers.go +++ b/vendor/github.com/google/gnostic/compiler/helpers.go @@ -20,8 +20,9 @@ import ( "sort" "strconv" - "github.com/googleapis/gnostic/jsonschema" "gopkg.in/yaml.v3" + + "github.com/google/gnostic/jsonschema" ) // compiler helper functions, usually called from generated code diff --git a/vendor/github.com/googleapis/gnostic/compiler/main.go b/vendor/github.com/google/gnostic/compiler/main.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/compiler/main.go rename to vendor/github.com/google/gnostic/compiler/main.go diff --git a/vendor/github.com/googleapis/gnostic/compiler/reader.go b/vendor/github.com/google/gnostic/compiler/reader.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/compiler/reader.go rename to vendor/github.com/google/gnostic/compiler/reader.go diff --git a/vendor/github.com/googleapis/gnostic/extensions/README.md b/vendor/github.com/google/gnostic/extensions/README.md similarity index 100% rename from vendor/github.com/googleapis/gnostic/extensions/README.md rename to vendor/github.com/google/gnostic/extensions/README.md diff --git a/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go b/vendor/github.com/google/gnostic/extensions/extension.pb.go similarity index 99% rename from vendor/github.com/googleapis/gnostic/extensions/extension.pb.go rename to vendor/github.com/google/gnostic/extensions/extension.pb.go index 5aab58eb..a6a4ccca 100644 --- a/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go +++ b/vendor/github.com/google/gnostic/extensions/extension.pb.go @@ -15,7 +15,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.15.5 +// protoc v3.18.1 // source: extensions/extension.proto package gnostic_extension_v1 diff --git a/vendor/github.com/googleapis/gnostic/extensions/extension.proto b/vendor/github.com/google/gnostic/extensions/extension.proto similarity index 100% rename from vendor/github.com/googleapis/gnostic/extensions/extension.proto rename to vendor/github.com/google/gnostic/extensions/extension.proto diff --git a/vendor/github.com/googleapis/gnostic/extensions/extensions.go b/vendor/github.com/google/gnostic/extensions/extensions.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/extensions/extensions.go rename to vendor/github.com/google/gnostic/extensions/extensions.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/README.md b/vendor/github.com/google/gnostic/jsonschema/README.md similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/README.md rename to vendor/github.com/google/gnostic/jsonschema/README.md diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/base.go b/vendor/github.com/google/gnostic/jsonschema/base.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/base.go rename to vendor/github.com/google/gnostic/jsonschema/base.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/display.go b/vendor/github.com/google/gnostic/jsonschema/display.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/display.go rename to vendor/github.com/google/gnostic/jsonschema/display.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/models.go b/vendor/github.com/google/gnostic/jsonschema/models.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/models.go rename to vendor/github.com/google/gnostic/jsonschema/models.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/operations.go b/vendor/github.com/google/gnostic/jsonschema/operations.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/operations.go rename to vendor/github.com/google/gnostic/jsonschema/operations.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/reader.go b/vendor/github.com/google/gnostic/jsonschema/reader.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/reader.go rename to vendor/github.com/google/gnostic/jsonschema/reader.go diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/schema.json b/vendor/github.com/google/gnostic/jsonschema/schema.json similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/schema.json rename to vendor/github.com/google/gnostic/jsonschema/schema.json diff --git a/vendor/github.com/googleapis/gnostic/jsonschema/writer.go b/vendor/github.com/google/gnostic/jsonschema/writer.go similarity index 100% rename from vendor/github.com/googleapis/gnostic/jsonschema/writer.go rename to vendor/github.com/google/gnostic/jsonschema/writer.go diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.go b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go similarity index 99% rename from vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.go rename to vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go index 727d7f4a..0f179076 100644 --- a/vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.go +++ b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.go @@ -18,10 +18,12 @@ package openapi_v2 import ( "fmt" - "github.com/googleapis/gnostic/compiler" - "gopkg.in/yaml.v3" "regexp" "strings" + + "gopkg.in/yaml.v3" + + "github.com/google/gnostic/compiler" ) // Version returns the package name (and OpenAPI version). diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.pb.go b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.pb.go similarity index 99% rename from vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.pb.go rename to vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.pb.go index 8a5f302f..06b60157 100644 --- a/vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.pb.go +++ b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.26.0 -// protoc v3.15.5 +// protoc v3.18.1 // source: openapiv2/OpenAPIv2.proto package openapi_v2 diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.proto b/vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.proto similarity index 100% rename from vendor/github.com/googleapis/gnostic/openapiv2/OpenAPIv2.proto rename to vendor/github.com/google/gnostic/openapiv2/OpenAPIv2.proto diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/README.md b/vendor/github.com/google/gnostic/openapiv2/README.md similarity index 100% rename from vendor/github.com/googleapis/gnostic/openapiv2/README.md rename to vendor/github.com/google/gnostic/openapiv2/README.md diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/document.go b/vendor/github.com/google/gnostic/openapiv2/document.go similarity index 96% rename from vendor/github.com/googleapis/gnostic/openapiv2/document.go rename to vendor/github.com/google/gnostic/openapiv2/document.go index 56e5966b..0021ae87 100644 --- a/vendor/github.com/googleapis/gnostic/openapiv2/document.go +++ b/vendor/github.com/google/gnostic/openapiv2/document.go @@ -15,8 +15,9 @@ package openapi_v2 import ( - "github.com/googleapis/gnostic/compiler" "gopkg.in/yaml.v3" + + "github.com/google/gnostic/compiler" ) // ParseDocument reads an OpenAPI v2 description from a YAML/JSON representation. diff --git a/vendor/github.com/googleapis/gnostic/openapiv2/openapi-2.0.json b/vendor/github.com/google/gnostic/openapiv2/openapi-2.0.json similarity index 100% rename from vendor/github.com/googleapis/gnostic/openapiv2/openapi-2.0.json rename to vendor/github.com/google/gnostic/openapiv2/openapi-2.0.json diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go new file mode 100644 index 00000000..5f4a7025 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.go @@ -0,0 +1,8633 @@ +// Copyright 2020 Google LLC. All Rights Reserved. +// +// 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +package openapi_v3 + +import ( + "fmt" + "regexp" + "strings" + + "gopkg.in/yaml.v3" + + "github.com/google/gnostic/compiler" +) + +// Version returns the package name (and OpenAPI version). +func Version() string { + return "openapi_v3" +} + +// NewAdditionalPropertiesItem creates an object of type AdditionalPropertiesItem if possible, returning an error if not. +func NewAdditionalPropertiesItem(in *yaml.Node, context *compiler.Context) (*AdditionalPropertiesItem, error) { + errors := make([]error, 0) + x := &AdditionalPropertiesItem{} + matched := false + // SchemaOrReference schema_or_reference = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchemaOrReference(m, compiler.NewContext("schemaOrReference", m, context)) + if matchingError == nil { + x.Oneof = &AdditionalPropertiesItem_SchemaOrReference{SchemaOrReference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // bool boolean = 2; + boolValue, ok := compiler.BoolForScalarNode(in) + if ok { + x.Oneof = &AdditionalPropertiesItem_Boolean{Boolean: boolValue} + matched = true + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid AdditionalPropertiesItem") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAny creates an object of type Any if possible, returning an error if not. +func NewAny(in *yaml.Node, context *compiler.Context) (*Any, error) { + errors := make([]error, 0) + x := &Any{} + bytes := compiler.Marshal(in) + x.Yaml = string(bytes) + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewAnyOrExpression creates an object of type AnyOrExpression if possible, returning an error if not. +func NewAnyOrExpression(in *yaml.Node, context *compiler.Context) (*AnyOrExpression, error) { + errors := make([]error, 0) + x := &AnyOrExpression{} + matched := false + // Any any = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewAny(m, compiler.NewContext("any", m, context)) + if matchingError == nil { + x.Oneof = &AnyOrExpression_Any{Any: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Expression expression = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewExpression(m, compiler.NewContext("expression", m, context)) + if matchingError == nil { + x.Oneof = &AnyOrExpression_Expression{Expression: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid AnyOrExpression") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewCallback creates an object of type Callback if possible, returning an error if not. +func NewCallback(in *yaml.Node, context *compiler.Context) (*Callback, error) { + errors := make([]error, 0) + x := &Callback{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern0, pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedPathItem path = 1; + // MAP: PathItem ^ + x.Path = make([]*NamedPathItem, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if true { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.Path = append(x.Path, pair) + } + } + } + // repeated NamedAny specification_extension = 2; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewCallbackOrReference creates an object of type CallbackOrReference if possible, returning an error if not. +func NewCallbackOrReference(in *yaml.Node, context *compiler.Context) (*CallbackOrReference, error) { + errors := make([]error, 0) + x := &CallbackOrReference{} + matched := false + // Callback callback = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewCallback(m, compiler.NewContext("callback", m, context)) + if matchingError == nil { + x.Oneof = &CallbackOrReference_Callback{Callback: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &CallbackOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid CallbackOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewCallbacksOrReferences creates an object of type CallbacksOrReferences if possible, returning an error if not. +func NewCallbacksOrReferences(in *yaml.Node, context *compiler.Context) (*CallbacksOrReferences, error) { + errors := make([]error, 0) + x := &CallbacksOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedCallbackOrReference additional_properties = 1; + // MAP: CallbackOrReference + x.AdditionalProperties = make([]*NamedCallbackOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedCallbackOrReference{} + pair.Name = k + var err error + pair.Value, err = NewCallbackOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewComponents creates an object of type Components if possible, returning an error if not. +func NewComponents(in *yaml.Node, context *compiler.Context) (*Components, error) { + errors := make([]error, 0) + x := &Components{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"callbacks", "examples", "headers", "links", "parameters", "requestBodies", "responses", "schemas", "securitySchemes"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // SchemasOrReferences schemas = 1; + v1 := compiler.MapValueForKey(m, "schemas") + if v1 != nil { + var err error + x.Schemas, err = NewSchemasOrReferences(v1, compiler.NewContext("schemas", v1, context)) + if err != nil { + errors = append(errors, err) + } + } + // ResponsesOrReferences responses = 2; + v2 := compiler.MapValueForKey(m, "responses") + if v2 != nil { + var err error + x.Responses, err = NewResponsesOrReferences(v2, compiler.NewContext("responses", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // ParametersOrReferences parameters = 3; + v3 := compiler.MapValueForKey(m, "parameters") + if v3 != nil { + var err error + x.Parameters, err = NewParametersOrReferences(v3, compiler.NewContext("parameters", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExamplesOrReferences examples = 4; + v4 := compiler.MapValueForKey(m, "examples") + if v4 != nil { + var err error + x.Examples, err = NewExamplesOrReferences(v4, compiler.NewContext("examples", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // RequestBodiesOrReferences request_bodies = 5; + v5 := compiler.MapValueForKey(m, "requestBodies") + if v5 != nil { + var err error + x.RequestBodies, err = NewRequestBodiesOrReferences(v5, compiler.NewContext("requestBodies", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // HeadersOrReferences headers = 6; + v6 := compiler.MapValueForKey(m, "headers") + if v6 != nil { + var err error + x.Headers, err = NewHeadersOrReferences(v6, compiler.NewContext("headers", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // SecuritySchemesOrReferences security_schemes = 7; + v7 := compiler.MapValueForKey(m, "securitySchemes") + if v7 != nil { + var err error + x.SecuritySchemes, err = NewSecuritySchemesOrReferences(v7, compiler.NewContext("securitySchemes", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // LinksOrReferences links = 8; + v8 := compiler.MapValueForKey(m, "links") + if v8 != nil { + var err error + x.Links, err = NewLinksOrReferences(v8, compiler.NewContext("links", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // CallbacksOrReferences callbacks = 9; + v9 := compiler.MapValueForKey(m, "callbacks") + if v9 != nil { + var err error + x.Callbacks, err = NewCallbacksOrReferences(v9, compiler.NewContext("callbacks", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 10; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewContact creates an object of type Contact if possible, returning an error if not. +func NewContact(in *yaml.Node, context *compiler.Context) (*Contact, error) { + errors := make([]error, 0) + x := &Contact{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"email", "name", "url"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string email = 3; + v3 := compiler.MapValueForKey(m, "email") + if v3 != nil { + x.Email, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for email: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDefaultType creates an object of type DefaultType if possible, returning an error if not. +func NewDefaultType(in *yaml.Node, context *compiler.Context) (*DefaultType, error) { + errors := make([]error, 0) + x := &DefaultType{} + matched := false + switch in.Tag { + case "!!bool": + var v bool + v, matched = compiler.BoolForScalarNode(in) + x.Oneof = &DefaultType_Boolean{Boolean: v} + case "!!str": + var v string + v, matched = compiler.StringForScalarNode(in) + x.Oneof = &DefaultType_String_{String_: v} + case "!!float": + var v float64 + v, matched = compiler.FloatForScalarNode(in) + x.Oneof = &DefaultType_Number{Number: v} + case "!!int": + var v int64 + v, matched = compiler.IntForScalarNode(in) + x.Oneof = &DefaultType_Number{Number: float64(v)} + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDiscriminator creates an object of type Discriminator if possible, returning an error if not. +func NewDiscriminator(in *yaml.Node, context *compiler.Context) (*Discriminator, error) { + errors := make([]error, 0) + x := &Discriminator{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"propertyName"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"mapping", "propertyName"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string property_name = 1; + v1 := compiler.MapValueForKey(m, "propertyName") + if v1 != nil { + x.PropertyName, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for propertyName: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Strings mapping = 2; + v2 := compiler.MapValueForKey(m, "mapping") + if v2 != nil { + var err error + x.Mapping, err = NewStrings(v2, compiler.NewContext("mapping", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewDocument creates an object of type Document if possible, returning an error if not. +func NewDocument(in *yaml.Node, context *compiler.Context) (*Document, error) { + errors := make([]error, 0) + x := &Document{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"info", "openapi", "paths"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"components", "externalDocs", "info", "openapi", "paths", "security", "servers", "tags"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string openapi = 1; + v1 := compiler.MapValueForKey(m, "openapi") + if v1 != nil { + x.Openapi, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for openapi: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Info info = 2; + v2 := compiler.MapValueForKey(m, "info") + if v2 != nil { + var err error + x.Info, err = NewInfo(v2, compiler.NewContext("info", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Server servers = 3; + v3 := compiler.MapValueForKey(m, "servers") + if v3 != nil { + // repeated Server + x.Servers = make([]*Server, 0) + a, ok := compiler.SequenceNodeForNode(v3) + if ok { + for _, item := range a.Content { + y, err := NewServer(item, compiler.NewContext("servers", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Servers = append(x.Servers, y) + } + } + } + // Paths paths = 4; + v4 := compiler.MapValueForKey(m, "paths") + if v4 != nil { + var err error + x.Paths, err = NewPaths(v4, compiler.NewContext("paths", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // Components components = 5; + v5 := compiler.MapValueForKey(m, "components") + if v5 != nil { + var err error + x.Components, err = NewComponents(v5, compiler.NewContext("components", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated SecurityRequirement security = 6; + v6 := compiler.MapValueForKey(m, "security") + if v6 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := compiler.SequenceNodeForNode(v6) + if ok { + for _, item := range a.Content { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // repeated Tag tags = 7; + v7 := compiler.MapValueForKey(m, "tags") + if v7 != nil { + // repeated Tag + x.Tags = make([]*Tag, 0) + a, ok := compiler.SequenceNodeForNode(v7) + if ok { + for _, item := range a.Content { + y, err := NewTag(item, compiler.NewContext("tags", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Tags = append(x.Tags, y) + } + } + } + // ExternalDocs external_docs = 8; + v8 := compiler.MapValueForKey(m, "externalDocs") + if v8 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v8, compiler.NewContext("externalDocs", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 9; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewEncoding creates an object of type Encoding if possible, returning an error if not. +func NewEncoding(in *yaml.Node, context *compiler.Context) (*Encoding, error) { + errors := make([]error, 0) + x := &Encoding{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowReserved", "contentType", "explode", "headers", "style"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string content_type = 1; + v1 := compiler.MapValueForKey(m, "contentType") + if v1 != nil { + x.ContentType, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for contentType: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // HeadersOrReferences headers = 2; + v2 := compiler.MapValueForKey(m, "headers") + if v2 != nil { + var err error + x.Headers, err = NewHeadersOrReferences(v2, compiler.NewContext("headers", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // string style = 3; + v3 := compiler.MapValueForKey(m, "style") + if v3 != nil { + x.Style, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 4; + v4 := compiler.MapValueForKey(m, "explode") + if v4 != nil { + x.Explode, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 5; + v5 := compiler.MapValueForKey(m, "allowReserved") + if v5 != nil { + x.AllowReserved, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 6; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewEncodings creates an object of type Encodings if possible, returning an error if not. +func NewEncodings(in *yaml.Node, context *compiler.Context) (*Encodings, error) { + errors := make([]error, 0) + x := &Encodings{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedEncoding additional_properties = 1; + // MAP: Encoding + x.AdditionalProperties = make([]*NamedEncoding, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedEncoding{} + pair.Name = k + var err error + pair.Value, err = NewEncoding(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExample creates an object of type Example if possible, returning an error if not. +func NewExample(in *yaml.Node, context *compiler.Context) (*Example, error) { + errors := make([]error, 0) + x := &Example{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"description", "externalValue", "summary", "value"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string summary = 1; + v1 := compiler.MapValueForKey(m, "summary") + if v1 != nil { + x.Summary, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any value = 3; + v3 := compiler.MapValueForKey(m, "value") + if v3 != nil { + var err error + x.Value, err = NewAny(v3, compiler.NewContext("value", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // string external_value = 4; + v4 := compiler.MapValueForKey(m, "externalValue") + if v4 != nil { + x.ExternalValue, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for externalValue: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExampleOrReference creates an object of type ExampleOrReference if possible, returning an error if not. +func NewExampleOrReference(in *yaml.Node, context *compiler.Context) (*ExampleOrReference, error) { + errors := make([]error, 0) + x := &ExampleOrReference{} + matched := false + // Example example = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewExample(m, compiler.NewContext("example", m, context)) + if matchingError == nil { + x.Oneof = &ExampleOrReference_Example{Example: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &ExampleOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid ExampleOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExamplesOrReferences creates an object of type ExamplesOrReferences if possible, returning an error if not. +func NewExamplesOrReferences(in *yaml.Node, context *compiler.Context) (*ExamplesOrReferences, error) { + errors := make([]error, 0) + x := &ExamplesOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedExampleOrReference additional_properties = 1; + // MAP: ExampleOrReference + x.AdditionalProperties = make([]*NamedExampleOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedExampleOrReference{} + pair.Name = k + var err error + pair.Value, err = NewExampleOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExpression creates an object of type Expression if possible, returning an error if not. +func NewExpression(in *yaml.Node, context *compiler.Context) (*Expression, error) { + errors := make([]error, 0) + x := &Expression{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewExternalDocs creates an object of type ExternalDocs if possible, returning an error if not. +func NewExternalDocs(in *yaml.Node, context *compiler.Context) (*ExternalDocs, error) { + errors := make([]error, 0) + x := &ExternalDocs{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"url"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "url"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeader creates an object of type Header if possible, returning an error if not. +func NewHeader(in *yaml.Node, context *compiler.Context) (*Header, error) { + errors := make([]error, 0) + x := &Header{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"allowEmptyValue", "allowReserved", "content", "deprecated", "description", "example", "examples", "explode", "required", "schema", "style"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 2; + v2 := compiler.MapValueForKey(m, "required") + if v2 != nil { + x.Required, ok = compiler.BoolForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 3; + v3 := compiler.MapValueForKey(m, "deprecated") + if v3 != nil { + x.Deprecated, ok = compiler.BoolForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 4; + v4 := compiler.MapValueForKey(m, "allowEmptyValue") + if v4 != nil { + x.AllowEmptyValue, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string style = 5; + v5 := compiler.MapValueForKey(m, "style") + if v5 != nil { + x.Style, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 6; + v6 := compiler.MapValueForKey(m, "explode") + if v6 != nil { + x.Explode, ok = compiler.BoolForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 7; + v7 := compiler.MapValueForKey(m, "allowReserved") + if v7 != nil { + x.AllowReserved, ok = compiler.BoolForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SchemaOrReference schema = 8; + v8 := compiler.MapValueForKey(m, "schema") + if v8 != nil { + var err error + x.Schema, err = NewSchemaOrReference(v8, compiler.NewContext("schema", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 9; + v9 := compiler.MapValueForKey(m, "example") + if v9 != nil { + var err error + x.Example, err = NewAny(v9, compiler.NewContext("example", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExamplesOrReferences examples = 10; + v10 := compiler.MapValueForKey(m, "examples") + if v10 != nil { + var err error + x.Examples, err = NewExamplesOrReferences(v10, compiler.NewContext("examples", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // MediaTypes content = 11; + v11 := compiler.MapValueForKey(m, "content") + if v11 != nil { + var err error + x.Content, err = NewMediaTypes(v11, compiler.NewContext("content", v11, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 12; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeaderOrReference creates an object of type HeaderOrReference if possible, returning an error if not. +func NewHeaderOrReference(in *yaml.Node, context *compiler.Context) (*HeaderOrReference, error) { + errors := make([]error, 0) + x := &HeaderOrReference{} + matched := false + // Header header = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewHeader(m, compiler.NewContext("header", m, context)) + if matchingError == nil { + x.Oneof = &HeaderOrReference_Header{Header: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &HeaderOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid HeaderOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewHeadersOrReferences creates an object of type HeadersOrReferences if possible, returning an error if not. +func NewHeadersOrReferences(in *yaml.Node, context *compiler.Context) (*HeadersOrReferences, error) { + errors := make([]error, 0) + x := &HeadersOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedHeaderOrReference additional_properties = 1; + // MAP: HeaderOrReference + x.AdditionalProperties = make([]*NamedHeaderOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedHeaderOrReference{} + pair.Name = k + var err error + pair.Value, err = NewHeaderOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewInfo creates an object of type Info if possible, returning an error if not. +func NewInfo(in *yaml.Node, context *compiler.Context) (*Info, error) { + errors := make([]error, 0) + x := &Info{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"title", "version"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"contact", "description", "license", "summary", "termsOfService", "title", "version"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string title = 1; + v1 := compiler.MapValueForKey(m, "title") + if v1 != nil { + x.Title, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string terms_of_service = 3; + v3 := compiler.MapValueForKey(m, "termsOfService") + if v3 != nil { + x.TermsOfService, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for termsOfService: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Contact contact = 4; + v4 := compiler.MapValueForKey(m, "contact") + if v4 != nil { + var err error + x.Contact, err = NewContact(v4, compiler.NewContext("contact", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // License license = 5; + v5 := compiler.MapValueForKey(m, "license") + if v5 != nil { + var err error + x.License, err = NewLicense(v5, compiler.NewContext("license", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // string version = 6; + v6 := compiler.MapValueForKey(m, "version") + if v6 != nil { + x.Version, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for version: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 7; + v7 := compiler.MapValueForKey(m, "summary") + if v7 != nil { + x.Summary, ok = compiler.StringForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 8; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewItemsItem creates an object of type ItemsItem if possible, returning an error if not. +func NewItemsItem(in *yaml.Node, context *compiler.Context) (*ItemsItem, error) { + errors := make([]error, 0) + x := &ItemsItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value for item array: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + x.SchemaOrReference = make([]*SchemaOrReference, 0) + y, err := NewSchemaOrReference(m, compiler.NewContext("", m, context)) + if err != nil { + return nil, err + } + x.SchemaOrReference = append(x.SchemaOrReference, y) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLicense creates an object of type License if possible, returning an error if not. +func NewLicense(in *yaml.Node, context *compiler.Context) (*License, error) { + errors := make([]error, 0) + x := &License{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"name", "url"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string url = 2; + v2 := compiler.MapValueForKey(m, "url") + if v2 != nil { + x.Url, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLink creates an object of type Link if possible, returning an error if not. +func NewLink(in *yaml.Node, context *compiler.Context) (*Link, error) { + errors := make([]error, 0) + x := &Link{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"description", "operationId", "operationRef", "parameters", "requestBody", "server"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string operation_ref = 1; + v1 := compiler.MapValueForKey(m, "operationRef") + if v1 != nil { + x.OperationRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for operationRef: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string operation_id = 2; + v2 := compiler.MapValueForKey(m, "operationId") + if v2 != nil { + x.OperationId, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // AnyOrExpression parameters = 3; + v3 := compiler.MapValueForKey(m, "parameters") + if v3 != nil { + var err error + x.Parameters, err = NewAnyOrExpression(v3, compiler.NewContext("parameters", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // AnyOrExpression request_body = 4; + v4 := compiler.MapValueForKey(m, "requestBody") + if v4 != nil { + var err error + x.RequestBody, err = NewAnyOrExpression(v4, compiler.NewContext("requestBody", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // string description = 5; + v5 := compiler.MapValueForKey(m, "description") + if v5 != nil { + x.Description, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Server server = 6; + v6 := compiler.MapValueForKey(m, "server") + if v6 != nil { + var err error + x.Server, err = NewServer(v6, compiler.NewContext("server", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 7; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLinkOrReference creates an object of type LinkOrReference if possible, returning an error if not. +func NewLinkOrReference(in *yaml.Node, context *compiler.Context) (*LinkOrReference, error) { + errors := make([]error, 0) + x := &LinkOrReference{} + matched := false + // Link link = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewLink(m, compiler.NewContext("link", m, context)) + if matchingError == nil { + x.Oneof = &LinkOrReference_Link{Link: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &LinkOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid LinkOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewLinksOrReferences creates an object of type LinksOrReferences if possible, returning an error if not. +func NewLinksOrReferences(in *yaml.Node, context *compiler.Context) (*LinksOrReferences, error) { + errors := make([]error, 0) + x := &LinksOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedLinkOrReference additional_properties = 1; + // MAP: LinkOrReference + x.AdditionalProperties = make([]*NamedLinkOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedLinkOrReference{} + pair.Name = k + var err error + pair.Value, err = NewLinkOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewMediaType creates an object of type MediaType if possible, returning an error if not. +func NewMediaType(in *yaml.Node, context *compiler.Context) (*MediaType, error) { + errors := make([]error, 0) + x := &MediaType{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"encoding", "example", "examples", "schema"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // SchemaOrReference schema = 1; + v1 := compiler.MapValueForKey(m, "schema") + if v1 != nil { + var err error + x.Schema, err = NewSchemaOrReference(v1, compiler.NewContext("schema", v1, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 2; + v2 := compiler.MapValueForKey(m, "example") + if v2 != nil { + var err error + x.Example, err = NewAny(v2, compiler.NewContext("example", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExamplesOrReferences examples = 3; + v3 := compiler.MapValueForKey(m, "examples") + if v3 != nil { + var err error + x.Examples, err = NewExamplesOrReferences(v3, compiler.NewContext("examples", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // Encodings encoding = 4; + v4 := compiler.MapValueForKey(m, "encoding") + if v4 != nil { + var err error + x.Encoding, err = NewEncodings(v4, compiler.NewContext("encoding", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewMediaTypes creates an object of type MediaTypes if possible, returning an error if not. +func NewMediaTypes(in *yaml.Node, context *compiler.Context) (*MediaTypes, error) { + errors := make([]error, 0) + x := &MediaTypes{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedMediaType additional_properties = 1; + // MAP: MediaType + x.AdditionalProperties = make([]*NamedMediaType, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedMediaType{} + pair.Name = k + var err error + pair.Value, err = NewMediaType(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedAny creates an object of type NamedAny if possible, returning an error if not. +func NewNamedAny(in *yaml.Node, context *compiler.Context) (*NamedAny, error) { + errors := make([]error, 0) + x := &NamedAny{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Any value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewAny(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedCallbackOrReference creates an object of type NamedCallbackOrReference if possible, returning an error if not. +func NewNamedCallbackOrReference(in *yaml.Node, context *compiler.Context) (*NamedCallbackOrReference, error) { + errors := make([]error, 0) + x := &NamedCallbackOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // CallbackOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewCallbackOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedEncoding creates an object of type NamedEncoding if possible, returning an error if not. +func NewNamedEncoding(in *yaml.Node, context *compiler.Context) (*NamedEncoding, error) { + errors := make([]error, 0) + x := &NamedEncoding{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Encoding value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewEncoding(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedExampleOrReference creates an object of type NamedExampleOrReference if possible, returning an error if not. +func NewNamedExampleOrReference(in *yaml.Node, context *compiler.Context) (*NamedExampleOrReference, error) { + errors := make([]error, 0) + x := &NamedExampleOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExampleOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewExampleOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedHeaderOrReference creates an object of type NamedHeaderOrReference if possible, returning an error if not. +func NewNamedHeaderOrReference(in *yaml.Node, context *compiler.Context) (*NamedHeaderOrReference, error) { + errors := make([]error, 0) + x := &NamedHeaderOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // HeaderOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewHeaderOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedLinkOrReference creates an object of type NamedLinkOrReference if possible, returning an error if not. +func NewNamedLinkOrReference(in *yaml.Node, context *compiler.Context) (*NamedLinkOrReference, error) { + errors := make([]error, 0) + x := &NamedLinkOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // LinkOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewLinkOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedMediaType creates an object of type NamedMediaType if possible, returning an error if not. +func NewNamedMediaType(in *yaml.Node, context *compiler.Context) (*NamedMediaType, error) { + errors := make([]error, 0) + x := &NamedMediaType{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // MediaType value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewMediaType(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedParameterOrReference creates an object of type NamedParameterOrReference if possible, returning an error if not. +func NewNamedParameterOrReference(in *yaml.Node, context *compiler.Context) (*NamedParameterOrReference, error) { + errors := make([]error, 0) + x := &NamedParameterOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ParameterOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewParameterOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedPathItem creates an object of type NamedPathItem if possible, returning an error if not. +func NewNamedPathItem(in *yaml.Node, context *compiler.Context) (*NamedPathItem, error) { + errors := make([]error, 0) + x := &NamedPathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // PathItem value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewPathItem(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedRequestBodyOrReference creates an object of type NamedRequestBodyOrReference if possible, returning an error if not. +func NewNamedRequestBodyOrReference(in *yaml.Node, context *compiler.Context) (*NamedRequestBodyOrReference, error) { + errors := make([]error, 0) + x := &NamedRequestBodyOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // RequestBodyOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewRequestBodyOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedResponseOrReference creates an object of type NamedResponseOrReference if possible, returning an error if not. +func NewNamedResponseOrReference(in *yaml.Node, context *compiler.Context) (*NamedResponseOrReference, error) { + errors := make([]error, 0) + x := &NamedResponseOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ResponseOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewResponseOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSchemaOrReference creates an object of type NamedSchemaOrReference if possible, returning an error if not. +func NewNamedSchemaOrReference(in *yaml.Node, context *compiler.Context) (*NamedSchemaOrReference, error) { + errors := make([]error, 0) + x := &NamedSchemaOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SchemaOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSchemaOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedSecuritySchemeOrReference creates an object of type NamedSecuritySchemeOrReference if possible, returning an error if not. +func NewNamedSecuritySchemeOrReference(in *yaml.Node, context *compiler.Context) (*NamedSecuritySchemeOrReference, error) { + errors := make([]error, 0) + x := &NamedSecuritySchemeOrReference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SecuritySchemeOrReference value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewSecuritySchemeOrReference(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedServerVariable creates an object of type NamedServerVariable if possible, returning an error if not. +func NewNamedServerVariable(in *yaml.Node, context *compiler.Context) (*NamedServerVariable, error) { + errors := make([]error, 0) + x := &NamedServerVariable{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ServerVariable value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewServerVariable(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedString creates an object of type NamedString if possible, returning an error if not. +func NewNamedString(in *yaml.Node, context *compiler.Context) (*NamedString, error) { + errors := make([]error, 0) + x := &NamedString{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + x.Value, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for value: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewNamedStringArray creates an object of type NamedStringArray if possible, returning an error if not. +func NewNamedStringArray(in *yaml.Node, context *compiler.Context) (*NamedStringArray, error) { + errors := make([]error, 0) + x := &NamedStringArray{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"name", "value"} + var allowedPatterns []*regexp.Regexp + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // StringArray value = 2; + v2 := compiler.MapValueForKey(m, "value") + if v2 != nil { + var err error + x.Value, err = NewStringArray(v2, compiler.NewContext("value", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauthFlow creates an object of type OauthFlow if possible, returning an error if not. +func NewOauthFlow(in *yaml.Node, context *compiler.Context) (*OauthFlow, error) { + errors := make([]error, 0) + x := &OauthFlow{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"authorizationUrl", "refreshUrl", "scopes", "tokenUrl"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string authorization_url = 1; + v1 := compiler.MapValueForKey(m, "authorizationUrl") + if v1 != nil { + x.AuthorizationUrl, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for authorizationUrl: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string token_url = 2; + v2 := compiler.MapValueForKey(m, "tokenUrl") + if v2 != nil { + x.TokenUrl, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for tokenUrl: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string refresh_url = 3; + v3 := compiler.MapValueForKey(m, "refreshUrl") + if v3 != nil { + x.RefreshUrl, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for refreshUrl: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Strings scopes = 4; + v4 := compiler.MapValueForKey(m, "scopes") + if v4 != nil { + var err error + x.Scopes, err = NewStrings(v4, compiler.NewContext("scopes", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOauthFlows creates an object of type OauthFlows if possible, returning an error if not. +func NewOauthFlows(in *yaml.Node, context *compiler.Context) (*OauthFlows, error) { + errors := make([]error, 0) + x := &OauthFlows{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"authorizationCode", "clientCredentials", "implicit", "password"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // OauthFlow implicit = 1; + v1 := compiler.MapValueForKey(m, "implicit") + if v1 != nil { + var err error + x.Implicit, err = NewOauthFlow(v1, compiler.NewContext("implicit", v1, context)) + if err != nil { + errors = append(errors, err) + } + } + // OauthFlow password = 2; + v2 := compiler.MapValueForKey(m, "password") + if v2 != nil { + var err error + x.Password, err = NewOauthFlow(v2, compiler.NewContext("password", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // OauthFlow client_credentials = 3; + v3 := compiler.MapValueForKey(m, "clientCredentials") + if v3 != nil { + var err error + x.ClientCredentials, err = NewOauthFlow(v3, compiler.NewContext("clientCredentials", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // OauthFlow authorization_code = 4; + v4 := compiler.MapValueForKey(m, "authorizationCode") + if v4 != nil { + var err error + x.AuthorizationCode, err = NewOauthFlow(v4, compiler.NewContext("authorizationCode", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewObject creates an object of type Object if possible, returning an error if not. +func NewObject(in *yaml.Node, context *compiler.Context) (*Object, error) { + errors := make([]error, 0) + x := &Object{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedAny additional_properties = 1; + // MAP: Any + x.AdditionalProperties = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewOperation creates an object of type Operation if possible, returning an error if not. +func NewOperation(in *yaml.Node, context *compiler.Context) (*Operation, error) { + errors := make([]error, 0) + x := &Operation{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"responses"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"callbacks", "deprecated", "description", "externalDocs", "operationId", "parameters", "requestBody", "responses", "security", "servers", "summary", "tags"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated string tags = 1; + v1 := compiler.MapValueForKey(m, "tags") + if v1 != nil { + v, ok := compiler.SequenceNodeForNode(v1) + if ok { + x.Tags = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for tags: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 4; + v4 := compiler.MapValueForKey(m, "externalDocs") + if v4 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v4, compiler.NewContext("externalDocs", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // string operation_id = 5; + v5 := compiler.MapValueForKey(m, "operationId") + if v5 != nil { + x.OperationId, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for operationId: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated ParameterOrReference parameters = 6; + v6 := compiler.MapValueForKey(m, "parameters") + if v6 != nil { + // repeated ParameterOrReference + x.Parameters = make([]*ParameterOrReference, 0) + a, ok := compiler.SequenceNodeForNode(v6) + if ok { + for _, item := range a.Content { + y, err := NewParameterOrReference(item, compiler.NewContext("parameters", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // RequestBodyOrReference request_body = 7; + v7 := compiler.MapValueForKey(m, "requestBody") + if v7 != nil { + var err error + x.RequestBody, err = NewRequestBodyOrReference(v7, compiler.NewContext("requestBody", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // Responses responses = 8; + v8 := compiler.MapValueForKey(m, "responses") + if v8 != nil { + var err error + x.Responses, err = NewResponses(v8, compiler.NewContext("responses", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // CallbacksOrReferences callbacks = 9; + v9 := compiler.MapValueForKey(m, "callbacks") + if v9 != nil { + var err error + x.Callbacks, err = NewCallbacksOrReferences(v9, compiler.NewContext("callbacks", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // bool deprecated = 10; + v10 := compiler.MapValueForKey(m, "deprecated") + if v10 != nil { + x.Deprecated, ok = compiler.BoolForScalarNode(v10) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated SecurityRequirement security = 11; + v11 := compiler.MapValueForKey(m, "security") + if v11 != nil { + // repeated SecurityRequirement + x.Security = make([]*SecurityRequirement, 0) + a, ok := compiler.SequenceNodeForNode(v11) + if ok { + for _, item := range a.Content { + y, err := NewSecurityRequirement(item, compiler.NewContext("security", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Security = append(x.Security, y) + } + } + } + // repeated Server servers = 12; + v12 := compiler.MapValueForKey(m, "servers") + if v12 != nil { + // repeated Server + x.Servers = make([]*Server, 0) + a, ok := compiler.SequenceNodeForNode(v12) + if ok { + for _, item := range a.Content { + y, err := NewServer(item, compiler.NewContext("servers", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Servers = append(x.Servers, y) + } + } + } + // repeated NamedAny specification_extension = 13; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameter creates an object of type Parameter if possible, returning an error if not. +func NewParameter(in *yaml.Node, context *compiler.Context) (*Parameter, error) { + errors := make([]error, 0) + x := &Parameter{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"in", "name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"allowEmptyValue", "allowReserved", "content", "deprecated", "description", "example", "examples", "explode", "in", "name", "required", "schema", "style"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 2; + v2 := compiler.MapValueForKey(m, "in") + if v2 != nil { + x.In, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool required = 4; + v4 := compiler.MapValueForKey(m, "required") + if v4 != nil { + x.Required, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool deprecated = 5; + v5 := compiler.MapValueForKey(m, "deprecated") + if v5 != nil { + x.Deprecated, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_empty_value = 6; + v6 := compiler.MapValueForKey(m, "allowEmptyValue") + if v6 != nil { + x.AllowEmptyValue, ok = compiler.BoolForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for allowEmptyValue: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string style = 7; + v7 := compiler.MapValueForKey(m, "style") + if v7 != nil { + x.Style, ok = compiler.StringForScalarNode(v7) + if !ok { + message := fmt.Sprintf("has unexpected value for style: %s", compiler.Display(v7)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool explode = 8; + v8 := compiler.MapValueForKey(m, "explode") + if v8 != nil { + x.Explode, ok = compiler.BoolForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for explode: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool allow_reserved = 9; + v9 := compiler.MapValueForKey(m, "allowReserved") + if v9 != nil { + x.AllowReserved, ok = compiler.BoolForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for allowReserved: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // SchemaOrReference schema = 10; + v10 := compiler.MapValueForKey(m, "schema") + if v10 != nil { + var err error + x.Schema, err = NewSchemaOrReference(v10, compiler.NewContext("schema", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 11; + v11 := compiler.MapValueForKey(m, "example") + if v11 != nil { + var err error + x.Example, err = NewAny(v11, compiler.NewContext("example", v11, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExamplesOrReferences examples = 12; + v12 := compiler.MapValueForKey(m, "examples") + if v12 != nil { + var err error + x.Examples, err = NewExamplesOrReferences(v12, compiler.NewContext("examples", v12, context)) + if err != nil { + errors = append(errors, err) + } + } + // MediaTypes content = 13; + v13 := compiler.MapValueForKey(m, "content") + if v13 != nil { + var err error + x.Content, err = NewMediaTypes(v13, compiler.NewContext("content", v13, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 14; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParameterOrReference creates an object of type ParameterOrReference if possible, returning an error if not. +func NewParameterOrReference(in *yaml.Node, context *compiler.Context) (*ParameterOrReference, error) { + errors := make([]error, 0) + x := &ParameterOrReference{} + matched := false + // Parameter parameter = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewParameter(m, compiler.NewContext("parameter", m, context)) + if matchingError == nil { + x.Oneof = &ParameterOrReference_Parameter{Parameter: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &ParameterOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid ParameterOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewParametersOrReferences creates an object of type ParametersOrReferences if possible, returning an error if not. +func NewParametersOrReferences(in *yaml.Node, context *compiler.Context) (*ParametersOrReferences, error) { + errors := make([]error, 0) + x := &ParametersOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedParameterOrReference additional_properties = 1; + // MAP: ParameterOrReference + x.AdditionalProperties = make([]*NamedParameterOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedParameterOrReference{} + pair.Name = k + var err error + pair.Value, err = NewParameterOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPathItem creates an object of type PathItem if possible, returning an error if not. +func NewPathItem(in *yaml.Node, context *compiler.Context) (*PathItem, error) { + errors := make([]error, 0) + x := &PathItem{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"$ref", "delete", "description", "get", "head", "options", "parameters", "patch", "post", "put", "servers", "summary", "trace"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Operation get = 4; + v4 := compiler.MapValueForKey(m, "get") + if v4 != nil { + var err error + x.Get, err = NewOperation(v4, compiler.NewContext("get", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation put = 5; + v5 := compiler.MapValueForKey(m, "put") + if v5 != nil { + var err error + x.Put, err = NewOperation(v5, compiler.NewContext("put", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation post = 6; + v6 := compiler.MapValueForKey(m, "post") + if v6 != nil { + var err error + x.Post, err = NewOperation(v6, compiler.NewContext("post", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation delete = 7; + v7 := compiler.MapValueForKey(m, "delete") + if v7 != nil { + var err error + x.Delete, err = NewOperation(v7, compiler.NewContext("delete", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation options = 8; + v8 := compiler.MapValueForKey(m, "options") + if v8 != nil { + var err error + x.Options, err = NewOperation(v8, compiler.NewContext("options", v8, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation head = 9; + v9 := compiler.MapValueForKey(m, "head") + if v9 != nil { + var err error + x.Head, err = NewOperation(v9, compiler.NewContext("head", v9, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation patch = 10; + v10 := compiler.MapValueForKey(m, "patch") + if v10 != nil { + var err error + x.Patch, err = NewOperation(v10, compiler.NewContext("patch", v10, context)) + if err != nil { + errors = append(errors, err) + } + } + // Operation trace = 11; + v11 := compiler.MapValueForKey(m, "trace") + if v11 != nil { + var err error + x.Trace, err = NewOperation(v11, compiler.NewContext("trace", v11, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated Server servers = 12; + v12 := compiler.MapValueForKey(m, "servers") + if v12 != nil { + // repeated Server + x.Servers = make([]*Server, 0) + a, ok := compiler.SequenceNodeForNode(v12) + if ok { + for _, item := range a.Content { + y, err := NewServer(item, compiler.NewContext("servers", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Servers = append(x.Servers, y) + } + } + } + // repeated ParameterOrReference parameters = 13; + v13 := compiler.MapValueForKey(m, "parameters") + if v13 != nil { + // repeated ParameterOrReference + x.Parameters = make([]*ParameterOrReference, 0) + a, ok := compiler.SequenceNodeForNode(v13) + if ok { + for _, item := range a.Content { + y, err := NewParameterOrReference(item, compiler.NewContext("parameters", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Parameters = append(x.Parameters, y) + } + } + } + // repeated NamedAny specification_extension = 14; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewPaths creates an object of type Paths if possible, returning an error if not. +func NewPaths(in *yaml.Node, context *compiler.Context) (*Paths, error) { + errors := make([]error, 0) + x := &Paths{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{} + allowedPatterns := []*regexp.Regexp{pattern2, pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated NamedPathItem path = 1; + // MAP: PathItem ^/ + x.Path = make([]*NamedPathItem, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "/") { + pair := &NamedPathItem{} + pair.Name = k + var err error + pair.Value, err = NewPathItem(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.Path = append(x.Path, pair) + } + } + } + // repeated NamedAny specification_extension = 2; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewProperties creates an object of type Properties if possible, returning an error if not. +func NewProperties(in *yaml.Node, context *compiler.Context) (*Properties, error) { + errors := make([]error, 0) + x := &Properties{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchemaOrReference additional_properties = 1; + // MAP: SchemaOrReference + x.AdditionalProperties = make([]*NamedSchemaOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSchemaOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSchemaOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewReference creates an object of type Reference if possible, returning an error if not. +func NewReference(in *yaml.Node, context *compiler.Context) (*Reference, error) { + errors := make([]error, 0) + x := &Reference{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"$ref"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string _ref = 1; + v1 := compiler.MapValueForKey(m, "$ref") + if v1 != nil { + x.XRef, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for $ref: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string summary = 2; + v2 := compiler.MapValueForKey(m, "summary") + if v2 != nil { + x.Summary, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for summary: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewRequestBodiesOrReferences creates an object of type RequestBodiesOrReferences if possible, returning an error if not. +func NewRequestBodiesOrReferences(in *yaml.Node, context *compiler.Context) (*RequestBodiesOrReferences, error) { + errors := make([]error, 0) + x := &RequestBodiesOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedRequestBodyOrReference additional_properties = 1; + // MAP: RequestBodyOrReference + x.AdditionalProperties = make([]*NamedRequestBodyOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedRequestBodyOrReference{} + pair.Name = k + var err error + pair.Value, err = NewRequestBodyOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewRequestBody creates an object of type RequestBody if possible, returning an error if not. +func NewRequestBody(in *yaml.Node, context *compiler.Context) (*RequestBody, error) { + errors := make([]error, 0) + x := &RequestBody{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"content"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"content", "description", "required"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // MediaTypes content = 2; + v2 := compiler.MapValueForKey(m, "content") + if v2 != nil { + var err error + x.Content, err = NewMediaTypes(v2, compiler.NewContext("content", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // bool required = 3; + v3 := compiler.MapValueForKey(m, "required") + if v3 != nil { + x.Required, ok = compiler.BoolForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewRequestBodyOrReference creates an object of type RequestBodyOrReference if possible, returning an error if not. +func NewRequestBodyOrReference(in *yaml.Node, context *compiler.Context) (*RequestBodyOrReference, error) { + errors := make([]error, 0) + x := &RequestBodyOrReference{} + matched := false + // RequestBody request_body = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewRequestBody(m, compiler.NewContext("requestBody", m, context)) + if matchingError == nil { + x.Oneof = &RequestBodyOrReference_RequestBody{RequestBody: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &RequestBodyOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid RequestBodyOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponse creates an object of type Response if possible, returning an error if not. +func NewResponse(in *yaml.Node, context *compiler.Context) (*Response, error) { + errors := make([]error, 0) + x := &Response{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"description"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"content", "description", "headers", "links"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string description = 1; + v1 := compiler.MapValueForKey(m, "description") + if v1 != nil { + x.Description, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // HeadersOrReferences headers = 2; + v2 := compiler.MapValueForKey(m, "headers") + if v2 != nil { + var err error + x.Headers, err = NewHeadersOrReferences(v2, compiler.NewContext("headers", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // MediaTypes content = 3; + v3 := compiler.MapValueForKey(m, "content") + if v3 != nil { + var err error + x.Content, err = NewMediaTypes(v3, compiler.NewContext("content", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // LinksOrReferences links = 4; + v4 := compiler.MapValueForKey(m, "links") + if v4 != nil { + var err error + x.Links, err = NewLinksOrReferences(v4, compiler.NewContext("links", v4, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 5; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponseOrReference creates an object of type ResponseOrReference if possible, returning an error if not. +func NewResponseOrReference(in *yaml.Node, context *compiler.Context) (*ResponseOrReference, error) { + errors := make([]error, 0) + x := &ResponseOrReference{} + matched := false + // Response response = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewResponse(m, compiler.NewContext("response", m, context)) + if matchingError == nil { + x.Oneof = &ResponseOrReference_Response{Response: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &ResponseOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid ResponseOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponses creates an object of type Responses if possible, returning an error if not. +func NewResponses(in *yaml.Node, context *compiler.Context) (*Responses, error) { + errors := make([]error, 0) + x := &Responses{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"default"} + allowedPatterns := []*regexp.Regexp{pattern3, pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // ResponseOrReference default = 1; + v1 := compiler.MapValueForKey(m, "default") + if v1 != nil { + var err error + x.Default, err = NewResponseOrReference(v1, compiler.NewContext("default", v1, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedResponseOrReference response_or_reference = 2; + // MAP: ResponseOrReference ^([0-9X]{3})$ + x.ResponseOrReference = make([]*NamedResponseOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if pattern3.MatchString(k) { + pair := &NamedResponseOrReference{} + pair.Name = k + var err error + pair.Value, err = NewResponseOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.ResponseOrReference = append(x.ResponseOrReference, pair) + } + } + } + // repeated NamedAny specification_extension = 3; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewResponsesOrReferences creates an object of type ResponsesOrReferences if possible, returning an error if not. +func NewResponsesOrReferences(in *yaml.Node, context *compiler.Context) (*ResponsesOrReferences, error) { + errors := make([]error, 0) + x := &ResponsesOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedResponseOrReference additional_properties = 1; + // MAP: ResponseOrReference + x.AdditionalProperties = make([]*NamedResponseOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedResponseOrReference{} + pair.Name = k + var err error + pair.Value, err = NewResponseOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchema creates an object of type Schema if possible, returning an error if not. +func NewSchema(in *yaml.Node, context *compiler.Context) (*Schema, error) { + errors := make([]error, 0) + x := &Schema{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"additionalProperties", "allOf", "anyOf", "default", "deprecated", "description", "discriminator", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "externalDocs", "format", "items", "maxItems", "maxLength", "maxProperties", "maximum", "minItems", "minLength", "minProperties", "minimum", "multipleOf", "not", "nullable", "oneOf", "pattern", "properties", "readOnly", "required", "title", "type", "uniqueItems", "writeOnly", "xml"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // bool nullable = 1; + v1 := compiler.MapValueForKey(m, "nullable") + if v1 != nil { + x.Nullable, ok = compiler.BoolForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for nullable: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Discriminator discriminator = 2; + v2 := compiler.MapValueForKey(m, "discriminator") + if v2 != nil { + var err error + x.Discriminator, err = NewDiscriminator(v2, compiler.NewContext("discriminator", v2, context)) + if err != nil { + errors = append(errors, err) + } + } + // bool read_only = 3; + v3 := compiler.MapValueForKey(m, "readOnly") + if v3 != nil { + x.ReadOnly, ok = compiler.BoolForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for readOnly: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool write_only = 4; + v4 := compiler.MapValueForKey(m, "writeOnly") + if v4 != nil { + x.WriteOnly, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for writeOnly: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // Xml xml = 5; + v5 := compiler.MapValueForKey(m, "xml") + if v5 != nil { + var err error + x.Xml, err = NewXml(v5, compiler.NewContext("xml", v5, context)) + if err != nil { + errors = append(errors, err) + } + } + // ExternalDocs external_docs = 6; + v6 := compiler.MapValueForKey(m, "externalDocs") + if v6 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v6, compiler.NewContext("externalDocs", v6, context)) + if err != nil { + errors = append(errors, err) + } + } + // Any example = 7; + v7 := compiler.MapValueForKey(m, "example") + if v7 != nil { + var err error + x.Example, err = NewAny(v7, compiler.NewContext("example", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // bool deprecated = 8; + v8 := compiler.MapValueForKey(m, "deprecated") + if v8 != nil { + x.Deprecated, ok = compiler.BoolForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for deprecated: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string title = 9; + v9 := compiler.MapValueForKey(m, "title") + if v9 != nil { + x.Title, ok = compiler.StringForScalarNode(v9) + if !ok { + message := fmt.Sprintf("has unexpected value for title: %s", compiler.Display(v9)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float multiple_of = 10; + v10 := compiler.MapValueForKey(m, "multipleOf") + if v10 != nil { + v, ok := compiler.FloatForScalarNode(v10) + if ok { + x.MultipleOf = v + } else { + message := fmt.Sprintf("has unexpected value for multipleOf: %s", compiler.Display(v10)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float maximum = 11; + v11 := compiler.MapValueForKey(m, "maximum") + if v11 != nil { + v, ok := compiler.FloatForScalarNode(v11) + if ok { + x.Maximum = v + } else { + message := fmt.Sprintf("has unexpected value for maximum: %s", compiler.Display(v11)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_maximum = 12; + v12 := compiler.MapValueForKey(m, "exclusiveMaximum") + if v12 != nil { + x.ExclusiveMaximum, ok = compiler.BoolForScalarNode(v12) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %s", compiler.Display(v12)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // float minimum = 13; + v13 := compiler.MapValueForKey(m, "minimum") + if v13 != nil { + v, ok := compiler.FloatForScalarNode(v13) + if ok { + x.Minimum = v + } else { + message := fmt.Sprintf("has unexpected value for minimum: %s", compiler.Display(v13)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool exclusive_minimum = 14; + v14 := compiler.MapValueForKey(m, "exclusiveMinimum") + if v14 != nil { + x.ExclusiveMinimum, ok = compiler.BoolForScalarNode(v14) + if !ok { + message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %s", compiler.Display(v14)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_length = 15; + v15 := compiler.MapValueForKey(m, "maxLength") + if v15 != nil { + t, ok := compiler.IntForScalarNode(v15) + if ok { + x.MaxLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxLength: %s", compiler.Display(v15)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_length = 16; + v16 := compiler.MapValueForKey(m, "minLength") + if v16 != nil { + t, ok := compiler.IntForScalarNode(v16) + if ok { + x.MinLength = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minLength: %s", compiler.Display(v16)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string pattern = 17; + v17 := compiler.MapValueForKey(m, "pattern") + if v17 != nil { + x.Pattern, ok = compiler.StringForScalarNode(v17) + if !ok { + message := fmt.Sprintf("has unexpected value for pattern: %s", compiler.Display(v17)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_items = 18; + v18 := compiler.MapValueForKey(m, "maxItems") + if v18 != nil { + t, ok := compiler.IntForScalarNode(v18) + if ok { + x.MaxItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxItems: %s", compiler.Display(v18)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_items = 19; + v19 := compiler.MapValueForKey(m, "minItems") + if v19 != nil { + t, ok := compiler.IntForScalarNode(v19) + if ok { + x.MinItems = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minItems: %s", compiler.Display(v19)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool unique_items = 20; + v20 := compiler.MapValueForKey(m, "uniqueItems") + if v20 != nil { + x.UniqueItems, ok = compiler.BoolForScalarNode(v20) + if !ok { + message := fmt.Sprintf("has unexpected value for uniqueItems: %s", compiler.Display(v20)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 max_properties = 21; + v21 := compiler.MapValueForKey(m, "maxProperties") + if v21 != nil { + t, ok := compiler.IntForScalarNode(v21) + if ok { + x.MaxProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for maxProperties: %s", compiler.Display(v21)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // int64 min_properties = 22; + v22 := compiler.MapValueForKey(m, "minProperties") + if v22 != nil { + t, ok := compiler.IntForScalarNode(v22) + if ok { + x.MinProperties = int64(t) + } else { + message := fmt.Sprintf("has unexpected value for minProperties: %s", compiler.Display(v22)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated string required = 23; + v23 := compiler.MapValueForKey(m, "required") + if v23 != nil { + v, ok := compiler.SequenceNodeForNode(v23) + if ok { + x.Required = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for required: %s", compiler.Display(v23)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated Any enum = 24; + v24 := compiler.MapValueForKey(m, "enum") + if v24 != nil { + // repeated Any + x.Enum = make([]*Any, 0) + a, ok := compiler.SequenceNodeForNode(v24) + if ok { + for _, item := range a.Content { + y, err := NewAny(item, compiler.NewContext("enum", item, context)) + if err != nil { + errors = append(errors, err) + } + x.Enum = append(x.Enum, y) + } + } + } + // string type = 25; + v25 := compiler.MapValueForKey(m, "type") + if v25 != nil { + x.Type, ok = compiler.StringForScalarNode(v25) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v25)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated SchemaOrReference all_of = 26; + v26 := compiler.MapValueForKey(m, "allOf") + if v26 != nil { + // repeated SchemaOrReference + x.AllOf = make([]*SchemaOrReference, 0) + a, ok := compiler.SequenceNodeForNode(v26) + if ok { + for _, item := range a.Content { + y, err := NewSchemaOrReference(item, compiler.NewContext("allOf", item, context)) + if err != nil { + errors = append(errors, err) + } + x.AllOf = append(x.AllOf, y) + } + } + } + // repeated SchemaOrReference one_of = 27; + v27 := compiler.MapValueForKey(m, "oneOf") + if v27 != nil { + // repeated SchemaOrReference + x.OneOf = make([]*SchemaOrReference, 0) + a, ok := compiler.SequenceNodeForNode(v27) + if ok { + for _, item := range a.Content { + y, err := NewSchemaOrReference(item, compiler.NewContext("oneOf", item, context)) + if err != nil { + errors = append(errors, err) + } + x.OneOf = append(x.OneOf, y) + } + } + } + // repeated SchemaOrReference any_of = 28; + v28 := compiler.MapValueForKey(m, "anyOf") + if v28 != nil { + // repeated SchemaOrReference + x.AnyOf = make([]*SchemaOrReference, 0) + a, ok := compiler.SequenceNodeForNode(v28) + if ok { + for _, item := range a.Content { + y, err := NewSchemaOrReference(item, compiler.NewContext("anyOf", item, context)) + if err != nil { + errors = append(errors, err) + } + x.AnyOf = append(x.AnyOf, y) + } + } + } + // Schema not = 29; + v29 := compiler.MapValueForKey(m, "not") + if v29 != nil { + var err error + x.Not, err = NewSchema(v29, compiler.NewContext("not", v29, context)) + if err != nil { + errors = append(errors, err) + } + } + // ItemsItem items = 30; + v30 := compiler.MapValueForKey(m, "items") + if v30 != nil { + var err error + x.Items, err = NewItemsItem(v30, compiler.NewContext("items", v30, context)) + if err != nil { + errors = append(errors, err) + } + } + // Properties properties = 31; + v31 := compiler.MapValueForKey(m, "properties") + if v31 != nil { + var err error + x.Properties, err = NewProperties(v31, compiler.NewContext("properties", v31, context)) + if err != nil { + errors = append(errors, err) + } + } + // AdditionalPropertiesItem additional_properties = 32; + v32 := compiler.MapValueForKey(m, "additionalProperties") + if v32 != nil { + var err error + x.AdditionalProperties, err = NewAdditionalPropertiesItem(v32, compiler.NewContext("additionalProperties", v32, context)) + if err != nil { + errors = append(errors, err) + } + } + // DefaultType default = 33; + v33 := compiler.MapValueForKey(m, "default") + if v33 != nil { + var err error + x.Default, err = NewDefaultType(v33, compiler.NewContext("default", v33, context)) + if err != nil { + errors = append(errors, err) + } + } + // string description = 34; + v34 := compiler.MapValueForKey(m, "description") + if v34 != nil { + x.Description, ok = compiler.StringForScalarNode(v34) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v34)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string format = 35; + v35 := compiler.MapValueForKey(m, "format") + if v35 != nil { + x.Format, ok = compiler.StringForScalarNode(v35) + if !ok { + message := fmt.Sprintf("has unexpected value for format: %s", compiler.Display(v35)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 36; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemaOrReference creates an object of type SchemaOrReference if possible, returning an error if not. +func NewSchemaOrReference(in *yaml.Node, context *compiler.Context) (*SchemaOrReference, error) { + errors := make([]error, 0) + x := &SchemaOrReference{} + matched := false + // Schema schema = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSchema(m, compiler.NewContext("schema", m, context)) + if matchingError == nil { + x.Oneof = &SchemaOrReference_Schema{Schema: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &SchemaOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid SchemaOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSchemasOrReferences creates an object of type SchemasOrReferences if possible, returning an error if not. +func NewSchemasOrReferences(in *yaml.Node, context *compiler.Context) (*SchemasOrReferences, error) { + errors := make([]error, 0) + x := &SchemasOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSchemaOrReference additional_properties = 1; + // MAP: SchemaOrReference + x.AdditionalProperties = make([]*NamedSchemaOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSchemaOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSchemaOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityRequirement creates an object of type SecurityRequirement if possible, returning an error if not. +func NewSecurityRequirement(in *yaml.Node, context *compiler.Context) (*SecurityRequirement, error) { + errors := make([]error, 0) + x := &SecurityRequirement{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedStringArray additional_properties = 1; + // MAP: StringArray + x.AdditionalProperties = make([]*NamedStringArray, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedStringArray{} + pair.Name = k + var err error + pair.Value, err = NewStringArray(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecurityScheme creates an object of type SecurityScheme if possible, returning an error if not. +func NewSecurityScheme(in *yaml.Node, context *compiler.Context) (*SecurityScheme, error) { + errors := make([]error, 0) + x := &SecurityScheme{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"type"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"bearerFormat", "description", "flows", "in", "name", "openIdConnectUrl", "scheme", "type"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string type = 1; + v1 := compiler.MapValueForKey(m, "type") + if v1 != nil { + x.Type, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for type: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string name = 3; + v3 := compiler.MapValueForKey(m, "name") + if v3 != nil { + x.Name, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string in = 4; + v4 := compiler.MapValueForKey(m, "in") + if v4 != nil { + x.In, ok = compiler.StringForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for in: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string scheme = 5; + v5 := compiler.MapValueForKey(m, "scheme") + if v5 != nil { + x.Scheme, ok = compiler.StringForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for scheme: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string bearer_format = 6; + v6 := compiler.MapValueForKey(m, "bearerFormat") + if v6 != nil { + x.BearerFormat, ok = compiler.StringForScalarNode(v6) + if !ok { + message := fmt.Sprintf("has unexpected value for bearerFormat: %s", compiler.Display(v6)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // OauthFlows flows = 7; + v7 := compiler.MapValueForKey(m, "flows") + if v7 != nil { + var err error + x.Flows, err = NewOauthFlows(v7, compiler.NewContext("flows", v7, context)) + if err != nil { + errors = append(errors, err) + } + } + // string open_id_connect_url = 8; + v8 := compiler.MapValueForKey(m, "openIdConnectUrl") + if v8 != nil { + x.OpenIdConnectUrl, ok = compiler.StringForScalarNode(v8) + if !ok { + message := fmt.Sprintf("has unexpected value for openIdConnectUrl: %s", compiler.Display(v8)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 9; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecuritySchemeOrReference creates an object of type SecuritySchemeOrReference if possible, returning an error if not. +func NewSecuritySchemeOrReference(in *yaml.Node, context *compiler.Context) (*SecuritySchemeOrReference, error) { + errors := make([]error, 0) + x := &SecuritySchemeOrReference{} + matched := false + // SecurityScheme security_scheme = 1; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewSecurityScheme(m, compiler.NewContext("securityScheme", m, context)) + if matchingError == nil { + x.Oneof = &SecuritySchemeOrReference_SecurityScheme{SecurityScheme: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + // Reference reference = 2; + { + m, ok := compiler.UnpackMap(in) + if ok { + // errors might be ok here, they mean we just don't have the right subtype + t, matchingError := NewReference(m, compiler.NewContext("reference", m, context)) + if matchingError == nil { + x.Oneof = &SecuritySchemeOrReference_Reference{Reference: t} + matched = true + } else { + errors = append(errors, matchingError) + } + } + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } else { + message := fmt.Sprintf("contains an invalid SecuritySchemeOrReference") + err := compiler.NewError(context, message) + errors = []error{err} + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSecuritySchemesOrReferences creates an object of type SecuritySchemesOrReferences if possible, returning an error if not. +func NewSecuritySchemesOrReferences(in *yaml.Node, context *compiler.Context) (*SecuritySchemesOrReferences, error) { + errors := make([]error, 0) + x := &SecuritySchemesOrReferences{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedSecuritySchemeOrReference additional_properties = 1; + // MAP: SecuritySchemeOrReference + x.AdditionalProperties = make([]*NamedSecuritySchemeOrReference, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedSecuritySchemeOrReference{} + pair.Name = k + var err error + pair.Value, err = NewSecuritySchemeOrReference(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewServer creates an object of type Server if possible, returning an error if not. +func NewServer(in *yaml.Node, context *compiler.Context) (*Server, error) { + errors := make([]error, 0) + x := &Server{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"url"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "url", "variables"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string url = 1; + v1 := compiler.MapValueForKey(m, "url") + if v1 != nil { + x.Url, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for url: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ServerVariables variables = 3; + v3 := compiler.MapValueForKey(m, "variables") + if v3 != nil { + var err error + x.Variables, err = NewServerVariables(v3, compiler.NewContext("variables", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewServerVariable creates an object of type ServerVariable if possible, returning an error if not. +func NewServerVariable(in *yaml.Node, context *compiler.Context) (*ServerVariable, error) { + errors := make([]error, 0) + x := &ServerVariable{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"default"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"default", "description", "enum"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // repeated string enum = 1; + v1 := compiler.MapValueForKey(m, "enum") + if v1 != nil { + v, ok := compiler.SequenceNodeForNode(v1) + if ok { + x.Enum = compiler.StringArrayForSequenceNode(v) + } else { + message := fmt.Sprintf("has unexpected value for enum: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string default = 2; + v2 := compiler.MapValueForKey(m, "default") + if v2 != nil { + x.Default, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for default: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 3; + v3 := compiler.MapValueForKey(m, "description") + if v3 != nil { + x.Description, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewServerVariables creates an object of type ServerVariables if possible, returning an error if not. +func NewServerVariables(in *yaml.Node, context *compiler.Context) (*ServerVariables, error) { + errors := make([]error, 0) + x := &ServerVariables{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedServerVariable additional_properties = 1; + // MAP: ServerVariable + x.AdditionalProperties = make([]*NamedServerVariable, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedServerVariable{} + pair.Name = k + var err error + pair.Value, err = NewServerVariable(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewSpecificationExtension creates an object of type SpecificationExtension if possible, returning an error if not. +func NewSpecificationExtension(in *yaml.Node, context *compiler.Context) (*SpecificationExtension, error) { + errors := make([]error, 0) + x := &SpecificationExtension{} + matched := false + switch in.Tag { + case "!!bool": + var v bool + v, matched = compiler.BoolForScalarNode(in) + x.Oneof = &SpecificationExtension_Boolean{Boolean: v} + case "!!str": + var v string + v, matched = compiler.StringForScalarNode(in) + x.Oneof = &SpecificationExtension_String_{String_: v} + case "!!float": + var v float64 + v, matched = compiler.FloatForScalarNode(in) + x.Oneof = &SpecificationExtension_Number{Number: v} + case "!!int": + var v int64 + v, matched = compiler.IntForScalarNode(in) + x.Oneof = &SpecificationExtension_Number{Number: float64(v)} + } + if matched { + // since the oneof matched one of its possibilities, discard any matching errors + errors = make([]error, 0) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStringArray creates an object of type StringArray if possible, returning an error if not. +func NewStringArray(in *yaml.Node, context *compiler.Context) (*StringArray, error) { + errors := make([]error, 0) + x := &StringArray{} + x.Value = make([]string, 0) + for _, node := range in.Content { + s, _ := compiler.StringForScalarNode(node) + x.Value = append(x.Value, s) + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewStrings creates an object of type Strings if possible, returning an error if not. +func NewStrings(in *yaml.Node, context *compiler.Context) (*Strings, error) { + errors := make([]error, 0) + x := &Strings{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + // repeated NamedString additional_properties = 1; + // MAP: string + x.AdditionalProperties = make([]*NamedString, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + pair := &NamedString{} + pair.Name = k + pair.Value, _ = compiler.StringForScalarNode(v) + x.AdditionalProperties = append(x.AdditionalProperties, pair) + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewTag creates an object of type Tag if possible, returning an error if not. +func NewTag(in *yaml.Node, context *compiler.Context) (*Tag, error) { + errors := make([]error, 0) + x := &Tag{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + requiredKeys := []string{"name"} + missingKeys := compiler.MissingKeysInMap(m, requiredKeys) + if len(missingKeys) > 0 { + message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + allowedKeys := []string{"description", "externalDocs", "name"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string description = 2; + v2 := compiler.MapValueForKey(m, "description") + if v2 != nil { + x.Description, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for description: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // ExternalDocs external_docs = 3; + v3 := compiler.MapValueForKey(m, "externalDocs") + if v3 != nil { + var err error + x.ExternalDocs, err = NewExternalDocs(v3, compiler.NewContext("externalDocs", v3, context)) + if err != nil { + errors = append(errors, err) + } + } + // repeated NamedAny specification_extension = 4; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// NewXml creates an object of type Xml if possible, returning an error if not. +func NewXml(in *yaml.Node, context *compiler.Context) (*Xml, error) { + errors := make([]error, 0) + x := &Xml{} + m, ok := compiler.UnpackMap(in) + if !ok { + message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) + errors = append(errors, compiler.NewError(context, message)) + } else { + allowedKeys := []string{"attribute", "name", "namespace", "prefix", "wrapped"} + allowedPatterns := []*regexp.Regexp{pattern1} + invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) + if len(invalidKeys) > 0 { + message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) + errors = append(errors, compiler.NewError(context, message)) + } + // string name = 1; + v1 := compiler.MapValueForKey(m, "name") + if v1 != nil { + x.Name, ok = compiler.StringForScalarNode(v1) + if !ok { + message := fmt.Sprintf("has unexpected value for name: %s", compiler.Display(v1)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string namespace = 2; + v2 := compiler.MapValueForKey(m, "namespace") + if v2 != nil { + x.Namespace, ok = compiler.StringForScalarNode(v2) + if !ok { + message := fmt.Sprintf("has unexpected value for namespace: %s", compiler.Display(v2)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // string prefix = 3; + v3 := compiler.MapValueForKey(m, "prefix") + if v3 != nil { + x.Prefix, ok = compiler.StringForScalarNode(v3) + if !ok { + message := fmt.Sprintf("has unexpected value for prefix: %s", compiler.Display(v3)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool attribute = 4; + v4 := compiler.MapValueForKey(m, "attribute") + if v4 != nil { + x.Attribute, ok = compiler.BoolForScalarNode(v4) + if !ok { + message := fmt.Sprintf("has unexpected value for attribute: %s", compiler.Display(v4)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // bool wrapped = 5; + v5 := compiler.MapValueForKey(m, "wrapped") + if v5 != nil { + x.Wrapped, ok = compiler.BoolForScalarNode(v5) + if !ok { + message := fmt.Sprintf("has unexpected value for wrapped: %s", compiler.Display(v5)) + errors = append(errors, compiler.NewError(context, message)) + } + } + // repeated NamedAny specification_extension = 6; + // MAP: Any ^x- + x.SpecificationExtension = make([]*NamedAny, 0) + for i := 0; i < len(m.Content); i += 2 { + k, ok := compiler.StringForScalarNode(m.Content[i]) + if ok { + v := m.Content[i+1] + if strings.HasPrefix(k, "x-") { + pair := &NamedAny{} + pair.Name = k + result := &Any{} + handled, resultFromExt, err := compiler.CallExtension(context, v, k) + if handled { + if err != nil { + errors = append(errors, err) + } else { + bytes := compiler.Marshal(v) + result.Yaml = string(bytes) + result.Value = resultFromExt + pair.Value = result + } + } else { + pair.Value, err = NewAny(v, compiler.NewContext(k, v, context)) + if err != nil { + errors = append(errors, err) + } + } + x.SpecificationExtension = append(x.SpecificationExtension, pair) + } + } + } + } + return x, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside AdditionalPropertiesItem objects. +func (m *AdditionalPropertiesItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*AdditionalPropertiesItem_SchemaOrReference) + if ok { + _, err := p.SchemaOrReference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Any objects. +func (m *Any) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside AnyOrExpression objects. +func (m *AnyOrExpression) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*AnyOrExpression_Any) + if ok { + _, err := p.Any.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*AnyOrExpression_Expression) + if ok { + _, err := p.Expression.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Callback objects. +func (m *Callback) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.Path { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside CallbackOrReference objects. +func (m *CallbackOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*CallbackOrReference_Callback) + if ok { + _, err := p.Callback.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*CallbackOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside CallbacksOrReferences objects. +func (m *CallbacksOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Components objects. +func (m *Components) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schemas != nil { + _, err := m.Schemas.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Parameters != nil { + _, err := m.Parameters.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.RequestBodies != nil { + _, err := m.RequestBodies.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Headers != nil { + _, err := m.Headers.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.SecuritySchemes != nil { + _, err := m.SecuritySchemes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Links != nil { + _, err := m.Links.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Callbacks != nil { + _, err := m.Callbacks.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Contact objects. +func (m *Contact) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside DefaultType objects. +func (m *DefaultType) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Discriminator objects. +func (m *Discriminator) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Mapping != nil { + _, err := m.Mapping.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Document objects. +func (m *Document) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Info != nil { + _, err := m.Info.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Servers { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Paths != nil { + _, err := m.Paths.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Components != nil { + _, err := m.Components.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.Tags { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Encoding objects. +func (m *Encoding) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Headers != nil { + _, err := m.Headers.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Encodings objects. +func (m *Encodings) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Example objects. +func (m *Example) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ExampleOrReference objects. +func (m *ExampleOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ExampleOrReference_Example) + if ok { + _, err := p.Example.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ExampleOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ExamplesOrReferences objects. +func (m *ExamplesOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Expression objects. +func (m *Expression) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ExternalDocs objects. +func (m *ExternalDocs) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Header objects. +func (m *Header) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Content != nil { + _, err := m.Content.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside HeaderOrReference objects. +func (m *HeaderOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*HeaderOrReference_Header) + if ok { + _, err := p.Header.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*HeaderOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside HeadersOrReferences objects. +func (m *HeadersOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Info objects. +func (m *Info) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Contact != nil { + _, err := m.Contact.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.License != nil { + _, err := m.License.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ItemsItem objects. +func (m *ItemsItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SchemaOrReference { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside License objects. +func (m *License) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Link objects. +func (m *Link) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Parameters != nil { + _, err := m.Parameters.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.RequestBody != nil { + _, err := m.RequestBody.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Server != nil { + _, err := m.Server.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside LinkOrReference objects. +func (m *LinkOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*LinkOrReference_Link) + if ok { + _, err := p.Link.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*LinkOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside LinksOrReferences objects. +func (m *LinksOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside MediaType objects. +func (m *MediaType) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Encoding != nil { + _, err := m.Encoding.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside MediaTypes objects. +func (m *MediaTypes) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedAny objects. +func (m *NamedAny) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedCallbackOrReference objects. +func (m *NamedCallbackOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedEncoding objects. +func (m *NamedEncoding) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedExampleOrReference objects. +func (m *NamedExampleOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedHeaderOrReference objects. +func (m *NamedHeaderOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedLinkOrReference objects. +func (m *NamedLinkOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedMediaType objects. +func (m *NamedMediaType) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedParameterOrReference objects. +func (m *NamedParameterOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedPathItem objects. +func (m *NamedPathItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedRequestBodyOrReference objects. +func (m *NamedRequestBodyOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedResponseOrReference objects. +func (m *NamedResponseOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSchemaOrReference objects. +func (m *NamedSchemaOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedSecuritySchemeOrReference objects. +func (m *NamedSecuritySchemeOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedServerVariable objects. +func (m *NamedServerVariable) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedString objects. +func (m *NamedString) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside NamedStringArray objects. +func (m *NamedStringArray) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Value != nil { + _, err := m.Value.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside OauthFlow objects. +func (m *OauthFlow) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Scopes != nil { + _, err := m.Scopes.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside OauthFlows objects. +func (m *OauthFlows) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Implicit != nil { + _, err := m.Implicit.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Password != nil { + _, err := m.Password.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ClientCredentials != nil { + _, err := m.ClientCredentials.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.AuthorizationCode != nil { + _, err := m.AuthorizationCode.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Object objects. +func (m *Object) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Operation objects. +func (m *Operation) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.RequestBody != nil { + _, err := m.RequestBody.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Responses != nil { + _, err := m.Responses.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Callbacks != nil { + _, err := m.Callbacks.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Security { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.Servers { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Parameter objects. +func (m *Parameter) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Schema != nil { + _, err := m.Schema.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Examples != nil { + _, err := m.Examples.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Content != nil { + _, err := m.Content.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParameterOrReference objects. +func (m *ParameterOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ParameterOrReference_Parameter) + if ok { + _, err := p.Parameter.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ParameterOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ParametersOrReferences objects. +func (m *ParametersOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside PathItem objects. +func (m *PathItem) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewPathItem(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + if m.Get != nil { + _, err := m.Get.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Put != nil { + _, err := m.Put.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Post != nil { + _, err := m.Post.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Delete != nil { + _, err := m.Delete.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Options != nil { + _, err := m.Options.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Head != nil { + _, err := m.Head.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Patch != nil { + _, err := m.Patch.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Trace != nil { + _, err := m.Trace.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Servers { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.Parameters { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Paths objects. +func (m *Paths) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.Path { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Properties objects. +func (m *Properties) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Reference objects. +func (m *Reference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.XRef != "" { + info, err := compiler.ReadInfoForRef(root, m.XRef) + if err != nil { + return nil, err + } + if info != nil { + replacement, err := NewReference(info, nil) + if err == nil { + *m = *replacement + return m.ResolveReferences(root) + } + } + return info, nil + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside RequestBodiesOrReferences objects. +func (m *RequestBodiesOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside RequestBody objects. +func (m *RequestBody) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Content != nil { + _, err := m.Content.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside RequestBodyOrReference objects. +func (m *RequestBodyOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*RequestBodyOrReference_RequestBody) + if ok { + _, err := p.RequestBody.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*RequestBodyOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Response objects. +func (m *Response) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Headers != nil { + _, err := m.Headers.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Content != nil { + _, err := m.Content.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Links != nil { + _, err := m.Links.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponseOrReference objects. +func (m *ResponseOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*ResponseOrReference_Response) + if ok { + _, err := p.Response.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*ResponseOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Responses objects. +func (m *Responses) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.ResponseOrReference { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ResponsesOrReferences objects. +func (m *ResponsesOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Schema objects. +func (m *Schema) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Discriminator != nil { + _, err := m.Discriminator.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Xml != nil { + _, err := m.Xml.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Example != nil { + _, err := m.Example.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.Enum { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.AllOf { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.OneOf { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + for _, item := range m.AnyOf { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + if m.Not != nil { + _, err := m.Not.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Items != nil { + _, err := m.Items.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Properties != nil { + _, err := m.Properties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.AdditionalProperties != nil { + _, err := m.AdditionalProperties.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + if m.Default != nil { + _, err := m.Default.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SchemaOrReference objects. +func (m *SchemaOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SchemaOrReference_Schema) + if ok { + _, err := p.Schema.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SchemaOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SchemasOrReferences objects. +func (m *SchemasOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityRequirement objects. +func (m *SecurityRequirement) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecurityScheme objects. +func (m *SecurityScheme) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Flows != nil { + _, err := m.Flows.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecuritySchemeOrReference objects. +func (m *SecuritySchemeOrReference) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + { + p, ok := m.Oneof.(*SecuritySchemeOrReference_SecurityScheme) + if ok { + _, err := p.SecurityScheme.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + { + p, ok := m.Oneof.(*SecuritySchemeOrReference_Reference) + if ok { + _, err := p.Reference.ResolveReferences(root) + if err != nil { + return nil, err + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SecuritySchemesOrReferences objects. +func (m *SecuritySchemesOrReferences) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Server objects. +func (m *Server) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.Variables != nil { + _, err := m.Variables.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ServerVariable objects. +func (m *ServerVariable) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside ServerVariables objects. +func (m *ServerVariables) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside SpecificationExtension objects. +func (m *SpecificationExtension) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside StringArray objects. +func (m *StringArray) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Strings objects. +func (m *Strings) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.AdditionalProperties { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Tag objects. +func (m *Tag) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + if m.ExternalDocs != nil { + _, err := m.ExternalDocs.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ResolveReferences resolves references found inside Xml objects. +func (m *Xml) ResolveReferences(root string) (*yaml.Node, error) { + errors := make([]error, 0) + for _, item := range m.SpecificationExtension { + if item != nil { + _, err := item.ResolveReferences(root) + if err != nil { + errors = append(errors, err) + } + } + } + return nil, compiler.NewErrorGroupOrNil(errors) +} + +// ToRawInfo returns a description of AdditionalPropertiesItem suitable for JSON or YAML export. +func (m *AdditionalPropertiesItem) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // AdditionalPropertiesItem + // {Name:schemaOrReference Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchemaOrReference() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return compiler.NewScalarNodeForBool(v1.Boolean) + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Any suitable for JSON or YAML export. +func (m *Any) ToRawInfo() *yaml.Node { + var err error + var node yaml.Node + err = yaml.Unmarshal([]byte(m.Yaml), &node) + if err == nil { + if node.Kind == yaml.DocumentNode { + return node.Content[0] + } + return &node + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of AnyOrExpression suitable for JSON or YAML export. +func (m *AnyOrExpression) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // AnyOrExpression + // {Name:any Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetAny() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:expression Type:Expression StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetExpression() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Callback suitable for JSON or YAML export. +func (m *Callback) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Path != nil { + for _, item := range m.Path { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of CallbackOrReference suitable for JSON or YAML export. +func (m *CallbackOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // CallbackOrReference + // {Name:callback Type:Callback StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetCallback() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of CallbacksOrReferences suitable for JSON or YAML export. +func (m *CallbacksOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Components suitable for JSON or YAML export. +func (m *Components) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Schemas != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schemas")) + info.Content = append(info.Content, m.Schemas.ToRawInfo()) + } + if m.Responses != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("responses")) + info.Content = append(info.Content, m.Responses.ToRawInfo()) + } + if m.Parameters != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, m.Parameters.ToRawInfo()) + } + if m.Examples != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("examples")) + info.Content = append(info.Content, m.Examples.ToRawInfo()) + } + if m.RequestBodies != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("requestBodies")) + info.Content = append(info.Content, m.RequestBodies.ToRawInfo()) + } + if m.Headers != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("headers")) + info.Content = append(info.Content, m.Headers.ToRawInfo()) + } + if m.SecuritySchemes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("securitySchemes")) + info.Content = append(info.Content, m.SecuritySchemes.ToRawInfo()) + } + if m.Links != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("links")) + info.Content = append(info.Content, m.Links.ToRawInfo()) + } + if m.Callbacks != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("callbacks")) + info.Content = append(info.Content, m.Callbacks.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Contact suitable for JSON or YAML export. +func (m *Contact) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Url != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + } + if m.Email != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("email")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Email)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of DefaultType suitable for JSON or YAML export. +func (m *DefaultType) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // DefaultType + // {Name:number Type:float StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v0, ok := m.GetOneof().(*DefaultType_Number); ok { + return compiler.NewScalarNodeForFloat(v0.Number) + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*DefaultType_Boolean); ok { + return compiler.NewScalarNodeForBool(v1.Boolean) + } + // {Name:string Type:string StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v2, ok := m.GetOneof().(*DefaultType_String_); ok { + return compiler.NewScalarNodeForString(v2.String_) + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Discriminator suitable for JSON or YAML export. +func (m *Discriminator) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("propertyName")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.PropertyName)) + if m.Mapping != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("mapping")) + info.Content = append(info.Content, m.Mapping.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Document suitable for JSON or YAML export. +func (m *Document) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("openapi")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Openapi)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("info")) + info.Content = append(info.Content, m.Info.ToRawInfo()) + if len(m.Servers) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Servers { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("servers")) + info.Content = append(info.Content, items) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("paths")) + info.Content = append(info.Content, m.Paths.ToRawInfo()) + if m.Components != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("components")) + info.Content = append(info.Content, m.Components.ToRawInfo()) + } + if len(m.Security) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Security { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("security")) + info.Content = append(info.Content, items) + } + if len(m.Tags) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Tags { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("tags")) + info.Content = append(info.Content, items) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Encoding suitable for JSON or YAML export. +func (m *Encoding) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.ContentType != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("contentType")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.ContentType)) + } + if m.Headers != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("headers")) + info.Content = append(info.Content, m.Headers.ToRawInfo()) + } + if m.Style != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("style")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Style)) + } + if m.Explode != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("explode")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Explode)) + } + if m.AllowReserved != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowReserved")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowReserved)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Encodings suitable for JSON or YAML export. +func (m *Encodings) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Example suitable for JSON or YAML export. +func (m *Example) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Value != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, m.Value.ToRawInfo()) + } + if m.ExternalValue != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalValue")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.ExternalValue)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ExampleOrReference suitable for JSON or YAML export. +func (m *ExampleOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // ExampleOrReference + // {Name:example Type:Example StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetExample() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of ExamplesOrReferences suitable for JSON or YAML export. +func (m *ExamplesOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Expression suitable for JSON or YAML export. +func (m *Expression) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ExternalDocs suitable for JSON or YAML export. +func (m *ExternalDocs) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Header suitable for JSON or YAML export. +func (m *Header) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.Deprecated != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) + } + if m.AllowEmptyValue != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) + } + if m.Style != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("style")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Style)) + } + if m.Explode != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("explode")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Explode)) + } + if m.AllowReserved != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowReserved")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowReserved)) + } + if m.Schema != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, m.Schema.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.Examples != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("examples")) + info.Content = append(info.Content, m.Examples.ToRawInfo()) + } + if m.Content != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("content")) + info.Content = append(info.Content, m.Content.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of HeaderOrReference suitable for JSON or YAML export. +func (m *HeaderOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // HeaderOrReference + // {Name:header Type:Header StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetHeader() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of HeadersOrReferences suitable for JSON or YAML export. +func (m *HeadersOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Info suitable for JSON or YAML export. +func (m *Info) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("title")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Title)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.TermsOfService != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("termsOfService")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TermsOfService)) + } + if m.Contact != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("contact")) + info.Content = append(info.Content, m.Contact.ToRawInfo()) + } + if m.License != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("license")) + info.Content = append(info.Content, m.License.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("version")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Version)) + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ItemsItem suitable for JSON or YAML export. +func (m *ItemsItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.SchemaOrReference) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.SchemaOrReference { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("schemaOrReference")) + info.Content = append(info.Content, items) + } + return info +} + +// ToRawInfo returns a description of License suitable for JSON or YAML export. +func (m *License) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + if m.Url != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Link suitable for JSON or YAML export. +func (m *Link) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.OperationRef != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("operationRef")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.OperationRef)) + } + if m.OperationId != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("operationId")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.OperationId)) + } + if m.Parameters != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, m.Parameters.ToRawInfo()) + } + if m.RequestBody != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("requestBody")) + info.Content = append(info.Content, m.RequestBody.ToRawInfo()) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Server != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("server")) + info.Content = append(info.Content, m.Server.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of LinkOrReference suitable for JSON or YAML export. +func (m *LinkOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // LinkOrReference + // {Name:link Type:Link StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetLink() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of LinksOrReferences suitable for JSON or YAML export. +func (m *LinksOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of MediaType suitable for JSON or YAML export. +func (m *MediaType) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Schema != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, m.Schema.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.Examples != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("examples")) + info.Content = append(info.Content, m.Examples.ToRawInfo()) + } + if m.Encoding != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("encoding")) + info.Content = append(info.Content, m.Encoding.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of MediaTypes suitable for JSON or YAML export. +func (m *MediaTypes) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of NamedAny suitable for JSON or YAML export. +func (m *NamedAny) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Value != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, m.Value.ToRawInfo()) + } + return info +} + +// ToRawInfo returns a description of NamedCallbackOrReference suitable for JSON or YAML export. +func (m *NamedCallbackOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:CallbackOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedEncoding suitable for JSON or YAML export. +func (m *NamedEncoding) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:Encoding StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedExampleOrReference suitable for JSON or YAML export. +func (m *NamedExampleOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:ExampleOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedHeaderOrReference suitable for JSON or YAML export. +func (m *NamedHeaderOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:HeaderOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedLinkOrReference suitable for JSON or YAML export. +func (m *NamedLinkOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:LinkOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedMediaType suitable for JSON or YAML export. +func (m *NamedMediaType) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:MediaType StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedParameterOrReference suitable for JSON or YAML export. +func (m *NamedParameterOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:ParameterOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedPathItem suitable for JSON or YAML export. +func (m *NamedPathItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:PathItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedRequestBodyOrReference suitable for JSON or YAML export. +func (m *NamedRequestBodyOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:RequestBodyOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedResponseOrReference suitable for JSON or YAML export. +func (m *NamedResponseOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:ResponseOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSchemaOrReference suitable for JSON or YAML export. +func (m *NamedSchemaOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:SchemaOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedSecuritySchemeOrReference suitable for JSON or YAML export. +func (m *NamedSecuritySchemeOrReference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:SecuritySchemeOrReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedServerVariable suitable for JSON or YAML export. +func (m *NamedServerVariable) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:ServerVariable StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of NamedString suitable for JSON or YAML export. +func (m *NamedString) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Value != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("value")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Value)) + } + return info +} + +// ToRawInfo returns a description of NamedStringArray suitable for JSON or YAML export. +func (m *NamedStringArray) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + // &{Name:value Type:StringArray StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} + return info +} + +// ToRawInfo returns a description of OauthFlow suitable for JSON or YAML export. +func (m *OauthFlow) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AuthorizationUrl != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("authorizationUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.AuthorizationUrl)) + } + if m.TokenUrl != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("tokenUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.TokenUrl)) + } + if m.RefreshUrl != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("refreshUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.RefreshUrl)) + } + if m.Scopes != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scopes")) + info.Content = append(info.Content, m.Scopes.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of OauthFlows suitable for JSON or YAML export. +func (m *OauthFlows) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Implicit != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("implicit")) + info.Content = append(info.Content, m.Implicit.ToRawInfo()) + } + if m.Password != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("password")) + info.Content = append(info.Content, m.Password.ToRawInfo()) + } + if m.ClientCredentials != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("clientCredentials")) + info.Content = append(info.Content, m.ClientCredentials.ToRawInfo()) + } + if m.AuthorizationCode != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("authorizationCode")) + info.Content = append(info.Content, m.AuthorizationCode.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Object suitable for JSON or YAML export. +func (m *Object) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Operation suitable for JSON or YAML export. +func (m *Operation) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.Tags) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("tags")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Tags)) + } + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.OperationId != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("operationId")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.OperationId)) + } + if len(m.Parameters) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Parameters { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, items) + } + if m.RequestBody != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("requestBody")) + info.Content = append(info.Content, m.RequestBody.ToRawInfo()) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("responses")) + info.Content = append(info.Content, m.Responses.ToRawInfo()) + if m.Callbacks != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("callbacks")) + info.Content = append(info.Content, m.Callbacks.ToRawInfo()) + } + if m.Deprecated != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) + } + if len(m.Security) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Security { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("security")) + info.Content = append(info.Content, items) + } + if len(m.Servers) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Servers { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("servers")) + info.Content = append(info.Content, items) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. +func (m *Parameter) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.Deprecated != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) + } + if m.AllowEmptyValue != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowEmptyValue")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowEmptyValue)) + } + if m.Style != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("style")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Style)) + } + if m.Explode != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("explode")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Explode)) + } + if m.AllowReserved != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("allowReserved")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.AllowReserved)) + } + if m.Schema != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("schema")) + info.Content = append(info.Content, m.Schema.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.Examples != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("examples")) + info.Content = append(info.Content, m.Examples.ToRawInfo()) + } + if m.Content != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("content")) + info.Content = append(info.Content, m.Content.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ParameterOrReference suitable for JSON or YAML export. +func (m *ParameterOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // ParameterOrReference + // {Name:parameter Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetParameter() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of ParametersOrReferences suitable for JSON or YAML export. +func (m *ParametersOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of PathItem suitable for JSON or YAML export. +func (m *PathItem) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.XRef != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("$ref")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.XRef)) + } + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Get != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("get")) + info.Content = append(info.Content, m.Get.ToRawInfo()) + } + if m.Put != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("put")) + info.Content = append(info.Content, m.Put.ToRawInfo()) + } + if m.Post != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("post")) + info.Content = append(info.Content, m.Post.ToRawInfo()) + } + if m.Delete != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("delete")) + info.Content = append(info.Content, m.Delete.ToRawInfo()) + } + if m.Options != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("options")) + info.Content = append(info.Content, m.Options.ToRawInfo()) + } + if m.Head != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("head")) + info.Content = append(info.Content, m.Head.ToRawInfo()) + } + if m.Patch != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("patch")) + info.Content = append(info.Content, m.Patch.ToRawInfo()) + } + if m.Trace != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("trace")) + info.Content = append(info.Content, m.Trace.ToRawInfo()) + } + if len(m.Servers) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Servers { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("servers")) + info.Content = append(info.Content, items) + } + if len(m.Parameters) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Parameters { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("parameters")) + info.Content = append(info.Content, items) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Paths suitable for JSON or YAML export. +func (m *Paths) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Path != nil { + for _, item := range m.Path { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Properties suitable for JSON or YAML export. +func (m *Properties) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Reference suitable for JSON or YAML export. +func (m *Reference) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("$ref")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.XRef)) + if m.Summary != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("summary")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Summary)) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + return info +} + +// ToRawInfo returns a description of RequestBodiesOrReferences suitable for JSON or YAML export. +func (m *RequestBodiesOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of RequestBody suitable for JSON or YAML export. +func (m *RequestBody) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("content")) + info.Content = append(info.Content, m.Content.ToRawInfo()) + if m.Required != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Required)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of RequestBodyOrReference suitable for JSON or YAML export. +func (m *RequestBodyOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // RequestBodyOrReference + // {Name:requestBody Type:RequestBody StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetRequestBody() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Response suitable for JSON or YAML export. +func (m *Response) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + if m.Headers != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("headers")) + info.Content = append(info.Content, m.Headers.ToRawInfo()) + } + if m.Content != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("content")) + info.Content = append(info.Content, m.Content.ToRawInfo()) + } + if m.Links != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("links")) + info.Content = append(info.Content, m.Links.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ResponseOrReference suitable for JSON or YAML export. +func (m *ResponseOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // ResponseOrReference + // {Name:response Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetResponse() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of Responses suitable for JSON or YAML export. +func (m *Responses) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.ResponseOrReference != nil { + for _, item := range m.ResponseOrReference { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ResponsesOrReferences suitable for JSON or YAML export. +func (m *ResponsesOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Schema suitable for JSON or YAML export. +func (m *Schema) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Nullable != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("nullable")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Nullable)) + } + if m.Discriminator != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("discriminator")) + info.Content = append(info.Content, m.Discriminator.ToRawInfo()) + } + if m.ReadOnly != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("readOnly")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ReadOnly)) + } + if m.WriteOnly != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("writeOnly")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.WriteOnly)) + } + if m.Xml != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("xml")) + info.Content = append(info.Content, m.Xml.ToRawInfo()) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.Example != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("example")) + info.Content = append(info.Content, m.Example.ToRawInfo()) + } + if m.Deprecated != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("deprecated")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Deprecated)) + } + if m.Title != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("title")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Title)) + } + if m.MultipleOf != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("multipleOf")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.MultipleOf)) + } + if m.Maximum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Maximum)) + } + if m.ExclusiveMaximum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMaximum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMaximum)) + } + if m.Minimum != 0.0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForFloat(m.Minimum)) + } + if m.ExclusiveMinimum != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("exclusiveMinimum")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.ExclusiveMinimum)) + } + if m.MaxLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxLength)) + } + if m.MinLength != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minLength")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinLength)) + } + if m.Pattern != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("pattern")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Pattern)) + } + if m.MaxItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxItems)) + } + if m.MinItems != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinItems)) + } + if m.UniqueItems != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("uniqueItems")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.UniqueItems)) + } + if m.MaxProperties != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("maxProperties")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MaxProperties)) + } + if m.MinProperties != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("minProperties")) + info.Content = append(info.Content, compiler.NewScalarNodeForInt(m.MinProperties)) + } + if len(m.Required) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("required")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Required)) + } + if len(m.Enum) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.Enum { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, items) + } + if m.Type != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + } + if len(m.AllOf) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.AllOf { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("allOf")) + info.Content = append(info.Content, items) + } + if len(m.OneOf) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.OneOf { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("oneOf")) + info.Content = append(info.Content, items) + } + if len(m.AnyOf) != 0 { + items := compiler.NewSequenceNode() + for _, item := range m.AnyOf { + items.Content = append(items.Content, item.ToRawInfo()) + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("anyOf")) + info.Content = append(info.Content, items) + } + if m.Not != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("not")) + info.Content = append(info.Content, m.Not.ToRawInfo()) + } + if m.Items != nil { + items := compiler.NewSequenceNode() + for _, item := range m.Items.SchemaOrReference { + items.Content = append(items.Content, item.ToRawInfo()) + } + if len(items.Content) == 1 { + items = items.Content[0] + } + info.Content = append(info.Content, compiler.NewScalarNodeForString("items")) + info.Content = append(info.Content, items) + } + if m.Properties != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("properties")) + info.Content = append(info.Content, m.Properties.ToRawInfo()) + } + if m.AdditionalProperties != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("additionalProperties")) + info.Content = append(info.Content, m.AdditionalProperties.ToRawInfo()) + } + if m.Default != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, m.Default.ToRawInfo()) + } + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Format != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("format")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Format)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SchemaOrReference suitable for JSON or YAML export. +func (m *SchemaOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // SchemaOrReference + // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSchema() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of SchemasOrReferences suitable for JSON or YAML export. +func (m *SchemasOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SecurityRequirement suitable for JSON or YAML export. +func (m *SecurityRequirement) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SecurityScheme suitable for JSON or YAML export. +func (m *SecurityScheme) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("type")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Type)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.In != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("in")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.In)) + } + if m.Scheme != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("scheme")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Scheme)) + } + if m.BearerFormat != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("bearerFormat")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.BearerFormat)) + } + if m.Flows != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("flows")) + info.Content = append(info.Content, m.Flows.ToRawInfo()) + } + if m.OpenIdConnectUrl != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("openIdConnectUrl")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.OpenIdConnectUrl)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SecuritySchemeOrReference suitable for JSON or YAML export. +func (m *SecuritySchemeOrReference) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // SecuritySchemeOrReference + // {Name:securityScheme Type:SecurityScheme StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v0 := m.GetSecurityScheme() + if v0 != nil { + return v0.ToRawInfo() + } + // {Name:reference Type:Reference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + v1 := m.GetReference() + if v1 != nil { + return v1.ToRawInfo() + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of SecuritySchemesOrReferences suitable for JSON or YAML export. +func (m *SecuritySchemesOrReferences) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Server suitable for JSON or YAML export. +func (m *Server) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("url")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Url)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.Variables != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("variables")) + info.Content = append(info.Content, m.Variables.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ServerVariable suitable for JSON or YAML export. +func (m *ServerVariable) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if len(m.Enum) != 0 { + info.Content = append(info.Content, compiler.NewScalarNodeForString("enum")) + info.Content = append(info.Content, compiler.NewSequenceNodeForStringArray(m.Enum)) + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("default")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Default)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of ServerVariables suitable for JSON or YAML export. +func (m *ServerVariables) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.AdditionalProperties != nil { + for _, item := range m.AdditionalProperties { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of SpecificationExtension suitable for JSON or YAML export. +func (m *SpecificationExtension) ToRawInfo() *yaml.Node { + // ONE OF WRAPPER + // SpecificationExtension + // {Name:number Type:float StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v0, ok := m.GetOneof().(*SpecificationExtension_Number); ok { + return compiler.NewScalarNodeForFloat(v0.Number) + } + // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v1, ok := m.GetOneof().(*SpecificationExtension_Boolean); ok { + return compiler.NewScalarNodeForBool(v1.Boolean) + } + // {Name:string Type:string StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} + if v2, ok := m.GetOneof().(*SpecificationExtension_String_); ok { + return compiler.NewScalarNodeForString(v2.String_) + } + return compiler.NewNullNode() +} + +// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. +func (m *StringArray) ToRawInfo() *yaml.Node { + return compiler.NewSequenceNodeForStringArray(m.Value) +} + +// ToRawInfo returns a description of Strings suitable for JSON or YAML export. +func (m *Strings) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} + return info +} + +// ToRawInfo returns a description of Tag suitable for JSON or YAML export. +func (m *Tag) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + // always include this required field. + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + if m.Description != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("description")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Description)) + } + if m.ExternalDocs != nil { + info.Content = append(info.Content, compiler.NewScalarNodeForString("externalDocs")) + info.Content = append(info.Content, m.ExternalDocs.ToRawInfo()) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +// ToRawInfo returns a description of Xml suitable for JSON or YAML export. +func (m *Xml) ToRawInfo() *yaml.Node { + info := compiler.NewMappingNode() + if m == nil { + return info + } + if m.Name != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("name")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Name)) + } + if m.Namespace != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("namespace")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Namespace)) + } + if m.Prefix != "" { + info.Content = append(info.Content, compiler.NewScalarNodeForString("prefix")) + info.Content = append(info.Content, compiler.NewScalarNodeForString(m.Prefix)) + } + if m.Attribute != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("attribute")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Attribute)) + } + if m.Wrapped != false { + info.Content = append(info.Content, compiler.NewScalarNodeForString("wrapped")) + info.Content = append(info.Content, compiler.NewScalarNodeForBool(m.Wrapped)) + } + if m.SpecificationExtension != nil { + for _, item := range m.SpecificationExtension { + info.Content = append(info.Content, compiler.NewScalarNodeForString(item.Name)) + info.Content = append(info.Content, item.Value.ToRawInfo()) + } + } + return info +} + +var ( + pattern0 = regexp.MustCompile("^") + pattern1 = regexp.MustCompile("^x-") + pattern2 = regexp.MustCompile("^/") + pattern3 = regexp.MustCompile("^([0-9X]{3})$") +) diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go new file mode 100644 index 00000000..499e7f93 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.pb.go @@ -0,0 +1,8053 @@ +// Copyright 2020 Google LLC. All Rights Reserved. +// +// 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.26.0 +// protoc v3.18.1 +// source: openapiv3/OpenAPIv3.proto + +package openapi_v3 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AdditionalPropertiesItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *AdditionalPropertiesItem_SchemaOrReference + // *AdditionalPropertiesItem_Boolean + Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"` +} + +func (x *AdditionalPropertiesItem) Reset() { + *x = AdditionalPropertiesItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AdditionalPropertiesItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdditionalPropertiesItem) ProtoMessage() {} + +func (x *AdditionalPropertiesItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AdditionalPropertiesItem.ProtoReflect.Descriptor instead. +func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{0} +} + +func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *AdditionalPropertiesItem) GetSchemaOrReference() *SchemaOrReference { + if x, ok := x.GetOneof().(*AdditionalPropertiesItem_SchemaOrReference); ok { + return x.SchemaOrReference + } + return nil +} + +func (x *AdditionalPropertiesItem) GetBoolean() bool { + if x, ok := x.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { + return x.Boolean + } + return false +} + +type isAdditionalPropertiesItem_Oneof interface { + isAdditionalPropertiesItem_Oneof() +} + +type AdditionalPropertiesItem_SchemaOrReference struct { + SchemaOrReference *SchemaOrReference `protobuf:"bytes,1,opt,name=schema_or_reference,json=schemaOrReference,proto3,oneof"` +} + +type AdditionalPropertiesItem_Boolean struct { + Boolean bool `protobuf:"varint,2,opt,name=boolean,proto3,oneof"` +} + +func (*AdditionalPropertiesItem_SchemaOrReference) isAdditionalPropertiesItem_Oneof() {} + +func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {} + +type Any struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value *anypb.Any `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *Any) Reset() { + *x = Any{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Any) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Any) ProtoMessage() {} + +func (x *Any) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Any.ProtoReflect.Descriptor instead. +func (*Any) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{1} +} + +func (x *Any) GetValue() *anypb.Any { + if x != nil { + return x.Value + } + return nil +} + +func (x *Any) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +type AnyOrExpression struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *AnyOrExpression_Any + // *AnyOrExpression_Expression + Oneof isAnyOrExpression_Oneof `protobuf_oneof:"oneof"` +} + +func (x *AnyOrExpression) Reset() { + *x = AnyOrExpression{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AnyOrExpression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AnyOrExpression) ProtoMessage() {} + +func (x *AnyOrExpression) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AnyOrExpression.ProtoReflect.Descriptor instead. +func (*AnyOrExpression) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{2} +} + +func (m *AnyOrExpression) GetOneof() isAnyOrExpression_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *AnyOrExpression) GetAny() *Any { + if x, ok := x.GetOneof().(*AnyOrExpression_Any); ok { + return x.Any + } + return nil +} + +func (x *AnyOrExpression) GetExpression() *Expression { + if x, ok := x.GetOneof().(*AnyOrExpression_Expression); ok { + return x.Expression + } + return nil +} + +type isAnyOrExpression_Oneof interface { + isAnyOrExpression_Oneof() +} + +type AnyOrExpression_Any struct { + Any *Any `protobuf:"bytes,1,opt,name=any,proto3,oneof"` +} + +type AnyOrExpression_Expression struct { + Expression *Expression `protobuf:"bytes,2,opt,name=expression,proto3,oneof"` +} + +func (*AnyOrExpression_Any) isAnyOrExpression_Oneof() {} + +func (*AnyOrExpression_Expression) isAnyOrExpression_Oneof() {} + +// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation. +type Callback struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path []*NamedPathItem `protobuf:"bytes,1,rep,name=path,proto3" json:"path,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,2,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Callback) Reset() { + *x = Callback{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Callback) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Callback) ProtoMessage() {} + +func (x *Callback) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Callback.ProtoReflect.Descriptor instead. +func (*Callback) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{3} +} + +func (x *Callback) GetPath() []*NamedPathItem { + if x != nil { + return x.Path + } + return nil +} + +func (x *Callback) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type CallbackOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *CallbackOrReference_Callback + // *CallbackOrReference_Reference + Oneof isCallbackOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *CallbackOrReference) Reset() { + *x = CallbackOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CallbackOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CallbackOrReference) ProtoMessage() {} + +func (x *CallbackOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CallbackOrReference.ProtoReflect.Descriptor instead. +func (*CallbackOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{4} +} + +func (m *CallbackOrReference) GetOneof() isCallbackOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *CallbackOrReference) GetCallback() *Callback { + if x, ok := x.GetOneof().(*CallbackOrReference_Callback); ok { + return x.Callback + } + return nil +} + +func (x *CallbackOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*CallbackOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isCallbackOrReference_Oneof interface { + isCallbackOrReference_Oneof() +} + +type CallbackOrReference_Callback struct { + Callback *Callback `protobuf:"bytes,1,opt,name=callback,proto3,oneof"` +} + +type CallbackOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*CallbackOrReference_Callback) isCallbackOrReference_Oneof() {} + +func (*CallbackOrReference_Reference) isCallbackOrReference_Oneof() {} + +type CallbacksOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedCallbackOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *CallbacksOrReferences) Reset() { + *x = CallbacksOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CallbacksOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CallbacksOrReferences) ProtoMessage() {} + +func (x *CallbacksOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CallbacksOrReferences.ProtoReflect.Descriptor instead. +func (*CallbacksOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{5} +} + +func (x *CallbacksOrReferences) GetAdditionalProperties() []*NamedCallbackOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object. +type Components struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Schemas *SchemasOrReferences `protobuf:"bytes,1,opt,name=schemas,proto3" json:"schemas,omitempty"` + Responses *ResponsesOrReferences `protobuf:"bytes,2,opt,name=responses,proto3" json:"responses,omitempty"` + Parameters *ParametersOrReferences `protobuf:"bytes,3,opt,name=parameters,proto3" json:"parameters,omitempty"` + Examples *ExamplesOrReferences `protobuf:"bytes,4,opt,name=examples,proto3" json:"examples,omitempty"` + RequestBodies *RequestBodiesOrReferences `protobuf:"bytes,5,opt,name=request_bodies,json=requestBodies,proto3" json:"request_bodies,omitempty"` + Headers *HeadersOrReferences `protobuf:"bytes,6,opt,name=headers,proto3" json:"headers,omitempty"` + SecuritySchemes *SecuritySchemesOrReferences `protobuf:"bytes,7,opt,name=security_schemes,json=securitySchemes,proto3" json:"security_schemes,omitempty"` + Links *LinksOrReferences `protobuf:"bytes,8,opt,name=links,proto3" json:"links,omitempty"` + Callbacks *CallbacksOrReferences `protobuf:"bytes,9,opt,name=callbacks,proto3" json:"callbacks,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,10,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Components) Reset() { + *x = Components{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Components) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Components) ProtoMessage() {} + +func (x *Components) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Components.ProtoReflect.Descriptor instead. +func (*Components) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{6} +} + +func (x *Components) GetSchemas() *SchemasOrReferences { + if x != nil { + return x.Schemas + } + return nil +} + +func (x *Components) GetResponses() *ResponsesOrReferences { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Components) GetParameters() *ParametersOrReferences { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Components) GetExamples() *ExamplesOrReferences { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Components) GetRequestBodies() *RequestBodiesOrReferences { + if x != nil { + return x.RequestBodies + } + return nil +} + +func (x *Components) GetHeaders() *HeadersOrReferences { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Components) GetSecuritySchemes() *SecuritySchemesOrReferences { + if x != nil { + return x.SecuritySchemes + } + return nil +} + +func (x *Components) GetLinks() *LinksOrReferences { + if x != nil { + return x.Links + } + return nil +} + +func (x *Components) GetCallbacks() *CallbacksOrReferences { + if x != nil { + return x.Callbacks + } + return nil +} + +func (x *Components) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// Contact information for the exposed API. +type Contact struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,4,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Contact) Reset() { + *x = Contact{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Contact.ProtoReflect.Descriptor instead. +func (*Contact) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{7} +} + +func (x *Contact) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Contact) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type DefaultType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *DefaultType_Number + // *DefaultType_Boolean + // *DefaultType_String_ + Oneof isDefaultType_Oneof `protobuf_oneof:"oneof"` +} + +func (x *DefaultType) Reset() { + *x = DefaultType{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DefaultType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DefaultType) ProtoMessage() {} + +func (x *DefaultType) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DefaultType.ProtoReflect.Descriptor instead. +func (*DefaultType) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{8} +} + +func (m *DefaultType) GetOneof() isDefaultType_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *DefaultType) GetNumber() float64 { + if x, ok := x.GetOneof().(*DefaultType_Number); ok { + return x.Number + } + return 0 +} + +func (x *DefaultType) GetBoolean() bool { + if x, ok := x.GetOneof().(*DefaultType_Boolean); ok { + return x.Boolean + } + return false +} + +func (x *DefaultType) GetString_() string { + if x, ok := x.GetOneof().(*DefaultType_String_); ok { + return x.String_ + } + return "" +} + +type isDefaultType_Oneof interface { + isDefaultType_Oneof() +} + +type DefaultType_Number struct { + Number float64 `protobuf:"fixed64,1,opt,name=number,proto3,oneof"` +} + +type DefaultType_Boolean struct { + Boolean bool `protobuf:"varint,2,opt,name=boolean,proto3,oneof"` +} + +type DefaultType_String_ struct { + String_ string `protobuf:"bytes,3,opt,name=string,proto3,oneof"` +} + +func (*DefaultType_Number) isDefaultType_Oneof() {} + +func (*DefaultType_Boolean) isDefaultType_Oneof() {} + +func (*DefaultType_String_) isDefaultType_Oneof() {} + +// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered. +type Discriminator struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PropertyName string `protobuf:"bytes,1,opt,name=property_name,json=propertyName,proto3" json:"property_name,omitempty"` + Mapping *Strings `protobuf:"bytes,2,opt,name=mapping,proto3" json:"mapping,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,3,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Discriminator) Reset() { + *x = Discriminator{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Discriminator) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Discriminator) ProtoMessage() {} + +func (x *Discriminator) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Discriminator.ProtoReflect.Descriptor instead. +func (*Discriminator) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{9} +} + +func (x *Discriminator) GetPropertyName() string { + if x != nil { + return x.PropertyName + } + return "" +} + +func (x *Discriminator) GetMapping() *Strings { + if x != nil { + return x.Mapping + } + return nil +} + +func (x *Discriminator) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type Document struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Openapi string `protobuf:"bytes,1,opt,name=openapi,proto3" json:"openapi,omitempty"` + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + Servers []*Server `protobuf:"bytes,3,rep,name=servers,proto3" json:"servers,omitempty"` + Paths *Paths `protobuf:"bytes,4,opt,name=paths,proto3" json:"paths,omitempty"` + Components *Components `protobuf:"bytes,5,opt,name=components,proto3" json:"components,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,6,rep,name=security,proto3" json:"security,omitempty"` + Tags []*Tag `protobuf:"bytes,7,rep,name=tags,proto3" json:"tags,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,9,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Document) Reset() { + *x = Document{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Document) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Document) ProtoMessage() {} + +func (x *Document) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Document.ProtoReflect.Descriptor instead. +func (*Document) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{10} +} + +func (x *Document) GetOpenapi() string { + if x != nil { + return x.Openapi + } + return "" +} + +func (x *Document) GetInfo() *Info { + if x != nil { + return x.Info + } + return nil +} + +func (x *Document) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *Document) GetPaths() *Paths { + if x != nil { + return x.Paths + } + return nil +} + +func (x *Document) GetComponents() *Components { + if x != nil { + return x.Components + } + return nil +} + +func (x *Document) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Document) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Document) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Document) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// A single encoding definition applied to a single schema property. +type Encoding struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContentType string `protobuf:"bytes,1,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + Headers *HeadersOrReferences `protobuf:"bytes,2,opt,name=headers,proto3" json:"headers,omitempty"` + Style string `protobuf:"bytes,3,opt,name=style,proto3" json:"style,omitempty"` + Explode bool `protobuf:"varint,4,opt,name=explode,proto3" json:"explode,omitempty"` + AllowReserved bool `protobuf:"varint,5,opt,name=allow_reserved,json=allowReserved,proto3" json:"allow_reserved,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,6,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Encoding) Reset() { + *x = Encoding{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Encoding) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Encoding) ProtoMessage() {} + +func (x *Encoding) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Encoding.ProtoReflect.Descriptor instead. +func (*Encoding) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{11} +} + +func (x *Encoding) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *Encoding) GetHeaders() *HeadersOrReferences { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Encoding) GetStyle() string { + if x != nil { + return x.Style + } + return "" +} + +func (x *Encoding) GetExplode() bool { + if x != nil { + return x.Explode + } + return false +} + +func (x *Encoding) GetAllowReserved() bool { + if x != nil { + return x.AllowReserved + } + return false +} + +func (x *Encoding) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type Encodings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedEncoding `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Encodings) Reset() { + *x = Encodings{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Encodings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Encodings) ProtoMessage() {} + +func (x *Encodings) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Encodings.ProtoReflect.Descriptor instead. +func (*Encodings) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{12} +} + +func (x *Encodings) GetAdditionalProperties() []*NamedEncoding { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type Example struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Summary string `protobuf:"bytes,1,opt,name=summary,proto3" json:"summary,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Value *Any `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + ExternalValue string `protobuf:"bytes,4,opt,name=external_value,json=externalValue,proto3" json:"external_value,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,5,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Example) Reset() { + *x = Example{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Example) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Example) ProtoMessage() {} + +func (x *Example) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Example.ProtoReflect.Descriptor instead. +func (*Example) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{13} +} + +func (x *Example) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Example) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Example) GetValue() *Any { + if x != nil { + return x.Value + } + return nil +} + +func (x *Example) GetExternalValue() string { + if x != nil { + return x.ExternalValue + } + return "" +} + +func (x *Example) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type ExampleOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *ExampleOrReference_Example + // *ExampleOrReference_Reference + Oneof isExampleOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *ExampleOrReference) Reset() { + *x = ExampleOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExampleOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExampleOrReference) ProtoMessage() {} + +func (x *ExampleOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExampleOrReference.ProtoReflect.Descriptor instead. +func (*ExampleOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{14} +} + +func (m *ExampleOrReference) GetOneof() isExampleOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *ExampleOrReference) GetExample() *Example { + if x, ok := x.GetOneof().(*ExampleOrReference_Example); ok { + return x.Example + } + return nil +} + +func (x *ExampleOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*ExampleOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isExampleOrReference_Oneof interface { + isExampleOrReference_Oneof() +} + +type ExampleOrReference_Example struct { + Example *Example `protobuf:"bytes,1,opt,name=example,proto3,oneof"` +} + +type ExampleOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*ExampleOrReference_Example) isExampleOrReference_Oneof() {} + +func (*ExampleOrReference_Reference) isExampleOrReference_Oneof() {} + +type ExamplesOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedExampleOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ExamplesOrReferences) Reset() { + *x = ExamplesOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExamplesOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExamplesOrReferences) ProtoMessage() {} + +func (x *ExamplesOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExamplesOrReferences.ProtoReflect.Descriptor instead. +func (*ExamplesOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{15} +} + +func (x *ExamplesOrReferences) GetAdditionalProperties() []*NamedExampleOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +type Expression struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Expression) Reset() { + *x = Expression{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Expression) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Expression) ProtoMessage() {} + +func (x *Expression) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Expression.ProtoReflect.Descriptor instead. +func (*Expression) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{16} +} + +func (x *Expression) GetAdditionalProperties() []*NamedAny { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Allows referencing an external resource for extended documentation. +type ExternalDocs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,3,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *ExternalDocs) Reset() { + *x = ExternalDocs{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExternalDocs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocs) ProtoMessage() {} + +func (x *ExternalDocs) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalDocs.ProtoReflect.Descriptor instead. +func (*ExternalDocs) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{17} +} + +func (x *ExternalDocs) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ExternalDocs) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *ExternalDocs) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`). +type Header struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` + Deprecated bool `protobuf:"varint,3,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + AllowEmptyValue bool `protobuf:"varint,4,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"` + Style string `protobuf:"bytes,5,opt,name=style,proto3" json:"style,omitempty"` + Explode bool `protobuf:"varint,6,opt,name=explode,proto3" json:"explode,omitempty"` + AllowReserved bool `protobuf:"varint,7,opt,name=allow_reserved,json=allowReserved,proto3" json:"allow_reserved,omitempty"` + Schema *SchemaOrReference `protobuf:"bytes,8,opt,name=schema,proto3" json:"schema,omitempty"` + Example *Any `protobuf:"bytes,9,opt,name=example,proto3" json:"example,omitempty"` + Examples *ExamplesOrReferences `protobuf:"bytes,10,opt,name=examples,proto3" json:"examples,omitempty"` + Content *MediaTypes `protobuf:"bytes,11,opt,name=content,proto3" json:"content,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,12,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Header) Reset() { + *x = Header{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Header.ProtoReflect.Descriptor instead. +func (*Header) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{18} +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Header) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *Header) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Header) GetAllowEmptyValue() bool { + if x != nil { + return x.AllowEmptyValue + } + return false +} + +func (x *Header) GetStyle() string { + if x != nil { + return x.Style + } + return "" +} + +func (x *Header) GetExplode() bool { + if x != nil { + return x.Explode + } + return false +} + +func (x *Header) GetAllowReserved() bool { + if x != nil { + return x.AllowReserved + } + return false +} + +func (x *Header) GetSchema() *SchemaOrReference { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Header) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *Header) GetExamples() *ExamplesOrReferences { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Header) GetContent() *MediaTypes { + if x != nil { + return x.Content + } + return nil +} + +func (x *Header) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type HeaderOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *HeaderOrReference_Header + // *HeaderOrReference_Reference + Oneof isHeaderOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *HeaderOrReference) Reset() { + *x = HeaderOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeaderOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeaderOrReference) ProtoMessage() {} + +func (x *HeaderOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeaderOrReference.ProtoReflect.Descriptor instead. +func (*HeaderOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{19} +} + +func (m *HeaderOrReference) GetOneof() isHeaderOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *HeaderOrReference) GetHeader() *Header { + if x, ok := x.GetOneof().(*HeaderOrReference_Header); ok { + return x.Header + } + return nil +} + +func (x *HeaderOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*HeaderOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isHeaderOrReference_Oneof interface { + isHeaderOrReference_Oneof() +} + +type HeaderOrReference_Header struct { + Header *Header `protobuf:"bytes,1,opt,name=header,proto3,oneof"` +} + +type HeaderOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*HeaderOrReference_Header) isHeaderOrReference_Oneof() {} + +func (*HeaderOrReference_Reference) isHeaderOrReference_Oneof() {} + +type HeadersOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedHeaderOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *HeadersOrReferences) Reset() { + *x = HeadersOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeadersOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeadersOrReferences) ProtoMessage() {} + +func (x *HeadersOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeadersOrReferences.ProtoReflect.Descriptor instead. +func (*HeadersOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{20} +} + +func (x *HeadersOrReferences) GetAdditionalProperties() []*NamedHeaderOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience. +type Info struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + TermsOfService string `protobuf:"bytes,3,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + Contact *Contact `protobuf:"bytes,4,opt,name=contact,proto3" json:"contact,omitempty"` + License *License `protobuf:"bytes,5,opt,name=license,proto3" json:"license,omitempty"` + Version string `protobuf:"bytes,6,opt,name=version,proto3" json:"version,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,7,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` + Summary string `protobuf:"bytes,8,opt,name=summary,proto3" json:"summary,omitempty"` +} + +func (x *Info) Reset() { + *x = Info{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Info.ProtoReflect.Descriptor instead. +func (*Info) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{21} +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *Info) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +func (x *Info) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +type ItemsItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SchemaOrReference []*SchemaOrReference `protobuf:"bytes,1,rep,name=schema_or_reference,json=schemaOrReference,proto3" json:"schema_or_reference,omitempty"` +} + +func (x *ItemsItem) Reset() { + *x = ItemsItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ItemsItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItemsItem) ProtoMessage() {} + +func (x *ItemsItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ItemsItem.ProtoReflect.Descriptor instead. +func (*ItemsItem) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{22} +} + +func (x *ItemsItem) GetSchemaOrReference() []*SchemaOrReference { + if x != nil { + return x.SchemaOrReference + } + return nil +} + +// License information for the exposed API. +type License struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,3,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *License) Reset() { + *x = License{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License.ProtoReflect.Descriptor instead. +func (*License) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{23} +} + +func (x *License) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *License) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation. +type Link struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OperationRef string `protobuf:"bytes,1,opt,name=operation_ref,json=operationRef,proto3" json:"operation_ref,omitempty"` + OperationId string `protobuf:"bytes,2,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + Parameters *AnyOrExpression `protobuf:"bytes,3,opt,name=parameters,proto3" json:"parameters,omitempty"` + RequestBody *AnyOrExpression `protobuf:"bytes,4,opt,name=request_body,json=requestBody,proto3" json:"request_body,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Server *Server `protobuf:"bytes,6,opt,name=server,proto3" json:"server,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,7,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Link) Reset() { + *x = Link{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Link) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Link) ProtoMessage() {} + +func (x *Link) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Link.ProtoReflect.Descriptor instead. +func (*Link) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{24} +} + +func (x *Link) GetOperationRef() string { + if x != nil { + return x.OperationRef + } + return "" +} + +func (x *Link) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Link) GetParameters() *AnyOrExpression { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Link) GetRequestBody() *AnyOrExpression { + if x != nil { + return x.RequestBody + } + return nil +} + +func (x *Link) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Link) GetServer() *Server { + if x != nil { + return x.Server + } + return nil +} + +func (x *Link) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type LinkOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *LinkOrReference_Link + // *LinkOrReference_Reference + Oneof isLinkOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *LinkOrReference) Reset() { + *x = LinkOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinkOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinkOrReference) ProtoMessage() {} + +func (x *LinkOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinkOrReference.ProtoReflect.Descriptor instead. +func (*LinkOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{25} +} + +func (m *LinkOrReference) GetOneof() isLinkOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *LinkOrReference) GetLink() *Link { + if x, ok := x.GetOneof().(*LinkOrReference_Link); ok { + return x.Link + } + return nil +} + +func (x *LinkOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*LinkOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isLinkOrReference_Oneof interface { + isLinkOrReference_Oneof() +} + +type LinkOrReference_Link struct { + Link *Link `protobuf:"bytes,1,opt,name=link,proto3,oneof"` +} + +type LinkOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*LinkOrReference_Link) isLinkOrReference_Oneof() {} + +func (*LinkOrReference_Reference) isLinkOrReference_Oneof() {} + +type LinksOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedLinkOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *LinksOrReferences) Reset() { + *x = LinksOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinksOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinksOrReferences) ProtoMessage() {} + +func (x *LinksOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinksOrReferences.ProtoReflect.Descriptor instead. +func (*LinksOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{26} +} + +func (x *LinksOrReferences) GetAdditionalProperties() []*NamedLinkOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Each Media Type Object provides schema and examples for the media type identified by its key. +type MediaType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Schema *SchemaOrReference `protobuf:"bytes,1,opt,name=schema,proto3" json:"schema,omitempty"` + Example *Any `protobuf:"bytes,2,opt,name=example,proto3" json:"example,omitempty"` + Examples *ExamplesOrReferences `protobuf:"bytes,3,opt,name=examples,proto3" json:"examples,omitempty"` + Encoding *Encodings `protobuf:"bytes,4,opt,name=encoding,proto3" json:"encoding,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,5,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *MediaType) Reset() { + *x = MediaType{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaType) ProtoMessage() {} + +func (x *MediaType) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaType.ProtoReflect.Descriptor instead. +func (*MediaType) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{27} +} + +func (x *MediaType) GetSchema() *SchemaOrReference { + if x != nil { + return x.Schema + } + return nil +} + +func (x *MediaType) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *MediaType) GetExamples() *ExamplesOrReferences { + if x != nil { + return x.Examples + } + return nil +} + +func (x *MediaType) GetEncoding() *Encodings { + if x != nil { + return x.Encoding + } + return nil +} + +func (x *MediaType) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type MediaTypes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedMediaType `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *MediaTypes) Reset() { + *x = MediaTypes{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MediaTypes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaTypes) ProtoMessage() {} + +func (x *MediaTypes) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaTypes.ProtoReflect.Descriptor instead. +func (*MediaTypes) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{28} +} + +func (x *MediaTypes) GetAdditionalProperties() []*NamedMediaType { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +type NamedAny struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Any `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedAny) Reset() { + *x = NamedAny{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedAny) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedAny) ProtoMessage() {} + +func (x *NamedAny) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedAny.ProtoReflect.Descriptor instead. +func (*NamedAny) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{29} +} + +func (x *NamedAny) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedAny) GetValue() *Any { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs. +type NamedCallbackOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *CallbackOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedCallbackOrReference) Reset() { + *x = NamedCallbackOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedCallbackOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedCallbackOrReference) ProtoMessage() {} + +func (x *NamedCallbackOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedCallbackOrReference.ProtoReflect.Descriptor instead. +func (*NamedCallbackOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{30} +} + +func (x *NamedCallbackOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedCallbackOrReference) GetValue() *CallbackOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs. +type NamedEncoding struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *Encoding `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedEncoding) Reset() { + *x = NamedEncoding{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedEncoding) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedEncoding) ProtoMessage() {} + +func (x *NamedEncoding) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedEncoding.ProtoReflect.Descriptor instead. +func (*NamedEncoding) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{31} +} + +func (x *NamedEncoding) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedEncoding) GetValue() *Encoding { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs. +type NamedExampleOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *ExampleOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedExampleOrReference) Reset() { + *x = NamedExampleOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedExampleOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedExampleOrReference) ProtoMessage() {} + +func (x *NamedExampleOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedExampleOrReference.ProtoReflect.Descriptor instead. +func (*NamedExampleOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{32} +} + +func (x *NamedExampleOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedExampleOrReference) GetValue() *ExampleOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs. +type NamedHeaderOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *HeaderOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedHeaderOrReference) Reset() { + *x = NamedHeaderOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedHeaderOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedHeaderOrReference) ProtoMessage() {} + +func (x *NamedHeaderOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedHeaderOrReference.ProtoReflect.Descriptor instead. +func (*NamedHeaderOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{33} +} + +func (x *NamedHeaderOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedHeaderOrReference) GetValue() *HeaderOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs. +type NamedLinkOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *LinkOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedLinkOrReference) Reset() { + *x = NamedLinkOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedLinkOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedLinkOrReference) ProtoMessage() {} + +func (x *NamedLinkOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedLinkOrReference.ProtoReflect.Descriptor instead. +func (*NamedLinkOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{34} +} + +func (x *NamedLinkOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedLinkOrReference) GetValue() *LinkOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs. +type NamedMediaType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *MediaType `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedMediaType) Reset() { + *x = NamedMediaType{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedMediaType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedMediaType) ProtoMessage() {} + +func (x *NamedMediaType) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedMediaType.ProtoReflect.Descriptor instead. +func (*NamedMediaType) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{35} +} + +func (x *NamedMediaType) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedMediaType) GetValue() *MediaType { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs. +type NamedParameterOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *ParameterOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedParameterOrReference) Reset() { + *x = NamedParameterOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedParameterOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedParameterOrReference) ProtoMessage() {} + +func (x *NamedParameterOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedParameterOrReference.ProtoReflect.Descriptor instead. +func (*NamedParameterOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{36} +} + +func (x *NamedParameterOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedParameterOrReference) GetValue() *ParameterOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +type NamedPathItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *PathItem `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedPathItem) Reset() { + *x = NamedPathItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedPathItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedPathItem) ProtoMessage() {} + +func (x *NamedPathItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedPathItem.ProtoReflect.Descriptor instead. +func (*NamedPathItem) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{37} +} + +func (x *NamedPathItem) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedPathItem) GetValue() *PathItem { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs. +type NamedRequestBodyOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *RequestBodyOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedRequestBodyOrReference) Reset() { + *x = NamedRequestBodyOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedRequestBodyOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedRequestBodyOrReference) ProtoMessage() {} + +func (x *NamedRequestBodyOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedRequestBodyOrReference.ProtoReflect.Descriptor instead. +func (*NamedRequestBodyOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{38} +} + +func (x *NamedRequestBodyOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedRequestBodyOrReference) GetValue() *RequestBodyOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs. +type NamedResponseOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *ResponseOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedResponseOrReference) Reset() { + *x = NamedResponseOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedResponseOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedResponseOrReference) ProtoMessage() {} + +func (x *NamedResponseOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedResponseOrReference.ProtoReflect.Descriptor instead. +func (*NamedResponseOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{39} +} + +func (x *NamedResponseOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedResponseOrReference) GetValue() *ResponseOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs. +type NamedSchemaOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *SchemaOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedSchemaOrReference) Reset() { + *x = NamedSchemaOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedSchemaOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedSchemaOrReference) ProtoMessage() {} + +func (x *NamedSchemaOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedSchemaOrReference.ProtoReflect.Descriptor instead. +func (*NamedSchemaOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{40} +} + +func (x *NamedSchemaOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedSchemaOrReference) GetValue() *SchemaOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs. +type NamedSecuritySchemeOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *SecuritySchemeOrReference `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedSecuritySchemeOrReference) Reset() { + *x = NamedSecuritySchemeOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedSecuritySchemeOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedSecuritySchemeOrReference) ProtoMessage() {} + +func (x *NamedSecuritySchemeOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedSecuritySchemeOrReference.ProtoReflect.Descriptor instead. +func (*NamedSecuritySchemeOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{41} +} + +func (x *NamedSecuritySchemeOrReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedSecuritySchemeOrReference) GetValue() *SecuritySchemeOrReference { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs. +type NamedServerVariable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *ServerVariable `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedServerVariable) Reset() { + *x = NamedServerVariable{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedServerVariable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedServerVariable) ProtoMessage() {} + +func (x *NamedServerVariable) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedServerVariable.ProtoReflect.Descriptor instead. +func (*NamedServerVariable) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{42} +} + +func (x *NamedServerVariable) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedServerVariable) GetValue() *ServerVariable { + if x != nil { + return x.Value + } + return nil +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +type NamedString struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedString) Reset() { + *x = NamedString{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedString) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedString) ProtoMessage() {} + +func (x *NamedString) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedString.ProtoReflect.Descriptor instead. +func (*NamedString) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{43} +} + +func (x *NamedString) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedString) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. +type NamedStringArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Map key + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Mapped value + Value *StringArray `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NamedStringArray) Reset() { + *x = NamedStringArray{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NamedStringArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NamedStringArray) ProtoMessage() {} + +func (x *NamedStringArray) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NamedStringArray.ProtoReflect.Descriptor instead. +func (*NamedStringArray) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{44} +} + +func (x *NamedStringArray) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NamedStringArray) GetValue() *StringArray { + if x != nil { + return x.Value + } + return nil +} + +// Configuration details for a supported OAuth Flow +type OauthFlow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AuthorizationUrl string `protobuf:"bytes,1,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + TokenUrl string `protobuf:"bytes,2,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + RefreshUrl string `protobuf:"bytes,3,opt,name=refresh_url,json=refreshUrl,proto3" json:"refresh_url,omitempty"` + Scopes *Strings `protobuf:"bytes,4,opt,name=scopes,proto3" json:"scopes,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,5,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *OauthFlow) Reset() { + *x = OauthFlow{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OauthFlow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OauthFlow) ProtoMessage() {} + +func (x *OauthFlow) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OauthFlow.ProtoReflect.Descriptor instead. +func (*OauthFlow) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{45} +} + +func (x *OauthFlow) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *OauthFlow) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *OauthFlow) GetRefreshUrl() string { + if x != nil { + return x.RefreshUrl + } + return "" +} + +func (x *OauthFlow) GetScopes() *Strings { + if x != nil { + return x.Scopes + } + return nil +} + +func (x *OauthFlow) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// Allows configuration of the supported OAuth Flows. +type OauthFlows struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Implicit *OauthFlow `protobuf:"bytes,1,opt,name=implicit,proto3" json:"implicit,omitempty"` + Password *OauthFlow `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + ClientCredentials *OauthFlow `protobuf:"bytes,3,opt,name=client_credentials,json=clientCredentials,proto3" json:"client_credentials,omitempty"` + AuthorizationCode *OauthFlow `protobuf:"bytes,4,opt,name=authorization_code,json=authorizationCode,proto3" json:"authorization_code,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,5,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *OauthFlows) Reset() { + *x = OauthFlows{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OauthFlows) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OauthFlows) ProtoMessage() {} + +func (x *OauthFlows) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OauthFlows.ProtoReflect.Descriptor instead. +func (*OauthFlows) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{46} +} + +func (x *OauthFlows) GetImplicit() *OauthFlow { + if x != nil { + return x.Implicit + } + return nil +} + +func (x *OauthFlows) GetPassword() *OauthFlow { + if x != nil { + return x.Password + } + return nil +} + +func (x *OauthFlows) GetClientCredentials() *OauthFlow { + if x != nil { + return x.ClientCredentials + } + return nil +} + +func (x *OauthFlows) GetAuthorizationCode() *OauthFlow { + if x != nil { + return x.AuthorizationCode + } + return nil +} + +func (x *OauthFlows) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type Object struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Object) Reset() { + *x = Object{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Object) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Object) ProtoMessage() {} + +func (x *Object) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Object.ProtoReflect.Descriptor instead. +func (*Object) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{47} +} + +func (x *Object) GetAdditionalProperties() []*NamedAny { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Describes a single API operation on a path. +type Operation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + Parameters []*ParameterOrReference `protobuf:"bytes,6,rep,name=parameters,proto3" json:"parameters,omitempty"` + RequestBody *RequestBodyOrReference `protobuf:"bytes,7,opt,name=request_body,json=requestBody,proto3" json:"request_body,omitempty"` + Responses *Responses `protobuf:"bytes,8,opt,name=responses,proto3" json:"responses,omitempty"` + Callbacks *CallbacksOrReferences `protobuf:"bytes,9,opt,name=callbacks,proto3" json:"callbacks,omitempty"` + Deprecated bool `protobuf:"varint,10,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + Security []*SecurityRequirement `protobuf:"bytes,11,rep,name=security,proto3" json:"security,omitempty"` + Servers []*Server `protobuf:"bytes,12,rep,name=servers,proto3" json:"servers,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,13,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Operation) Reset() { + *x = Operation{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Operation.ProtoReflect.Descriptor instead. +func (*Operation) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{48} +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Operation) GetParameters() []*ParameterOrReference { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Operation) GetRequestBody() *RequestBodyOrReference { + if x != nil { + return x.RequestBody + } + return nil +} + +func (x *Operation) GetResponses() *Responses { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Operation) GetCallbacks() *CallbacksOrReferences { + if x != nil { + return x.Callbacks + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Operation) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *Operation) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// Describes a single operation parameter. A unique parameter is defined by a combination of a name and location. +type Parameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + Deprecated bool `protobuf:"varint,5,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + AllowEmptyValue bool `protobuf:"varint,6,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"` + Style string `protobuf:"bytes,7,opt,name=style,proto3" json:"style,omitempty"` + Explode bool `protobuf:"varint,8,opt,name=explode,proto3" json:"explode,omitempty"` + AllowReserved bool `protobuf:"varint,9,opt,name=allow_reserved,json=allowReserved,proto3" json:"allow_reserved,omitempty"` + Schema *SchemaOrReference `protobuf:"bytes,10,opt,name=schema,proto3" json:"schema,omitempty"` + Example *Any `protobuf:"bytes,11,opt,name=example,proto3" json:"example,omitempty"` + Examples *ExamplesOrReferences `protobuf:"bytes,12,opt,name=examples,proto3" json:"examples,omitempty"` + Content *MediaTypes `protobuf:"bytes,13,opt,name=content,proto3" json:"content,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,14,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Parameter) Reset() { + *x = Parameter{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Parameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameter) ProtoMessage() {} + +func (x *Parameter) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Parameter.ProtoReflect.Descriptor instead. +func (*Parameter) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{49} +} + +func (x *Parameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Parameter) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *Parameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Parameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *Parameter) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Parameter) GetAllowEmptyValue() bool { + if x != nil { + return x.AllowEmptyValue + } + return false +} + +func (x *Parameter) GetStyle() string { + if x != nil { + return x.Style + } + return "" +} + +func (x *Parameter) GetExplode() bool { + if x != nil { + return x.Explode + } + return false +} + +func (x *Parameter) GetAllowReserved() bool { + if x != nil { + return x.AllowReserved + } + return false +} + +func (x *Parameter) GetSchema() *SchemaOrReference { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Parameter) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *Parameter) GetExamples() *ExamplesOrReferences { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Parameter) GetContent() *MediaTypes { + if x != nil { + return x.Content + } + return nil +} + +func (x *Parameter) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type ParameterOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *ParameterOrReference_Parameter + // *ParameterOrReference_Reference + Oneof isParameterOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *ParameterOrReference) Reset() { + *x = ParameterOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParameterOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParameterOrReference) ProtoMessage() {} + +func (x *ParameterOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParameterOrReference.ProtoReflect.Descriptor instead. +func (*ParameterOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{50} +} + +func (m *ParameterOrReference) GetOneof() isParameterOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *ParameterOrReference) GetParameter() *Parameter { + if x, ok := x.GetOneof().(*ParameterOrReference_Parameter); ok { + return x.Parameter + } + return nil +} + +func (x *ParameterOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*ParameterOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isParameterOrReference_Oneof interface { + isParameterOrReference_Oneof() +} + +type ParameterOrReference_Parameter struct { + Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,proto3,oneof"` +} + +type ParameterOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*ParameterOrReference_Parameter) isParameterOrReference_Oneof() {} + +func (*ParameterOrReference_Reference) isParameterOrReference_Oneof() {} + +type ParametersOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedParameterOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ParametersOrReferences) Reset() { + *x = ParametersOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParametersOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParametersOrReferences) ProtoMessage() {} + +func (x *ParametersOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParametersOrReferences.ProtoReflect.Descriptor instead. +func (*ParametersOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{51} +} + +func (x *ParametersOrReferences) GetAdditionalProperties() []*NamedParameterOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available. +type PathItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Get *Operation `protobuf:"bytes,4,opt,name=get,proto3" json:"get,omitempty"` + Put *Operation `protobuf:"bytes,5,opt,name=put,proto3" json:"put,omitempty"` + Post *Operation `protobuf:"bytes,6,opt,name=post,proto3" json:"post,omitempty"` + Delete *Operation `protobuf:"bytes,7,opt,name=delete,proto3" json:"delete,omitempty"` + Options *Operation `protobuf:"bytes,8,opt,name=options,proto3" json:"options,omitempty"` + Head *Operation `protobuf:"bytes,9,opt,name=head,proto3" json:"head,omitempty"` + Patch *Operation `protobuf:"bytes,10,opt,name=patch,proto3" json:"patch,omitempty"` + Trace *Operation `protobuf:"bytes,11,opt,name=trace,proto3" json:"trace,omitempty"` + Servers []*Server `protobuf:"bytes,12,rep,name=servers,proto3" json:"servers,omitempty"` + Parameters []*ParameterOrReference `protobuf:"bytes,13,rep,name=parameters,proto3" json:"parameters,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,14,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *PathItem) Reset() { + *x = PathItem{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PathItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathItem) ProtoMessage() {} + +func (x *PathItem) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PathItem.ProtoReflect.Descriptor instead. +func (*PathItem) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{52} +} + +func (x *PathItem) GetXRef() string { + if x != nil { + return x.XRef + } + return "" +} + +func (x *PathItem) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *PathItem) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *PathItem) GetGet() *Operation { + if x != nil { + return x.Get + } + return nil +} + +func (x *PathItem) GetPut() *Operation { + if x != nil { + return x.Put + } + return nil +} + +func (x *PathItem) GetPost() *Operation { + if x != nil { + return x.Post + } + return nil +} + +func (x *PathItem) GetDelete() *Operation { + if x != nil { + return x.Delete + } + return nil +} + +func (x *PathItem) GetOptions() *Operation { + if x != nil { + return x.Options + } + return nil +} + +func (x *PathItem) GetHead() *Operation { + if x != nil { + return x.Head + } + return nil +} + +func (x *PathItem) GetPatch() *Operation { + if x != nil { + return x.Patch + } + return nil +} + +func (x *PathItem) GetTrace() *Operation { + if x != nil { + return x.Trace + } + return nil +} + +func (x *PathItem) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *PathItem) GetParameters() []*ParameterOrReference { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *PathItem) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints. +type Paths struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path []*NamedPathItem `protobuf:"bytes,1,rep,name=path,proto3" json:"path,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,2,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Paths) Reset() { + *x = Paths{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Paths) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Paths) ProtoMessage() {} + +func (x *Paths) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Paths.ProtoReflect.Descriptor instead. +func (*Paths) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{53} +} + +func (x *Paths) GetPath() []*NamedPathItem { + if x != nil { + return x.Path + } + return nil +} + +func (x *Paths) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type Properties struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSchemaOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Properties) Reset() { + *x = Properties{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Properties) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Properties) ProtoMessage() {} + +func (x *Properties) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Properties.ProtoReflect.Descriptor instead. +func (*Properties) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{54} +} + +func (x *Properties) GetAdditionalProperties() []*NamedSchemaOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification. +type Reference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref,proto3" json:"_ref,omitempty"` + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *Reference) Reset() { + *x = Reference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Reference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reference) ProtoMessage() {} + +func (x *Reference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reference.ProtoReflect.Descriptor instead. +func (*Reference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{55} +} + +func (x *Reference) GetXRef() string { + if x != nil { + return x.XRef + } + return "" +} + +func (x *Reference) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Reference) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type RequestBodiesOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedRequestBodyOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *RequestBodiesOrReferences) Reset() { + *x = RequestBodiesOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestBodiesOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestBodiesOrReferences) ProtoMessage() {} + +func (x *RequestBodiesOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestBodiesOrReferences.ProtoReflect.Descriptor instead. +func (*RequestBodiesOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{56} +} + +func (x *RequestBodiesOrReferences) GetAdditionalProperties() []*NamedRequestBodyOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Describes a single request body. +type RequestBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Content *MediaTypes `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + Required bool `protobuf:"varint,3,opt,name=required,proto3" json:"required,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,4,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *RequestBody) Reset() { + *x = RequestBody{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestBody) ProtoMessage() {} + +func (x *RequestBody) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestBody.ProtoReflect.Descriptor instead. +func (*RequestBody) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{57} +} + +func (x *RequestBody) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *RequestBody) GetContent() *MediaTypes { + if x != nil { + return x.Content + } + return nil +} + +func (x *RequestBody) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *RequestBody) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type RequestBodyOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *RequestBodyOrReference_RequestBody + // *RequestBodyOrReference_Reference + Oneof isRequestBodyOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *RequestBodyOrReference) Reset() { + *x = RequestBodyOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestBodyOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestBodyOrReference) ProtoMessage() {} + +func (x *RequestBodyOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestBodyOrReference.ProtoReflect.Descriptor instead. +func (*RequestBodyOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{58} +} + +func (m *RequestBodyOrReference) GetOneof() isRequestBodyOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *RequestBodyOrReference) GetRequestBody() *RequestBody { + if x, ok := x.GetOneof().(*RequestBodyOrReference_RequestBody); ok { + return x.RequestBody + } + return nil +} + +func (x *RequestBodyOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*RequestBodyOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isRequestBodyOrReference_Oneof interface { + isRequestBodyOrReference_Oneof() +} + +type RequestBodyOrReference_RequestBody struct { + RequestBody *RequestBody `protobuf:"bytes,1,opt,name=request_body,json=requestBody,proto3,oneof"` +} + +type RequestBodyOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*RequestBodyOrReference_RequestBody) isRequestBodyOrReference_Oneof() {} + +func (*RequestBodyOrReference_Reference) isRequestBodyOrReference_Oneof() {} + +// Describes a single response from an API Operation, including design-time, static `links` to operations based on the response. +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + Headers *HeadersOrReferences `protobuf:"bytes,2,opt,name=headers,proto3" json:"headers,omitempty"` + Content *MediaTypes `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + Links *LinksOrReferences `protobuf:"bytes,4,opt,name=links,proto3" json:"links,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,5,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Response) Reset() { + *x = Response{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{59} +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Response) GetHeaders() *HeadersOrReferences { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Response) GetContent() *MediaTypes { + if x != nil { + return x.Content + } + return nil +} + +func (x *Response) GetLinks() *LinksOrReferences { + if x != nil { + return x.Links + } + return nil +} + +func (x *Response) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type ResponseOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *ResponseOrReference_Response + // *ResponseOrReference_Reference + Oneof isResponseOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *ResponseOrReference) Reset() { + *x = ResponseOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponseOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseOrReference) ProtoMessage() {} + +func (x *ResponseOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponseOrReference.ProtoReflect.Descriptor instead. +func (*ResponseOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{60} +} + +func (m *ResponseOrReference) GetOneof() isResponseOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *ResponseOrReference) GetResponse() *Response { + if x, ok := x.GetOneof().(*ResponseOrReference_Response); ok { + return x.Response + } + return nil +} + +func (x *ResponseOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*ResponseOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isResponseOrReference_Oneof interface { + isResponseOrReference_Oneof() +} + +type ResponseOrReference_Response struct { + Response *Response `protobuf:"bytes,1,opt,name=response,proto3,oneof"` +} + +type ResponseOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*ResponseOrReference_Response) isResponseOrReference_Oneof() {} + +func (*ResponseOrReference_Reference) isResponseOrReference_Oneof() {} + +// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call. +type Responses struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Default *ResponseOrReference `protobuf:"bytes,1,opt,name=default,proto3" json:"default,omitempty"` + ResponseOrReference []*NamedResponseOrReference `protobuf:"bytes,2,rep,name=response_or_reference,json=responseOrReference,proto3" json:"response_or_reference,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,3,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Responses) Reset() { + *x = Responses{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Responses) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Responses) ProtoMessage() {} + +func (x *Responses) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Responses.ProtoReflect.Descriptor instead. +func (*Responses) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{61} +} + +func (x *Responses) GetDefault() *ResponseOrReference { + if x != nil { + return x.Default + } + return nil +} + +func (x *Responses) GetResponseOrReference() []*NamedResponseOrReference { + if x != nil { + return x.ResponseOrReference + } + return nil +} + +func (x *Responses) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type ResponsesOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedResponseOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ResponsesOrReferences) Reset() { + *x = ResponsesOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResponsesOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponsesOrReferences) ProtoMessage() {} + +func (x *ResponsesOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponsesOrReferences.ProtoReflect.Descriptor instead. +func (*ResponsesOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{62} +} + +func (x *ResponsesOrReferences) GetAdditionalProperties() []*NamedResponseOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema. +type Schema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nullable bool `protobuf:"varint,1,opt,name=nullable,proto3" json:"nullable,omitempty"` + Discriminator *Discriminator `protobuf:"bytes,2,opt,name=discriminator,proto3" json:"discriminator,omitempty"` + ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + WriteOnly bool `protobuf:"varint,4,opt,name=write_only,json=writeOnly,proto3" json:"write_only,omitempty"` + Xml *Xml `protobuf:"bytes,5,opt,name=xml,proto3" json:"xml,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,6,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + Example *Any `protobuf:"bytes,7,opt,name=example,proto3" json:"example,omitempty"` + Deprecated bool `protobuf:"varint,8,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + Title string `protobuf:"bytes,9,opt,name=title,proto3" json:"title,omitempty"` + MultipleOf float64 `protobuf:"fixed64,10,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + Maximum float64 `protobuf:"fixed64,11,opt,name=maximum,proto3" json:"maximum,omitempty"` + ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + Minimum float64 `protobuf:"fixed64,13,opt,name=minimum,proto3" json:"minimum,omitempty"` + ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + Pattern string `protobuf:"bytes,17,opt,name=pattern,proto3" json:"pattern,omitempty"` + MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + MaxProperties int64 `protobuf:"varint,21,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + MinProperties int64 `protobuf:"varint,22,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + Required []string `protobuf:"bytes,23,rep,name=required,proto3" json:"required,omitempty"` + Enum []*Any `protobuf:"bytes,24,rep,name=enum,proto3" json:"enum,omitempty"` + Type string `protobuf:"bytes,25,opt,name=type,proto3" json:"type,omitempty"` + AllOf []*SchemaOrReference `protobuf:"bytes,26,rep,name=all_of,json=allOf,proto3" json:"all_of,omitempty"` + OneOf []*SchemaOrReference `protobuf:"bytes,27,rep,name=one_of,json=oneOf,proto3" json:"one_of,omitempty"` + AnyOf []*SchemaOrReference `protobuf:"bytes,28,rep,name=any_of,json=anyOf,proto3" json:"any_of,omitempty"` + Not *Schema `protobuf:"bytes,29,opt,name=not,proto3" json:"not,omitempty"` + Items *ItemsItem `protobuf:"bytes,30,opt,name=items,proto3" json:"items,omitempty"` + Properties *Properties `protobuf:"bytes,31,opt,name=properties,proto3" json:"properties,omitempty"` + AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,32,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + Default *DefaultType `protobuf:"bytes,33,opt,name=default,proto3" json:"default,omitempty"` + Description string `protobuf:"bytes,34,opt,name=description,proto3" json:"description,omitempty"` + Format string `protobuf:"bytes,35,opt,name=format,proto3" json:"format,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,36,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Schema) Reset() { + *x = Schema{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Schema.ProtoReflect.Descriptor instead. +func (*Schema) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{63} +} + +func (x *Schema) GetNullable() bool { + if x != nil { + return x.Nullable + } + return false +} + +func (x *Schema) GetDiscriminator() *Discriminator { + if x != nil { + return x.Discriminator + } + return nil +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *Schema) GetWriteOnly() bool { + if x != nil { + return x.WriteOnly + } + return false +} + +func (x *Schema) GetXml() *Xml { + if x != nil { + return x.Xml + } + return nil +} + +func (x *Schema) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Schema) GetExample() *Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *Schema) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Schema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Schema) GetMultipleOf() float64 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *Schema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *Schema) GetExclusiveMaximum() bool { + if x != nil { + return x.ExclusiveMaximum + } + return false +} + +func (x *Schema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *Schema) GetExclusiveMinimum() bool { + if x != nil { + return x.ExclusiveMinimum + } + return false +} + +func (x *Schema) GetMaxLength() int64 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *Schema) GetMinLength() int64 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *Schema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Schema) GetMaxItems() int64 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *Schema) GetMinItems() int64 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *Schema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *Schema) GetMaxProperties() int64 { + if x != nil { + return x.MaxProperties + } + return 0 +} + +func (x *Schema) GetMinProperties() int64 { + if x != nil { + return x.MinProperties + } + return 0 +} + +func (x *Schema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *Schema) GetEnum() []*Any { + if x != nil { + return x.Enum + } + return nil +} + +func (x *Schema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Schema) GetAllOf() []*SchemaOrReference { + if x != nil { + return x.AllOf + } + return nil +} + +func (x *Schema) GetOneOf() []*SchemaOrReference { + if x != nil { + return x.OneOf + } + return nil +} + +func (x *Schema) GetAnyOf() []*SchemaOrReference { + if x != nil { + return x.AnyOf + } + return nil +} + +func (x *Schema) GetNot() *Schema { + if x != nil { + return x.Not + } + return nil +} + +func (x *Schema) GetItems() *ItemsItem { + if x != nil { + return x.Items + } + return nil +} + +func (x *Schema) GetProperties() *Properties { + if x != nil { + return x.Properties + } + return nil +} + +func (x *Schema) GetAdditionalProperties() *AdditionalPropertiesItem { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +func (x *Schema) GetDefault() *DefaultType { + if x != nil { + return x.Default + } + return nil +} + +func (x *Schema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Schema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Schema) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type SchemaOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *SchemaOrReference_Schema + // *SchemaOrReference_Reference + Oneof isSchemaOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *SchemaOrReference) Reset() { + *x = SchemaOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchemaOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchemaOrReference) ProtoMessage() {} + +func (x *SchemaOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SchemaOrReference.ProtoReflect.Descriptor instead. +func (*SchemaOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{64} +} + +func (m *SchemaOrReference) GetOneof() isSchemaOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *SchemaOrReference) GetSchema() *Schema { + if x, ok := x.GetOneof().(*SchemaOrReference_Schema); ok { + return x.Schema + } + return nil +} + +func (x *SchemaOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*SchemaOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isSchemaOrReference_Oneof interface { + isSchemaOrReference_Oneof() +} + +type SchemaOrReference_Schema struct { + Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3,oneof"` +} + +type SchemaOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*SchemaOrReference_Schema) isSchemaOrReference_Oneof() {} + +func (*SchemaOrReference_Reference) isSchemaOrReference_Oneof() {} + +type SchemasOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSchemaOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *SchemasOrReferences) Reset() { + *x = SchemasOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchemasOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchemasOrReferences) ProtoMessage() {} + +func (x *SchemasOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SchemasOrReferences.ProtoReflect.Descriptor instead. +func (*SchemasOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{65} +} + +func (x *SchemasOrReferences) GetAdditionalProperties() []*NamedSchemaOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request. +type SecurityRequirement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityRequirement.ProtoReflect.Descriptor instead. +func (*SecurityRequirement) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{66} +} + +func (x *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect. Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE. +type SecurityScheme struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + In string `protobuf:"bytes,4,opt,name=in,proto3" json:"in,omitempty"` + Scheme string `protobuf:"bytes,5,opt,name=scheme,proto3" json:"scheme,omitempty"` + BearerFormat string `protobuf:"bytes,6,opt,name=bearer_format,json=bearerFormat,proto3" json:"bearer_format,omitempty"` + Flows *OauthFlows `protobuf:"bytes,7,opt,name=flows,proto3" json:"flows,omitempty"` + OpenIdConnectUrl string `protobuf:"bytes,8,opt,name=open_id_connect_url,json=openIdConnectUrl,proto3" json:"open_id_connect_url,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,9,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityScheme.ProtoReflect.Descriptor instead. +func (*SecurityScheme) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{67} +} + +func (x *SecurityScheme) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SecurityScheme) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *SecurityScheme) GetScheme() string { + if x != nil { + return x.Scheme + } + return "" +} + +func (x *SecurityScheme) GetBearerFormat() string { + if x != nil { + return x.BearerFormat + } + return "" +} + +func (x *SecurityScheme) GetFlows() *OauthFlows { + if x != nil { + return x.Flows + } + return nil +} + +func (x *SecurityScheme) GetOpenIdConnectUrl() string { + if x != nil { + return x.OpenIdConnectUrl + } + return "" +} + +func (x *SecurityScheme) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type SecuritySchemeOrReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *SecuritySchemeOrReference_SecurityScheme + // *SecuritySchemeOrReference_Reference + Oneof isSecuritySchemeOrReference_Oneof `protobuf_oneof:"oneof"` +} + +func (x *SecuritySchemeOrReference) Reset() { + *x = SecuritySchemeOrReference{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecuritySchemeOrReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecuritySchemeOrReference) ProtoMessage() {} + +func (x *SecuritySchemeOrReference) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecuritySchemeOrReference.ProtoReflect.Descriptor instead. +func (*SecuritySchemeOrReference) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{68} +} + +func (m *SecuritySchemeOrReference) GetOneof() isSecuritySchemeOrReference_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *SecuritySchemeOrReference) GetSecurityScheme() *SecurityScheme { + if x, ok := x.GetOneof().(*SecuritySchemeOrReference_SecurityScheme); ok { + return x.SecurityScheme + } + return nil +} + +func (x *SecuritySchemeOrReference) GetReference() *Reference { + if x, ok := x.GetOneof().(*SecuritySchemeOrReference_Reference); ok { + return x.Reference + } + return nil +} + +type isSecuritySchemeOrReference_Oneof interface { + isSecuritySchemeOrReference_Oneof() +} + +type SecuritySchemeOrReference_SecurityScheme struct { + SecurityScheme *SecurityScheme `protobuf:"bytes,1,opt,name=security_scheme,json=securityScheme,proto3,oneof"` +} + +type SecuritySchemeOrReference_Reference struct { + Reference *Reference `protobuf:"bytes,2,opt,name=reference,proto3,oneof"` +} + +func (*SecuritySchemeOrReference_SecurityScheme) isSecuritySchemeOrReference_Oneof() {} + +func (*SecuritySchemeOrReference_Reference) isSecuritySchemeOrReference_Oneof() {} + +type SecuritySchemesOrReferences struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedSecuritySchemeOrReference `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *SecuritySchemesOrReferences) Reset() { + *x = SecuritySchemesOrReferences{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SecuritySchemesOrReferences) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecuritySchemesOrReferences) ProtoMessage() {} + +func (x *SecuritySchemesOrReferences) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecuritySchemesOrReferences.ProtoReflect.Descriptor instead. +func (*SecuritySchemesOrReferences) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{69} +} + +func (x *SecuritySchemesOrReferences) GetAdditionalProperties() []*NamedSecuritySchemeOrReference { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// An object representing a Server. +type Server struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Variables *ServerVariables `protobuf:"bytes,3,opt,name=variables,proto3" json:"variables,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,4,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Server) Reset() { + *x = Server{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Server) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Server) ProtoMessage() {} + +func (x *Server) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Server.ProtoReflect.Descriptor instead. +func (*Server) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{70} +} + +func (x *Server) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Server) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Server) GetVariables() *ServerVariables { + if x != nil { + return x.Variables + } + return nil +} + +func (x *Server) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// An object representing a Server Variable for server URL template substitution. +type ServerVariable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enum []string `protobuf:"bytes,1,rep,name=enum,proto3" json:"enum,omitempty"` + Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,4,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *ServerVariable) Reset() { + *x = ServerVariable{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerVariable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerVariable) ProtoMessage() {} + +func (x *ServerVariable) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerVariable.ProtoReflect.Descriptor instead. +func (*ServerVariable) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{71} +} + +func (x *ServerVariable) GetEnum() []string { + if x != nil { + return x.Enum + } + return nil +} + +func (x *ServerVariable) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *ServerVariable) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ServerVariable) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +type ServerVariables struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedServerVariable `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *ServerVariables) Reset() { + *x = ServerVariables{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerVariables) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerVariables) ProtoMessage() {} + +func (x *ServerVariables) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[72] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerVariables.ProtoReflect.Descriptor instead. +func (*ServerVariables) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{72} +} + +func (x *ServerVariables) GetAdditionalProperties() []*NamedServerVariable { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Any property starting with x- is valid. +type SpecificationExtension struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Oneof: + // *SpecificationExtension_Number + // *SpecificationExtension_Boolean + // *SpecificationExtension_String_ + Oneof isSpecificationExtension_Oneof `protobuf_oneof:"oneof"` +} + +func (x *SpecificationExtension) Reset() { + *x = SpecificationExtension{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpecificationExtension) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpecificationExtension) ProtoMessage() {} + +func (x *SpecificationExtension) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[73] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpecificationExtension.ProtoReflect.Descriptor instead. +func (*SpecificationExtension) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{73} +} + +func (m *SpecificationExtension) GetOneof() isSpecificationExtension_Oneof { + if m != nil { + return m.Oneof + } + return nil +} + +func (x *SpecificationExtension) GetNumber() float64 { + if x, ok := x.GetOneof().(*SpecificationExtension_Number); ok { + return x.Number + } + return 0 +} + +func (x *SpecificationExtension) GetBoolean() bool { + if x, ok := x.GetOneof().(*SpecificationExtension_Boolean); ok { + return x.Boolean + } + return false +} + +func (x *SpecificationExtension) GetString_() string { + if x, ok := x.GetOneof().(*SpecificationExtension_String_); ok { + return x.String_ + } + return "" +} + +type isSpecificationExtension_Oneof interface { + isSpecificationExtension_Oneof() +} + +type SpecificationExtension_Number struct { + Number float64 `protobuf:"fixed64,1,opt,name=number,proto3,oneof"` +} + +type SpecificationExtension_Boolean struct { + Boolean bool `protobuf:"varint,2,opt,name=boolean,proto3,oneof"` +} + +type SpecificationExtension_String_ struct { + String_ string `protobuf:"bytes,3,opt,name=string,proto3,oneof"` +} + +func (*SpecificationExtension_Number) isSpecificationExtension_Oneof() {} + +func (*SpecificationExtension_Boolean) isSpecificationExtension_Oneof() {} + +func (*SpecificationExtension_String_) isSpecificationExtension_Oneof() {} + +type StringArray struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"` +} + +func (x *StringArray) Reset() { + *x = StringArray{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringArray) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringArray) ProtoMessage() {} + +func (x *StringArray) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StringArray.ProtoReflect.Descriptor instead. +func (*StringArray) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{74} +} + +func (x *StringArray) GetValue() []string { + if x != nil { + return x.Value + } + return nil +} + +type Strings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` +} + +func (x *Strings) Reset() { + *x = Strings{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Strings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Strings) ProtoMessage() {} + +func (x *Strings) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Strings.ProtoReflect.Descriptor instead. +func (*Strings) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{75} +} + +func (x *Strings) GetAdditionalProperties() []*NamedString { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances. +type Tag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + ExternalDocs *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,4,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Tag) Reset() { + *x = Tag{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tag.ProtoReflect.Descriptor instead. +func (*Tag) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{76} +} + +func (x *Tag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocs { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Tag) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +// A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior. +type Xml struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` + Attribute bool `protobuf:"varint,4,opt,name=attribute,proto3" json:"attribute,omitempty"` + Wrapped bool `protobuf:"varint,5,opt,name=wrapped,proto3" json:"wrapped,omitempty"` + SpecificationExtension []*NamedAny `protobuf:"bytes,6,rep,name=specification_extension,json=specificationExtension,proto3" json:"specification_extension,omitempty"` +} + +func (x *Xml) Reset() { + *x = Xml{} + if protoimpl.UnsafeEnabled { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Xml) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Xml) ProtoMessage() {} + +func (x *Xml) ProtoReflect() protoreflect.Message { + mi := &file_openapiv3_OpenAPIv3_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Xml.ProtoReflect.Descriptor instead. +func (*Xml) Descriptor() ([]byte, []int) { + return file_openapiv3_OpenAPIv3_proto_rawDescGZIP(), []int{77} +} + +func (x *Xml) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Xml) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Xml) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *Xml) GetAttribute() bool { + if x != nil { + return x.Attribute + } + return false +} + +func (x *Xml) GetWrapped() bool { + if x != nil { + return x.Wrapped + } + return false +} + +func (x *Xml) GetSpecificationExtension() []*NamedAny { + if x != nil { + return x.SpecificationExtension + } + return nil +} + +var File_openapiv3_OpenAPIv3_proto protoreflect.FileDescriptor + +var file_openapiv3_OpenAPIv3_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x4f, 0x70, 0x65, 0x6e, + 0x41, 0x50, 0x49, 0x76, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, + 0x4f, 0x0a, 0x13, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x42, 0x07, 0x0a, 0x05, + 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x45, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x12, 0x2a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x22, 0x79, 0x0a, 0x0f, + 0x41, 0x6e, 0x79, 0x4f, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, + 0x03, 0x61, 0x6e, 0x79, 0x12, 0x38, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x07, + 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x88, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2d, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x4f, + 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x63, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x35, + 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x72, + 0x0a, 0x15, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0xac, 0x05, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x39, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x3f, 0x0a, 0x09, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x42, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, + 0x4c, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x69, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x69, + 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0d, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x4f, + 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x0f, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x05, + 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x4f, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, + 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, + 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x0b, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x18, 0x0a, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, + 0x22, 0xb2, 0x01, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x07, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x03, 0x0a, 0x08, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x12, 0x24, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, + 0x12, 0x27, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, + 0x68, 0x73, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x23, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x64, 0x6f, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x39, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x09, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x4e, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0xe2, 0x01, 0x0a, 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x12, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x48, 0x00, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x09, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x70, 0x0a, 0x14, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x72, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x57, + 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x4d, 0x0a, 0x17, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x04, 0x0a, 0x06, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x29, + 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x08, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, + 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2c, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x09, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x6e, 0x0a, 0x13, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xc9, 0x02, 0x0a, + 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, + 0x10, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x4f, 0x66, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x5a, 0x0a, 0x09, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x4d, 0x0a, 0x13, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, + 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x22, 0x7e, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe8, 0x02, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x23, 0x0a, + 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x66, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x4f, 0x72, 0x45, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x4f, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x79, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, + 0x6e, 0x6b, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x6a, 0x0a, 0x11, 0x4c, 0x69, + 0x6e, 0x6b, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x55, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x09, 0x4d, 0x65, 0x64, 0x69, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x29, 0x0a, 0x07, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x4f, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x0a, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x65, 0x0a, 0x18, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x4f, 0x72, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x45, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x61, 0x0a, 0x16, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x5d, 0x0a, 0x14, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x51, 0x0a, 0x0e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x67, + 0x0a, 0x19, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4f, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, + 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x6b, 0x0a, 0x1b, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x4f, 0x72, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x65, 0x0a, 0x18, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x61, 0x0a, 0x16, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x71, 0x0a, 0x1e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x5b, 0x0a, 0x13, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x37, 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x55, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0xf2, 0x01, 0x0a, 0x09, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, + 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xcd, 0x02, 0x0a, 0x0a, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, + 0x6f, 0x77, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x69, 0x6d, + 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x52, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x44, 0x0a, 0x12, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x11, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x44, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, + 0x6f, 0x77, 0x52, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x53, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x49, + 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x96, 0x05, 0x0a, 0x09, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x63, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xb1, 0x04, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x29, 0x0a, 0x07, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x4f, + 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x08, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8d, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x35, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, + 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x74, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x12, 0x5a, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xfa, 0x04, 0x0a, + 0x08, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x11, 0x0a, 0x04, 0x5f, 0x72, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x52, 0x65, 0x66, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x67, 0x65, + 0x74, 0x12, 0x27, 0x0a, 0x03, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x70, 0x75, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x6f, + 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x68, 0x65, 0x61, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, + 0x12, 0x2b, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2b, 0x0a, + 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, + 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x05, 0x50, 0x61, + 0x74, 0x68, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x65, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x57, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x5a, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x11, 0x0a, 0x04, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x52, 0x65, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x19, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x69, 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x4f, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0xcc, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x96, + 0x01, 0x0a, 0x16, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x4f, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, + 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x9d, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x72, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, + 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, + 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, + 0x65, 0x6f, 0x66, 0x22, 0xef, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x12, 0x39, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x58, 0x0a, 0x15, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x59, + 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xaf, 0x0b, 0x0a, 0x06, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x75, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x3f, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, + 0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x21, 0x0a, + 0x03, 0x78, 0x6d, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x58, 0x6d, 0x6c, 0x52, 0x03, 0x78, 0x6d, 0x6c, + 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, + 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, + 0x29, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, + 0x78, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, + 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x17, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x23, + 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x65, + 0x6e, 0x75, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6c, 0x6c, 0x5f, 0x6f, + 0x66, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x12, 0x34, 0x0a, + 0x06, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x6f, 0x6e, + 0x65, 0x4f, 0x66, 0x12, 0x34, 0x0a, 0x06, 0x61, 0x6e, 0x79, 0x5f, 0x6f, 0x66, 0x18, 0x1c, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x05, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x12, 0x24, 0x0a, 0x03, 0x6e, 0x6f, 0x74, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x12, + 0x2b, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x49, 0x74, 0x65, 0x6d, + 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x36, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x20, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x31, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x23, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x4d, 0x0a, 0x17, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x24, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x11, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, + 0x35, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, + 0x6e, 0x0a, 0x13, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4f, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x68, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, + 0x72, 0x61, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xd3, 0x02, 0x0a, 0x0e, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4f, 0x61, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, + 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xa2, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x45, 0x0a, + 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x6f, + 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x7e, 0x0a, 0x1b, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x4f, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x14, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x4d, + 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x01, + 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x67, 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x12, 0x54, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x71, 0x0a, 0x16, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x07, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x23, 0x0a, 0x0b, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x57, 0x0a, 0x07, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x15, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x03, 0x54, 0x61, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd6, 0x01, 0x0a, 0x03, 0x58, 0x6d, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, + 0x4d, 0x0a, 0x17, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x33, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x41, 0x6e, 0x79, 0x52, 0x16, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x3e, + 0x0a, 0x0e, 0x6f, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, + 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x16, 0x2e, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x3b, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x33, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_openapiv3_OpenAPIv3_proto_rawDescOnce sync.Once + file_openapiv3_OpenAPIv3_proto_rawDescData = file_openapiv3_OpenAPIv3_proto_rawDesc +) + +func file_openapiv3_OpenAPIv3_proto_rawDescGZIP() []byte { + file_openapiv3_OpenAPIv3_proto_rawDescOnce.Do(func() { + file_openapiv3_OpenAPIv3_proto_rawDescData = protoimpl.X.CompressGZIP(file_openapiv3_OpenAPIv3_proto_rawDescData) + }) + return file_openapiv3_OpenAPIv3_proto_rawDescData +} + +var file_openapiv3_OpenAPIv3_proto_msgTypes = make([]protoimpl.MessageInfo, 78) +var file_openapiv3_OpenAPIv3_proto_goTypes = []interface{}{ + (*AdditionalPropertiesItem)(nil), // 0: openapi.v3.AdditionalPropertiesItem + (*Any)(nil), // 1: openapi.v3.Any + (*AnyOrExpression)(nil), // 2: openapi.v3.AnyOrExpression + (*Callback)(nil), // 3: openapi.v3.Callback + (*CallbackOrReference)(nil), // 4: openapi.v3.CallbackOrReference + (*CallbacksOrReferences)(nil), // 5: openapi.v3.CallbacksOrReferences + (*Components)(nil), // 6: openapi.v3.Components + (*Contact)(nil), // 7: openapi.v3.Contact + (*DefaultType)(nil), // 8: openapi.v3.DefaultType + (*Discriminator)(nil), // 9: openapi.v3.Discriminator + (*Document)(nil), // 10: openapi.v3.Document + (*Encoding)(nil), // 11: openapi.v3.Encoding + (*Encodings)(nil), // 12: openapi.v3.Encodings + (*Example)(nil), // 13: openapi.v3.Example + (*ExampleOrReference)(nil), // 14: openapi.v3.ExampleOrReference + (*ExamplesOrReferences)(nil), // 15: openapi.v3.ExamplesOrReferences + (*Expression)(nil), // 16: openapi.v3.Expression + (*ExternalDocs)(nil), // 17: openapi.v3.ExternalDocs + (*Header)(nil), // 18: openapi.v3.Header + (*HeaderOrReference)(nil), // 19: openapi.v3.HeaderOrReference + (*HeadersOrReferences)(nil), // 20: openapi.v3.HeadersOrReferences + (*Info)(nil), // 21: openapi.v3.Info + (*ItemsItem)(nil), // 22: openapi.v3.ItemsItem + (*License)(nil), // 23: openapi.v3.License + (*Link)(nil), // 24: openapi.v3.Link + (*LinkOrReference)(nil), // 25: openapi.v3.LinkOrReference + (*LinksOrReferences)(nil), // 26: openapi.v3.LinksOrReferences + (*MediaType)(nil), // 27: openapi.v3.MediaType + (*MediaTypes)(nil), // 28: openapi.v3.MediaTypes + (*NamedAny)(nil), // 29: openapi.v3.NamedAny + (*NamedCallbackOrReference)(nil), // 30: openapi.v3.NamedCallbackOrReference + (*NamedEncoding)(nil), // 31: openapi.v3.NamedEncoding + (*NamedExampleOrReference)(nil), // 32: openapi.v3.NamedExampleOrReference + (*NamedHeaderOrReference)(nil), // 33: openapi.v3.NamedHeaderOrReference + (*NamedLinkOrReference)(nil), // 34: openapi.v3.NamedLinkOrReference + (*NamedMediaType)(nil), // 35: openapi.v3.NamedMediaType + (*NamedParameterOrReference)(nil), // 36: openapi.v3.NamedParameterOrReference + (*NamedPathItem)(nil), // 37: openapi.v3.NamedPathItem + (*NamedRequestBodyOrReference)(nil), // 38: openapi.v3.NamedRequestBodyOrReference + (*NamedResponseOrReference)(nil), // 39: openapi.v3.NamedResponseOrReference + (*NamedSchemaOrReference)(nil), // 40: openapi.v3.NamedSchemaOrReference + (*NamedSecuritySchemeOrReference)(nil), // 41: openapi.v3.NamedSecuritySchemeOrReference + (*NamedServerVariable)(nil), // 42: openapi.v3.NamedServerVariable + (*NamedString)(nil), // 43: openapi.v3.NamedString + (*NamedStringArray)(nil), // 44: openapi.v3.NamedStringArray + (*OauthFlow)(nil), // 45: openapi.v3.OauthFlow + (*OauthFlows)(nil), // 46: openapi.v3.OauthFlows + (*Object)(nil), // 47: openapi.v3.Object + (*Operation)(nil), // 48: openapi.v3.Operation + (*Parameter)(nil), // 49: openapi.v3.Parameter + (*ParameterOrReference)(nil), // 50: openapi.v3.ParameterOrReference + (*ParametersOrReferences)(nil), // 51: openapi.v3.ParametersOrReferences + (*PathItem)(nil), // 52: openapi.v3.PathItem + (*Paths)(nil), // 53: openapi.v3.Paths + (*Properties)(nil), // 54: openapi.v3.Properties + (*Reference)(nil), // 55: openapi.v3.Reference + (*RequestBodiesOrReferences)(nil), // 56: openapi.v3.RequestBodiesOrReferences + (*RequestBody)(nil), // 57: openapi.v3.RequestBody + (*RequestBodyOrReference)(nil), // 58: openapi.v3.RequestBodyOrReference + (*Response)(nil), // 59: openapi.v3.Response + (*ResponseOrReference)(nil), // 60: openapi.v3.ResponseOrReference + (*Responses)(nil), // 61: openapi.v3.Responses + (*ResponsesOrReferences)(nil), // 62: openapi.v3.ResponsesOrReferences + (*Schema)(nil), // 63: openapi.v3.Schema + (*SchemaOrReference)(nil), // 64: openapi.v3.SchemaOrReference + (*SchemasOrReferences)(nil), // 65: openapi.v3.SchemasOrReferences + (*SecurityRequirement)(nil), // 66: openapi.v3.SecurityRequirement + (*SecurityScheme)(nil), // 67: openapi.v3.SecurityScheme + (*SecuritySchemeOrReference)(nil), // 68: openapi.v3.SecuritySchemeOrReference + (*SecuritySchemesOrReferences)(nil), // 69: openapi.v3.SecuritySchemesOrReferences + (*Server)(nil), // 70: openapi.v3.Server + (*ServerVariable)(nil), // 71: openapi.v3.ServerVariable + (*ServerVariables)(nil), // 72: openapi.v3.ServerVariables + (*SpecificationExtension)(nil), // 73: openapi.v3.SpecificationExtension + (*StringArray)(nil), // 74: openapi.v3.StringArray + (*Strings)(nil), // 75: openapi.v3.Strings + (*Tag)(nil), // 76: openapi.v3.Tag + (*Xml)(nil), // 77: openapi.v3.Xml + (*anypb.Any)(nil), // 78: google.protobuf.Any +} +var file_openapiv3_OpenAPIv3_proto_depIdxs = []int32{ + 64, // 0: openapi.v3.AdditionalPropertiesItem.schema_or_reference:type_name -> openapi.v3.SchemaOrReference + 78, // 1: openapi.v3.Any.value:type_name -> google.protobuf.Any + 1, // 2: openapi.v3.AnyOrExpression.any:type_name -> openapi.v3.Any + 16, // 3: openapi.v3.AnyOrExpression.expression:type_name -> openapi.v3.Expression + 37, // 4: openapi.v3.Callback.path:type_name -> openapi.v3.NamedPathItem + 29, // 5: openapi.v3.Callback.specification_extension:type_name -> openapi.v3.NamedAny + 3, // 6: openapi.v3.CallbackOrReference.callback:type_name -> openapi.v3.Callback + 55, // 7: openapi.v3.CallbackOrReference.reference:type_name -> openapi.v3.Reference + 30, // 8: openapi.v3.CallbacksOrReferences.additional_properties:type_name -> openapi.v3.NamedCallbackOrReference + 65, // 9: openapi.v3.Components.schemas:type_name -> openapi.v3.SchemasOrReferences + 62, // 10: openapi.v3.Components.responses:type_name -> openapi.v3.ResponsesOrReferences + 51, // 11: openapi.v3.Components.parameters:type_name -> openapi.v3.ParametersOrReferences + 15, // 12: openapi.v3.Components.examples:type_name -> openapi.v3.ExamplesOrReferences + 56, // 13: openapi.v3.Components.request_bodies:type_name -> openapi.v3.RequestBodiesOrReferences + 20, // 14: openapi.v3.Components.headers:type_name -> openapi.v3.HeadersOrReferences + 69, // 15: openapi.v3.Components.security_schemes:type_name -> openapi.v3.SecuritySchemesOrReferences + 26, // 16: openapi.v3.Components.links:type_name -> openapi.v3.LinksOrReferences + 5, // 17: openapi.v3.Components.callbacks:type_name -> openapi.v3.CallbacksOrReferences + 29, // 18: openapi.v3.Components.specification_extension:type_name -> openapi.v3.NamedAny + 29, // 19: openapi.v3.Contact.specification_extension:type_name -> openapi.v3.NamedAny + 75, // 20: openapi.v3.Discriminator.mapping:type_name -> openapi.v3.Strings + 29, // 21: openapi.v3.Discriminator.specification_extension:type_name -> openapi.v3.NamedAny + 21, // 22: openapi.v3.Document.info:type_name -> openapi.v3.Info + 70, // 23: openapi.v3.Document.servers:type_name -> openapi.v3.Server + 53, // 24: openapi.v3.Document.paths:type_name -> openapi.v3.Paths + 6, // 25: openapi.v3.Document.components:type_name -> openapi.v3.Components + 66, // 26: openapi.v3.Document.security:type_name -> openapi.v3.SecurityRequirement + 76, // 27: openapi.v3.Document.tags:type_name -> openapi.v3.Tag + 17, // 28: openapi.v3.Document.external_docs:type_name -> openapi.v3.ExternalDocs + 29, // 29: openapi.v3.Document.specification_extension:type_name -> openapi.v3.NamedAny + 20, // 30: openapi.v3.Encoding.headers:type_name -> openapi.v3.HeadersOrReferences + 29, // 31: openapi.v3.Encoding.specification_extension:type_name -> openapi.v3.NamedAny + 31, // 32: openapi.v3.Encodings.additional_properties:type_name -> openapi.v3.NamedEncoding + 1, // 33: openapi.v3.Example.value:type_name -> openapi.v3.Any + 29, // 34: openapi.v3.Example.specification_extension:type_name -> openapi.v3.NamedAny + 13, // 35: openapi.v3.ExampleOrReference.example:type_name -> openapi.v3.Example + 55, // 36: openapi.v3.ExampleOrReference.reference:type_name -> openapi.v3.Reference + 32, // 37: openapi.v3.ExamplesOrReferences.additional_properties:type_name -> openapi.v3.NamedExampleOrReference + 29, // 38: openapi.v3.Expression.additional_properties:type_name -> openapi.v3.NamedAny + 29, // 39: openapi.v3.ExternalDocs.specification_extension:type_name -> openapi.v3.NamedAny + 64, // 40: openapi.v3.Header.schema:type_name -> openapi.v3.SchemaOrReference + 1, // 41: openapi.v3.Header.example:type_name -> openapi.v3.Any + 15, // 42: openapi.v3.Header.examples:type_name -> openapi.v3.ExamplesOrReferences + 28, // 43: openapi.v3.Header.content:type_name -> openapi.v3.MediaTypes + 29, // 44: openapi.v3.Header.specification_extension:type_name -> openapi.v3.NamedAny + 18, // 45: openapi.v3.HeaderOrReference.header:type_name -> openapi.v3.Header + 55, // 46: openapi.v3.HeaderOrReference.reference:type_name -> openapi.v3.Reference + 33, // 47: openapi.v3.HeadersOrReferences.additional_properties:type_name -> openapi.v3.NamedHeaderOrReference + 7, // 48: openapi.v3.Info.contact:type_name -> openapi.v3.Contact + 23, // 49: openapi.v3.Info.license:type_name -> openapi.v3.License + 29, // 50: openapi.v3.Info.specification_extension:type_name -> openapi.v3.NamedAny + 64, // 51: openapi.v3.ItemsItem.schema_or_reference:type_name -> openapi.v3.SchemaOrReference + 29, // 52: openapi.v3.License.specification_extension:type_name -> openapi.v3.NamedAny + 2, // 53: openapi.v3.Link.parameters:type_name -> openapi.v3.AnyOrExpression + 2, // 54: openapi.v3.Link.request_body:type_name -> openapi.v3.AnyOrExpression + 70, // 55: openapi.v3.Link.server:type_name -> openapi.v3.Server + 29, // 56: openapi.v3.Link.specification_extension:type_name -> openapi.v3.NamedAny + 24, // 57: openapi.v3.LinkOrReference.link:type_name -> openapi.v3.Link + 55, // 58: openapi.v3.LinkOrReference.reference:type_name -> openapi.v3.Reference + 34, // 59: openapi.v3.LinksOrReferences.additional_properties:type_name -> openapi.v3.NamedLinkOrReference + 64, // 60: openapi.v3.MediaType.schema:type_name -> openapi.v3.SchemaOrReference + 1, // 61: openapi.v3.MediaType.example:type_name -> openapi.v3.Any + 15, // 62: openapi.v3.MediaType.examples:type_name -> openapi.v3.ExamplesOrReferences + 12, // 63: openapi.v3.MediaType.encoding:type_name -> openapi.v3.Encodings + 29, // 64: openapi.v3.MediaType.specification_extension:type_name -> openapi.v3.NamedAny + 35, // 65: openapi.v3.MediaTypes.additional_properties:type_name -> openapi.v3.NamedMediaType + 1, // 66: openapi.v3.NamedAny.value:type_name -> openapi.v3.Any + 4, // 67: openapi.v3.NamedCallbackOrReference.value:type_name -> openapi.v3.CallbackOrReference + 11, // 68: openapi.v3.NamedEncoding.value:type_name -> openapi.v3.Encoding + 14, // 69: openapi.v3.NamedExampleOrReference.value:type_name -> openapi.v3.ExampleOrReference + 19, // 70: openapi.v3.NamedHeaderOrReference.value:type_name -> openapi.v3.HeaderOrReference + 25, // 71: openapi.v3.NamedLinkOrReference.value:type_name -> openapi.v3.LinkOrReference + 27, // 72: openapi.v3.NamedMediaType.value:type_name -> openapi.v3.MediaType + 50, // 73: openapi.v3.NamedParameterOrReference.value:type_name -> openapi.v3.ParameterOrReference + 52, // 74: openapi.v3.NamedPathItem.value:type_name -> openapi.v3.PathItem + 58, // 75: openapi.v3.NamedRequestBodyOrReference.value:type_name -> openapi.v3.RequestBodyOrReference + 60, // 76: openapi.v3.NamedResponseOrReference.value:type_name -> openapi.v3.ResponseOrReference + 64, // 77: openapi.v3.NamedSchemaOrReference.value:type_name -> openapi.v3.SchemaOrReference + 68, // 78: openapi.v3.NamedSecuritySchemeOrReference.value:type_name -> openapi.v3.SecuritySchemeOrReference + 71, // 79: openapi.v3.NamedServerVariable.value:type_name -> openapi.v3.ServerVariable + 74, // 80: openapi.v3.NamedStringArray.value:type_name -> openapi.v3.StringArray + 75, // 81: openapi.v3.OauthFlow.scopes:type_name -> openapi.v3.Strings + 29, // 82: openapi.v3.OauthFlow.specification_extension:type_name -> openapi.v3.NamedAny + 45, // 83: openapi.v3.OauthFlows.implicit:type_name -> openapi.v3.OauthFlow + 45, // 84: openapi.v3.OauthFlows.password:type_name -> openapi.v3.OauthFlow + 45, // 85: openapi.v3.OauthFlows.client_credentials:type_name -> openapi.v3.OauthFlow + 45, // 86: openapi.v3.OauthFlows.authorization_code:type_name -> openapi.v3.OauthFlow + 29, // 87: openapi.v3.OauthFlows.specification_extension:type_name -> openapi.v3.NamedAny + 29, // 88: openapi.v3.Object.additional_properties:type_name -> openapi.v3.NamedAny + 17, // 89: openapi.v3.Operation.external_docs:type_name -> openapi.v3.ExternalDocs + 50, // 90: openapi.v3.Operation.parameters:type_name -> openapi.v3.ParameterOrReference + 58, // 91: openapi.v3.Operation.request_body:type_name -> openapi.v3.RequestBodyOrReference + 61, // 92: openapi.v3.Operation.responses:type_name -> openapi.v3.Responses + 5, // 93: openapi.v3.Operation.callbacks:type_name -> openapi.v3.CallbacksOrReferences + 66, // 94: openapi.v3.Operation.security:type_name -> openapi.v3.SecurityRequirement + 70, // 95: openapi.v3.Operation.servers:type_name -> openapi.v3.Server + 29, // 96: openapi.v3.Operation.specification_extension:type_name -> openapi.v3.NamedAny + 64, // 97: openapi.v3.Parameter.schema:type_name -> openapi.v3.SchemaOrReference + 1, // 98: openapi.v3.Parameter.example:type_name -> openapi.v3.Any + 15, // 99: openapi.v3.Parameter.examples:type_name -> openapi.v3.ExamplesOrReferences + 28, // 100: openapi.v3.Parameter.content:type_name -> openapi.v3.MediaTypes + 29, // 101: openapi.v3.Parameter.specification_extension:type_name -> openapi.v3.NamedAny + 49, // 102: openapi.v3.ParameterOrReference.parameter:type_name -> openapi.v3.Parameter + 55, // 103: openapi.v3.ParameterOrReference.reference:type_name -> openapi.v3.Reference + 36, // 104: openapi.v3.ParametersOrReferences.additional_properties:type_name -> openapi.v3.NamedParameterOrReference + 48, // 105: openapi.v3.PathItem.get:type_name -> openapi.v3.Operation + 48, // 106: openapi.v3.PathItem.put:type_name -> openapi.v3.Operation + 48, // 107: openapi.v3.PathItem.post:type_name -> openapi.v3.Operation + 48, // 108: openapi.v3.PathItem.delete:type_name -> openapi.v3.Operation + 48, // 109: openapi.v3.PathItem.options:type_name -> openapi.v3.Operation + 48, // 110: openapi.v3.PathItem.head:type_name -> openapi.v3.Operation + 48, // 111: openapi.v3.PathItem.patch:type_name -> openapi.v3.Operation + 48, // 112: openapi.v3.PathItem.trace:type_name -> openapi.v3.Operation + 70, // 113: openapi.v3.PathItem.servers:type_name -> openapi.v3.Server + 50, // 114: openapi.v3.PathItem.parameters:type_name -> openapi.v3.ParameterOrReference + 29, // 115: openapi.v3.PathItem.specification_extension:type_name -> openapi.v3.NamedAny + 37, // 116: openapi.v3.Paths.path:type_name -> openapi.v3.NamedPathItem + 29, // 117: openapi.v3.Paths.specification_extension:type_name -> openapi.v3.NamedAny + 40, // 118: openapi.v3.Properties.additional_properties:type_name -> openapi.v3.NamedSchemaOrReference + 38, // 119: openapi.v3.RequestBodiesOrReferences.additional_properties:type_name -> openapi.v3.NamedRequestBodyOrReference + 28, // 120: openapi.v3.RequestBody.content:type_name -> openapi.v3.MediaTypes + 29, // 121: openapi.v3.RequestBody.specification_extension:type_name -> openapi.v3.NamedAny + 57, // 122: openapi.v3.RequestBodyOrReference.request_body:type_name -> openapi.v3.RequestBody + 55, // 123: openapi.v3.RequestBodyOrReference.reference:type_name -> openapi.v3.Reference + 20, // 124: openapi.v3.Response.headers:type_name -> openapi.v3.HeadersOrReferences + 28, // 125: openapi.v3.Response.content:type_name -> openapi.v3.MediaTypes + 26, // 126: openapi.v3.Response.links:type_name -> openapi.v3.LinksOrReferences + 29, // 127: openapi.v3.Response.specification_extension:type_name -> openapi.v3.NamedAny + 59, // 128: openapi.v3.ResponseOrReference.response:type_name -> openapi.v3.Response + 55, // 129: openapi.v3.ResponseOrReference.reference:type_name -> openapi.v3.Reference + 60, // 130: openapi.v3.Responses.default:type_name -> openapi.v3.ResponseOrReference + 39, // 131: openapi.v3.Responses.response_or_reference:type_name -> openapi.v3.NamedResponseOrReference + 29, // 132: openapi.v3.Responses.specification_extension:type_name -> openapi.v3.NamedAny + 39, // 133: openapi.v3.ResponsesOrReferences.additional_properties:type_name -> openapi.v3.NamedResponseOrReference + 9, // 134: openapi.v3.Schema.discriminator:type_name -> openapi.v3.Discriminator + 77, // 135: openapi.v3.Schema.xml:type_name -> openapi.v3.Xml + 17, // 136: openapi.v3.Schema.external_docs:type_name -> openapi.v3.ExternalDocs + 1, // 137: openapi.v3.Schema.example:type_name -> openapi.v3.Any + 1, // 138: openapi.v3.Schema.enum:type_name -> openapi.v3.Any + 64, // 139: openapi.v3.Schema.all_of:type_name -> openapi.v3.SchemaOrReference + 64, // 140: openapi.v3.Schema.one_of:type_name -> openapi.v3.SchemaOrReference + 64, // 141: openapi.v3.Schema.any_of:type_name -> openapi.v3.SchemaOrReference + 63, // 142: openapi.v3.Schema.not:type_name -> openapi.v3.Schema + 22, // 143: openapi.v3.Schema.items:type_name -> openapi.v3.ItemsItem + 54, // 144: openapi.v3.Schema.properties:type_name -> openapi.v3.Properties + 0, // 145: openapi.v3.Schema.additional_properties:type_name -> openapi.v3.AdditionalPropertiesItem + 8, // 146: openapi.v3.Schema.default:type_name -> openapi.v3.DefaultType + 29, // 147: openapi.v3.Schema.specification_extension:type_name -> openapi.v3.NamedAny + 63, // 148: openapi.v3.SchemaOrReference.schema:type_name -> openapi.v3.Schema + 55, // 149: openapi.v3.SchemaOrReference.reference:type_name -> openapi.v3.Reference + 40, // 150: openapi.v3.SchemasOrReferences.additional_properties:type_name -> openapi.v3.NamedSchemaOrReference + 44, // 151: openapi.v3.SecurityRequirement.additional_properties:type_name -> openapi.v3.NamedStringArray + 46, // 152: openapi.v3.SecurityScheme.flows:type_name -> openapi.v3.OauthFlows + 29, // 153: openapi.v3.SecurityScheme.specification_extension:type_name -> openapi.v3.NamedAny + 67, // 154: openapi.v3.SecuritySchemeOrReference.security_scheme:type_name -> openapi.v3.SecurityScheme + 55, // 155: openapi.v3.SecuritySchemeOrReference.reference:type_name -> openapi.v3.Reference + 41, // 156: openapi.v3.SecuritySchemesOrReferences.additional_properties:type_name -> openapi.v3.NamedSecuritySchemeOrReference + 72, // 157: openapi.v3.Server.variables:type_name -> openapi.v3.ServerVariables + 29, // 158: openapi.v3.Server.specification_extension:type_name -> openapi.v3.NamedAny + 29, // 159: openapi.v3.ServerVariable.specification_extension:type_name -> openapi.v3.NamedAny + 42, // 160: openapi.v3.ServerVariables.additional_properties:type_name -> openapi.v3.NamedServerVariable + 43, // 161: openapi.v3.Strings.additional_properties:type_name -> openapi.v3.NamedString + 17, // 162: openapi.v3.Tag.external_docs:type_name -> openapi.v3.ExternalDocs + 29, // 163: openapi.v3.Tag.specification_extension:type_name -> openapi.v3.NamedAny + 29, // 164: openapi.v3.Xml.specification_extension:type_name -> openapi.v3.NamedAny + 165, // [165:165] is the sub-list for method output_type + 165, // [165:165] is the sub-list for method input_type + 165, // [165:165] is the sub-list for extension type_name + 165, // [165:165] is the sub-list for extension extendee + 0, // [0:165] is the sub-list for field type_name +} + +func init() { file_openapiv3_OpenAPIv3_proto_init() } +func file_openapiv3_OpenAPIv3_proto_init() { + if File_openapiv3_OpenAPIv3_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_openapiv3_OpenAPIv3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AdditionalPropertiesItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Any); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AnyOrExpression); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Callback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CallbackOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CallbacksOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Components); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Contact); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DefaultType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Discriminator); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Document); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Encoding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Encodings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Example); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExampleOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExamplesOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Expression); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExternalDocs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Header); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeaderOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeadersOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Info); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ItemsItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Link); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinksOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MediaTypes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedAny); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedCallbackOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedEncoding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedExampleOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedHeaderOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedLinkOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedMediaType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedParameterOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedPathItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedRequestBodyOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedResponseOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedSchemaOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedSecuritySchemeOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedServerVariable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedString); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamedStringArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OauthFlow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OauthFlows); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Object); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Operation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Parameter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParameterOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParametersOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PathItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Paths); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Properties); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Reference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestBodiesOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestBodyOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponseOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Responses); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResponsesOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Schema); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchemaOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchemasOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityRequirement); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityScheme); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecuritySchemeOrReference); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecuritySchemesOrReferences); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Server); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerVariable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerVariables); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpecificationExtension); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringArray); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Strings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Xml); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_openapiv3_OpenAPIv3_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*AdditionalPropertiesItem_SchemaOrReference)(nil), + (*AdditionalPropertiesItem_Boolean)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*AnyOrExpression_Any)(nil), + (*AnyOrExpression_Expression)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*CallbackOrReference_Callback)(nil), + (*CallbackOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[8].OneofWrappers = []interface{}{ + (*DefaultType_Number)(nil), + (*DefaultType_Boolean)(nil), + (*DefaultType_String_)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*ExampleOrReference_Example)(nil), + (*ExampleOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[19].OneofWrappers = []interface{}{ + (*HeaderOrReference_Header)(nil), + (*HeaderOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[25].OneofWrappers = []interface{}{ + (*LinkOrReference_Link)(nil), + (*LinkOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[50].OneofWrappers = []interface{}{ + (*ParameterOrReference_Parameter)(nil), + (*ParameterOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[58].OneofWrappers = []interface{}{ + (*RequestBodyOrReference_RequestBody)(nil), + (*RequestBodyOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[60].OneofWrappers = []interface{}{ + (*ResponseOrReference_Response)(nil), + (*ResponseOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[64].OneofWrappers = []interface{}{ + (*SchemaOrReference_Schema)(nil), + (*SchemaOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[68].OneofWrappers = []interface{}{ + (*SecuritySchemeOrReference_SecurityScheme)(nil), + (*SecuritySchemeOrReference_Reference)(nil), + } + file_openapiv3_OpenAPIv3_proto_msgTypes[73].OneofWrappers = []interface{}{ + (*SpecificationExtension_Number)(nil), + (*SpecificationExtension_Boolean)(nil), + (*SpecificationExtension_String_)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_openapiv3_OpenAPIv3_proto_rawDesc, + NumEnums: 0, + NumMessages: 78, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_openapiv3_OpenAPIv3_proto_goTypes, + DependencyIndexes: file_openapiv3_OpenAPIv3_proto_depIdxs, + MessageInfos: file_openapiv3_OpenAPIv3_proto_msgTypes, + }.Build() + File_openapiv3_OpenAPIv3_proto = out.File + file_openapiv3_OpenAPIv3_proto_rawDesc = nil + file_openapiv3_OpenAPIv3_proto_goTypes = nil + file_openapiv3_OpenAPIv3_proto_depIdxs = nil +} diff --git a/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto new file mode 100644 index 00000000..1be335b8 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/OpenAPIv3.proto @@ -0,0 +1,672 @@ +// Copyright 2020 Google LLC. All Rights Reserved. +// +// 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. + +// THIS FILE IS AUTOMATICALLY GENERATED. + +syntax = "proto3"; + +package openapi.v3; + +import "google/protobuf/any.proto"; + +// This option lets the proto compiler generate Java code inside the package +// name (see below) instead of inside an outer class. It creates a simpler +// developer experience by reducing one-level of name nesting and be +// consistent with most programming languages that don't support outer classes. +option java_multiple_files = true; + +// The Java outer classname should be the filename in UpperCamelCase. This +// class is only used to hold proto descriptor, so developers don't need to +// work with it directly. +option java_outer_classname = "OpenAPIProto"; + +// The Java package name must be proto package name with proper prefix. +option java_package = "org.openapi_v3"; + +// A reasonable prefix for the Objective-C symbols generated from the package. +// It should at a minimum be 3 characters long, all uppercase, and convention +// is to use an abbreviation of the package name. Something short, but +// hopefully unique enough to not conflict with things that may come along in +// the future. 'GPB' is reserved for the protocol buffer implementation itself. +option objc_class_prefix = "OAS"; + +// The Go package name. +option go_package = "./openapiv3;openapi_v3"; + +message AdditionalPropertiesItem { + oneof oneof { + SchemaOrReference schema_or_reference = 1; + bool boolean = 2; + } +} + +message Any { + google.protobuf.Any value = 1; + string yaml = 2; +} + +message AnyOrExpression { + oneof oneof { + Any any = 1; + Expression expression = 2; + } +} + +// A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation. +message Callback { + repeated NamedPathItem path = 1; + repeated NamedAny specification_extension = 2; +} + +message CallbackOrReference { + oneof oneof { + Callback callback = 1; + Reference reference = 2; + } +} + +message CallbacksOrReferences { + repeated NamedCallbackOrReference additional_properties = 1; +} + +// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object. +message Components { + SchemasOrReferences schemas = 1; + ResponsesOrReferences responses = 2; + ParametersOrReferences parameters = 3; + ExamplesOrReferences examples = 4; + RequestBodiesOrReferences request_bodies = 5; + HeadersOrReferences headers = 6; + SecuritySchemesOrReferences security_schemes = 7; + LinksOrReferences links = 8; + CallbacksOrReferences callbacks = 9; + repeated NamedAny specification_extension = 10; +} + +// Contact information for the exposed API. +message Contact { + string name = 1; + string url = 2; + string email = 3; + repeated NamedAny specification_extension = 4; +} + +message DefaultType { + oneof oneof { + double number = 1; + bool boolean = 2; + string string = 3; + } +} + +// When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered. +message Discriminator { + string property_name = 1; + Strings mapping = 2; + repeated NamedAny specification_extension = 3; +} + +message Document { + string openapi = 1; + Info info = 2; + repeated Server servers = 3; + Paths paths = 4; + Components components = 5; + repeated SecurityRequirement security = 6; + repeated Tag tags = 7; + ExternalDocs external_docs = 8; + repeated NamedAny specification_extension = 9; +} + +// A single encoding definition applied to a single schema property. +message Encoding { + string content_type = 1; + HeadersOrReferences headers = 2; + string style = 3; + bool explode = 4; + bool allow_reserved = 5; + repeated NamedAny specification_extension = 6; +} + +message Encodings { + repeated NamedEncoding additional_properties = 1; +} + +message Example { + string summary = 1; + string description = 2; + Any value = 3; + string external_value = 4; + repeated NamedAny specification_extension = 5; +} + +message ExampleOrReference { + oneof oneof { + Example example = 1; + Reference reference = 2; + } +} + +message ExamplesOrReferences { + repeated NamedExampleOrReference additional_properties = 1; +} + +message Expression { + repeated NamedAny additional_properties = 1; +} + +// Allows referencing an external resource for extended documentation. +message ExternalDocs { + string description = 1; + string url = 2; + repeated NamedAny specification_extension = 3; +} + +// The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`). +message Header { + string description = 1; + bool required = 2; + bool deprecated = 3; + bool allow_empty_value = 4; + string style = 5; + bool explode = 6; + bool allow_reserved = 7; + SchemaOrReference schema = 8; + Any example = 9; + ExamplesOrReferences examples = 10; + MediaTypes content = 11; + repeated NamedAny specification_extension = 12; +} + +message HeaderOrReference { + oneof oneof { + Header header = 1; + Reference reference = 2; + } +} + +message HeadersOrReferences { + repeated NamedHeaderOrReference additional_properties = 1; +} + +// The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience. +message Info { + string title = 1; + string description = 2; + string terms_of_service = 3; + Contact contact = 4; + License license = 5; + string version = 6; + repeated NamedAny specification_extension = 7; + string summary = 8; +} + +message ItemsItem { + repeated SchemaOrReference schema_or_reference = 1; +} + +// License information for the exposed API. +message License { + string name = 1; + string url = 2; + repeated NamedAny specification_extension = 3; +} + +// The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation. +message Link { + string operation_ref = 1; + string operation_id = 2; + AnyOrExpression parameters = 3; + AnyOrExpression request_body = 4; + string description = 5; + Server server = 6; + repeated NamedAny specification_extension = 7; +} + +message LinkOrReference { + oneof oneof { + Link link = 1; + Reference reference = 2; + } +} + +message LinksOrReferences { + repeated NamedLinkOrReference additional_properties = 1; +} + +// Each Media Type Object provides schema and examples for the media type identified by its key. +message MediaType { + SchemaOrReference schema = 1; + Any example = 2; + ExamplesOrReferences examples = 3; + Encodings encoding = 4; + repeated NamedAny specification_extension = 5; +} + +message MediaTypes { + repeated NamedMediaType additional_properties = 1; +} + +// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. +message NamedAny { + // Map key + string name = 1; + // Mapped value + Any value = 2; +} + +// Automatically-generated message used to represent maps of CallbackOrReference as ordered (name,value) pairs. +message NamedCallbackOrReference { + // Map key + string name = 1; + // Mapped value + CallbackOrReference value = 2; +} + +// Automatically-generated message used to represent maps of Encoding as ordered (name,value) pairs. +message NamedEncoding { + // Map key + string name = 1; + // Mapped value + Encoding value = 2; +} + +// Automatically-generated message used to represent maps of ExampleOrReference as ordered (name,value) pairs. +message NamedExampleOrReference { + // Map key + string name = 1; + // Mapped value + ExampleOrReference value = 2; +} + +// Automatically-generated message used to represent maps of HeaderOrReference as ordered (name,value) pairs. +message NamedHeaderOrReference { + // Map key + string name = 1; + // Mapped value + HeaderOrReference value = 2; +} + +// Automatically-generated message used to represent maps of LinkOrReference as ordered (name,value) pairs. +message NamedLinkOrReference { + // Map key + string name = 1; + // Mapped value + LinkOrReference value = 2; +} + +// Automatically-generated message used to represent maps of MediaType as ordered (name,value) pairs. +message NamedMediaType { + // Map key + string name = 1; + // Mapped value + MediaType value = 2; +} + +// Automatically-generated message used to represent maps of ParameterOrReference as ordered (name,value) pairs. +message NamedParameterOrReference { + // Map key + string name = 1; + // Mapped value + ParameterOrReference value = 2; +} + +// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. +message NamedPathItem { + // Map key + string name = 1; + // Mapped value + PathItem value = 2; +} + +// Automatically-generated message used to represent maps of RequestBodyOrReference as ordered (name,value) pairs. +message NamedRequestBodyOrReference { + // Map key + string name = 1; + // Mapped value + RequestBodyOrReference value = 2; +} + +// Automatically-generated message used to represent maps of ResponseOrReference as ordered (name,value) pairs. +message NamedResponseOrReference { + // Map key + string name = 1; + // Mapped value + ResponseOrReference value = 2; +} + +// Automatically-generated message used to represent maps of SchemaOrReference as ordered (name,value) pairs. +message NamedSchemaOrReference { + // Map key + string name = 1; + // Mapped value + SchemaOrReference value = 2; +} + +// Automatically-generated message used to represent maps of SecuritySchemeOrReference as ordered (name,value) pairs. +message NamedSecuritySchemeOrReference { + // Map key + string name = 1; + // Mapped value + SecuritySchemeOrReference value = 2; +} + +// Automatically-generated message used to represent maps of ServerVariable as ordered (name,value) pairs. +message NamedServerVariable { + // Map key + string name = 1; + // Mapped value + ServerVariable value = 2; +} + +// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. +message NamedString { + // Map key + string name = 1; + // Mapped value + string value = 2; +} + +// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. +message NamedStringArray { + // Map key + string name = 1; + // Mapped value + StringArray value = 2; +} + +// Configuration details for a supported OAuth Flow +message OauthFlow { + string authorization_url = 1; + string token_url = 2; + string refresh_url = 3; + Strings scopes = 4; + repeated NamedAny specification_extension = 5; +} + +// Allows configuration of the supported OAuth Flows. +message OauthFlows { + OauthFlow implicit = 1; + OauthFlow password = 2; + OauthFlow client_credentials = 3; + OauthFlow authorization_code = 4; + repeated NamedAny specification_extension = 5; +} + +message Object { + repeated NamedAny additional_properties = 1; +} + +// Describes a single API operation on a path. +message Operation { + repeated string tags = 1; + string summary = 2; + string description = 3; + ExternalDocs external_docs = 4; + string operation_id = 5; + repeated ParameterOrReference parameters = 6; + RequestBodyOrReference request_body = 7; + Responses responses = 8; + CallbacksOrReferences callbacks = 9; + bool deprecated = 10; + repeated SecurityRequirement security = 11; + repeated Server servers = 12; + repeated NamedAny specification_extension = 13; +} + +// Describes a single operation parameter. A unique parameter is defined by a combination of a name and location. +message Parameter { + string name = 1; + string in = 2; + string description = 3; + bool required = 4; + bool deprecated = 5; + bool allow_empty_value = 6; + string style = 7; + bool explode = 8; + bool allow_reserved = 9; + SchemaOrReference schema = 10; + Any example = 11; + ExamplesOrReferences examples = 12; + MediaTypes content = 13; + repeated NamedAny specification_extension = 14; +} + +message ParameterOrReference { + oneof oneof { + Parameter parameter = 1; + Reference reference = 2; + } +} + +message ParametersOrReferences { + repeated NamedParameterOrReference additional_properties = 1; +} + +// Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available. +message PathItem { + string _ref = 1; + string summary = 2; + string description = 3; + Operation get = 4; + Operation put = 5; + Operation post = 6; + Operation delete = 7; + Operation options = 8; + Operation head = 9; + Operation patch = 10; + Operation trace = 11; + repeated Server servers = 12; + repeated ParameterOrReference parameters = 13; + repeated NamedAny specification_extension = 14; +} + +// Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints. +message Paths { + repeated NamedPathItem path = 1; + repeated NamedAny specification_extension = 2; +} + +message Properties { + repeated NamedSchemaOrReference additional_properties = 1; +} + +// A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification. +message Reference { + string _ref = 1; + string summary = 2; + string description = 3; +} + +message RequestBodiesOrReferences { + repeated NamedRequestBodyOrReference additional_properties = 1; +} + +// Describes a single request body. +message RequestBody { + string description = 1; + MediaTypes content = 2; + bool required = 3; + repeated NamedAny specification_extension = 4; +} + +message RequestBodyOrReference { + oneof oneof { + RequestBody request_body = 1; + Reference reference = 2; + } +} + +// Describes a single response from an API Operation, including design-time, static `links` to operations based on the response. +message Response { + string description = 1; + HeadersOrReferences headers = 2; + MediaTypes content = 3; + LinksOrReferences links = 4; + repeated NamedAny specification_extension = 5; +} + +message ResponseOrReference { + oneof oneof { + Response response = 1; + Reference reference = 2; + } +} + +// A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call. +message Responses { + ResponseOrReference default = 1; + repeated NamedResponseOrReference response_or_reference = 2; + repeated NamedAny specification_extension = 3; +} + +message ResponsesOrReferences { + repeated NamedResponseOrReference additional_properties = 1; +} + +// The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema. +message Schema { + bool nullable = 1; + Discriminator discriminator = 2; + bool read_only = 3; + bool write_only = 4; + Xml xml = 5; + ExternalDocs external_docs = 6; + Any example = 7; + bool deprecated = 8; + string title = 9; + double multiple_of = 10; + double maximum = 11; + bool exclusive_maximum = 12; + double minimum = 13; + bool exclusive_minimum = 14; + int64 max_length = 15; + int64 min_length = 16; + string pattern = 17; + int64 max_items = 18; + int64 min_items = 19; + bool unique_items = 20; + int64 max_properties = 21; + int64 min_properties = 22; + repeated string required = 23; + repeated Any enum = 24; + string type = 25; + repeated SchemaOrReference all_of = 26; + repeated SchemaOrReference one_of = 27; + repeated SchemaOrReference any_of = 28; + Schema not = 29; + ItemsItem items = 30; + Properties properties = 31; + AdditionalPropertiesItem additional_properties = 32; + DefaultType default = 33; + string description = 34; + string format = 35; + repeated NamedAny specification_extension = 36; +} + +message SchemaOrReference { + oneof oneof { + Schema schema = 1; + Reference reference = 2; + } +} + +message SchemasOrReferences { + repeated NamedSchemaOrReference additional_properties = 1; +} + +// Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request. +message SecurityRequirement { + repeated NamedStringArray additional_properties = 1; +} + +// Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect. Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE. +message SecurityScheme { + string type = 1; + string description = 2; + string name = 3; + string in = 4; + string scheme = 5; + string bearer_format = 6; + OauthFlows flows = 7; + string open_id_connect_url = 8; + repeated NamedAny specification_extension = 9; +} + +message SecuritySchemeOrReference { + oneof oneof { + SecurityScheme security_scheme = 1; + Reference reference = 2; + } +} + +message SecuritySchemesOrReferences { + repeated NamedSecuritySchemeOrReference additional_properties = 1; +} + +// An object representing a Server. +message Server { + string url = 1; + string description = 2; + ServerVariables variables = 3; + repeated NamedAny specification_extension = 4; +} + +// An object representing a Server Variable for server URL template substitution. +message ServerVariable { + repeated string enum = 1; + string default = 2; + string description = 3; + repeated NamedAny specification_extension = 4; +} + +message ServerVariables { + repeated NamedServerVariable additional_properties = 1; +} + +// Any property starting with x- is valid. +message SpecificationExtension { + oneof oneof { + double number = 1; + bool boolean = 2; + string string = 3; + } +} + +message StringArray { + repeated string value = 1; +} + +message Strings { + repeated NamedString additional_properties = 1; +} + +// Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances. +message Tag { + string name = 1; + string description = 2; + ExternalDocs external_docs = 3; + repeated NamedAny specification_extension = 4; +} + +// A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior. +message Xml { + string name = 1; + string namespace = 2; + string prefix = 3; + bool attribute = 4; + bool wrapped = 5; + repeated NamedAny specification_extension = 6; +} + diff --git a/vendor/github.com/google/gnostic/openapiv3/README.md b/vendor/github.com/google/gnostic/openapiv3/README.md new file mode 100644 index 00000000..5ee12d92 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/README.md @@ -0,0 +1,21 @@ +# OpenAPI v3 Protocol Buffer Models + +This directory contains a Protocol Buffer-language model and related code for +supporting OpenAPI v3. + +Gnostic applications and plugins can use OpenAPIv3.proto to generate Protocol +Buffer support code for their preferred languages. + +OpenAPIv3.go is used by Gnostic to read JSON and YAML OpenAPI descriptions into +the Protocol Buffer-based datastructures generated from OpenAPIv3.proto. + +OpenAPIv3.proto and OpenAPIv3.go are generated by the Gnostic compiler +generator, and OpenAPIv3.pb.go is generated by protoc, the Protocol Buffer +compiler, and protoc-gen-go, the Protocol Buffer Go code generation plugin. + +openapi-3.1.json is a JSON schema for OpenAPI 3.1 that is automatically +generated from the OpenAPI 3.1 specification. It is not an official JSON Schema +for OpenAPI. + +The schema-generator directory contains support code which generates +openapi-3.1.json from the OpenAPI 3.1 specification document (Markdown). diff --git a/vendor/github.com/google/gnostic/openapiv3/document.go b/vendor/github.com/google/gnostic/openapiv3/document.go new file mode 100644 index 00000000..ef10d1d9 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/document.go @@ -0,0 +1,42 @@ +// Copyright 2020 Google LLC. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package openapi_v3 + +import ( + "gopkg.in/yaml.v3" + + "github.com/google/gnostic/compiler" +) + +// ParseDocument reads an OpenAPI v3 description from a YAML/JSON representation. +func ParseDocument(b []byte) (*Document, error) { + info, err := compiler.ReadInfoFromBytes("", b) + if err != nil { + return nil, err + } + root := info.Content[0] + return NewDocument(root, compiler.NewContextWithExtensions("$root", root, nil, nil)) +} + +// YAMLValue produces a serialized YAML representation of the document. +func (d *Document) YAMLValue(comment string) ([]byte, error) { + rawInfo := d.ToRawInfo() + rawInfo = &yaml.Node{ + Kind: yaml.DocumentNode, + Content: []*yaml.Node{rawInfo}, + HeadComment: comment, + } + return yaml.Marshal(rawInfo) +} diff --git a/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json b/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json new file mode 100644 index 00000000..d5caed16 --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/openapi-3.0.json @@ -0,0 +1,1251 @@ +{ + "title": "A JSON Schema for OpenAPI 3.0.", + "id": "http://openapis.org/v3/schema.json#", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "description": "This is the root document object of the OpenAPI document.", + "required": [ + "openapi", + "info", + "paths" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "openapi": { + "type": "string" + }, + "info": { + "$ref": "#/definitions/info" + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + }, + "paths": { + "$ref": "#/definitions/paths" + }, + "components": { + "$ref": "#/definitions/components" + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/tag" + }, + "uniqueItems": true + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "definitions": { + "info": { + "type": "object", + "description": "The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.", + "required": [ + "title", + "version" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "termsOfService": { + "type": "string" + }, + "contact": { + "$ref": "#/definitions/contact" + }, + "license": { + "$ref": "#/definitions/license" + }, + "version": { + "type": "string" + } + } + }, + "contact": { + "type": "object", + "description": "Contact information for the exposed API.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + }, + "email": { + "type": "string", + "format": "email" + } + } + }, + "license": { + "type": "object", + "description": "License information for the exposed API.", + "required": [ + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "server": { + "type": "object", + "description": "An object representing a Server.", + "required": [ + "url" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "variables": { + "$ref": "#/definitions/serverVariables" + } + } + }, + "serverVariable": { + "type": "object", + "description": "An object representing a Server Variable for server URL template substitution.", + "required": [ + "default" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "default": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "components": { + "type": "object", + "description": "Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "schemas": { + "$ref": "#/definitions/schemasOrReferences" + }, + "responses": { + "$ref": "#/definitions/responsesOrReferences" + }, + "parameters": { + "$ref": "#/definitions/parametersOrReferences" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "requestBodies": { + "$ref": "#/definitions/requestBodiesOrReferences" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "securitySchemes": { + "$ref": "#/definitions/securitySchemesOrReferences" + }, + "links": { + "$ref": "#/definitions/linksOrReferences" + }, + "callbacks": { + "$ref": "#/definitions/callbacksOrReferences" + } + } + }, + "paths": { + "type": "object", + "description": "Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints.", + "additionalProperties": false, + "patternProperties": { + "^/": { + "$ref": "#/definitions/pathItem" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + } + }, + "pathItem": { + "type": "object", + "description": "Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "get": { + "$ref": "#/definitions/operation" + }, + "put": { + "$ref": "#/definitions/operation" + }, + "post": { + "$ref": "#/definitions/operation" + }, + "delete": { + "$ref": "#/definitions/operation" + }, + "options": { + "$ref": "#/definitions/operation" + }, + "head": { + "$ref": "#/definitions/operation" + }, + "patch": { + "$ref": "#/definitions/operation" + }, + "trace": { + "$ref": "#/definitions/operation" + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/parameterOrReference" + }, + "uniqueItems": true + } + } + }, + "operation": { + "type": "object", + "description": "Describes a single API operation on a path.", + "required": [ + "responses" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "operationId": { + "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/parameterOrReference" + }, + "uniqueItems": true + }, + "requestBody": { + "$ref": "#/definitions/requestBodyOrReference" + }, + "responses": { + "$ref": "#/definitions/responses" + }, + "callbacks": { + "$ref": "#/definitions/callbacksOrReferences" + }, + "deprecated": { + "type": "boolean" + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + } + } + }, + "externalDocs": { + "type": "object", + "description": "Allows referencing an external resource for extended documentation.", + "required": [ + "url" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "parameter": { + "type": "object", + "description": "Describes a single operation parameter. A unique parameter is defined by a combination of a name and location.", + "required": [ + "name", + "in" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "deprecated": { + "type": "boolean" + }, + "allowEmptyValue": { + "type": "boolean" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + }, + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + } + } + }, + "requestBody": { + "type": "object", + "description": "Describes a single request body.", + "required": [ + "content" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + }, + "required": { + "type": "boolean" + } + } + }, + "mediaType": { + "type": "object", + "description": "Each Media Type Object provides schema and examples for the media type identified by its key.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "encoding": { + "$ref": "#/definitions/encodings" + } + } + }, + "encoding": { + "type": "object", + "description": "A single encoding definition applied to a single schema property.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "contentType": { + "type": "string" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + } + } + }, + "responses": { + "type": "object", + "description": "A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call.", + "additionalProperties": false, + "patternProperties": { + "^([0-9X]{3})$": { + "$ref": "#/definitions/responseOrReference" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "default": { + "$ref": "#/definitions/responseOrReference" + } + } + }, + "response": { + "type": "object", + "description": "Describes a single response from an API Operation, including design-time, static `links` to operations based on the response.", + "required": [ + "description" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + }, + "links": { + "$ref": "#/definitions/linksOrReferences" + } + } + }, + "callback": { + "type": "object", + "description": "A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.", + "additionalProperties": false, + "patternProperties": { + "^": { + "$ref": "#/definitions/pathItem" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + } + }, + "example": { + "type": "object", + "description": "", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/any" + }, + "externalValue": { + "type": "string" + } + } + }, + "link": { + "type": "object", + "description": "The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "operationRef": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/anysOrExpressions" + }, + "requestBody": { + "$ref": "#/definitions/anyOrExpression" + }, + "description": { + "type": "string" + }, + "server": { + "$ref": "#/definitions/server" + } + } + }, + "header": { + "type": "object", + "description": "The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "deprecated": { + "type": "boolean" + }, + "allowEmptyValue": { + "type": "boolean" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + }, + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + } + } + }, + "tag": { + "type": "object", + "description": "Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.", + "required": [ + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + } + }, + "reference": { + "type": "object", + "description": "A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.", + "required": [ + "$ref" + ], + "additionalProperties": false, + "properties": { + "$ref": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "schema": { + "type": "object", + "description": "The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "nullable": { + "type": "boolean" + }, + "discriminator": { + "$ref": "#/definitions/discriminator" + }, + "readOnly": { + "type": "boolean" + }, + "writeOnly": { + "type": "boolean" + }, + "xml": { + "$ref": "#/definitions/xml" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": { + "$ref": "#/definitions/any" + }, + "deprecated": { + "type": "boolean" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxLength" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minLength" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxItems" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minItems" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "maxProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxProperties" + }, + "minProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minProperties" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/required" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "type": { + "type": "string" + }, + "allOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "anyOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "not": { + "$ref": "#/definitions/schema" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schemaOrReference" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + } + ] + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemaOrReference" + } + }, + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/schemaOrReference" + }, + { + "type": "boolean" + } + ] + }, + "default": { + "$ref": "#/definitions/defaultType" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string" + } + } + }, + "discriminator": { + "type": "object", + "description": "When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered.", + "required": [ + "propertyName" + ], + "additionalProperties": false, + "properties": { + "propertyName": { + "type": "string" + }, + "mapping": { + "$ref": "#/definitions/strings" + } + } + }, + "xml": { + "type": "object", + "description": "A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "attribute": { + "type": "boolean" + }, + "wrapped": { + "type": "boolean" + } + } + }, + "securityScheme": { + "type": "object", + "description": "Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header or as a query parameter), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect Discovery.", + "required": [ + "type" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "bearerFormat": { + "type": "string" + }, + "flows": { + "$ref": "#/definitions/oauthFlows" + }, + "openIdConnectUrl": { + "type": "string" + } + } + }, + "oauthFlows": { + "type": "object", + "description": "Allows configuration of the supported OAuth Flows.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "implicit": { + "$ref": "#/definitions/oauthFlow" + }, + "password": { + "$ref": "#/definitions/oauthFlow" + }, + "clientCredentials": { + "$ref": "#/definitions/oauthFlow" + }, + "authorizationCode": { + "$ref": "#/definitions/oauthFlow" + } + } + }, + "oauthFlow": { + "type": "object", + "description": "Configuration details for a supported OAuth Flow", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "authorizationUrl": { + "type": "string" + }, + "tokenUrl": { + "type": "string" + }, + "refreshUrl": { + "type": "string" + }, + "scopes": { + "$ref": "#/definitions/strings" + } + } + }, + "securityRequirement": { + "type": "object", + "description": "Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the Open API object or Operation Object, only one of Security Requirement Objects in the list needs to be satisfied to authorize the request.", + "additionalProperties": false, + "patternProperties": { + "^[a-zA-Z0-9\\.\\-_]+$": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + } + }, + "anyOrExpression": { + "oneOf": [ + { + "$ref": "#/definitions/any" + }, + { + "$ref": "#/definitions/expression" + } + ] + }, + "callbackOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/callback" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "exampleOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/example" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "headerOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/header" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "linkOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/link" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "parameterOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/parameter" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "requestBodyOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/requestBody" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "responseOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/response" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "schemaOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "securitySchemeOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/securityScheme" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "anysOrExpressions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/anyOrExpression" + } + }, + "callbacksOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/callbackOrReference" + } + }, + "encodings": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/encoding" + } + }, + "examplesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/exampleOrReference" + } + }, + "headersOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/headerOrReference" + } + }, + "linksOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/linkOrReference" + } + }, + "mediaTypes": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/mediaType" + } + }, + "parametersOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameterOrReference" + } + }, + "requestBodiesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/requestBodyOrReference" + } + }, + "responsesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/responseOrReference" + } + }, + "schemasOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemaOrReference" + } + }, + "securitySchemesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/securitySchemeOrReference" + } + }, + "serverVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/serverVariable" + } + }, + "strings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "object": { + "type": "object", + "additionalProperties": true + }, + "any": { + "additionalProperties": true + }, + "expression": { + "type": "object", + "additionalProperties": true + }, + "specificationExtension": { + "description": "Any property starting with x- is valid.", + "oneOf": [ + { + "type": "null" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "type": "object" + }, + { + "type": "array" + } + ] + }, + "defaultType": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "array" + }, + { + "type": "object" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + } +} diff --git a/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json b/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json new file mode 100644 index 00000000..ed0b83ad --- /dev/null +++ b/vendor/github.com/google/gnostic/openapiv3/openapi-3.1.json @@ -0,0 +1,1250 @@ +{ + "title": "A JSON Schema for OpenAPI 3.0.", + "id": "http://openapis.org/v3/schema.json#", + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "description": "This is the root document object of the OpenAPI document.", + "required": [ + "openapi", + "info", + "paths" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "openapi": { + "type": "string" + }, + "info": { + "$ref": "#/definitions/info" + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + }, + "paths": { + "$ref": "#/definitions/paths" + }, + "components": { + "$ref": "#/definitions/components" + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "tags": { + "type": "array", + "items": { + "$ref": "#/definitions/tag" + }, + "uniqueItems": true + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + }, + "definitions": { + "info": { + "type": "object", + "description": "The object provides metadata about the API. The metadata MAY be used by the clients if needed, and MAY be presented in editing or documentation generation tools for convenience.", + "required": [ + "title", + "version" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "termsOfService": { + "type": "string" + }, + "contact": { + "$ref": "#/definitions/contact" + }, + "license": { + "$ref": "#/definitions/license" + }, + "version": { + "type": "string" + }, + "summary": { + "type": "string" + } + } + }, + "contact": { + "type": "object", + "description": "Contact information for the exposed API.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + }, + "email": { + "type": "string", + "format": "email" + } + } + }, + "license": { + "type": "object", + "description": "License information for the exposed API.", + "required": [ + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "server": { + "type": "object", + "description": "An object representing a Server.", + "required": [ + "url" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "url": { + "type": "string" + }, + "description": { + "type": "string" + }, + "variables": { + "$ref": "#/definitions/serverVariables" + } + } + }, + "serverVariable": { + "type": "object", + "description": "An object representing a Server Variable for server URL template substitution.", + "required": [ + "default" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "enum": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "default": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "components": { + "type": "object", + "description": "Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "schemas": { + "$ref": "#/definitions/schemasOrReferences" + }, + "responses": { + "$ref": "#/definitions/responsesOrReferences" + }, + "parameters": { + "$ref": "#/definitions/parametersOrReferences" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "requestBodies": { + "$ref": "#/definitions/requestBodiesOrReferences" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "securitySchemes": { + "$ref": "#/definitions/securitySchemesOrReferences" + }, + "links": { + "$ref": "#/definitions/linksOrReferences" + }, + "callbacks": { + "$ref": "#/definitions/callbacksOrReferences" + } + } + }, + "paths": { + "type": "object", + "description": "Holds the relative paths to the individual endpoints and their operations. The path is appended to the URL from the `Server Object` in order to construct the full URL. The Paths MAY be empty, due to ACL constraints.", + "additionalProperties": false, + "patternProperties": { + "^/": { + "$ref": "#/definitions/pathItem" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + } + }, + "pathItem": { + "type": "object", + "description": "Describes the operations available on a single path. A Path Item MAY be empty, due to ACL constraints. The path itself is still exposed to the documentation viewer but they will not know which operations and parameters are available.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "$ref": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "get": { + "$ref": "#/definitions/operation" + }, + "put": { + "$ref": "#/definitions/operation" + }, + "post": { + "$ref": "#/definitions/operation" + }, + "delete": { + "$ref": "#/definitions/operation" + }, + "options": { + "$ref": "#/definitions/operation" + }, + "head": { + "$ref": "#/definitions/operation" + }, + "patch": { + "$ref": "#/definitions/operation" + }, + "trace": { + "$ref": "#/definitions/operation" + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/parameterOrReference" + }, + "uniqueItems": true + } + } + }, + "operation": { + "type": "object", + "description": "Describes a single API operation on a path.", + "required": [ + "responses" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "operationId": { + "type": "string" + }, + "parameters": { + "type": "array", + "items": { + "$ref": "#/definitions/parameterOrReference" + }, + "uniqueItems": true + }, + "requestBody": { + "$ref": "#/definitions/requestBodyOrReference" + }, + "responses": { + "$ref": "#/definitions/responses" + }, + "callbacks": { + "$ref": "#/definitions/callbacksOrReferences" + }, + "deprecated": { + "type": "boolean" + }, + "security": { + "type": "array", + "items": { + "$ref": "#/definitions/securityRequirement" + }, + "uniqueItems": true + }, + "servers": { + "type": "array", + "items": { + "$ref": "#/definitions/server" + }, + "uniqueItems": true + } + } + }, + "externalDocs": { + "type": "object", + "description": "Allows referencing an external resource for extended documentation.", + "required": [ + "url" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "parameter": { + "type": "object", + "description": "Describes a single operation parameter. A unique parameter is defined by a combination of a name and location.", + "required": [ + "name", + "in" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "deprecated": { + "type": "boolean" + }, + "allowEmptyValue": { + "type": "boolean" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + }, + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + } + } + }, + "requestBody": { + "type": "object", + "description": "Describes a single request body.", + "required": [ + "content" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + }, + "required": { + "type": "boolean" + } + } + }, + "mediaType": { + "type": "object", + "description": "Each Media Type Object provides schema and examples for the media type identified by its key.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "encoding": { + "$ref": "#/definitions/encodings" + } + } + }, + "encoding": { + "type": "object", + "description": "A single encoding definition applied to a single schema property.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "contentType": { + "type": "string" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + } + } + }, + "responses": { + "type": "object", + "description": "A container for the expected responses of an operation. The container maps a HTTP response code to the expected response. The documentation is not necessarily expected to cover all possible HTTP response codes because they may not be known in advance. However, documentation is expected to cover a successful operation response and any known errors. The `default` MAY be used as a default response object for all HTTP codes that are not covered individually by the specification. The `Responses Object` MUST contain at least one response code, and it SHOULD be the response for a successful operation call.", + "additionalProperties": false, + "patternProperties": { + "^([0-9X]{3})$": { + "$ref": "#/definitions/responseOrReference" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "default": { + "$ref": "#/definitions/responseOrReference" + } + } + }, + "response": { + "type": "object", + "description": "Describes a single response from an API Operation, including design-time, static `links` to operations based on the response.", + "required": [ + "description" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "headers": { + "$ref": "#/definitions/headersOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + }, + "links": { + "$ref": "#/definitions/linksOrReferences" + } + } + }, + "callback": { + "type": "object", + "description": "A map of possible out-of band callbacks related to the parent operation. Each value in the map is a Path Item Object that describes a set of requests that may be initiated by the API provider and the expected responses. The key value used to identify the callback object is an expression, evaluated at runtime, that identifies a URL to use for the callback operation.", + "additionalProperties": false, + "patternProperties": { + "^": { + "$ref": "#/definitions/pathItem" + }, + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + } + }, + "example": { + "type": "object", + "description": "", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "summary": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "$ref": "#/definitions/any" + }, + "externalValue": { + "type": "string" + } + } + }, + "link": { + "type": "object", + "description": "The `Link object` represents a possible design-time link for a response. The presence of a link does not guarantee the caller's ability to successfully invoke it, rather it provides a known relationship and traversal mechanism between responses and other operations. Unlike _dynamic_ links (i.e. links provided **in** the response payload), the OAS linking mechanism does not require link information in the runtime response. For computing links, and providing instructions to execute them, a runtime expression is used for accessing values in an operation and using them as parameters while invoking the linked operation.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "operationRef": { + "type": "string" + }, + "operationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/definitions/anyOrExpression" + }, + "requestBody": { + "$ref": "#/definitions/anyOrExpression" + }, + "description": { + "type": "string" + }, + "server": { + "$ref": "#/definitions/server" + } + } + }, + "header": { + "type": "object", + "description": "The Header Object follows the structure of the Parameter Object with the following changes: 1. `name` MUST NOT be specified, it is given in the corresponding `headers` map. 1. `in` MUST NOT be specified, it is implicitly in `header`. 1. All traits that are affected by the location MUST be applicable to a location of `header` (for example, `style`).", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "deprecated": { + "type": "boolean" + }, + "allowEmptyValue": { + "type": "boolean" + }, + "style": { + "type": "string" + }, + "explode": { + "type": "boolean" + }, + "allowReserved": { + "type": "boolean" + }, + "schema": { + "$ref": "#/definitions/schemaOrReference" + }, + "example": { + "$ref": "#/definitions/any" + }, + "examples": { + "$ref": "#/definitions/examplesOrReferences" + }, + "content": { + "$ref": "#/definitions/mediaTypes" + } + } + }, + "tag": { + "type": "object", + "description": "Adds metadata to a single tag that is used by the Operation Object. It is not mandatory to have a Tag Object per tag defined in the Operation Object instances.", + "required": [ + "name" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + } + } + }, + "reference": { + "type": "object", + "description": "A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules. For this specification, reference resolution is accomplished as defined by the JSON Reference specification and not by the JSON Schema specification.", + "required": [ + "$ref" + ], + "additionalProperties": false, + "properties": { + "$ref": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "schema": { + "type": "object", + "description": "The Schema Object allows the definition of input and output data types. These types can be objects, but also primitives and arrays. This object is an extended subset of the JSON Schema Specification Wright Draft 00. For more information about the properties, see JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "nullable": { + "type": "boolean" + }, + "discriminator": { + "$ref": "#/definitions/discriminator" + }, + "readOnly": { + "type": "boolean" + }, + "writeOnly": { + "type": "boolean" + }, + "xml": { + "$ref": "#/definitions/xml" + }, + "externalDocs": { + "$ref": "#/definitions/externalDocs" + }, + "example": { + "$ref": "#/definitions/any" + }, + "deprecated": { + "type": "boolean" + }, + "title": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/title" + }, + "multipleOf": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" + }, + "maximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" + }, + "exclusiveMaximum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" + }, + "minimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" + }, + "exclusiveMinimum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" + }, + "maxLength": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxLength" + }, + "minLength": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minLength" + }, + "pattern": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" + }, + "maxItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxItems" + }, + "minItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minItems" + }, + "uniqueItems": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" + }, + "maxProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/maxProperties" + }, + "minProperties": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/minProperties" + }, + "required": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/required" + }, + "enum": { + "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" + }, + "type": { + "type": "string" + }, + "allOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "oneOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "anyOf": { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + }, + "not": { + "$ref": "#/definitions/schema" + }, + "items": { + "anyOf": [ + { + "$ref": "#/definitions/schemaOrReference" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/schemaOrReference" + }, + "minItems": 1 + } + ] + }, + "properties": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemaOrReference" + } + }, + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/definitions/schemaOrReference" + }, + { + "type": "boolean" + } + ] + }, + "default": { + "$ref": "#/definitions/defaultType" + }, + "description": { + "type": "string" + }, + "format": { + "type": "string" + } + } + }, + "discriminator": { + "type": "object", + "description": "When request bodies or response payloads may be one of a number of different schemas, a `discriminator` object can be used to aid in serialization, deserialization, and validation. The discriminator is a specific object in a schema which is used to inform the consumer of the specification of an alternative schema based on the value associated with it. When using the discriminator, _inline_ schemas will not be considered.", + "required": [ + "propertyName" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "propertyName": { + "type": "string" + }, + "mapping": { + "$ref": "#/definitions/strings" + } + } + }, + "xml": { + "type": "object", + "description": "A metadata object that allows for more fine-tuned XML model definitions. When using arrays, XML element names are *not* inferred (for singular/plural forms) and the `name` property SHOULD be used to add that information. See examples for expected behavior.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "attribute": { + "type": "boolean" + }, + "wrapped": { + "type": "boolean" + } + } + }, + "securityScheme": { + "type": "object", + "description": "Defines a security scheme that can be used by the operations. Supported schemes are HTTP authentication, an API key (either as a header, a cookie parameter or as a query parameter), mutual TLS (use of a client certificate), OAuth2's common flows (implicit, password, application and access code) as defined in RFC6749, and OpenID Connect. Please note that currently (2019) the implicit flow is about to be deprecated OAuth 2.0 Security Best Current Practice. Recommended for most use case is Authorization Code Grant flow with PKCE.", + "required": [ + "type" + ], + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "in": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "bearerFormat": { + "type": "string" + }, + "flows": { + "$ref": "#/definitions/oauthFlows" + }, + "openIdConnectUrl": { + "type": "string" + } + } + }, + "oauthFlows": { + "type": "object", + "description": "Allows configuration of the supported OAuth Flows.", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "implicit": { + "$ref": "#/definitions/oauthFlow" + }, + "password": { + "$ref": "#/definitions/oauthFlow" + }, + "clientCredentials": { + "$ref": "#/definitions/oauthFlow" + }, + "authorizationCode": { + "$ref": "#/definitions/oauthFlow" + } + } + }, + "oauthFlow": { + "type": "object", + "description": "Configuration details for a supported OAuth Flow", + "additionalProperties": false, + "patternProperties": { + "^x-": { + "$ref": "#/definitions/specificationExtension" + } + }, + "properties": { + "authorizationUrl": { + "type": "string" + }, + "tokenUrl": { + "type": "string" + }, + "refreshUrl": { + "type": "string" + }, + "scopes": { + "$ref": "#/definitions/strings" + } + } + }, + "securityRequirement": { + "type": "object", + "description": "Lists the required security schemes to execute this operation. The name used for each property MUST correspond to a security scheme declared in the Security Schemes under the Components Object. Security Requirement Objects that contain multiple schemes require that all schemes MUST be satisfied for a request to be authorized. This enables support for scenarios where multiple query parameters or HTTP headers are required to convey security information. When a list of Security Requirement Objects is defined on the OpenAPI Object or Operation Object, only one of the Security Requirement Objects in the list needs to be satisfied to authorize the request.", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "anyOrExpression": { + "oneOf": [ + { + "$ref": "#/definitions/any" + }, + { + "$ref": "#/definitions/expression" + } + ] + }, + "callbackOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/callback" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "exampleOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/example" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "headerOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/header" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "linkOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/link" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "parameterOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/parameter" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "requestBodyOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/requestBody" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "responseOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/response" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "schemaOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/schema" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "securitySchemeOrReference": { + "oneOf": [ + { + "$ref": "#/definitions/securityScheme" + }, + { + "$ref": "#/definitions/reference" + } + ] + }, + "callbacksOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/callbackOrReference" + } + }, + "encodings": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/encoding" + } + }, + "examplesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/exampleOrReference" + } + }, + "headersOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/headerOrReference" + } + }, + "linksOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/linkOrReference" + } + }, + "mediaTypes": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/mediaType" + } + }, + "parametersOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/parameterOrReference" + } + }, + "requestBodiesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/requestBodyOrReference" + } + }, + "responsesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/responseOrReference" + } + }, + "schemasOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/schemaOrReference" + } + }, + "securitySchemesOrReferences": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/securitySchemeOrReference" + } + }, + "serverVariables": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/serverVariable" + } + }, + "strings": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "object": { + "type": "object", + "additionalProperties": true + }, + "any": { + "additionalProperties": true + }, + "expression": { + "type": "object", + "additionalProperties": true + }, + "specificationExtension": { + "description": "Any property starting with x- is valid.", + "oneOf": [ + { + "type": "null" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "type": "object" + }, + { + "type": "array" + } + ] + }, + "defaultType": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "array" + }, + { + "type": "object" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + } +} diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go index b1746163..b404f4be 100644 --- a/vendor/github.com/google/uuid/hash.go +++ b/vendor/github.com/google/uuid/hash.go @@ -26,8 +26,8 @@ var ( // NewMD5 and NewSHA1. func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { h.Reset() - h.Write(space[:]) - h.Write(data) + h.Write(space[:]) //nolint:errcheck + h.Write(data) //nolint:errcheck s := h.Sum(nil) var uuid UUID copy(uuid[:], s) diff --git a/vendor/github.com/google/uuid/null.go b/vendor/github.com/google/uuid/null.go new file mode 100644 index 00000000..d7fcbf28 --- /dev/null +++ b/vendor/github.com/google/uuid/null.go @@ -0,0 +1,118 @@ +// Copyright 2021 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "database/sql/driver" + "encoding/json" + "fmt" +) + +var jsonNull = []byte("null") + +// NullUUID represents a UUID that may be null. +// NullUUID implements the SQL driver.Scanner interface so +// it can be used as a scan destination: +// +// var u uuid.NullUUID +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u) +// ... +// if u.Valid { +// // use u.UUID +// } else { +// // NULL value +// } +// +type NullUUID struct { + UUID UUID + Valid bool // Valid is true if UUID is not NULL +} + +// Scan implements the SQL driver.Scanner interface. +func (nu *NullUUID) Scan(value interface{}) error { + if value == nil { + nu.UUID, nu.Valid = Nil, false + return nil + } + + err := nu.UUID.Scan(value) + if err != nil { + nu.Valid = false + return err + } + + nu.Valid = true + return nil +} + +// Value implements the driver Valuer interface. +func (nu NullUUID) Value() (driver.Value, error) { + if !nu.Valid { + return nil, nil + } + // Delegate to UUID Value function + return nu.UUID.Value() +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (nu NullUUID) MarshalBinary() ([]byte, error) { + if nu.Valid { + return nu.UUID[:], nil + } + + return []byte(nil), nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (nu *NullUUID) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(nu.UUID[:], data) + nu.Valid = true + return nil +} + +// MarshalText implements encoding.TextMarshaler. +func (nu NullUUID) MarshalText() ([]byte, error) { + if nu.Valid { + return nu.UUID.MarshalText() + } + + return jsonNull, nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (nu *NullUUID) UnmarshalText(data []byte) error { + id, err := ParseBytes(data) + if err != nil { + nu.Valid = false + return err + } + nu.UUID = id + nu.Valid = true + return nil +} + +// MarshalJSON implements json.Marshaler. +func (nu NullUUID) MarshalJSON() ([]byte, error) { + if nu.Valid { + return json.Marshal(nu.UUID) + } + + return jsonNull, nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (nu *NullUUID) UnmarshalJSON(data []byte) error { + if bytes.Equal(data, jsonNull) { + *nu = NullUUID{} + return nil // valid null UUID + } + err := json.Unmarshal(data, &nu.UUID) + nu.Valid = err == nil + return err +} diff --git a/vendor/github.com/google/uuid/sql.go b/vendor/github.com/google/uuid/sql.go index f326b54d..2e02ec06 100644 --- a/vendor/github.com/google/uuid/sql.go +++ b/vendor/github.com/google/uuid/sql.go @@ -9,7 +9,7 @@ import ( "fmt" ) -// Scan implements sql.Scanner so UUIDs can be read from databases transparently +// Scan implements sql.Scanner so UUIDs can be read from databases transparently. // Currently, database types that map to string and []byte are supported. Please // consult database-specific driver documentation for matching types. func (uuid *UUID) Scan(src interface{}) error { diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go index 524404cc..a57207ae 100644 --- a/vendor/github.com/google/uuid/uuid.go +++ b/vendor/github.com/google/uuid/uuid.go @@ -12,6 +12,7 @@ import ( "fmt" "io" "strings" + "sync" ) // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC @@ -33,7 +34,27 @@ const ( Future // Reserved for future definition. ) -var rander = rand.Reader // random function +const randPoolSize = 16 * 16 + +var ( + rander = rand.Reader // random function + poolEnabled = false + poolMu sync.Mutex + poolPos = randPoolSize // protected with poolMu + pool [randPoolSize]byte // protected with poolMu +) + +type invalidLengthError struct{ len int } + +func (err invalidLengthError) Error() string { + return fmt.Sprintf("invalid UUID length: %d", err.len) +} + +// IsInvalidLengthError is matcher function for custom error invalidLengthError +func IsInvalidLengthError(err error) bool { + _, ok := err.(invalidLengthError) + return ok +} // Parse decodes s into a UUID or returns an error. Both the standard UUID // forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and @@ -68,7 +89,7 @@ func Parse(s string) (UUID, error) { } return uuid, nil default: - return uuid, fmt.Errorf("invalid UUID length: %d", len(s)) + return uuid, invalidLengthError{len(s)} } // s is now at least 36 bytes long // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx @@ -112,7 +133,7 @@ func ParseBytes(b []byte) (UUID, error) { } return uuid, nil default: - return uuid, fmt.Errorf("invalid UUID length: %d", len(b)) + return uuid, invalidLengthError{len(b)} } // s is now at least 36 bytes long // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx @@ -243,3 +264,31 @@ func SetRand(r io.Reader) { } rander = r } + +// EnableRandPool enables internal randomness pool used for Random +// (Version 4) UUID generation. The pool contains random bytes read from +// the random number generator on demand in batches. Enabling the pool +// may improve the UUID generation throughput significantly. +// +// Since the pool is stored on the Go heap, this feature may be a bad fit +// for security sensitive applications. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func EnableRandPool() { + poolEnabled = true +} + +// DisableRandPool disables the randomness pool if it was previously +// enabled with EnableRandPool. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func DisableRandPool() { + poolEnabled = false + defer poolMu.Unlock() + poolMu.Lock() + poolPos = randPoolSize +} diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go index c110465d..7697802e 100644 --- a/vendor/github.com/google/uuid/version4.go +++ b/vendor/github.com/google/uuid/version4.go @@ -14,11 +14,21 @@ func New() UUID { return Must(NewRandom()) } +// NewString creates a new random UUID and returns it as a string or panics. +// NewString is equivalent to the expression +// +// uuid.New().String() +func NewString() string { + return Must(NewRandom()).String() +} + // NewRandom returns a Random (Version 4) UUID. // // The strength of the UUIDs is based on the strength of the crypto/rand // package. // +// Uses the randomness pool if it was enabled with EnableRandPool. +// // A note about uniqueness derived from the UUID Wikipedia entry: // // Randomly generated UUIDs have 122 random bits. One's annual risk of being @@ -27,7 +37,10 @@ func New() UUID { // equivalent to the odds of creating a few tens of trillions of UUIDs in a // year and having one duplicate. func NewRandom() (UUID, error) { - return NewRandomFromReader(rander) + if !poolEnabled { + return NewRandomFromReader(rander) + } + return newRandomFromPool() } // NewRandomFromReader returns a UUID based on bytes read from a given io.Reader. @@ -41,3 +54,23 @@ func NewRandomFromReader(r io.Reader) (UUID, error) { uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 return uuid, nil } + +func newRandomFromPool() (UUID, error) { + var uuid UUID + poolMu.Lock() + if poolPos == randPoolSize { + _, err := io.ReadFull(rander, pool[:]) + if err != nil { + poolMu.Unlock() + return Nil, err + } + poolPos = 0 + } + copy(uuid[:], pool[poolPos:(poolPos+16)]) + poolPos += 16 + poolMu.Unlock() + + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} diff --git a/vendor/github.com/imdario/mergo/.travis.yml b/vendor/github.com/imdario/mergo/.travis.yml index dad29725..d324c43b 100644 --- a/vendor/github.com/imdario/mergo/.travis.yml +++ b/vendor/github.com/imdario/mergo/.travis.yml @@ -1,4 +1,7 @@ language: go +arch: + - amd64 + - ppc64le install: - go get -t - go get golang.org/x/tools/cmd/cover diff --git a/vendor/github.com/imdario/mergo/CONTRIBUTING.md b/vendor/github.com/imdario/mergo/CONTRIBUTING.md new file mode 100644 index 00000000..0a1ff9f9 --- /dev/null +++ b/vendor/github.com/imdario/mergo/CONTRIBUTING.md @@ -0,0 +1,112 @@ + +# Contributing to mergo + +First off, thanks for taking the time to contribute! ❤️ + +All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 + +> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: +> - Star the project +> - Tweet about it +> - Refer this project in your project's readme +> - Mention the project at local meetups and tell your friends/colleagues + + +## Table of Contents + +- [Code of Conduct](#code-of-conduct) +- [I Have a Question](#i-have-a-question) +- [I Want To Contribute](#i-want-to-contribute) +- [Reporting Bugs](#reporting-bugs) +- [Suggesting Enhancements](#suggesting-enhancements) + +## Code of Conduct + +This project and everyone participating in it is governed by the +[mergo Code of Conduct](https://github.com/imdario/mergoblob/master/CODE_OF_CONDUCT.md). +By participating, you are expected to uphold this code. Please report unacceptable behavior +to <>. + + +## I Have a Question + +> If you want to ask a question, we assume that you have read the available [Documentation](https://pkg.go.dev/github.com/imdario/mergo). + +Before you ask a question, it is best to search for existing [Issues](https://github.com/imdario/mergo/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first. + +If you then still feel the need to ask a question and need clarification, we recommend the following: + +- Open an [Issue](https://github.com/imdario/mergo/issues/new). +- Provide as much context as you can about what you're running into. +- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant. + +We will then take care of the issue as soon as possible. + +## I Want To Contribute + +> ### Legal Notice +> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. + +### Reporting Bugs + + +#### Before Submitting a Bug Report + +A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. + +- Make sure that you are using the latest version. +- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](). If you are looking for support, you might want to check [this section](#i-have-a-question)). +- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/imdario/mergoissues?q=label%3Abug). +- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. +- Collect information about the bug: +- Stack trace (Traceback) +- OS, Platform and Version (Windows, Linux, macOS, x86, ARM) +- Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant. +- Possibly your input and the output +- Can you reliably reproduce the issue? And can you also reproduce it with older versions? + + +#### How Do I Submit a Good Bug Report? + +> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to . + + +We use GitHub issues to track bugs and errors. If you run into an issue with the project: + +- Open an [Issue](https://github.com/imdario/mergo/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) +- Explain the behavior you would expect and the actual behavior. +- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. +- Provide the information you collected in the previous section. + +Once it's filed: + +- The project team will label the issue accordingly. +- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. +- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be implemented by someone. + +### Suggesting Enhancements + +This section guides you through submitting an enhancement suggestion for mergo, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. + + +#### Before Submitting an Enhancement + +- Make sure that you are using the latest version. +- Read the [documentation]() carefully and find out if the functionality is already covered, maybe by an individual configuration. +- Perform a [search](https://github.com/imdario/mergo/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. +- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library. + + +#### How Do I Submit a Good Enhancement Suggestion? + +Enhancement suggestions are tracked as [GitHub issues](https://github.com/imdario/mergo/issues). + +- Use a **clear and descriptive title** for the issue to identify the suggestion. +- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. +- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. +- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. +- **Explain why this enhancement would be useful** to most mergo users. You may also want to point out the other projects that solved it better and which could serve as inspiration. + + +## Attribution +This guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)! diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index 075b4d78..4f028749 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -1,22 +1,14 @@ # Mergo -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). - -Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. - -## Status - -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). - [![GoDoc][3]][4] [![GitHub release][5]][6] [![GoCard][7]][8] [![Build Status][1]][2] [![Coverage Status][9]][10] [![Sourcegraph][11]][12] -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield) +[![FOSSA Status][13]][14] +[![Become my sponsor][15]][16] +[![Tidelift][17]][18] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo @@ -30,10 +22,26 @@ It is ready for production use. [It is used in several projects by Docker, Googl [10]: https://coveralls.io/github/imdario/mergo?branch=master [11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg [12]: https://sourcegraph.com/github.com/imdario/mergo?badge +[13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield +[14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield +[15]: https://img.shields.io/github/sponsors/imdario +[16]: https://github.com/sponsors/imdario +[17]: https://tidelift.com/badges/package/go/github.com%2Fimdario%2Fmergo +[18]: https://tidelift.com/subscription/pkg/go-github.com-imdario-mergo + +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. + +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. + +## Status + +It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, Microsoft, etc](https://github.com/imdario/mergo#mergo-in-the-wild). ### Important note -Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds suppot for go modules. +Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds support for go modules. Keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code. @@ -44,9 +52,8 @@ If you were using Mergo before April 6th, 2015, please check your project works If Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes: Buy Me a Coffee at ko-fi.com -[![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) -[![Beerpay](https://beerpay.io/imdario/mergo/make-wish.svg)](https://beerpay.io/imdario/mergo) Donate using Liberapay +Become my sponsor ### Mergo in the wild @@ -90,7 +97,9 @@ If Mergo is useful to you, consider buying me a coffee, a beer, or making a mont - [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) - [jnuthong/item_search](https://github.com/jnuthong/item_search) - [bukalapak/snowboard](https://github.com/bukalapak/snowboard) -- [janoszen/containerssh](https://github.com/janoszen/containerssh) +- [containerssh/containerssh](https://github.com/containerssh/containerssh) +- [goreleaser/goreleaser](https://github.com/goreleaser/goreleaser) +- [tjpnz/structbot](https://github.com/tjpnz/structbot) ## Install @@ -161,7 +170,7 @@ func main() { Note: if test are failing due missing package, please execute: - go get gopkg.in/yaml.v2 + go get gopkg.in/yaml.v3 ### Transformers @@ -211,7 +220,6 @@ func main() { } ``` - ## Contact me If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) @@ -220,18 +228,6 @@ If I can help you, you have an idea or you are using Mergo in your projects, don Written by [Dario Castañé](http://dario.im). -## Top Contributors - -[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) -[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) -[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) -[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) -[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) -[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) -[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) -[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) - - ## License [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). diff --git a/vendor/github.com/imdario/mergo/SECURITY.md b/vendor/github.com/imdario/mergo/SECURITY.md new file mode 100644 index 00000000..a5de61f7 --- /dev/null +++ b/vendor/github.com/imdario/mergo/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.3.x | :white_check_mark: | +| < 0.3 | :x: | + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go index a13a7ee4..b50d5c2a 100644 --- a/vendor/github.com/imdario/mergo/map.go +++ b/vendor/github.com/imdario/mergo/map.go @@ -44,7 +44,7 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf } } // Remember, remember... - visited[h] = &visit{addr, typ, seen} + visited[h] = &visit{typ, seen, addr} } zeroValue := reflect.Value{} switch dst.Kind() { @@ -58,7 +58,7 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf } fieldName := field.Name fieldName = changeInitialCase(fieldName, unicode.ToLower) - if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { + if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v), !config.ShouldNotDereference) || overwrite) { dstMap[fieldName] = src.Field(i).Interface() } } @@ -142,7 +142,7 @@ func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { func _map(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { - return ErrNonPointerAgument + return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 11a8c156..0ef9b213 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -38,10 +38,11 @@ func isExportedComponent(field *reflect.StructField) bool { } type Config struct { + Transformers Transformers Overwrite bool + ShouldNotDereference bool AppendSlice bool TypeCheck bool - Transformers Transformers overwriteWithEmptyValue bool overwriteSliceWithEmptyValue bool sliceDeepCopy bool @@ -76,10 +77,10 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } } // Remember, remember... - visited[h] = &visit{addr, typ, seen} + visited[h] = &visit{typ, seen, addr} } - if config.Transformers != nil && !isEmptyValue(dst) { + if config.Transformers != nil && !isReflectNil(dst) && dst.IsValid() { if fn := config.Transformers.Transformer(dst.Type()); fn != nil { err = fn(dst, src) return @@ -95,17 +96,22 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } } } else { - if (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { + if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) { dst.Set(src) } } case reflect.Map: if dst.IsNil() && !src.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) + if dst.CanSet() { + dst.Set(reflect.MakeMap(dst.Type())) + } else { + dst = src + return + } } if src.Kind() != reflect.Map { - if overwrite { + if overwrite && dst.CanSet() { dst.Set(src) } return @@ -157,7 +163,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dstSlice = reflect.ValueOf(dstElement.Interface()) } - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { if typeCheck && srcSlice.Type() != dstSlice.Type() { return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) } @@ -189,22 +195,38 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co dst.SetMapIndex(key, dstSlice) } } - if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { - continue + + if dstElement.IsValid() && !isEmptyValue(dstElement, !config.ShouldNotDereference) { + if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice { + continue + } + if reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map && reflect.TypeOf(dstElement.Interface()).Kind() == reflect.Map { + continue + } } - if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement)) { + if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement, !config.ShouldNotDereference)) { if dst.IsNil() { dst.Set(reflect.MakeMap(dst.Type())) } dst.SetMapIndex(key, srcElement) } } + + // Ensure that all keys in dst are deleted if they are not in src. + if overwriteWithEmptySrc { + for _, key := range dst.MapKeys() { + srcElement := src.MapIndex(key) + if !srcElement.IsValid() { + dst.SetMapIndex(key, reflect.Value{}) + } + } + } case reflect.Slice: if !dst.CanSet() { break } - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) && !config.AppendSlice && !sliceDeepCopy { dst.Set(src) } else if config.AppendSlice { if src.Type() != dst.Type() { @@ -239,12 +261,18 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if src.Kind() != reflect.Interface { if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } } else if src.Kind() == reflect.Ptr { - if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return + if !config.ShouldNotDereference { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + } else { + if overwriteWithEmptySrc || (overwrite && !src.IsNil()) || dst.IsNil() { + dst.Set(src) + } } } else if dst.Elem().Type() == src.Type() { if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { @@ -257,7 +285,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + if dst.CanSet() && (overwrite || isEmptyValue(dst, !config.ShouldNotDereference)) { dst.Set(src) } break @@ -270,12 +298,7 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co break } default: - mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) - v := fmt.Sprintf("%v", src) - if v == "TestIssue106" { - fmt.Println(mustSet) - fmt.Println(dst.CanSet()) - } + mustSet := (isEmptyValue(dst, !config.ShouldNotDereference) || overwrite) && (!isEmptyValue(src, !config.ShouldNotDereference) || overwriteWithEmptySrc) if mustSet { if dst.CanSet() { dst.Set(src) @@ -326,6 +349,12 @@ func WithOverrideEmptySlice(config *Config) { config.overwriteSliceWithEmptyValue = true } +// WithoutDereference prevents dereferencing pointers when evaluating whether they are empty +// (i.e. a non-nil pointer is never considered empty). +func WithoutDereference(config *Config) { + config.ShouldNotDereference = true +} + // WithAppendSlice will make merge append slices instead of overwriting it. func WithAppendSlice(config *Config) { config.AppendSlice = true @@ -344,7 +373,7 @@ func WithSliceDeepCopy(config *Config) { func merge(dst, src interface{}, opts ...func(*Config)) error { if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { - return ErrNonPointerAgument + return ErrNonPointerArgument } var ( vDst, vSrc reflect.Value diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go index 3cc926c7..0a721e2d 100644 --- a/vendor/github.com/imdario/mergo/mergo.go +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -17,10 +17,10 @@ import ( var ( ErrNilArguments = errors.New("src and dst must not be nil") ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") - ErrNotSupported = errors.New("only structs and maps are supported") + ErrNotSupported = errors.New("only structs, maps, and slices are supported") ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") - ErrNonPointerAgument = errors.New("dst must be a pointer") + ErrNonPointerArgument = errors.New("dst must be a pointer") ) // During deepMerge, must keep track of checks that are @@ -28,13 +28,13 @@ var ( // checks in progress are true when it reencounters them. // Visited are stored in a map indexed by 17 * a1 + a2; type visit struct { - ptr uintptr typ reflect.Type next *visit + ptr uintptr } // From src/pkg/encoding/json/encode.go. -func isEmptyValue(v reflect.Value) bool { +func isEmptyValue(v reflect.Value, shouldDereference bool) bool { switch v.Kind() { case reflect.Array, reflect.Map, reflect.Slice, reflect.String: return v.Len() == 0 @@ -50,7 +50,10 @@ func isEmptyValue(v reflect.Value) bool { if v.IsNil() { return true } - return isEmptyValue(v.Elem()) + if shouldDereference { + return isEmptyValue(v.Elem(), shouldDereference) + } + return false case reflect.Func: return v.IsNil() case reflect.Invalid: @@ -65,7 +68,7 @@ func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { return } vDst = reflect.ValueOf(dst).Elem() - if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { + if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map && vDst.Kind() != reflect.Slice { err = ErrNotSupported return } diff --git a/vendor/github.com/josharian/intern/README.md b/vendor/github.com/josharian/intern/README.md new file mode 100644 index 00000000..ffc44b21 --- /dev/null +++ b/vendor/github.com/josharian/intern/README.md @@ -0,0 +1,5 @@ +Docs: https://godoc.org/github.com/josharian/intern + +See also [Go issue 5160](https://golang.org/issue/5160). + +License: MIT diff --git a/vendor/github.com/josharian/intern/intern.go b/vendor/github.com/josharian/intern/intern.go new file mode 100644 index 00000000..7acb1fe9 --- /dev/null +++ b/vendor/github.com/josharian/intern/intern.go @@ -0,0 +1,44 @@ +// Package intern interns strings. +// Interning is best effort only. +// Interned strings may be removed automatically +// at any time without notification. +// All functions may be called concurrently +// with themselves and each other. +package intern + +import "sync" + +var ( + pool sync.Pool = sync.Pool{ + New: func() interface{} { + return make(map[string]string) + }, + } +) + +// String returns s, interned. +func String(s string) string { + m := pool.Get().(map[string]string) + c, ok := m[s] + if ok { + pool.Put(m) + return c + } + m[s] = s + pool.Put(m) + return s +} + +// Bytes returns b converted to a string, interned. +func Bytes(b []byte) string { + m := pool.Get().(map[string]string) + c, ok := m[string(b)] + if ok { + pool.Put(m) + return c + } + s := string(b) + m[s] = s + pool.Put(m) + return s +} diff --git a/vendor/github.com/josharian/intern/license.md b/vendor/github.com/josharian/intern/license.md new file mode 100644 index 00000000..353d3055 --- /dev/null +++ b/vendor/github.com/josharian/intern/license.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Josh Bleecher Snyder + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/mailru/easyjson/LICENSE b/vendor/github.com/mailru/easyjson/LICENSE new file mode 100644 index 00000000..fbff658f --- /dev/null +++ b/vendor/github.com/mailru/easyjson/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2016 Mail.Ru Group + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mailru/easyjson/buffer/pool.go b/vendor/github.com/mailru/easyjson/buffer/pool.go new file mode 100644 index 00000000..598a54af --- /dev/null +++ b/vendor/github.com/mailru/easyjson/buffer/pool.go @@ -0,0 +1,278 @@ +// Package buffer implements a buffer for serialization, consisting of a chain of []byte-s to +// reduce copying and to allow reuse of individual chunks. +package buffer + +import ( + "io" + "net" + "sync" +) + +// PoolConfig contains configuration for the allocation and reuse strategy. +type PoolConfig struct { + StartSize int // Minimum chunk size that is allocated. + PooledSize int // Minimum chunk size that is reused, reusing chunks too small will result in overhead. + MaxSize int // Maximum chunk size that will be allocated. +} + +var config = PoolConfig{ + StartSize: 128, + PooledSize: 512, + MaxSize: 32768, +} + +// Reuse pool: chunk size -> pool. +var buffers = map[int]*sync.Pool{} + +func initBuffers() { + for l := config.PooledSize; l <= config.MaxSize; l *= 2 { + buffers[l] = new(sync.Pool) + } +} + +func init() { + initBuffers() +} + +// Init sets up a non-default pooling and allocation strategy. Should be run before serialization is done. +func Init(cfg PoolConfig) { + config = cfg + initBuffers() +} + +// putBuf puts a chunk to reuse pool if it can be reused. +func putBuf(buf []byte) { + size := cap(buf) + if size < config.PooledSize { + return + } + if c := buffers[size]; c != nil { + c.Put(buf[:0]) + } +} + +// getBuf gets a chunk from reuse pool or creates a new one if reuse failed. +func getBuf(size int) []byte { + if size >= config.PooledSize { + if c := buffers[size]; c != nil { + v := c.Get() + if v != nil { + return v.([]byte) + } + } + } + return make([]byte, 0, size) +} + +// Buffer is a buffer optimized for serialization without extra copying. +type Buffer struct { + + // Buf is the current chunk that can be used for serialization. + Buf []byte + + toPool []byte + bufs [][]byte +} + +// EnsureSpace makes sure that the current chunk contains at least s free bytes, +// possibly creating a new chunk. +func (b *Buffer) EnsureSpace(s int) { + if cap(b.Buf)-len(b.Buf) < s { + b.ensureSpaceSlow(s) + } +} + +func (b *Buffer) ensureSpaceSlow(s int) { + l := len(b.Buf) + if l > 0 { + if cap(b.toPool) != cap(b.Buf) { + // Chunk was reallocated, toPool can be pooled. + putBuf(b.toPool) + } + if cap(b.bufs) == 0 { + b.bufs = make([][]byte, 0, 8) + } + b.bufs = append(b.bufs, b.Buf) + l = cap(b.toPool) * 2 + } else { + l = config.StartSize + } + + if l > config.MaxSize { + l = config.MaxSize + } + b.Buf = getBuf(l) + b.toPool = b.Buf +} + +// AppendByte appends a single byte to buffer. +func (b *Buffer) AppendByte(data byte) { + b.EnsureSpace(1) + b.Buf = append(b.Buf, data) +} + +// AppendBytes appends a byte slice to buffer. +func (b *Buffer) AppendBytes(data []byte) { + if len(data) <= cap(b.Buf)-len(b.Buf) { + b.Buf = append(b.Buf, data...) // fast path + } else { + b.appendBytesSlow(data) + } +} + +func (b *Buffer) appendBytesSlow(data []byte) { + for len(data) > 0 { + b.EnsureSpace(1) + + sz := cap(b.Buf) - len(b.Buf) + if sz > len(data) { + sz = len(data) + } + + b.Buf = append(b.Buf, data[:sz]...) + data = data[sz:] + } +} + +// AppendString appends a string to buffer. +func (b *Buffer) AppendString(data string) { + if len(data) <= cap(b.Buf)-len(b.Buf) { + b.Buf = append(b.Buf, data...) // fast path + } else { + b.appendStringSlow(data) + } +} + +func (b *Buffer) appendStringSlow(data string) { + for len(data) > 0 { + b.EnsureSpace(1) + + sz := cap(b.Buf) - len(b.Buf) + if sz > len(data) { + sz = len(data) + } + + b.Buf = append(b.Buf, data[:sz]...) + data = data[sz:] + } +} + +// Size computes the size of a buffer by adding sizes of every chunk. +func (b *Buffer) Size() int { + size := len(b.Buf) + for _, buf := range b.bufs { + size += len(buf) + } + return size +} + +// DumpTo outputs the contents of a buffer to a writer and resets the buffer. +func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { + bufs := net.Buffers(b.bufs) + if len(b.Buf) > 0 { + bufs = append(bufs, b.Buf) + } + n, err := bufs.WriteTo(w) + + for _, buf := range b.bufs { + putBuf(buf) + } + putBuf(b.toPool) + + b.bufs = nil + b.Buf = nil + b.toPool = nil + + return int(n), err +} + +// BuildBytes creates a single byte slice with all the contents of the buffer. Data is +// copied if it does not fit in a single chunk. You can optionally provide one byte +// slice as argument that it will try to reuse. +func (b *Buffer) BuildBytes(reuse ...[]byte) []byte { + if len(b.bufs) == 0 { + ret := b.Buf + b.toPool = nil + b.Buf = nil + return ret + } + + var ret []byte + size := b.Size() + + // If we got a buffer as argument and it is big enough, reuse it. + if len(reuse) == 1 && cap(reuse[0]) >= size { + ret = reuse[0][:0] + } else { + ret = make([]byte, 0, size) + } + for _, buf := range b.bufs { + ret = append(ret, buf...) + putBuf(buf) + } + + ret = append(ret, b.Buf...) + putBuf(b.toPool) + + b.bufs = nil + b.toPool = nil + b.Buf = nil + + return ret +} + +type readCloser struct { + offset int + bufs [][]byte +} + +func (r *readCloser) Read(p []byte) (n int, err error) { + for _, buf := range r.bufs { + // Copy as much as we can. + x := copy(p[n:], buf[r.offset:]) + n += x // Increment how much we filled. + + // Did we empty the whole buffer? + if r.offset+x == len(buf) { + // On to the next buffer. + r.offset = 0 + r.bufs = r.bufs[1:] + + // We can release this buffer. + putBuf(buf) + } else { + r.offset += x + } + + if n == len(p) { + break + } + } + // No buffers left or nothing read? + if len(r.bufs) == 0 { + err = io.EOF + } + return +} + +func (r *readCloser) Close() error { + // Release all remaining buffers. + for _, buf := range r.bufs { + putBuf(buf) + } + // In case Close gets called multiple times. + r.bufs = nil + + return nil +} + +// ReadCloser creates an io.ReadCloser with all the contents of the buffer. +func (b *Buffer) ReadCloser() io.ReadCloser { + ret := &readCloser{0, append(b.bufs, b.Buf)} + + b.bufs = nil + b.toPool = nil + b.Buf = nil + + return ret +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go new file mode 100644 index 00000000..ff7b27c5 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go @@ -0,0 +1,24 @@ +// This file will only be included to the build if neither +// easyjson_nounsafe nor appengine build tag is set. See README notes +// for more details. + +//+build !easyjson_nounsafe +//+build !appengine + +package jlexer + +import ( + "reflect" + "unsafe" +) + +// bytesToStr creates a string pointing at the slice to avoid copying. +// +// Warning: the string returned by the function should be used with care, as the whole input data +// chunk may be either blocked from being freed by GC because of a single string or the buffer.Data +// may be garbage-collected even when the string exists. +func bytesToStr(data []byte) string { + h := (*reflect.SliceHeader)(unsafe.Pointer(&data)) + shdr := reflect.StringHeader{Data: h.Data, Len: h.Len} + return *(*string)(unsafe.Pointer(&shdr)) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go new file mode 100644 index 00000000..864d1be6 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go @@ -0,0 +1,13 @@ +// This file is included to the build if any of the buildtags below +// are defined. Refer to README notes for more details. + +//+build easyjson_nounsafe appengine + +package jlexer + +// bytesToStr creates a string normally from []byte +// +// Note that this method is roughly 1.5x slower than using the 'unsafe' method. +func bytesToStr(data []byte) string { + return string(data) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/error.go b/vendor/github.com/mailru/easyjson/jlexer/error.go new file mode 100644 index 00000000..e90ec40d --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/error.go @@ -0,0 +1,15 @@ +package jlexer + +import "fmt" + +// LexerError implements the error interface and represents all possible errors that can be +// generated during parsing the JSON data. +type LexerError struct { + Reason string + Offset int + Data string +} + +func (l *LexerError) Error() string { + return fmt.Sprintf("parse error: %s near offset %d of '%s'", l.Reason, l.Offset, l.Data) +} diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go new file mode 100644 index 00000000..b5f5e261 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -0,0 +1,1244 @@ +// Package jlexer contains a JSON lexer implementation. +// +// It is expected that it is mostly used with generated parser code, so the interface is tuned +// for a parser that knows what kind of data is expected. +package jlexer + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "strconv" + "unicode" + "unicode/utf16" + "unicode/utf8" + + "github.com/josharian/intern" +) + +// tokenKind determines type of a token. +type tokenKind byte + +const ( + tokenUndef tokenKind = iota // No token. + tokenDelim // Delimiter: one of '{', '}', '[' or ']'. + tokenString // A string literal, e.g. "abc\u1234" + tokenNumber // Number literal, e.g. 1.5e5 + tokenBool // Boolean literal: true or false. + tokenNull // null keyword. +) + +// token describes a single token: type, position in the input and value. +type token struct { + kind tokenKind // Type of a token. + + boolValue bool // Value if a boolean literal token. + byteValueCloned bool // true if byteValue was allocated and does not refer to original json body + byteValue []byte // Raw value of a token. + delimValue byte +} + +// Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice. +type Lexer struct { + Data []byte // Input data given to the lexer. + + start int // Start of the current token. + pos int // Current unscanned position in the input stream. + token token // Last scanned token, if token.kind != tokenUndef. + + firstElement bool // Whether current element is the first in array or an object. + wantSep byte // A comma or a colon character, which need to occur before a token. + + UseMultipleErrors bool // If we want to use multiple errors. + fatalError error // Fatal error occurred during lexing. It is usually a syntax error. + multipleErrors []*LexerError // Semantic errors occurred during lexing. Marshalling will be continued after finding this errors. +} + +// FetchToken scans the input for the next token. +func (r *Lexer) FetchToken() { + r.token.kind = tokenUndef + r.start = r.pos + + // Check if r.Data has r.pos element + // If it doesn't, it mean corrupted input data + if len(r.Data) < r.pos { + r.errParse("Unexpected end of data") + return + } + // Determine the type of a token by skipping whitespace and reading the + // first character. + for _, c := range r.Data[r.pos:] { + switch c { + case ':', ',': + if r.wantSep == c { + r.pos++ + r.start++ + r.wantSep = 0 + } else { + r.errSyntax() + } + + case ' ', '\t', '\r', '\n': + r.pos++ + r.start++ + + case '"': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenString + r.fetchString() + return + + case '{', '[': + if r.wantSep != 0 { + r.errSyntax() + } + r.firstElement = true + r.token.kind = tokenDelim + r.token.delimValue = r.Data[r.pos] + r.pos++ + return + + case '}', ']': + if !r.firstElement && (r.wantSep != ',') { + r.errSyntax() + } + r.wantSep = 0 + r.token.kind = tokenDelim + r.token.delimValue = r.Data[r.pos] + r.pos++ + return + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': + if r.wantSep != 0 { + r.errSyntax() + } + r.token.kind = tokenNumber + r.fetchNumber() + return + + case 'n': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenNull + r.fetchNull() + return + + case 't': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenBool + r.token.boolValue = true + r.fetchTrue() + return + + case 'f': + if r.wantSep != 0 { + r.errSyntax() + } + + r.token.kind = tokenBool + r.token.boolValue = false + r.fetchFalse() + return + + default: + r.errSyntax() + return + } + } + r.fatalError = io.EOF + return +} + +// isTokenEnd returns true if the char can follow a non-delimiter token +func isTokenEnd(c byte) bool { + return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '[' || c == ']' || c == '{' || c == '}' || c == ',' || c == ':' +} + +// fetchNull fetches and checks remaining bytes of null keyword. +func (r *Lexer) fetchNull() { + r.pos += 4 + if r.pos > len(r.Data) || + r.Data[r.pos-3] != 'u' || + r.Data[r.pos-2] != 'l' || + r.Data[r.pos-1] != 'l' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 4 + r.errSyntax() + } +} + +// fetchTrue fetches and checks remaining bytes of true keyword. +func (r *Lexer) fetchTrue() { + r.pos += 4 + if r.pos > len(r.Data) || + r.Data[r.pos-3] != 'r' || + r.Data[r.pos-2] != 'u' || + r.Data[r.pos-1] != 'e' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 4 + r.errSyntax() + } +} + +// fetchFalse fetches and checks remaining bytes of false keyword. +func (r *Lexer) fetchFalse() { + r.pos += 5 + if r.pos > len(r.Data) || + r.Data[r.pos-4] != 'a' || + r.Data[r.pos-3] != 'l' || + r.Data[r.pos-2] != 's' || + r.Data[r.pos-1] != 'e' || + (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { + + r.pos -= 5 + r.errSyntax() + } +} + +// fetchNumber scans a number literal token. +func (r *Lexer) fetchNumber() { + hasE := false + afterE := false + hasDot := false + + r.pos++ + for i, c := range r.Data[r.pos:] { + switch { + case c >= '0' && c <= '9': + afterE = false + case c == '.' && !hasDot: + hasDot = true + case (c == 'e' || c == 'E') && !hasE: + hasE = true + hasDot = true + afterE = true + case (c == '+' || c == '-') && afterE: + afterE = false + default: + r.pos += i + if !isTokenEnd(c) { + r.errSyntax() + } else { + r.token.byteValue = r.Data[r.start:r.pos] + } + return + } + } + + r.pos = len(r.Data) + r.token.byteValue = r.Data[r.start:] +} + +// findStringLen tries to scan into the string literal for ending quote char to determine required size. +// The size will be exact if no escapes are present and may be inexact if there are escaped chars. +func findStringLen(data []byte) (isValid bool, length int) { + for { + idx := bytes.IndexByte(data, '"') + if idx == -1 { + return false, len(data) + } + if idx == 0 || (idx > 0 && data[idx-1] != '\\') { + return true, length + idx + } + + // count \\\\\\\ sequences. even number of slashes means quote is not really escaped + cnt := 1 + for idx-cnt-1 >= 0 && data[idx-cnt-1] == '\\' { + cnt++ + } + if cnt%2 == 0 { + return true, length + idx + } + + length += idx + 1 + data = data[idx+1:] + } +} + +// unescapeStringToken performs unescaping of string token. +// if no escaping is needed, original string is returned, otherwise - a new one allocated +func (r *Lexer) unescapeStringToken() (err error) { + data := r.token.byteValue + var unescapedData []byte + + for { + i := bytes.IndexByte(data, '\\') + if i == -1 { + break + } + + escapedRune, escapedBytes, err := decodeEscape(data[i:]) + if err != nil { + r.errParse(err.Error()) + return err + } + + if unescapedData == nil { + unescapedData = make([]byte, 0, len(r.token.byteValue)) + } + + var d [4]byte + s := utf8.EncodeRune(d[:], escapedRune) + unescapedData = append(unescapedData, data[:i]...) + unescapedData = append(unescapedData, d[:s]...) + + data = data[i+escapedBytes:] + } + + if unescapedData != nil { + r.token.byteValue = append(unescapedData, data...) + r.token.byteValueCloned = true + } + return +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + var val rune + for i := 2; i < len(s) && i < 6; i++ { + var v byte + c := s[i] + switch c { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + v = c - '0' + case 'a', 'b', 'c', 'd', 'e', 'f': + v = c - 'a' + 10 + case 'A', 'B', 'C', 'D', 'E', 'F': + v = c - 'A' + 10 + default: + return -1 + } + + val <<= 4 + val |= rune(v) + } + return val +} + +// decodeEscape processes a single escape sequence and returns number of bytes processed. +func decodeEscape(data []byte) (decoded rune, bytesProcessed int, err error) { + if len(data) < 2 { + return 0, 0, errors.New("incorrect escape symbol \\ at the end of token") + } + + c := data[1] + switch c { + case '"', '/', '\\': + return rune(c), 2, nil + case 'b': + return '\b', 2, nil + case 'f': + return '\f', 2, nil + case 'n': + return '\n', 2, nil + case 'r': + return '\r', 2, nil + case 't': + return '\t', 2, nil + case 'u': + rr := getu4(data) + if rr < 0 { + return 0, 0, errors.New("incorrectly escaped \\uXXXX sequence") + } + + read := 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(data[read:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + read += 6 + rr = dec + } else { + rr = unicode.ReplacementChar + } + } + return rr, read, nil + } + + return 0, 0, errors.New("incorrectly escaped bytes") +} + +// fetchString scans a string literal token. +func (r *Lexer) fetchString() { + r.pos++ + data := r.Data[r.pos:] + + isValid, length := findStringLen(data) + if !isValid { + r.pos += length + r.errParse("unterminated string literal") + return + } + r.token.byteValue = data[:length] + r.pos += length + 1 // skip closing '"' as well +} + +// scanToken scans the next token if no token is currently available in the lexer. +func (r *Lexer) scanToken() { + if r.token.kind != tokenUndef || r.fatalError != nil { + return + } + + r.FetchToken() +} + +// consume resets the current token to allow scanning the next one. +func (r *Lexer) consume() { + r.token.kind = tokenUndef + r.token.byteValueCloned = false + r.token.delimValue = 0 +} + +// Ok returns true if no error (including io.EOF) was encountered during scanning. +func (r *Lexer) Ok() bool { + return r.fatalError == nil +} + +const maxErrorContextLen = 13 + +func (r *Lexer) errParse(what string) { + if r.fatalError == nil { + var str string + if len(r.Data)-r.pos <= maxErrorContextLen { + str = string(r.Data) + } else { + str = string(r.Data[r.pos:r.pos+maxErrorContextLen-3]) + "..." + } + r.fatalError = &LexerError{ + Reason: what, + Offset: r.pos, + Data: str, + } + } +} + +func (r *Lexer) errSyntax() { + r.errParse("syntax error") +} + +func (r *Lexer) errInvalidToken(expected string) { + if r.fatalError != nil { + return + } + if r.UseMultipleErrors { + r.pos = r.start + r.consume() + r.SkipRecursive() + switch expected { + case "[": + r.token.delimValue = ']' + r.token.kind = tokenDelim + case "{": + r.token.delimValue = '}' + r.token.kind = tokenDelim + } + r.addNonfatalError(&LexerError{ + Reason: fmt.Sprintf("expected %s", expected), + Offset: r.start, + Data: string(r.Data[r.start:r.pos]), + }) + return + } + + var str string + if len(r.token.byteValue) <= maxErrorContextLen { + str = string(r.token.byteValue) + } else { + str = string(r.token.byteValue[:maxErrorContextLen-3]) + "..." + } + r.fatalError = &LexerError{ + Reason: fmt.Sprintf("expected %s", expected), + Offset: r.pos, + Data: str, + } +} + +func (r *Lexer) GetPos() int { + return r.pos +} + +// Delim consumes a token and verifies that it is the given delimiter. +func (r *Lexer) Delim(c byte) { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + + if !r.Ok() || r.token.delimValue != c { + r.consume() // errInvalidToken can change token if UseMultipleErrors is enabled. + r.errInvalidToken(string([]byte{c})) + } else { + r.consume() + } +} + +// IsDelim returns true if there was no scanning error and next token is the given delimiter. +func (r *Lexer) IsDelim(c byte) bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + return !r.Ok() || r.token.delimValue == c +} + +// Null verifies that the next token is null and consumes it. +func (r *Lexer) Null() { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenNull { + r.errInvalidToken("null") + } + r.consume() +} + +// IsNull returns true if the next token is a null keyword. +func (r *Lexer) IsNull() bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + return r.Ok() && r.token.kind == tokenNull +} + +// Skip skips a single token. +func (r *Lexer) Skip() { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + r.consume() +} + +// SkipRecursive skips next array or object completely, or just skips a single token if not +// an array/object. +// +// Note: no syntax validation is performed on the skipped data. +func (r *Lexer) SkipRecursive() { + r.scanToken() + var start, end byte + startPos := r.start + + switch r.token.delimValue { + case '{': + start, end = '{', '}' + case '[': + start, end = '[', ']' + default: + r.consume() + return + } + + r.consume() + + level := 1 + inQuotes := false + wasEscape := false + + for i, c := range r.Data[r.pos:] { + switch { + case c == start && !inQuotes: + level++ + case c == end && !inQuotes: + level-- + if level == 0 { + r.pos += i + 1 + if !json.Valid(r.Data[startPos:r.pos]) { + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "skipped array/object json value is invalid", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } + } + return + } + case c == '\\' && inQuotes: + wasEscape = !wasEscape + continue + case c == '"' && inQuotes: + inQuotes = wasEscape + case c == '"': + inQuotes = true + } + wasEscape = false + } + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "EOF reached while skipping array/object or token", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } +} + +// Raw fetches the next item recursively as a data slice +func (r *Lexer) Raw() []byte { + r.SkipRecursive() + if !r.Ok() { + return nil + } + return r.Data[r.start:r.pos] +} + +// IsStart returns whether the lexer is positioned at the start +// of an input string. +func (r *Lexer) IsStart() bool { + return r.pos == 0 +} + +// Consumed reads all remaining bytes from the input, publishing an error if +// there is anything but whitespace remaining. +func (r *Lexer) Consumed() { + if r.pos > len(r.Data) || !r.Ok() { + return + } + + for _, c := range r.Data[r.pos:] { + if c != ' ' && c != '\t' && c != '\r' && c != '\n' { + r.AddError(&LexerError{ + Reason: "invalid character '" + string(c) + "' after top-level value", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + }) + return + } + + r.pos++ + r.start++ + } +} + +func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "", nil + } + if !skipUnescape { + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "", nil + } + } + + bytes := r.token.byteValue + ret := bytesToStr(r.token.byteValue) + r.consume() + return ret, bytes +} + +// UnsafeString returns the string value if the token is a string literal. +// +// Warning: returned string may point to the input buffer, so the string should not outlive +// the input buffer. Intended pattern of usage is as an argument to a switch statement. +func (r *Lexer) UnsafeString() string { + ret, _ := r.unsafeString(false) + return ret +} + +// UnsafeBytes returns the byte slice if the token is a string literal. +func (r *Lexer) UnsafeBytes() []byte { + _, ret := r.unsafeString(false) + return ret +} + +// UnsafeFieldName returns current member name string token +func (r *Lexer) UnsafeFieldName(skipUnescape bool) string { + ret, _ := r.unsafeString(skipUnescape) + return ret +} + +// String reads a string literal. +func (r *Lexer) String() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "" + } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "" + } + var ret string + if r.token.byteValueCloned { + ret = bytesToStr(r.token.byteValue) + } else { + ret = string(r.token.byteValue) + } + r.consume() + return ret +} + +// StringIntern reads a string literal, and performs string interning on it. +func (r *Lexer) StringIntern() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "" + } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "" + } + ret := intern.Bytes(r.token.byteValue) + r.consume() + return ret +} + +// Bytes reads a string literal and base64 decodes it into a byte slice. +func (r *Lexer) Bytes() []byte { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return nil + } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return nil + } + ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) + n, err := base64.StdEncoding.Decode(ret, r.token.byteValue) + if err != nil { + r.fatalError = &LexerError{ + Reason: err.Error(), + } + return nil + } + + r.consume() + return ret[:n] +} + +// Bool reads a true or false boolean keyword. +func (r *Lexer) Bool() bool { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenBool { + r.errInvalidToken("bool") + return false + } + ret := r.token.boolValue + r.consume() + return ret +} + +func (r *Lexer) number() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenNumber { + r.errInvalidToken("number") + return "" + } + ret := bytesToStr(r.token.byteValue) + r.consume() + return ret +} + +func (r *Lexer) Uint8() uint8 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint8(n) +} + +func (r *Lexer) Uint16() uint16 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint16(n) +} + +func (r *Lexer) Uint32() uint32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return uint32(n) +} + +func (r *Lexer) Uint64() uint64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Uint() uint { + return uint(r.Uint64()) +} + +func (r *Lexer) Int8() int8 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int8(n) +} + +func (r *Lexer) Int16() int16 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int16(n) +} + +func (r *Lexer) Int32() int32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return int32(n) +} + +func (r *Lexer) Int64() int64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Int() int { + return int(r.Int64()) +} + +func (r *Lexer) Uint8Str() uint8 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint8(n) +} + +func (r *Lexer) Uint16Str() uint16 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint16(n) +} + +func (r *Lexer) Uint32Str() uint32 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return uint32(n) +} + +func (r *Lexer) Uint64Str() uint64 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) UintStr() uint { + return uint(r.Uint64Str()) +} + +func (r *Lexer) UintptrStr() uintptr { + return uintptr(r.Uint64Str()) +} + +func (r *Lexer) Int8Str() int8 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 8) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int8(n) +} + +func (r *Lexer) Int16Str() int16 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 16) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int16(n) +} + +func (r *Lexer) Int32Str() int32 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return int32(n) +} + +func (r *Lexer) Int64Str() int64 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseInt(s, 10, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) IntStr() int { + return int(r.Int64Str()) +} + +func (r *Lexer) Float32() float32 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseFloat(s, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return float32(n) +} + +func (r *Lexer) Float32Str() float32 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + n, err := strconv.ParseFloat(s, 32) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return float32(n) +} + +func (r *Lexer) Float64() float64 { + s := r.number() + if !r.Ok() { + return 0 + } + + n, err := strconv.ParseFloat(s, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: s, + }) + } + return n +} + +func (r *Lexer) Float64Str() float64 { + s, b := r.unsafeString(false) + if !r.Ok() { + return 0 + } + n, err := strconv.ParseFloat(s, 64) + if err != nil { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Reason: err.Error(), + Data: string(b), + }) + } + return n +} + +func (r *Lexer) Error() error { + return r.fatalError +} + +func (r *Lexer) AddError(e error) { + if r.fatalError == nil { + r.fatalError = e + } +} + +func (r *Lexer) AddNonFatalError(e error) { + r.addNonfatalError(&LexerError{ + Offset: r.start, + Data: string(r.Data[r.start:r.pos]), + Reason: e.Error(), + }) +} + +func (r *Lexer) addNonfatalError(err *LexerError) { + if r.UseMultipleErrors { + // We don't want to add errors with the same offset. + if len(r.multipleErrors) != 0 && r.multipleErrors[len(r.multipleErrors)-1].Offset == err.Offset { + return + } + r.multipleErrors = append(r.multipleErrors, err) + return + } + r.fatalError = err +} + +func (r *Lexer) GetNonFatalErrors() []*LexerError { + return r.multipleErrors +} + +// JsonNumber fetches and json.Number from 'encoding/json' package. +// Both int, float or string, contains them are valid values +func (r *Lexer) JsonNumber() json.Number { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() { + r.errInvalidToken("json.Number") + return json.Number("") + } + + switch r.token.kind { + case tokenString: + return json.Number(r.String()) + case tokenNumber: + return json.Number(r.Raw()) + case tokenNull: + r.Null() + return json.Number("") + default: + r.errSyntax() + return json.Number("") + } +} + +// Interface fetches an interface{} analogous to the 'encoding/json' package. +func (r *Lexer) Interface() interface{} { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + + if !r.Ok() { + return nil + } + switch r.token.kind { + case tokenString: + return r.String() + case tokenNumber: + return r.Float64() + case tokenBool: + return r.Bool() + case tokenNull: + r.Null() + return nil + } + + if r.token.delimValue == '{' { + r.consume() + + ret := map[string]interface{}{} + for !r.IsDelim('}') { + key := r.String() + r.WantColon() + ret[key] = r.Interface() + r.WantComma() + } + r.Delim('}') + + if r.Ok() { + return ret + } else { + return nil + } + } else if r.token.delimValue == '[' { + r.consume() + + ret := []interface{}{} + for !r.IsDelim(']') { + ret = append(ret, r.Interface()) + r.WantComma() + } + r.Delim(']') + + if r.Ok() { + return ret + } else { + return nil + } + } + r.errSyntax() + return nil +} + +// WantComma requires a comma to be present before fetching next token. +func (r *Lexer) WantComma() { + r.wantSep = ',' + r.firstElement = false +} + +// WantColon requires a colon to be present before fetching next token. +func (r *Lexer) WantColon() { + r.wantSep = ':' + r.firstElement = false +} diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go new file mode 100644 index 00000000..2c5b2010 --- /dev/null +++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -0,0 +1,405 @@ +// Package jwriter contains a JSON writer. +package jwriter + +import ( + "io" + "strconv" + "unicode/utf8" + + "github.com/mailru/easyjson/buffer" +) + +// Flags describe various encoding options. The behavior may be actually implemented in the encoder, but +// Flags field in Writer is used to set and pass them around. +type Flags int + +const ( + NilMapAsEmpty Flags = 1 << iota // Encode nil map as '{}' rather than 'null'. + NilSliceAsEmpty // Encode nil slice as '[]' rather than 'null'. +) + +// Writer is a JSON writer. +type Writer struct { + Flags Flags + + Error error + Buffer buffer.Buffer + NoEscapeHTML bool +} + +// Size returns the size of the data that was written out. +func (w *Writer) Size() int { + return w.Buffer.Size() +} + +// DumpTo outputs the data to given io.Writer, resetting the buffer. +func (w *Writer) DumpTo(out io.Writer) (written int, err error) { + return w.Buffer.DumpTo(out) +} + +// BuildBytes returns writer data as a single byte slice. You can optionally provide one byte slice +// as argument that it will try to reuse. +func (w *Writer) BuildBytes(reuse ...[]byte) ([]byte, error) { + if w.Error != nil { + return nil, w.Error + } + + return w.Buffer.BuildBytes(reuse...), nil +} + +// ReadCloser returns an io.ReadCloser that can be used to read the data. +// ReadCloser also resets the buffer. +func (w *Writer) ReadCloser() (io.ReadCloser, error) { + if w.Error != nil { + return nil, w.Error + } + + return w.Buffer.ReadCloser(), nil +} + +// RawByte appends raw binary data to the buffer. +func (w *Writer) RawByte(c byte) { + w.Buffer.AppendByte(c) +} + +// RawByte appends raw binary data to the buffer. +func (w *Writer) RawString(s string) { + w.Buffer.AppendString(s) +} + +// Raw appends raw binary data to the buffer or sets the error if it is given. Useful for +// calling with results of MarshalJSON-like functions. +func (w *Writer) Raw(data []byte, err error) { + switch { + case w.Error != nil: + return + case err != nil: + w.Error = err + case len(data) > 0: + w.Buffer.AppendBytes(data) + default: + w.RawString("null") + } +} + +// RawText encloses raw binary data in quotes and appends in to the buffer. +// Useful for calling with results of MarshalText-like functions. +func (w *Writer) RawText(data []byte, err error) { + switch { + case w.Error != nil: + return + case err != nil: + w.Error = err + case len(data) > 0: + w.String(string(data)) + default: + w.RawString("null") + } +} + +// Base64Bytes appends data to the buffer after base64 encoding it +func (w *Writer) Base64Bytes(data []byte) { + if data == nil { + w.Buffer.AppendString("null") + return + } + w.Buffer.AppendByte('"') + w.base64(data) + w.Buffer.AppendByte('"') +} + +func (w *Writer) Uint8(n uint8) { + w.Buffer.EnsureSpace(3) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint16(n uint16) { + w.Buffer.EnsureSpace(5) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint32(n uint32) { + w.Buffer.EnsureSpace(10) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint(n uint) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) +} + +func (w *Writer) Uint64(n uint64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) +} + +func (w *Writer) Int8(n int8) { + w.Buffer.EnsureSpace(4) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int16(n int16) { + w.Buffer.EnsureSpace(6) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int32(n int32) { + w.Buffer.EnsureSpace(11) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int(n int) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) +} + +func (w *Writer) Int64(n int64) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) +} + +func (w *Writer) Uint8Str(n uint8) { + w.Buffer.EnsureSpace(3) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint16Str(n uint16) { + w.Buffer.EnsureSpace(5) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint32Str(n uint32) { + w.Buffer.EnsureSpace(10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) UintStr(n uint) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Uint64Str(n uint64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) UintptrStr(n uintptr) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int8Str(n int8) { + w.Buffer.EnsureSpace(4) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int16Str(n int16) { + w.Buffer.EnsureSpace(6) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int32Str(n int32) { + w.Buffer.EnsureSpace(11) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) IntStr(n int) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Int64Str(n int64) { + w.Buffer.EnsureSpace(21) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Float32(n float32) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) +} + +func (w *Writer) Float32Str(n float32) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Float64(n float64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, n, 'g', -1, 64) +} + +func (w *Writer) Float64Str(n float64) { + w.Buffer.EnsureSpace(20) + w.Buffer.Buf = append(w.Buffer.Buf, '"') + w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 64) + w.Buffer.Buf = append(w.Buffer.Buf, '"') +} + +func (w *Writer) Bool(v bool) { + w.Buffer.EnsureSpace(5) + if v { + w.Buffer.Buf = append(w.Buffer.Buf, "true"...) + } else { + w.Buffer.Buf = append(w.Buffer.Buf, "false"...) + } +} + +const chars = "0123456789abcdef" + +func getTable(falseValues ...int) [128]bool { + table := [128]bool{} + + for i := 0; i < 128; i++ { + table[i] = true + } + + for _, v := range falseValues { + table[v] = false + } + + return table +} + +var ( + htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\') + htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\') +) + +func (w *Writer) String(s string) { + w.Buffer.AppendByte('"') + + // Portions of the string that contain no escapes are appended as + // byte slices. + + p := 0 // last non-escape symbol + + escapeTable := &htmlEscapeTable + if w.NoEscapeHTML { + escapeTable = &htmlNoEscapeTable + } + + for i := 0; i < len(s); { + c := s[i] + + if c < utf8.RuneSelf { + if escapeTable[c] { + // single-width character, no escaping is required + i++ + continue + } + + w.Buffer.AppendString(s[p:i]) + switch c { + case '\t': + w.Buffer.AppendString(`\t`) + case '\r': + w.Buffer.AppendString(`\r`) + case '\n': + w.Buffer.AppendString(`\n`) + case '\\': + w.Buffer.AppendString(`\\`) + case '"': + w.Buffer.AppendString(`\"`) + default: + w.Buffer.AppendString(`\u00`) + w.Buffer.AppendByte(chars[c>>4]) + w.Buffer.AppendByte(chars[c&0xf]) + } + + i++ + p = i + continue + } + + // broken utf + runeValue, runeWidth := utf8.DecodeRuneInString(s[i:]) + if runeValue == utf8.RuneError && runeWidth == 1 { + w.Buffer.AppendString(s[p:i]) + w.Buffer.AppendString(`\ufffd`) + i++ + p = i + continue + } + + // jsonp stuff - tab separator and line separator + if runeValue == '\u2028' || runeValue == '\u2029' { + w.Buffer.AppendString(s[p:i]) + w.Buffer.AppendString(`\u202`) + w.Buffer.AppendByte(chars[runeValue&0xf]) + i += runeWidth + p = i + continue + } + i += runeWidth + } + w.Buffer.AppendString(s[p:]) + w.Buffer.AppendByte('"') +} + +const encode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +const padChar = '=' + +func (w *Writer) base64(in []byte) { + + if len(in) == 0 { + return + } + + w.Buffer.EnsureSpace(((len(in)-1)/3 + 1) * 4) + + si := 0 + n := (len(in) / 3) * 3 + + for si < n { + // Convert 3x 8bit source bytes into 4 bytes + val := uint(in[si+0])<<16 | uint(in[si+1])<<8 | uint(in[si+2]) + + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>18&0x3F], encode[val>>12&0x3F], encode[val>>6&0x3F], encode[val&0x3F]) + + si += 3 + } + + remain := len(in) - si + if remain == 0 { + return + } + + // Add the remaining small block + val := uint(in[si+0]) << 16 + if remain == 2 { + val |= uint(in[si+1]) << 8 + } + + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>18&0x3F], encode[val>>12&0x3F]) + + switch remain { + case 2: + w.Buffer.Buf = append(w.Buffer.Buf, encode[val>>6&0x3F], byte(padChar)) + case 1: + w.Buffer.Buf = append(w.Buffer.Buf, byte(padChar), byte(padChar)) + } +} diff --git a/vendor/github.com/munnerz/goautoneg/LICENSE b/vendor/github.com/munnerz/goautoneg/LICENSE new file mode 100644 index 00000000..bbc7b897 --- /dev/null +++ b/vendor/github.com/munnerz/goautoneg/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/munnerz/goautoneg/Makefile b/vendor/github.com/munnerz/goautoneg/Makefile new file mode 100644 index 00000000..e33ee173 --- /dev/null +++ b/vendor/github.com/munnerz/goautoneg/Makefile @@ -0,0 +1,13 @@ +include $(GOROOT)/src/Make.inc + +TARG=bitbucket.org/ww/goautoneg +GOFILES=autoneg.go + +include $(GOROOT)/src/Make.pkg + +format: + gofmt -w *.go + +docs: + gomake clean + godoc ${TARG} > README.txt diff --git a/vendor/github.com/munnerz/goautoneg/README.txt b/vendor/github.com/munnerz/goautoneg/README.txt new file mode 100644 index 00000000..7723656d --- /dev/null +++ b/vendor/github.com/munnerz/goautoneg/README.txt @@ -0,0 +1,67 @@ +PACKAGE + +package goautoneg +import "bitbucket.org/ww/goautoneg" + +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTIONS + +func Negotiate(header string, alternatives []string) (content_type string) +Negotiate the most appropriate content_type given the accept header +and a list of alternatives. + +func ParseAccept(header string) (accept []Accept) +Parse an Accept Header string returning a sorted list +of clauses + + +TYPES + +type Accept struct { + Type, SubType string + Q float32 + Params map[string]string +} +Structure to represent a clause in an HTTP Accept Header + + +SUBDIRECTORIES + + .hg diff --git a/vendor/github.com/munnerz/goautoneg/autoneg.go b/vendor/github.com/munnerz/goautoneg/autoneg.go new file mode 100644 index 00000000..1dd1cad6 --- /dev/null +++ b/vendor/github.com/munnerz/goautoneg/autoneg.go @@ -0,0 +1,189 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// acceptSlice is defined to implement sort interface. +type acceptSlice []Accept + +func (slice acceptSlice) Len() int { + return len(slice) +} + +func (slice acceptSlice) Less(i, j int) bool { + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (slice acceptSlice) Swap(i, j int) { + slice[i], slice[j] = slice[j], slice[i] +} + +func stringTrimSpaceCutset(r rune) bool { + return r == ' ' +} + +func nextSplitElement(s, sep string) (item string, remaining string) { + if index := strings.Index(s, sep); index != -1 { + return s[:index], s[index+1:] + } + return s, "" +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) acceptSlice { + partsCount := 0 + remaining := header + for len(remaining) > 0 { + partsCount++ + _, remaining = nextSplitElement(remaining, ",") + } + accept := make(acceptSlice, 0, partsCount) + + remaining = header + var part string + for len(remaining) > 0 { + part, remaining = nextSplitElement(remaining, ",") + part = strings.TrimFunc(part, stringTrimSpaceCutset) + + a := Accept{ + Q: 1.0, + } + + sp, remainingPart := nextSplitElement(part, ";") + + sp0, spRemaining := nextSplitElement(sp, "/") + a.Type = strings.TrimFunc(sp0, stringTrimSpaceCutset) + + switch { + case len(spRemaining) == 0: + if a.Type == "*" { + a.SubType = "*" + } else { + continue + } + default: + var sp1 string + sp1, spRemaining = nextSplitElement(spRemaining, "/") + if len(spRemaining) > 0 { + continue + } + a.SubType = strings.TrimFunc(sp1, stringTrimSpaceCutset) + } + + if len(remainingPart) == 0 { + accept = append(accept, a) + continue + } + + a.Params = make(map[string]string) + for len(remainingPart) > 0 { + sp, remainingPart = nextSplitElement(remainingPart, ";") + sp0, spRemaining = nextSplitElement(sp, "=") + if len(spRemaining) == 0 { + continue + } + var sp1 string + sp1, spRemaining = nextSplitElement(spRemaining, "=") + if len(spRemaining) != 0 { + continue + } + token := strings.TrimFunc(sp0, stringTrimSpaceCutset) + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp1, 32) + } else { + a.Params[token] = strings.TrimFunc(sp1, stringTrimSpaceCutset) + } + } + + accept = append(accept, a) + } + + sort.Sort(accept) + return accept +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml new file mode 100644 index 00000000..f2e2cc36 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusteroperator.crd.yaml @@ -0,0 +1,137 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/497 + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: clusteroperators.config.openshift.io +spec: + group: config.openshift.io + names: + kind: ClusterOperator + listKind: ClusterOperatorList + plural: clusteroperators + shortNames: + - co + singular: clusteroperator + scope: Cluster + versions: + - additionalPrinterColumns: + - description: The version the operator is at. + jsonPath: .status.versions[?(@.name=="operator")].version + name: Version + type: string + - description: Whether the operator is running and stable. + jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - description: Whether the operator is processing changes. + jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - description: Whether the operator is degraded. + jsonPath: .status.conditions[?(@.type=="Degraded")].status + name: Degraded + type: string + - description: The time the operator's Available status last changed. + jsonPath: .status.conditions[?(@.type=="Available")].lastTransitionTime + name: Since + type: date + name: v1 + schema: + openAPIV3Schema: + description: "ClusterOperator is the Custom Resource object which holds the current state of an operator. This object is used by operators to convey their state to the rest of the cluster. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds configuration that could apply to any operator. + type: object + status: + description: status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem. + type: object + properties: + conditions: + description: conditions describes the state of the operator's managed and monitored components. + type: array + items: + description: ClusterOperatorStatusCondition represents the state of the operator's managed and monitored components. + type: object + required: + - lastTransitionTime + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the time of the last update to the current status property. + type: string + format: date-time + message: + description: message provides additional information about the current condition. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines. + type: string + reason: + description: reason is the CamelCase reason for the condition's current status. + type: string + status: + description: status of the condition, one of True, False, Unknown. + type: string + type: + description: type specifies the aspect reported by this condition. + type: string + extension: + description: extension contains any additional status information specific to the operator which owns this status object. + type: object + nullable: true + x-kubernetes-preserve-unknown-fields: true + relatedObjects: + description: 'relatedObjects is a list of objects that are "interesting" or related to this operator. Common uses are: 1. the detailed resource driving the operator 2. operator namespaces 3. operand namespaces' + type: array + items: + description: ObjectReference contains enough information to let you inspect or modify the referred object. + type: object + required: + - group + - name + - resource + properties: + group: + description: group of the referent. + type: string + name: + description: name of the referent. + type: string + namespace: + description: namespace of the referent. + type: string + resource: + description: resource of the referent. + type: string + versions: + description: versions is a slice of operator and operand version tuples. Operators which manage multiple operands will have multiple operand entries in the array. Available operators must report the version of the operator itself with the name "operator". An operator reports a new "operator" version when it has rolled out the new version to all of its operands. + type: array + items: + type: object + required: + - name + - version + properties: + name: + description: name is the name of the particular operand this version is for. It usually matches container images, not operators. + type: string + version: + description: version indicates which version of a particular operand is currently being managed. It must always match the Available operand. If 1.0.0 is Available, then this must indicate 1.0.0 even if the operator is trying to rollout 1.1.0 + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml new file mode 100644 index 00000000..16a333ca --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_00_cluster-version-operator_01_clusterversion.crd.yaml @@ -0,0 +1,435 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/495 + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: clusterversions.config.openshift.io +spec: + group: config.openshift.io + names: + kind: ClusterVersion + plural: clusterversions + singular: clusterversion + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .status.history[?(@.state=="Completed")].version + name: Version + type: string + - jsonPath: .status.conditions[?(@.type=="Available")].status + name: Available + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].status + name: Progressing + type: string + - jsonPath: .status.conditions[?(@.type=="Progressing")].lastTransitionTime + name: Since + type: date + - jsonPath: .status.conditions[?(@.type=="Progressing")].message + name: Status + type: string + name: v1 + schema: + openAPIV3Schema: + description: "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster. + type: object + required: + - clusterID + properties: + capabilities: + description: capabilities configures the installation of optional, core cluster components. A null value here is identical to an empty object; see the child properties for default semantics. + type: object + properties: + additionalEnabledCapabilities: + description: additionalEnabledCapabilities extends the set of managed capabilities beyond the baseline defined in baselineCapabilitySet. The default is an empty set. + type: array + items: + description: ClusterVersionCapability enumerates optional, core cluster components. + type: string + enum: + - openshift-samples + - baremetal + - marketplace + - Console + - Insights + - Storage + - CSISnapshot + - NodeTuning + x-kubernetes-list-type: atomic + baselineCapabilitySet: + description: baselineCapabilitySet selects an initial set of optional capabilities to enable, which can be extended via additionalEnabledCapabilities. If unset, the cluster will choose a default, and the default may change over time. The current default is vCurrent. + type: string + enum: + - None + - v4.11 + - v4.12 + - v4.13 + - vCurrent + channel: + description: channel is an identifier for explicitly requesting that a non-default set of updates be applied to this cluster. The default channel will be contain stable updates that are appropriate for production clusters. + type: string + clusterID: + description: clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field. + type: string + desiredUpdate: + description: "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail. \n Some of the fields are inter-related with restrictions and meanings described here. 1. image is specified, version is specified, architecture is specified. API validation error. 2. image is specified, version is specified, architecture is not specified. You should not do this. version is silently ignored and image is used. 3. image is specified, version is not specified, architecture is specified. API validation error. 4. image is specified, version is not specified, architecture is not specified. image is used. 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. 7. image is not specified, version is not specified, architecture is specified. API validation error. 8. image is not specified, version is not specified, architecture is not specified. API validation error. \n If an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted. Not all rollbacks will succeed." + type: object + properties: + architecture: + description: architecture is an optional field that indicates the desired value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. architecture can only be set to Multi thereby only allowing updates from single to multi architecture. If architecture is set, image cannot be set and version must be set. Valid values are 'Multi' and empty. + type: string + enum: + - Multi + - "" + force: + description: force allows an administrator to update to an image that has failed verification or upgradeable checks. This option should only be used when the authenticity of the provided image has been verified out of band because the provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources. + type: boolean + image: + description: image is a container image location that contains the update. image should be used when the desired version does not exist in availableUpdates or history. When image is set, version is ignored. When image is set, version should be empty. When image is set, architecture cannot be specified. + type: string + version: + description: version is a semantic version identifying the update version. version is ignored if image is specified and required if architecture is specified. + type: string + x-kubernetes-validations: + - rule: 'has(self.architecture) && has(self.image) ? (self.architecture == '''' || self.image == '''') : true' + message: cannot set both Architecture and Image + - rule: 'has(self.architecture) && self.architecture != '''' ? self.version != '''' : true' + message: Version must be set if Architecture is set + overrides: + description: overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object. + type: array + items: + description: ComponentOverride allows overriding cluster version operator's behavior for a component. + type: object + required: + - group + - kind + - name + - namespace + - unmanaged + properties: + group: + description: group identifies the API group that the kind is in. + type: string + kind: + description: kind indentifies which object to override. + type: string + name: + description: name is the component's name. + type: string + namespace: + description: namespace is the component's namespace. If the resource is cluster scoped, the namespace should be empty. + type: string + unmanaged: + description: 'unmanaged controls if cluster version operator should stop managing the resources in this cluster. Default: false' + type: boolean + upstream: + description: upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region. + type: string + status: + description: status contains information about the available updates and any in-progress updates. + type: object + required: + - availableUpdates + - desired + - observedGeneration + - versionHash + properties: + availableUpdates: + description: availableUpdates contains updates recommended for this cluster. Updates which appear in conditionalUpdates but not in availableUpdates may expose this cluster to known issues. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified. + type: array + items: + description: Release represents an OpenShift release image and associated metadata. + type: object + properties: + channels: + description: channels is the set of Cincinnati channels to which the release currently belongs. + type: array + items: + type: string + image: + description: image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version. + type: string + url: + description: url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases. + type: string + version: + description: version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified. + type: string + nullable: true + capabilities: + description: capabilities describes the state of optional, core cluster components. + type: object + properties: + enabledCapabilities: + description: enabledCapabilities lists all the capabilities that are currently managed. + type: array + items: + description: ClusterVersionCapability enumerates optional, core cluster components. + type: string + enum: + - openshift-samples + - baremetal + - marketplace + - Console + - Insights + - Storage + - CSISnapshot + - NodeTuning + x-kubernetes-list-type: atomic + knownCapabilities: + description: knownCapabilities lists all the capabilities known to the current cluster. + type: array + items: + description: ClusterVersionCapability enumerates optional, core cluster components. + type: string + enum: + - openshift-samples + - baremetal + - marketplace + - Console + - Insights + - Storage + - CSISnapshot + - NodeTuning + x-kubernetes-list-type: atomic + conditionalUpdates: + description: conditionalUpdates contains the list of updates that may be recommended for this cluster if it meets specific required conditions. Consumers interested in the set of updates that are actually recommended for this cluster should use availableUpdates. This list may be empty if no updates are recommended, if the update service is unavailable, or if an empty or invalid channel has been specified. + type: array + items: + description: ConditionalUpdate represents an update which is recommended to some clusters on the version the current cluster is reconciling, but which may not be recommended for the current cluster. + type: object + required: + - release + - risks + properties: + conditions: + description: 'conditions represents the observations of the conditional update''s current status. Known types are: * Evaluating, for whether the cluster-version operator will attempt to evaluate any risks[].matchingRules. * Recommended, for whether the update is recommended for the current cluster.' + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + release: + description: release is the target of the update. + type: object + properties: + channels: + description: channels is the set of Cincinnati channels to which the release currently belongs. + type: array + items: + type: string + image: + description: image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version. + type: string + url: + description: url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases. + type: string + version: + description: version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified. + type: string + risks: + description: risks represents the range of issues associated with updating to the target release. The cluster-version operator will evaluate all entries, and only recommend the update if there is at least one entry and all entries recommend the update. + type: array + minItems: 1 + items: + description: ConditionalUpdateRisk represents a reason and cluster-state for not recommending a conditional update. + type: object + required: + - matchingRules + - message + - name + - url + properties: + matchingRules: + description: matchingRules is a slice of conditions for deciding which clusters match the risk and which do not. The slice is ordered by decreasing precedence. The cluster-version operator will walk the slice in order, and stop after the first it can successfully evaluate. If no condition can be successfully evaluated, the update will not be recommended. + type: array + minItems: 1 + items: + description: ClusterCondition is a union of typed cluster conditions. The 'type' property determines which of the type-specific properties are relevant. When evaluated on a cluster, the condition may match, not match, or fail to evaluate. + type: object + required: + - type + properties: + promql: + description: promQL represents a cluster condition based on PromQL. + type: object + required: + - promql + properties: + promql: + description: PromQL is a PromQL query classifying clusters. This query query should return a 1 in the match case and a 0 in the does-not-match case. Queries which return no time series, or which return values besides 0 or 1, are evaluation failures. + type: string + type: + description: type represents the cluster-condition type. This defines the members and semantics of any additional properties. + type: string + enum: + - Always + - PromQL + x-kubernetes-list-type: atomic + message: + description: message provides additional information about the risk of updating, in the event that matchingRules match the cluster state. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines. + type: string + minLength: 1 + name: + description: name is the CamelCase reason for not recommending a conditional update, in the event that matchingRules match the cluster state. + type: string + minLength: 1 + url: + description: url contains information about this risk. + type: string + format: uri + minLength: 1 + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + x-kubernetes-list-type: atomic + conditions: + description: conditions provides information about the cluster version. The condition "Available" is set to true if the desiredUpdate has been reached. The condition "Progressing" is set to true if an update is being applied. The condition "Degraded" is set to true if an update is currently blocked by a temporary or permanent error. Conditions are only valid for the current desiredUpdate when metadata.generation is equal to status.generation. + type: array + items: + description: ClusterOperatorStatusCondition represents the state of the operator's managed and monitored components. + type: object + required: + - lastTransitionTime + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the time of the last update to the current status property. + type: string + format: date-time + message: + description: message provides additional information about the current condition. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines. + type: string + reason: + description: reason is the CamelCase reason for the condition's current status. + type: string + status: + description: status of the condition, one of True, False, Unknown. + type: string + type: + description: type specifies the aspect reported by this condition. + type: string + desired: + description: desired is the version that the cluster is reconciling towards. If the cluster is not yet fully initialized desired will be set with the information available, which may be an image or a tag. + type: object + properties: + channels: + description: channels is the set of Cincinnati channels to which the release currently belongs. + type: array + items: + type: string + image: + description: image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version. + type: string + url: + description: url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases. + type: string + version: + description: version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified. + type: string + history: + description: history contains a list of the most recent versions applied to the cluster. This value may be empty during cluster startup, and then will be updated when a new update is being applied. The newest update is first in the list and it is ordered by recency. Updates in the history have state Completed if the rollout completed - if an update was failing or halfway applied the state will be Partial. Only a limited amount of update history is preserved. + type: array + items: + description: UpdateHistory is a single attempted update to the cluster. + type: object + required: + - completionTime + - image + - startedTime + - state + - verified + properties: + acceptedRisks: + description: acceptedRisks records risks which were accepted to initiate the update. For example, it may menition an Upgradeable=False or missing signature that was overriden via desiredUpdate.force, or an update that was initiated despite not being in the availableUpdates set of recommended update targets. + type: string + completionTime: + description: completionTime, if set, is when the update was fully applied. The update that is currently being applied will have a null completion time. Completion time will always be set for entries that are not the current update (usually to the started time of the next update). + type: string + format: date-time + nullable: true + image: + description: image is a container image location that contains the update. This value is always populated. + type: string + startedTime: + description: startedTime is the time at which the update was started. + type: string + format: date-time + state: + description: state reflects whether the update was fully applied. The Partial state indicates the update is not fully applied, while the Completed state indicates the update was successfully rolled out at least once (all parts of the update successfully applied). + type: string + verified: + description: verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted. Verified does not cover upgradeable checks that depend on the cluster state at the time when the update target was accepted. + type: boolean + version: + description: version is a semantic version identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty. + type: string + observedGeneration: + description: observedGeneration reports which version of the spec is being synced. If this value is not equal to metadata.generation, then the desired and conditions fields may represent a previous version. + type: integer + format: int64 + versionHash: + description: versionHash is a fingerprint of the content that the cluster will be updated with. It is used by the operator to avoid unnecessary work and is for internal use only. + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml new file mode 100644 index 00000000..3f58cbf6 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_03_config-operator_01_proxy.crd.yaml @@ -0,0 +1,78 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: proxies.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Proxy + listKind: ProxyList + plural: proxies + singular: proxy + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Spec holds user-settable values for the proxy configuration + type: object + properties: + httpProxy: + description: httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var. + type: string + httpsProxy: + description: httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var. + type: string + noProxy: + description: noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var. + type: string + readinessEndpoints: + description: readinessEndpoints is a list of endpoints used to verify readiness of the proxy. + type: array + items: + type: string + trustedCA: + description: "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well. \n The namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml): \n apiVersion: v1 kind: ConfigMap metadata: name: user-ca-bundle namespace: openshift-config data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- Custom CA certificate bundle. -----END CERTIFICATE-----" + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + httpProxy: + description: httpProxy is the URL of the proxy for HTTP requests. + type: string + httpsProxy: + description: httpsProxy is the URL of the proxy for HTTPS requests. + type: string + noProxy: + description: noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_03_marketplace-operator_01_operatorhub.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_03_marketplace-operator_01_operatorhub.crd.yaml new file mode 100644 index 00000000..6e82955f --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_03_marketplace-operator_01_operatorhub.crd.yaml @@ -0,0 +1,84 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + capability.openshift.io/name: marketplace + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: operatorhubs.config.openshift.io +spec: + group: config.openshift.io + names: + kind: OperatorHub + listKind: OperatorHubList + plural: operatorhubs + singular: operatorhub + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorHubSpec defines the desired state of OperatorHub + type: object + properties: + disableAllDefaultSources: + description: disableAllDefaultSources allows you to disable all the default hub sources. If this is true, a specific entry in sources can be used to enable a default source. If this is false, a specific entry in sources can be used to disable or enable a default source. + type: boolean + sources: + description: sources is the list of default hub sources and their configuration. If the list is empty, it implies that the default hub sources are enabled on the cluster unless disableAllDefaultSources is true. If disableAllDefaultSources is true and sources is not empty, the configuration present in sources will take precedence. The list of default hub sources and their current state will always be reflected in the status block. + type: array + items: + description: HubSource is used to specify the hub source and its configuration + type: object + properties: + disabled: + description: disabled is used to disable a default hub source on cluster + type: boolean + name: + description: name is the name of one of the default hub sources + type: string + maxLength: 253 + minLength: 1 + status: + description: OperatorHubStatus defines the observed state of OperatorHub. The current state of the default hub sources will always be reflected here. + type: object + properties: + sources: + description: sources encapsulates the result of applying the configuration for each hub source + type: array + items: + description: HubSourceStatus is used to reflect the current state of applying the configuration to a default source + type: object + properties: + disabled: + description: disabled is used to disable a default hub source on cluster + type: boolean + message: + description: message provides more information regarding failures + type: string + name: + description: name is the name of one of the default hub sources + type: string + maxLength: 253 + minLength: 1 + status: + description: status indicates success or failure in applying the configuration + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml new file mode 100644 index 00000000..7edc7f23 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-Default.crd.yaml @@ -0,0 +1,179 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + release.openshift.io/feature-set: Default + name: apiservers.config.openshift.io +spec: + group: config.openshift.io + names: + kind: APIServer + listKind: APIServerList + plural: apiservers + singular: apiserver + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + additionalCORSAllowedOrigins: + description: additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth server from JavaScript applications. The values are regular expressions that correspond to the Golang regular expression language. + type: array + items: + type: string + audit: + description: audit specifies the settings for audit configuration to be applied to all OpenShift-provided API servers in the cluster. + type: object + default: + profile: Default + properties: + customRules: + description: customRules specify profiles per group. These profile take precedence over the top-level profile field if they apply. They are evaluation from top to bottom and the first one that matches, applies. + type: array + items: + description: AuditCustomRule describes a custom rule for an audit profile that takes precedence over the top-level profile. + type: object + required: + - group + - profile + properties: + group: + description: group is a name of group a request user must be member of in order to this profile to apply. + type: string + minLength: 1 + profile: + description: "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster. \n The following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. \n If unset, the 'Default' profile is used as the default." + type: string + enum: + - Default + - WriteRequestBodies + - AllRequestBodies + - None + x-kubernetes-list-map-keys: + - group + x-kubernetes-list-type: map + profile: + description: "profile specifies the name of the desired top-level audit profile to be applied to all requests sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, openshift-apiserver and oauth-apiserver), with the exception of those requests that match one or more of the customRules. \n The following profiles are provided: - Default: default policy which means MetaData level logging with the exception of events (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody level). - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. \n Warning: It is not recommended to disable audit logging by using the `None` profile unless you are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. If you disable audit logging and a support situation arises, you might need to enable audit logging and reproduce the issue in order to troubleshoot properly. \n If unset, the 'Default' profile is used as the default." + type: string + default: Default + enum: + - Default + - WriteRequestBodies + - AllRequestBodies + - None + clientCA: + description: 'clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. You usually only have to set this if you have your own PKI you wish to honor client certificates from. The ConfigMap must exist in the openshift-config namespace and contain the following required fields: - ConfigMap.Data["ca-bundle.crt"] - CA bundle.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + encryption: + description: encryption allows the configuration of encryption of resources at the datastore layer. + type: object + properties: + type: + description: "type defines what encryption type should be used to encrypt resources at the datastore layer. When this field is unset (i.e. when it is set to the empty string), identity is implied. The behavior of unset can and will change over time. Even if encryption is enabled by default, the meaning of unset may change to a different encryption type based on changes in best practices. \n When encryption is enabled, all sensitive resources shipped with the platform are encrypted. This list of sensitive resources can and will change over time. The current authoritative list is: \n 1. secrets 2. configmaps 3. routes.route.openshift.io 4. oauthaccesstokens.oauth.openshift.io 5. oauthauthorizetokens.oauth.openshift.io" + type: string + enum: + - "" + - identity + - aescbc + - aesgcm + servingCerts: + description: servingCert is the TLS cert info for serving secure traffic. If not specified, operator managed certificates will be used for serving secure traffic. + type: object + properties: + namedCertificates: + description: namedCertificates references secrets containing the TLS cert info for serving secure traffic to specific hostnames. If no named certificates are provided, or no named certificates match the server name as understood by a client, the defaultServingCertificate will be used. + type: array + items: + description: APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate. + type: object + properties: + names: + description: names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names. + type: array + items: + type: string + servingCertificate: + description: 'servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. The secret must exist in the openshift-config namespace and contain the following required fields: - Secret.Data["tls.key"] - TLS private key. - Secret.Data["tls.crt"] - TLS certificate.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + tlsSecurityProfile: + description: "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers. \n If unset, a default (which may change between releases) is chosen. Note that only Old, Intermediate and Custom profiles are currently supported, and the maximum available MinTLSVersions is VersionTLS12." + type: object + properties: + custom: + description: "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this: \n ciphers: - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 minTLSVersion: TLSv1.1" + type: object + properties: + ciphers: + description: "ciphers is used to specify the cipher algorithms that are negotiated during the TLS handshake. Operators may remove entries their operands do not support. For example, to use DES-CBC3-SHA (yaml): \n ciphers: - DES-CBC3-SHA" + type: array + items: + type: string + minTLSVersion: + description: "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml): \n minTLSVersion: TLSv1.1 \n NOTE: currently the highest minTLSVersion allowed is VersionTLS12" + type: string + enum: + - VersionTLS10 + - VersionTLS11 + - VersionTLS12 + - VersionTLS13 + nullable: true + intermediate: + description: "intermediate is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29 \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 minTLSVersion: TLSv1.2" + type: object + nullable: true + modern: + description: "modern is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 minTLSVersion: TLSv1.3 \n NOTE: Currently unsupported." + type: object + nullable: true + old: + description: "old is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - DHE-RSA-CHACHA20-POLY1305 - ECDHE-ECDSA-AES128-SHA256 - ECDHE-RSA-AES128-SHA256 - ECDHE-ECDSA-AES128-SHA - ECDHE-RSA-AES128-SHA - ECDHE-ECDSA-AES256-SHA384 - ECDHE-RSA-AES256-SHA384 - ECDHE-ECDSA-AES256-SHA - ECDHE-RSA-AES256-SHA - DHE-RSA-AES128-SHA256 - DHE-RSA-AES256-SHA256 - AES128-GCM-SHA256 - AES256-GCM-SHA384 - AES128-SHA256 - AES256-SHA256 - AES128-SHA - AES256-SHA - DES-CBC3-SHA minTLSVersion: TLSv1.0" + type: object + nullable: true + type: + description: "type is one of Old, Intermediate, Modern or Custom. Custom provides the ability to specify individual TLS security profile parameters. Old, Intermediate and Modern are TLS security profiles based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations \n The profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be reduced. \n Note that the Modern profile is currently not supported because it is not yet well adopted by common software libraries." + type: string + enum: + - Old + - Intermediate + - Modern + - Custom + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml new file mode 100644 index 00000000..8ce5214c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml @@ -0,0 +1,179 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + release.openshift.io/feature-set: TechPreviewNoUpgrade + name: apiservers.config.openshift.io +spec: + group: config.openshift.io + names: + kind: APIServer + listKind: APIServerList + plural: apiservers + singular: apiserver + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + additionalCORSAllowedOrigins: + description: additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth server from JavaScript applications. The values are regular expressions that correspond to the Golang regular expression language. + type: array + items: + type: string + audit: + description: audit specifies the settings for audit configuration to be applied to all OpenShift-provided API servers in the cluster. + type: object + default: + profile: Default + properties: + customRules: + description: customRules specify profiles per group. These profile take precedence over the top-level profile field if they apply. They are evaluation from top to bottom and the first one that matches, applies. + type: array + items: + description: AuditCustomRule describes a custom rule for an audit profile that takes precedence over the top-level profile. + type: object + required: + - group + - profile + properties: + group: + description: group is a name of group a request user must be member of in order to this profile to apply. + type: string + minLength: 1 + profile: + description: "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster. \n The following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. \n If unset, the 'Default' profile is used as the default." + type: string + enum: + - Default + - WriteRequestBodies + - AllRequestBodies + - None + x-kubernetes-list-map-keys: + - group + x-kubernetes-list-type: map + profile: + description: "profile specifies the name of the desired top-level audit profile to be applied to all requests sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, openshift-apiserver and oauth-apiserver), with the exception of those requests that match one or more of the customRules. \n The following profiles are provided: - Default: default policy which means MetaData level logging with the exception of events (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody level). - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. \n Warning: It is not recommended to disable audit logging by using the `None` profile unless you are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. If you disable audit logging and a support situation arises, you might need to enable audit logging and reproduce the issue in order to troubleshoot properly. \n If unset, the 'Default' profile is used as the default." + type: string + default: Default + enum: + - Default + - WriteRequestBodies + - AllRequestBodies + - None + clientCA: + description: 'clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. You usually only have to set this if you have your own PKI you wish to honor client certificates from. The ConfigMap must exist in the openshift-config namespace and contain the following required fields: - ConfigMap.Data["ca-bundle.crt"] - CA bundle.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + encryption: + description: encryption allows the configuration of encryption of resources at the datastore layer. + type: object + properties: + type: + description: "type defines what encryption type should be used to encrypt resources at the datastore layer. When this field is unset (i.e. when it is set to the empty string), identity is implied. The behavior of unset can and will change over time. Even if encryption is enabled by default, the meaning of unset may change to a different encryption type based on changes in best practices. \n When encryption is enabled, all sensitive resources shipped with the platform are encrypted. This list of sensitive resources can and will change over time. The current authoritative list is: \n 1. secrets 2. configmaps 3. routes.route.openshift.io 4. oauthaccesstokens.oauth.openshift.io 5. oauthauthorizetokens.oauth.openshift.io" + type: string + enum: + - "" + - identity + - aescbc + - aesgcm + servingCerts: + description: servingCert is the TLS cert info for serving secure traffic. If not specified, operator managed certificates will be used for serving secure traffic. + type: object + properties: + namedCertificates: + description: namedCertificates references secrets containing the TLS cert info for serving secure traffic to specific hostnames. If no named certificates are provided, or no named certificates match the server name as understood by a client, the defaultServingCertificate will be used. + type: array + items: + description: APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate. + type: object + properties: + names: + description: names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names. + type: array + items: + type: string + servingCertificate: + description: 'servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. The secret must exist in the openshift-config namespace and contain the following required fields: - Secret.Data["tls.key"] - TLS private key. - Secret.Data["tls.crt"] - TLS certificate.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + tlsSecurityProfile: + description: "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers. \n If unset, a default (which may change between releases) is chosen. Note that only Old, Intermediate and Custom profiles are currently supported, and the maximum available MinTLSVersions is VersionTLS12." + type: object + properties: + custom: + description: "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this: \n ciphers: - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 minTLSVersion: TLSv1.1" + type: object + properties: + ciphers: + description: "ciphers is used to specify the cipher algorithms that are negotiated during the TLS handshake. Operators may remove entries their operands do not support. For example, to use DES-CBC3-SHA (yaml): \n ciphers: - DES-CBC3-SHA" + type: array + items: + type: string + minTLSVersion: + description: "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml): \n minTLSVersion: TLSv1.1 \n NOTE: currently the highest minTLSVersion allowed is VersionTLS12" + type: string + enum: + - VersionTLS10 + - VersionTLS11 + - VersionTLS12 + - VersionTLS13 + nullable: true + intermediate: + description: "intermediate is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29 \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 minTLSVersion: TLSv1.2" + type: object + nullable: true + modern: + description: "modern is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 minTLSVersion: TLSv1.3 \n NOTE: Currently unsupported." + type: object + nullable: true + old: + description: "old is a TLS security profile based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility \n and looks like this (yaml): \n ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 - DHE-RSA-AES128-GCM-SHA256 - DHE-RSA-AES256-GCM-SHA384 - DHE-RSA-CHACHA20-POLY1305 - ECDHE-ECDSA-AES128-SHA256 - ECDHE-RSA-AES128-SHA256 - ECDHE-ECDSA-AES128-SHA - ECDHE-RSA-AES128-SHA - ECDHE-ECDSA-AES256-SHA384 - ECDHE-RSA-AES256-SHA384 - ECDHE-ECDSA-AES256-SHA - ECDHE-RSA-AES256-SHA - DHE-RSA-AES128-SHA256 - DHE-RSA-AES256-SHA256 - AES128-GCM-SHA256 - AES256-GCM-SHA384 - AES128-SHA256 - AES256-SHA256 - AES128-SHA - AES256-SHA - DES-CBC3-SHA minTLSVersion: TLSv1.0" + type: object + nullable: true + type: + description: "type is one of Old, Intermediate, Modern or Custom. Custom provides the ability to specify individual TLS security profile parameters. Old, Intermediate and Modern are TLS security profiles based on: \n https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations \n The profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be reduced. \n Note that the Modern profile is currently not supported because it is not yet well adopted by common software libraries." + type: string + enum: + - Old + - Intermediate + - Modern + - Custom + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml new file mode 100644 index 00000000..facf7c6b --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_authentication.crd.yaml @@ -0,0 +1,101 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: authentications.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Authentication + listKind: AuthenticationList + plural: authentications + singular: authentication + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + oauthMetadata: + description: 'oauthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for an external OAuth server. This discovery document can be viewed from its served location: oc get --raw ''/.well-known/oauth-authorization-server'' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 If oauthMetadata.name is non-empty, this value has precedence over any metadata reference stored in status. The key "oauthMetadata" is used to locate the data. If specified and the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + serviceAccountIssuer: + description: 'serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the previous issuer value. Instead, the tokens issued by previous service account issuer will continue to be trusted for a time period chosen by the platform (currently set to 24h). This time period is subject to change over time. This allows internal components to transition to use new service account issuer without service distruption.' + type: string + type: + description: type identifies the cluster managed, user facing authentication mode in use. Specifically, it manages the component that responds to login attempts. The default is IntegratedOAuth. + type: string + webhookTokenAuthenticator: + description: webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service. + type: object + required: + - kubeConfig + properties: + kubeConfig: + description: "kubeConfig references a secret that contains kube config file data which describes how to access the remote webhook service. The namespace for the referenced secret is openshift-config. \n For further details, see: \n https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication \n The key \"kubeConfig\" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored." + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + webhookTokenAuthenticators: + description: webhookTokenAuthenticators is DEPRECATED, setting it has no effect. + type: array + items: + description: deprecatedWebhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator. It's the same as WebhookTokenAuthenticator but it's missing the 'required' validation on KubeConfig field. + type: object + properties: + kubeConfig: + description: 'kubeConfig contains kube config file data which describes how to access the remote webhook service. For further details, see: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication The key "kubeConfig" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored. The namespace for this secret is determined by the point of use.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + integratedOAuthMetadata: + description: 'integratedOAuthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for the in-cluster integrated OAuth server. This discovery document can be viewed from its served location: oc get --raw ''/.well-known/oauth-authorization-server'' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 This contains the observed value based on cluster state. An explicitly set value in spec.oauthMetadata has precedence over this field. This field has no meaning if authentication spec.type is not set to IntegratedOAuth. The key "oauthMetadata" is used to locate the data. If the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config-managed.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml new file mode 100644 index 00000000..75166deb --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_build.crd.yaml @@ -0,0 +1,290 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: builds.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Build + listKind: BuildList + plural: builds + singular: build + preserveUnknownFields: false + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds. \n The canonical name is \"cluster\" \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: Spec holds user-settable values for the build controller configuration + type: object + properties: + additionalTrustedCA: + description: "AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config. \n DEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead." + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + buildDefaults: + description: BuildDefaults controls the default information for Builds + type: object + properties: + defaultProxy: + description: "DefaultProxy contains the default proxy settings for all build operations, including image pull/push and source download. \n Values can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy." + type: object + properties: + httpProxy: + description: httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var. + type: string + httpsProxy: + description: httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var. + type: string + noProxy: + description: noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var. + type: string + readinessEndpoints: + description: readinessEndpoints is a list of endpoints used to verify readiness of the proxy. + type: array + items: + type: string + trustedCA: + description: "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well. \n The namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml): \n apiVersion: v1 kind: ConfigMap metadata: name: user-ca-bundle namespace: openshift-config data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- Custom CA certificate bundle. -----END CERTIFICATE-----" + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + env: + description: Env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + x-kubernetes-map-type: atomic + gitProxy: + description: "GitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone. \n Values that are not set here will be inherited from DefaultProxy." + type: object + properties: + httpProxy: + description: httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var. + type: string + httpsProxy: + description: httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var. + type: string + noProxy: + description: noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var. + type: string + readinessEndpoints: + description: readinessEndpoints is a list of endpoints used to verify readiness of the proxy. + type: array + items: + type: string + trustedCA: + description: "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well. \n The namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml): \n apiVersion: v1 kind: ConfigMap metadata: name: user-ca-bundle namespace: openshift-config data: ca-bundle.crt: | -----BEGIN CERTIFICATE----- Custom CA certificate bundle. -----END CERTIFICATE-----" + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + imageLabels: + description: ImageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig. + type: array + items: + type: object + properties: + name: + description: Name defines the name of the label. It must have non-zero length. + type: string + value: + description: Value defines the literal value of the label. + type: string + resources: + description: Resources defines resource requirements to execute the build. + type: object + properties: + claims: + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." + type: array + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + type: object + required: + - name + properties: + name: + description: 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 + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + requests: + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + additionalProperties: + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + buildOverrides: + description: BuildOverrides controls override settings for builds + type: object + properties: + forcePull: + description: ForcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself + type: boolean + imageLabels: + description: ImageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten. + type: array + items: + type: object + properties: + name: + description: Name defines the name of the label. It must have non-zero length. + type: string + value: + description: Value defines the literal value of the label. + type: string + nodeSelector: + description: NodeSelector is a selector which must be true for the build pod to fit on a node + type: object + additionalProperties: + type: string + tolerations: + description: Tolerations is a list of Tolerations that will override any existing tolerations set on a build pod. + type: array + items: + description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. + type: integer + format: int64 + value: + description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml new file mode 100644 index 00000000..188b45e0 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_console.crd.yaml @@ -0,0 +1,57 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: consoles.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Console + listKind: ConsoleList + plural: consoles + singular: console + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + authentication: + description: ConsoleAuthentication defines a list of optional configuration for console authentication. + type: object + properties: + logoutRedirect: + description: 'An optional, absolute URL to redirect web browsers to after logging out of the console. If not specified, it will redirect to the default login page. This is required when using an identity provider that supports single sign-on (SSO) such as: - OpenID (Keycloak, Azure) - RequestHeader (GSSAPI, SSPI, SAML) - OAuth (GitHub, GitLab, Google) Logging out of the console will destroy the user''s token. The logoutRedirect provides the user the option to perform single logout (SLO) through the identity provider to destroy their single sign-on session.' + type: string + pattern: ^$|^((https):\/\/?)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))$ + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + consoleURL: + description: The URL for the console. This will be derived from the host for the route that is created for the console. + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml new file mode 100644 index 00000000..e4fa56ee --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_dns.crd.yaml @@ -0,0 +1,72 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: dnses.config.openshift.io +spec: + group: config.openshift.io + names: + kind: DNS + listKind: DNSList + plural: dnses + singular: dns + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "DNS holds cluster-wide information about DNS. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + baseDomain: + description: "baseDomain is the base domain of the cluster. All managed DNS records will be sub-domains of this base. \n For example, given the base domain `openshift.example.com`, an API server DNS record may be created for `cluster-api.openshift.example.com`. \n Once set, this field cannot be changed." + type: string + privateZone: + description: "privateZone is the location where all the DNS records that are only available internally to the cluster exist. \n If this field is nil, no private records should be created. \n Once set, this field cannot be changed." + type: object + properties: + id: + description: "id is the identifier that can be used to find the DNS hosted zone. \n on AWS zone can be fetched using `ID` as id in [1] on Azure zone can be fetched using `ID` as a pre-determined name in [2], on GCP zone can be fetched using `ID` as a pre-determined name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" + type: string + tags: + description: "tags can be used to query the DNS hosted zone. \n on AWS, resourcegroupstaggingapi [1] can be used to fetch a zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" + type: object + additionalProperties: + type: string + publicZone: + description: "publicZone is the location where all the DNS records that are publicly accessible to the internet exist. \n If this field is nil, no public records should be created. \n Once set, this field cannot be changed." + type: object + properties: + id: + description: "id is the identifier that can be used to find the DNS hosted zone. \n on AWS zone can be fetched using `ID` as id in [1] on Azure zone can be fetched using `ID` as a pre-determined name in [2], on GCP zone can be fetched using `ID` as a pre-determined name in [3]. \n [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get" + type: string + tags: + description: "tags can be used to query the DNS hosted zone. \n on AWS, resourcegroupstaggingapi [1] can be used to fetch a zone using `Tags` as tag-filters, \n [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options" + type: object + additionalProperties: + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml new file mode 100644 index 00000000..77e01b8a --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_featuregate.crd.yaml @@ -0,0 +1,153 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: featuregates.config.openshift.io +spec: + group: config.openshift.io + names: + kind: FeatureGate + listKind: FeatureGateList + plural: featuregates + singular: featuregate + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Feature holds cluster-wide information about feature gates. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + customNoUpgrade: + description: customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations your cluster may fail in an unrecoverable way. featureSet must equal "CustomNoUpgrade" must be set to use this field. + type: object + properties: + disabled: + description: disabled is a list of all feature gates that you want to force off + type: array + items: + description: FeatureGateName is a string to enforce patterns on the name of a FeatureGate + type: string + pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$ + enabled: + description: enabled is a list of all feature gates that you want to force on + type: array + items: + description: FeatureGateName is a string to enforce patterns on the name of a FeatureGate + type: string + pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$ + nullable: true + featureSet: + description: featureSet changes the list of features in the cluster. The default is empty. Be very careful adjusting this setting. Turning on or off features may cause irreversible changes in your cluster which cannot be undone. + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + conditions: + description: 'conditions represent the observations of the current state. Known .status.conditions.type are: "DeterminationDegraded"' + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + featureGates: + description: featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. The enabled/disabled values for a particular version may change during the life of the cluster as various .spec.featureSet values are selected. Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable lists is beyond the scope of this API and is the responsibility of individual operators. Only featureGates with .version in the ClusterVersion.status will be present in this list. + type: array + items: + type: object + required: + - version + properties: + disabled: + description: disabled is a list of all feature gates that are disabled in the cluster for the named version. + type: array + items: + type: object + required: + - name + properties: + name: + description: name is the name of the FeatureGate. + type: string + pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$ + enabled: + description: enabled is a list of all feature gates that are enabled in the cluster for the named version. + type: array + items: + type: object + required: + - name + properties: + name: + description: name is the name of the FeatureGate. + type: string + pattern: ^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$ + version: + description: version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field. + type: string + x-kubernetes-list-map-keys: + - version + x-kubernetes-list-type: map + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml new file mode 100644 index 00000000..a160fef4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_image.crd.yaml @@ -0,0 +1,108 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: images.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Image + listKind: ImageList + plural: images + singular: image + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + additionalTrustedCA: + description: additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted during imagestream import, pod image pull, build image pull, and imageregistry pullthrough. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + allowedRegistriesForImport: + description: allowedRegistriesForImport limits the container image registries that normal users may import images from. Set this list to the registries that you trust to contain valid Docker images and that you want applications to be able to import from. Users with permission to create Images or ImageStreamMappings via the API are not affected by this policy - typically only administrators or system integrations will have those permissions. + type: array + items: + description: RegistryLocation contains a location of the registry specified by the registry domain name. The domain name might include wildcards, like '*' or '??'. + type: object + properties: + domainName: + description: domainName specifies a domain name for the registry In case the registry use non-standard (80 or 443) port, the port should be included in the domain name as well. + type: string + insecure: + description: insecure indicates whether the registry is secure (https) or insecure (http) By default (if not specified) the registry is assumed as secure. + type: boolean + externalRegistryHostnames: + description: externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in "hostname[:port]" format. + type: array + items: + type: string + registrySources: + description: registrySources contains configuration that determines how the container runtime should treat individual registries when accessing images for builds+pods. (e.g. whether or not to allow insecure access). It does not contain configuration for the internal cluster registry. + type: object + properties: + allowedRegistries: + description: "allowedRegistries are the only registries permitted for image pull and push actions. All other registries are denied. \n Only one of BlockedRegistries or AllowedRegistries may be set." + type: array + items: + type: string + blockedRegistries: + description: "blockedRegistries cannot be used for image pull and push actions. All other registries are permitted. \n Only one of BlockedRegistries or AllowedRegistries may be set." + type: array + items: + type: string + containerRuntimeSearchRegistries: + description: 'containerRuntimeSearchRegistries are registries that will be searched when pulling images that do not have fully qualified domains in their pull specs. Registries will be searched in the order provided in the list. Note: this search list only works with the container runtime, i.e CRI-O. Will NOT work with builds or imagestream imports.' + type: array + format: hostname + minItems: 1 + items: + type: string + x-kubernetes-list-type: set + insecureRegistries: + description: insecureRegistries are registries which do not have a valid TLS certificates or only support HTTP connections. + type: array + items: + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + externalRegistryHostnames: + description: externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in "hostname[:port]" format. + type: array + items: + type: string + internalRegistryHostname: + description: internalRegistryHostname sets the hostname for the default internal image registry. The value must be in "hostname[:port]" format. This value is set by the image registry operator which controls the internal registry hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but this setting overrides the environment variable. + type: string + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagecontentpolicy.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagecontentpolicy.crd.yaml new file mode 100644 index 00000000..147c73c4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagecontentpolicy.crd.yaml @@ -0,0 +1,68 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/874 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: imagecontentpolicies.config.openshift.io +spec: + group: config.openshift.io + names: + kind: ImageContentPolicy + listKind: ImageContentPolicyList + plural: imagecontentpolicies + singular: imagecontentpolicy + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. When multiple policies are defined, the outcome of the behavior is defined on each field. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + repositoryDigestMirrors: + description: "repositoryDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in RepositoryDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To pull image from mirrors by tags, should set the \"allowMirrorByTags\". \n Each “source” repository is treated independently; configurations for different “source” repositories don’t interact. \n If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. \n When multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified." + type: array + items: + description: RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. + type: object + required: + - source + properties: + allowMirrorByTags: + description: allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Forcing digest-pulls for mirrors avoids that issue. + type: boolean + mirrors: + description: mirrors is zero or more repositories that may also contain the same images. If the "mirrors" is not specified, the image will continue to be pulled from the specified repository in the pull spec. No mirror will be configured. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. Other cluster configuration, including (but not limited to) other repositoryDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. + type: array + items: + type: string + pattern: ^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$ + x-kubernetes-list-type: set + source: + description: source is the repository that users refer to, e.g. in image pull specifications. + type: string + pattern: ^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$ + x-kubernetes-list-map-keys: + - source + x-kubernetes-list-type: map + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml new file mode 100644 index 00000000..693a554e --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagedigestmirrorset.crd.yaml @@ -0,0 +1,74 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/1126 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: imagedigestmirrorsets.config.openshift.io +spec: + group: config.openshift.io + names: + kind: ImageDigestMirrorSet + listKind: ImageDigestMirrorSetList + plural: imagedigestmirrorsets + shortNames: + - idms + singular: imagedigestmirrorset + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + imageDigestMirrors: + description: "imageDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using tag specification, users should configure a list of mirrors using \"ImageTagMirrorSet\" CRD. \n If the image pull specification matches the repository of \"source\" in multiple imagedigestmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact. \n If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. \n When multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order." + type: array + items: + description: ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. + type: object + required: + - source + properties: + mirrorSourcePolicy: + description: mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + type: string + enum: + - NeverContactSource + - AllowContactingSource + mirrors: + description: 'mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user''s desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy" Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. "mirrors" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table' + type: array + items: + type: string + pattern: ^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$ + x-kubernetes-list-type: set + source: + description: 'source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. "source" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table' + type: string + pattern: ^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$ + x-kubernetes-list-type: atomic + status: + description: status contains the observed state of the resource. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml new file mode 100644 index 00000000..17a2d045 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_imagetagmirrorset.crd.yaml @@ -0,0 +1,74 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/1126 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: imagetagmirrorsets.config.openshift.io +spec: + group: config.openshift.io + names: + kind: ImageTagMirrorSet + listKind: ImageTagMirrorSetList + plural: imagetagmirrorsets + shortNames: + - itms + singular: imagetagmirrorset + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + imageTagMirrors: + description: "imageTagMirrors allows images referenced by image tags in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageTagMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using digest specification only, users should configure a list of mirrors using \"ImageDigestMirrorSet\" CRD. \n If the image pull specification matches the repository of \"source\" in multiple imagetagmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact. \n If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. \n When multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order." + type: array + items: + description: ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config. + type: object + required: + - source + properties: + mirrorSourcePolicy: + description: mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + type: string + enum: + - NeverContactSource + - AllowContactingSource + mirrors: + description: 'mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their tags. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Configuring a list of mirrors using "ImageDigestMirrorSet" CRD and forcing digest-pulls for mirrors avoids that issue. The order of mirrors in this list is treated as the user''s desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy". Other cluster configuration, including (but not limited to) other imageTagMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. "mirrors" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table' + type: array + items: + type: string + pattern: ^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$ + x-kubernetes-list-type: set + source: + description: 'source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. "source" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table' + type: string + pattern: ^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$ + x-kubernetes-list-type: atomic + status: + description: status contains the observed state of the resource. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml new file mode 100644 index 00000000..bb881711 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml @@ -0,0 +1,834 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + release.openshift.io/feature-set: Default + name: infrastructures.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Infrastructure + listKind: InfrastructureList + plural: infrastructures + singular: infrastructure + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + properties: + cloudConfig: + description: "cloudConfig is a reference to a ConfigMap containing the cloud provider configuration file. This configuration file is used to configure the Kubernetes cloud provider integration when using the built-in cloud provider integration or the external cloud controller manager. The namespace for this config map is openshift-config. \n cloudConfig should only be consumed by the kube_cloud_config controller. The controller is responsible for using the user configuration in the spec for various platforms and combining that with the user provided ConfigMap in this field to create a stitched kube cloud config. The controller generates a ConfigMap `kube-cloud-config` in `openshift-config-managed` namespace with the kube cloud config is stored in `cloud.conf` key. All the clients are expected to use the generated ConfigMap only." + properties: + key: + description: Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. + type: string + name: + type: string + type: object + platformSpec: + description: platformSpec holds desired information specific to the underlying infrastructure provider. + properties: + alibabaCloud: + description: AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + type: object + aws: + description: AWS contains settings specific to the Amazon Web Services infrastructure provider. + properties: + serviceEndpoints: + description: serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service. + items: + description: AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services. + properties: + name: + description: name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty. + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + pattern: ^https:// + type: string + type: object + type: array + type: object + azure: + description: Azure contains settings specific to the Azure infrastructure provider. + type: object + baremetal: + description: BareMetal contains settings specific to the BareMetal platform. + type: object + equinixMetal: + description: EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + type: object + external: + description: ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately. + properties: + platformName: + default: Unknown + description: PlatformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. This field is solely for informational and reporting purposes and is not expected to be used for decision-making. + type: string + x-kubernetes-validations: + - message: platform name cannot be changed once set + rule: oldSelf == 'Unknown' || self == oldSelf + type: object + gcp: + description: GCP contains settings specific to the Google Cloud Platform infrastructure provider. + type: object + ibmcloud: + description: IBMCloud contains settings specific to the IBMCloud infrastructure provider. + type: object + kubevirt: + description: Kubevirt contains settings specific to the kubevirt infrastructure provider. + type: object + nutanix: + description: Nutanix contains settings specific to the Nutanix infrastructure provider. + properties: + prismCentral: + description: prismCentral holds the endpoint address and port to access the Nutanix Prism Central. When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list. + properties: + address: + description: address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + maxLength: 256 + type: string + port: + description: port is the port number to access the Nutanix Prism Central or Element (cluster) + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - address + - port + type: object + prismElements: + description: prismElements holds one or more endpoint address and port data to access the Nutanix Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) spread over multiple Prism Elements (clusters) of the Prism Central. + items: + description: NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster) + properties: + endpoint: + description: endpoint holds the endpoint address and port data of the Prism Element (cluster). When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list. + properties: + address: + description: address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + maxLength: 256 + type: string + port: + description: port is the port number to access the Nutanix Prism Central or Element (cluster) + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - address + - port + type: object + name: + description: name is the name of the Prism Element (cluster). This value will correspond with the cluster field configured on other resources (eg Machines, PVCs, etc). + maxLength: 256 + type: string + required: + - endpoint + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + required: + - prismCentral + - prismElements + type: object + openstack: + description: OpenStack contains settings specific to the OpenStack infrastructure provider. + type: object + ovirt: + description: Ovirt contains settings specific to the oVirt infrastructure provider. + type: object + powervs: + description: PowerVS contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider. + properties: + serviceEndpoints: + description: serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service. + items: + description: PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services. + properties: + name: + description: name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + format: uri + pattern: ^https:// + type: string + required: + - name + - url + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + type: object + type: + description: type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform. + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + vsphere: + description: VSphere contains settings specific to the VSphere infrastructure provider. + properties: + failureDomains: + description: failureDomains contains the definition of region, zone and the vCenter topology. If this is omitted failure domains (regions and zones) will not be used. + items: + description: VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain. + properties: + name: + description: name defines the arbitrary but unique name of a failure domain. + maxLength: 256 + minLength: 1 + type: string + region: + description: region defines the name of a region tag that will be attached to a vCenter datacenter. The tag category in vCenter must be named openshift-region. + maxLength: 80 + minLength: 1 + type: string + server: + anyOf: + - format: ipv4 + - format: ipv6 + - format: hostname + description: server is the fully-qualified domain name or the IP address of the vCenter server. --- + maxLength: 255 + minLength: 1 + type: string + topology: + description: Topology describes a given failure domain using vSphere constructs + properties: + computeCluster: + description: computeCluster the absolute path of the vCenter cluster in which virtual machine will be located. The absolute path is of the form //host/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/host/.*? + type: string + datacenter: + description: datacenter is the name of vCenter datacenter in which virtual machines will be located. The maximum length of the datacenter name is 80 characters. + maxLength: 80 + type: string + datastore: + description: datastore is the absolute path of the datastore in which the virtual machine is located. The absolute path is of the form //datastore/ The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/datastore/.*? + type: string + folder: + description: folder is the absolute path of the folder where virtual machines are located. The absolute path is of the form //vm/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/vm/.*? + type: string + networks: + description: networks is the list of port group network names within this failure domain. Currently, we only support a single interface per RHCOS virtual machine. The available networks (port groups) can be listed using `govc ls 'network/*'` The single interface should be the absolute path of the form //network/. + items: + type: string + maxItems: 1 + minItems: 1 + type: array + resourcePool: + description: resourcePool is the absolute path of the resource pool where virtual machines will be created. The absolute path is of the form //host//Resources/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/host/.*?/Resources.* + type: string + required: + - computeCluster + - datacenter + - datastore + - networks + type: object + zone: + description: zone defines the name of a zone tag that will be attached to a vCenter cluster. The tag category in vCenter must be named openshift-zone. + maxLength: 80 + minLength: 1 + type: string + required: + - name + - region + - server + - topology + - zone + type: object + type: array + nodeNetworking: + description: nodeNetworking contains the definition of internal and external network constraints for assigning the node's networking. If this field is omitted, networking defaults to the legacy address selection behavior which is to only support a single address and return the first one found. + properties: + external: + description: external represents the network configuration of the node that is externally routable. + properties: + excludeNetworkSubnetCidr: + description: excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields. --- + items: + format: cidr + type: string + type: array + network: + description: network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'` + type: string + networkSubnetCidr: + description: networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields. --- + items: + format: cidr + type: string + type: array + type: object + internal: + description: internal represents the network configuration of the node that is routable only within the cluster. + properties: + excludeNetworkSubnetCidr: + description: excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields. --- + items: + format: cidr + type: string + type: array + network: + description: network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'` + type: string + networkSubnetCidr: + description: networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields. --- + items: + format: cidr + type: string + type: array + type: object + type: object + vcenters: + description: vcenters holds the connection details for services to communicate with vCenter. Currently, only a single vCenter is supported. --- + items: + description: VSpherePlatformVCenterSpec stores the vCenter connection fields. This is used by the vSphere CCM. + properties: + datacenters: + description: The vCenter Datacenters in which the RHCOS vm guests are located. This field will be used by the Cloud Controller Manager. Each datacenter listed here should be used within a topology. + items: + type: string + minItems: 1 + type: array + port: + description: port is the TCP port that will be used to communicate to the vCenter endpoint. When omitted, this means the user has no opinion and it is up to the platform to choose a sensible default, which is subject to change over time. + format: int32 + maximum: 32767 + minimum: 1 + type: integer + server: + anyOf: + - format: ipv4 + - format: ipv6 + - format: hostname + description: server is the fully-qualified domain name or the IP address of the vCenter server. --- + maxLength: 255 + type: string + required: + - datacenters + - server + type: object + maxItems: 1 + minItems: 0 + type: array + type: object + type: object + type: object + status: + description: status holds observed values from the cluster. They may not be overridden. + properties: + apiServerInternalURI: + description: apiServerInternalURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components like kubelets, to contact the Kubernetes API server using the infrastructure provider rather than Kubernetes networking. + type: string + apiServerURL: + description: apiServerURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerURL can be used by components like the web console to tell users where to find the Kubernetes API. + type: string + controlPlaneTopology: + default: HighlyAvailable + description: controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation The 'External' mode indicates that the control plane is hosted externally to the cluster and that its components are not visible within the cluster. + enum: + - HighlyAvailable + - SingleReplica + - External + type: string + etcdDiscoveryDomain: + description: 'etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering etcd servers and clients. For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release.' + type: string + infrastructureName: + description: infrastructureName uniquely identifies a cluster with a human friendly name. Once set it should not be changed. Must be of max length 27 and must have only alphanumeric or hyphen characters. + type: string + infrastructureTopology: + default: HighlyAvailable + description: 'infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is ''HighlyAvailable'', which represents the behavior operators have in a "normal" cluster. The ''SingleReplica'' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation NOTE: External topology mode is not applicable for this field.' + enum: + - HighlyAvailable + - SingleReplica + type: string + platform: + description: "platform is the underlying infrastructure provider for the cluster. \n Deprecated: Use platformStatus.type instead." + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + platformStatus: + description: platformStatus holds status information specific to the underlying infrastructure provider. + properties: + alibabaCloud: + description: AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + properties: + region: + description: region specifies the region for Alibaba Cloud resources created for the cluster. + pattern: ^[0-9A-Za-z-]+$ + type: string + resourceGroupID: + description: resourceGroupID is the ID of the resource group for the cluster. + pattern: ^(rg-[0-9A-Za-z]+)?$ + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster. + items: + description: AlibabaCloudResourceTag is the set of tags to add to apply to resources. + properties: + key: + description: key is the key of the tag. + maxLength: 128 + minLength: 1 + type: string + value: + description: value is the value of the tag. + maxLength: 128 + minLength: 1 + type: string + required: + - key + - value + type: object + maxItems: 20 + type: array + x-kubernetes-list-map-keys: + - key + x-kubernetes-list-type: map + required: + - region + type: object + aws: + description: AWS contains settings specific to the Amazon Web Services infrastructure provider. + properties: + region: + description: region holds the default AWS region for new AWS resources created by the cluster. + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user. + items: + description: AWSResourceTag is a tag to apply to AWS resources created for the cluster. + properties: + key: + description: key is the key of the tag + maxLength: 128 + minLength: 1 + pattern: ^[0-9A-Za-z_.:/=+-@]+$ + type: string + value: + description: value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services. + maxLength: 256 + minLength: 1 + pattern: ^[0-9A-Za-z_.:/=+-@]+$ + type: string + required: + - key + - value + type: object + maxItems: 25 + type: array + serviceEndpoints: + description: ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service. + items: + description: AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services. + properties: + name: + description: name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty. + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + pattern: ^https:// + type: string + type: object + type: array + type: object + azure: + description: Azure contains settings specific to the Azure infrastructure provider. + properties: + armEndpoint: + description: armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack. + type: string + cloudName: + description: cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK with the appropriate Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`. + enum: + - "" + - AzurePublicCloud + - AzureUSGovernmentCloud + - AzureChinaCloud + - AzureGermanCloud + - AzureStackCloud + type: string + networkResourceGroupName: + description: networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. If empty, the value is same as ResourceGroupName. + type: string + resourceGroupName: + description: resourceGroupName is the Resource Group for new Azure resources created for the cluster. + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to Azure resources created for the cluster. See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration. + items: + description: AzureResourceTag is a tag to apply to Azure resources created for the cluster. + properties: + key: + description: key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric characters and the following special characters `_ . -`. + maxLength: 128 + minLength: 1 + pattern: ^[a-zA-Z]([0-9A-Za-z_.-]*[0-9A-Za-z_])?$ + type: string + value: + description: 'value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`.' + maxLength: 256 + minLength: 1 + pattern: ^[0-9A-Za-z_.=+-@]+$ + type: string + required: + - key + - value + type: object + maxItems: 10 + type: array + x-kubernetes-validations: + - message: resourceTags are immutable and may only be configured during installation + rule: self.all(x, x in oldSelf) && oldSelf.all(x, x in self) + type: object + x-kubernetes-validations: + - message: resourceTags may only be configured during installation + rule: '!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)' + baremetal: + description: BareMetal contains settings specific to the BareMetal platform. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + equinixMetal: + description: EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + properties: + apiServerInternalIP: + description: apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. + type: string + ingressIP: + description: ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + type: string + type: object + external: + description: External contains settings specific to the generic External infrastructure provider. + type: object + gcp: + description: GCP contains settings specific to the Google Cloud Platform infrastructure provider. + properties: + projectID: + description: resourceGroupName is the Project ID for new GCP resources created for the cluster. + type: string + region: + description: region holds the region for new GCP resources created for the cluster. + type: string + type: object + ibmcloud: + description: IBMCloud contains settings specific to the IBMCloud infrastructure provider. + properties: + cisInstanceCRN: + description: CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain + type: string + dnsInstanceCRN: + description: DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain + type: string + location: + description: Location is where the cluster has been deployed + type: string + providerType: + description: ProviderType indicates the type of cluster that was created + type: string + resourceGroupName: + description: ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. + type: string + type: object + kubevirt: + description: Kubevirt contains settings specific to the kubevirt infrastructure provider. + properties: + apiServerInternalIP: + description: apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. + type: string + ingressIP: + description: ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + type: string + type: object + nutanix: + description: Nutanix contains settings specific to the Nutanix infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + type: object + openstack: + description: OpenStack contains settings specific to the OpenStack infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + cloudName: + description: cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`). + type: string + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on OpenStack platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + ovirt: + description: Ovirt contains settings specific to the oVirt infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + nodeDNSIP: + description: 'deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.' + type: string + type: object + powervs: + description: PowerVS contains settings specific to the Power Systems Virtual Servers infrastructure provider. + properties: + cisInstanceCRN: + description: CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain + type: string + dnsInstanceCRN: + description: DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain + type: string + region: + description: region holds the default Power VS region for new Power VS resources created by the cluster. + type: string + resourceGroup: + description: 'resourceGroup is the resource group name for new IBMCloud resources created for a cluster. The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. When omitted, the image registry operator won''t be able to configure storage, which results in the image registry cluster operator not being in an available state.' + maxLength: 40 + pattern: ^[a-zA-Z0-9-_ ]+$ + type: string + x-kubernetes-validations: + - message: resourceGroup is immutable once set + rule: oldSelf == '' || self == oldSelf + serviceEndpoints: + description: serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service. + items: + description: PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services. + properties: + name: + description: name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + format: uri + pattern: ^https:// + type: string + required: + - name + - url + type: object + type: array + zone: + description: 'zone holds the default zone for the new Power VS resources created by the cluster. Note: Currently only single-zone OCP clusters are supported' + type: string + type: object + x-kubernetes-validations: + - message: cannot unset resourceGroup once set + rule: '!has(oldSelf.resourceGroup) || has(self.resourceGroup)' + type: + description: "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform. \n This value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set." + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + vsphere: + description: VSphere contains settings specific to the VSphere infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + type: object + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch new file mode 100644 index 00000000..d127130a --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-Default.crd.yaml-patch @@ -0,0 +1,24 @@ +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/vcenters/items/properties/server/anyOf + value: + - format: ipv4 + - format: ipv6 + - format: hostname +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/failureDomains/items/properties/server/anyOf + value: + - format: ipv4 + - format: ipv6 + - format: hostname +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/external/properties/excludeNetworkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/external/properties/networkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/internal/properties/excludeNetworkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/internal/properties/networkSubnetCidr/items/format + value: cidr diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml new file mode 100644 index 00000000..495e4a55 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml @@ -0,0 +1,905 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + release.openshift.io/feature-set: TechPreviewNoUpgrade + name: infrastructures.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Infrastructure + listKind: InfrastructureList + plural: infrastructures + singular: infrastructure + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + properties: + cloudConfig: + description: "cloudConfig is a reference to a ConfigMap containing the cloud provider configuration file. This configuration file is used to configure the Kubernetes cloud provider integration when using the built-in cloud provider integration or the external cloud controller manager. The namespace for this config map is openshift-config. \n cloudConfig should only be consumed by the kube_cloud_config controller. The controller is responsible for using the user configuration in the spec for various platforms and combining that with the user provided ConfigMap in this field to create a stitched kube cloud config. The controller generates a ConfigMap `kube-cloud-config` in `openshift-config-managed` namespace with the kube cloud config is stored in `cloud.conf` key. All the clients are expected to use the generated ConfigMap only." + properties: + key: + description: Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. + type: string + name: + type: string + type: object + platformSpec: + description: platformSpec holds desired information specific to the underlying infrastructure provider. + properties: + alibabaCloud: + description: AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + type: object + aws: + description: AWS contains settings specific to the Amazon Web Services infrastructure provider. + properties: + serviceEndpoints: + description: serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service. + items: + description: AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services. + properties: + name: + description: name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty. + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + pattern: ^https:// + type: string + type: object + type: array + type: object + azure: + description: Azure contains settings specific to the Azure infrastructure provider. + type: object + baremetal: + description: BareMetal contains settings specific to the BareMetal platform. + type: object + equinixMetal: + description: EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + type: object + external: + description: ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately. + properties: + platformName: + default: Unknown + description: PlatformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. This field is solely for informational and reporting purposes and is not expected to be used for decision-making. + type: string + x-kubernetes-validations: + - message: platform name cannot be changed once set + rule: oldSelf == 'Unknown' || self == oldSelf + type: object + gcp: + description: GCP contains settings specific to the Google Cloud Platform infrastructure provider. + type: object + ibmcloud: + description: IBMCloud contains settings specific to the IBMCloud infrastructure provider. + type: object + kubevirt: + description: Kubevirt contains settings specific to the kubevirt infrastructure provider. + type: object + nutanix: + description: Nutanix contains settings specific to the Nutanix infrastructure provider. + properties: + prismCentral: + description: prismCentral holds the endpoint address and port to access the Nutanix Prism Central. When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list. + properties: + address: + description: address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + maxLength: 256 + type: string + port: + description: port is the port number to access the Nutanix Prism Central or Element (cluster) + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - address + - port + type: object + prismElements: + description: prismElements holds one or more endpoint address and port data to access the Nutanix Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) spread over multiple Prism Elements (clusters) of the Prism Central. + items: + description: NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster) + properties: + endpoint: + description: endpoint holds the endpoint address and port data of the Prism Element (cluster). When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list. + properties: + address: + description: address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + maxLength: 256 + type: string + port: + description: port is the port number to access the Nutanix Prism Central or Element (cluster) + format: int32 + maximum: 65535 + minimum: 1 + type: integer + required: + - address + - port + type: object + name: + description: name is the name of the Prism Element (cluster). This value will correspond with the cluster field configured on other resources (eg Machines, PVCs, etc). + maxLength: 256 + type: string + required: + - endpoint + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + required: + - prismCentral + - prismElements + type: object + openstack: + description: OpenStack contains settings specific to the OpenStack infrastructure provider. + type: object + ovirt: + description: Ovirt contains settings specific to the oVirt infrastructure provider. + type: object + powervs: + description: PowerVS contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider. + properties: + serviceEndpoints: + description: serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service. + items: + description: PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services. + properties: + name: + description: name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + format: uri + pattern: ^https:// + type: string + required: + - name + - url + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + type: object + type: + description: type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform. + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + vsphere: + description: VSphere contains settings specific to the VSphere infrastructure provider. + properties: + failureDomains: + description: failureDomains contains the definition of region, zone and the vCenter topology. If this is omitted failure domains (regions and zones) will not be used. + items: + description: VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain. + properties: + name: + description: name defines the arbitrary but unique name of a failure domain. + maxLength: 256 + minLength: 1 + type: string + region: + description: region defines the name of a region tag that will be attached to a vCenter datacenter. The tag category in vCenter must be named openshift-region. + maxLength: 80 + minLength: 1 + type: string + server: + anyOf: + - format: ipv4 + - format: ipv6 + - format: hostname + description: server is the fully-qualified domain name or the IP address of the vCenter server. --- + maxLength: 255 + minLength: 1 + type: string + topology: + description: Topology describes a given failure domain using vSphere constructs + properties: + computeCluster: + description: computeCluster the absolute path of the vCenter cluster in which virtual machine will be located. The absolute path is of the form //host/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/host/.*? + type: string + datacenter: + description: datacenter is the name of vCenter datacenter in which virtual machines will be located. The maximum length of the datacenter name is 80 characters. + maxLength: 80 + type: string + datastore: + description: datastore is the absolute path of the datastore in which the virtual machine is located. The absolute path is of the form //datastore/ The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/datastore/.*? + type: string + folder: + description: folder is the absolute path of the folder where virtual machines are located. The absolute path is of the form //vm/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/vm/.*? + type: string + networks: + description: networks is the list of port group network names within this failure domain. Currently, we only support a single interface per RHCOS virtual machine. The available networks (port groups) can be listed using `govc ls 'network/*'` The single interface should be the absolute path of the form //network/. + items: + type: string + maxItems: 1 + minItems: 1 + type: array + resourcePool: + description: resourcePool is the absolute path of the resource pool where virtual machines will be created. The absolute path is of the form //host//Resources/. The maximum length of the path is 2048 characters. + maxLength: 2048 + pattern: ^/.*?/host/.*?/Resources.* + type: string + required: + - computeCluster + - datacenter + - datastore + - networks + type: object + zone: + description: zone defines the name of a zone tag that will be attached to a vCenter cluster. The tag category in vCenter must be named openshift-zone. + maxLength: 80 + minLength: 1 + type: string + required: + - name + - region + - server + - topology + - zone + type: object + type: array + nodeNetworking: + description: nodeNetworking contains the definition of internal and external network constraints for assigning the node's networking. If this field is omitted, networking defaults to the legacy address selection behavior which is to only support a single address and return the first one found. + properties: + external: + description: external represents the network configuration of the node that is externally routable. + properties: + excludeNetworkSubnetCidr: + description: excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields. --- + items: + format: cidr + type: string + type: array + network: + description: network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'` + type: string + networkSubnetCidr: + description: networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields. --- + items: + format: cidr + type: string + type: array + type: object + internal: + description: internal represents the network configuration of the node that is routable only within the cluster. + properties: + excludeNetworkSubnetCidr: + description: excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields. --- + items: + format: cidr + type: string + type: array + network: + description: network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'` + type: string + networkSubnetCidr: + description: networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields. --- + items: + format: cidr + type: string + type: array + type: object + type: object + vcenters: + description: vcenters holds the connection details for services to communicate with vCenter. Currently, only a single vCenter is supported. --- + items: + description: VSpherePlatformVCenterSpec stores the vCenter connection fields. This is used by the vSphere CCM. + properties: + datacenters: + description: The vCenter Datacenters in which the RHCOS vm guests are located. This field will be used by the Cloud Controller Manager. Each datacenter listed here should be used within a topology. + items: + type: string + minItems: 1 + type: array + port: + description: port is the TCP port that will be used to communicate to the vCenter endpoint. When omitted, this means the user has no opinion and it is up to the platform to choose a sensible default, which is subject to change over time. + format: int32 + maximum: 32767 + minimum: 1 + type: integer + server: + anyOf: + - format: ipv4 + - format: ipv6 + - format: hostname + description: server is the fully-qualified domain name or the IP address of the vCenter server. --- + maxLength: 255 + type: string + required: + - datacenters + - server + type: object + maxItems: 1 + minItems: 0 + type: array + type: object + type: object + type: object + status: + description: status holds observed values from the cluster. They may not be overridden. + properties: + apiServerInternalURI: + description: apiServerInternalURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components like kubelets, to contact the Kubernetes API server using the infrastructure provider rather than Kubernetes networking. + type: string + apiServerURL: + description: apiServerURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerURL can be used by components like the web console to tell users where to find the Kubernetes API. + type: string + controlPlaneTopology: + default: HighlyAvailable + description: controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation The 'External' mode indicates that the control plane is hosted externally to the cluster and that its components are not visible within the cluster. + enum: + - HighlyAvailable + - SingleReplica + - External + type: string + cpuPartitioning: + default: None + description: cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. Valid values are "None" and "AllNodes". When omitted, the default value is "None". The default value of "None" indicates that no nodes will be setup with CPU partitioning. The "AllNodes" value indicates that all nodes have been setup with CPU partitioning, and can then be further configured via the PerformanceProfile API. + enum: + - None + - AllNodes + type: string + etcdDiscoveryDomain: + description: 'etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering etcd servers and clients. For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release.' + type: string + infrastructureName: + description: infrastructureName uniquely identifies a cluster with a human friendly name. Once set it should not be changed. Must be of max length 27 and must have only alphanumeric or hyphen characters. + type: string + infrastructureTopology: + default: HighlyAvailable + description: 'infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is ''HighlyAvailable'', which represents the behavior operators have in a "normal" cluster. The ''SingleReplica'' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation NOTE: External topology mode is not applicable for this field.' + enum: + - HighlyAvailable + - SingleReplica + type: string + platform: + description: "platform is the underlying infrastructure provider for the cluster. \n Deprecated: Use platformStatus.type instead." + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + platformStatus: + description: platformStatus holds status information specific to the underlying infrastructure provider. + properties: + alibabaCloud: + description: AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + properties: + region: + description: region specifies the region for Alibaba Cloud resources created for the cluster. + pattern: ^[0-9A-Za-z-]+$ + type: string + resourceGroupID: + description: resourceGroupID is the ID of the resource group for the cluster. + pattern: ^(rg-[0-9A-Za-z]+)?$ + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster. + items: + description: AlibabaCloudResourceTag is the set of tags to add to apply to resources. + properties: + key: + description: key is the key of the tag. + maxLength: 128 + minLength: 1 + type: string + value: + description: value is the value of the tag. + maxLength: 128 + minLength: 1 + type: string + required: + - key + - value + type: object + maxItems: 20 + type: array + x-kubernetes-list-map-keys: + - key + x-kubernetes-list-type: map + required: + - region + type: object + aws: + description: AWS contains settings specific to the Amazon Web Services infrastructure provider. + properties: + region: + description: region holds the default AWS region for new AWS resources created by the cluster. + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user. + items: + description: AWSResourceTag is a tag to apply to AWS resources created for the cluster. + properties: + key: + description: key is the key of the tag + maxLength: 128 + minLength: 1 + pattern: ^[0-9A-Za-z_.:/=+-@]+$ + type: string + value: + description: value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services. + maxLength: 256 + minLength: 1 + pattern: ^[0-9A-Za-z_.:/=+-@]+$ + type: string + required: + - key + - value + type: object + maxItems: 25 + type: array + serviceEndpoints: + description: ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service. + items: + description: AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services. + properties: + name: + description: name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty. + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + pattern: ^https:// + type: string + type: object + type: array + type: object + azure: + description: Azure contains settings specific to the Azure infrastructure provider. + properties: + armEndpoint: + description: armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack. + type: string + cloudName: + description: cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK with the appropriate Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`. + enum: + - "" + - AzurePublicCloud + - AzureUSGovernmentCloud + - AzureChinaCloud + - AzureGermanCloud + - AzureStackCloud + type: string + networkResourceGroupName: + description: networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. If empty, the value is same as ResourceGroupName. + type: string + resourceGroupName: + description: resourceGroupName is the Resource Group for new Azure resources created for the cluster. + type: string + resourceTags: + description: resourceTags is a list of additional tags to apply to Azure resources created for the cluster. See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration. + items: + description: AzureResourceTag is a tag to apply to Azure resources created for the cluster. + properties: + key: + description: key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric characters and the following special characters `_ . -`. + maxLength: 128 + minLength: 1 + pattern: ^[a-zA-Z]([0-9A-Za-z_.-]*[0-9A-Za-z_])?$ + type: string + value: + description: 'value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`.' + maxLength: 256 + minLength: 1 + pattern: ^[0-9A-Za-z_.=+-@]+$ + type: string + required: + - key + - value + type: object + maxItems: 10 + type: array + x-kubernetes-validations: + - message: resourceTags are immutable and may only be configured during installation + rule: self.all(x, x in oldSelf) && oldSelf.all(x, x in self) + type: object + x-kubernetes-validations: + - message: resourceTags may only be configured during installation + rule: '!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)' + baremetal: + description: BareMetal contains settings specific to the BareMetal platform. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on BareMetal platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + equinixMetal: + description: EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + properties: + apiServerInternalIP: + description: apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. + type: string + ingressIP: + description: ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + type: string + type: object + external: + description: External contains settings specific to the generic External infrastructure provider. + type: object + gcp: + description: GCP contains settings specific to the Google Cloud Platform infrastructure provider. + properties: + projectID: + description: resourceGroupName is the Project ID for new GCP resources created for the cluster. + type: string + region: + description: region holds the region for new GCP resources created for the cluster. + type: string + type: object + ibmcloud: + description: IBMCloud contains settings specific to the IBMCloud infrastructure provider. + properties: + cisInstanceCRN: + description: CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain + type: string + dnsInstanceCRN: + description: DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain + type: string + location: + description: Location is where the cluster has been deployed + type: string + providerType: + description: ProviderType indicates the type of cluster that was created + type: string + resourceGroupName: + description: ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. + type: string + type: object + kubevirt: + description: Kubevirt contains settings specific to the kubevirt infrastructure provider. + properties: + apiServerInternalIP: + description: apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. + type: string + ingressIP: + description: ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + type: string + type: object + nutanix: + description: Nutanix contains settings specific to the Nutanix infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on Nutanix platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + type: object + openstack: + description: OpenStack contains settings specific to the OpenStack infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + cloudName: + description: cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`). + type: string + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on OpenStack platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + ovirt: + description: Ovirt contains settings specific to the oVirt infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on Ovirt platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + nodeDNSIP: + description: 'deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.' + type: string + type: object + powervs: + description: PowerVS contains settings specific to the Power Systems Virtual Servers infrastructure provider. + properties: + cisInstanceCRN: + description: CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain + type: string + dnsInstanceCRN: + description: DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain + type: string + region: + description: region holds the default Power VS region for new Power VS resources created by the cluster. + type: string + resourceGroup: + description: 'resourceGroup is the resource group name for new IBMCloud resources created for a cluster. The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. When omitted, the image registry operator won''t be able to configure storage, which results in the image registry cluster operator not being in an available state.' + maxLength: 40 + pattern: ^[a-zA-Z0-9-_ ]+$ + type: string + x-kubernetes-validations: + - message: resourceGroup is immutable once set + rule: oldSelf == '' || self == oldSelf + serviceEndpoints: + description: serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service. + items: + description: PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services. + properties: + name: + description: name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + pattern: ^[a-z0-9-]+$ + type: string + url: + description: url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty. + format: uri + pattern: ^https:// + type: string + required: + - name + - url + type: object + type: array + zone: + description: 'zone holds the default zone for the new Power VS resources created by the cluster. Note: Currently only single-zone OCP clusters are supported' + type: string + type: object + x-kubernetes-validations: + - message: cannot unset resourceGroup once set + rule: '!has(oldSelf.resourceGroup) || has(self.resourceGroup)' + type: + description: "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform. \n This value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set." + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + type: string + vsphere: + description: VSphere contains settings specific to the VSphere infrastructure provider. + properties: + apiServerInternalIP: + description: "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers. \n Deprecated: Use APIServerInternalIPs instead." + type: string + apiServerInternalIPs: + description: apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + ingressIP: + description: "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names. \n Deprecated: Use IngressIPs instead." + type: string + ingressIPs: + description: ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one. + format: ip + items: + type: string + maxItems: 2 + type: array + loadBalancer: + default: + type: OpenShiftManagedDefault + description: loadBalancer defines how the load balancer used by the cluster is configured. + properties: + type: + default: OpenShiftManagedDefault + description: type defines the type of load balancer used by the cluster on VSphere platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault. + enum: + - OpenShiftManagedDefault + - UserManaged + type: string + x-kubernetes-validations: + - message: type is immutable once set + rule: oldSelf == '' || self == oldSelf + type: object + nodeDNSIP: + description: nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster. + type: string + type: object + type: object + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml-patch b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml-patch new file mode 100644 index 00000000..d127130a --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml-patch @@ -0,0 +1,24 @@ +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/vcenters/items/properties/server/anyOf + value: + - format: ipv4 + - format: ipv6 + - format: hostname +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/failureDomains/items/properties/server/anyOf + value: + - format: ipv4 + - format: ipv6 + - format: hostname +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/external/properties/excludeNetworkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/external/properties/networkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/internal/properties/excludeNetworkSubnetCidr/items/format + value: cidr +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/platformSpec/properties/vsphere/properties/nodeNetworking/properties/internal/properties/networkSubnetCidr/items/format + value: cidr diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml new file mode 100644 index 00000000..0d7dec19 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_ingress.crd.yaml @@ -0,0 +1,334 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: ingresses.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Ingress + listKind: IngressList + plural: ingresses + singular: ingress + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + appsDomain: + description: appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate. + type: string + componentRoutes: + description: "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list. \n To determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes." + type: array + items: + description: ComponentRouteSpec allows for configuration of a route's hostname and serving certificate. + type: object + required: + - hostname + - name + - namespace + properties: + hostname: + description: hostname is the hostname that should be used by the route. + type: string + pattern: ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ + name: + description: "name is the logical name of the route to customize. \n The namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized." + type: string + maxLength: 256 + minLength: 1 + namespace: + description: "namespace is the namespace of the route to customize. \n The namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized." + type: string + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + servingCertKeyPairSecret: + description: servingCertKeyPairSecret is a reference to a secret of type `kubernetes.io/tls` in the openshift-config namespace. The serving cert/key pair must match and will be used by the operator to fulfill the intent of serving with this name. If the custom hostname uses the default routing suffix of the cluster, the Secret specification for a serving certificate will not be needed. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + x-kubernetes-list-map-keys: + - namespace + - name + x-kubernetes-list-type: map + domain: + description: "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\". \n It is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\". \n Once set, changing domain is not currently supported." + type: string + loadBalancer: + description: loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure provider of the current cluster and are required for Ingress Controller to work on OpenShift. + type: object + properties: + platform: + description: platform holds configuration specific to the underlying infrastructure provider for the ingress load balancers. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time. + type: object + properties: + aws: + description: aws contains settings specific to the Amazon Web Services infrastructure provider. + type: object + required: + - type + properties: + type: + description: "type allows user to set a load balancer type. When this field is set the default ingresscontroller will get created using the specified LBType. If this field is not set then the default ingress controller of LBType Classic will be created. Valid values are: \n * \"Classic\": A Classic Load Balancer that makes routing decisions at either the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See the following for additional details: \n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb \n * \"NLB\": A Network Load Balancer that makes routing decisions at the transport layer (TCP/SSL). See the following for additional details: \n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb" + type: string + enum: + - NLB + - Classic + type: + description: type is the underlying infrastructure provider for the cluster. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform. + type: string + enum: + - "" + - AWS + - Azure + - BareMetal + - GCP + - Libvirt + - OpenStack + - None + - VSphere + - oVirt + - IBMCloud + - KubeVirt + - EquinixMetal + - PowerVS + - AlibabaCloud + - Nutanix + - External + requiredHSTSPolicies: + description: "requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes matching the domainPattern/s and namespaceSelector/s that are specified in the policy. Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route annotation, and affect route admission. \n A candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: \"haproxy.router.openshift.io/hsts_header\" E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains \n - For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route is rejected. - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies determines the route's admission status. - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, then it may use any HSTS Policy annotation. \n The HSTS policy configuration may be changed after routes have already been created. An update to a previously admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working. \n Note that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid." + type: array + items: + type: object + required: + - domainPatterns + properties: + domainPatterns: + description: "domainPatterns is a list of domains for which the desired HSTS annotations are required. If domainPatterns is specified and a route is created with a spec.host matching one of the domains, the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy. \n The use of wildcards is allowed like this: *.foo.com matches everything under foo.com. foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*." + type: array + minItems: 1 + items: + type: string + includeSubDomainsPolicy: + description: 'includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host''s domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com' + type: string + enum: + - RequireIncludeSubDomains + - RequireNoIncludeSubDomains + - NoOpinion + maxAge: + description: maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. If set to 0, it negates the effect, and hosts are removed as HSTS hosts. If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS policy will eventually expire on that client. + type: object + properties: + largestMaxAge: + description: The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age This value can be left unspecified, in which case no upper limit is enforced. + type: integer + format: int32 + maximum: 2147483647 + minimum: 0 + smallestMaxAge: + description: The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary tool for administrators to quickly correct mistakes. This value can be left unspecified, in which case no lower limit is enforced. + type: integer + format: int32 + maximum: 2147483647 + minimum: 0 + namespaceSelector: + description: namespaceSelector specifies a label selector such that the policy applies only to those routes that are in namespaces with labels that match the selector, and are in one of the DomainPatterns. Defaults to the empty LabelSelector, which matches everything. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + x-kubernetes-map-type: atomic + preloadPolicy: + description: preloadPolicy directs the client to include hosts in its host preload list so that it never needs to do an initial load to get the HSTS header (note that this is not defined in RFC 6797 and is therefore client implementation-dependent). + type: string + enum: + - RequirePreload + - RequireNoPreload + - NoOpinion + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + componentRoutes: + description: componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin. + type: array + items: + description: ComponentRouteStatus contains information allowing configuration of a route's hostname and serving certificate. + type: object + required: + - defaultHostname + - name + - namespace + - relatedObjects + properties: + conditions: + description: "conditions are used to communicate the state of the componentRoutes entry. \n Supported conditions include Available, Degraded and Progressing. \n If available is true, the content served by the route can be accessed by users. This includes cases where a default may continue to serve content while the customized route specified by the cluster-admin is being configured. \n If Degraded is true, that means something has gone wrong trying to handle the componentRoutes entry. The currentHostnames field may or may not be in effect. \n If Progressing is true, that means the component is taking some action related to the componentRoutes entry." + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + consumingUsers: + description: consumingUsers is a slice of ServiceAccounts that need to have read permission on the servingCertKeyPairSecret secret. + type: array + maxItems: 5 + items: + description: ConsumingUser is an alias for string which we add validation to. Currently only service accounts are supported. + type: string + maxLength: 512 + minLength: 1 + pattern: ^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + currentHostnames: + description: currentHostnames is the list of current names used by the route. Typically, this list should consist of a single hostname, but if multiple hostnames are supported by the route the operator may write multiple entries to this list. + type: array + minItems: 1 + items: + description: "Hostname is an alias for hostname string validation. \n The left operand of the | is the original kubebuilder hostname validation format, which is incorrect because it allows upper case letters, disallows hyphen or number in the TLD, and allows labels to start/end in non-alphanumeric characters. See https://bugzilla.redhat.com/show_bug.cgi?id=2039256. ^([a-zA-Z0-9\\p{S}\\p{L}]((-?[a-zA-Z0-9\\p{S}\\p{L}]{0,62})?)|([a-zA-Z0-9\\p{S}\\p{L}](([a-zA-Z0-9-\\p{S}\\p{L}]{0,61}[a-zA-Z0-9\\p{S}\\p{L}])?)(\\.)){1,}([a-zA-Z\\p{L}]){2,63})$ \n The right operand of the | is a new pattern that mimics the current API route admission validation on hostname, except that it allows hostnames longer than the maximum length: ^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ \n Both operand patterns are made available so that modifications on ingress spec can still happen after an invalid hostname was saved via validation by the incorrect left operand of the | operator." + type: string + pattern: ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ + defaultHostname: + description: defaultHostname is the hostname of this route prior to customization. + type: string + pattern: ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ + name: + description: "name is the logical name of the route to customize. It does not have to be the actual name of a route resource but it cannot be renamed. \n The namespace and name of this componentRoute must match a corresponding entry in the list of spec.componentRoutes if the route is to be customized." + type: string + maxLength: 256 + minLength: 1 + namespace: + description: "namespace is the namespace of the route to customize. It must be a real namespace. Using an actual namespace ensures that no two components will conflict and the same component can be installed multiple times. \n The namespace and name of this componentRoute must match a corresponding entry in the list of spec.componentRoutes if the route is to be customized." + type: string + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + relatedObjects: + description: relatedObjects is a list of resources which are useful when debugging or inspecting how spec.componentRoutes is applied. + type: array + minItems: 1 + items: + description: ObjectReference contains enough information to let you inspect or modify the referred object. + type: object + required: + - group + - name + - resource + properties: + group: + description: group of the referent. + type: string + name: + description: name of the referent. + type: string + namespace: + description: namespace of the referent. + type: string + resource: + description: resource of the referent. + type: string + x-kubernetes-list-map-keys: + - namespace + - name + x-kubernetes-list-type: map + defaultPlacement: + description: "defaultPlacement is set at installation time to control which nodes will host the ingress router pods by default. The options are control-plane nodes or worker nodes. \n This field works by dictating how the Cluster Ingress Operator will consider unset replicas and nodePlacement fields in IngressController resources when creating the corresponding Deployments. \n See the documentation for the IngressController replicas and nodePlacement fields for more information. \n When omitted, the default value is Workers" + type: string + enum: + - ControlPlane + - Workers + - "" + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml new file mode 100644 index 00000000..c0117850 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_network.crd.yaml @@ -0,0 +1,163 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: networks.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Network + listKind: NetworkList + plural: networks + singular: network + preserveUnknownFields: false + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. + type: object + properties: + clusterNetwork: + description: IP address pool to use for pod IPs. This field is immutable after installation. + type: array + items: + description: ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs are allocated. + type: object + properties: + cidr: + description: The complete block for pod IPs. + type: string + hostPrefix: + description: The size (prefix) of block to allocate to each node. If this field is not used by the plugin, it can be left unset. + type: integer + format: int32 + minimum: 0 + externalIP: + description: externalIP defines configuration for controllers that affect Service.ExternalIP. If nil, then ExternalIP is not allowed to be set. + type: object + properties: + autoAssignCIDRs: + description: autoAssignCIDRs is a list of CIDRs from which to automatically assign Service.ExternalIP. These are assigned when the service is of type LoadBalancer. In general, this is only useful for bare-metal clusters. In Openshift 3.x, this was misleadingly called "IngressIPs". Automatically assigned External IPs are not affected by any ExternalIPPolicy rules. Currently, only one entry may be provided. + type: array + items: + type: string + policy: + description: policy is a set of restrictions applied to the ExternalIP field. If nil or empty, then ExternalIP is not allowed to be set. + type: object + properties: + allowedCIDRs: + description: allowedCIDRs is the list of allowed CIDRs. + type: array + items: + type: string + rejectedCIDRs: + description: rejectedCIDRs is the list of disallowed CIDRs. These take precedence over allowedCIDRs. + type: array + items: + type: string + networkType: + description: 'NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OpenShiftSDN This field is immutable after installation.' + type: string + serviceNetwork: + description: IP address pool for services. Currently, we only support a single entry here. This field is immutable after installation. + type: array + items: + type: string + serviceNodePortRange: + description: The port range allowed for Services of type NodePort. If not specified, the default of 30000-32767 will be used. Such Services without a NodePort specified will have one automatically allocated from this range. This parameter can be updated after the cluster is installed. + type: string + pattern: ^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$ + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + properties: + clusterNetwork: + description: IP address pool to use for pod IPs. + type: array + items: + description: ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs are allocated. + type: object + properties: + cidr: + description: The complete block for pod IPs. + type: string + hostPrefix: + description: The size (prefix) of block to allocate to each node. If this field is not used by the plugin, it can be left unset. + type: integer + format: int32 + minimum: 0 + clusterNetworkMTU: + description: ClusterNetworkMTU is the MTU for inter-pod networking. + type: integer + migration: + description: Migration contains the cluster network migration configuration. + type: object + properties: + mtu: + description: MTU contains the MTU migration configuration. + type: object + properties: + machine: + description: Machine contains MTU migration configuration for the machine's uplink. + type: object + properties: + from: + description: From is the MTU to migrate from. + type: integer + format: int32 + minimum: 0 + to: + description: To is the MTU to migrate to. + type: integer + format: int32 + minimum: 0 + network: + description: Network contains MTU migration configuration for the default network. + type: object + properties: + from: + description: From is the MTU to migrate from. + type: integer + format: int32 + minimum: 0 + to: + description: To is the MTU to migrate to. + type: integer + format: int32 + minimum: 0 + networkType: + description: 'NetworkType is the target plugin that is to be deployed. Currently supported values are: OpenShiftSDN, OVNKubernetes' + type: string + enum: + - OpenShiftSDN + - OVNKubernetes + networkType: + description: NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). + type: string + serviceNetwork: + description: IP address pool for services. Currently, we only support a single entry here. + type: array + items: + type: string + served: true + storage: true diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_node.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_node.crd.yaml new file mode 100644 index 00000000..a4ef368c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_node.crd.yaml @@ -0,0 +1,59 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/1107 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: nodes.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Node + listKind: NodeList + plural: nodes + singular: node + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Node holds cluster-wide information about node specific features. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + cgroupMode: + description: CgroupMode determines the cgroups version on the node + type: string + enum: + - v1 + - v2 + - "" + workerLatencyProfile: + description: WorkerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster + type: string + enum: + - Default + - MediumUpdateAverageReaction + - LowUpdateSlowReaction + status: + description: status holds observed values. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml new file mode 100644 index 00000000..ba5ab832 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_oauth.crd.yaml @@ -0,0 +1,444 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: oauths.config.openshift.io +spec: + group: config.openshift.io + names: + kind: OAuth + listKind: OAuthList + plural: oauths + singular: oauth + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + identityProviders: + description: identityProviders is an ordered list of ways for a user to identify themselves. When this list is empty, no identities are provisioned for users. + type: array + items: + description: IdentityProvider provides identities for users authenticating using credentials + type: object + properties: + basicAuth: + description: basicAuth contains configuration options for the BasicAuth IdP + type: object + properties: + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + tlsClientCert: + description: tlsClientCert is an optional reference to a secret by name that contains the PEM-encoded TLS client certificate to present when connecting to the server. The key "tls.crt" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + tlsClientKey: + description: tlsClientKey is an optional reference to a secret by name that contains the PEM-encoded TLS private key for the client certificate referenced in tlsClientCert. The key "tls.key" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + url: + description: url is the remote URL to connect to + type: string + github: + description: github enables user authentication using GitHub credentials + type: object + properties: + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. This can only be configured when hostname is set to a non-empty value. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + clientID: + description: clientID is the oauth client ID + type: string + clientSecret: + description: clientSecret is a required reference to the secret by name containing the oauth client secret. The key "clientSecret" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + hostname: + description: hostname is the optional domain (e.g. "mycompany.com") for use with a hosted instance of GitHub Enterprise. It must match the GitHub Enterprise settings value configured at /setup/settings#hostname. + type: string + organizations: + description: organizations optionally restricts which organizations are allowed to log in + type: array + items: + type: string + teams: + description: teams optionally restricts which teams are allowed to log in. Format is /. + type: array + items: + type: string + gitlab: + description: gitlab enables user authentication using GitLab credentials + type: object + properties: + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + clientID: + description: clientID is the oauth client ID + type: string + clientSecret: + description: clientSecret is a required reference to the secret by name containing the oauth client secret. The key "clientSecret" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + url: + description: url is the oauth server base URL + type: string + google: + description: google enables user authentication using Google credentials + type: object + properties: + clientID: + description: clientID is the oauth client ID + type: string + clientSecret: + description: clientSecret is a required reference to the secret by name containing the oauth client secret. The key "clientSecret" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + hostedDomain: + description: hostedDomain is the optional Google App domain (e.g. "mycompany.com") to restrict logins to + type: string + htpasswd: + description: htpasswd enables user authentication using an HTPasswd file to validate credentials + type: object + properties: + fileData: + description: fileData is a required reference to a secret by name containing the data to use as the htpasswd file. The key "htpasswd" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. If the specified htpasswd data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + keystone: + description: keystone enables user authentication using keystone password credentials + type: object + properties: + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + domainName: + description: domainName is required for keystone v3 + type: string + tlsClientCert: + description: tlsClientCert is an optional reference to a secret by name that contains the PEM-encoded TLS client certificate to present when connecting to the server. The key "tls.crt" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + tlsClientKey: + description: tlsClientKey is an optional reference to a secret by name that contains the PEM-encoded TLS private key for the client certificate referenced in tlsClientCert. The key "tls.key" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + url: + description: url is the remote URL to connect to + type: string + ldap: + description: ldap enables user authentication using LDAP credentials + type: object + properties: + attributes: + description: attributes maps LDAP attributes to identities + type: object + properties: + email: + description: email is the list of attributes whose values should be used as the email address. Optional. If unspecified, no email is set for the identity + type: array + items: + type: string + id: + description: id is the list of attributes whose values should be used as the user ID. Required. First non-empty attribute is used. At least one attribute is required. If none of the listed attribute have a value, authentication fails. LDAP standard identity attribute is "dn" + type: array + items: + type: string + name: + description: name is the list of attributes whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity LDAP standard display name attribute is "cn" + type: array + items: + type: string + preferredUsername: + description: preferredUsername is the list of attributes whose values should be used as the preferred username. LDAP standard login attribute is "uid" + type: array + items: + type: string + bindDN: + description: bindDN is an optional DN to bind with during the search phase. + type: string + bindPassword: + description: bindPassword is an optional reference to a secret by name containing a password to bind with during the search phase. The key "bindPassword" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + insecure: + description: 'insecure, if true, indicates the connection should not use TLS WARNING: Should not be set to `true` with the URL scheme "ldaps://" as "ldaps://" URLs always attempt to connect using TLS, even when `insecure` is set to `true` When `true`, "ldap://" URLS connect insecurely. When `false`, "ldap://" URLs are upgraded to a TLS connection using StartTLS as specified in https://tools.ietf.org/html/rfc2830.' + type: boolean + url: + description: 'url is an RFC 2255 URL which specifies the LDAP search parameters to use. The syntax of the URL is: ldap://host:port/basedn?attribute?scope?filter' + type: string + mappingMethod: + description: mappingMethod determines how identities from this provider are mapped to users Defaults to "claim" + type: string + name: + description: 'name is used to qualify the identities returned by this provider. - It MUST be unique and not shared by any other identity provider used - It MUST be a valid path segment: name cannot equal "." or ".." or contain "/" or "%" or ":" Ref: https://godoc.org/github.com/openshift/origin/pkg/user/apis/user/validation#ValidateIdentityProviderName' + type: string + openID: + description: openID enables user authentication using OpenID credentials + type: object + properties: + ca: + description: ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key "ca.crt" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + claims: + description: claims mappings + type: object + properties: + email: + description: email is the list of claims whose values should be used as the email address. Optional. If unspecified, no email is set for the identity + type: array + items: + type: string + x-kubernetes-list-type: atomic + groups: + description: groups is the list of claims value of which should be used to synchronize groups from the OIDC provider to OpenShift for the user. If multiple claims are specified, the first one with a non-empty value is used. + type: array + items: + description: OpenIDClaim represents a claim retrieved from an OpenID provider's tokens or userInfo responses + type: string + minLength: 1 + x-kubernetes-list-type: atomic + name: + description: name is the list of claims whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity + type: array + items: + type: string + x-kubernetes-list-type: atomic + preferredUsername: + description: preferredUsername is the list of claims whose values should be used as the preferred username. If unspecified, the preferred username is determined from the value of the sub claim + type: array + items: + type: string + x-kubernetes-list-type: atomic + clientID: + description: clientID is the oauth client ID + type: string + clientSecret: + description: clientSecret is a required reference to the secret by name containing the oauth client secret. The key "clientSecret" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + extraAuthorizeParameters: + description: extraAuthorizeParameters are any custom parameters to add to the authorize request. + type: object + additionalProperties: + type: string + extraScopes: + description: extraScopes are any scopes to request in addition to the standard "openid" scope. + type: array + items: + type: string + issuer: + description: issuer is the URL that the OpenID Provider asserts as its Issuer Identifier. It must use the https scheme with no query or fragment component. + type: string + requestHeader: + description: requestHeader enables user authentication using request header credentials + type: object + properties: + ca: + description: ca is a required reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. Specifically, it allows verification of incoming requests to prevent header spoofing. The key "ca.crt" is used to locate the data. If the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. The namespace for this config map is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + challengeURL: + description: challengeURL is a URL to redirect unauthenticated /authorize requests to Unauthenticated requests from OAuth clients which expect WWW-Authenticate challenges will be redirected here. ${url} is replaced with the current URL, escaped to be safe in a query parameter https://www.example.com/sso-login?then=${url} ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} Required when challenge is set to true. + type: string + clientCommonNames: + description: clientCommonNames is an optional list of common names to require a match from. If empty, any client certificate validated against the clientCA bundle is considered authoritative. + type: array + items: + type: string + emailHeaders: + description: emailHeaders is the set of headers to check for the email address + type: array + items: + type: string + headers: + description: headers is the set of headers to check for identity information + type: array + items: + type: string + loginURL: + description: loginURL is a URL to redirect unauthenticated /authorize requests to Unauthenticated requests from OAuth clients which expect interactive logins will be redirected here ${url} is replaced with the current URL, escaped to be safe in a query parameter https://www.example.com/sso-login?then=${url} ${query} is replaced with the current query string https://www.example.com/auth-proxy/oauth/authorize?${query} Required when login is set to true. + type: string + nameHeaders: + description: nameHeaders is the set of headers to check for the display name + type: array + items: + type: string + preferredUsernameHeaders: + description: preferredUsernameHeaders is the set of headers to check for the preferred username + type: array + items: + type: string + type: + description: type identifies the identity provider type for this entry. + type: string + x-kubernetes-list-type: atomic + templates: + description: templates allow you to customize pages like the login page. + type: object + properties: + error: + description: error is the name of a secret that specifies a go template to use to render error pages during the authentication or grant flow. The key "errors.html" is used to locate the template data. If specified and the secret or expected key is not found, the default error page is used. If the specified template is not valid, the default error page is used. If unspecified, the default error page is used. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + login: + description: login is the name of a secret that specifies a go template to use to render the login page. The key "login.html" is used to locate the template data. If specified and the secret or expected key is not found, the default login page is used. If the specified template is not valid, the default login page is used. If unspecified, the default login page is used. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + providerSelection: + description: providerSelection is the name of a secret that specifies a go template to use to render the provider selection page. The key "providers.html" is used to locate the template data. If specified and the secret or expected key is not found, the default provider selection page is used. If the specified template is not valid, the default provider selection page is used. If unspecified, the default provider selection page is used. The namespace for this secret is openshift-config. + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced secret + type: string + tokenConfig: + description: tokenConfig contains options for authorization and access tokens + type: object + properties: + accessTokenInactivityTimeout: + description: "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime. \n WARNING: existing tokens' timeout will not be affected (lowered) by changing this value" + type: string + accessTokenInactivityTimeoutSeconds: + description: 'accessTokenInactivityTimeoutSeconds - DEPRECATED: setting this field has no effect.' + type: integer + format: int32 + accessTokenMaxAgeSeconds: + description: accessTokenMaxAgeSeconds defines the maximum age of access tokens + type: integer + format: int32 + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml new file mode 100644 index 00000000..42f745c6 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_project.crd.yaml @@ -0,0 +1,55 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: projects.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Project + listKind: ProjectList + plural: projects + singular: project + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Project holds cluster-wide information about Project. The canonical name is `cluster` \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + projectRequestMessage: + description: projectRequestMessage is the string presented to a user if they are unable to request a project via the projectrequest api endpoint + type: string + projectRequestTemplate: + description: projectRequestTemplate is the template to use for creating projects in response to projectrequest. This must point to a template in 'openshift-config' namespace. It is optional. If it is not specified, a default template is used. + type: object + properties: + name: + description: name is the metadata.name of the referenced project request template + type: string + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml new file mode 100644 index 00000000..f161bc43 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/0000_10_config-operator_01_scheduler.crd.yaml @@ -0,0 +1,68 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 + include.release.openshift.io/ibm-cloud-managed: "true" + include.release.openshift.io/self-managed-high-availability: "true" + include.release.openshift.io/single-node-developer: "true" + name: schedulers.config.openshift.io +spec: + group: config.openshift.io + names: + kind: Scheduler + listKind: SchedulerList + plural: schedulers + singular: scheduler + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: spec holds user settable values for configuration + type: object + properties: + defaultNodeSelector: + description: 'defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod''s selector. For example, defaultNodeSelector: "type=user-node,region=east" would set nodeSelector field in pod spec to "type=user-node,region=east" to all pods created in all namespaces. Namespaces having project-wide node selectors won''t be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector=''type=user-node,region=east'', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: "type=user-node,region=west" means that the default of "type=user-node,region=east" set in defaultNodeSelector would not be applied.' + type: string + mastersSchedulable: + description: 'MastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.' + type: boolean + policy: + description: 'DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.' + type: object + required: + - name + properties: + name: + description: name is the metadata.name of the referenced config map + type: string + profile: + description: "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods. \n Valid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"" + type: string + enum: + - "" + - LowNodeUtilization + - HighNodeUtilization + - NoScoring + status: + description: status holds observed values from the cluster. They may not be overridden. + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/config/v1/Makefile b/vendor/github.com/openshift/api/config/v1/Makefile new file mode 100644 index 00000000..66bf6363 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/Makefile @@ -0,0 +1,3 @@ +.PHONY: test +test: + make -C ../../tests test GINKGO_EXTRA_ARGS=--focus="config.openshift.io/v1" diff --git a/vendor/github.com/openshift/api/config/v1/doc.go b/vendor/github.com/openshift/api/config/v1/doc.go new file mode 100644 index 00000000..4ff5208f --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/doc.go @@ -0,0 +1,8 @@ +// +k8s:deepcopy-gen=package,register +// +k8s:defaulter-gen=TypeMeta +// +k8s:openapi-gen=true + +// +kubebuilder:validation:Optional +// +groupName=config.openshift.io +// Package v1 is the v1 version of the API. +package v1 diff --git a/vendor/github.com/openshift/api/config/v1/feature_gates.go b/vendor/github.com/openshift/api/config/v1/feature_gates.go new file mode 100644 index 00000000..04e081e0 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/feature_gates.go @@ -0,0 +1,185 @@ +package v1 + +// FeatureGateDescription is a golang-only interface used to contains details for a feature gate. +type FeatureGateDescription struct { + // FeatureGateAttributes is the information that appears in the API + FeatureGateAttributes FeatureGateAttributes + + // OwningJiraComponent is the jira component that owns most of the impl and first assignment for the bug. + // This is the team that owns the feature long term. + OwningJiraComponent string + // ResponsiblePerson is the person who is on the hook for first contact. This is often, but not always, a team lead. + // It is someone who can make the promise on the behalf of the team. + ResponsiblePerson string + // OwningProduct is the product that owns the lifecycle of the gate. + OwningProduct OwningProduct +} + +type OwningProduct string + +var ( + ocpSpecific = OwningProduct("OCP") + kubernetes = OwningProduct("Kubernetes") +) + +var ( + FeatureGateGatewayAPI = FeatureGateName("GatewayAPI") + gateGatewayAPI = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateGatewayAPI, + }, + OwningJiraComponent: "Routing", + ResponsiblePerson: "miciah", + OwningProduct: ocpSpecific, + } + + FeatureGateOpenShiftPodSecurityAdmission = FeatureGateName("OpenShiftPodSecurityAdmission") + openShiftPodSecurityAdmission = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateOpenShiftPodSecurityAdmission, + }, + OwningJiraComponent: "auth", + ResponsiblePerson: "stlaz", + OwningProduct: ocpSpecific, + } + + FeatureGateRetroactiveDefaultStorageClass = FeatureGateName("RetroactiveDefaultStorageClass") + retroactiveDefaultStorageClass = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateRetroactiveDefaultStorageClass, + }, + OwningJiraComponent: "storage", + ResponsiblePerson: "RomanBednar", + OwningProduct: kubernetes, + } + + FeatureGateExternalCloudProvider = FeatureGateName("ExternalCloudProvider") + externalCloudProvider = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateExternalCloudProvider, + }, + OwningJiraComponent: "cloud-provider", + ResponsiblePerson: "jspeed", + OwningProduct: ocpSpecific, + } + + FeatureGateExternalCloudProviderAzure = FeatureGateName("ExternalCloudProviderAzure") + externalCloudProviderAzure = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateExternalCloudProviderAzure, + }, + OwningJiraComponent: "cloud-provider", + ResponsiblePerson: "jspeed", + OwningProduct: ocpSpecific, + } + + FeatureGateExternalCloudProviderGCP = FeatureGateName("ExternalCloudProviderGCP") + externalCloudProviderGCP = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateExternalCloudProviderGCP, + }, + OwningJiraComponent: "cloud-provider", + ResponsiblePerson: "jspeed", + OwningProduct: ocpSpecific, + } + + FeatureGateCSIDriverSharedResource = FeatureGateName("CSIDriverSharedResource") + csiDriverSharedResource = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateCSIDriverSharedResource, + }, + OwningJiraComponent: "builds", + ResponsiblePerson: "adkaplan", + OwningProduct: ocpSpecific, + } + + FeatureGateBuildCSIVolumes = FeatureGateName("BuildCSIVolumes") + buildCSIVolumes = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateBuildCSIVolumes, + }, + OwningJiraComponent: "builds", + ResponsiblePerson: "adkaplan", + OwningProduct: ocpSpecific, + } + + FeatureGateNodeSwap = FeatureGateName("NodeSwap") + nodeSwap = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateNodeSwap, + }, + OwningJiraComponent: "node", + ResponsiblePerson: "ehashman", + OwningProduct: kubernetes, + } + + FeatureGateMachineAPIProviderOpenStack = FeatureGateName("MachineAPIProviderOpenStack") + machineAPIProviderOpenStack = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateMachineAPIProviderOpenStack, + }, + OwningJiraComponent: "openstack", + ResponsiblePerson: "egarcia", + OwningProduct: ocpSpecific, + } + + FeatureGateInsightsConfigAPI = FeatureGateName("InsightsConfigAPI") + insightsConfigAPI = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateInsightsConfigAPI, + }, + OwningJiraComponent: "insights", + ResponsiblePerson: "tremes", + OwningProduct: ocpSpecific, + } + + FeatureGateMatchLabelKeysInPodTopologySpread = FeatureGateName("MatchLabelKeysInPodTopologySpread") + matchLabelKeysInPodTopologySpread = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateMatchLabelKeysInPodTopologySpread, + }, + OwningJiraComponent: "scheduling", + ResponsiblePerson: "ingvagabund", + OwningProduct: kubernetes, + } + + FeatureGatePDBUnhealthyPodEvictionPolicy = FeatureGateName("PDBUnhealthyPodEvictionPolicy") + pdbUnhealthyPodEvictionPolicy = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGatePDBUnhealthyPodEvictionPolicy, + }, + OwningJiraComponent: "apps", + ResponsiblePerson: "atiratree", + OwningProduct: kubernetes, + } + + FeatureGateDynamicResourceAllocation = FeatureGateName("DynamicResourceAllocation") + dynamicResourceAllocation = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateDynamicResourceAllocation, + }, + OwningJiraComponent: "scheduling", + ResponsiblePerson: "jchaloup", + OwningProduct: kubernetes, + } + + FeatureGateAdmissionWebhookMatchConditions = FeatureGateName("AdmissionWebhookMatchConditions") + admissionWebhookMatchConditions = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateAdmissionWebhookMatchConditions, + }, + OwningJiraComponent: "kube-apiserver", + ResponsiblePerson: "benluddy", + OwningProduct: kubernetes, + } + + FeatureGateAzureWorkloadIdentity = FeatureGateName("AzureWorkloadIdentity") + azureWorkloadIdentity = FeatureGateDescription{ + FeatureGateAttributes: FeatureGateAttributes{ + Name: FeatureGateAzureWorkloadIdentity, + }, + OwningJiraComponent: "cloud-credential-operator", + ResponsiblePerson: "abutcher", + OwningProduct: ocpSpecific, + } +) diff --git a/vendor/github.com/openshift/api/config/v1/register.go b/vendor/github.com/openshift/api/config/v1/register.go new file mode 100644 index 00000000..61302592 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/register.go @@ -0,0 +1,78 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +var ( + GroupName = "config.openshift.io" + GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + schemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + // Install is a function which adds this version to a scheme + Install = schemeBuilder.AddToScheme + + // SchemeGroupVersion generated code relies on this name + // Deprecated + SchemeGroupVersion = GroupVersion + // AddToScheme exists solely to keep the old generators creating valid code + // DEPRECATED + AddToScheme = schemeBuilder.AddToScheme +) + +// Resource generated code relies on this being here, but it logically belongs to the group +// DEPRECATED +func Resource(resource string) schema.GroupResource { + return schema.GroupResource{Group: GroupName, Resource: resource} +} + +// Adds the list of known types to api.Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(GroupVersion, + &APIServer{}, + &APIServerList{}, + &Authentication{}, + &AuthenticationList{}, + &Build{}, + &BuildList{}, + &ClusterOperator{}, + &ClusterOperatorList{}, + &ClusterVersion{}, + &ClusterVersionList{}, + &Console{}, + &ConsoleList{}, + &DNS{}, + &DNSList{}, + &FeatureGate{}, + &FeatureGateList{}, + &Image{}, + &ImageList{}, + &Infrastructure{}, + &InfrastructureList{}, + &Ingress{}, + &IngressList{}, + &Node{}, + &NodeList{}, + &Network{}, + &NetworkList{}, + &OAuth{}, + &OAuthList{}, + &OperatorHub{}, + &OperatorHubList{}, + &Project{}, + &ProjectList{}, + &Proxy{}, + &ProxyList{}, + &Scheduler{}, + &SchedulerList{}, + &ImageContentPolicy{}, + &ImageContentPolicyList{}, + &ImageDigestMirrorSet{}, + &ImageDigestMirrorSetList{}, + &ImageTagMirrorSet{}, + &ImageTagMirrorSetList{}, + ) + metav1.AddToGroupVersion(scheme, GroupVersion) + return nil +} diff --git a/vendor/github.com/openshift/api/config/v1/stable.apiserver.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.apiserver.testsuite.yaml new file mode 100644 index 00000000..75f846a3 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.apiserver.testsuite.yaml @@ -0,0 +1,36 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] APIServer" +crd: 0000_10_config-operator_01_apiserver-Default.crd.yaml +tests: + onCreate: + - name: Should be able to create encrypt with aescbc + initial: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + encryption: + type: aescbc + expected: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + audit: + profile: Default + encryption: + type: aescbc + - name: Should be able to create encrypt with aesgcm + initial: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + encryption: + type: aesgcm + expected: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + audit: + profile: Default + encryption: + type: aesgcm + diff --git a/vendor/github.com/openshift/api/config/v1/stable.authentication.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.authentication.testsuite.yaml new file mode 100644 index 00000000..dec36675 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.authentication.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Authentication" +crd: 0000_10_config-operator_01_authentication.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Authentication + initial: | + apiVersion: config.openshift.io/v1 + kind: Authentication + spec: {} # No spec is required for a Authentication + expected: | + apiVersion: config.openshift.io/v1 + kind: Authentication + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.build.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.build.testsuite.yaml new file mode 100644 index 00000000..cdd8a9b7 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.build.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Build" +crd: 0000_10_config-operator_01_build.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Build + initial: | + apiVersion: config.openshift.io/v1 + kind: Build + spec: {} # No spec is required for a Build + expected: | + apiVersion: config.openshift.io/v1 + kind: Build + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.clusteroperator.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.clusteroperator.testsuite.yaml new file mode 100644 index 00000000..177e8f69 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.clusteroperator.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] ClusterOperator" +crd: 0000_00_cluster-version-operator_01_clusteroperator.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal ClusterOperator + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterOperator + spec: {} # No spec is required for a ClusterOperator + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterOperator + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.clusterversion.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.clusterversion.testsuite.yaml new file mode 100644 index 00000000..b966b29a --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.clusterversion.testsuite.yaml @@ -0,0 +1,138 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] ClusterVersion" +crd: 0000_00_cluster-version-operator_01_clusterversion.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal ClusterVersion + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + - name: Should allow image to be set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + image: bar + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + image: bar + - name: Should allow version to be set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + version: 4.11.1 + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + version: 4.11.1 + - name: Should allow architecture to be empty + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: "" + version: 4.11.1 + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: "" + version: 4.11.1 + - name: Should allow architecture and version to be set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + expected: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + - name: Version must be set if architecture is set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + expectedError: "Version must be set if Architecture is set" + - name: Should not allow image and architecture to be set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + image: bar + expectedError: "cannot set both Architecture and Image" + onUpdate: + - name: Should not allow image to be set if architecture set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + updated: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + image: bar + expectedError: "cannot set both Architecture and Image" + - name: Should not allow architecture to be set if image set + initial: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + image: bar + updated: | + apiVersion: config.openshift.io/v1 + kind: ClusterVersion + spec: + clusterID: foo + desiredUpdate: + architecture: Multi + version: 4.11.1 + image: bar + expectedError: "cannot set both Architecture and Image" diff --git a/vendor/github.com/openshift/api/config/v1/stable.console.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.console.testsuite.yaml new file mode 100644 index 00000000..0081816f --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.console.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Console" +crd: 0000_10_config-operator_01_console.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Console + initial: | + apiVersion: config.openshift.io/v1 + kind: Console + spec: {} # No spec is required for a Console + expected: | + apiVersion: config.openshift.io/v1 + kind: Console + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.dns.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.dns.testsuite.yaml new file mode 100644 index 00000000..c69f5005 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.dns.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] DNS" +crd: 0000_10_config-operator_01_dns.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal DNS + initial: | + apiVersion: config.openshift.io/v1 + kind: DNS + spec: {} # No spec is required for a DNS + expected: | + apiVersion: config.openshift.io/v1 + kind: DNS + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.featuregate.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.featuregate.testsuite.yaml new file mode 100644 index 00000000..6b6a4327 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.featuregate.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] FeatureGate" +crd: 0000_10_config-operator_01_featuregate.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal FeatureGate + initial: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + spec: {} # No spec is required for a FeatureGate + expected: | + apiVersion: config.openshift.io/v1 + kind: FeatureGate + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.image.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.image.testsuite.yaml new file mode 100644 index 00000000..6bfbb820 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.image.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Image" +crd: 0000_10_config-operator_01_image.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Image + initial: | + apiVersion: config.openshift.io/v1 + kind: Image + spec: {} # No spec is required for a Image + expected: | + apiVersion: config.openshift.io/v1 + kind: Image + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.imagecontentpolicy.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.imagecontentpolicy.testsuite.yaml new file mode 100644 index 00000000..bffdb6bc --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.imagecontentpolicy.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] ImageContentPolicy" +crd: 0000_10_config-operator_01_imagecontentpolicy.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal ImageContentPolicy + initial: | + apiVersion: config.openshift.io/v1 + kind: ImageContentPolicy + spec: {} # No spec is required for a ImageContentPolicy + expected: | + apiVersion: config.openshift.io/v1 + kind: ImageContentPolicy + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.imagedigestmirrorset.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.imagedigestmirrorset.testsuite.yaml new file mode 100644 index 00000000..c25b1696 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.imagedigestmirrorset.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] ImageDigestMirrorSet" +crd: 0000_10_config-operator_01_imagedigestmirrorset.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal ImageDigestMirrorSet + initial: | + apiVersion: config.openshift.io/v1 + kind: ImageDigestMirrorSet + spec: {} # No spec is required for a ImageDigestMirrorSet + expected: | + apiVersion: config.openshift.io/v1 + kind: ImageDigestMirrorSet + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.imagetagmirrorset.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.imagetagmirrorset.testsuite.yaml new file mode 100644 index 00000000..de91eb2c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.imagetagmirrorset.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] ImageTagMirrorSet" +crd: 0000_10_config-operator_01_imagetagmirrorset.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal ImageTagMirrorSet + initial: | + apiVersion: config.openshift.io/v1 + kind: ImageTagMirrorSet + spec: {} # No spec is required for a ImageTagMirrorSet + expected: | + apiVersion: config.openshift.io/v1 + kind: ImageTagMirrorSet + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.infrastructure.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.infrastructure.testsuite.yaml new file mode 100644 index 00000000..4266122b --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.infrastructure.testsuite.yaml @@ -0,0 +1,476 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Infrastructure" +crd: 0000_10_config-operator_01_infrastructure-Default.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Infrastructure + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} # No spec is required for a Infrastructure + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + onUpdate: + - name: Should be able to change External platformName from unknown to something else + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: External + external: + platformName: Unknown + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: External + external: + platformName: M&PCloud + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: External + external: + platformName: M&PCloud + - name: Should not be able to change External platformName once it was set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: External + external: + platformName: M&PCloud + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: External + external: + platformName: SomeOtherCoolplatformName + expectedError: " spec.platformSpec.external.platformName: Invalid value: \"string\": platform name cannot be changed once set" + - name: Should not be able to modify an existing Azure ResourceTags Tag + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + controlPlaneTopology: "HighlyAvailable" + infrastructureTopology: "HighlyAvailable" + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "changed"} + expectedStatusError: "status.platformStatus.azure.resourceTags: Invalid value: \"array\": resourceTags are immutable and may only be configured during installation" + - name: Should not be able to add a Tag to an existing Azure ResourceTags + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + controlPlaneTopology: "HighlyAvailable" + infrastructureTopology: "HighlyAvailable" + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + - {key: "new", value: "entry"} + expectedStatusError: "status.platformStatus.azure.resourceTags: Invalid value: \"array\": resourceTags are immutable and may only be configured during installation" + - name: Should not be able to remove a Tag from an existing Azure ResourceTags + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + - {key: "new", value: "entry"} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + expectedStatusError: "status.platformStatus.azure.resourceTags: Invalid value: \"array\": resourceTags are immutable and may only be configured during installation" + - name: Should not be able to add Azure ResourceTags to an empty platformStatus.azure + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: {} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + azure: + resourceTags: + - {key: "key", value: "value"} + expectedStatusError: "status.platformStatus.azure: Invalid value: \"object\": resourceTags may only be configured during installation" + - name: Should not be able to remove Azure ResourceTags from platformStatus.azure + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceTags: + - {key: "key", value: "value"} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: {} + expectedStatusError: "status.platformStatus.azure: Invalid value: \"object\": resourceTags may only be configured during installation" + - name: Should be able to modify the ResourceGroupName while Azure ResourceTags are present + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + type: Azure + azure: + resourceGroupName: foo + resourceTags: + - {key: "key", value: "value"} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + platform: Azure + platformStatus: + azure: + resourceGroupName: bar + resourceTags: + - {key: "key", value: "value"} + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + controlPlaneTopology: "HighlyAvailable" + infrastructureTopology: "HighlyAvailable" + platform: Azure + platformStatus: + azure: + resourceGroupName: bar + resourceTags: + - {key: "key", value: "value"} + - name: PowerVS platform status's resourceGroup length should not exceed the max length set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: resource-group + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: resource-group-should-not-accept-the-string-that-exceeds-max-length-set + expectedStatusError: "status.platformStatus.powervs.resourceGroup: Too long: may not be longer than 40" + - name: PowerVS platform status's resourceGroup should match the regex configured + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: resource-group + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: re$ource-group + expectedStatusError: "status.platformStatus.powervs.resourceGroup in body should match '^[a-zA-Z0-9-_ ]+$'" + - name: Should not be able to change PowerVS platform status's resourceGroup once it was set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: resource-group + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + resourceGroup: other-resource-group-name + expectedStatusError: "status.platformStatus.powervs.resourceGroup: Invalid value: \"string\": resourceGroup is immutable once set" + - name: Should not be able to unset PowerVS platform status's resourceGroup once it was set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + region: some-region + resourceGroup: resource-group + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: PowerVS + status: + platform: PowerVS + platformStatus: + powervs: + region: some-region + expectedStatusError: "status.platformStatus.powervs: Invalid value: \"object\": cannot unset resourceGroup once set" + - name: Should set load balancer type to OpenShiftManagedDefault if not specified + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + platform: OpenStack + platformStatus: + openstack: {} + type: OpenStack + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: OpenShiftManagedDefault + type: OpenStack + - name: Should be able to override the default load balancer with a valid value + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: UserManaged + type: OpenStack + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: UserManaged + type: OpenStack + - name: Should not allow changing the immutable load balancer type field + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: OpenShiftManagedDefault + type: OpenStack + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: OpenStack + openstack: {} + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: UserManaged + type: OpenStack + expectedStatusError: "status.platformStatus.openstack.loadBalancer.type: Invalid value: \"string\": type is immutable once set" + - name: Should not allow removing the immutable load balancer type field that was initially set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: UserManaged + type: OpenStack + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: OpenStack + openstack: {} + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: OpenStack + platformStatus: + openstack: {} + type: OpenStack + expectedStatusError: "status.platformStatus.openstack.loadBalancer.type: Invalid value: \"string\": type is immutable once set" + - name: Should not allow setting the load balancer type to a wrong value + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + openstack: {} + type: OpenStack + status: + platform: OpenStack + platformStatus: + openstack: + loadBalancer: + type: FooBar + type: OpenStack + expectedStatusError: "status.platformStatus.openstack.loadBalancer.type: Unsupported value: \"FooBar\": supported values: \"OpenShiftManagedDefault\", \"UserManaged\"" diff --git a/vendor/github.com/openshift/api/config/v1/stable.ingress.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.ingress.testsuite.yaml new file mode 100644 index 00000000..90d48e89 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.ingress.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Ingress" +crd: 0000_10_config-operator_01_ingress.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Ingress + initial: | + apiVersion: config.openshift.io/v1 + kind: Ingress + spec: {} # No spec is required for a Ingress + expected: | + apiVersion: config.openshift.io/v1 + kind: Ingress + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.network.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.network.testsuite.yaml new file mode 100644 index 00000000..e8a8bcfa --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.network.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Network" +crd: 0000_10_config-operator_01_network.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Network + initial: | + apiVersion: config.openshift.io/v1 + kind: Network + spec: {} # No spec is required for a Network + expected: | + apiVersion: config.openshift.io/v1 + kind: Network + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.node.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.node.testsuite.yaml new file mode 100644 index 00000000..d6502600 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.node.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Node" +crd: 0000_10_config-operator_01_node.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Node + initial: | + apiVersion: config.openshift.io/v1 + kind: Node + spec: {} # No spec is required for a Node + expected: | + apiVersion: config.openshift.io/v1 + kind: Node + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.oauth.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.oauth.testsuite.yaml new file mode 100644 index 00000000..d33d2bc1 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.oauth.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] OAuth" +crd: 0000_10_config-operator_01_oauth.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal OAuth + initial: | + apiVersion: config.openshift.io/v1 + kind: OAuth + spec: {} # No spec is required for a OAuth + expected: | + apiVersion: config.openshift.io/v1 + kind: OAuth + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.operatorhub.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.operatorhub.testsuite.yaml new file mode 100644 index 00000000..9dd7a4c6 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.operatorhub.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] OperatorHub" +crd: 0000_03_marketplace-operator_01_operatorhub.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal OperatorHub + initial: | + apiVersion: config.openshift.io/v1 + kind: OperatorHub + spec: {} # No spec is required for a OperatorHub + expected: | + apiVersion: config.openshift.io/v1 + kind: OperatorHub + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.project.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.project.testsuite.yaml new file mode 100644 index 00000000..0144ad32 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.project.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Project" +crd: 0000_10_config-operator_01_project.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Project + initial: | + apiVersion: config.openshift.io/v1 + kind: Project + spec: {} # No spec is required for a Project + expected: | + apiVersion: config.openshift.io/v1 + kind: Project + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.proxy.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.proxy.testsuite.yaml new file mode 100644 index 00000000..d49b8324 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.proxy.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Proxy" +crd: 0000_03_config-operator_01_proxy.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Proxy + initial: | + apiVersion: config.openshift.io/v1 + kind: Proxy + spec: {} # No spec is required for a Proxy + expected: | + apiVersion: config.openshift.io/v1 + kind: Proxy + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stable.scheduler.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/stable.scheduler.testsuite.yaml new file mode 100644 index 00000000..d9333b55 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stable.scheduler.testsuite.yaml @@ -0,0 +1,14 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Scheduler" +crd: 0000_10_config-operator_01_scheduler.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Scheduler + initial: | + apiVersion: config.openshift.io/v1 + kind: Scheduler + spec: {} # No spec is required for a Scheduler + expected: | + apiVersion: config.openshift.io/v1 + kind: Scheduler + spec: {} diff --git a/vendor/github.com/openshift/api/config/v1/stringsource.go b/vendor/github.com/openshift/api/config/v1/stringsource.go new file mode 100644 index 00000000..6a5718c1 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/stringsource.go @@ -0,0 +1,31 @@ +package v1 + +import "encoding/json" + +// UnmarshalJSON implements the json.Unmarshaller interface. +// If the value is a string, it sets the Value field of the StringSource. +// Otherwise, it is unmarshaled into the StringSourceSpec struct +func (s *StringSource) UnmarshalJSON(value []byte) error { + // If we can unmarshal to a simple string, just set the value + var simpleValue string + if err := json.Unmarshal(value, &simpleValue); err == nil { + s.Value = simpleValue + return nil + } + + // Otherwise do the full struct unmarshal + return json.Unmarshal(value, &s.StringSourceSpec) +} + +// MarshalJSON implements the json.Marshaller interface. +// If the StringSource contains only a string Value (or is empty), it is marshaled as a JSON string. +// Otherwise, the StringSourceSpec struct is marshaled as a JSON object. +func (s *StringSource) MarshalJSON() ([]byte, error) { + // If we have only a cleartext value set, do a simple string marshal + if s.StringSourceSpec == (StringSourceSpec{Value: s.Value}) { + return json.Marshal(s.Value) + } + + // Otherwise do the full struct marshal of the externalized bits + return json.Marshal(s.StringSourceSpec) +} diff --git a/vendor/github.com/openshift/api/config/v1/techpreview.apiserver.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/techpreview.apiserver.testsuite.yaml new file mode 100644 index 00000000..74aa92b4 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/techpreview.apiserver.testsuite.yaml @@ -0,0 +1,35 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[TechPreviewNoUpgrade] APIServer" +crd: 0000_10_config-operator_01_apiserver-TechPreviewNoUpgrade.crd.yaml +tests: + onCreate: + - name: Should be able to create encrypt with aescbc + initial: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + encryption: + type: aescbc + expected: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + audit: + profile: Default + encryption: + type: aescbc + - name: Should be able to create encrypt with aesgcm + initial: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + encryption: + type: aesgcm + expected: | + apiVersion: config.openshift.io/v1 + kind: APIServer + spec: + audit: + profile: Default + encryption: + type: aesgcm diff --git a/vendor/github.com/openshift/api/config/v1/techpreview.infrastructure.testsuite.yaml b/vendor/github.com/openshift/api/config/v1/techpreview.infrastructure.testsuite.yaml new file mode 100644 index 00000000..f9829b9a --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/techpreview.infrastructure.testsuite.yaml @@ -0,0 +1,213 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[TechPreviewNoUpgrade] Infrastructure" +crd: 0000_10_config-operator_01_infrastructure-TechPreviewNoUpgrade.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Infrastructure + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} # No spec is required for a Infrastructure + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + onUpdate: + - name: Status Should contain default fields + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: {} + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: {} + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + cpuPartitioning: None + infrastructureTopology: HighlyAvailable + controlPlaneTopology: HighlyAvailable + - name: Status update cpuPartitioning should fail validation check + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + cpuPartitioning: None + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: {} + status: + cpuPartitioning: "Invalid" + expectedStatusError: 'status.cpuPartitioning: Unsupported value: "Invalid": supported values: "None", "AllNodes"' + - name: Should set load balancer type to OpenShiftManagedDefault if not specified + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + platform: BareMetal + platformStatus: + baremetal: {} + type: BareMetal + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + controlPlaneTopology: HighlyAvailable + cpuPartitioning: None + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: OpenShiftManagedDefault + type: BareMetal + - name: Should be able to override the default load balancer with a valid value + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: UserManaged + type: BareMetal + expected: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + controlPlaneTopology: HighlyAvailable + cpuPartitioning: None + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: UserManaged + type: BareMetal + - name: Should not allow changing the immutable load balancer type field + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: OpenShiftManagedDefault + type: BareMetal + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: BareMetal + baremetal: {} + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: UserManaged + type: BareMetal + expectedStatusError: "status.platformStatus.baremetal.loadBalancer.type: Invalid value: \"string\": type is immutable once set" + - name: Should not allow removing the immutable load balancer type field that was initially set + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: UserManaged + type: BareMetal + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + type: BareMetal + baremetal: {} + status: + controlPlaneTopology: HighlyAvailable + infrastructureTopology: HighlyAvailable + platform: BareMetal + platformStatus: + baremetal: {} + type: BareMetal + expectedStatusError: "status.platformStatus.baremetal.loadBalancer.type: Invalid value: \"string\": type is immutable once set" + - name: Should not allow setting the load balancer type to a wrong value + initial: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + updated: | + apiVersion: config.openshift.io/v1 + kind: Infrastructure + spec: + platformSpec: + baremetal: {} + type: BareMetal + status: + platform: BareMetal + platformStatus: + baremetal: + loadBalancer: + type: FooBar + type: BareMetal + expectedStatusError: "status.platformStatus.baremetal.loadBalancer.type: Unsupported value: \"FooBar\": supported values: \"OpenShiftManagedDefault\", \"UserManaged\"" diff --git a/vendor/github.com/openshift/api/config/v1/types.go b/vendor/github.com/openshift/api/config/v1/types.go new file mode 100644 index 00000000..56d00648 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types.go @@ -0,0 +1,400 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" +) + +// ConfigMapFileReference references a config map in a specific namespace. +// The namespace must be specified at the point of use. +type ConfigMapFileReference struct { + Name string `json:"name"` + // Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references. + Key string `json:"key,omitempty"` +} + +// ConfigMapNameReference references a config map in a specific namespace. +// The namespace must be specified at the point of use. +type ConfigMapNameReference struct { + // name is the metadata.name of the referenced config map + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` +} + +// SecretNameReference references a secret in a specific namespace. +// The namespace must be specified at the point of use. +type SecretNameReference struct { + // name is the metadata.name of the referenced secret + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` +} + +// HTTPServingInfo holds configuration for serving HTTP +type HTTPServingInfo struct { + // ServingInfo is the HTTP serving information + ServingInfo `json:",inline"` + // MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit. + MaxRequestsInFlight int64 `json:"maxRequestsInFlight"` + // RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if + // -1 there is no limit on requests. + RequestTimeoutSeconds int64 `json:"requestTimeoutSeconds"` +} + +// ServingInfo holds information about serving web pages +type ServingInfo struct { + // BindAddress is the ip:port to serve on + BindAddress string `json:"bindAddress"` + // BindNetwork is the type of network to bind to - defaults to "tcp4", accepts "tcp", + // "tcp4", and "tcp6" + BindNetwork string `json:"bindNetwork"` + // CertInfo is the TLS cert info for serving secure traffic. + // this is anonymous so that we can inline it for serialization + CertInfo `json:",inline"` + // ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates + // +optional + ClientCA string `json:"clientCA,omitempty"` + // NamedCertificates is a list of certificates to use to secure requests to specific hostnames + NamedCertificates []NamedCertificate `json:"namedCertificates,omitempty"` + // MinTLSVersion is the minimum TLS version supported. + // Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants + MinTLSVersion string `json:"minTLSVersion,omitempty"` + // CipherSuites contains an overridden list of ciphers for the server to support. + // Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants + CipherSuites []string `json:"cipherSuites,omitempty"` +} + +// CertInfo relates a certificate with a private key +type CertInfo struct { + // CertFile is a file containing a PEM-encoded certificate + CertFile string `json:"certFile"` + // KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile + KeyFile string `json:"keyFile"` +} + +// NamedCertificate specifies a certificate/key, and the names it should be served for +type NamedCertificate struct { + // Names is a list of DNS names this certificate should be used to secure + // A name can be a normal DNS name, or can contain leading wildcard segments. + Names []string `json:"names,omitempty"` + // CertInfo is the TLS cert info for serving secure traffic + CertInfo `json:",inline"` +} + +// LeaderElection provides information to elect a leader +type LeaderElection struct { + // disable allows leader election to be suspended while allowing a fully defaulted "normal" startup case. + Disable bool `json:"disable,omitempty"` + // namespace indicates which namespace the resource is in + Namespace string `json:"namespace,omitempty"` + // name indicates what name to use for the resource + Name string `json:"name,omitempty"` + + // leaseDuration is the duration that non-leader candidates will wait + // after observing a leadership renewal until attempting to acquire + // leadership of a led but unrenewed leader slot. This is effectively the + // maximum duration that a leader can be stopped before it is replaced + // by another candidate. This is only applicable if leader election is + // enabled. + // +nullable + LeaseDuration metav1.Duration `json:"leaseDuration"` + // renewDeadline is 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. + // +nullable + RenewDeadline metav1.Duration `json:"renewDeadline"` + // retryPeriod is the duration the clients should wait between attempting + // acquisition and renewal of a leadership. This is only applicable if + // leader election is enabled. + // +nullable + RetryPeriod metav1.Duration `json:"retryPeriod"` +} + +// StringSource allows specifying a string inline, or externally via env var or file. +// When it contains only a string value, it marshals to a simple JSON string. +type StringSource struct { + // StringSourceSpec specifies the string value, or external location + StringSourceSpec `json:",inline"` +} + +// StringSourceSpec specifies a string value, or external location +type StringSourceSpec struct { + // Value specifies the cleartext value, or an encrypted value if keyFile is specified. + Value string `json:"value"` + + // Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified. + Env string `json:"env"` + + // File references a file containing the cleartext value, or an encrypted value if a keyFile is specified. + File string `json:"file"` + + // KeyFile references a file containing the key to use to decrypt the value. + KeyFile string `json:"keyFile"` +} + +// RemoteConnectionInfo holds information necessary for establishing a remote connection +type RemoteConnectionInfo struct { + // URL is the remote URL to connect to + URL string `json:"url"` + // CA is the CA for verifying TLS connections + CA string `json:"ca"` + // CertInfo is the TLS client cert information to present + // this is anonymous so that we can inline it for serialization + CertInfo `json:",inline"` +} + +type AdmissionConfig struct { + PluginConfig map[string]AdmissionPluginConfig `json:"pluginConfig,omitempty"` + + // enabledPlugins is a list of admission plugins that must be on in addition to the default list. + // Some admission plugins are disabled by default, but certain configurations require them. This is fairly uncommon + // and can result in performance penalties and unexpected behavior. + EnabledAdmissionPlugins []string `json:"enabledPlugins,omitempty"` + + // disabledPlugins is a list of admission plugins that must be off. Putting something in this list + // is almost always a mistake and likely to result in cluster instability. + DisabledAdmissionPlugins []string `json:"disabledPlugins,omitempty"` +} + +// AdmissionPluginConfig holds the necessary configuration options for admission plugins +type AdmissionPluginConfig struct { + // Location is the path to a configuration file that contains the plugin's + // configuration + Location string `json:"location"` + + // Configuration is an embedded configuration object to be used as the plugin's + // configuration. If present, it will be used instead of the path to the configuration file. + // +nullable + // +kubebuilder:pruning:PreserveUnknownFields + Configuration runtime.RawExtension `json:"configuration"` +} + +type LogFormatType string + +type WebHookModeType string + +const ( + // LogFormatLegacy saves event in 1-line text format. + LogFormatLegacy LogFormatType = "legacy" + // LogFormatJson saves event in structured json format. + LogFormatJson LogFormatType = "json" + + // WebHookModeBatch indicates that the webhook should buffer audit events + // internally, sending batch updates either once a certain number of + // events have been received or a certain amount of time has passed. + WebHookModeBatch WebHookModeType = "batch" + // WebHookModeBlocking causes the webhook to block on every attempt to process + // a set of events. This causes requests to the API server to wait for a + // round trip to the external audit service before sending a response. + WebHookModeBlocking WebHookModeType = "blocking" +) + +// AuditConfig holds configuration for the audit capabilities +type AuditConfig struct { + // If this flag is set, audit log will be printed in the logs. + // The logs contains, method, user and a requested URL. + Enabled bool `json:"enabled"` + // All requests coming to the apiserver will be logged to this file. + AuditFilePath string `json:"auditFilePath"` + // Maximum number of days to retain old log files based on the timestamp encoded in their filename. + MaximumFileRetentionDays int32 `json:"maximumFileRetentionDays"` + // Maximum number of old log files to retain. + MaximumRetainedFiles int32 `json:"maximumRetainedFiles"` + // Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB. + MaximumFileSizeMegabytes int32 `json:"maximumFileSizeMegabytes"` + + // PolicyFile is a path to the file that defines the audit policy configuration. + PolicyFile string `json:"policyFile"` + // PolicyConfiguration is an embedded policy configuration object to be used + // as the audit policy configuration. If present, it will be used instead of + // the path to the policy file. + // +nullable + // +kubebuilder:pruning:PreserveUnknownFields + PolicyConfiguration runtime.RawExtension `json:"policyConfiguration"` + + // Format of saved audits (legacy or json). + LogFormat LogFormatType `json:"logFormat"` + + // Path to a .kubeconfig formatted file that defines the audit webhook configuration. + WebHookKubeConfig string `json:"webHookKubeConfig"` + // Strategy for sending audit events (block or batch). + WebHookMode WebHookModeType `json:"webHookMode"` +} + +// EtcdConnectionInfo holds information necessary for connecting to an etcd server +type EtcdConnectionInfo struct { + // URLs are the URLs for etcd + URLs []string `json:"urls,omitempty"` + // CA is a file containing trusted roots for the etcd server certificates + CA string `json:"ca"` + // CertInfo is the TLS client cert information for securing communication to etcd + // this is anonymous so that we can inline it for serialization + CertInfo `json:",inline"` +} + +type EtcdStorageConfig struct { + EtcdConnectionInfo `json:",inline"` + + // StoragePrefix is the path within etcd that the OpenShift resources will + // be rooted under. This value, if changed, will mean existing objects in etcd will + // no longer be located. + StoragePrefix string `json:"storagePrefix"` +} + +// GenericAPIServerConfig is an inline-able struct for aggregated apiservers that need to store data in etcd +type GenericAPIServerConfig struct { + // servingInfo describes how to start serving + ServingInfo HTTPServingInfo `json:"servingInfo"` + + // corsAllowedOrigins + CORSAllowedOrigins []string `json:"corsAllowedOrigins"` + + // auditConfig describes how to configure audit information + AuditConfig AuditConfig `json:"auditConfig"` + + // storageConfig contains information about how to use + StorageConfig EtcdStorageConfig `json:"storageConfig"` + + // admissionConfig holds information about how to configure admission. + AdmissionConfig AdmissionConfig `json:"admission"` + + KubeClientConfig KubeClientConfig `json:"kubeClientConfig"` +} + +type KubeClientConfig struct { + // kubeConfig is a .kubeconfig filename for going to the owning kube-apiserver. Empty uses an in-cluster-config + KubeConfig string `json:"kubeConfig"` + + // connectionOverrides specifies client overrides for system components to loop back to this master. + ConnectionOverrides ClientConnectionOverrides `json:"connectionOverrides"` +} + +type ClientConnectionOverrides struct { + // acceptContentTypes defines the Accept header sent by clients when connecting to a server, overriding the + // default value of 'application/json'. This field will control all connections to the server used by a particular + // client. + AcceptContentTypes string `json:"acceptContentTypes"` + // contentType is the content type used when sending data to the server from this client. + ContentType string `json:"contentType"` + + // qps controls the number of queries per second allowed for this connection. + QPS float32 `json:"qps"` + // burst allows extra queries to accumulate when a client is exceeding its rate. + Burst int32 `json:"burst"` +} + +// GenericControllerConfig provides information to configure a controller +type GenericControllerConfig struct { + // ServingInfo is the HTTP serving information for the controller's endpoints + ServingInfo HTTPServingInfo `json:"servingInfo"` + + // leaderElection provides information to elect a leader. Only override this if you have a specific need + LeaderElection LeaderElection `json:"leaderElection"` + + // authentication allows configuration of authentication for the endpoints + Authentication DelegatedAuthentication `json:"authentication"` + // authorization allows configuration of authentication for the endpoints + Authorization DelegatedAuthorization `json:"authorization"` +} + +// DelegatedAuthentication allows authentication to be disabled. +type DelegatedAuthentication struct { + // disabled indicates that authentication should be disabled. By default it will use delegated authentication. + Disabled bool `json:"disabled,omitempty"` +} + +// DelegatedAuthorization allows authorization to be disabled. +type DelegatedAuthorization struct { + // disabled indicates that authorization should be disabled. By default it will use delegated authorization. + Disabled bool `json:"disabled,omitempty"` +} +type RequiredHSTSPolicy struct { + // namespaceSelector specifies a label selector such that the policy applies only to those routes that + // are in namespaces with labels that match the selector, and are in one of the DomainPatterns. + // Defaults to the empty LabelSelector, which matches everything. + // +optional + NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"` + + // domainPatterns is a list of domains for which the desired HSTS annotations are required. + // If domainPatterns is specified and a route is created with a spec.host matching one of the domains, + // the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy. + // + // The use of wildcards is allowed like this: *.foo.com matches everything under foo.com. + // foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*. + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:Required + // +required + DomainPatterns []string `json:"domainPatterns"` + + // maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. + // If set to 0, it negates the effect, and hosts are removed as HSTS hosts. + // If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. + // maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS + // policy will eventually expire on that client. + MaxAge MaxAgePolicy `json:"maxAge"` + + // preloadPolicy directs the client to include hosts in its host preload list so that + // it never needs to do an initial load to get the HSTS header (note that this is not defined + // in RFC 6797 and is therefore client implementation-dependent). + // +optional + PreloadPolicy PreloadPolicy `json:"preloadPolicy,omitempty"` + + // includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's + // domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: + // - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com + // - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com + // - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com + // +optional + IncludeSubDomainsPolicy IncludeSubDomainsPolicy `json:"includeSubDomainsPolicy,omitempty"` +} + +// MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy +type MaxAgePolicy struct { + // The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // This value can be left unspecified, in which case no upper limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + LargestMaxAge *int32 `json:"largestMaxAge,omitempty"` + + // The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age + // Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary + // tool for administrators to quickly correct mistakes. + // This value can be left unspecified, in which case no lower limit is enforced. + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=2147483647 + SmallestMaxAge *int32 `json:"smallestMaxAge,omitempty"` +} + +// PreloadPolicy contains a value for specifying a compliant HSTS preload policy for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequirePreload;RequireNoPreload;NoOpinion +type PreloadPolicy string + +const ( + // RequirePreloadPolicy means HSTS "preload" is required by the RequiredHSTSPolicy + RequirePreloadPolicy PreloadPolicy = "RequirePreload" + + // RequireNoPreloadPolicy means HSTS "preload" is forbidden by the RequiredHSTSPolicy + RequireNoPreloadPolicy PreloadPolicy = "RequireNoPreload" + + // NoOpinionPreloadPolicy means HSTS "preload" doesn't matter to the RequiredHSTSPolicy + NoOpinionPreloadPolicy PreloadPolicy = "NoOpinion" +) + +// IncludeSubDomainsPolicy contains a value for specifying a compliant HSTS includeSubdomains policy +// for the enclosing RequiredHSTSPolicy +// +kubebuilder:validation:Enum=RequireIncludeSubDomains;RequireNoIncludeSubDomains;NoOpinion +type IncludeSubDomainsPolicy string + +const ( + // RequireIncludeSubDomains means HSTS "includeSubDomains" is required by the RequiredHSTSPolicy + RequireIncludeSubDomains IncludeSubDomainsPolicy = "RequireIncludeSubDomains" + + // RequireNoIncludeSubDomains means HSTS "includeSubDomains" is forbidden by the RequiredHSTSPolicy + RequireNoIncludeSubDomains IncludeSubDomainsPolicy = "RequireNoIncludeSubDomains" + + // NoOpinionIncludeSubDomains means HSTS "includeSubDomains" doesn't matter to the RequiredHSTSPolicy + NoOpinionIncludeSubDomains IncludeSubDomainsPolicy = "NoOpinion" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_apiserver.go b/vendor/github.com/openshift/api/config/v1/types_apiserver.go new file mode 100644 index 00000000..5d18860c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_apiserver.go @@ -0,0 +1,221 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// APIServer holds configuration (like serving certificates, client CA and CORS domains) +// shared by all API servers in the system, among them especially kube-apiserver +// and openshift-apiserver. The canonical name of an instance is 'cluster'. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type APIServer struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec APIServerSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status APIServerStatus `json:"status"` +} + +type APIServerSpec struct { + // servingCert is the TLS cert info for serving secure traffic. If not specified, operator managed certificates + // will be used for serving secure traffic. + // +optional + ServingCerts APIServerServingCerts `json:"servingCerts"` + // clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for + // incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. + // You usually only have to set this if you have your own PKI you wish to honor client certificates from. + // The ConfigMap must exist in the openshift-config namespace and contain the following required fields: + // - ConfigMap.Data["ca-bundle.crt"] - CA bundle. + // +optional + ClientCA ConfigMapNameReference `json:"clientCA"` + // additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the + // API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth + // server from JavaScript applications. + // The values are regular expressions that correspond to the Golang regular expression language. + // +optional + AdditionalCORSAllowedOrigins []string `json:"additionalCORSAllowedOrigins,omitempty"` + // encryption allows the configuration of encryption of resources at the datastore layer. + // +optional + Encryption APIServerEncryption `json:"encryption"` + // tlsSecurityProfile specifies settings for TLS connections for externally exposed servers. + // + // If unset, a default (which may change between releases) is chosen. Note that only Old, + // Intermediate and Custom profiles are currently supported, and the maximum available + // MinTLSVersions is VersionTLS12. + // +optional + TLSSecurityProfile *TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"` + // audit specifies the settings for audit configuration to be applied to all OpenShift-provided + // API servers in the cluster. + // +optional + // +kubebuilder:default={profile: Default} + Audit Audit `json:"audit"` +} + +// AuditProfileType defines the audit policy profile type. +// +kubebuilder:validation:Enum=Default;WriteRequestBodies;AllRequestBodies;None +type AuditProfileType string + +const ( + // "None" disables audit logs. + NoneAuditProfileType AuditProfileType = "None" + + // "Default" is the existing default audit configuration policy. + DefaultAuditProfileType AuditProfileType = "Default" + + // "WriteRequestBodies" is similar to Default but it logs request and response + // HTTP payloads for write requests (create, update, patch) + WriteRequestBodiesAuditProfileType AuditProfileType = "WriteRequestBodies" + + // "AllRequestBodies" is similar to WriteRequestBodies, but also logs request + // and response HTTP payloads for read requests (get, list). + AllRequestBodiesAuditProfileType AuditProfileType = "AllRequestBodies" +) + +type Audit struct { + // profile specifies the name of the desired top-level audit profile to be applied to all requests + // sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, + // openshift-apiserver and oauth-apiserver), with the exception of those requests that match + // one or more of the customRules. + // + // The following profiles are provided: + // - Default: default policy which means MetaData level logging with the exception of events + // (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody + // level). + // - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for + // write requests (create, update, patch). + // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response + // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. + // + // Warning: It is not recommended to disable audit logging by using the `None` profile unless you + // are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. + // If you disable audit logging and a support situation arises, you might need to enable audit logging + // and reproduce the issue in order to troubleshoot properly. + // + // If unset, the 'Default' profile is used as the default. + // + // +kubebuilder:default=Default + Profile AuditProfileType `json:"profile,omitempty"` + // customRules specify profiles per group. These profile take precedence over the + // top-level profile field if they apply. They are evaluation from top to bottom and + // the first one that matches, applies. + // +listType=map + // +listMapKey=group + // +optional + CustomRules []AuditCustomRule `json:"customRules,omitempty"` +} + +// AuditCustomRule describes a custom rule for an audit profile that takes precedence over +// the top-level profile. +type AuditCustomRule struct { + // group is a name of group a request user must be member of in order to this profile to apply. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +required + Group string `json:"group"` + // profile specifies the name of the desired audit policy configuration to be deployed to + // all OpenShift-provided API servers in the cluster. + // + // The following profiles are provided: + // - Default: the existing default policy. + // - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for + // write requests (create, update, patch). + // - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response + // HTTP payloads for read requests (get, list). + // - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens. + // + // If unset, the 'Default' profile is used as the default. + // + // +kubebuilder:validation:Required + // +required + Profile AuditProfileType `json:"profile,omitempty"` +} + +type APIServerServingCerts struct { + // namedCertificates references secrets containing the TLS cert info for serving secure traffic to specific hostnames. + // If no named certificates are provided, or no named certificates match the server name as understood by a client, + // the defaultServingCertificate will be used. + // +optional + NamedCertificates []APIServerNamedServingCert `json:"namedCertificates,omitempty"` +} + +// APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate. +type APIServerNamedServingCert struct { + // names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to + // serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. + // Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names. + // +optional + Names []string `json:"names,omitempty"` + // servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. + // The secret must exist in the openshift-config namespace and contain the following required fields: + // - Secret.Data["tls.key"] - TLS private key. + // - Secret.Data["tls.crt"] - TLS certificate. + ServingCertificate SecretNameReference `json:"servingCertificate"` +} + +type APIServerEncryption struct { + // type defines what encryption type should be used to encrypt resources at the datastore layer. + // When this field is unset (i.e. when it is set to the empty string), identity is implied. + // The behavior of unset can and will change over time. Even if encryption is enabled by default, + // the meaning of unset may change to a different encryption type based on changes in best practices. + // + // When encryption is enabled, all sensitive resources shipped with the platform are encrypted. + // This list of sensitive resources can and will change over time. The current authoritative list is: + // + // 1. secrets + // 2. configmaps + // 3. routes.route.openshift.io + // 4. oauthaccesstokens.oauth.openshift.io + // 5. oauthauthorizetokens.oauth.openshift.io + // + // +unionDiscriminator + // +optional + Type EncryptionType `json:"type,omitempty"` +} + +// +kubebuilder:validation:Enum="";identity;aescbc;aesgcm +type EncryptionType string + +const ( + // identity refers to a type where no encryption is performed at the datastore layer. + // Resources are written as-is without encryption. + EncryptionTypeIdentity EncryptionType = "identity" + + // aescbc refers to a type where AES-CBC with PKCS#7 padding and a 32-byte key + // is used to perform encryption at the datastore layer. + EncryptionTypeAESCBC EncryptionType = "aescbc" + + // aesgcm refers to a type where AES-GCM with random nonce and a 32-byte key + // is used to perform encryption at the datastore layer. + EncryptionTypeAESGCM EncryptionType = "aesgcm" +) + +type APIServerStatus struct { +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type APIServerList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + Items []APIServer `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_authentication.go b/vendor/github.com/openshift/api/config/v1/types_authentication.go new file mode 100644 index 00000000..dd2ef6e0 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_authentication.go @@ -0,0 +1,161 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Authentication specifies cluster-wide settings for authentication (like OAuth and +// webhook token authenticators). The canonical name of an instance is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Authentication struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec AuthenticationSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status AuthenticationStatus `json:"status"` +} + +type AuthenticationSpec struct { + // type identifies the cluster managed, user facing authentication mode in use. + // Specifically, it manages the component that responds to login attempts. + // The default is IntegratedOAuth. + // +optional + Type AuthenticationType `json:"type"` + + // oauthMetadata contains the discovery endpoint data for OAuth 2.0 + // Authorization Server Metadata for an external OAuth server. + // This discovery document can be viewed from its served location: + // oc get --raw '/.well-known/oauth-authorization-server' + // For further details, see the IETF Draft: + // https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 + // If oauthMetadata.name is non-empty, this value has precedence + // over any metadata reference stored in status. + // The key "oauthMetadata" is used to locate the data. + // If specified and the config map or expected key is not found, no metadata is served. + // If the specified metadata is not valid, no metadata is served. + // The namespace for this config map is openshift-config. + // +optional + OAuthMetadata ConfigMapNameReference `json:"oauthMetadata"` + + // webhookTokenAuthenticators is DEPRECATED, setting it has no effect. + WebhookTokenAuthenticators []DeprecatedWebhookTokenAuthenticator `json:"webhookTokenAuthenticators,omitempty"` + + // webhookTokenAuthenticator configures a remote token reviewer. + // These remote authentication webhooks can be used to verify bearer tokens + // via the tokenreviews.authentication.k8s.io REST API. This is required to + // honor bearer tokens that are provisioned by an external authentication service. + // +optional + WebhookTokenAuthenticator *WebhookTokenAuthenticator `json:"webhookTokenAuthenticator,omitempty"` + + // serviceAccountIssuer is the identifier of the bound service account token + // issuer. + // The default is https://kubernetes.default.svc + // WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the + // previous issuer value. Instead, the tokens issued by previous service account issuer will continue to + // be trusted for a time period chosen by the platform (currently set to 24h). + // This time period is subject to change over time. + // This allows internal components to transition to use new service account issuer without service distruption. + // +optional + ServiceAccountIssuer string `json:"serviceAccountIssuer"` +} + +type AuthenticationStatus struct { + // integratedOAuthMetadata contains the discovery endpoint data for OAuth 2.0 + // Authorization Server Metadata for the in-cluster integrated OAuth server. + // This discovery document can be viewed from its served location: + // oc get --raw '/.well-known/oauth-authorization-server' + // For further details, see the IETF Draft: + // https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 + // This contains the observed value based on cluster state. + // An explicitly set value in spec.oauthMetadata has precedence over this field. + // This field has no meaning if authentication spec.type is not set to IntegratedOAuth. + // The key "oauthMetadata" is used to locate the data. + // If the config map or expected key is not found, no metadata is served. + // If the specified metadata is not valid, no metadata is served. + // The namespace for this config map is openshift-config-managed. + IntegratedOAuthMetadata ConfigMapNameReference `json:"integratedOAuthMetadata"` + + // TODO if we add support for an in-cluster operator managed Keycloak instance + // KeycloakOAuthMetadata ConfigMapNameReference `json:"keycloakOAuthMetadata"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type AuthenticationList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Authentication `json:"items"` +} + +type AuthenticationType string + +const ( + // None means that no cluster managed authentication system is in place. + // Note that user login will only work if a manually configured system is in place and + // referenced in authentication spec via oauthMetadata and webhookTokenAuthenticators. + AuthenticationTypeNone AuthenticationType = "None" + + // IntegratedOAuth refers to the cluster managed OAuth server. + // It is configured via the top level OAuth config. + AuthenticationTypeIntegratedOAuth AuthenticationType = "IntegratedOAuth" + + // TODO if we add support for an in-cluster operator managed Keycloak instance + // AuthenticationTypeKeycloak AuthenticationType = "Keycloak" +) + +// deprecatedWebhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator. +// It's the same as WebhookTokenAuthenticator but it's missing the 'required' validation on KubeConfig field. +type DeprecatedWebhookTokenAuthenticator struct { + // kubeConfig contains kube config file data which describes how to access the remote webhook service. + // For further details, see: + // https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication + // The key "kubeConfig" is used to locate the data. + // If the secret or expected key is not found, the webhook is not honored. + // If the specified kube config data is not valid, the webhook is not honored. + // The namespace for this secret is determined by the point of use. + KubeConfig SecretNameReference `json:"kubeConfig"` +} + +// webhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator +type WebhookTokenAuthenticator struct { + // kubeConfig references a secret that contains kube config file data which + // describes how to access the remote webhook service. + // The namespace for the referenced secret is openshift-config. + // + // For further details, see: + // + // https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication + // + // The key "kubeConfig" is used to locate the data. + // If the secret or expected key is not found, the webhook is not honored. + // If the specified kube config data is not valid, the webhook is not honored. + // +kubebuilder:validation:Required + // +required + KubeConfig SecretNameReference `json:"kubeConfig"` +} + +const ( + // OAuthMetadataKey is the key for the oauth authorization server metadata + OAuthMetadataKey = "oauthMetadata" + + // KubeConfigKey is the key for the kube config file data in a secret + KubeConfigKey = "kubeConfig" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_build.go b/vendor/github.com/openshift/api/config/v1/types_build.go new file mode 100644 index 00000000..e9aef037 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_build.go @@ -0,0 +1,127 @@ +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Build configures the behavior of OpenShift builds for the entire cluster. +// This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds. +// +// The canonical name is "cluster" +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Build struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec holds user-settable values for the build controller configuration + // +kubebuilder:validation:Required + // +required + Spec BuildSpec `json:"spec"` +} + +type BuildSpec struct { + // AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that + // should be trusted for image pushes and pulls during builds. + // The namespace for this config map is openshift-config. + // + // DEPRECATED: Additional CAs for image pull and push should be set on + // image.config.openshift.io/cluster instead. + // + // +optional + AdditionalTrustedCA ConfigMapNameReference `json:"additionalTrustedCA"` + // BuildDefaults controls the default information for Builds + // +optional + BuildDefaults BuildDefaults `json:"buildDefaults"` + // BuildOverrides controls override settings for builds + // +optional + BuildOverrides BuildOverrides `json:"buildOverrides"` +} + +type BuildDefaults struct { + // DefaultProxy contains the default proxy settings for all build operations, including image pull/push + // and source download. + // + // Values can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables + // in the build config's strategy. + // +optional + DefaultProxy *ProxySpec `json:"defaultProxy,omitempty"` + + // GitProxy contains the proxy settings for git operations only. If set, this will override + // any Proxy settings for all git commands, such as git clone. + // + // Values that are not set here will be inherited from DefaultProxy. + // +optional + GitProxy *ProxySpec `json:"gitProxy,omitempty"` + + // Env is a set of default environment variables that will be applied to the + // build if the specified variables do not exist on the build + // +optional + Env []corev1.EnvVar `json:"env,omitempty"` + + // ImageLabels is a list of docker labels that are applied to the resulting image. + // User can override a default label by providing a label with the same name in their + // Build/BuildConfig. + // +optional + ImageLabels []ImageLabel `json:"imageLabels,omitempty"` + + // Resources defines resource requirements to execute the build. + // +optional + Resources corev1.ResourceRequirements `json:"resources"` +} + +type ImageLabel struct { + // Name defines the name of the label. It must have non-zero length. + Name string `json:"name"` + + // Value defines the literal value of the label. + // +optional + Value string `json:"value,omitempty"` +} + +type BuildOverrides struct { + // ImageLabels is a list of docker labels that are applied to the resulting image. + // If user provided a label in their Build/BuildConfig with the same name as one in this + // list, the user's label will be overwritten. + // +optional + ImageLabels []ImageLabel `json:"imageLabels,omitempty"` + + // NodeSelector is a selector which must be true for the build pod to fit on a node + // +optional + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + + // Tolerations is a list of Tolerations that will override any existing + // tolerations set on a build pod. + // +optional + Tolerations []corev1.Toleration `json:"tolerations,omitempty"` + + // ForcePull overrides, if set, the equivalent value in the builds, + // i.e. false disables force pull for all builds, + // true enables force pull for all builds, + // independently of what each build specifies itself + // +optional + ForcePull *bool `json:"forcePull,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type BuildList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Build `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go new file mode 100644 index 00000000..78666bb1 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_operator.go @@ -0,0 +1,216 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterOperator is the Custom Resource object which holds the current state +// of an operator. This object is used by operators to convey their state to +// the rest of the cluster. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ClusterOperator struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata"` + + // spec holds configuration that could apply to any operator. + // +kubebuilder:validation:Required + // +required + Spec ClusterOperatorSpec `json:"spec"` + + // status holds the information about the state of an operator. It is consistent with status information across + // the Kubernetes ecosystem. + // +optional + Status ClusterOperatorStatus `json:"status"` +} + +// ClusterOperatorSpec is empty for now, but you could imagine holding information like "pause". +type ClusterOperatorSpec struct { +} + +// ClusterOperatorStatus provides information about the status of the operator. +// +k8s:deepcopy-gen=true +type ClusterOperatorStatus struct { + // conditions describes the state of the operator's managed and monitored components. + // +patchMergeKey=type + // +patchStrategy=merge + // +optional + Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"` + + // versions is a slice of operator and operand version tuples. Operators which manage multiple operands will have multiple + // operand entries in the array. Available operators must report the version of the operator itself with the name "operator". + // An operator reports a new "operator" version when it has rolled out the new version to all of its operands. + // +optional + Versions []OperandVersion `json:"versions,omitempty"` + + // relatedObjects is a list of objects that are "interesting" or related to this operator. Common uses are: + // 1. the detailed resource driving the operator + // 2. operator namespaces + // 3. operand namespaces + // +optional + RelatedObjects []ObjectReference `json:"relatedObjects,omitempty"` + + // extension contains any additional status information specific to the + // operator which owns this status object. + // +nullable + // +optional + // +kubebuilder:pruning:PreserveUnknownFields + Extension runtime.RawExtension `json:"extension"` +} + +type OperandVersion struct { + // name is the name of the particular operand this version is for. It usually matches container images, not operators. + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` + + // version indicates which version of a particular operand is currently being managed. It must always match the Available + // operand. If 1.0.0 is Available, then this must indicate 1.0.0 even if the operator is trying to rollout + // 1.1.0 + // +kubebuilder:validation:Required + // +required + Version string `json:"version"` +} + +// ObjectReference contains enough information to let you inspect or modify the referred object. +type ObjectReference struct { + // group of the referent. + // +kubebuilder:validation:Required + // +required + Group string `json:"group"` + // resource of the referent. + // +kubebuilder:validation:Required + // +required + Resource string `json:"resource"` + // namespace of the referent. + // +optional + Namespace string `json:"namespace,omitempty"` + // name of the referent. + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` +} + +type ConditionStatus string + +// These are valid condition statuses. "ConditionTrue" means a resource is in the condition. +// "ConditionFalse" means a resource is not in the condition. "ConditionUnknown" means kubernetes +// can't decide if a resource is in the condition or not. In the future, we could add other +// intermediate conditions, e.g. ConditionDegraded. +const ( + ConditionTrue ConditionStatus = "True" + ConditionFalse ConditionStatus = "False" + ConditionUnknown ConditionStatus = "Unknown" +) + +// ClusterOperatorStatusCondition represents the state of the operator's +// managed and monitored components. +// +k8s:deepcopy-gen=true +type ClusterOperatorStatusCondition struct { + // type specifies the aspect reported by this condition. + // +kubebuilder:validation:Required + // +required + Type ClusterStatusConditionType `json:"type"` + + // status of the condition, one of True, False, Unknown. + // +kubebuilder:validation:Required + // +required + Status ConditionStatus `json:"status"` + + // lastTransitionTime is the time of the last update to the current status property. + // +kubebuilder:validation:Required + // +required + LastTransitionTime metav1.Time `json:"lastTransitionTime"` + + // reason is the CamelCase reason for the condition's current status. + // +optional + Reason string `json:"reason,omitempty"` + + // message provides additional information about the current condition. + // This is only to be consumed by humans. It may contain Line Feed + // characters (U+000A), which should be rendered as new lines. + // +optional + Message string `json:"message,omitempty"` +} + +// ClusterStatusConditionType is an aspect of operator state. +type ClusterStatusConditionType string + +const ( + // Available indicates that the component (operator and all configured operands) + // is functional and available in the cluster. Available=False means at least + // part of the component is non-functional, and that the condition requires + // immediate administrator intervention. + OperatorAvailable ClusterStatusConditionType = "Available" + + // Progressing indicates that the component (operator and all configured operands) + // is actively rolling out new code, propagating config changes, or otherwise + // moving from one steady state to another. Operators should not report + // progressing when they are reconciling (without action) a previously known + // state. If the observed cluster state has changed and the component is + // reacting to it (scaling up for instance), Progressing should become true + // since it is moving from one steady state to another. + OperatorProgressing ClusterStatusConditionType = "Progressing" + + // Degraded indicates that the component (operator and all configured operands) + // does not match its desired state over a period of time resulting in a lower + // quality of service. The period of time may vary by component, but a Degraded + // state represents persistent observation of a condition. As a result, a + // component should not oscillate in and out of Degraded state. A component may + // be Available even if its degraded. For example, a component may desire 3 + // running pods, but 1 pod is crash-looping. The component is Available but + // Degraded because it may have a lower quality of service. A component may be + // Progressing but not Degraded because the transition from one state to + // another does not persist over a long enough period to report Degraded. A + // component should not report Degraded during the course of a normal upgrade. + // A component may report Degraded in response to a persistent infrastructure + // failure that requires eventual administrator intervention. For example, if + // a control plane host is unhealthy and must be replaced. A component should + // report Degraded if unexpected errors occur over a period, but the + // expectation is that all unexpected errors are handled as operators mature. + OperatorDegraded ClusterStatusConditionType = "Degraded" + + // Upgradeable indicates whether the component (operator and all configured + // operands) is safe to upgrade based on the current cluster state. When + // Upgradeable is False, the cluster-version operator will prevent the + // cluster from performing impacted updates unless forced. When set on + // ClusterVersion, the message will explain which updates (minor or patch) + // are impacted. When set on ClusterOperator, False will block minor + // OpenShift updates. The message field should contain a human readable + // description of what the administrator should do to allow the cluster or + // component to successfully update. The cluster-version operator will + // allow updates when this condition is not False, including when it is + // missing, True, or Unknown. + OperatorUpgradeable ClusterStatusConditionType = "Upgradeable" + + // EvaluationConditionsDetected is used to indicate the result of the detection + // logic that was added to a component to evaluate the introduction of an + // invasive change that could potentially result in highly visible alerts, + // breakages or upgrade failures. You can concatenate multiple Reason using + // the "::" delimiter if you need to evaluate the introduction of multiple changes. + EvaluationConditionsDetected ClusterStatusConditionType = "EvaluationConditionsDetected" +) + +// ClusterOperatorList is a list of OperatorStatus resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 +type ClusterOperatorList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ClusterOperator `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_cluster_version.go b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go new file mode 100644 index 00000000..8126626c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_cluster_version.go @@ -0,0 +1,650 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ClusterVersion is the configuration for the ClusterVersionOperator. This is where +// parameters related to automatic updates can be set. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ClusterVersion struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec is the desired state of the cluster version - the operator will work + // to ensure that the desired version is applied to the cluster. + // +kubebuilder:validation:Required + // +required + Spec ClusterVersionSpec `json:"spec"` + // status contains information about the available updates and any in-progress + // updates. + // +optional + Status ClusterVersionStatus `json:"status"` +} + +// ClusterVersionSpec is the desired version state of the cluster. It includes +// the version the cluster should be at, how the cluster is identified, and +// where the cluster should look for version updates. +// +k8s:deepcopy-gen=true +type ClusterVersionSpec struct { + // clusterID uniquely identifies this cluster. This is expected to be + // an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in + // hexadecimal values). This is a required field. + // +kubebuilder:validation:Required + // +required + ClusterID ClusterID `json:"clusterID"` + + // desiredUpdate is an optional field that indicates the desired value of + // the cluster version. Setting this value will trigger an upgrade (if + // the current version does not match the desired version). The set of + // recommended update values is listed as part of available updates in + // status, and setting values outside that range may cause the upgrade + // to fail. + // + // Some of the fields are inter-related with restrictions and meanings described here. + // 1. image is specified, version is specified, architecture is specified. API validation error. + // 2. image is specified, version is specified, architecture is not specified. You should not do this. version is silently ignored and image is used. + // 3. image is specified, version is not specified, architecture is specified. API validation error. + // 4. image is specified, version is not specified, architecture is not specified. image is used. + // 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. + // 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. + // 7. image is not specified, version is not specified, architecture is specified. API validation error. + // 8. image is not specified, version is not specified, architecture is not specified. API validation error. + // + // If an upgrade fails the operator will halt and report status + // about the failing component. Setting the desired update value back to + // the previous version will cause a rollback to be attempted. Not all + // rollbacks will succeed. + // + // +optional + DesiredUpdate *Update `json:"desiredUpdate,omitempty"` + + // upstream may be used to specify the preferred update server. By default + // it will use the appropriate update server for the cluster and region. + // + // +optional + Upstream URL `json:"upstream,omitempty"` + // channel is an identifier for explicitly requesting that a non-default + // set of updates be applied to this cluster. The default channel will be + // contain stable updates that are appropriate for production clusters. + // + // +optional + Channel string `json:"channel,omitempty"` + + // capabilities configures the installation of optional, core + // cluster components. A null value here is identical to an + // empty object; see the child properties for default semantics. + // +optional + Capabilities *ClusterVersionCapabilitiesSpec `json:"capabilities,omitempty"` + + // overrides is list of overides for components that are managed by + // cluster version operator. Marking a component unmanaged will prevent + // the operator from creating or updating the object. + // +optional + Overrides []ComponentOverride `json:"overrides,omitempty"` +} + +// ClusterVersionStatus reports the status of the cluster versioning, +// including any upgrades that are in progress. The current field will +// be set to whichever version the cluster is reconciling to, and the +// conditions array will report whether the update succeeded, is in +// progress, or is failing. +// +k8s:deepcopy-gen=true +type ClusterVersionStatus struct { + // desired is the version that the cluster is reconciling towards. + // If the cluster is not yet fully initialized desired will be set + // with the information available, which may be an image or a tag. + // +kubebuilder:validation:Required + // +required + Desired Release `json:"desired"` + + // history contains a list of the most recent versions applied to the cluster. + // This value may be empty during cluster startup, and then will be updated + // when a new update is being applied. The newest update is first in the + // list and it is ordered by recency. Updates in the history have state + // Completed if the rollout completed - if an update was failing or halfway + // applied the state will be Partial. Only a limited amount of update history + // is preserved. + // +optional + History []UpdateHistory `json:"history,omitempty"` + + // observedGeneration reports which version of the spec is being synced. + // If this value is not equal to metadata.generation, then the desired + // and conditions fields may represent a previous version. + // +kubebuilder:validation:Required + // +required + ObservedGeneration int64 `json:"observedGeneration"` + + // versionHash is a fingerprint of the content that the cluster will be + // updated with. It is used by the operator to avoid unnecessary work + // and is for internal use only. + // +kubebuilder:validation:Required + // +required + VersionHash string `json:"versionHash"` + + // capabilities describes the state of optional, core cluster components. + Capabilities ClusterVersionCapabilitiesStatus `json:"capabilities"` + + // conditions provides information about the cluster version. The condition + // "Available" is set to true if the desiredUpdate has been reached. The + // condition "Progressing" is set to true if an update is being applied. + // The condition "Degraded" is set to true if an update is currently blocked + // by a temporary or permanent error. Conditions are only valid for the + // current desiredUpdate when metadata.generation is equal to + // status.generation. + // +optional + Conditions []ClusterOperatorStatusCondition `json:"conditions,omitempty"` + + // availableUpdates contains updates recommended for this + // cluster. Updates which appear in conditionalUpdates but not in + // availableUpdates may expose this cluster to known issues. This list + // may be empty if no updates are recommended, if the update service + // is unavailable, or if an invalid channel has been specified. + // +nullable + // +kubebuilder:validation:Required + // +required + AvailableUpdates []Release `json:"availableUpdates"` + + // conditionalUpdates contains the list of updates that may be + // recommended for this cluster if it meets specific required + // conditions. Consumers interested in the set of updates that are + // actually recommended for this cluster should use + // availableUpdates. This list may be empty if no updates are + // recommended, if the update service is unavailable, or if an empty + // or invalid channel has been specified. + // +listType=atomic + // +optional + ConditionalUpdates []ConditionalUpdate `json:"conditionalUpdates,omitempty"` +} + +// UpdateState is a constant representing whether an update was successfully +// applied to the cluster or not. +type UpdateState string + +const ( + // CompletedUpdate indicates an update was successfully applied + // to the cluster (all resource updates were successful). + CompletedUpdate UpdateState = "Completed" + // PartialUpdate indicates an update was never completely applied + // or is currently being applied. + PartialUpdate UpdateState = "Partial" +) + +// UpdateHistory is a single attempted update to the cluster. +type UpdateHistory struct { + // state reflects whether the update was fully applied. The Partial state + // indicates the update is not fully applied, while the Completed state + // indicates the update was successfully rolled out at least once (all + // parts of the update successfully applied). + // +kubebuilder:validation:Required + // +required + State UpdateState `json:"state"` + + // startedTime is the time at which the update was started. + // +kubebuilder:validation:Required + // +required + StartedTime metav1.Time `json:"startedTime"` + + // completionTime, if set, is when the update was fully applied. The update + // that is currently being applied will have a null completion time. + // Completion time will always be set for entries that are not the current + // update (usually to the started time of the next update). + // +kubebuilder:validation:Required + // +required + // +nullable + CompletionTime *metav1.Time `json:"completionTime"` + + // version is a semantic version identifying the update version. If the + // requested image does not define a version, or if a failure occurs + // retrieving the image, this value may be empty. + // + // +optional + Version string `json:"version"` + + // image is a container image location that contains the update. This value + // is always populated. + // +kubebuilder:validation:Required + // +required + Image string `json:"image"` + + // verified indicates whether the provided update was properly verified + // before it was installed. If this is false the cluster may not be trusted. + // Verified does not cover upgradeable checks that depend on the cluster + // state at the time when the update target was accepted. + // +kubebuilder:validation:Required + // +required + Verified bool `json:"verified"` + + // acceptedRisks records risks which were accepted to initiate the update. + // For example, it may menition an Upgradeable=False or missing signature + // that was overriden via desiredUpdate.force, or an update that was + // initiated despite not being in the availableUpdates set of recommended + // update targets. + // +optional + AcceptedRisks string `json:"acceptedRisks,omitempty"` +} + +// ClusterID is string RFC4122 uuid. +type ClusterID string + +// ClusterVersionArchitecture enumerates valid cluster architectures. +// +kubebuilder:validation:Enum="Multi";"" +type ClusterVersionArchitecture string + +const ( + // ClusterVersionArchitectureMulti identifies a multi architecture. A multi + // architecture cluster is capable of running nodes with multiple architectures. + ClusterVersionArchitectureMulti ClusterVersionArchitecture = "Multi" +) + +// ClusterVersionCapability enumerates optional, core cluster components. +// +kubebuilder:validation:Enum=openshift-samples;baremetal;marketplace;Console;Insights;Storage;CSISnapshot;NodeTuning +type ClusterVersionCapability string + +const ( + // ClusterVersionCapabilityOpenShiftSamples manages the sample + // image streams and templates stored in the openshift + // namespace, and any registry credentials, stored as a secret, + // needed for the image streams to import the images they + // reference. + ClusterVersionCapabilityOpenShiftSamples ClusterVersionCapability = "openshift-samples" + + // ClusterVersionCapabilityBaremetal manages the cluster + // baremetal operator which is responsible for running the metal3 + // deployment. + ClusterVersionCapabilityBaremetal ClusterVersionCapability = "baremetal" + + // ClusterVersionCapabilityMarketplace manages the Marketplace operator which + // supplies Operator Lifecycle Manager (OLM) users with default catalogs of + // "optional" operators. + ClusterVersionCapabilityMarketplace ClusterVersionCapability = "marketplace" + + // ClusterVersionCapabilityConsole manages the Console operator which + // installs and maintains the web console. + ClusterVersionCapabilityConsole ClusterVersionCapability = "Console" + + // ClusterVersionCapabilityInsights manages the Insights operator which + // collects anonymized information about the cluster to generate + // recommendations for possible cluster issues. + ClusterVersionCapabilityInsights ClusterVersionCapability = "Insights" + + // ClusterVersionCapabilityStorage manages the storage operator which + // is responsible for providing cluster-wide storage defaults + // WARNING: Do not disable this capability when deployed to + // RHEV and OpenStack without reading the docs. + // These clusters heavily rely on that capability and may cause + // damage to the cluster. + ClusterVersionCapabilityStorage ClusterVersionCapability = "Storage" + + // ClusterVersionCapabilityCSISnapshot manages the csi snapshot + // controller operator which is responsible for watching the + // VolumeSnapshot CRD objects and manages the creation and deletion + // lifecycle of volume snapshots + ClusterVersionCapabilityCSISnapshot ClusterVersionCapability = "CSISnapshot" + + // ClusterVersionCapabilityNodeTuning manages the Node Tuning Operator + // which is responsible for watching the Tuned and Profile CRD + // objects and manages the containerized TuneD daemon which controls + // system level tuning of Nodes + ClusterVersionCapabilityNodeTuning ClusterVersionCapability = "NodeTuning" +) + +// KnownClusterVersionCapabilities includes all known optional, core cluster components. +var KnownClusterVersionCapabilities = []ClusterVersionCapability{ + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, +} + +// ClusterVersionCapabilitySet defines sets of cluster version capabilities. +// +kubebuilder:validation:Enum=None;v4.11;v4.12;v4.13;vCurrent +type ClusterVersionCapabilitySet string + +const ( + // ClusterVersionCapabilitySetNone is an empty set enabling + // no optional capabilities. + ClusterVersionCapabilitySetNone ClusterVersionCapabilitySet = "None" + + // ClusterVersionCapabilitySet4_11 is the recommended set of + // optional capabilities to enable for the 4.11 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_11 ClusterVersionCapabilitySet = "v4.11" + + // ClusterVersionCapabilitySet4_12 is the recommended set of + // optional capabilities to enable for the 4.12 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_12 ClusterVersionCapabilitySet = "v4.12" + + // ClusterVersionCapabilitySet4_13 is the recommended set of + // optional capabilities to enable for the 4.13 version of + // OpenShift. This list will remain the same no matter which + // version of OpenShift is installed. + ClusterVersionCapabilitySet4_13 ClusterVersionCapabilitySet = "v4.13" + + // ClusterVersionCapabilitySetCurrent is the recommended set + // of optional capabilities to enable for the cluster's + // current version of OpenShift. + ClusterVersionCapabilitySetCurrent ClusterVersionCapabilitySet = "vCurrent" +) + +// ClusterVersionCapabilitySets defines sets of cluster version capabilities. +var ClusterVersionCapabilitySets = map[ClusterVersionCapabilitySet][]ClusterVersionCapability{ + ClusterVersionCapabilitySetNone: {}, + ClusterVersionCapabilitySet4_11: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityOpenShiftSamples, + }, + ClusterVersionCapabilitySet4_12: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + }, + ClusterVersionCapabilitySet4_13: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + }, + ClusterVersionCapabilitySetCurrent: { + ClusterVersionCapabilityBaremetal, + ClusterVersionCapabilityConsole, + ClusterVersionCapabilityInsights, + ClusterVersionCapabilityMarketplace, + ClusterVersionCapabilityStorage, + ClusterVersionCapabilityOpenShiftSamples, + ClusterVersionCapabilityCSISnapshot, + ClusterVersionCapabilityNodeTuning, + }, +} + +// ClusterVersionCapabilitiesSpec selects the managed set of +// optional, core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesSpec struct { + // baselineCapabilitySet selects an initial set of + // optional capabilities to enable, which can be extended via + // additionalEnabledCapabilities. If unset, the cluster will + // choose a default, and the default may change over time. + // The current default is vCurrent. + // +optional + BaselineCapabilitySet ClusterVersionCapabilitySet `json:"baselineCapabilitySet,omitempty"` + + // additionalEnabledCapabilities extends the set of managed + // capabilities beyond the baseline defined in + // baselineCapabilitySet. The default is an empty set. + // +listType=atomic + // +optional + AdditionalEnabledCapabilities []ClusterVersionCapability `json:"additionalEnabledCapabilities,omitempty"` +} + +// ClusterVersionCapabilitiesStatus describes the state of optional, +// core cluster components. +// +k8s:deepcopy-gen=true +type ClusterVersionCapabilitiesStatus struct { + // enabledCapabilities lists all the capabilities that are currently managed. + // +listType=atomic + // +optional + EnabledCapabilities []ClusterVersionCapability `json:"enabledCapabilities,omitempty"` + + // knownCapabilities lists all the capabilities known to the current cluster. + // +listType=atomic + // +optional + KnownCapabilities []ClusterVersionCapability `json:"knownCapabilities,omitempty"` +} + +// ComponentOverride allows overriding cluster version operator's behavior +// for a component. +// +k8s:deepcopy-gen=true +type ComponentOverride struct { + // kind indentifies which object to override. + // +kubebuilder:validation:Required + // +required + Kind string `json:"kind"` + // group identifies the API group that the kind is in. + // +kubebuilder:validation:Required + // +required + Group string `json:"group"` + + // namespace is the component's namespace. If the resource is cluster + // scoped, the namespace should be empty. + // +kubebuilder:validation:Required + // +required + Namespace string `json:"namespace"` + // name is the component's name. + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` + + // unmanaged controls if cluster version operator should stop managing the + // resources in this cluster. + // Default: false + // +kubebuilder:validation:Required + // +required + Unmanaged bool `json:"unmanaged"` +} + +// URL is a thin wrapper around string that ensures the string is a valid URL. +type URL string + +// Update represents an administrator update request. +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && has(self.image) ? (self.architecture == '' || self.image == '') : true",message="cannot set both Architecture and Image" +// +kubebuilder:validation:XValidation:rule="has(self.architecture) && self.architecture != '' ? self.version != '' : true",message="Version must be set if Architecture is set" +// +k8s:deepcopy-gen=true +type Update struct { + // architecture is an optional field that indicates the desired + // value of the cluster architecture. In this context cluster + // architecture means either a single architecture or a multi + // architecture. architecture can only be set to Multi thereby + // only allowing updates from single to multi architecture. If + // architecture is set, image cannot be set and version must be + // set. + // Valid values are 'Multi' and empty. + // + // +optional + Architecture ClusterVersionArchitecture `json:"architecture"` + + // version is a semantic version identifying the update version. + // version is ignored if image is specified and required if + // architecture is specified. + // + // +optional + Version string `json:"version"` + + // image is a container image location that contains the update. + // image should be used when the desired version does not exist in availableUpdates or history. + // When image is set, version is ignored. When image is set, version should be empty. + // When image is set, architecture cannot be specified. + // + // +optional + Image string `json:"image"` + + // force allows an administrator to update to an image that has failed + // verification or upgradeable checks. This option should only + // be used when the authenticity of the provided image has been verified out + // of band because the provided image will run with full administrative access + // to the cluster. Do not use this flag with images that comes from unknown + // or potentially malicious sources. + // + // +optional + Force bool `json:"force"` +} + +// Release represents an OpenShift release image and associated metadata. +// +k8s:deepcopy-gen=true +type Release struct { + // version is a semantic version identifying the update version. When this + // field is part of spec, version is optional if image is specified. + // +required + Version string `json:"version"` + + // image is a container image location that contains the update. When this + // field is part of spec, image is optional if version is specified and the + // availableUpdates field contains a matching version. + // +required + Image string `json:"image"` + + // url contains information about this release. This URL is set by + // the 'url' metadata property on a release or the metadata returned by + // the update API and should be displayed as a link in user + // interfaces. The URL field may not be set for test or nightly + // releases. + // +optional + URL URL `json:"url,omitempty"` + + // channels is the set of Cincinnati channels to which the release + // currently belongs. + // +optional + Channels []string `json:"channels,omitempty"` +} + +// RetrievedUpdates reports whether available updates have been retrieved from +// the upstream update server. The condition is Unknown before retrieval, False +// if the updates could not be retrieved or recently failed, or True if the +// availableUpdates field is accurate and recent. +const RetrievedUpdates ClusterStatusConditionType = "RetrievedUpdates" + +// ConditionalUpdate represents an update which is recommended to some +// clusters on the version the current cluster is reconciling, but which +// may not be recommended for the current cluster. +type ConditionalUpdate struct { + // release is the target of the update. + // +kubebuilder:validation:Required + // +required + Release Release `json:"release"` + + // risks represents the range of issues associated with + // updating to the target release. The cluster-version + // operator will evaluate all entries, and only recommend the + // update if there is at least one entry and all entries + // recommend the update. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + // +patchMergeKey=name + // +patchStrategy=merge + // +listType=map + // +listMapKey=name + // +required + Risks []ConditionalUpdateRisk `json:"risks" patchStrategy:"merge" patchMergeKey:"name"` + + // conditions represents the observations of the conditional update's + // current status. Known types are: + // * Evaluating, for whether the cluster-version operator will attempt to evaluate any risks[].matchingRules. + // * Recommended, for whether the update is recommended for the current cluster. + // +patchMergeKey=type + // +patchStrategy=merge + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` +} + +// ConditionalUpdateRisk represents a reason and cluster-state +// for not recommending a conditional update. +// +k8s:deepcopy-gen=true +type ConditionalUpdateRisk struct { + // url contains information about this risk. + // +kubebuilder:validation:Required + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:MinLength=1 + // +required + URL string `json:"url"` + + // name is the CamelCase reason for not recommending a + // conditional update, in the event that matchingRules match the + // cluster state. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +required + Name string `json:"name"` + + // message provides additional information about the risk of + // updating, in the event that matchingRules match the cluster + // state. This is only to be consumed by humans. It may + // contain Line Feed characters (U+000A), which should be + // rendered as new lines. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +required + Message string `json:"message"` + + // matchingRules is a slice of conditions for deciding which + // clusters match the risk and which do not. The slice is + // ordered by decreasing precedence. The cluster-version + // operator will walk the slice in order, and stop after the + // first it can successfully evaluate. If no condition can be + // successfully evaluated, the update will not be recommended. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + // +listType=atomic + // +required + MatchingRules []ClusterCondition `json:"matchingRules"` +} + +// ClusterCondition is a union of typed cluster conditions. The 'type' +// property determines which of the type-specific properties are relevant. +// When evaluated on a cluster, the condition may match, not match, or +// fail to evaluate. +// +k8s:deepcopy-gen=true +type ClusterCondition struct { + // type represents the cluster-condition type. This defines + // the members and semantics of any additional properties. + // +kubebuilder:validation:Required + // +kubebuilder:validation:Enum={"Always","PromQL"} + // +required + Type string `json:"type"` + + // promQL represents a cluster condition based on PromQL. + // +optional + PromQL *PromQLClusterCondition `json:"promql,omitempty"` +} + +// PromQLClusterCondition represents a cluster condition based on PromQL. +type PromQLClusterCondition struct { + // PromQL is a PromQL query classifying clusters. This query + // query should return a 1 in the match case and a 0 in the + // does-not-match case. Queries which return no time + // series, or which return values besides 0 or 1, are + // evaluation failures. + // +kubebuilder:validation:Required + // +required + PromQL string `json:"promql"` +} + +// ClusterVersionList is a list of ClusterVersion resources. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 +type ClusterVersionList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ClusterVersion `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_console.go b/vendor/github.com/openshift/api/config/v1/types_console.go new file mode 100644 index 00000000..92818184 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_console.go @@ -0,0 +1,75 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Console holds cluster-wide configuration for the web console, including the +// logout URL, and reports the public URL of the console. The canonical name is +// `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Console struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ConsoleSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status ConsoleStatus `json:"status"` +} + +// ConsoleSpec is the specification of the desired behavior of the Console. +type ConsoleSpec struct { + // +optional + Authentication ConsoleAuthentication `json:"authentication"` +} + +// ConsoleStatus defines the observed status of the Console. +type ConsoleStatus struct { + // The URL for the console. This will be derived from the host for the route that + // is created for the console. + ConsoleURL string `json:"consoleURL"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ConsoleList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Console `json:"items"` +} + +// ConsoleAuthentication defines a list of optional configuration for console authentication. +type ConsoleAuthentication struct { + // An optional, absolute URL to redirect web browsers to after logging out of + // the console. If not specified, it will redirect to the default login page. + // This is required when using an identity provider that supports single + // sign-on (SSO) such as: + // - OpenID (Keycloak, Azure) + // - RequestHeader (GSSAPI, SSPI, SAML) + // - OAuth (GitHub, GitLab, Google) + // Logging out of the console will destroy the user's token. The logoutRedirect + // provides the user the option to perform single logout (SLO) through the identity + // provider to destroy their single sign-on session. + // +optional + // +kubebuilder:validation:Pattern=`^$|^((https):\/\/?)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))$` + LogoutRedirect string `json:"logoutRedirect,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_dns.go b/vendor/github.com/openshift/api/config/v1/types_dns.go new file mode 100644 index 00000000..6283a299 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_dns.go @@ -0,0 +1,98 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// DNS holds cluster-wide information about DNS. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type DNS struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec DNSSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status DNSStatus `json:"status"` +} + +type DNSSpec struct { + // baseDomain is the base domain of the cluster. All managed DNS records will + // be sub-domains of this base. + // + // For example, given the base domain `openshift.example.com`, an API server + // DNS record may be created for `cluster-api.openshift.example.com`. + // + // Once set, this field cannot be changed. + BaseDomain string `json:"baseDomain"` + // publicZone is the location where all the DNS records that are publicly accessible to + // the internet exist. + // + // If this field is nil, no public records should be created. + // + // Once set, this field cannot be changed. + // + // +optional + PublicZone *DNSZone `json:"publicZone,omitempty"` + // privateZone is the location where all the DNS records that are only available internally + // to the cluster exist. + // + // If this field is nil, no private records should be created. + // + // Once set, this field cannot be changed. + // + // +optional + PrivateZone *DNSZone `json:"privateZone,omitempty"` +} + +// DNSZone is used to define a DNS hosted zone. +// A zone can be identified by an ID or tags. +type DNSZone struct { + // id is the identifier that can be used to find the DNS hosted zone. + // + // on AWS zone can be fetched using `ID` as id in [1] + // on Azure zone can be fetched using `ID` as a pre-determined name in [2], + // on GCP zone can be fetched using `ID` as a pre-determined name in [3]. + // + // [1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options + // [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show + // [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get + // +optional + ID string `json:"id,omitempty"` + + // tags can be used to query the DNS hosted zone. + // + // on AWS, resourcegroupstaggingapi [1] can be used to fetch a zone using `Tags` as tag-filters, + // + // [1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options + // +optional + Tags map[string]string `json:"tags,omitempty"` +} + +type DNSStatus struct { + // dnsSuffix (service-ca amongst others) +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type DNSList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []DNS `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_feature.go b/vendor/github.com/openshift/api/config/v1/types_feature.go new file mode 100644 index 00000000..c2f8c47e --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_feature.go @@ -0,0 +1,283 @@ +package v1 + +import ( + "fmt" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Feature holds cluster-wide information about feature gates. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type FeatureGate struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec FeatureGateSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status FeatureGateStatus `json:"status"` +} + +type FeatureSet string + +var ( + // Default feature set that allows upgrades. + Default FeatureSet = "" + + // TechPreviewNoUpgrade turns on tech preview features that are not part of the normal supported platform. Turning + // this feature set on CANNOT BE UNDONE and PREVENTS UPGRADES. + TechPreviewNoUpgrade FeatureSet = "TechPreviewNoUpgrade" + + // CustomNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. + // Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations + // your cluster may fail in an unrecoverable way. + CustomNoUpgrade FeatureSet = "CustomNoUpgrade" + + // TopologyManager enables ToplogyManager support. Upgrades are enabled with this feature. + LatencySensitive FeatureSet = "LatencySensitive" +) + +type FeatureGateSpec struct { + FeatureGateSelection `json:",inline"` +} + +// +union +type FeatureGateSelection struct { + // featureSet changes the list of features in the cluster. The default is empty. Be very careful adjusting this setting. + // Turning on or off features may cause irreversible changes in your cluster which cannot be undone. + // +unionDiscriminator + // +optional + FeatureSet FeatureSet `json:"featureSet,omitempty"` + + // customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. + // Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations + // your cluster may fail in an unrecoverable way. featureSet must equal "CustomNoUpgrade" must be set to use this field. + // +optional + // +nullable + CustomNoUpgrade *CustomFeatureGates `json:"customNoUpgrade,omitempty"` +} + +type CustomFeatureGates struct { + // enabled is a list of all feature gates that you want to force on + // +optional + Enabled []FeatureGateName `json:"enabled,omitempty"` + // disabled is a list of all feature gates that you want to force off + // +optional + Disabled []FeatureGateName `json:"disabled,omitempty"` +} + +// FeatureGateName is a string to enforce patterns on the name of a FeatureGate +// +kubebuilder:validation:Pattern=`^([A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.?$` +type FeatureGateName string + +type FeatureGateStatus struct { + // conditions represent the observations of the current state. + // Known .status.conditions.type are: "DeterminationDegraded" + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. + // Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate + // the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. + // The enabled/disabled values for a particular version may change during the life of the cluster as various + // .spec.featureSet values are selected. + // Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable + // lists is beyond the scope of this API and is the responsibility of individual operators. + // Only featureGates with .version in the ClusterVersion.status will be present in this list. + // +listType=map + // +listMapKey=version + FeatureGates []FeatureGateDetails `json:"featureGates"` +} + +type FeatureGateDetails struct { + // version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field. + // +kubebuilder:validation:Required + // +required + Version string `json:"version"` + // enabled is a list of all feature gates that are enabled in the cluster for the named version. + // +optional + Enabled []FeatureGateAttributes `json:"enabled"` + // disabled is a list of all feature gates that are disabled in the cluster for the named version. + // +optional + Disabled []FeatureGateAttributes `json:"disabled"` +} + +type FeatureGateAttributes struct { + // name is the name of the FeatureGate. + // +kubebuilder:validation:Required + Name FeatureGateName `json:"name"` + + // possible (probable?) future additions include + // 1. support level (Stable, ServiceDeliveryOnly, TechPreview, DevPreview) + // 2. description +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type FeatureGateList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []FeatureGate `json:"items"` +} + +type FeatureGateEnabledDisabled struct { + Enabled []FeatureGateDescription + Disabled []FeatureGateDescription +} + +// FeatureSets Contains a map of Feature names to Enabled/Disabled Feature. +// +// NOTE: The caller needs to make sure to check for the existence of the value +// using golang's existence field. A possible scenario is an upgrade where new +// FeatureSets are added and a controller has not been upgraded with a newer +// version of this file. In this upgrade scenario the map could return nil. +// +// example: +// +// if featureSet, ok := FeatureSets["SomeNewFeature"]; ok { } +// +// If you put an item in either of these lists, put your area and name on it so we can find owners. +var FeatureSets = map[FeatureSet]*FeatureGateEnabledDisabled{ + Default: defaultFeatures, + CustomNoUpgrade: { + Enabled: []FeatureGateDescription{}, + Disabled: []FeatureGateDescription{}, + }, + TechPreviewNoUpgrade: newDefaultFeatures(). + with(externalCloudProvider). + with(externalCloudProviderAzure). + with(externalCloudProviderGCP). + with(csiDriverSharedResource). + with(buildCSIVolumes). + with(nodeSwap). + with(machineAPIProviderOpenStack). + with(insightsConfigAPI). + with(matchLabelKeysInPodTopologySpread). + with(retroactiveDefaultStorageClass). + with(pdbUnhealthyPodEvictionPolicy). + with(dynamicResourceAllocation). + with(admissionWebhookMatchConditions). + with(azureWorkloadIdentity). + with(gateGatewayAPI). + toFeatures(defaultFeatures), + LatencySensitive: newDefaultFeatures(). + toFeatures(defaultFeatures), +} + +var defaultFeatures = &FeatureGateEnabledDisabled{ + Enabled: []FeatureGateDescription{ + openShiftPodSecurityAdmission, + }, + Disabled: []FeatureGateDescription{ + retroactiveDefaultStorageClass, + }, +} + +type featureSetBuilder struct { + forceOn []FeatureGateDescription + forceOff []FeatureGateDescription +} + +func newDefaultFeatures() *featureSetBuilder { + return &featureSetBuilder{} +} + +func (f *featureSetBuilder) with(forceOn FeatureGateDescription) *featureSetBuilder { + for _, curr := range f.forceOn { + if curr.FeatureGateAttributes.Name == forceOn.FeatureGateAttributes.Name { + panic(fmt.Errorf("coding error: %q enabled twice", forceOn.FeatureGateAttributes.Name)) + } + } + f.forceOn = append(f.forceOn, forceOn) + return f +} + +func (f *featureSetBuilder) without(forceOff FeatureGateDescription) *featureSetBuilder { + for _, curr := range f.forceOff { + if curr.FeatureGateAttributes.Name == forceOff.FeatureGateAttributes.Name { + panic(fmt.Errorf("coding error: %q disabled twice", forceOff.FeatureGateAttributes.Name)) + } + } + f.forceOff = append(f.forceOff, forceOff) + return f +} + +func (f *featureSetBuilder) isForcedOff(needle FeatureGateDescription) bool { + for _, forcedOff := range f.forceOff { + if needle.FeatureGateAttributes.Name == forcedOff.FeatureGateAttributes.Name { + return true + } + } + return false +} + +func (f *featureSetBuilder) isForcedOn(needle FeatureGateDescription) bool { + for _, forceOn := range f.forceOn { + if needle.FeatureGateAttributes.Name == forceOn.FeatureGateAttributes.Name { + return true + } + } + return false +} + +func (f *featureSetBuilder) toFeatures(defaultFeatures *FeatureGateEnabledDisabled) *FeatureGateEnabledDisabled { + finalOn := []FeatureGateDescription{} + finalOff := []FeatureGateDescription{} + + // only add the default enabled features if they haven't been explicitly set off + for _, defaultOn := range defaultFeatures.Enabled { + if !f.isForcedOff(defaultOn) { + finalOn = append(finalOn, defaultOn) + } + } + for _, currOn := range f.forceOn { + if f.isForcedOff(currOn) { + panic("coding error, you can't have features both on and off") + } + found := false + for _, alreadyOn := range finalOn { + if alreadyOn.FeatureGateAttributes.Name == currOn.FeatureGateAttributes.Name { + found = true + } + } + if found { + continue + } + + finalOn = append(finalOn, currOn) + } + + // only add the default disabled features if they haven't been explicitly set on + for _, defaultOff := range defaultFeatures.Disabled { + if !f.isForcedOn(defaultOff) { + finalOff = append(finalOff, defaultOff) + } + } + for _, currOff := range f.forceOff { + finalOff = append(finalOff, currOff) + } + + return &FeatureGateEnabledDisabled{ + Enabled: finalOn, + Disabled: finalOff, + } +} diff --git a/vendor/github.com/openshift/api/config/v1/types_image.go b/vendor/github.com/openshift/api/config/v1/types_image.go new file mode 100644 index 00000000..eb7643f2 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image.go @@ -0,0 +1,134 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Image governs policies related to imagestream imports and runtime configuration +// for external registries. It allows cluster admins to configure which registries +// OpenShift is allowed to import images from, extra CA trust bundles for external +// registries, and policies to block or allow registry hostnames. +// When exposing OpenShift's image registry to the public, this also lets cluster +// admins specify the external hostname. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Image struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ImageSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status ImageStatus `json:"status"` +} + +type ImageSpec struct { + // allowedRegistriesForImport limits the container image registries that normal users may import + // images from. Set this list to the registries that you trust to contain valid Docker + // images and that you want applications to be able to import from. Users with + // permission to create Images or ImageStreamMappings via the API are not affected by + // this policy - typically only administrators or system integrations will have those + // permissions. + // +optional + AllowedRegistriesForImport []RegistryLocation `json:"allowedRegistriesForImport,omitempty"` + + // externalRegistryHostnames provides the hostnames for the default external image + // registry. The external hostname should be set only when the image registry + // is exposed externally. The first value is used in 'publicDockerImageRepository' + // field in ImageStreams. The value must be in "hostname[:port]" format. + // +optional + ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` + + // additionalTrustedCA is a reference to a ConfigMap containing additional CAs that + // should be trusted during imagestream import, pod image pull, build image pull, and + // imageregistry pullthrough. + // The namespace for this config map is openshift-config. + // +optional + AdditionalTrustedCA ConfigMapNameReference `json:"additionalTrustedCA"` + + // registrySources contains configuration that determines how the container runtime + // should treat individual registries when accessing images for builds+pods. (e.g. + // whether or not to allow insecure access). It does not contain configuration for the + // internal cluster registry. + // +optional + RegistrySources RegistrySources `json:"registrySources"` +} + +type ImageStatus struct { + + // internalRegistryHostname sets the hostname for the default internal image + // registry. The value must be in "hostname[:port]" format. + // This value is set by the image registry operator which controls the internal registry + // hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY + // environment variable but this setting overrides the environment variable. + // +optional + InternalRegistryHostname string `json:"internalRegistryHostname,omitempty"` + + // externalRegistryHostnames provides the hostnames for the default external image + // registry. The external hostname should be set only when the image registry + // is exposed externally. The first value is used in 'publicDockerImageRepository' + // field in ImageStreams. The value must be in "hostname[:port]" format. + // +optional + ExternalRegistryHostnames []string `json:"externalRegistryHostnames,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Image `json:"items"` +} + +// RegistryLocation contains a location of the registry specified by the registry domain +// name. The domain name might include wildcards, like '*' or '??'. +type RegistryLocation struct { + // domainName specifies a domain name for the registry + // In case the registry use non-standard (80 or 443) port, the port should be included + // in the domain name as well. + DomainName string `json:"domainName"` + // insecure indicates whether the registry is secure (https) or insecure (http) + // By default (if not specified) the registry is assumed as secure. + // +optional + Insecure bool `json:"insecure,omitempty"` +} + +// RegistrySources holds cluster-wide information about how to handle the registries config. +type RegistrySources struct { + // insecureRegistries are registries which do not have a valid TLS certificates or only support HTTP connections. + // +optional + InsecureRegistries []string `json:"insecureRegistries,omitempty"` + // blockedRegistries cannot be used for image pull and push actions. All other registries are permitted. + // + // Only one of BlockedRegistries or AllowedRegistries may be set. + // +optional + BlockedRegistries []string `json:"blockedRegistries,omitempty"` + // allowedRegistries are the only registries permitted for image pull and push actions. All other registries are denied. + // + // Only one of BlockedRegistries or AllowedRegistries may be set. + // +optional + AllowedRegistries []string `json:"allowedRegistries,omitempty"` + // containerRuntimeSearchRegistries are registries that will be searched when pulling images that do not have fully qualified + // domains in their pull specs. Registries will be searched in the order provided in the list. + // Note: this search list only works with the container runtime, i.e CRI-O. Will NOT work with builds or imagestream imports. + // +optional + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:Format=hostname + // +listType=set + ContainerRuntimeSearchRegistries []string `json:"containerRuntimeSearchRegistries,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go new file mode 100644 index 00000000..3dc315f6 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_content_policy.go @@ -0,0 +1,95 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageContentPolicy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ImageContentPolicySpec `json:"spec"` +} + +// ImageContentPolicySpec is the specification of the ImageContentPolicy CRD. +type ImageContentPolicySpec struct { + // repositoryDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in RepositoryDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To pull image from mirrors by tags, should set the "allowMirrorByTags". + // + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // +optional + // +listType=map + // +listMapKey=source + RepositoryDigestMirrors []RepositoryDigestMirrors `json:"repositoryDigestMirrors"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageContentPolicyList lists the items in the ImageContentPolicy CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageContentPolicyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageContentPolicy `json:"items"` +} + +// RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type RepositoryDigestMirrors struct { + // source is the repository that users refer to, e.g. in image pull specifications. + // +required + // +kubebuilder:validation:Required + // +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` + Source string `json:"source"` + // allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. + // Pulling images by tag can potentially yield different images, depending on which endpoint + // we pull from. Forcing digest-pulls for mirrors avoids that issue. + // +optional + AllowMirrorByTags bool `json:"allowMirrorByTags,omitempty"` + // mirrors is zero or more repositories that may also contain the same images. + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. No mirror will be configured. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. Other cluster configuration, + // including (but not limited to) other repositoryDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // +optional + // +listType=set + Mirrors []Mirror `json:"mirrors,omitempty"` +} + +// +kubebuilder:validation:Pattern=`^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]+)?(\/[^\/:\n]+)*(\/[^\/:\n]+((:[^\/:\n]+)|(@[^\n]+)))?$` +type Mirror string diff --git a/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go new file mode 100644 index 00000000..987c6cfd --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_digest_mirror_set.go @@ -0,0 +1,137 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageDigestMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ImageDigestMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageDigestMirrorSetStatus `json:"status,omitempty"` +} + +// ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD. +type ImageDigestMirrorSetSpec struct { + // imageDigestMirrors allows images referenced by image digests in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageDigestMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using tag specification, users should configure + // a list of mirrors using "ImageTagMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagedigestmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageDigestMirrors []ImageDigestMirrors `json:"imageDigestMirrors"` +} + +type ImageDigestMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageDigestMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageDigestMirrorSet `json:"items"` +} + +// +kubebuilder:validation:Pattern=`^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` +type ImageMirror string + +// MirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. +// +kubebuilder:validation:Enum=NeverContactSource;AllowContactingSource +type MirrorSourcePolicy string + +const ( + // NeverContactSource prevents image pull from the specified repository in the pull spec if the image pull from the mirror list fails. + NeverContactSource MirrorSourcePolicy = "NeverContactSource" + + // AllowContactingSource allows falling back to the specified repository in the pull spec if the image pull from the mirror list fails. + AllowContactingSource MirrorSourcePolicy = "AllowContactingSource" +) + +// ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageDigestMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their digests. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy" + // Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go new file mode 100644 index 00000000..295522e5 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_image_tag_mirror_set.go @@ -0,0 +1,124 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. +// When multiple policies are defined, the outcome of the behavior is defined on each field. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageTagMirrorSet struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ImageTagMirrorSetSpec `json:"spec"` + // status contains the observed state of the resource. + // +optional + Status ImageTagMirrorSetStatus `json:"status,omitempty"` +} + +// ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD. +type ImageTagMirrorSetSpec struct { + // imageTagMirrors allows images referenced by image tags in pods to be + // pulled from alternative mirrored repository locations. The image pull specification + // provided to the pod will be compared to the source locations described in imageTagMirrors + // and the image may be pulled down from any of the mirrors in the list instead of the + // specified repository allowing administrators to choose a potentially faster mirror. + // To use mirrors to pull images using digest specification only, users should configure + // a list of mirrors using "ImageDigestMirrorSet" CRD. + // + // If the image pull specification matches the repository of "source" in multiple imagetagmirrorset objects, + // only the objects which define the most specific namespace match will be used. + // For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as + // the "source", only the objects using quay.io/libpod/busybox are going to apply + // for pull specification quay.io/libpod/busybox. + // Each “source” repository is treated independently; configurations for different “source” + // repositories don’t interact. + // + // If the "mirrors" is not specified, the image will continue to be pulled from the specified + // repository in the pull spec. + // + // When multiple policies are defined for the same “source” repository, the sets of defined + // mirrors will be merged together, preserving the relative order of the mirrors, if possible. + // For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the + // mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict + // (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. + // Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order. + // +optional + // +listType=atomic + ImageTagMirrors []ImageTagMirrors `json:"imageTagMirrors"` +} + +type ImageTagMirrorSetStatus struct{} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ImageTagMirrorSetList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []ImageTagMirrorSet `json:"items"` +} + +// ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config. +type ImageTagMirrors struct { + // source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname + // e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. + // "source" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // [*.]host + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +required + // +kubebuilder:validation:Required + // +kubebuilder:validation:Pattern=`^\*(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+$|^((?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])(?:(?:\.(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]))+)?(?::[0-9]+)?)(?:(?:/[a-z0-9]+(?:(?:(?:[._]|__|[-]*)[a-z0-9]+)+)?)+)?$` + Source string `json:"source"` + // mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. + // Images can be pulled from these mirrors only if they are referenced by their tags. + // The mirrored location is obtained by replacing the part of the input reference that + // matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, + // a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo + // repository to be used. + // Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. + // Configuring a list of mirrors using "ImageDigestMirrorSet" CRD and forcing digest-pulls for mirrors avoids that issue. + // The order of mirrors in this list is treated as the user's desired priority, while source + // is by default considered lower priority than all mirrors. + // If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be + // pulled from the repository in the pull spec unless explicitly prohibited by "mirrorSourcePolicy". + // Other cluster configuration, including (but not limited to) other imageTagMirrors objects, + // may impact the exact order mirrors are contacted in, or some mirrors may be contacted + // in parallel, so this should be considered a preference rather than a guarantee of ordering. + // "mirrors" uses one of the following formats: + // host[:port] + // host[:port]/namespace[/namespace…] + // host[:port]/namespace[/namespace…]/repo + // for more information about the format, see the document about the location field: + // https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table + // +optional + // +listType=set + Mirrors []ImageMirror `json:"mirrors,omitempty"` + // mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. + // If unset, the image will continue to be pulled from the repository in the pull spec. + // sourcePolicy is valid configuration only when one or more mirrors are in the mirror list. + // +optional + MirrorSourcePolicy MirrorSourcePolicy `json:"mirrorSourcePolicy,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_infrastructure.go b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go new file mode 100644 index 00000000..d47acdb7 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_infrastructure.go @@ -0,0 +1,1342 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +kubebuilder:subresource:status + +// Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Infrastructure struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec InfrastructureSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status InfrastructureStatus `json:"status"` +} + +// InfrastructureSpec contains settings that apply to the cluster infrastructure. +type InfrastructureSpec struct { + // cloudConfig is a reference to a ConfigMap containing the cloud provider configuration file. + // This configuration file is used to configure the Kubernetes cloud provider integration + // when using the built-in cloud provider integration or the external cloud controller manager. + // The namespace for this config map is openshift-config. + // + // cloudConfig should only be consumed by the kube_cloud_config controller. + // The controller is responsible for using the user configuration in the spec + // for various platforms and combining that with the user provided ConfigMap in this field + // to create a stitched kube cloud config. + // The controller generates a ConfigMap `kube-cloud-config` in `openshift-config-managed` namespace + // with the kube cloud config is stored in `cloud.conf` key. + // All the clients are expected to use the generated ConfigMap only. + // + // +optional + CloudConfig ConfigMapFileReference `json:"cloudConfig"` + + // platformSpec holds desired information specific to the underlying + // infrastructure provider. + PlatformSpec PlatformSpec `json:"platformSpec,omitempty"` +} + +// InfrastructureStatus describes the infrastructure the cluster is leveraging. +type InfrastructureStatus struct { + // infrastructureName uniquely identifies a cluster with a human friendly name. + // Once set it should not be changed. Must be of max length 27 and must have only + // alphanumeric or hyphen characters. + InfrastructureName string `json:"infrastructureName"` + + // platform is the underlying infrastructure provider for the cluster. + // + // Deprecated: Use platformStatus.type instead. + Platform PlatformType `json:"platform,omitempty"` + + // platformStatus holds status information specific to the underlying + // infrastructure provider. + // +optional + PlatformStatus *PlatformStatus `json:"platformStatus,omitempty"` + + // etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering + // etcd servers and clients. + // For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery + // deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release. + EtcdDiscoveryDomain string `json:"etcdDiscoveryDomain"` + + // apiServerURL is a valid URI with scheme 'https', address and + // optionally a port (defaulting to 443). apiServerURL can be used by components like the web console + // to tell users where to find the Kubernetes API. + APIServerURL string `json:"apiServerURL"` + + // apiServerInternalURL is a valid URI with scheme 'https', + // address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components + // like kubelets, to contact the Kubernetes API server using the + // infrastructure provider rather than Kubernetes networking. + APIServerInternalURL string `json:"apiServerInternalURI"` + + // controlPlaneTopology expresses the expectations for operands that normally run on control nodes. + // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. + // The 'SingleReplica' mode will be used in single-node deployments + // and the operators should not configure the operand for highly-available operation + // The 'External' mode indicates that the control plane is hosted externally to the cluster and that + // its components are not visible within the cluster. + // +kubebuilder:default=HighlyAvailable + // +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica;External + ControlPlaneTopology TopologyMode `json:"controlPlaneTopology"` + + // infrastructureTopology expresses the expectations for infrastructure services that do not run on control + // plane nodes, usually indicated by a node selector for a `role` value + // other than `master`. + // The default is 'HighlyAvailable', which represents the behavior operators have in a "normal" cluster. + // The 'SingleReplica' mode will be used in single-node deployments + // and the operators should not configure the operand for highly-available operation + // NOTE: External topology mode is not applicable for this field. + // +kubebuilder:default=HighlyAvailable + // +kubebuilder:validation:Enum=HighlyAvailable;SingleReplica + InfrastructureTopology TopologyMode `json:"infrastructureTopology"` + + // cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. + // CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. + // Valid values are "None" and "AllNodes". When omitted, the default value is "None". + // The default value of "None" indicates that no nodes will be setup with CPU partitioning. + // The "AllNodes" value indicates that all nodes have been setup with CPU partitioning, + // and can then be further configured via the PerformanceProfile API. + // +kubebuilder:default=None + // +default="None" + // +kubebuilder:validation:Enum=None;AllNodes + // +openshift:enable:FeatureSets=TechPreviewNoUpgrade + // +optional + CPUPartitioning CPUPartitioningMode `json:"cpuPartitioning,omitempty"` +} + +// TopologyMode defines the topology mode of the control/infra nodes. +// NOTE: Enum validation is specified in each field that uses this type, +// given that External value is not applicable to the InfrastructureTopology +// field. +type TopologyMode string + +const ( + // "HighlyAvailable" is for operators to configure high-availability as much as possible. + HighlyAvailableTopologyMode TopologyMode = "HighlyAvailable" + + // "SingleReplica" is for operators to avoid spending resources for high-availability purpose. + SingleReplicaTopologyMode TopologyMode = "SingleReplica" + + // "External" indicates that the component is running externally to the cluster. When specified + // as the control plane topology, operators should avoid scheduling workloads to masters or assume + // that any of the control plane components such as kubernetes API server or etcd are visible within + // the cluster. + ExternalTopologyMode TopologyMode = "External" +) + +// CPUPartitioningMode defines the mode for CPU partitioning +type CPUPartitioningMode string + +const ( + // CPUPartitioningNone means that no CPU Partitioning is on in this cluster infrastructure + CPUPartitioningNone CPUPartitioningMode = "None" + + // CPUPartitioningAllNodes means that all nodes are configured with CPU Partitioning in this cluster + CPUPartitioningAllNodes CPUPartitioningMode = "AllNodes" +) + +// PlatformLoadBalancerType defines the type of load balancer used by the cluster. +type PlatformLoadBalancerType string + +const ( + // LoadBalancerTypeUserManaged is a load balancer with control-plane VIPs managed outside of the cluster by the customer. + LoadBalancerTypeUserManaged PlatformLoadBalancerType = "UserManaged" + + // LoadBalancerTypeOpenShiftManagedDefault is the default load balancer with control-plane VIPs managed by the OpenShift cluster. + LoadBalancerTypeOpenShiftManagedDefault PlatformLoadBalancerType = "OpenShiftManagedDefault" +) + +// PlatformType is a specific supported infrastructure provider. +// +kubebuilder:validation:Enum="";AWS;Azure;BareMetal;GCP;Libvirt;OpenStack;None;VSphere;oVirt;IBMCloud;KubeVirt;EquinixMetal;PowerVS;AlibabaCloud;Nutanix;External +type PlatformType string + +const ( + // AWSPlatformType represents Amazon Web Services infrastructure. + AWSPlatformType PlatformType = "AWS" + + // AzurePlatformType represents Microsoft Azure infrastructure. + AzurePlatformType PlatformType = "Azure" + + // BareMetalPlatformType represents managed bare metal infrastructure. + BareMetalPlatformType PlatformType = "BareMetal" + + // GCPPlatformType represents Google Cloud Platform infrastructure. + GCPPlatformType PlatformType = "GCP" + + // LibvirtPlatformType represents libvirt infrastructure. + LibvirtPlatformType PlatformType = "Libvirt" + + // OpenStackPlatformType represents OpenStack infrastructure. + OpenStackPlatformType PlatformType = "OpenStack" + + // NonePlatformType means there is no infrastructure provider. + NonePlatformType PlatformType = "None" + + // VSpherePlatformType represents VMWare vSphere infrastructure. + VSpherePlatformType PlatformType = "VSphere" + + // OvirtPlatformType represents oVirt/RHV infrastructure. + OvirtPlatformType PlatformType = "oVirt" + + // IBMCloudPlatformType represents IBM Cloud infrastructure. + IBMCloudPlatformType PlatformType = "IBMCloud" + + // KubevirtPlatformType represents KubeVirt/Openshift Virtualization infrastructure. + KubevirtPlatformType PlatformType = "KubeVirt" + + // EquinixMetalPlatformType represents Equinix Metal infrastructure. + EquinixMetalPlatformType PlatformType = "EquinixMetal" + + // PowerVSPlatformType represents IBM Power Systems Virtual Servers infrastructure. + PowerVSPlatformType PlatformType = "PowerVS" + + // AlibabaCloudPlatformType represents Alibaba Cloud infrastructure. + AlibabaCloudPlatformType PlatformType = "AlibabaCloud" + + // NutanixPlatformType represents Nutanix infrastructure. + NutanixPlatformType PlatformType = "Nutanix" + + // ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately. + ExternalPlatformType PlatformType = "External" +) + +// IBMCloudProviderType is a specific supported IBM Cloud provider cluster type +type IBMCloudProviderType string + +const ( + // Classic means that the IBM Cloud cluster is using classic infrastructure + IBMCloudProviderTypeClassic IBMCloudProviderType = "Classic" + + // VPC means that the IBM Cloud cluster is using VPC infrastructure + IBMCloudProviderTypeVPC IBMCloudProviderType = "VPC" + + // IBMCloudProviderTypeUPI means that the IBM Cloud cluster is using user provided infrastructure. + // This is utilized in IBM Cloud Satellite environments. + IBMCloudProviderTypeUPI IBMCloudProviderType = "UPI" +) + +// ExternalPlatformSpec holds the desired state for the generic External infrastructure provider. +type ExternalPlatformSpec struct { + // PlatformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. + // This field is solely for informational and reporting purposes and is not expected to be used for decision-making. + // +kubebuilder:default:="Unknown" + // +default="Unknown" + // +kubebuilder:validation:XValidation:rule="oldSelf == 'Unknown' || self == oldSelf",message="platform name cannot be changed once set" + // +optional + PlatformName string `json:"platformName,omitempty"` +} + +// PlatformSpec holds the desired state specific to the underlying infrastructure provider +// of the current cluster. Since these are used at spec-level for the underlying cluster, it +// is supposed that only one of the spec structs is set. +type PlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. This + // value controls whether infrastructure automation such as service load + // balancers, dynamic volume provisioning, machine creation and deletion, and + // other integrations are enabled. If None, no infrastructure automation is + // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. + // + // +unionDiscriminator + Type PlatformType `json:"type"` + + // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // +optional + AWS *AWSPlatformSpec `json:"aws,omitempty"` + + // Azure contains settings specific to the Azure infrastructure provider. + // +optional + Azure *AzurePlatformSpec `json:"azure,omitempty"` + + // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // +optional + GCP *GCPPlatformSpec `json:"gcp,omitempty"` + + // BareMetal contains settings specific to the BareMetal platform. + // +optional + BareMetal *BareMetalPlatformSpec `json:"baremetal,omitempty"` + + // OpenStack contains settings specific to the OpenStack infrastructure provider. + // +optional + OpenStack *OpenStackPlatformSpec `json:"openstack,omitempty"` + + // Ovirt contains settings specific to the oVirt infrastructure provider. + // +optional + Ovirt *OvirtPlatformSpec `json:"ovirt,omitempty"` + + // VSphere contains settings specific to the VSphere infrastructure provider. + // +optional + VSphere *VSpherePlatformSpec `json:"vsphere,omitempty"` + + // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // +optional + IBMCloud *IBMCloudPlatformSpec `json:"ibmcloud,omitempty"` + + // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // +optional + Kubevirt *KubevirtPlatformSpec `json:"kubevirt,omitempty"` + + // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // +optional + EquinixMetal *EquinixMetalPlatformSpec `json:"equinixMetal,omitempty"` + + // PowerVS contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformSpec `json:"powervs,omitempty"` + + // AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformSpec `json:"alibabaCloud,omitempty"` + + // Nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformSpec `json:"nutanix,omitempty"` + + // ExternalPlatformType represents generic infrastructure provider. + // Platform-specific components should be supplemented separately. + // +optional + External *ExternalPlatformSpec `json:"external,omitempty"` +} + +// ExternalPlatformStatus holds the current status of the generic External infrastructure provider. +type ExternalPlatformStatus struct{} + +// PlatformStatus holds the current status specific to the underlying infrastructure provider +// of the current cluster. Since these are used at status-level for the underlying cluster, it +// is supposed that only one of the status structs is set. +type PlatformStatus struct { + // type is the underlying infrastructure provider for the cluster. This + // value controls whether infrastructure automation such as service load + // balancers, dynamic volume provisioning, machine creation and deletion, and + // other integrations are enabled. If None, no infrastructure automation is + // enabled. Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", + // "OpenStack", "VSphere", "oVirt", "EquinixMetal", "PowerVS", "AlibabaCloud", "Nutanix" and "None". + // Individual components may not support all platforms, and must handle + // unrecognized platforms as None if they do not support that platform. + // + // This value will be synced with to the `status.platform` and `status.platformStatus.type`. + // Currently this value cannot be changed once set. + Type PlatformType `json:"type"` + + // AWS contains settings specific to the Amazon Web Services infrastructure provider. + // +optional + AWS *AWSPlatformStatus `json:"aws,omitempty"` + + // Azure contains settings specific to the Azure infrastructure provider. + // +optional + Azure *AzurePlatformStatus `json:"azure,omitempty"` + + // GCP contains settings specific to the Google Cloud Platform infrastructure provider. + // +optional + GCP *GCPPlatformStatus `json:"gcp,omitempty"` + + // BareMetal contains settings specific to the BareMetal platform. + // +optional + BareMetal *BareMetalPlatformStatus `json:"baremetal,omitempty"` + + // OpenStack contains settings specific to the OpenStack infrastructure provider. + // +optional + OpenStack *OpenStackPlatformStatus `json:"openstack,omitempty"` + + // Ovirt contains settings specific to the oVirt infrastructure provider. + // +optional + Ovirt *OvirtPlatformStatus `json:"ovirt,omitempty"` + + // VSphere contains settings specific to the VSphere infrastructure provider. + // +optional + VSphere *VSpherePlatformStatus `json:"vsphere,omitempty"` + + // IBMCloud contains settings specific to the IBMCloud infrastructure provider. + // +optional + IBMCloud *IBMCloudPlatformStatus `json:"ibmcloud,omitempty"` + + // Kubevirt contains settings specific to the kubevirt infrastructure provider. + // +optional + Kubevirt *KubevirtPlatformStatus `json:"kubevirt,omitempty"` + + // EquinixMetal contains settings specific to the Equinix Metal infrastructure provider. + // +optional + EquinixMetal *EquinixMetalPlatformStatus `json:"equinixMetal,omitempty"` + + // PowerVS contains settings specific to the Power Systems Virtual Servers infrastructure provider. + // +optional + PowerVS *PowerVSPlatformStatus `json:"powervs,omitempty"` + + // AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider. + // +optional + AlibabaCloud *AlibabaCloudPlatformStatus `json:"alibabaCloud,omitempty"` + + // Nutanix contains settings specific to the Nutanix infrastructure provider. + // +optional + Nutanix *NutanixPlatformStatus `json:"nutanix,omitempty"` + + // External contains settings specific to the generic External infrastructure provider. + // +optional + External *ExternalPlatformStatus `json:"external,omitempty"` +} + +// AWSServiceEndpoint store the configuration of a custom url to +// override existing defaults of AWS Services. +type AWSServiceEndpoint struct { + // name is the name of the AWS service. + // The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html + // This must be provided and cannot be empty. + // + // +kubebuilder:validation:Pattern=`^[a-z0-9-]+$` + Name string `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. + // + // +kubebuilder:validation:Pattern=`^https://` + URL string `json:"url"` +} + +// AWSPlatformSpec holds the desired state of the Amazon Web Services infrastructure provider. +// This only includes fields that can be modified in the cluster. +type AWSPlatformSpec struct { + // serviceEndpoints list contains custom endpoints which will override default + // service endpoint of AWS Services. + // There must be only one ServiceEndpoint for a service. + // +optional + ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider. +type AWSPlatformStatus struct { + // region holds the default AWS region for new AWS resources created by the cluster. + Region string `json:"region"` + + // ServiceEndpoints list contains custom endpoints which will override default + // service endpoint of AWS Services. + // There must be only one ServiceEndpoint for a service. + // +optional + ServiceEndpoints []AWSServiceEndpoint `json:"serviceEndpoints,omitempty"` + + // resourceTags is a list of additional tags to apply to AWS resources created for the cluster. + // See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. + // AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags + // available for the user. + // +kubebuilder:validation:MaxItems=25 + // +optional + ResourceTags []AWSResourceTag `json:"resourceTags,omitempty"` +} + +// AWSResourceTag is a tag to apply to AWS resources created for the cluster. +type AWSResourceTag struct { + // key is the key of the tag + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +required + Key string `json:"key"` + // value is the value of the tag. + // Some AWS service do not support empty values. Since tags are added to resources in many services, the + // length of the tag value must meet the requirements of all services. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.:/=+-@]+$` + // +required + Value string `json:"value"` +} + +// AzurePlatformSpec holds the desired state of the Azure infrastructure provider. +// This only includes fields that can be modified in the cluster. +type AzurePlatformSpec struct{} + +// AzurePlatformStatus holds the current status of the Azure infrastructure provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceTags) && !has(self.resourceTags) || has(oldSelf.resourceTags) && has(self.resourceTags)",message="resourceTags may only be configured during installation" +type AzurePlatformStatus struct { + // resourceGroupName is the Resource Group for new Azure resources created for the cluster. + ResourceGroupName string `json:"resourceGroupName"` + + // networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. + // If empty, the value is same as ResourceGroupName. + // +optional + NetworkResourceGroupName string `json:"networkResourceGroupName,omitempty"` + + // cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK + // with the appropriate Azure API endpoints. + // If empty, the value is equal to `AzurePublicCloud`. + // +optional + CloudName AzureCloudEnvironment `json:"cloudName,omitempty"` + + // armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack. + // +optional + ARMEndpoint string `json:"armEndpoint,omitempty"` + + // resourceTags is a list of additional tags to apply to Azure resources created for the cluster. + // See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. + // Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags + // may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration. + // +kubebuilder:validation:MaxItems=10 + // +kubebuilder:validation:XValidation:rule="self.all(x, x in oldSelf) && oldSelf.all(x, x in self)",message="resourceTags are immutable and may only be configured during installation" + // +optional + ResourceTags []AzureResourceTag `json:"resourceTags,omitempty"` +} + +// AzureResourceTag is a tag to apply to Azure resources created for the cluster. +type AzureResourceTag struct { + // key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key + // must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric + // characters and the following special characters `_ . -`. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +kubebuilder:validation:Pattern=`^[a-zA-Z]([0-9A-Za-z_.-]*[0-9A-Za-z_])?$` + Key string `json:"key"` + // value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value + // must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z_.=+-@]+$` + Value string `json:"value"` +} + +// AzureCloudEnvironment is the name of the Azure cloud environment +// +kubebuilder:validation:Enum="";AzurePublicCloud;AzureUSGovernmentCloud;AzureChinaCloud;AzureGermanCloud;AzureStackCloud +type AzureCloudEnvironment string + +const ( + // AzurePublicCloud is the general-purpose, public Azure cloud environment. + AzurePublicCloud AzureCloudEnvironment = "AzurePublicCloud" + + // AzureUSGovernmentCloud is the Azure cloud environment for the US government. + AzureUSGovernmentCloud AzureCloudEnvironment = "AzureUSGovernmentCloud" + + // AzureChinaCloud is the Azure cloud environment used in China. + AzureChinaCloud AzureCloudEnvironment = "AzureChinaCloud" + + // AzureGermanCloud is the Azure cloud environment used in Germany. + AzureGermanCloud AzureCloudEnvironment = "AzureGermanCloud" + + // AzureStackCloud is the Azure cloud environment used at the edge and on premises. + AzureStackCloud AzureCloudEnvironment = "AzureStackCloud" +) + +// GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. +// This only includes fields that can be modified in the cluster. +type GCPPlatformSpec struct{} + +// GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider. +type GCPPlatformStatus struct { + // resourceGroupName is the Project ID for new GCP resources created for the cluster. + ProjectID string `json:"projectID"` + + // region holds the region for new GCP resources created for the cluster. + Region string `json:"region"` +} + +// BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform. +// +union +type BareMetalPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on BareMetal platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. +// This only includes fields that can be modified in the cluster. +type BareMetalPlatformSpec struct{} + +// BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. +// For more information about the network architecture used with the BareMetal platform type, see: +// https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md +type BareMetalPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + IngressIPs []string `json:"ingressIPs"` + + // nodeDNSIP is the IP address for the internal DNS used by the + // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` + // provides name resolution for the nodes themselves. There is no DNS-as-a-service for + // BareMetal deployments. In order to minimize necessary changes to the + // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames + // to the nodes in the cluster. + NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +openshift:enable:FeatureSets=TechPreviewNoUpgrade + // +optional + LoadBalancer *BareMetalPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform. +// +union +type OpenStackPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on OpenStack platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. +// This only includes fields that can be modified in the cluster. +type OpenStackPlatformSpec struct{} + +// OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider. +type OpenStackPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // cloudName is the name of the desired OpenStack cloud in the + // client configuration file (`clouds.yaml`). + CloudName string `json:"cloudName,omitempty"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + IngressIPs []string `json:"ingressIPs"` + + // nodeDNSIP is the IP address for the internal DNS used by the + // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` + // provides name resolution for the nodes themselves. There is no DNS-as-a-service for + // OpenStack deployments. In order to minimize necessary changes to the + // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames + // to the nodes in the cluster. + NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +optional + LoadBalancer *OpenStackPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform. +// +union +type OvirtPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Ovirt platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. +// This only includes fields that can be modified in the cluster. +type OvirtPlatformSpec struct{} + +// OvirtPlatformStatus holds the current status of the oVirt infrastructure provider. +type OvirtPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + IngressIPs []string `json:"ingressIPs"` + + // deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release. + NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +openshift:enable:FeatureSets=TechPreviewNoUpgrade + // +optional + LoadBalancer *OvirtPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform. +// +union +type VSpherePlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on VSphere platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// VSpherePlatformFailureDomainSpec holds the region and zone failure domain and +// the vCenter topology of that failure domain. +type VSpherePlatformFailureDomainSpec struct { + // name defines the arbitrary but unique name + // of a failure domain. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // region defines the name of a region tag that will + // be attached to a vCenter datacenter. The tag + // category in vCenter must be named openshift-region. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +kubebuilder:validation:Required + Region string `json:"region"` + + // zone defines the name of a zone tag that will + // be attached to a vCenter cluster. The tag + // category in vCenter must be named openshift-zone. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=80 + // +kubebuilder:validation:Required + Zone string `json:"zone"` + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // Topology describes a given failure domain using vSphere constructs + // +kubebuilder:validation:Required + Topology VSpherePlatformTopology `json:"topology"` +} + +// VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, +// computeCluster, networks, datastore and resourcePool - to provision virtual machines. +type VSpherePlatformTopology struct { + // datacenter is the name of vCenter datacenter in which virtual machines will be located. + // The maximum length of the datacenter name is 80 characters. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=80 + Datacenter string `json:"datacenter"` + + // computeCluster the absolute path of the vCenter cluster + // in which virtual machine will be located. + // The absolute path is of the form //host/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?` + ComputeCluster string `json:"computeCluster"` + + // networks is the list of port group network names within this failure domain. + // Currently, we only support a single interface per RHCOS virtual machine. + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // The single interface should be the absolute path of the form + // //network/. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxItems=1 + // +kubebuilder:validation:MinItems=1 + Networks []string `json:"networks"` + + // datastore is the absolute path of the datastore in which the + // virtual machine is located. + // The absolute path is of the form //datastore/ + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/datastore/.*?` + Datastore string `json:"datastore"` + + // resourcePool is the absolute path of the resource pool where virtual machines will be + // created. The absolute path is of the form //host//Resources/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/host/.*?/Resources.*` + // +optional + ResourcePool string `json:"resourcePool,omitempty"` + + // folder is the absolute path of the folder where + // virtual machines are located. The absolute path + // is of the form //vm/. + // The maximum length of the path is 2048 characters. + // +kubebuilder:validation:MaxLength=2048 + // +kubebuilder:validation:Pattern=`^/.*?/vm/.*?` + // +optional + Folder string `json:"folder,omitempty"` +} + +// VSpherePlatformVCenterSpec stores the vCenter connection fields. +// This is used by the vSphere CCM. +type VSpherePlatformVCenterSpec struct { + + // server is the fully-qualified domain name or the IP address of the vCenter server. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=255 + // --- + // + Validation is applied via a patch, we validate the format as either ipv4, ipv6 or hostname + Server string `json:"server"` + + // port is the TCP port that will be used to communicate to + // the vCenter endpoint. + // When omitted, this means the user has no opinion and + // it is up to the platform to choose a sensible default, + // which is subject to change over time. + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=32767 + // +optional + Port int32 `json:"port,omitempty"` + + // The vCenter Datacenters in which the RHCOS + // vm guests are located. This field will + // be used by the Cloud Controller Manager. + // Each datacenter listed here should be used within + // a topology. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + Datacenters []string `json:"datacenters"` +} + +// VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for +// including and excluding IP ranges in the cloud provider. +// This would be used for example when multiple network adapters are attached to +// a guest to help determine which IP address the cloud config manager should use +// for the external and internal node networking. +type VSpherePlatformNodeNetworkingSpec struct { + // networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs + // that will be used in respective status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +optional + NetworkSubnetCIDR []string `json:"networkSubnetCidr,omitempty"` + + // network VirtualMachine's VM Network names that will be used to when searching + // for status.addresses fields. Note that if internal.networkSubnetCIDR and + // external.networkSubnetCIDR are not set, then the vNIC associated to this network must + // only have a single IP address assigned to it. + // The available networks (port groups) can be listed using + // `govc ls 'network/*'` + // +optional + Network string `json:"network,omitempty"` + + // excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting + // the IP address from the VirtualMachine's VM for use in the status.addresses fields. + // --- + // + Validation is applied via a patch, we validate the format as cidr + // +optional + ExcludeNetworkSubnetCIDR []string `json:"excludeNetworkSubnetCidr,omitempty"` +} + +// VSpherePlatformNodeNetworking holds the external and internal node networking spec. +type VSpherePlatformNodeNetworking struct { + // external represents the network configuration of the node that is externally routable. + // +optional + External VSpherePlatformNodeNetworkingSpec `json:"external"` + // internal represents the network configuration of the node that is routable only within the cluster. + // +optional + Internal VSpherePlatformNodeNetworkingSpec `json:"internal"` +} + +// VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. +// In the future the cloud provider operator, storage operator and machine operator will +// use these fields for configuration. +type VSpherePlatformSpec struct { + // vcenters holds the connection details for services to communicate with vCenter. + // Currently, only a single vCenter is supported. + // --- + // + If VCenters is not defined use the existing cloud-config configmap defined + // + in openshift-config. + // +kubebuilder:validation:MaxItems=1 + // +kubebuilder:validation:MinItems=0 + // +optional + VCenters []VSpherePlatformVCenterSpec `json:"vcenters,omitempty"` + + // failureDomains contains the definition of region, zone and the vCenter topology. + // If this is omitted failure domains (regions and zones) will not be used. + // +optional + FailureDomains []VSpherePlatformFailureDomainSpec `json:"failureDomains,omitempty"` + + // nodeNetworking contains the definition of internal and external network constraints for + // assigning the node's networking. + // If this field is omitted, networking defaults to the legacy + // address selection behavior which is to only support a single address and + // return the first one found. + // +optional + NodeNetworking VSpherePlatformNodeNetworking `json:"nodeNetworking,omitempty"` +} + +// VSpherePlatformStatus holds the current status of the vSphere infrastructure provider. +type VSpherePlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + IngressIPs []string `json:"ingressIPs"` + + // nodeDNSIP is the IP address for the internal DNS used by the + // nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` + // provides name resolution for the nodes themselves. There is no DNS-as-a-service for + // vSphere deployments. In order to minimize necessary changes to the + // datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames + // to the nodes in the cluster. + NodeDNSIP string `json:"nodeDNSIP,omitempty"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +openshift:enable:FeatureSets=TechPreviewNoUpgrade + // +optional + LoadBalancer *VSpherePlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. +// This only includes fields that can be modified in the cluster. +type IBMCloudPlatformSpec struct{} + +// IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider. +type IBMCloudPlatformStatus struct { + // Location is where the cluster has been deployed + Location string `json:"location,omitempty"` + + // ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster. + ResourceGroupName string `json:"resourceGroupName,omitempty"` + + // ProviderType indicates the type of cluster that was created + ProviderType IBMCloudProviderType `json:"providerType,omitempty"` + + // CISInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` +} + +// KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider. +// This only includes fields that can be modified in the cluster. +type KubevirtPlatformSpec struct{} + +// KubevirtPlatformStatus holds the current status of the kubevirt infrastructure provider. +type KubevirtPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + IngressIP string `json:"ingressIP,omitempty"` +} + +// EquinixMetalPlatformSpec holds the desired state of the Equinix Metal infrastructure provider. +// This only includes fields that can be modified in the cluster. +type EquinixMetalPlatformSpec struct{} + +// EquinixMetalPlatformStatus holds the current status of the Equinix Metal infrastructure provider. +type EquinixMetalPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + IngressIP string `json:"ingressIP,omitempty"` +} + +// PowervsServiceEndpoint stores the configuration of a custom url to +// override existing defaults of PowerVS Services. +type PowerVSServiceEndpoint struct { + // name is the name of the Power VS service. + // Few of the services are + // IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api + // ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller + // Power Cloud - https://cloud.ibm.com/apidocs/power-cloud + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:Pattern=`^[a-z0-9-]+$` + Name string `json:"name"` + + // url is fully qualified URI with scheme https, that overrides the default generated + // endpoint for a client. + // This must be provided and cannot be empty. + // + // +kubebuilder:validation:Required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Format=uri + // +kubebuilder:validation:Pattern=`^https://` + URL string `json:"url"` +} + +// PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. +// This only includes fields that can be modified in the cluster. +type PowerVSPlatformSpec struct { + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +listType=map + // +listMapKey=name + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` +} + +// PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider. +// +kubebuilder:validation:XValidation:rule="!has(oldSelf.resourceGroup) || has(self.resourceGroup)",message="cannot unset resourceGroup once set" +type PowerVSPlatformStatus struct { + // region holds the default Power VS region for new Power VS resources created by the cluster. + Region string `json:"region"` + + // zone holds the default zone for the new Power VS resources created by the cluster. + // Note: Currently only single-zone OCP clusters are supported + Zone string `json:"zone"` + + // resourceGroup is the resource group name for new IBMCloud resources created for a cluster. + // The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. + // More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. + // When omitted, the image registry operator won't be able to configure storage, + // which results in the image registry cluster operator not being in an available state. + // + // +kubebuilder:validation:Pattern=^[a-zA-Z0-9-_ ]+$ + // +kubebuilder:validation:MaxLength=40 + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="resourceGroup is immutable once set" + // +optional + ResourceGroup string `json:"resourceGroup"` + + // serviceEndpoints is a list of custom endpoints which will override the default + // service endpoints of a Power VS service. + // +optional + ServiceEndpoints []PowerVSServiceEndpoint `json:"serviceEndpoints,omitempty"` + + // CISInstanceCRN is the CRN of the Cloud Internet Services instance managing + // the DNS zone for the cluster's base domain + CISInstanceCRN string `json:"cisInstanceCRN,omitempty"` + + // DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone + // for the cluster's base domain + DNSInstanceCRN string `json:"dnsInstanceCRN,omitempty"` +} + +// AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. +// This only includes fields that can be modified in the cluster. +type AlibabaCloudPlatformSpec struct{} + +// AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider. +type AlibabaCloudPlatformStatus struct { + // region specifies the region for Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:Required + // +kubebuilder:validation:Pattern=`^[0-9A-Za-z-]+$` + // +required + Region string `json:"region"` + // resourceGroupID is the ID of the resource group for the cluster. + // +kubebuilder:validation:Pattern=`^(rg-[0-9A-Za-z]+)?$` + // +optional + ResourceGroupID string `json:"resourceGroupID,omitempty"` + // resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster. + // +kubebuilder:validation:MaxItems=20 + // +listType=map + // +listMapKey=key + // +optional + ResourceTags []AlibabaCloudResourceTag `json:"resourceTags,omitempty"` +} + +// AlibabaCloudResourceTag is the set of tags to add to apply to resources. +type AlibabaCloudResourceTag struct { + // key is the key of the tag. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Key string `json:"key"` + // value is the value of the tag. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=128 + // +required + Value string `json:"value"` +} + +// NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform. +// +union +type NutanixPlatformLoadBalancer struct { + // type defines the type of load balancer used by the cluster on Nutanix platform + // which can be a user-managed or openshift-managed load balancer + // that is to be used for the OpenShift API and Ingress endpoints. + // When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing + // defined in the machine config operator will be deployed. + // When set to UserManaged these static pods will not be deployed and it is expected that + // the load balancer is configured out of band by the deployer. + // When omitted, this means no opinion and the platform is left to choose a reasonable default. + // The default value is OpenShiftManagedDefault. + // +default="OpenShiftManagedDefault" + // +kubebuilder:default:="OpenShiftManagedDefault" + // +kubebuilder:validation:Enum:="OpenShiftManagedDefault";"UserManaged" + // +kubebuilder:validation:XValidation:rule="oldSelf == '' || self == oldSelf",message="type is immutable once set" + // +optional + // +unionDiscriminator + Type PlatformLoadBalancerType `json:"type,omitempty"` +} + +// NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. +// This only includes fields that can be modified in the cluster. +type NutanixPlatformSpec struct { + // prismCentral holds the endpoint address and port to access the Nutanix Prism Central. + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +kubebuilder:validation:Required + PrismCentral NutanixPrismEndpoint `json:"prismCentral"` + + // prismElements holds one or more endpoint address and port data to access the Nutanix + // Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one + // Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) + // used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) + // spread over multiple Prism Elements (clusters) of the Prism Central. + // +kubebuilder:validation:Required + // +listType=map + // +listMapKey=name + PrismElements []NutanixPrismElementEndpoint `json:"prismElements"` +} + +// NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster) +type NutanixPrismEndpoint struct { + // address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster) + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=256 + Address string `json:"address"` + + // port is the port number to access the Nutanix Prism Central or Element (cluster) + // +kubebuilder:validation:Required + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=65535 + Port int32 `json:"port"` +} + +// NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster) +type NutanixPrismElementEndpoint struct { + // name is the name of the Prism Element (cluster). This value will correspond with + // the cluster field configured on other resources (eg Machines, PVCs, etc). + // +kubebuilder:validation:Required + // +kubebuilder:validation:MaxLength=256 + Name string `json:"name"` + + // endpoint holds the endpoint address and port data of the Prism Element (cluster). + // When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. + // Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the + // proxy spec.noProxy list. + // +kubebuilder:validation:Required + Endpoint NutanixPrismEndpoint `json:"endpoint"` +} + +// NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider. +type NutanixPlatformStatus struct { + // apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used + // by components inside the cluster, like kubelets using the infrastructure rather + // than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI + // points to. It is the IP for a self-hosted load balancer in front of the API servers. + // + // Deprecated: Use APIServerInternalIPs instead. + APIServerInternalIP string `json:"apiServerInternalIP,omitempty"` + + // apiServerInternalIPs are the IP addresses to contact the Kubernetes API + // server that can be used by components inside the cluster, like kubelets + // using the infrastructure rather than Kubernetes networking. These are the + // IPs for a self-hosted load balancer in front of the API servers. In dual + // stack clusters this list contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + APIServerInternalIPs []string `json:"apiServerInternalIPs"` + + // ingressIP is an external IP which routes to the default ingress controller. + // The IP is a suitable target of a wildcard DNS record used to resolve default route host names. + // + // Deprecated: Use IngressIPs instead. + IngressIP string `json:"ingressIP,omitempty"` + + // ingressIPs are the external IPs which route to the default ingress + // controller. The IPs are suitable targets of a wildcard DNS record used to + // resolve default route host names. In dual stack clusters this list + // contains two IPs otherwise only one. + // + // +kubebuilder:validation:Format=ip + // +kubebuilder:validation:MaxItems=2 + IngressIPs []string `json:"ingressIPs"` + + // loadBalancer defines how the load balancer used by the cluster is configured. + // +default={"type": "OpenShiftManagedDefault"} + // +kubebuilder:default={"type": "OpenShiftManagedDefault"} + // +openshift:enable:FeatureSets=TechPreviewNoUpgrade + // +optional + LoadBalancer *NutanixPlatformLoadBalancer `json:"loadBalancer,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// InfrastructureList is +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type InfrastructureList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Infrastructure `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_ingress.go b/vendor/github.com/openshift/api/config/v1/types_ingress.go new file mode 100644 index 00000000..e518f676 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_ingress.go @@ -0,0 +1,334 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Ingress holds cluster-wide information about ingress, including the default ingress domain +// used for routes. The canonical name is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Ingress struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec IngressSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status IngressStatus `json:"status"` +} + +type IngressSpec struct { + // domain is used to generate a default host name for a route when the + // route's host name is empty. The generated host name will follow this + // pattern: "..". + // + // It is also used as the default wildcard domain suffix for ingress. The + // default ingresscontroller domain will follow this pattern: "*.". + // + // Once set, changing domain is not currently supported. + Domain string `json:"domain"` + + // appsDomain is an optional domain to use instead of the one specified + // in the domain field when a Route is created without specifying an explicit + // host. If appsDomain is nonempty, this value is used to generate default + // host values for Route. Unlike domain, appsDomain may be modified after + // installation. + // This assumes a new ingresscontroller has been setup with a wildcard + // certificate. + // +optional + AppsDomain string `json:"appsDomain,omitempty"` + + // componentRoutes is an optional list of routes that are managed by OpenShift components + // that a cluster-admin is able to configure the hostname and serving certificate for. + // The namespace and name of each route in this list should match an existing entry in the + // status.componentRoutes list. + // + // To determine the set of configurable Routes, look at namespace and name of entries in the + // .status.componentRoutes list, where participating operators write the status of + // configurable routes. + // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name + ComponentRoutes []ComponentRouteSpec `json:"componentRoutes,omitempty"` + + // requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes + // matching the domainPattern/s and namespaceSelector/s that are specified in the policy. + // Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route + // annotation, and affect route admission. + // + // A candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: + // "haproxy.router.openshift.io/hsts_header" + // E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains + // + // - For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route + // is rejected. + // - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies + // determines the route's admission status. + // - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, + // then it may use any HSTS Policy annotation. + // + // The HSTS policy configuration may be changed after routes have already been created. An update to a previously + // admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. + // However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working. + // + // Note that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid. + // +optional + RequiredHSTSPolicies []RequiredHSTSPolicy `json:"requiredHSTSPolicies,omitempty"` + + // loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure + // provider of the current cluster and are required for Ingress Controller to work on OpenShift. + // +optional + LoadBalancer LoadBalancer `json:"loadBalancer,omitempty"` +} + +// IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider +// of the current cluster. Since these are used at spec-level for the underlying cluster, it +// is supposed that only one of the spec structs is set. +// +union +type IngressPlatformSpec struct { + // type is the underlying infrastructure provider for the cluster. + // Allowed values are "AWS", "Azure", "BareMetal", "GCP", "Libvirt", + // "OpenStack", "VSphere", "oVirt", "KubeVirt", "EquinixMetal", "PowerVS", + // "AlibabaCloud", "Nutanix" and "None". Individual components may not support all platforms, + // and must handle unrecognized platforms as None if they do not support that platform. + // + // +unionDiscriminator + Type PlatformType `json:"type"` + + // aws contains settings specific to the Amazon Web Services infrastructure provider. + // +optional + AWS *AWSIngressSpec `json:"aws,omitempty"` +} + +type LoadBalancer struct { + // platform holds configuration specific to the underlying + // infrastructure provider for the ingress load balancers. + // When omitted, this means the user has no opinion and the platform is left + // to choose reasonable defaults. These defaults are subject to change over time. + // +optional + Platform IngressPlatformSpec `json:"platform,omitempty"` +} + +// AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. +// This only includes fields that can be modified in the cluster. +// +union +type AWSIngressSpec struct { + // type allows user to set a load balancer type. + // When this field is set the default ingresscontroller will get created using the specified LBType. + // If this field is not set then the default ingress controller of LBType Classic will be created. + // Valid values are: + // + // * "Classic": A Classic Load Balancer that makes routing decisions at either + // the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See + // the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb + // + // * "NLB": A Network Load Balancer that makes routing decisions at the + // transport layer (TCP/SSL). See the following for additional details: + // + // https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb + // +unionDiscriminator + // +kubebuilder:validation:Enum:=NLB;Classic + // +kubebuilder:validation:Required + Type AWSLBType `json:"type,omitempty"` +} + +type AWSLBType string + +const ( + // NLB is the Network Load Balancer Type of AWS. Using NLB one can set NLB load balancer type for the default ingress controller. + NLB AWSLBType = "NLB" + + // Classic is the Classic Load Balancer Type of AWS. Using CLassic one can set Classic load balancer type for the default ingress controller. + Classic AWSLBType = "Classic" +) + +// ConsumingUser is an alias for string which we add validation to. Currently only service accounts are supported. +// +kubebuilder:validation:Pattern="^system:serviceaccount:[a-z0-9]([-a-z0-9]*[a-z0-9])?:[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$" +// +kubebuilder:validation:MinLength=1 +// +kubebuilder:validation:MaxLength=512 +type ConsumingUser string + +// Hostname is an alias for hostname string validation. +// +// The left operand of the | is the original kubebuilder hostname validation format, which is incorrect because it +// allows upper case letters, disallows hyphen or number in the TLD, and allows labels to start/end in non-alphanumeric +// characters. See https://bugzilla.redhat.com/show_bug.cgi?id=2039256. +// ^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$ +// +// The right operand of the | is a new pattern that mimics the current API route admission validation on hostname, +// except that it allows hostnames longer than the maximum length: +// ^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$ +// +// Both operand patterns are made available so that modifications on ingress spec can still happen after an invalid hostname +// was saved via validation by the incorrect left operand of the | operator. +// +// +kubebuilder:validation:Pattern=`^([a-zA-Z0-9\p{S}\p{L}]((-?[a-zA-Z0-9\p{S}\p{L}]{0,62})?)|([a-zA-Z0-9\p{S}\p{L}](([a-zA-Z0-9-\p{S}\p{L}]{0,61}[a-zA-Z0-9\p{S}\p{L}])?)(\.)){1,}([a-zA-Z\p{L}]){2,63})$|^(([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})[\.]){0,}([a-z0-9][-a-z0-9]{0,61}[a-z0-9]|[a-z0-9]{1,63})$` +type Hostname string + +type IngressStatus struct { + // componentRoutes is where participating operators place the current route status for routes whose + // hostnames and serving certificates can be customized by the cluster-admin. + // +optional + // +listType=map + // +listMapKey=namespace + // +listMapKey=name + ComponentRoutes []ComponentRouteStatus `json:"componentRoutes,omitempty"` + + // defaultPlacement is set at installation time to control which + // nodes will host the ingress router pods by default. The options are + // control-plane nodes or worker nodes. + // + // This field works by dictating how the Cluster Ingress Operator will + // consider unset replicas and nodePlacement fields in IngressController + // resources when creating the corresponding Deployments. + // + // See the documentation for the IngressController replicas and nodePlacement + // fields for more information. + // + // When omitted, the default value is Workers + // + // +kubebuilder:validation:Enum:="ControlPlane";"Workers";"" + // +optional + DefaultPlacement DefaultPlacement `json:"defaultPlacement"` +} + +// ComponentRouteSpec allows for configuration of a route's hostname and serving certificate. +type ComponentRouteSpec struct { + // namespace is the namespace of the route to customize. + // + // The namespace and name of this componentRoute must match a corresponding + // entry in the list of status.componentRoutes if the route is to be customized. + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Required + // +required + Namespace string `json:"namespace"` + + // name is the logical name of the route to customize. + // + // The namespace and name of this componentRoute must match a corresponding + // entry in the list of status.componentRoutes if the route is to be customized. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` + + // hostname is the hostname that should be used by the route. + // +kubebuilder:validation:Required + // +required + Hostname Hostname `json:"hostname"` + + // servingCertKeyPairSecret is a reference to a secret of type `kubernetes.io/tls` in the openshift-config namespace. + // The serving cert/key pair must match and will be used by the operator to fulfill the intent of serving with this name. + // If the custom hostname uses the default routing suffix of the cluster, + // the Secret specification for a serving certificate will not be needed. + // +optional + ServingCertKeyPairSecret SecretNameReference `json:"servingCertKeyPairSecret"` +} + +// ComponentRouteStatus contains information allowing configuration of a route's hostname and serving certificate. +type ComponentRouteStatus struct { + // namespace is the namespace of the route to customize. It must be a real namespace. Using an actual namespace + // ensures that no two components will conflict and the same component can be installed multiple times. + // + // The namespace and name of this componentRoute must match a corresponding + // entry in the list of spec.componentRoutes if the route is to be customized. + // +kubebuilder:validation:Pattern=^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=63 + // +kubebuilder:validation:Required + // +required + Namespace string `json:"namespace"` + + // name is the logical name of the route to customize. It does not have to be the actual name of a route resource + // but it cannot be renamed. + // + // The namespace and name of this componentRoute must match a corresponding + // entry in the list of spec.componentRoutes if the route is to be customized. + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:MaxLength=256 + // +kubebuilder:validation:Required + // +required + Name string `json:"name"` + + // defaultHostname is the hostname of this route prior to customization. + // +kubebuilder:validation:Required + // +required + DefaultHostname Hostname `json:"defaultHostname"` + + // consumingUsers is a slice of ServiceAccounts that need to have read permission on the servingCertKeyPairSecret secret. + // +kubebuilder:validation:MaxItems=5 + // +optional + ConsumingUsers []ConsumingUser `json:"consumingUsers,omitempty"` + + // currentHostnames is the list of current names used by the route. Typically, this list should consist of a single + // hostname, but if multiple hostnames are supported by the route the operator may write multiple entries to this list. + // +kubebuilder:validation:MinItems=1 + // +optional + CurrentHostnames []Hostname `json:"currentHostnames,omitempty"` + + // conditions are used to communicate the state of the componentRoutes entry. + // + // Supported conditions include Available, Degraded and Progressing. + // + // If available is true, the content served by the route can be accessed by users. This includes cases + // where a default may continue to serve content while the customized route specified by the cluster-admin + // is being configured. + // + // If Degraded is true, that means something has gone wrong trying to handle the componentRoutes entry. + // The currentHostnames field may or may not be in effect. + // + // If Progressing is true, that means the component is taking some action related to the componentRoutes entry. + // +optional + // +listType=map + // +listMapKey=type + Conditions []metav1.Condition `json:"conditions,omitempty"` + + // relatedObjects is a list of resources which are useful when debugging or inspecting how spec.componentRoutes is applied. + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:Required + // +required + RelatedObjects []ObjectReference `json:"relatedObjects"` +} + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +openshift:compatibility-gen:level=1 +type IngressList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Ingress `json:"items"` +} + +// DefaultPlacement defines the default placement of ingress router pods. +type DefaultPlacement string + +const ( + // "Workers" is for having router pods placed on worker nodes by default. + DefaultPlacementWorkers DefaultPlacement = "Workers" + + // "ControlPlane" is for having router pods placed on control-plane nodes by default. + DefaultPlacementControlPlane DefaultPlacement = "ControlPlane" +) diff --git a/vendor/github.com/openshift/api/config/v1/types_network.go b/vendor/github.com/openshift/api/config/v1/types_network.go new file mode 100644 index 00000000..c79bc8cf --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_network.go @@ -0,0 +1,183 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. +// Please view network.spec for an explanation on what applies when configuring this resource. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Network struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration. + // As a general rule, this SHOULD NOT be read directly. Instead, you should + // consume the NetworkStatus, as it indicates the currently deployed configuration. + // Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. + // +kubebuilder:validation:Required + // +required + Spec NetworkSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status NetworkStatus `json:"status"` +} + +// NetworkSpec is the desired network configuration. +// As a general rule, this SHOULD NOT be read directly. Instead, you should +// consume the NetworkStatus, as it indicates the currently deployed configuration. +// Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each. +type NetworkSpec struct { + // IP address pool to use for pod IPs. + // This field is immutable after installation. + ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork"` + + // IP address pool for services. + // Currently, we only support a single entry here. + // This field is immutable after installation. + ServiceNetwork []string `json:"serviceNetwork"` + + // NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). + // This should match a value that the cluster-network-operator understands, + // or else no networking will be installed. + // Currently supported values are: + // - OpenShiftSDN + // This field is immutable after installation. + NetworkType string `json:"networkType"` + + // externalIP defines configuration for controllers that + // affect Service.ExternalIP. If nil, then ExternalIP is + // not allowed to be set. + // +optional + ExternalIP *ExternalIPConfig `json:"externalIP,omitempty"` + + // The port range allowed for Services of type NodePort. + // If not specified, the default of 30000-32767 will be used. + // Such Services without a NodePort specified will have one + // automatically allocated from this range. + // This parameter can be updated after the cluster is + // installed. + // +kubebuilder:validation:Pattern=`^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$` + ServiceNodePortRange string `json:"serviceNodePortRange,omitempty"` +} + +// NetworkStatus is the current network configuration. +type NetworkStatus struct { + // IP address pool to use for pod IPs. + ClusterNetwork []ClusterNetworkEntry `json:"clusterNetwork,omitempty"` + + // IP address pool for services. + // Currently, we only support a single entry here. + ServiceNetwork []string `json:"serviceNetwork,omitempty"` + + // NetworkType is the plugin that is deployed (e.g. OpenShiftSDN). + NetworkType string `json:"networkType,omitempty"` + + // ClusterNetworkMTU is the MTU for inter-pod networking. + ClusterNetworkMTU int `json:"clusterNetworkMTU,omitempty"` + + // Migration contains the cluster network migration configuration. + Migration *NetworkMigration `json:"migration,omitempty"` +} + +// ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs +// are allocated. +type ClusterNetworkEntry struct { + // The complete block for pod IPs. + CIDR string `json:"cidr"` + + // The size (prefix) of block to allocate to each node. If this + // field is not used by the plugin, it can be left unset. + // +kubebuilder:validation:Minimum=0 + // +optional + HostPrefix uint32 `json:"hostPrefix,omitempty"` +} + +// ExternalIPConfig specifies some IP blocks relevant for the ExternalIP field +// of a Service resource. +type ExternalIPConfig struct { + // policy is a set of restrictions applied to the ExternalIP field. + // If nil or empty, then ExternalIP is not allowed to be set. + // +optional + Policy *ExternalIPPolicy `json:"policy,omitempty"` + + // autoAssignCIDRs is a list of CIDRs from which to automatically assign + // Service.ExternalIP. These are assigned when the service is of type + // LoadBalancer. In general, this is only useful for bare-metal clusters. + // In Openshift 3.x, this was misleadingly called "IngressIPs". + // Automatically assigned External IPs are not affected by any + // ExternalIPPolicy rules. + // Currently, only one entry may be provided. + // +optional + AutoAssignCIDRs []string `json:"autoAssignCIDRs,omitempty"` +} + +// ExternalIPPolicy configures exactly which IPs are allowed for the ExternalIP +// field in a Service. If the zero struct is supplied, then none are permitted. +// The policy controller always allows automatically assigned external IPs. +type ExternalIPPolicy struct { + // allowedCIDRs is the list of allowed CIDRs. + AllowedCIDRs []string `json:"allowedCIDRs,omitempty"` + + // rejectedCIDRs is the list of disallowed CIDRs. These take precedence + // over allowedCIDRs. + // +optional + RejectedCIDRs []string `json:"rejectedCIDRs,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type NetworkList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Network `json:"items"` +} + +// NetworkMigration represents the cluster network configuration. +type NetworkMigration struct { + // NetworkType is the target plugin that is to be deployed. + // Currently supported values are: OpenShiftSDN, OVNKubernetes + // +kubebuilder:validation:Enum={"OpenShiftSDN","OVNKubernetes"} + // +optional + NetworkType string `json:"networkType,omitempty"` + + // MTU contains the MTU migration configuration. + // +optional + MTU *MTUMigration `json:"mtu,omitempty"` +} + +// MTUMigration contains infomation about MTU migration. +type MTUMigration struct { + // Network contains MTU migration configuration for the default network. + // +optional + Network *MTUMigrationValues `json:"network,omitempty"` + + // Machine contains MTU migration configuration for the machine's uplink. + // +optional + Machine *MTUMigrationValues `json:"machine,omitempty"` +} + +// MTUMigrationValues contains the values for a MTU migration. +type MTUMigrationValues struct { + // To is the MTU to migrate to. + // +kubebuilder:validation:Minimum=0 + To *uint32 `json:"to"` + + // From is the MTU to migrate from. + // +kubebuilder:validation:Minimum=0 + // +optional + From *uint32 `json:"from,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_node.go b/vendor/github.com/openshift/api/config/v1/types_node.go new file mode 100644 index 00000000..233c89d9 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_node.go @@ -0,0 +1,114 @@ +package v1 + +import ( + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Node holds cluster-wide information about node specific features. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +// +kubebuilder:resource:path=nodes,scope=Cluster +// +kubebuilder:subresource:status +type Node struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec NodeSpec `json:"spec"` + + // status holds observed values. + // +optional + Status NodeStatus `json:"status"` +} + +type NodeSpec struct { + // CgroupMode determines the cgroups version on the node + // +optional + CgroupMode CgroupMode `json:"cgroupMode,omitempty"` + + // WorkerLatencyProfile determins the how fast the kubelet is updating + // the status and corresponding reaction of the cluster + // +optional + WorkerLatencyProfile WorkerLatencyProfileType `json:"workerLatencyProfile,omitempty"` +} + +type NodeStatus struct{} + +// +kubebuilder:validation:Enum=v1;v2;"" +type CgroupMode string + +const ( + CgroupModeEmpty CgroupMode = "" // Empty string indicates to honor user set value on the system that should not be overridden by OpenShift + CgroupModeV1 CgroupMode = "v1" + CgroupModeV2 CgroupMode = "v2" + CgroupModeDefault CgroupMode = CgroupModeV1 +) + +// +kubebuilder:validation:Enum=Default;MediumUpdateAverageReaction;LowUpdateSlowReaction +type WorkerLatencyProfileType string + +const ( + // Medium Kubelet Update Frequency (heart-beat) and Average Reaction Time to unresponsive Node + MediumUpdateAverageReaction WorkerLatencyProfileType = "MediumUpdateAverageReaction" + + // Low Kubelet Update Frequency (heart-beat) and Slow Reaction Time to unresponsive Node + LowUpdateSlowReaction WorkerLatencyProfileType = "LowUpdateSlowReaction" + + // Default values of relavent Kubelet, Kube Controller Manager and Kube API Server + DefaultUpdateDefaultReaction WorkerLatencyProfileType = "Default" +) + +const ( + // DefaultNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeStatusUpdateFrequency = 10 * time.Second + // DefaultNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNodeMonitorGracePeriod = 40 * time.Second + // DefaultNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultNotReadyTolerationSeconds = 300 + // DefaultUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of DefaultUpdateDefaultReaction WorkerLatencyProfile type + DefaultUnreachableTolerationSeconds = 300 + + // MediumNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeStatusUpdateFrequency = 20 * time.Second + // MediumNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNodeMonitorGracePeriod = 2 * time.Minute + // MediumNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumNotReadyTolerationSeconds = 60 + // MediumUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of MediumUpdateAverageReaction WorkerLatencyProfile type + MediumUnreachableTolerationSeconds = 60 + + // LowNodeStatusUpdateFrequency refers to the "--node-status-update-frequency" of the kubelet in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeStatusUpdateFrequency = 1 * time.Minute + // LowNodeMonitorGracePeriod refers to the "--node-monitor-grace-period" of the Kube Controller Manager in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNodeMonitorGracePeriod = 5 * time.Minute + // LowNotReadyTolerationSeconds refers to the "--default-not-ready-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowNotReadyTolerationSeconds = 60 + // LowUnreachableTolerationSeconds refers to the "--default-unreachable-toleration-seconds" of the Kube API Server in case of LowUpdateSlowReaction WorkerLatencyProfile type + LowUnreachableTolerationSeconds = 60 +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type NodeList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Node `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_oauth.go b/vendor/github.com/openshift/api/config/v1/types_oauth.go new file mode 100644 index 00000000..451a5ec3 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_oauth.go @@ -0,0 +1,592 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// OAuth Server and Identity Provider Config + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. +// It is used to configure the integrated OAuth server. +// This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type OAuth struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata"` + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec OAuthSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status OAuthStatus `json:"status"` +} + +// OAuthSpec contains desired cluster auth configuration +type OAuthSpec struct { + // identityProviders is an ordered list of ways for a user to identify themselves. + // When this list is empty, no identities are provisioned for users. + // +optional + // +listType=atomic + IdentityProviders []IdentityProvider `json:"identityProviders,omitempty"` + + // tokenConfig contains options for authorization and access tokens + TokenConfig TokenConfig `json:"tokenConfig"` + + // templates allow you to customize pages like the login page. + // +optional + Templates OAuthTemplates `json:"templates"` +} + +// OAuthStatus shows current known state of OAuth server in the cluster +type OAuthStatus struct { + // TODO Fill in with status of identityProviders and templates (and maybe tokenConfig) +} + +// TokenConfig holds the necessary configuration options for authorization and access tokens +type TokenConfig struct { + // accessTokenMaxAgeSeconds defines the maximum age of access tokens + AccessTokenMaxAgeSeconds int32 `json:"accessTokenMaxAgeSeconds,omitempty"` + + // accessTokenInactivityTimeoutSeconds - DEPRECATED: setting this field has no effect. + // +optional + AccessTokenInactivityTimeoutSeconds int32 `json:"accessTokenInactivityTimeoutSeconds,omitempty"` + + // accessTokenInactivityTimeout defines the token inactivity timeout + // for tokens granted by any client. + // The value represents the maximum amount of time that can occur between + // consecutive uses of the token. Tokens become invalid if they are not + // used within this temporal window. The user will need to acquire a new + // token to regain access once a token times out. Takes valid time + // duration string such as "5m", "1.5h" or "2h45m". The minimum allowed + // value for duration is 300s (5 minutes). If the timeout is configured + // per client, then that value takes precedence. If the timeout value is + // not specified and the client does not override the value, then tokens + // are valid until their lifetime. + // + // WARNING: existing tokens' timeout will not be affected (lowered) by changing this value + // +optional + AccessTokenInactivityTimeout *metav1.Duration `json:"accessTokenInactivityTimeout,omitempty"` +} + +const ( + // LoginTemplateKey is the key of the login template in a secret + LoginTemplateKey = "login.html" + + // ProviderSelectionTemplateKey is the key for the provider selection template in a secret + ProviderSelectionTemplateKey = "providers.html" + + // ErrorsTemplateKey is the key for the errors template in a secret + ErrorsTemplateKey = "errors.html" + + // BindPasswordKey is the key for the LDAP bind password in a secret + BindPasswordKey = "bindPassword" + + // ClientSecretKey is the key for the oauth client secret data in a secret + ClientSecretKey = "clientSecret" + + // HTPasswdDataKey is the key for the htpasswd file data in a secret + HTPasswdDataKey = "htpasswd" +) + +// OAuthTemplates allow for customization of pages like the login page +type OAuthTemplates struct { + // login is the name of a secret that specifies a go template to use to render the login page. + // The key "login.html" is used to locate the template data. + // If specified and the secret or expected key is not found, the default login page is used. + // If the specified template is not valid, the default login page is used. + // If unspecified, the default login page is used. + // The namespace for this secret is openshift-config. + // +optional + Login SecretNameReference `json:"login"` + + // providerSelection is the name of a secret that specifies a go template to use to render + // the provider selection page. + // The key "providers.html" is used to locate the template data. + // If specified and the secret or expected key is not found, the default provider selection page is used. + // If the specified template is not valid, the default provider selection page is used. + // If unspecified, the default provider selection page is used. + // The namespace for this secret is openshift-config. + // +optional + ProviderSelection SecretNameReference `json:"providerSelection"` + + // error is the name of a secret that specifies a go template to use to render error pages + // during the authentication or grant flow. + // The key "errors.html" is used to locate the template data. + // If specified and the secret or expected key is not found, the default error page is used. + // If the specified template is not valid, the default error page is used. + // If unspecified, the default error page is used. + // The namespace for this secret is openshift-config. + // +optional + Error SecretNameReference `json:"error"` +} + +// IdentityProvider provides identities for users authenticating using credentials +type IdentityProvider struct { + // name is used to qualify the identities returned by this provider. + // - It MUST be unique and not shared by any other identity provider used + // - It MUST be a valid path segment: name cannot equal "." or ".." or contain "/" or "%" or ":" + // Ref: https://godoc.org/github.com/openshift/origin/pkg/user/apis/user/validation#ValidateIdentityProviderName + Name string `json:"name"` + + // mappingMethod determines how identities from this provider are mapped to users + // Defaults to "claim" + // +optional + MappingMethod MappingMethodType `json:"mappingMethod,omitempty"` + + IdentityProviderConfig `json:",inline"` +} + +// MappingMethodType specifies how new identities should be mapped to users when they log in +type MappingMethodType string + +const ( + // MappingMethodClaim provisions a user with the identity’s preferred user name. Fails if a user + // with that user name is already mapped to another identity. + // Default. + MappingMethodClaim MappingMethodType = "claim" + + // MappingMethodLookup looks up existing users already mapped to an identity but does not + // automatically provision users or identities. Requires identities and users be set up + // manually or using an external process. + MappingMethodLookup MappingMethodType = "lookup" + + // MappingMethodAdd provisions a user with the identity’s preferred user name. If a user with + // that user name already exists, the identity is mapped to the existing user, adding to any + // existing identity mappings for the user. + MappingMethodAdd MappingMethodType = "add" +) + +type IdentityProviderType string + +const ( + // IdentityProviderTypeBasicAuth provides identities for users authenticating with HTTP Basic Auth + IdentityProviderTypeBasicAuth IdentityProviderType = "BasicAuth" + + // IdentityProviderTypeGitHub provides identities for users authenticating using GitHub credentials + IdentityProviderTypeGitHub IdentityProviderType = "GitHub" + + // IdentityProviderTypeGitLab provides identities for users authenticating using GitLab credentials + IdentityProviderTypeGitLab IdentityProviderType = "GitLab" + + // IdentityProviderTypeGoogle provides identities for users authenticating using Google credentials + IdentityProviderTypeGoogle IdentityProviderType = "Google" + + // IdentityProviderTypeHTPasswd provides identities from an HTPasswd file + IdentityProviderTypeHTPasswd IdentityProviderType = "HTPasswd" + + // IdentityProviderTypeKeystone provides identitities for users authenticating using keystone password credentials + IdentityProviderTypeKeystone IdentityProviderType = "Keystone" + + // IdentityProviderTypeLDAP provides identities for users authenticating using LDAP credentials + IdentityProviderTypeLDAP IdentityProviderType = "LDAP" + + // IdentityProviderTypeOpenID provides identities for users authenticating using OpenID credentials + IdentityProviderTypeOpenID IdentityProviderType = "OpenID" + + // IdentityProviderTypeRequestHeader provides identities for users authenticating using request header credentials + IdentityProviderTypeRequestHeader IdentityProviderType = "RequestHeader" +) + +// IdentityProviderConfig contains configuration for using a specific identity provider +type IdentityProviderConfig struct { + // type identifies the identity provider type for this entry. + Type IdentityProviderType `json:"type"` + + // Provider-specific configuration + // The json tag MUST match the `Type` specified above, case-insensitively + // e.g. For `Type: "LDAP"`, the `ldap` configuration should be provided + + // basicAuth contains configuration options for the BasicAuth IdP + // +optional + BasicAuth *BasicAuthIdentityProvider `json:"basicAuth,omitempty"` + + // github enables user authentication using GitHub credentials + // +optional + GitHub *GitHubIdentityProvider `json:"github,omitempty"` + + // gitlab enables user authentication using GitLab credentials + // +optional + GitLab *GitLabIdentityProvider `json:"gitlab,omitempty"` + + // google enables user authentication using Google credentials + // +optional + Google *GoogleIdentityProvider `json:"google,omitempty"` + + // htpasswd enables user authentication using an HTPasswd file to validate credentials + // +optional + HTPasswd *HTPasswdIdentityProvider `json:"htpasswd,omitempty"` + + // keystone enables user authentication using keystone password credentials + // +optional + Keystone *KeystoneIdentityProvider `json:"keystone,omitempty"` + + // ldap enables user authentication using LDAP credentials + // +optional + LDAP *LDAPIdentityProvider `json:"ldap,omitempty"` + + // openID enables user authentication using OpenID credentials + // +optional + OpenID *OpenIDIdentityProvider `json:"openID,omitempty"` + + // requestHeader enables user authentication using request header credentials + // +optional + RequestHeader *RequestHeaderIdentityProvider `json:"requestHeader,omitempty"` +} + +// BasicAuthPasswordIdentityProvider provides identities for users authenticating using HTTP basic auth credentials +type BasicAuthIdentityProvider struct { + // OAuthRemoteConnectionInfo contains information about how to connect to the external basic auth server + OAuthRemoteConnectionInfo `json:",inline"` +} + +// OAuthRemoteConnectionInfo holds information necessary for establishing a remote connection +type OAuthRemoteConnectionInfo struct { + // url is the remote URL to connect to + URL string `json:"url"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // If empty, the default system roots are used. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` + + // tlsClientCert is an optional reference to a secret by name that contains the + // PEM-encoded TLS client certificate to present when connecting to the server. + // The key "tls.crt" is used to locate the data. + // If specified and the secret or expected key is not found, the identity provider is not honored. + // If the specified certificate data is not valid, the identity provider is not honored. + // The namespace for this secret is openshift-config. + // +optional + TLSClientCert SecretNameReference `json:"tlsClientCert"` + + // tlsClientKey is an optional reference to a secret by name that contains the + // PEM-encoded TLS private key for the client certificate referenced in tlsClientCert. + // The key "tls.key" is used to locate the data. + // If specified and the secret or expected key is not found, the identity provider is not honored. + // If the specified certificate data is not valid, the identity provider is not honored. + // The namespace for this secret is openshift-config. + // +optional + TLSClientKey SecretNameReference `json:"tlsClientKey"` +} + +// HTPasswdPasswordIdentityProvider provides identities for users authenticating using htpasswd credentials +type HTPasswdIdentityProvider struct { + // fileData is a required reference to a secret by name containing the data to use as the htpasswd file. + // The key "htpasswd" is used to locate the data. + // If the secret or expected key is not found, the identity provider is not honored. + // If the specified htpasswd data is not valid, the identity provider is not honored. + // The namespace for this secret is openshift-config. + FileData SecretNameReference `json:"fileData"` +} + +// LDAPPasswordIdentityProvider provides identities for users authenticating using LDAP credentials +type LDAPIdentityProvider struct { + // url is an RFC 2255 URL which specifies the LDAP search parameters to use. + // The syntax of the URL is: + // ldap://host:port/basedn?attribute?scope?filter + URL string `json:"url"` + + // bindDN is an optional DN to bind with during the search phase. + // +optional + BindDN string `json:"bindDN"` + + // bindPassword is an optional reference to a secret by name + // containing a password to bind with during the search phase. + // The key "bindPassword" is used to locate the data. + // If specified and the secret or expected key is not found, the identity provider is not honored. + // The namespace for this secret is openshift-config. + // +optional + BindPassword SecretNameReference `json:"bindPassword"` + + // insecure, if true, indicates the connection should not use TLS + // WARNING: Should not be set to `true` with the URL scheme "ldaps://" as "ldaps://" URLs always + // attempt to connect using TLS, even when `insecure` is set to `true` + // When `true`, "ldap://" URLS connect insecurely. When `false`, "ldap://" URLs are upgraded to + // a TLS connection using StartTLS as specified in https://tools.ietf.org/html/rfc2830. + Insecure bool `json:"insecure"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // If empty, the default system roots are used. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` + + // attributes maps LDAP attributes to identities + Attributes LDAPAttributeMapping `json:"attributes"` +} + +// LDAPAttributeMapping maps LDAP attributes to OpenShift identity fields +type LDAPAttributeMapping struct { + // id is the list of attributes whose values should be used as the user ID. Required. + // First non-empty attribute is used. At least one attribute is required. If none of the listed + // attribute have a value, authentication fails. + // LDAP standard identity attribute is "dn" + ID []string `json:"id"` + + // preferredUsername is the list of attributes whose values should be used as the preferred username. + // LDAP standard login attribute is "uid" + // +optional + PreferredUsername []string `json:"preferredUsername,omitempty"` + + // name is the list of attributes whose values should be used as the display name. Optional. + // If unspecified, no display name is set for the identity + // LDAP standard display name attribute is "cn" + // +optional + Name []string `json:"name,omitempty"` + + // email is the list of attributes whose values should be used as the email address. Optional. + // If unspecified, no email is set for the identity + // +optional + Email []string `json:"email,omitempty"` +} + +// KeystonePasswordIdentityProvider provides identities for users authenticating using keystone password credentials +type KeystoneIdentityProvider struct { + // OAuthRemoteConnectionInfo contains information about how to connect to the keystone server + OAuthRemoteConnectionInfo `json:",inline"` + + // domainName is required for keystone v3 + DomainName string `json:"domainName"` + + // TODO if we ever add support for 3.11 to 4.0 upgrades, add this configuration + // useUsernameIdentity indicates that users should be authenticated by username, not keystone ID + // DEPRECATED - only use this option for legacy systems to ensure backwards compatibility + // +optional + // UseUsernameIdentity bool `json:"useUsernameIdentity"` +} + +// RequestHeaderIdentityProvider provides identities for users authenticating using request header credentials +type RequestHeaderIdentityProvider struct { + // loginURL is a URL to redirect unauthenticated /authorize requests to + // Unauthenticated requests from OAuth clients which expect interactive logins will be redirected here + // ${url} is replaced with the current URL, escaped to be safe in a query parameter + // https://www.example.com/sso-login?then=${url} + // ${query} is replaced with the current query string + // https://www.example.com/auth-proxy/oauth/authorize?${query} + // Required when login is set to true. + LoginURL string `json:"loginURL"` + + // challengeURL is a URL to redirect unauthenticated /authorize requests to + // Unauthenticated requests from OAuth clients which expect WWW-Authenticate challenges will be + // redirected here. + // ${url} is replaced with the current URL, escaped to be safe in a query parameter + // https://www.example.com/sso-login?then=${url} + // ${query} is replaced with the current query string + // https://www.example.com/auth-proxy/oauth/authorize?${query} + // Required when challenge is set to true. + ChallengeURL string `json:"challengeURL"` + + // ca is a required reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // Specifically, it allows verification of incoming requests to prevent header spoofing. + // The key "ca.crt" is used to locate the data. + // If the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // The namespace for this config map is openshift-config. + ClientCA ConfigMapNameReference `json:"ca"` + + // clientCommonNames is an optional list of common names to require a match from. If empty, any + // client certificate validated against the clientCA bundle is considered authoritative. + // +optional + ClientCommonNames []string `json:"clientCommonNames,omitempty"` + + // headers is the set of headers to check for identity information + Headers []string `json:"headers"` + + // preferredUsernameHeaders is the set of headers to check for the preferred username + PreferredUsernameHeaders []string `json:"preferredUsernameHeaders"` + + // nameHeaders is the set of headers to check for the display name + NameHeaders []string `json:"nameHeaders"` + + // emailHeaders is the set of headers to check for the email address + EmailHeaders []string `json:"emailHeaders"` +} + +// GitHubIdentityProvider provides identities for users authenticating using GitHub credentials +type GitHubIdentityProvider struct { + // clientID is the oauth client ID + ClientID string `json:"clientID"` + + // clientSecret is a required reference to the secret by name containing the oauth client secret. + // The key "clientSecret" is used to locate the data. + // If the secret or expected key is not found, the identity provider is not honored. + // The namespace for this secret is openshift-config. + ClientSecret SecretNameReference `json:"clientSecret"` + + // organizations optionally restricts which organizations are allowed to log in + // +optional + Organizations []string `json:"organizations,omitempty"` + + // teams optionally restricts which teams are allowed to log in. Format is /. + // +optional + Teams []string `json:"teams,omitempty"` + + // hostname is the optional domain (e.g. "mycompany.com") for use with a hosted instance of + // GitHub Enterprise. + // It must match the GitHub Enterprise settings value configured at /setup/settings#hostname. + // +optional + Hostname string `json:"hostname"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // If empty, the default system roots are used. + // This can only be configured when hostname is set to a non-empty value. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` +} + +// GitLabIdentityProvider provides identities for users authenticating using GitLab credentials +type GitLabIdentityProvider struct { + // clientID is the oauth client ID + ClientID string `json:"clientID"` + + // clientSecret is a required reference to the secret by name containing the oauth client secret. + // The key "clientSecret" is used to locate the data. + // If the secret or expected key is not found, the identity provider is not honored. + // The namespace for this secret is openshift-config. + ClientSecret SecretNameReference `json:"clientSecret"` + + // url is the oauth server base URL + URL string `json:"url"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // If empty, the default system roots are used. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` +} + +// GoogleIdentityProvider provides identities for users authenticating using Google credentials +type GoogleIdentityProvider struct { + // clientID is the oauth client ID + ClientID string `json:"clientID"` + + // clientSecret is a required reference to the secret by name containing the oauth client secret. + // The key "clientSecret" is used to locate the data. + // If the secret or expected key is not found, the identity provider is not honored. + // The namespace for this secret is openshift-config. + ClientSecret SecretNameReference `json:"clientSecret"` + + // hostedDomain is the optional Google App domain (e.g. "mycompany.com") to restrict logins to + // +optional + HostedDomain string `json:"hostedDomain"` +} + +// OpenIDIdentityProvider provides identities for users authenticating using OpenID credentials +type OpenIDIdentityProvider struct { + // clientID is the oauth client ID + ClientID string `json:"clientID"` + + // clientSecret is a required reference to the secret by name containing the oauth client secret. + // The key "clientSecret" is used to locate the data. + // If the secret or expected key is not found, the identity provider is not honored. + // The namespace for this secret is openshift-config. + ClientSecret SecretNameReference `json:"clientSecret"` + + // ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. + // It is used as a trust anchor to validate the TLS certificate presented by the remote server. + // The key "ca.crt" is used to locate the data. + // If specified and the config map or expected key is not found, the identity provider is not honored. + // If the specified ca data is not valid, the identity provider is not honored. + // If empty, the default system roots are used. + // The namespace for this config map is openshift-config. + // +optional + CA ConfigMapNameReference `json:"ca"` + + // extraScopes are any scopes to request in addition to the standard "openid" scope. + // +optional + ExtraScopes []string `json:"extraScopes,omitempty"` + + // extraAuthorizeParameters are any custom parameters to add to the authorize request. + // +optional + ExtraAuthorizeParameters map[string]string `json:"extraAuthorizeParameters,omitempty"` + + // issuer is the URL that the OpenID Provider asserts as its Issuer Identifier. + // It must use the https scheme with no query or fragment component. + Issuer string `json:"issuer"` + + // claims mappings + Claims OpenIDClaims `json:"claims"` +} + +// UserIDClaim is the claim used to provide a stable identifier for OIDC identities. +// Per http://openid.net/specs/openid-connect-core-1_0.html#ClaimStability +// +// "The sub (subject) and iss (issuer) Claims, used together, are the only Claims that an RP can +// rely upon as a stable identifier for the End-User, since the sub Claim MUST be locally unique +// and never reassigned within the Issuer for a particular End-User, as described in Section 2. +// Therefore, the only guaranteed unique identifier for a given End-User is the combination of the +// iss Claim and the sub Claim." +const UserIDClaim = "sub" + +// OpenIDClaim represents a claim retrieved from an OpenID provider's tokens or userInfo +// responses +// +kubebuilder:validation:MinLength=1 +type OpenIDClaim string + +// OpenIDClaims contains a list of OpenID claims to use when authenticating with an OpenID identity provider +type OpenIDClaims struct { + // preferredUsername is the list of claims whose values should be used as the preferred username. + // If unspecified, the preferred username is determined from the value of the sub claim + // +listType=atomic + // +optional + PreferredUsername []string `json:"preferredUsername,omitempty"` + + // name is the list of claims whose values should be used as the display name. Optional. + // If unspecified, no display name is set for the identity + // +listType=atomic + // +optional + Name []string `json:"name,omitempty"` + + // email is the list of claims whose values should be used as the email address. Optional. + // If unspecified, no email is set for the identity + // +listType=atomic + // +optional + Email []string `json:"email,omitempty"` + + // groups is the list of claims value of which should be used to synchronize groups + // from the OIDC provider to OpenShift for the user. + // If multiple claims are specified, the first one with a non-empty value is used. + // +listType=atomic + // +optional + Groups []OpenIDClaim `json:"groups,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type OAuthList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []OAuth `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_operatorhub.go b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go new file mode 100644 index 00000000..ba2c9634 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_operatorhub.go @@ -0,0 +1,91 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// OperatorHubSpec defines the desired state of OperatorHub +type OperatorHubSpec struct { + // disableAllDefaultSources allows you to disable all the default hub + // sources. If this is true, a specific entry in sources can be used to + // enable a default source. If this is false, a specific entry in + // sources can be used to disable or enable a default source. + // +optional + DisableAllDefaultSources bool `json:"disableAllDefaultSources,omitempty"` + // sources is the list of default hub sources and their configuration. + // If the list is empty, it implies that the default hub sources are + // enabled on the cluster unless disableAllDefaultSources is true. + // If disableAllDefaultSources is true and sources is not empty, + // the configuration present in sources will take precedence. The list of + // default hub sources and their current state will always be reflected in + // the status block. + // +optional + Sources []HubSource `json:"sources,omitempty"` +} + +// OperatorHubStatus defines the observed state of OperatorHub. The current +// state of the default hub sources will always be reflected here. +type OperatorHubStatus struct { + // sources encapsulates the result of applying the configuration for each + // hub source + Sources []HubSourceStatus `json:"sources,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// OperatorHub is the Schema for the operatorhubs API. It can be used to change +// the state of the default hub sources for OperatorHub on the cluster from +// enabled to disabled and vice versa. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +kubebuilder:subresource:status +// +genclient +// +genclient:nonNamespaced +// +openshift:compatibility-gen:level=1 +type OperatorHub struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata"` + + Spec OperatorHubSpec `json:"spec"` + Status OperatorHubStatus `json:"status"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// OperatorHubList contains a list of OperatorHub +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type OperatorHubList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + Items []OperatorHub `json:"items"` +} + +// HubSource is used to specify the hub source and its configuration +type HubSource struct { + // name is the name of one of the default hub sources + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:Required + Name string `json:"name"` + // disabled is used to disable a default hub source on cluster + // +kubebuilder:Required + Disabled bool `json:"disabled"` +} + +// HubSourceStatus is used to reflect the current state of applying the +// configuration to a default source +type HubSourceStatus struct { + HubSource `json:",omitempty"` + // status indicates success or failure in applying the configuration + Status string `json:"status,omitempty"` + // message provides more information regarding failures + Message string `json:"message,omitempty"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_project.go b/vendor/github.com/openshift/api/config/v1/types_project.go new file mode 100644 index 00000000..85afb90c --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_project.go @@ -0,0 +1,65 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Project holds cluster-wide information about Project. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Project struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec ProjectSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status ProjectStatus `json:"status"` +} + +// TemplateReference references a template in a specific namespace. +// The namespace must be specified at the point of use. +type TemplateReference struct { + // name is the metadata.name of the referenced project request template + Name string `json:"name"` +} + +// ProjectSpec holds the project creation configuration. +type ProjectSpec struct { + // projectRequestMessage is the string presented to a user if they are unable to request a project via the projectrequest api endpoint + // +optional + ProjectRequestMessage string `json:"projectRequestMessage"` + + // projectRequestTemplate is the template to use for creating projects in response to projectrequest. + // This must point to a template in 'openshift-config' namespace. It is optional. + // If it is not specified, a default template is used. + // + // +optional + ProjectRequestTemplate TemplateReference `json:"projectRequestTemplate"` +} + +type ProjectStatus struct { +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ProjectList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Project `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_proxy.go b/vendor/github.com/openshift/api/config/v1/types_proxy.go new file mode 100644 index 00000000..40ed296d --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_proxy.go @@ -0,0 +1,105 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster` +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Proxy struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Spec holds user-settable values for the proxy configuration + // +kubebuilder:validation:Required + // +required + Spec ProxySpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status ProxyStatus `json:"status"` +} + +// ProxySpec contains cluster proxy creation configuration. +type ProxySpec struct { + // httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var. + // +optional + HTTPProxy string `json:"httpProxy,omitempty"` + + // httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var. + // +optional + HTTPSProxy string `json:"httpsProxy,omitempty"` + + // noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. + // Empty means unset and will not result in an env var. + // +optional + NoProxy string `json:"noProxy,omitempty"` + + // readinessEndpoints is a list of endpoints used to verify readiness of the proxy. + // +optional + ReadinessEndpoints []string `json:"readinessEndpoints,omitempty"` + + // trustedCA is a reference to a ConfigMap containing a CA certificate bundle. + // The trustedCA field should only be consumed by a proxy validator. The + // validator is responsible for reading the certificate bundle from the required + // key "ca-bundle.crt", merging it with the system default trust bundle, + // and writing the merged trust bundle to a ConfigMap named "trusted-ca-bundle" + // in the "openshift-config-managed" namespace. Clients that expect to make + // proxy connections must use the trusted-ca-bundle for all HTTPS requests to + // the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as + // well. + // + // The namespace for the ConfigMap referenced by trustedCA is + // "openshift-config". Here is an example ConfigMap (in yaml): + // + // apiVersion: v1 + // kind: ConfigMap + // metadata: + // name: user-ca-bundle + // namespace: openshift-config + // data: + // ca-bundle.crt: | + // -----BEGIN CERTIFICATE----- + // Custom CA certificate bundle. + // -----END CERTIFICATE----- + // + // +optional + TrustedCA ConfigMapNameReference `json:"trustedCA,omitempty"` +} + +// ProxyStatus shows current known state of the cluster proxy. +type ProxyStatus struct { + // httpProxy is the URL of the proxy for HTTP requests. + // +optional + HTTPProxy string `json:"httpProxy,omitempty"` + + // httpsProxy is the URL of the proxy for HTTPS requests. + // +optional + HTTPSProxy string `json:"httpsProxy,omitempty"` + + // noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used. + // +optional + NoProxy string `json:"noProxy,omitempty"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type ProxyList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Proxy `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_scheduling.go b/vendor/github.com/openshift/api/config/v1/types_scheduling.go new file mode 100644 index 00000000..7367f414 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_scheduling.go @@ -0,0 +1,111 @@ +package v1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Scheduler holds cluster-wide config information to run the Kubernetes Scheduler +// and influence its placement decisions. The canonical name for this config is `cluster`. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type Scheduler struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // spec holds user settable values for configuration + // +kubebuilder:validation:Required + // +required + Spec SchedulerSpec `json:"spec"` + // status holds observed values from the cluster. They may not be overridden. + // +optional + Status SchedulerStatus `json:"status"` +} + +type SchedulerSpec struct { + // DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. + // policy is a reference to a ConfigMap containing scheduler policy which has + // user specified predicates and priorities. If this ConfigMap is not available + // scheduler will default to use DefaultAlgorithmProvider. + // The namespace for this configmap is openshift-config. + // +optional + Policy ConfigMapNameReference `json:"policy,omitempty"` + // profile sets which scheduling profile should be set in order to configure scheduling + // decisions for new pods. + // + // Valid values are "LowNodeUtilization", "HighNodeUtilization", "NoScoring" + // Defaults to "LowNodeUtilization" + // +optional + Profile SchedulerProfile `json:"profile,omitempty"` + // defaultNodeSelector helps set the cluster-wide default node selector to + // restrict pod placement to specific nodes. This is applied to the pods + // created in all namespaces and creates an intersection with any existing + // nodeSelectors already set on a pod, additionally constraining that pod's selector. + // For example, + // defaultNodeSelector: "type=user-node,region=east" would set nodeSelector + // field in pod spec to "type=user-node,region=east" to all pods created + // in all namespaces. Namespaces having project-wide node selectors won't be + // impacted even if this field is set. This adds an annotation section to + // the namespace. + // For example, if a new namespace is created with + // node-selector='type=user-node,region=east', + // the annotation openshift.io/node-selector: type=user-node,region=east + // gets added to the project. When the openshift.io/node-selector annotation + // is set on the project the value is used in preference to the value we are setting + // for defaultNodeSelector field. + // For instance, + // openshift.io/node-selector: "type=user-node,region=west" means + // that the default of "type=user-node,region=east" set in defaultNodeSelector + // would not be applied. + // +optional + DefaultNodeSelector string `json:"defaultNodeSelector,omitempty"` + // MastersSchedulable allows masters nodes to be schedulable. When this flag is + // turned on, all the master nodes in the cluster will be made schedulable, + // so that workload pods can run on them. The default value for this field is false, + // meaning none of the master nodes are schedulable. + // Important Note: Once the workload pods start running on the master nodes, + // extreme care must be taken to ensure that cluster-critical control plane components + // are not impacted. + // Please turn on this field after doing due diligence. + // +optional + MastersSchedulable bool `json:"mastersSchedulable"` +} + +// +kubebuilder:validation:Enum="";LowNodeUtilization;HighNodeUtilization;NoScoring +type SchedulerProfile string + +var ( + // LowNodeUtililization is the default, and defines a scheduling profile which prefers to + // spread pods evenly among nodes targeting low resource consumption on each node. + LowNodeUtilization SchedulerProfile = "LowNodeUtilization" + + // HighNodeUtilization defines a scheduling profile which packs as many pods as possible onto + // as few nodes as possible targeting a small node count but high resource usage on each node. + HighNodeUtilization SchedulerProfile = "HighNodeUtilization" + + // NoScoring defines a scheduling profile which tries to provide lower-latency scheduling + // at the expense of potentially less optimal pod placement decisions. + NoScoring SchedulerProfile = "NoScoring" +) + +type SchedulerStatus struct { +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 +type SchedulerList struct { + metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + metav1.ListMeta `json:"metadata"` + + Items []Scheduler `json:"items"` +} diff --git a/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go new file mode 100644 index 00000000..9dbacb99 --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go @@ -0,0 +1,262 @@ +package v1 + +// TLSSecurityProfile defines the schema for a TLS security profile. This object +// is used by operators to apply TLS security settings to operands. +// +union +type TLSSecurityProfile struct { + // type is one of Old, Intermediate, Modern or Custom. Custom provides + // the ability to specify individual TLS security profile parameters. + // Old, Intermediate and Modern are TLS security profiles based on: + // + // https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations + // + // The profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers + // are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be + // reduced. + // + // Note that the Modern profile is currently not supported because it is not + // yet well adopted by common software libraries. + // + // +unionDiscriminator + // +optional + Type TLSProfileType `json:"type"` + // old is a TLS security profile based on: + // + // https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility + // + // and looks like this (yaml): + // + // ciphers: + // - TLS_AES_128_GCM_SHA256 + // - TLS_AES_256_GCM_SHA384 + // - TLS_CHACHA20_POLY1305_SHA256 + // - ECDHE-ECDSA-AES128-GCM-SHA256 + // - ECDHE-RSA-AES128-GCM-SHA256 + // - ECDHE-ECDSA-AES256-GCM-SHA384 + // - ECDHE-RSA-AES256-GCM-SHA384 + // - ECDHE-ECDSA-CHACHA20-POLY1305 + // - ECDHE-RSA-CHACHA20-POLY1305 + // - DHE-RSA-AES128-GCM-SHA256 + // - DHE-RSA-AES256-GCM-SHA384 + // - DHE-RSA-CHACHA20-POLY1305 + // - ECDHE-ECDSA-AES128-SHA256 + // - ECDHE-RSA-AES128-SHA256 + // - ECDHE-ECDSA-AES128-SHA + // - ECDHE-RSA-AES128-SHA + // - ECDHE-ECDSA-AES256-SHA384 + // - ECDHE-RSA-AES256-SHA384 + // - ECDHE-ECDSA-AES256-SHA + // - ECDHE-RSA-AES256-SHA + // - DHE-RSA-AES128-SHA256 + // - DHE-RSA-AES256-SHA256 + // - AES128-GCM-SHA256 + // - AES256-GCM-SHA384 + // - AES128-SHA256 + // - AES256-SHA256 + // - AES128-SHA + // - AES256-SHA + // - DES-CBC3-SHA + // minTLSVersion: TLSv1.0 + // + // +optional + // +nullable + Old *OldTLSProfile `json:"old,omitempty"` + // intermediate is a TLS security profile based on: + // + // https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29 + // + // and looks like this (yaml): + // + // ciphers: + // - TLS_AES_128_GCM_SHA256 + // - TLS_AES_256_GCM_SHA384 + // - TLS_CHACHA20_POLY1305_SHA256 + // - ECDHE-ECDSA-AES128-GCM-SHA256 + // - ECDHE-RSA-AES128-GCM-SHA256 + // - ECDHE-ECDSA-AES256-GCM-SHA384 + // - ECDHE-RSA-AES256-GCM-SHA384 + // - ECDHE-ECDSA-CHACHA20-POLY1305 + // - ECDHE-RSA-CHACHA20-POLY1305 + // - DHE-RSA-AES128-GCM-SHA256 + // - DHE-RSA-AES256-GCM-SHA384 + // minTLSVersion: TLSv1.2 + // + // +optional + // +nullable + Intermediate *IntermediateTLSProfile `json:"intermediate,omitempty"` + // modern is a TLS security profile based on: + // + // https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility + // + // and looks like this (yaml): + // + // ciphers: + // - TLS_AES_128_GCM_SHA256 + // - TLS_AES_256_GCM_SHA384 + // - TLS_CHACHA20_POLY1305_SHA256 + // minTLSVersion: TLSv1.3 + // + // NOTE: Currently unsupported. + // + // +optional + // +nullable + Modern *ModernTLSProfile `json:"modern,omitempty"` + // custom is a user-defined TLS security profile. Be extremely careful using a custom + // profile as invalid configurations can be catastrophic. An example custom profile + // looks like this: + // + // ciphers: + // - ECDHE-ECDSA-CHACHA20-POLY1305 + // - ECDHE-RSA-CHACHA20-POLY1305 + // - ECDHE-RSA-AES128-GCM-SHA256 + // - ECDHE-ECDSA-AES128-GCM-SHA256 + // minTLSVersion: TLSv1.1 + // + // +optional + // +nullable + Custom *CustomTLSProfile `json:"custom,omitempty"` +} + +// OldTLSProfile is a TLS security profile based on: +// https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility +type OldTLSProfile struct{} + +// IntermediateTLSProfile is a TLS security profile based on: +// https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29 +type IntermediateTLSProfile struct{} + +// ModernTLSProfile is a TLS security profile based on: +// https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility +type ModernTLSProfile struct{} + +// CustomTLSProfile is a user-defined TLS security profile. Be extremely careful +// using a custom TLS profile as invalid configurations can be catastrophic. +type CustomTLSProfile struct { + TLSProfileSpec `json:",inline"` +} + +// TLSProfileType defines a TLS security profile type. +// +kubebuilder:validation:Enum=Old;Intermediate;Modern;Custom +type TLSProfileType string + +const ( + // Old is a TLS security profile based on: + // https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility + TLSProfileOldType TLSProfileType = "Old" + // Intermediate is a TLS security profile based on: + // https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29 + TLSProfileIntermediateType TLSProfileType = "Intermediate" + // Modern is a TLS security profile based on: + // https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility + TLSProfileModernType TLSProfileType = "Modern" + // Custom is a TLS security profile that allows for user-defined parameters. + TLSProfileCustomType TLSProfileType = "Custom" +) + +// TLSProfileSpec is the desired behavior of a TLSSecurityProfile. +type TLSProfileSpec struct { + // ciphers is used to specify the cipher algorithms that are negotiated + // during the TLS handshake. Operators may remove entries their operands + // do not support. For example, to use DES-CBC3-SHA (yaml): + // + // ciphers: + // - DES-CBC3-SHA + // + Ciphers []string `json:"ciphers"` + // minTLSVersion is used to specify the minimal version of the TLS protocol + // that is negotiated during the TLS handshake. For example, to use TLS + // versions 1.1, 1.2 and 1.3 (yaml): + // + // minTLSVersion: TLSv1.1 + // + // NOTE: currently the highest minTLSVersion allowed is VersionTLS12 + // + MinTLSVersion TLSProtocolVersion `json:"minTLSVersion"` +} + +// TLSProtocolVersion is a way to specify the protocol version used for TLS connections. +// Protocol versions are based on the following most common TLS configurations: +// +// https://ssl-config.mozilla.org/ +// +// Note that SSLv3.0 is not a supported protocol version due to well known +// vulnerabilities such as POODLE: https://en.wikipedia.org/wiki/POODLE +// +kubebuilder:validation:Enum=VersionTLS10;VersionTLS11;VersionTLS12;VersionTLS13 +type TLSProtocolVersion string + +const ( + // VersionTLSv10 is version 1.0 of the TLS security protocol. + VersionTLS10 TLSProtocolVersion = "VersionTLS10" + // VersionTLSv11 is version 1.1 of the TLS security protocol. + VersionTLS11 TLSProtocolVersion = "VersionTLS11" + // VersionTLSv12 is version 1.2 of the TLS security protocol. + VersionTLS12 TLSProtocolVersion = "VersionTLS12" + // VersionTLSv13 is version 1.3 of the TLS security protocol. + VersionTLS13 TLSProtocolVersion = "VersionTLS13" +) + +// TLSProfiles Contains a map of TLSProfileType names to TLSProfileSpec. +// +// NOTE: The caller needs to make sure to check that these constants are valid for their binary. Not all +// entries map to values for all binaries. In the case of ties, the kube-apiserver wins. Do not fail, +// just be sure to whitelist only and everything will be ok. +var TLSProfiles = map[TLSProfileType]*TLSProfileSpec{ + TLSProfileOldType: { + Ciphers: []string{ + "TLS_AES_128_GCM_SHA256", + "TLS_AES_256_GCM_SHA384", + "TLS_CHACHA20_POLY1305_SHA256", + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDHE-RSA-AES128-GCM-SHA256", + "ECDHE-ECDSA-AES256-GCM-SHA384", + "ECDHE-RSA-AES256-GCM-SHA384", + "ECDHE-ECDSA-CHACHA20-POLY1305", + "ECDHE-RSA-CHACHA20-POLY1305", + "DHE-RSA-AES128-GCM-SHA256", + "DHE-RSA-AES256-GCM-SHA384", + "DHE-RSA-CHACHA20-POLY1305", + "ECDHE-ECDSA-AES128-SHA256", + "ECDHE-RSA-AES128-SHA256", + "ECDHE-ECDSA-AES128-SHA", + "ECDHE-RSA-AES128-SHA", + "ECDHE-ECDSA-AES256-SHA384", + "ECDHE-RSA-AES256-SHA384", + "ECDHE-ECDSA-AES256-SHA", + "ECDHE-RSA-AES256-SHA", + "DHE-RSA-AES128-SHA256", + "DHE-RSA-AES256-SHA256", + "AES128-GCM-SHA256", + "AES256-GCM-SHA384", + "AES128-SHA256", + "AES256-SHA256", + "AES128-SHA", + "AES256-SHA", + "DES-CBC3-SHA", + }, + MinTLSVersion: VersionTLS10, + }, + TLSProfileIntermediateType: { + Ciphers: []string{ + "TLS_AES_128_GCM_SHA256", + "TLS_AES_256_GCM_SHA384", + "TLS_CHACHA20_POLY1305_SHA256", + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDHE-RSA-AES128-GCM-SHA256", + "ECDHE-ECDSA-AES256-GCM-SHA384", + "ECDHE-RSA-AES256-GCM-SHA384", + "ECDHE-ECDSA-CHACHA20-POLY1305", + "ECDHE-RSA-CHACHA20-POLY1305", + "DHE-RSA-AES128-GCM-SHA256", + "DHE-RSA-AES256-GCM-SHA384", + }, + MinTLSVersion: VersionTLS12, + }, + TLSProfileModernType: { + Ciphers: []string{ + "TLS_AES_128_GCM_SHA256", + "TLS_AES_256_GCM_SHA384", + "TLS_CHACHA20_POLY1305_SHA256", + }, + MinTLSVersion: VersionTLS13, + }, +} diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go new file mode 100644 index 00000000..4db1b9ad --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go @@ -0,0 +1,5299 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServer) DeepCopyInto(out *APIServer) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServer. +func (in *APIServer) DeepCopy() *APIServer { + if in == nil { + return nil + } + out := new(APIServer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *APIServer) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerEncryption) DeepCopyInto(out *APIServerEncryption) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerEncryption. +func (in *APIServerEncryption) DeepCopy() *APIServerEncryption { + if in == nil { + return nil + } + out := new(APIServerEncryption) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerList) DeepCopyInto(out *APIServerList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]APIServer, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerList. +func (in *APIServerList) DeepCopy() *APIServerList { + if in == nil { + return nil + } + out := new(APIServerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *APIServerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerNamedServingCert) DeepCopyInto(out *APIServerNamedServingCert) { + *out = *in + if in.Names != nil { + in, out := &in.Names, &out.Names + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.ServingCertificate = in.ServingCertificate + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerNamedServingCert. +func (in *APIServerNamedServingCert) DeepCopy() *APIServerNamedServingCert { + if in == nil { + return nil + } + out := new(APIServerNamedServingCert) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerServingCerts) DeepCopyInto(out *APIServerServingCerts) { + *out = *in + if in.NamedCertificates != nil { + in, out := &in.NamedCertificates, &out.NamedCertificates + *out = make([]APIServerNamedServingCert, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerServingCerts. +func (in *APIServerServingCerts) DeepCopy() *APIServerServingCerts { + if in == nil { + return nil + } + out := new(APIServerServingCerts) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerSpec) DeepCopyInto(out *APIServerSpec) { + *out = *in + in.ServingCerts.DeepCopyInto(&out.ServingCerts) + out.ClientCA = in.ClientCA + if in.AdditionalCORSAllowedOrigins != nil { + in, out := &in.AdditionalCORSAllowedOrigins, &out.AdditionalCORSAllowedOrigins + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.Encryption = in.Encryption + if in.TLSSecurityProfile != nil { + in, out := &in.TLSSecurityProfile, &out.TLSSecurityProfile + *out = new(TLSSecurityProfile) + (*in).DeepCopyInto(*out) + } + in.Audit.DeepCopyInto(&out.Audit) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerSpec. +func (in *APIServerSpec) DeepCopy() *APIServerSpec { + if in == nil { + return nil + } + out := new(APIServerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *APIServerStatus) DeepCopyInto(out *APIServerStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIServerStatus. +func (in *APIServerStatus) DeepCopy() *APIServerStatus { + if in == nil { + return nil + } + out := new(APIServerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSIngressSpec) DeepCopyInto(out *AWSIngressSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSIngressSpec. +func (in *AWSIngressSpec) DeepCopy() *AWSIngressSpec { + if in == nil { + return nil + } + out := new(AWSIngressSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSPlatformSpec) DeepCopyInto(out *AWSPlatformSpec) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]AWSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSPlatformSpec. +func (in *AWSPlatformSpec) DeepCopy() *AWSPlatformSpec { + if in == nil { + return nil + } + out := new(AWSPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSPlatformStatus) DeepCopyInto(out *AWSPlatformStatus) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]AWSServiceEndpoint, len(*in)) + copy(*out, *in) + } + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AWSResourceTag, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSPlatformStatus. +func (in *AWSPlatformStatus) DeepCopy() *AWSPlatformStatus { + if in == nil { + return nil + } + out := new(AWSPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSResourceTag) DeepCopyInto(out *AWSResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSResourceTag. +func (in *AWSResourceTag) DeepCopy() *AWSResourceTag { + if in == nil { + return nil + } + out := new(AWSResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AWSServiceEndpoint) DeepCopyInto(out *AWSServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AWSServiceEndpoint. +func (in *AWSServiceEndpoint) DeepCopy() *AWSServiceEndpoint { + if in == nil { + return nil + } + out := new(AWSServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AdmissionConfig) DeepCopyInto(out *AdmissionConfig) { + *out = *in + if in.PluginConfig != nil { + in, out := &in.PluginConfig, &out.PluginConfig + *out = make(map[string]AdmissionPluginConfig, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + if in.EnabledAdmissionPlugins != nil { + in, out := &in.EnabledAdmissionPlugins, &out.EnabledAdmissionPlugins + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.DisabledAdmissionPlugins != nil { + in, out := &in.DisabledAdmissionPlugins, &out.DisabledAdmissionPlugins + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionConfig. +func (in *AdmissionConfig) DeepCopy() *AdmissionConfig { + if in == nil { + return nil + } + out := new(AdmissionConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AdmissionPluginConfig) DeepCopyInto(out *AdmissionPluginConfig) { + *out = *in + in.Configuration.DeepCopyInto(&out.Configuration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionPluginConfig. +func (in *AdmissionPluginConfig) DeepCopy() *AdmissionPluginConfig { + if in == nil { + return nil + } + out := new(AdmissionPluginConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformSpec) DeepCopyInto(out *AlibabaCloudPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformSpec. +func (in *AlibabaCloudPlatformSpec) DeepCopy() *AlibabaCloudPlatformSpec { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudPlatformStatus) DeepCopyInto(out *AlibabaCloudPlatformStatus) { + *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AlibabaCloudResourceTag, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudPlatformStatus. +func (in *AlibabaCloudPlatformStatus) DeepCopy() *AlibabaCloudPlatformStatus { + if in == nil { + return nil + } + out := new(AlibabaCloudPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AlibabaCloudResourceTag) DeepCopyInto(out *AlibabaCloudResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AlibabaCloudResourceTag. +func (in *AlibabaCloudResourceTag) DeepCopy() *AlibabaCloudResourceTag { + if in == nil { + return nil + } + out := new(AlibabaCloudResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Audit) DeepCopyInto(out *Audit) { + *out = *in + if in.CustomRules != nil { + in, out := &in.CustomRules, &out.CustomRules + *out = make([]AuditCustomRule, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Audit. +func (in *Audit) DeepCopy() *Audit { + if in == nil { + return nil + } + out := new(Audit) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuditConfig) DeepCopyInto(out *AuditConfig) { + *out = *in + in.PolicyConfiguration.DeepCopyInto(&out.PolicyConfiguration) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuditConfig. +func (in *AuditConfig) DeepCopy() *AuditConfig { + if in == nil { + return nil + } + out := new(AuditConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuditCustomRule) DeepCopyInto(out *AuditCustomRule) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuditCustomRule. +func (in *AuditCustomRule) DeepCopy() *AuditCustomRule { + if in == nil { + return nil + } + out := new(AuditCustomRule) + in.DeepCopyInto(out) + 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.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + 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 +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Authentication) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuthenticationList) DeepCopyInto(out *AuthenticationList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Authentication, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthenticationList. +func (in *AuthenticationList) DeepCopy() *AuthenticationList { + if in == nil { + return nil + } + out := new(AuthenticationList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *AuthenticationList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuthenticationSpec) DeepCopyInto(out *AuthenticationSpec) { + *out = *in + out.OAuthMetadata = in.OAuthMetadata + if in.WebhookTokenAuthenticators != nil { + in, out := &in.WebhookTokenAuthenticators, &out.WebhookTokenAuthenticators + *out = make([]DeprecatedWebhookTokenAuthenticator, len(*in)) + copy(*out, *in) + } + if in.WebhookTokenAuthenticator != nil { + in, out := &in.WebhookTokenAuthenticator, &out.WebhookTokenAuthenticator + *out = new(WebhookTokenAuthenticator) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthenticationSpec. +func (in *AuthenticationSpec) DeepCopy() *AuthenticationSpec { + if in == nil { + return nil + } + out := new(AuthenticationSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AuthenticationStatus) DeepCopyInto(out *AuthenticationStatus) { + *out = *in + out.IntegratedOAuthMetadata = in.IntegratedOAuthMetadata + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AuthenticationStatus. +func (in *AuthenticationStatus) DeepCopy() *AuthenticationStatus { + if in == nil { + return nil + } + out := new(AuthenticationStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzurePlatformSpec) DeepCopyInto(out *AzurePlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzurePlatformSpec. +func (in *AzurePlatformSpec) DeepCopy() *AzurePlatformSpec { + if in == nil { + return nil + } + out := new(AzurePlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzurePlatformStatus) DeepCopyInto(out *AzurePlatformStatus) { + *out = *in + if in.ResourceTags != nil { + in, out := &in.ResourceTags, &out.ResourceTags + *out = make([]AzureResourceTag, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzurePlatformStatus. +func (in *AzurePlatformStatus) DeepCopy() *AzurePlatformStatus { + if in == nil { + return nil + } + out := new(AzurePlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *AzureResourceTag) DeepCopyInto(out *AzureResourceTag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureResourceTag. +func (in *AzureResourceTag) DeepCopy() *AzureResourceTag { + if in == nil { + return nil + } + out := new(AzureResourceTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalPlatformLoadBalancer) DeepCopyInto(out *BareMetalPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalPlatformLoadBalancer. +func (in *BareMetalPlatformLoadBalancer) DeepCopy() *BareMetalPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(BareMetalPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalPlatformSpec) DeepCopyInto(out *BareMetalPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalPlatformSpec. +func (in *BareMetalPlatformSpec) DeepCopy() *BareMetalPlatformSpec { + if in == nil { + return nil + } + out := new(BareMetalPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BareMetalPlatformStatus) DeepCopyInto(out *BareMetalPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(BareMetalPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BareMetalPlatformStatus. +func (in *BareMetalPlatformStatus) DeepCopy() *BareMetalPlatformStatus { + if in == nil { + return nil + } + out := new(BareMetalPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BasicAuthIdentityProvider) DeepCopyInto(out *BasicAuthIdentityProvider) { + *out = *in + out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BasicAuthIdentityProvider. +func (in *BasicAuthIdentityProvider) DeepCopy() *BasicAuthIdentityProvider { + if in == nil { + return nil + } + out := new(BasicAuthIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Build) DeepCopyInto(out *Build) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Build. +func (in *Build) DeepCopy() *Build { + if in == nil { + return nil + } + out := new(Build) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Build) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildDefaults) DeepCopyInto(out *BuildDefaults) { + *out = *in + if in.DefaultProxy != nil { + in, out := &in.DefaultProxy, &out.DefaultProxy + *out = new(ProxySpec) + (*in).DeepCopyInto(*out) + } + if in.GitProxy != nil { + in, out := &in.GitProxy, &out.GitProxy + *out = new(ProxySpec) + (*in).DeepCopyInto(*out) + } + if in.Env != nil { + in, out := &in.Env, &out.Env + *out = make([]corev1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ImageLabels != nil { + in, out := &in.ImageLabels, &out.ImageLabels + *out = make([]ImageLabel, len(*in)) + copy(*out, *in) + } + in.Resources.DeepCopyInto(&out.Resources) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildDefaults. +func (in *BuildDefaults) DeepCopy() *BuildDefaults { + if in == nil { + return nil + } + out := new(BuildDefaults) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildList) DeepCopyInto(out *BuildList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Build, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildList. +func (in *BuildList) DeepCopy() *BuildList { + if in == nil { + return nil + } + out := new(BuildList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BuildList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildOverrides) DeepCopyInto(out *BuildOverrides) { + *out = *in + if in.ImageLabels != nil { + in, out := &in.ImageLabels, &out.ImageLabels + *out = make([]ImageLabel, len(*in)) + copy(*out, *in) + } + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Tolerations != nil { + in, out := &in.Tolerations, &out.Tolerations + *out = make([]corev1.Toleration, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ForcePull != nil { + in, out := &in.ForcePull, &out.ForcePull + *out = new(bool) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildOverrides. +func (in *BuildOverrides) DeepCopy() *BuildOverrides { + if in == nil { + return nil + } + out := new(BuildOverrides) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildSpec) DeepCopyInto(out *BuildSpec) { + *out = *in + out.AdditionalTrustedCA = in.AdditionalTrustedCA + in.BuildDefaults.DeepCopyInto(&out.BuildDefaults) + in.BuildOverrides.DeepCopyInto(&out.BuildOverrides) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildSpec. +func (in *BuildSpec) DeepCopy() *BuildSpec { + if in == nil { + return nil + } + out := new(BuildSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CertInfo) DeepCopyInto(out *CertInfo) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CertInfo. +func (in *CertInfo) DeepCopy() *CertInfo { + if in == nil { + return nil + } + out := new(CertInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClientConnectionOverrides) DeepCopyInto(out *ClientConnectionOverrides) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientConnectionOverrides. +func (in *ClientConnectionOverrides) DeepCopy() *ClientConnectionOverrides { + if in == nil { + return nil + } + out := new(ClientConnectionOverrides) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterCondition) DeepCopyInto(out *ClusterCondition) { + *out = *in + if in.PromQL != nil { + in, out := &in.PromQL, &out.PromQL + *out = new(PromQLClusterCondition) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterCondition. +func (in *ClusterCondition) DeepCopy() *ClusterCondition { + if in == nil { + return nil + } + out := new(ClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry. +func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry { + if in == nil { + return nil + } + out := new(ClusterNetworkEntry) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperator) DeepCopyInto(out *ClusterOperator) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperator. +func (in *ClusterOperator) DeepCopy() *ClusterOperator { + if in == nil { + return nil + } + out := new(ClusterOperator) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterOperator) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorList) DeepCopyInto(out *ClusterOperatorList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterOperator, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorList. +func (in *ClusterOperatorList) DeepCopy() *ClusterOperatorList { + if in == nil { + return nil + } + out := new(ClusterOperatorList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterOperatorList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorSpec) DeepCopyInto(out *ClusterOperatorSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorSpec. +func (in *ClusterOperatorSpec) DeepCopy() *ClusterOperatorSpec { + if in == nil { + return nil + } + out := new(ClusterOperatorSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatus) DeepCopyInto(out *ClusterOperatorStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]ClusterOperatorStatusCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Versions != nil { + in, out := &in.Versions, &out.Versions + *out = make([]OperandVersion, len(*in)) + copy(*out, *in) + } + if in.RelatedObjects != nil { + in, out := &in.RelatedObjects, &out.RelatedObjects + *out = make([]ObjectReference, len(*in)) + copy(*out, *in) + } + in.Extension.DeepCopyInto(&out.Extension) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatus. +func (in *ClusterOperatorStatus) DeepCopy() *ClusterOperatorStatus { + if in == nil { + return nil + } + out := new(ClusterOperatorStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterOperatorStatusCondition) DeepCopyInto(out *ClusterOperatorStatusCondition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterOperatorStatusCondition. +func (in *ClusterOperatorStatusCondition) DeepCopy() *ClusterOperatorStatusCondition { + if in == nil { + return nil + } + out := new(ClusterOperatorStatusCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersion) DeepCopyInto(out *ClusterVersion) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersion. +func (in *ClusterVersion) DeepCopy() *ClusterVersion { + if in == nil { + return nil + } + out := new(ClusterVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterVersion) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesSpec) DeepCopyInto(out *ClusterVersionCapabilitiesSpec) { + *out = *in + if in.AdditionalEnabledCapabilities != nil { + in, out := &in.AdditionalEnabledCapabilities, &out.AdditionalEnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesSpec. +func (in *ClusterVersionCapabilitiesSpec) DeepCopy() *ClusterVersionCapabilitiesSpec { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionCapabilitiesStatus) DeepCopyInto(out *ClusterVersionCapabilitiesStatus) { + *out = *in + if in.EnabledCapabilities != nil { + in, out := &in.EnabledCapabilities, &out.EnabledCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + if in.KnownCapabilities != nil { + in, out := &in.KnownCapabilities, &out.KnownCapabilities + *out = make([]ClusterVersionCapability, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionCapabilitiesStatus. +func (in *ClusterVersionCapabilitiesStatus) DeepCopy() *ClusterVersionCapabilitiesStatus { + if in == nil { + return nil + } + out := new(ClusterVersionCapabilitiesStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionList) DeepCopyInto(out *ClusterVersionList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ClusterVersion, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionList. +func (in *ClusterVersionList) DeepCopy() *ClusterVersionList { + if in == nil { + return nil + } + out := new(ClusterVersionList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ClusterVersionList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionSpec) DeepCopyInto(out *ClusterVersionSpec) { + *out = *in + if in.DesiredUpdate != nil { + in, out := &in.DesiredUpdate, &out.DesiredUpdate + *out = new(Update) + **out = **in + } + if in.Capabilities != nil { + in, out := &in.Capabilities, &out.Capabilities + *out = new(ClusterVersionCapabilitiesSpec) + (*in).DeepCopyInto(*out) + } + if in.Overrides != nil { + in, out := &in.Overrides, &out.Overrides + *out = make([]ComponentOverride, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionSpec. +func (in *ClusterVersionSpec) DeepCopy() *ClusterVersionSpec { + if in == nil { + return nil + } + out := new(ClusterVersionSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ClusterVersionStatus) DeepCopyInto(out *ClusterVersionStatus) { + *out = *in + in.Desired.DeepCopyInto(&out.Desired) + if in.History != nil { + in, out := &in.History, &out.History + *out = make([]UpdateHistory, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.Capabilities.DeepCopyInto(&out.Capabilities) + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]ClusterOperatorStatusCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.AvailableUpdates != nil { + in, out := &in.AvailableUpdates, &out.AvailableUpdates + *out = make([]Release, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ConditionalUpdates != nil { + in, out := &in.ConditionalUpdates, &out.ConditionalUpdates + *out = make([]ConditionalUpdate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterVersionStatus. +func (in *ClusterVersionStatus) DeepCopy() *ClusterVersionStatus { + if in == nil { + return nil + } + out := new(ClusterVersionStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ComponentOverride) DeepCopyInto(out *ComponentOverride) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentOverride. +func (in *ComponentOverride) DeepCopy() *ComponentOverride { + if in == nil { + return nil + } + out := new(ComponentOverride) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ComponentRouteSpec) DeepCopyInto(out *ComponentRouteSpec) { + *out = *in + out.ServingCertKeyPairSecret = in.ServingCertKeyPairSecret + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentRouteSpec. +func (in *ComponentRouteSpec) DeepCopy() *ComponentRouteSpec { + if in == nil { + return nil + } + out := new(ComponentRouteSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ComponentRouteStatus) DeepCopyInto(out *ComponentRouteStatus) { + *out = *in + if in.ConsumingUsers != nil { + in, out := &in.ConsumingUsers, &out.ConsumingUsers + *out = make([]ConsumingUser, len(*in)) + copy(*out, *in) + } + if in.CurrentHostnames != nil { + in, out := &in.CurrentHostnames, &out.CurrentHostnames + *out = make([]Hostname, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.RelatedObjects != nil { + in, out := &in.RelatedObjects, &out.RelatedObjects + *out = make([]ObjectReference, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentRouteStatus. +func (in *ComponentRouteStatus) DeepCopy() *ComponentRouteStatus { + if in == nil { + return nil + } + out := new(ComponentRouteStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdate) DeepCopyInto(out *ConditionalUpdate) { + *out = *in + in.Release.DeepCopyInto(&out.Release) + if in.Risks != nil { + in, out := &in.Risks, &out.Risks + *out = make([]ConditionalUpdateRisk, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdate. +func (in *ConditionalUpdate) DeepCopy() *ConditionalUpdate { + if in == nil { + return nil + } + out := new(ConditionalUpdate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConditionalUpdateRisk) DeepCopyInto(out *ConditionalUpdateRisk) { + *out = *in + if in.MatchingRules != nil { + in, out := &in.MatchingRules, &out.MatchingRules + *out = make([]ClusterCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConditionalUpdateRisk. +func (in *ConditionalUpdateRisk) DeepCopy() *ConditionalUpdateRisk { + if in == nil { + return nil + } + out := new(ConditionalUpdateRisk) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapFileReference) DeepCopyInto(out *ConfigMapFileReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapFileReference. +func (in *ConfigMapFileReference) DeepCopy() *ConfigMapFileReference { + if in == nil { + return nil + } + out := new(ConfigMapFileReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapNameReference) DeepCopyInto(out *ConfigMapNameReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapNameReference. +func (in *ConfigMapNameReference) DeepCopy() *ConfigMapNameReference { + if in == nil { + return nil + } + out := new(ConfigMapNameReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Console) DeepCopyInto(out *Console) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Console. +func (in *Console) DeepCopy() *Console { + if in == nil { + return nil + } + out := new(Console) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Console) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConsoleAuthentication) DeepCopyInto(out *ConsoleAuthentication) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleAuthentication. +func (in *ConsoleAuthentication) DeepCopy() *ConsoleAuthentication { + if in == nil { + return nil + } + out := new(ConsoleAuthentication) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConsoleList) DeepCopyInto(out *ConsoleList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Console, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleList. +func (in *ConsoleList) DeepCopy() *ConsoleList { + if in == nil { + return nil + } + out := new(ConsoleList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ConsoleList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConsoleSpec) DeepCopyInto(out *ConsoleSpec) { + *out = *in + out.Authentication = in.Authentication + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleSpec. +func (in *ConsoleSpec) DeepCopy() *ConsoleSpec { + if in == nil { + return nil + } + out := new(ConsoleSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConsoleStatus) DeepCopyInto(out *ConsoleStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConsoleStatus. +func (in *ConsoleStatus) DeepCopy() *ConsoleStatus { + if in == nil { + return nil + } + out := new(ConsoleStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomFeatureGates) DeepCopyInto(out *CustomFeatureGates) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = make([]FeatureGateName, len(*in)) + copy(*out, *in) + } + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = make([]FeatureGateName, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomFeatureGates. +func (in *CustomFeatureGates) DeepCopy() *CustomFeatureGates { + if in == nil { + return nil + } + out := new(CustomFeatureGates) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomTLSProfile) DeepCopyInto(out *CustomTLSProfile) { + *out = *in + in.TLSProfileSpec.DeepCopyInto(&out.TLSProfileSpec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomTLSProfile. +func (in *CustomTLSProfile) DeepCopy() *CustomTLSProfile { + if in == nil { + return nil + } + out := new(CustomTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNS) DeepCopyInto(out *DNS) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNS. +func (in *DNS) DeepCopy() *DNS { + if in == nil { + return nil + } + out := new(DNS) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DNS) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSList) DeepCopyInto(out *DNSList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]DNS, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSList. +func (in *DNSList) DeepCopy() *DNSList { + if in == nil { + return nil + } + out := new(DNSList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *DNSList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSSpec) DeepCopyInto(out *DNSSpec) { + *out = *in + if in.PublicZone != nil { + in, out := &in.PublicZone, &out.PublicZone + *out = new(DNSZone) + (*in).DeepCopyInto(*out) + } + if in.PrivateZone != nil { + in, out := &in.PrivateZone, &out.PrivateZone + *out = new(DNSZone) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSSpec. +func (in *DNSSpec) DeepCopy() *DNSSpec { + if in == nil { + return nil + } + out := new(DNSSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSStatus) DeepCopyInto(out *DNSStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSStatus. +func (in *DNSStatus) DeepCopy() *DNSStatus { + if in == nil { + return nil + } + out := new(DNSStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DNSZone) DeepCopyInto(out *DNSZone) { + *out = *in + if in.Tags != nil { + in, out := &in.Tags, &out.Tags + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSZone. +func (in *DNSZone) DeepCopy() *DNSZone { + if in == nil { + return nil + } + out := new(DNSZone) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DelegatedAuthentication) DeepCopyInto(out *DelegatedAuthentication) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DelegatedAuthentication. +func (in *DelegatedAuthentication) DeepCopy() *DelegatedAuthentication { + if in == nil { + return nil + } + out := new(DelegatedAuthentication) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DelegatedAuthorization) DeepCopyInto(out *DelegatedAuthorization) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DelegatedAuthorization. +func (in *DelegatedAuthorization) DeepCopy() *DelegatedAuthorization { + if in == nil { + return nil + } + out := new(DelegatedAuthorization) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DeprecatedWebhookTokenAuthenticator) DeepCopyInto(out *DeprecatedWebhookTokenAuthenticator) { + *out = *in + out.KubeConfig = in.KubeConfig + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedWebhookTokenAuthenticator. +func (in *DeprecatedWebhookTokenAuthenticator) DeepCopy() *DeprecatedWebhookTokenAuthenticator { + if in == nil { + return nil + } + out := new(DeprecatedWebhookTokenAuthenticator) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EquinixMetalPlatformSpec) DeepCopyInto(out *EquinixMetalPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EquinixMetalPlatformSpec. +func (in *EquinixMetalPlatformSpec) DeepCopy() *EquinixMetalPlatformSpec { + if in == nil { + return nil + } + out := new(EquinixMetalPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EquinixMetalPlatformStatus) DeepCopyInto(out *EquinixMetalPlatformStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EquinixMetalPlatformStatus. +func (in *EquinixMetalPlatformStatus) DeepCopy() *EquinixMetalPlatformStatus { + if in == nil { + return nil + } + out := new(EquinixMetalPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdConnectionInfo) DeepCopyInto(out *EtcdConnectionInfo) { + *out = *in + if in.URLs != nil { + in, out := &in.URLs, &out.URLs + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.CertInfo = in.CertInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdConnectionInfo. +func (in *EtcdConnectionInfo) DeepCopy() *EtcdConnectionInfo { + if in == nil { + return nil + } + out := new(EtcdConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EtcdStorageConfig) DeepCopyInto(out *EtcdStorageConfig) { + *out = *in + in.EtcdConnectionInfo.DeepCopyInto(&out.EtcdConnectionInfo) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EtcdStorageConfig. +func (in *EtcdStorageConfig) DeepCopy() *EtcdStorageConfig { + if in == nil { + return nil + } + out := new(EtcdStorageConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPConfig) DeepCopyInto(out *ExternalIPConfig) { + *out = *in + if in.Policy != nil { + in, out := &in.Policy, &out.Policy + *out = new(ExternalIPPolicy) + (*in).DeepCopyInto(*out) + } + if in.AutoAssignCIDRs != nil { + in, out := &in.AutoAssignCIDRs, &out.AutoAssignCIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPConfig. +func (in *ExternalIPConfig) DeepCopy() *ExternalIPConfig { + if in == nil { + return nil + } + out := new(ExternalIPConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPPolicy) DeepCopyInto(out *ExternalIPPolicy) { + *out = *in + if in.AllowedCIDRs != nil { + in, out := &in.AllowedCIDRs, &out.AllowedCIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.RejectedCIDRs != nil { + in, out := &in.RejectedCIDRs, &out.RejectedCIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPPolicy. +func (in *ExternalIPPolicy) DeepCopy() *ExternalIPPolicy { + if in == nil { + return nil + } + out := new(ExternalIPPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalPlatformSpec) DeepCopyInto(out *ExternalPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformSpec. +func (in *ExternalPlatformSpec) DeepCopy() *ExternalPlatformSpec { + if in == nil { + return nil + } + out := new(ExternalPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalPlatformStatus) DeepCopyInto(out *ExternalPlatformStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalPlatformStatus. +func (in *ExternalPlatformStatus) DeepCopy() *ExternalPlatformStatus { + if in == nil { + return nil + } + out := new(ExternalPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGate) DeepCopyInto(out *FeatureGate) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGate. +func (in *FeatureGate) DeepCopy() *FeatureGate { + if in == nil { + return nil + } + out := new(FeatureGate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *FeatureGate) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateAttributes) DeepCopyInto(out *FeatureGateAttributes) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateAttributes. +func (in *FeatureGateAttributes) DeepCopy() *FeatureGateAttributes { + if in == nil { + return nil + } + out := new(FeatureGateAttributes) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateDescription) DeepCopyInto(out *FeatureGateDescription) { + *out = *in + out.FeatureGateAttributes = in.FeatureGateAttributes + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateDescription. +func (in *FeatureGateDescription) DeepCopy() *FeatureGateDescription { + if in == nil { + return nil + } + out := new(FeatureGateDescription) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateDetails) DeepCopyInto(out *FeatureGateDetails) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = make([]FeatureGateAttributes, len(*in)) + copy(*out, *in) + } + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = make([]FeatureGateAttributes, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateDetails. +func (in *FeatureGateDetails) DeepCopy() *FeatureGateDetails { + if in == nil { + return nil + } + out := new(FeatureGateDetails) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateEnabledDisabled) DeepCopyInto(out *FeatureGateEnabledDisabled) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = make([]FeatureGateDescription, len(*in)) + copy(*out, *in) + } + if in.Disabled != nil { + in, out := &in.Disabled, &out.Disabled + *out = make([]FeatureGateDescription, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateEnabledDisabled. +func (in *FeatureGateEnabledDisabled) DeepCopy() *FeatureGateEnabledDisabled { + if in == nil { + return nil + } + out := new(FeatureGateEnabledDisabled) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateList) DeepCopyInto(out *FeatureGateList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]FeatureGate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateList. +func (in *FeatureGateList) DeepCopy() *FeatureGateList { + if in == nil { + return nil + } + out := new(FeatureGateList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *FeatureGateList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateSelection) DeepCopyInto(out *FeatureGateSelection) { + *out = *in + if in.CustomNoUpgrade != nil { + in, out := &in.CustomNoUpgrade, &out.CustomNoUpgrade + *out = new(CustomFeatureGates) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateSelection. +func (in *FeatureGateSelection) DeepCopy() *FeatureGateSelection { + if in == nil { + return nil + } + out := new(FeatureGateSelection) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateSpec) DeepCopyInto(out *FeatureGateSpec) { + *out = *in + in.FeatureGateSelection.DeepCopyInto(&out.FeatureGateSelection) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateSpec. +func (in *FeatureGateSpec) DeepCopy() *FeatureGateSpec { + if in == nil { + return nil + } + out := new(FeatureGateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *FeatureGateStatus) DeepCopyInto(out *FeatureGateStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]metav1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FeatureGates != nil { + in, out := &in.FeatureGates, &out.FeatureGates + *out = make([]FeatureGateDetails, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureGateStatus. +func (in *FeatureGateStatus) DeepCopy() *FeatureGateStatus { + if in == nil { + return nil + } + out := new(FeatureGateStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPPlatformSpec) DeepCopyInto(out *GCPPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPPlatformSpec. +func (in *GCPPlatformSpec) DeepCopy() *GCPPlatformSpec { + if in == nil { + return nil + } + out := new(GCPPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GCPPlatformStatus) DeepCopyInto(out *GCPPlatformStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPPlatformStatus. +func (in *GCPPlatformStatus) DeepCopy() *GCPPlatformStatus { + if in == nil { + return nil + } + out := new(GCPPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GenericAPIServerConfig) DeepCopyInto(out *GenericAPIServerConfig) { + *out = *in + in.ServingInfo.DeepCopyInto(&out.ServingInfo) + if in.CORSAllowedOrigins != nil { + in, out := &in.CORSAllowedOrigins, &out.CORSAllowedOrigins + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.AuditConfig.DeepCopyInto(&out.AuditConfig) + in.StorageConfig.DeepCopyInto(&out.StorageConfig) + in.AdmissionConfig.DeepCopyInto(&out.AdmissionConfig) + out.KubeClientConfig = in.KubeClientConfig + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GenericAPIServerConfig. +func (in *GenericAPIServerConfig) DeepCopy() *GenericAPIServerConfig { + if in == nil { + return nil + } + out := new(GenericAPIServerConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GenericControllerConfig) DeepCopyInto(out *GenericControllerConfig) { + *out = *in + in.ServingInfo.DeepCopyInto(&out.ServingInfo) + out.LeaderElection = in.LeaderElection + out.Authentication = in.Authentication + out.Authorization = in.Authorization + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GenericControllerConfig. +func (in *GenericControllerConfig) DeepCopy() *GenericControllerConfig { + if in == nil { + return nil + } + out := new(GenericControllerConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GitHubIdentityProvider) DeepCopyInto(out *GitHubIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + if in.Organizations != nil { + in, out := &in.Organizations, &out.Organizations + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Teams != nil { + in, out := &in.Teams, &out.Teams + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.CA = in.CA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitHubIdentityProvider. +func (in *GitHubIdentityProvider) DeepCopy() *GitHubIdentityProvider { + if in == nil { + return nil + } + out := new(GitHubIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GitLabIdentityProvider) DeepCopyInto(out *GitLabIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + out.CA = in.CA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitLabIdentityProvider. +func (in *GitLabIdentityProvider) DeepCopy() *GitLabIdentityProvider { + if in == nil { + return nil + } + out := new(GitLabIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GoogleIdentityProvider) DeepCopyInto(out *GoogleIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GoogleIdentityProvider. +func (in *GoogleIdentityProvider) DeepCopy() *GoogleIdentityProvider { + if in == nil { + return nil + } + out := new(GoogleIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HTPasswdIdentityProvider) DeepCopyInto(out *HTPasswdIdentityProvider) { + *out = *in + out.FileData = in.FileData + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTPasswdIdentityProvider. +func (in *HTPasswdIdentityProvider) DeepCopy() *HTPasswdIdentityProvider { + if in == nil { + return nil + } + out := new(HTPasswdIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HTTPServingInfo) DeepCopyInto(out *HTTPServingInfo) { + *out = *in + in.ServingInfo.DeepCopyInto(&out.ServingInfo) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPServingInfo. +func (in *HTTPServingInfo) DeepCopy() *HTTPServingInfo { + if in == nil { + return nil + } + out := new(HTTPServingInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HubSource) DeepCopyInto(out *HubSource) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HubSource. +func (in *HubSource) DeepCopy() *HubSource { + if in == nil { + return nil + } + out := new(HubSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HubSourceStatus) DeepCopyInto(out *HubSourceStatus) { + *out = *in + out.HubSource = in.HubSource + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HubSourceStatus. +func (in *HubSourceStatus) DeepCopy() *HubSourceStatus { + if in == nil { + return nil + } + out := new(HubSourceStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IBMCloudPlatformSpec) DeepCopyInto(out *IBMCloudPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMCloudPlatformSpec. +func (in *IBMCloudPlatformSpec) DeepCopy() *IBMCloudPlatformSpec { + if in == nil { + return nil + } + out := new(IBMCloudPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IBMCloudPlatformStatus) DeepCopyInto(out *IBMCloudPlatformStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IBMCloudPlatformStatus. +func (in *IBMCloudPlatformStatus) DeepCopy() *IBMCloudPlatformStatus { + if in == nil { + return nil + } + out := new(IBMCloudPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IdentityProvider) DeepCopyInto(out *IdentityProvider) { + *out = *in + in.IdentityProviderConfig.DeepCopyInto(&out.IdentityProviderConfig) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProvider. +func (in *IdentityProvider) DeepCopy() *IdentityProvider { + if in == nil { + return nil + } + out := new(IdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IdentityProviderConfig) DeepCopyInto(out *IdentityProviderConfig) { + *out = *in + if in.BasicAuth != nil { + in, out := &in.BasicAuth, &out.BasicAuth + *out = new(BasicAuthIdentityProvider) + **out = **in + } + if in.GitHub != nil { + in, out := &in.GitHub, &out.GitHub + *out = new(GitHubIdentityProvider) + (*in).DeepCopyInto(*out) + } + if in.GitLab != nil { + in, out := &in.GitLab, &out.GitLab + *out = new(GitLabIdentityProvider) + **out = **in + } + if in.Google != nil { + in, out := &in.Google, &out.Google + *out = new(GoogleIdentityProvider) + **out = **in + } + if in.HTPasswd != nil { + in, out := &in.HTPasswd, &out.HTPasswd + *out = new(HTPasswdIdentityProvider) + **out = **in + } + if in.Keystone != nil { + in, out := &in.Keystone, &out.Keystone + *out = new(KeystoneIdentityProvider) + **out = **in + } + if in.LDAP != nil { + in, out := &in.LDAP, &out.LDAP + *out = new(LDAPIdentityProvider) + (*in).DeepCopyInto(*out) + } + if in.OpenID != nil { + in, out := &in.OpenID, &out.OpenID + *out = new(OpenIDIdentityProvider) + (*in).DeepCopyInto(*out) + } + if in.RequestHeader != nil { + in, out := &in.RequestHeader, &out.RequestHeader + *out = new(RequestHeaderIdentityProvider) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityProviderConfig. +func (in *IdentityProviderConfig) DeepCopy() *IdentityProviderConfig { + if in == nil { + return nil + } + out := new(IdentityProviderConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Image) DeepCopyInto(out *Image) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Image. +func (in *Image) DeepCopy() *Image { + if in == nil { + return nil + } + out := new(Image) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Image) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageContentPolicy) DeepCopyInto(out *ImageContentPolicy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicy. +func (in *ImageContentPolicy) DeepCopy() *ImageContentPolicy { + if in == nil { + return nil + } + out := new(ImageContentPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageContentPolicy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageContentPolicyList) DeepCopyInto(out *ImageContentPolicyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageContentPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicyList. +func (in *ImageContentPolicyList) DeepCopy() *ImageContentPolicyList { + if in == nil { + return nil + } + out := new(ImageContentPolicyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageContentPolicyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageContentPolicySpec) DeepCopyInto(out *ImageContentPolicySpec) { + *out = *in + if in.RepositoryDigestMirrors != nil { + in, out := &in.RepositoryDigestMirrors, &out.RepositoryDigestMirrors + *out = make([]RepositoryDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentPolicySpec. +func (in *ImageContentPolicySpec) DeepCopy() *ImageContentPolicySpec { + if in == nil { + return nil + } + out := new(ImageContentPolicySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageDigestMirrorSet) DeepCopyInto(out *ImageDigestMirrorSet) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSet. +func (in *ImageDigestMirrorSet) DeepCopy() *ImageDigestMirrorSet { + if in == nil { + return nil + } + out := new(ImageDigestMirrorSet) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageDigestMirrorSet) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageDigestMirrorSetList) DeepCopyInto(out *ImageDigestMirrorSetList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageDigestMirrorSet, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetList. +func (in *ImageDigestMirrorSetList) DeepCopy() *ImageDigestMirrorSetList { + if in == nil { + return nil + } + out := new(ImageDigestMirrorSetList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageDigestMirrorSetList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageDigestMirrorSetSpec) DeepCopyInto(out *ImageDigestMirrorSetSpec) { + *out = *in + if in.ImageDigestMirrors != nil { + in, out := &in.ImageDigestMirrors, &out.ImageDigestMirrors + *out = make([]ImageDigestMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetSpec. +func (in *ImageDigestMirrorSetSpec) DeepCopy() *ImageDigestMirrorSetSpec { + if in == nil { + return nil + } + out := new(ImageDigestMirrorSetSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageDigestMirrorSetStatus) DeepCopyInto(out *ImageDigestMirrorSetStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrorSetStatus. +func (in *ImageDigestMirrorSetStatus) DeepCopy() *ImageDigestMirrorSetStatus { + if in == nil { + return nil + } + out := new(ImageDigestMirrorSetStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageDigestMirrors) DeepCopyInto(out *ImageDigestMirrors) { + *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestMirrors. +func (in *ImageDigestMirrors) DeepCopy() *ImageDigestMirrors { + if in == nil { + return nil + } + out := new(ImageDigestMirrors) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageLabel) DeepCopyInto(out *ImageLabel) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageLabel. +func (in *ImageLabel) DeepCopy() *ImageLabel { + if in == nil { + return nil + } + out := new(ImageLabel) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageList) DeepCopyInto(out *ImageList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Image, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageList. +func (in *ImageList) DeepCopy() *ImageList { + if in == nil { + return nil + } + out := new(ImageList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { + *out = *in + if in.AllowedRegistriesForImport != nil { + in, out := &in.AllowedRegistriesForImport, &out.AllowedRegistriesForImport + *out = make([]RegistryLocation, len(*in)) + copy(*out, *in) + } + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.AdditionalTrustedCA = in.AdditionalTrustedCA + in.RegistrySources.DeepCopyInto(&out.RegistrySources) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSpec. +func (in *ImageSpec) DeepCopy() *ImageSpec { + if in == nil { + return nil + } + out := new(ImageSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageStatus) DeepCopyInto(out *ImageStatus) { + *out = *in + if in.ExternalRegistryHostnames != nil { + in, out := &in.ExternalRegistryHostnames, &out.ExternalRegistryHostnames + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStatus. +func (in *ImageStatus) DeepCopy() *ImageStatus { + if in == nil { + return nil + } + out := new(ImageStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagMirrorSet) DeepCopyInto(out *ImageTagMirrorSet) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSet. +func (in *ImageTagMirrorSet) DeepCopy() *ImageTagMirrorSet { + if in == nil { + return nil + } + out := new(ImageTagMirrorSet) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSet) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagMirrorSetList) DeepCopyInto(out *ImageTagMirrorSetList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageTagMirrorSet, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetList. +func (in *ImageTagMirrorSetList) DeepCopy() *ImageTagMirrorSetList { + if in == nil { + return nil + } + out := new(ImageTagMirrorSetList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagMirrorSetList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagMirrorSetSpec) DeepCopyInto(out *ImageTagMirrorSetSpec) { + *out = *in + if in.ImageTagMirrors != nil { + in, out := &in.ImageTagMirrors, &out.ImageTagMirrors + *out = make([]ImageTagMirrors, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetSpec. +func (in *ImageTagMirrorSetSpec) DeepCopy() *ImageTagMirrorSetSpec { + if in == nil { + return nil + } + out := new(ImageTagMirrorSetSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagMirrorSetStatus) DeepCopyInto(out *ImageTagMirrorSetStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrorSetStatus. +func (in *ImageTagMirrorSetStatus) DeepCopy() *ImageTagMirrorSetStatus { + if in == nil { + return nil + } + out := new(ImageTagMirrorSetStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagMirrors) DeepCopyInto(out *ImageTagMirrors) { + *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]ImageMirror, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagMirrors. +func (in *ImageTagMirrors) DeepCopy() *ImageTagMirrors { + if in == nil { + return nil + } + out := new(ImageTagMirrors) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Infrastructure) DeepCopyInto(out *Infrastructure) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Infrastructure. +func (in *Infrastructure) DeepCopy() *Infrastructure { + if in == nil { + return nil + } + out := new(Infrastructure) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Infrastructure) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureList) DeepCopyInto(out *InfrastructureList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Infrastructure, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureList. +func (in *InfrastructureList) DeepCopy() *InfrastructureList { + if in == nil { + return nil + } + out := new(InfrastructureList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *InfrastructureList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureSpec) DeepCopyInto(out *InfrastructureSpec) { + *out = *in + out.CloudConfig = in.CloudConfig + in.PlatformSpec.DeepCopyInto(&out.PlatformSpec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureSpec. +func (in *InfrastructureSpec) DeepCopy() *InfrastructureSpec { + if in == nil { + return nil + } + out := new(InfrastructureSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *InfrastructureStatus) DeepCopyInto(out *InfrastructureStatus) { + *out = *in + if in.PlatformStatus != nil { + in, out := &in.PlatformStatus, &out.PlatformStatus + *out = new(PlatformStatus) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InfrastructureStatus. +func (in *InfrastructureStatus) DeepCopy() *InfrastructureStatus { + if in == nil { + return nil + } + out := new(InfrastructureStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Ingress) DeepCopyInto(out *Ingress) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Ingress. +func (in *Ingress) DeepCopy() *Ingress { + if in == nil { + return nil + } + out := new(Ingress) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Ingress) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressList) DeepCopyInto(out *IngressList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Ingress, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressList. +func (in *IngressList) DeepCopy() *IngressList { + if in == nil { + return nil + } + out := new(IngressList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *IngressList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressPlatformSpec) DeepCopyInto(out *IngressPlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSIngressSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressPlatformSpec. +func (in *IngressPlatformSpec) DeepCopy() *IngressPlatformSpec { + if in == nil { + return nil + } + out := new(IngressPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { + *out = *in + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteSpec, len(*in)) + copy(*out, *in) + } + if in.RequiredHSTSPolicies != nil { + in, out := &in.RequiredHSTSPolicies, &out.RequiredHSTSPolicies + *out = make([]RequiredHSTSPolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressSpec. +func (in *IngressSpec) DeepCopy() *IngressSpec { + if in == nil { + return nil + } + out := new(IngressSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IngressStatus) DeepCopyInto(out *IngressStatus) { + *out = *in + if in.ComponentRoutes != nil { + in, out := &in.ComponentRoutes, &out.ComponentRoutes + *out = make([]ComponentRouteStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IngressStatus. +func (in *IngressStatus) DeepCopy() *IngressStatus { + if in == nil { + return nil + } + out := new(IngressStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *IntermediateTLSProfile) DeepCopyInto(out *IntermediateTLSProfile) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IntermediateTLSProfile. +func (in *IntermediateTLSProfile) DeepCopy() *IntermediateTLSProfile { + if in == nil { + return nil + } + out := new(IntermediateTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KeystoneIdentityProvider) DeepCopyInto(out *KeystoneIdentityProvider) { + *out = *in + out.OAuthRemoteConnectionInfo = in.OAuthRemoteConnectionInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeystoneIdentityProvider. +func (in *KeystoneIdentityProvider) DeepCopy() *KeystoneIdentityProvider { + if in == nil { + return nil + } + out := new(KeystoneIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeClientConfig) DeepCopyInto(out *KubeClientConfig) { + *out = *in + out.ConnectionOverrides = in.ConnectionOverrides + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeClientConfig. +func (in *KubeClientConfig) DeepCopy() *KubeClientConfig { + if in == nil { + return nil + } + out := new(KubeClientConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubevirtPlatformSpec) DeepCopyInto(out *KubevirtPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformSpec. +func (in *KubevirtPlatformSpec) DeepCopy() *KubevirtPlatformSpec { + if in == nil { + return nil + } + out := new(KubevirtPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubevirtPlatformStatus) DeepCopyInto(out *KubevirtPlatformStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevirtPlatformStatus. +func (in *KubevirtPlatformStatus) DeepCopy() *KubevirtPlatformStatus { + if in == nil { + return nil + } + out := new(KubevirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LDAPAttributeMapping) DeepCopyInto(out *LDAPAttributeMapping) { + *out = *in + if in.ID != nil { + in, out := &in.ID, &out.ID + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsername != nil { + in, out := &in.PreferredUsername, &out.PreferredUsername + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Email != nil { + in, out := &in.Email, &out.Email + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPAttributeMapping. +func (in *LDAPAttributeMapping) DeepCopy() *LDAPAttributeMapping { + if in == nil { + return nil + } + out := new(LDAPAttributeMapping) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LDAPIdentityProvider) DeepCopyInto(out *LDAPIdentityProvider) { + *out = *in + out.BindPassword = in.BindPassword + out.CA = in.CA + in.Attributes.DeepCopyInto(&out.Attributes) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LDAPIdentityProvider. +func (in *LDAPIdentityProvider) DeepCopy() *LDAPIdentityProvider { + if in == nil { + return nil + } + out := new(LDAPIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LeaderElection) DeepCopyInto(out *LeaderElection) { + *out = *in + out.LeaseDuration = in.LeaseDuration + out.RenewDeadline = in.RenewDeadline + out.RetryPeriod = in.RetryPeriod + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElection. +func (in *LeaderElection) DeepCopy() *LeaderElection { + if in == nil { + return nil + } + out := new(LeaderElection) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LoadBalancer) DeepCopyInto(out *LoadBalancer) { + *out = *in + in.Platform.DeepCopyInto(&out.Platform) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoadBalancer. +func (in *LoadBalancer) DeepCopy() *LoadBalancer { + if in == nil { + return nil + } + out := new(LoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MTUMigration) DeepCopyInto(out *MTUMigration) { + *out = *in + if in.Network != nil { + in, out := &in.Network, &out.Network + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } + if in.Machine != nil { + in, out := &in.Machine, &out.Machine + *out = new(MTUMigrationValues) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigration. +func (in *MTUMigration) DeepCopy() *MTUMigration { + if in == nil { + return nil + } + out := new(MTUMigration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MTUMigrationValues) DeepCopyInto(out *MTUMigrationValues) { + *out = *in + if in.To != nil { + in, out := &in.To, &out.To + *out = new(uint32) + **out = **in + } + if in.From != nil { + in, out := &in.From, &out.From + *out = new(uint32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MTUMigrationValues. +func (in *MTUMigrationValues) DeepCopy() *MTUMigrationValues { + if in == nil { + return nil + } + out := new(MTUMigrationValues) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MaxAgePolicy) DeepCopyInto(out *MaxAgePolicy) { + *out = *in + if in.LargestMaxAge != nil { + in, out := &in.LargestMaxAge, &out.LargestMaxAge + *out = new(int32) + **out = **in + } + if in.SmallestMaxAge != nil { + in, out := &in.SmallestMaxAge, &out.SmallestMaxAge + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MaxAgePolicy. +func (in *MaxAgePolicy) DeepCopy() *MaxAgePolicy { + if in == nil { + return nil + } + out := new(MaxAgePolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ModernTLSProfile) DeepCopyInto(out *ModernTLSProfile) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModernTLSProfile. +func (in *ModernTLSProfile) DeepCopy() *ModernTLSProfile { + if in == nil { + return nil + } + out := new(ModernTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NamedCertificate) DeepCopyInto(out *NamedCertificate) { + *out = *in + if in.Names != nil { + in, out := &in.Names, &out.Names + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.CertInfo = in.CertInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamedCertificate. +func (in *NamedCertificate) DeepCopy() *NamedCertificate { + if in == nil { + return nil + } + out := new(NamedCertificate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Network) DeepCopyInto(out *Network) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. +func (in *Network) DeepCopy() *Network { + if in == nil { + return nil + } + out := new(Network) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Network) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkList) DeepCopyInto(out *NetworkList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Network, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkList. +func (in *NetworkList) DeepCopy() *NetworkList { + if in == nil { + return nil + } + out := new(NetworkList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NetworkList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkMigration) DeepCopyInto(out *NetworkMigration) { + *out = *in + if in.MTU != nil { + in, out := &in.MTU, &out.MTU + *out = new(MTUMigration) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkMigration. +func (in *NetworkMigration) DeepCopy() *NetworkMigration { + if in == nil { + return nil + } + out := new(NetworkMigration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkSpec) DeepCopyInto(out *NetworkSpec) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) + } + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExternalIP != nil { + in, out := &in.ExternalIP, &out.ExternalIP + *out = new(ExternalIPConfig) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkSpec. +func (in *NetworkSpec) DeepCopy() *NetworkSpec { + if in == nil { + return nil + } + out := new(NetworkSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkStatus) DeepCopyInto(out *NetworkStatus) { + *out = *in + if in.ClusterNetwork != nil { + in, out := &in.ClusterNetwork, &out.ClusterNetwork + *out = make([]ClusterNetworkEntry, len(*in)) + copy(*out, *in) + } + if in.ServiceNetwork != nil { + in, out := &in.ServiceNetwork, &out.ServiceNetwork + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Migration != nil { + in, out := &in.Migration, &out.Migration + *out = new(NetworkMigration) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkStatus. +func (in *NetworkStatus) DeepCopy() *NetworkStatus { + if in == nil { + return nil + } + out := new(NetworkStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Node) DeepCopyInto(out *Node) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Node. +func (in *Node) DeepCopy() *Node { + if in == nil { + return nil + } + out := new(Node) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Node) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeList) DeepCopyInto(out *NodeList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Node, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeList. +func (in *NodeList) DeepCopy() *NodeList { + if in == nil { + return nil + } + out := new(NodeList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeSpec. +func (in *NodeSpec) DeepCopy() *NodeSpec { + if in == nil { + return nil + } + out := new(NodeSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeStatus. +func (in *NodeStatus) DeepCopy() *NodeStatus { + if in == nil { + return nil + } + out := new(NodeStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPlatformLoadBalancer) DeepCopyInto(out *NutanixPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformLoadBalancer. +func (in *NutanixPlatformLoadBalancer) DeepCopy() *NutanixPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(NutanixPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPlatformSpec) DeepCopyInto(out *NutanixPlatformSpec) { + *out = *in + out.PrismCentral = in.PrismCentral + if in.PrismElements != nil { + in, out := &in.PrismElements, &out.PrismElements + *out = make([]NutanixPrismElementEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformSpec. +func (in *NutanixPlatformSpec) DeepCopy() *NutanixPlatformSpec { + if in == nil { + return nil + } + out := new(NutanixPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPlatformStatus) DeepCopyInto(out *NutanixPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(NutanixPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPlatformStatus. +func (in *NutanixPlatformStatus) DeepCopy() *NutanixPlatformStatus { + if in == nil { + return nil + } + out := new(NutanixPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPrismElementEndpoint) DeepCopyInto(out *NutanixPrismElementEndpoint) { + *out = *in + out.Endpoint = in.Endpoint + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismElementEndpoint. +func (in *NutanixPrismElementEndpoint) DeepCopy() *NutanixPrismElementEndpoint { + if in == nil { + return nil + } + out := new(NutanixPrismElementEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NutanixPrismEndpoint) DeepCopyInto(out *NutanixPrismEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NutanixPrismEndpoint. +func (in *NutanixPrismEndpoint) DeepCopy() *NutanixPrismEndpoint { + if in == nil { + return nil + } + out := new(NutanixPrismEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuth) DeepCopyInto(out *OAuth) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuth. +func (in *OAuth) DeepCopy() *OAuth { + if in == nil { + return nil + } + out := new(OAuth) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuth) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthList) DeepCopyInto(out *OAuthList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OAuth, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthList. +func (in *OAuthList) DeepCopy() *OAuthList { + if in == nil { + return nil + } + out := new(OAuthList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OAuthList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthRemoteConnectionInfo) DeepCopyInto(out *OAuthRemoteConnectionInfo) { + *out = *in + out.CA = in.CA + out.TLSClientCert = in.TLSClientCert + out.TLSClientKey = in.TLSClientKey + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthRemoteConnectionInfo. +func (in *OAuthRemoteConnectionInfo) DeepCopy() *OAuthRemoteConnectionInfo { + if in == nil { + return nil + } + out := new(OAuthRemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthSpec) DeepCopyInto(out *OAuthSpec) { + *out = *in + if in.IdentityProviders != nil { + in, out := &in.IdentityProviders, &out.IdentityProviders + *out = make([]IdentityProvider, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.TokenConfig.DeepCopyInto(&out.TokenConfig) + out.Templates = in.Templates + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthSpec. +func (in *OAuthSpec) DeepCopy() *OAuthSpec { + if in == nil { + return nil + } + out := new(OAuthSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthStatus) DeepCopyInto(out *OAuthStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthStatus. +func (in *OAuthStatus) DeepCopy() *OAuthStatus { + if in == nil { + return nil + } + out := new(OAuthStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OAuthTemplates) DeepCopyInto(out *OAuthTemplates) { + *out = *in + out.Login = in.Login + out.ProviderSelection = in.ProviderSelection + out.Error = in.Error + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OAuthTemplates. +func (in *OAuthTemplates) DeepCopy() *OAuthTemplates { + if in == nil { + return nil + } + out := new(OAuthTemplates) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference. +func (in *ObjectReference) DeepCopy() *ObjectReference { + if in == nil { + return nil + } + out := new(ObjectReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OldTLSProfile) DeepCopyInto(out *OldTLSProfile) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OldTLSProfile. +func (in *OldTLSProfile) DeepCopy() *OldTLSProfile { + if in == nil { + return nil + } + out := new(OldTLSProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDClaims) DeepCopyInto(out *OpenIDClaims) { + *out = *in + if in.PreferredUsername != nil { + in, out := &in.PreferredUsername, &out.PreferredUsername + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Name != nil { + in, out := &in.Name, &out.Name + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Email != nil { + in, out := &in.Email, &out.Email + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Groups != nil { + in, out := &in.Groups, &out.Groups + *out = make([]OpenIDClaim, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDClaims. +func (in *OpenIDClaims) DeepCopy() *OpenIDClaims { + if in == nil { + return nil + } + out := new(OpenIDClaims) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenIDIdentityProvider) DeepCopyInto(out *OpenIDIdentityProvider) { + *out = *in + out.ClientSecret = in.ClientSecret + out.CA = in.CA + if in.ExtraScopes != nil { + in, out := &in.ExtraScopes, &out.ExtraScopes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExtraAuthorizeParameters != nil { + in, out := &in.ExtraAuthorizeParameters, &out.ExtraAuthorizeParameters + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + in.Claims.DeepCopyInto(&out.Claims) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenIDIdentityProvider. +func (in *OpenIDIdentityProvider) DeepCopy() *OpenIDIdentityProvider { + if in == nil { + return nil + } + out := new(OpenIDIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformLoadBalancer) DeepCopyInto(out *OpenStackPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformLoadBalancer. +func (in *OpenStackPlatformLoadBalancer) DeepCopy() *OpenStackPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OpenStackPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformSpec) DeepCopyInto(out *OpenStackPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformSpec. +func (in *OpenStackPlatformSpec) DeepCopy() *OpenStackPlatformSpec { + if in == nil { + return nil + } + out := new(OpenStackPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OpenStackPlatformStatus) DeepCopyInto(out *OpenStackPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OpenStackPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OpenStackPlatformStatus. +func (in *OpenStackPlatformStatus) DeepCopy() *OpenStackPlatformStatus { + if in == nil { + return nil + } + out := new(OpenStackPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperandVersion) DeepCopyInto(out *OperandVersion) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperandVersion. +func (in *OperandVersion) DeepCopy() *OperandVersion { + if in == nil { + return nil + } + out := new(OperandVersion) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHub) DeepCopyInto(out *OperatorHub) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHub. +func (in *OperatorHub) DeepCopy() *OperatorHub { + if in == nil { + return nil + } + out := new(OperatorHub) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHub) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubList) DeepCopyInto(out *OperatorHubList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]OperatorHub, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubList. +func (in *OperatorHubList) DeepCopy() *OperatorHubList { + if in == nil { + return nil + } + out := new(OperatorHubList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *OperatorHubList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubSpec) DeepCopyInto(out *OperatorHubSpec) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSource, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubSpec. +func (in *OperatorHubSpec) DeepCopy() *OperatorHubSpec { + if in == nil { + return nil + } + out := new(OperatorHubSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OperatorHubStatus) DeepCopyInto(out *OperatorHubStatus) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]HubSourceStatus, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorHubStatus. +func (in *OperatorHubStatus) DeepCopy() *OperatorHubStatus { + if in == nil { + return nil + } + out := new(OperatorHubStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformLoadBalancer) DeepCopyInto(out *OvirtPlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformLoadBalancer. +func (in *OvirtPlatformLoadBalancer) DeepCopy() *OvirtPlatformLoadBalancer { + if in == nil { + return nil + } + out := new(OvirtPlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformSpec) DeepCopyInto(out *OvirtPlatformSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformSpec. +func (in *OvirtPlatformSpec) DeepCopy() *OvirtPlatformSpec { + if in == nil { + return nil + } + out := new(OvirtPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *OvirtPlatformStatus) DeepCopyInto(out *OvirtPlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(OvirtPlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OvirtPlatformStatus. +func (in *OvirtPlatformStatus) DeepCopy() *OvirtPlatformStatus { + if in == nil { + return nil + } + out := new(OvirtPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformSpec) DeepCopyInto(out *PlatformSpec) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformSpec) + **out = **in + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformSpec) + **out = **in + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformSpec) + **out = **in + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformSpec) + **out = **in + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformSpec) + **out = **in + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformSpec) + **out = **in + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformSpec) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformSpec) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformSpec) + **out = **in + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformSpec) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformSpec) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformSpec. +func (in *PlatformSpec) DeepCopy() *PlatformSpec { + if in == nil { + return nil + } + out := new(PlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PlatformStatus) DeepCopyInto(out *PlatformStatus) { + *out = *in + if in.AWS != nil { + in, out := &in.AWS, &out.AWS + *out = new(AWSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Azure != nil { + in, out := &in.Azure, &out.Azure + *out = new(AzurePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.GCP != nil { + in, out := &in.GCP, &out.GCP + *out = new(GCPPlatformStatus) + **out = **in + } + if in.BareMetal != nil { + in, out := &in.BareMetal, &out.BareMetal + *out = new(BareMetalPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.OpenStack != nil { + in, out := &in.OpenStack, &out.OpenStack + *out = new(OpenStackPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Ovirt != nil { + in, out := &in.Ovirt, &out.Ovirt + *out = new(OvirtPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.VSphere != nil { + in, out := &in.VSphere, &out.VSphere + *out = new(VSpherePlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.IBMCloud != nil { + in, out := &in.IBMCloud, &out.IBMCloud + *out = new(IBMCloudPlatformStatus) + **out = **in + } + if in.Kubevirt != nil { + in, out := &in.Kubevirt, &out.Kubevirt + *out = new(KubevirtPlatformStatus) + **out = **in + } + if in.EquinixMetal != nil { + in, out := &in.EquinixMetal, &out.EquinixMetal + *out = new(EquinixMetalPlatformStatus) + **out = **in + } + if in.PowerVS != nil { + in, out := &in.PowerVS, &out.PowerVS + *out = new(PowerVSPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.AlibabaCloud != nil { + in, out := &in.AlibabaCloud, &out.AlibabaCloud + *out = new(AlibabaCloudPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.Nutanix != nil { + in, out := &in.Nutanix, &out.Nutanix + *out = new(NutanixPlatformStatus) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalPlatformStatus) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PlatformStatus. +func (in *PlatformStatus) DeepCopy() *PlatformStatus { + if in == nil { + return nil + } + out := new(PlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformSpec) DeepCopyInto(out *PowerVSPlatformSpec) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformSpec. +func (in *PowerVSPlatformSpec) DeepCopy() *PowerVSPlatformSpec { + if in == nil { + return nil + } + out := new(PowerVSPlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSPlatformStatus) DeepCopyInto(out *PowerVSPlatformStatus) { + *out = *in + if in.ServiceEndpoints != nil { + in, out := &in.ServiceEndpoints, &out.ServiceEndpoints + *out = make([]PowerVSServiceEndpoint, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSPlatformStatus. +func (in *PowerVSPlatformStatus) DeepCopy() *PowerVSPlatformStatus { + if in == nil { + return nil + } + out := new(PowerVSPlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PowerVSServiceEndpoint) DeepCopyInto(out *PowerVSServiceEndpoint) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PowerVSServiceEndpoint. +func (in *PowerVSServiceEndpoint) DeepCopy() *PowerVSServiceEndpoint { + if in == nil { + return nil + } + out := new(PowerVSServiceEndpoint) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Project) DeepCopyInto(out *Project) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Project. +func (in *Project) DeepCopy() *Project { + if in == nil { + return nil + } + out := new(Project) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Project) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectList) DeepCopyInto(out *ProjectList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Project, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectList. +func (in *ProjectList) DeepCopy() *ProjectList { + if in == nil { + return nil + } + out := new(ProjectList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProjectList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectSpec) DeepCopyInto(out *ProjectSpec) { + *out = *in + out.ProjectRequestTemplate = in.ProjectRequestTemplate + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectSpec. +func (in *ProjectSpec) DeepCopy() *ProjectSpec { + if in == nil { + return nil + } + out := new(ProjectSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProjectStatus) DeepCopyInto(out *ProjectStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProjectStatus. +func (in *ProjectStatus) DeepCopy() *ProjectStatus { + if in == nil { + return nil + } + out := new(ProjectStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PromQLClusterCondition) DeepCopyInto(out *PromQLClusterCondition) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PromQLClusterCondition. +func (in *PromQLClusterCondition) DeepCopy() *PromQLClusterCondition { + if in == nil { + return nil + } + out := new(PromQLClusterCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Proxy) DeepCopyInto(out *Proxy) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. +func (in *Proxy) DeepCopy() *Proxy { + if in == nil { + return nil + } + out := new(Proxy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Proxy) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyList) DeepCopyInto(out *ProxyList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Proxy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyList. +func (in *ProxyList) DeepCopy() *ProxyList { + if in == nil { + return nil + } + out := new(ProxyList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ProxyList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxySpec) DeepCopyInto(out *ProxySpec) { + *out = *in + if in.ReadinessEndpoints != nil { + in, out := &in.ReadinessEndpoints, &out.ReadinessEndpoints + *out = make([]string, len(*in)) + copy(*out, *in) + } + out.TrustedCA = in.TrustedCA + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxySpec. +func (in *ProxySpec) DeepCopy() *ProxySpec { + if in == nil { + return nil + } + out := new(ProxySpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ProxyStatus) DeepCopyInto(out *ProxyStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyStatus. +func (in *ProxyStatus) DeepCopy() *ProxyStatus { + if in == nil { + return nil + } + out := new(ProxyStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistryLocation) DeepCopyInto(out *RegistryLocation) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistryLocation. +func (in *RegistryLocation) DeepCopy() *RegistryLocation { + if in == nil { + return nil + } + out := new(RegistryLocation) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RegistrySources) DeepCopyInto(out *RegistrySources) { + *out = *in + if in.InsecureRegistries != nil { + in, out := &in.InsecureRegistries, &out.InsecureRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.BlockedRegistries != nil { + in, out := &in.BlockedRegistries, &out.BlockedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.AllowedRegistries != nil { + in, out := &in.AllowedRegistries, &out.AllowedRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ContainerRuntimeSearchRegistries != nil { + in, out := &in.ContainerRuntimeSearchRegistries, &out.ContainerRuntimeSearchRegistries + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RegistrySources. +func (in *RegistrySources) DeepCopy() *RegistrySources { + if in == nil { + return nil + } + out := new(RegistrySources) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Release) DeepCopyInto(out *Release) { + *out = *in + if in.Channels != nil { + in, out := &in.Channels, &out.Channels + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Release. +func (in *Release) DeepCopy() *Release { + if in == nil { + return nil + } + out := new(Release) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RemoteConnectionInfo) DeepCopyInto(out *RemoteConnectionInfo) { + *out = *in + out.CertInfo = in.CertInfo + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RemoteConnectionInfo. +func (in *RemoteConnectionInfo) DeepCopy() *RemoteConnectionInfo { + if in == nil { + return nil + } + out := new(RemoteConnectionInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RepositoryDigestMirrors) DeepCopyInto(out *RepositoryDigestMirrors) { + *out = *in + if in.Mirrors != nil { + in, out := &in.Mirrors, &out.Mirrors + *out = make([]Mirror, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RepositoryDigestMirrors. +func (in *RepositoryDigestMirrors) DeepCopy() *RepositoryDigestMirrors { + if in == nil { + return nil + } + out := new(RepositoryDigestMirrors) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequestHeaderIdentityProvider) DeepCopyInto(out *RequestHeaderIdentityProvider) { + *out = *in + out.ClientCA = in.ClientCA + if in.ClientCommonNames != nil { + in, out := &in.ClientCommonNames, &out.ClientCommonNames + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Headers != nil { + in, out := &in.Headers, &out.Headers + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.PreferredUsernameHeaders != nil { + in, out := &in.PreferredUsernameHeaders, &out.PreferredUsernameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.NameHeaders != nil { + in, out := &in.NameHeaders, &out.NameHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.EmailHeaders != nil { + in, out := &in.EmailHeaders, &out.EmailHeaders + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequestHeaderIdentityProvider. +func (in *RequestHeaderIdentityProvider) DeepCopy() *RequestHeaderIdentityProvider { + if in == nil { + return nil + } + out := new(RequestHeaderIdentityProvider) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RequiredHSTSPolicy) DeepCopyInto(out *RequiredHSTSPolicy) { + *out = *in + if in.NamespaceSelector != nil { + in, out := &in.NamespaceSelector, &out.NamespaceSelector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.DomainPatterns != nil { + in, out := &in.DomainPatterns, &out.DomainPatterns + *out = make([]string, len(*in)) + copy(*out, *in) + } + in.MaxAge.DeepCopyInto(&out.MaxAge) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RequiredHSTSPolicy. +func (in *RequiredHSTSPolicy) DeepCopy() *RequiredHSTSPolicy { + if in == nil { + return nil + } + out := new(RequiredHSTSPolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Scheduler) DeepCopyInto(out *Scheduler) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + out.Status = in.Status + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Scheduler. +func (in *Scheduler) DeepCopy() *Scheduler { + if in == nil { + return nil + } + out := new(Scheduler) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Scheduler) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerList) DeepCopyInto(out *SchedulerList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Scheduler, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerList. +func (in *SchedulerList) DeepCopy() *SchedulerList { + if in == nil { + return nil + } + out := new(SchedulerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *SchedulerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerSpec) DeepCopyInto(out *SchedulerSpec) { + *out = *in + out.Policy = in.Policy + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerSpec. +func (in *SchedulerSpec) DeepCopy() *SchedulerSpec { + if in == nil { + return nil + } + out := new(SchedulerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SchedulerStatus) DeepCopyInto(out *SchedulerStatus) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerStatus. +func (in *SchedulerStatus) DeepCopy() *SchedulerStatus { + if in == nil { + return nil + } + out := new(SchedulerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretNameReference) DeepCopyInto(out *SecretNameReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretNameReference. +func (in *SecretNameReference) DeepCopy() *SecretNameReference { + if in == nil { + return nil + } + out := new(SecretNameReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServingInfo) DeepCopyInto(out *ServingInfo) { + *out = *in + out.CertInfo = in.CertInfo + if in.NamedCertificates != nil { + in, out := &in.NamedCertificates, &out.NamedCertificates + *out = make([]NamedCertificate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.CipherSuites != nil { + in, out := &in.CipherSuites, &out.CipherSuites + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServingInfo. +func (in *ServingInfo) DeepCopy() *ServingInfo { + if in == nil { + return nil + } + out := new(ServingInfo) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSource) DeepCopyInto(out *StringSource) { + *out = *in + out.StringSourceSpec = in.StringSourceSpec + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSource. +func (in *StringSource) DeepCopy() *StringSource { + if in == nil { + return nil + } + out := new(StringSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StringSourceSpec) DeepCopyInto(out *StringSourceSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StringSourceSpec. +func (in *StringSourceSpec) DeepCopy() *StringSourceSpec { + if in == nil { + return nil + } + out := new(StringSourceSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSProfileSpec) DeepCopyInto(out *TLSProfileSpec) { + *out = *in + if in.Ciphers != nil { + in, out := &in.Ciphers, &out.Ciphers + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSProfileSpec. +func (in *TLSProfileSpec) DeepCopy() *TLSProfileSpec { + if in == nil { + return nil + } + out := new(TLSProfileSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TLSSecurityProfile) DeepCopyInto(out *TLSSecurityProfile) { + *out = *in + if in.Old != nil { + in, out := &in.Old, &out.Old + *out = new(OldTLSProfile) + **out = **in + } + if in.Intermediate != nil { + in, out := &in.Intermediate, &out.Intermediate + *out = new(IntermediateTLSProfile) + **out = **in + } + if in.Modern != nil { + in, out := &in.Modern, &out.Modern + *out = new(ModernTLSProfile) + **out = **in + } + if in.Custom != nil { + in, out := &in.Custom, &out.Custom + *out = new(CustomTLSProfile) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSSecurityProfile. +func (in *TLSSecurityProfile) DeepCopy() *TLSSecurityProfile { + if in == nil { + return nil + } + out := new(TLSSecurityProfile) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TemplateReference) DeepCopyInto(out *TemplateReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateReference. +func (in *TemplateReference) DeepCopy() *TemplateReference { + if in == nil { + return nil + } + out := new(TemplateReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TokenConfig) DeepCopyInto(out *TokenConfig) { + *out = *in + if in.AccessTokenInactivityTimeout != nil { + in, out := &in.AccessTokenInactivityTimeout, &out.AccessTokenInactivityTimeout + *out = new(metav1.Duration) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TokenConfig. +func (in *TokenConfig) DeepCopy() *TokenConfig { + if in == nil { + return nil + } + out := new(TokenConfig) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Update) DeepCopyInto(out *Update) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Update. +func (in *Update) DeepCopy() *Update { + if in == nil { + return nil + } + out := new(Update) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpdateHistory) DeepCopyInto(out *UpdateHistory) { + *out = *in + in.StartedTime.DeepCopyInto(&out.StartedTime) + if in.CompletionTime != nil { + in, out := &in.CompletionTime, &out.CompletionTime + *out = (*in).DeepCopy() + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateHistory. +func (in *UpdateHistory) DeepCopy() *UpdateHistory { + if in == nil { + return nil + } + out := new(UpdateHistory) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformFailureDomainSpec) DeepCopyInto(out *VSpherePlatformFailureDomainSpec) { + *out = *in + in.Topology.DeepCopyInto(&out.Topology) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformFailureDomainSpec. +func (in *VSpherePlatformFailureDomainSpec) DeepCopy() *VSpherePlatformFailureDomainSpec { + if in == nil { + return nil + } + out := new(VSpherePlatformFailureDomainSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformLoadBalancer) DeepCopyInto(out *VSpherePlatformLoadBalancer) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformLoadBalancer. +func (in *VSpherePlatformLoadBalancer) DeepCopy() *VSpherePlatformLoadBalancer { + if in == nil { + return nil + } + out := new(VSpherePlatformLoadBalancer) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformNodeNetworking) DeepCopyInto(out *VSpherePlatformNodeNetworking) { + *out = *in + in.External.DeepCopyInto(&out.External) + in.Internal.DeepCopyInto(&out.Internal) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworking. +func (in *VSpherePlatformNodeNetworking) DeepCopy() *VSpherePlatformNodeNetworking { + if in == nil { + return nil + } + out := new(VSpherePlatformNodeNetworking) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopyInto(out *VSpherePlatformNodeNetworkingSpec) { + *out = *in + if in.NetworkSubnetCIDR != nil { + in, out := &in.NetworkSubnetCIDR, &out.NetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExcludeNetworkSubnetCIDR != nil { + in, out := &in.ExcludeNetworkSubnetCIDR, &out.ExcludeNetworkSubnetCIDR + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformNodeNetworkingSpec. +func (in *VSpherePlatformNodeNetworkingSpec) DeepCopy() *VSpherePlatformNodeNetworkingSpec { + if in == nil { + return nil + } + out := new(VSpherePlatformNodeNetworkingSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformSpec) DeepCopyInto(out *VSpherePlatformSpec) { + *out = *in + if in.VCenters != nil { + in, out := &in.VCenters, &out.VCenters + *out = make([]VSpherePlatformVCenterSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.FailureDomains != nil { + in, out := &in.FailureDomains, &out.FailureDomains + *out = make([]VSpherePlatformFailureDomainSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + in.NodeNetworking.DeepCopyInto(&out.NodeNetworking) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformSpec. +func (in *VSpherePlatformSpec) DeepCopy() *VSpherePlatformSpec { + if in == nil { + return nil + } + out := new(VSpherePlatformSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformStatus) DeepCopyInto(out *VSpherePlatformStatus) { + *out = *in + if in.APIServerInternalIPs != nil { + in, out := &in.APIServerInternalIPs, &out.APIServerInternalIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IngressIPs != nil { + in, out := &in.IngressIPs, &out.IngressIPs + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.LoadBalancer != nil { + in, out := &in.LoadBalancer, &out.LoadBalancer + *out = new(VSpherePlatformLoadBalancer) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformStatus. +func (in *VSpherePlatformStatus) DeepCopy() *VSpherePlatformStatus { + if in == nil { + return nil + } + out := new(VSpherePlatformStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformTopology) DeepCopyInto(out *VSpherePlatformTopology) { + *out = *in + if in.Networks != nil { + in, out := &in.Networks, &out.Networks + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformTopology. +func (in *VSpherePlatformTopology) DeepCopy() *VSpherePlatformTopology { + if in == nil { + return nil + } + out := new(VSpherePlatformTopology) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VSpherePlatformVCenterSpec) DeepCopyInto(out *VSpherePlatformVCenterSpec) { + *out = *in + if in.Datacenters != nil { + in, out := &in.Datacenters, &out.Datacenters + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSpherePlatformVCenterSpec. +func (in *VSpherePlatformVCenterSpec) DeepCopy() *VSpherePlatformVCenterSpec { + if in == nil { + return nil + } + out := new(VSpherePlatformVCenterSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WebhookTokenAuthenticator) DeepCopyInto(out *WebhookTokenAuthenticator) { + *out = *in + out.KubeConfig = in.KubeConfig + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookTokenAuthenticator. +func (in *WebhookTokenAuthenticator) DeepCopy() *WebhookTokenAuthenticator { + if in == nil { + return nil + } + out := new(WebhookTokenAuthenticator) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go new file mode 100644 index 00000000..179d921e --- /dev/null +++ b/vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go @@ -0,0 +1,2281 @@ +package v1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE +var map_AdmissionConfig = map[string]string{ + "enabledPlugins": "enabledPlugins is a list of admission plugins that must be on in addition to the default list. Some admission plugins are disabled by default, but certain configurations require them. This is fairly uncommon and can result in performance penalties and unexpected behavior.", + "disabledPlugins": "disabledPlugins is a list of admission plugins that must be off. Putting something in this list is almost always a mistake and likely to result in cluster instability.", +} + +func (AdmissionConfig) SwaggerDoc() map[string]string { + return map_AdmissionConfig +} + +var map_AdmissionPluginConfig = map[string]string{ + "": "AdmissionPluginConfig holds the necessary configuration options for admission plugins", + "location": "Location is the path to a configuration file that contains the plugin's configuration", + "configuration": "Configuration is an embedded configuration object to be used as the plugin's configuration. If present, it will be used instead of the path to the configuration file.", +} + +func (AdmissionPluginConfig) SwaggerDoc() map[string]string { + return map_AdmissionPluginConfig +} + +var map_AuditConfig = map[string]string{ + "": "AuditConfig holds configuration for the audit capabilities", + "enabled": "If this flag is set, audit log will be printed in the logs. The logs contains, method, user and a requested URL.", + "auditFilePath": "All requests coming to the apiserver will be logged to this file.", + "maximumFileRetentionDays": "Maximum number of days to retain old log files based on the timestamp encoded in their filename.", + "maximumRetainedFiles": "Maximum number of old log files to retain.", + "maximumFileSizeMegabytes": "Maximum size in megabytes of the log file before it gets rotated. Defaults to 100MB.", + "policyFile": "PolicyFile is a path to the file that defines the audit policy configuration.", + "policyConfiguration": "PolicyConfiguration is an embedded policy configuration object to be used as the audit policy configuration. If present, it will be used instead of the path to the policy file.", + "logFormat": "Format of saved audits (legacy or json).", + "webHookKubeConfig": "Path to a .kubeconfig formatted file that defines the audit webhook configuration.", + "webHookMode": "Strategy for sending audit events (block or batch).", +} + +func (AuditConfig) SwaggerDoc() map[string]string { + return map_AuditConfig +} + +var map_CertInfo = map[string]string{ + "": "CertInfo relates a certificate with a private key", + "certFile": "CertFile is a file containing a PEM-encoded certificate", + "keyFile": "KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile", +} + +func (CertInfo) SwaggerDoc() map[string]string { + return map_CertInfo +} + +var map_ClientConnectionOverrides = map[string]string{ + "acceptContentTypes": "acceptContentTypes defines the Accept header sent by clients when connecting to a server, overriding the default value of 'application/json'. This field will control all connections to the server used by a particular client.", + "contentType": "contentType is the content type used when sending data to the server from this client.", + "qps": "qps controls the number of queries per second allowed for this connection.", + "burst": "burst allows extra queries to accumulate when a client is exceeding its rate.", +} + +func (ClientConnectionOverrides) SwaggerDoc() map[string]string { + return map_ClientConnectionOverrides +} + +var map_ConfigMapFileReference = map[string]string{ + "": "ConfigMapFileReference references a config map in a specific namespace. The namespace must be specified at the point of use.", + "key": "Key allows pointing to a specific key/value inside of the configmap. This is useful for logical file references.", +} + +func (ConfigMapFileReference) SwaggerDoc() map[string]string { + return map_ConfigMapFileReference +} + +var map_ConfigMapNameReference = map[string]string{ + "": "ConfigMapNameReference references a config map in a specific namespace. The namespace must be specified at the point of use.", + "name": "name is the metadata.name of the referenced config map", +} + +func (ConfigMapNameReference) SwaggerDoc() map[string]string { + return map_ConfigMapNameReference +} + +var map_DelegatedAuthentication = map[string]string{ + "": "DelegatedAuthentication allows authentication to be disabled.", + "disabled": "disabled indicates that authentication should be disabled. By default it will use delegated authentication.", +} + +func (DelegatedAuthentication) SwaggerDoc() map[string]string { + return map_DelegatedAuthentication +} + +var map_DelegatedAuthorization = map[string]string{ + "": "DelegatedAuthorization allows authorization to be disabled.", + "disabled": "disabled indicates that authorization should be disabled. By default it will use delegated authorization.", +} + +func (DelegatedAuthorization) SwaggerDoc() map[string]string { + return map_DelegatedAuthorization +} + +var map_EtcdConnectionInfo = map[string]string{ + "": "EtcdConnectionInfo holds information necessary for connecting to an etcd server", + "urls": "URLs are the URLs for etcd", + "ca": "CA is a file containing trusted roots for the etcd server certificates", +} + +func (EtcdConnectionInfo) SwaggerDoc() map[string]string { + return map_EtcdConnectionInfo +} + +var map_EtcdStorageConfig = map[string]string{ + "storagePrefix": "StoragePrefix is the path within etcd that the OpenShift resources will be rooted under. This value, if changed, will mean existing objects in etcd will no longer be located.", +} + +func (EtcdStorageConfig) SwaggerDoc() map[string]string { + return map_EtcdStorageConfig +} + +var map_GenericAPIServerConfig = map[string]string{ + "": "GenericAPIServerConfig is an inline-able struct for aggregated apiservers that need to store data in etcd", + "servingInfo": "servingInfo describes how to start serving", + "corsAllowedOrigins": "corsAllowedOrigins", + "auditConfig": "auditConfig describes how to configure audit information", + "storageConfig": "storageConfig contains information about how to use", + "admission": "admissionConfig holds information about how to configure admission.", +} + +func (GenericAPIServerConfig) SwaggerDoc() map[string]string { + return map_GenericAPIServerConfig +} + +var map_GenericControllerConfig = map[string]string{ + "": "GenericControllerConfig provides information to configure a controller", + "servingInfo": "ServingInfo is the HTTP serving information for the controller's endpoints", + "leaderElection": "leaderElection provides information to elect a leader. Only override this if you have a specific need", + "authentication": "authentication allows configuration of authentication for the endpoints", + "authorization": "authorization allows configuration of authentication for the endpoints", +} + +func (GenericControllerConfig) SwaggerDoc() map[string]string { + return map_GenericControllerConfig +} + +var map_HTTPServingInfo = map[string]string{ + "": "HTTPServingInfo holds configuration for serving HTTP", + "maxRequestsInFlight": "MaxRequestsInFlight is the number of concurrent requests allowed to the server. If zero, no limit.", + "requestTimeoutSeconds": "RequestTimeoutSeconds is the number of seconds before requests are timed out. The default is 60 minutes, if -1 there is no limit on requests.", +} + +func (HTTPServingInfo) SwaggerDoc() map[string]string { + return map_HTTPServingInfo +} + +var map_KubeClientConfig = map[string]string{ + "kubeConfig": "kubeConfig is a .kubeconfig filename for going to the owning kube-apiserver. Empty uses an in-cluster-config", + "connectionOverrides": "connectionOverrides specifies client overrides for system components to loop back to this master.", +} + +func (KubeClientConfig) SwaggerDoc() map[string]string { + return map_KubeClientConfig +} + +var map_LeaderElection = map[string]string{ + "": "LeaderElection provides information to elect a leader", + "disable": "disable allows leader election to be suspended while allowing a fully defaulted \"normal\" startup case.", + "namespace": "namespace indicates which namespace the resource is in", + "name": "name indicates what name to use for the resource", + "leaseDuration": "leaseDuration is the duration that non-leader candidates will wait after observing a leadership renewal until attempting to acquire leadership of a led but unrenewed leader slot. This is effectively the maximum duration that a leader can be stopped before it is replaced by another candidate. This is only applicable if leader election is enabled.", + "renewDeadline": "renewDeadline is 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.", + "retryPeriod": "retryPeriod is the duration the clients should wait between attempting acquisition and renewal of a leadership. This is only applicable if leader election is enabled.", +} + +func (LeaderElection) SwaggerDoc() map[string]string { + return map_LeaderElection +} + +var map_MaxAgePolicy = map[string]string{ + "": "MaxAgePolicy contains a numeric range for specifying a compliant HSTS max-age for the enclosing RequiredHSTSPolicy", + "largestMaxAge": "The largest allowed value (in seconds) of the RequiredHSTSPolicy max-age This value can be left unspecified, in which case no upper limit is enforced.", + "smallestMaxAge": "The smallest allowed value (in seconds) of the RequiredHSTSPolicy max-age Setting max-age=0 allows the deletion of an existing HSTS header from a host. This is a necessary tool for administrators to quickly correct mistakes. This value can be left unspecified, in which case no lower limit is enforced.", +} + +func (MaxAgePolicy) SwaggerDoc() map[string]string { + return map_MaxAgePolicy +} + +var map_NamedCertificate = map[string]string{ + "": "NamedCertificate specifies a certificate/key, and the names it should be served for", + "names": "Names is a list of DNS names this certificate should be used to secure A name can be a normal DNS name, or can contain leading wildcard segments.", +} + +func (NamedCertificate) SwaggerDoc() map[string]string { + return map_NamedCertificate +} + +var map_RemoteConnectionInfo = map[string]string{ + "": "RemoteConnectionInfo holds information necessary for establishing a remote connection", + "url": "URL is the remote URL to connect to", + "ca": "CA is the CA for verifying TLS connections", +} + +func (RemoteConnectionInfo) SwaggerDoc() map[string]string { + return map_RemoteConnectionInfo +} + +var map_RequiredHSTSPolicy = map[string]string{ + "namespaceSelector": "namespaceSelector specifies a label selector such that the policy applies only to those routes that are in namespaces with labels that match the selector, and are in one of the DomainPatterns. Defaults to the empty LabelSelector, which matches everything.", + "domainPatterns": "domainPatterns is a list of domains for which the desired HSTS annotations are required. If domainPatterns is specified and a route is created with a spec.host matching one of the domains, the route must specify the HSTS Policy components described in the matching RequiredHSTSPolicy.\n\nThe use of wildcards is allowed like this: *.foo.com matches everything under foo.com. foo.com only matches foo.com, so to cover foo.com and everything under it, you must specify *both*.", + "maxAge": "maxAge is the delta time range in seconds during which hosts are regarded as HSTS hosts. If set to 0, it negates the effect, and hosts are removed as HSTS hosts. If set to 0 and includeSubdomains is specified, all subdomains of the host are also removed as HSTS hosts. maxAge is a time-to-live value, and if this policy is not refreshed on a client, the HSTS policy will eventually expire on that client.", + "preloadPolicy": "preloadPolicy directs the client to include hosts in its host preload list so that it never needs to do an initial load to get the HSTS header (note that this is not defined in RFC 6797 and is therefore client implementation-dependent).", + "includeSubDomainsPolicy": "includeSubDomainsPolicy means the HSTS Policy should apply to any subdomains of the host's domain name. Thus, for the host bar.foo.com, if includeSubDomainsPolicy was set to RequireIncludeSubDomains: - the host app.bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host bar.foo.com would inherit the HSTS Policy of bar.foo.com - the host foo.com would NOT inherit the HSTS Policy of bar.foo.com - the host def.foo.com would NOT inherit the HSTS Policy of bar.foo.com", +} + +func (RequiredHSTSPolicy) SwaggerDoc() map[string]string { + return map_RequiredHSTSPolicy +} + +var map_SecretNameReference = map[string]string{ + "": "SecretNameReference references a secret in a specific namespace. The namespace must be specified at the point of use.", + "name": "name is the metadata.name of the referenced secret", +} + +func (SecretNameReference) SwaggerDoc() map[string]string { + return map_SecretNameReference +} + +var map_ServingInfo = map[string]string{ + "": "ServingInfo holds information about serving web pages", + "bindAddress": "BindAddress is the ip:port to serve on", + "bindNetwork": "BindNetwork is the type of network to bind to - defaults to \"tcp4\", accepts \"tcp\", \"tcp4\", and \"tcp6\"", + "clientCA": "ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates", + "namedCertificates": "NamedCertificates is a list of certificates to use to secure requests to specific hostnames", + "minTLSVersion": "MinTLSVersion is the minimum TLS version supported. Values must match version names from https://golang.org/pkg/crypto/tls/#pkg-constants", + "cipherSuites": "CipherSuites contains an overridden list of ciphers for the server to support. Values must match cipher suite IDs from https://golang.org/pkg/crypto/tls/#pkg-constants", +} + +func (ServingInfo) SwaggerDoc() map[string]string { + return map_ServingInfo +} + +var map_StringSource = map[string]string{ + "": "StringSource allows specifying a string inline, or externally via env var or file. When it contains only a string value, it marshals to a simple JSON string.", +} + +func (StringSource) SwaggerDoc() map[string]string { + return map_StringSource +} + +var map_StringSourceSpec = map[string]string{ + "": "StringSourceSpec specifies a string value, or external location", + "value": "Value specifies the cleartext value, or an encrypted value if keyFile is specified.", + "env": "Env specifies an envvar containing the cleartext value, or an encrypted value if the keyFile is specified.", + "file": "File references a file containing the cleartext value, or an encrypted value if a keyFile is specified.", + "keyFile": "KeyFile references a file containing the key to use to decrypt the value.", +} + +func (StringSourceSpec) SwaggerDoc() map[string]string { + return map_StringSourceSpec +} + +var map_APIServer = map[string]string{ + "": "APIServer holds configuration (like serving certificates, client CA and CORS domains) shared by all API servers in the system, among them especially kube-apiserver and openshift-apiserver. The canonical name of an instance is 'cluster'.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (APIServer) SwaggerDoc() map[string]string { + return map_APIServer +} + +var map_APIServerEncryption = map[string]string{ + "type": "type defines what encryption type should be used to encrypt resources at the datastore layer. When this field is unset (i.e. when it is set to the empty string), identity is implied. The behavior of unset can and will change over time. Even if encryption is enabled by default, the meaning of unset may change to a different encryption type based on changes in best practices.\n\nWhen encryption is enabled, all sensitive resources shipped with the platform are encrypted. This list of sensitive resources can and will change over time. The current authoritative list is:\n\n 1. secrets\n 2. configmaps\n 3. routes.route.openshift.io\n 4. oauthaccesstokens.oauth.openshift.io\n 5. oauthauthorizetokens.oauth.openshift.io", +} + +func (APIServerEncryption) SwaggerDoc() map[string]string { + return map_APIServerEncryption +} + +var map_APIServerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (APIServerList) SwaggerDoc() map[string]string { + return map_APIServerList +} + +var map_APIServerNamedServingCert = map[string]string{ + "": "APIServerNamedServingCert maps a server DNS name, as understood by a client, to a certificate.", + "names": "names is a optional list of explicit DNS names (leading wildcards allowed) that should use this certificate to serve secure traffic. If no names are provided, the implicit names will be extracted from the certificates. Exact names trump over wildcard names. Explicit names defined here trump over extracted implicit names.", + "servingCertificate": "servingCertificate references a kubernetes.io/tls type secret containing the TLS cert info for serving secure traffic. The secret must exist in the openshift-config namespace and contain the following required fields: - Secret.Data[\"tls.key\"] - TLS private key. - Secret.Data[\"tls.crt\"] - TLS certificate.", +} + +func (APIServerNamedServingCert) SwaggerDoc() map[string]string { + return map_APIServerNamedServingCert +} + +var map_APIServerServingCerts = map[string]string{ + "namedCertificates": "namedCertificates references secrets containing the TLS cert info for serving secure traffic to specific hostnames. If no named certificates are provided, or no named certificates match the server name as understood by a client, the defaultServingCertificate will be used.", +} + +func (APIServerServingCerts) SwaggerDoc() map[string]string { + return map_APIServerServingCerts +} + +var map_APIServerSpec = map[string]string{ + "servingCerts": "servingCert is the TLS cert info for serving secure traffic. If not specified, operator managed certificates will be used for serving secure traffic.", + "clientCA": "clientCA references a ConfigMap containing a certificate bundle for the signers that will be recognized for incoming client certificates in addition to the operator managed signers. If this is empty, then only operator managed signers are valid. You usually only have to set this if you have your own PKI you wish to honor client certificates from. The ConfigMap must exist in the openshift-config namespace and contain the following required fields: - ConfigMap.Data[\"ca-bundle.crt\"] - CA bundle.", + "additionalCORSAllowedOrigins": "additionalCORSAllowedOrigins lists additional, user-defined regular expressions describing hosts for which the API server allows access using the CORS headers. This may be needed to access the API and the integrated OAuth server from JavaScript applications. The values are regular expressions that correspond to the Golang regular expression language.", + "encryption": "encryption allows the configuration of encryption of resources at the datastore layer.", + "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for externally exposed servers.\n\nIf unset, a default (which may change between releases) is chosen. Note that only Old, Intermediate and Custom profiles are currently supported, and the maximum available MinTLSVersions is VersionTLS12.", + "audit": "audit specifies the settings for audit configuration to be applied to all OpenShift-provided API servers in the cluster.", +} + +func (APIServerSpec) SwaggerDoc() map[string]string { + return map_APIServerSpec +} + +var map_Audit = map[string]string{ + "profile": "profile specifies the name of the desired top-level audit profile to be applied to all requests sent to any of the OpenShift-provided API servers in the cluster (kube-apiserver, openshift-apiserver and oauth-apiserver), with the exception of those requests that match one or more of the customRules.\n\nThe following profiles are provided: - Default: default policy which means MetaData level logging with the exception of events\n (not logged at all), oauthaccesstokens and oauthauthorizetokens (both logged at RequestBody\n level).\n- WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nWarning: It is not recommended to disable audit logging by using the `None` profile unless you are fully aware of the risks of not logging data that can be beneficial when troubleshooting issues. If you disable audit logging and a support situation arises, you might need to enable audit logging and reproduce the issue in order to troubleshoot properly.\n\nIf unset, the 'Default' profile is used as the default.", + "customRules": "customRules specify profiles per group. These profile take precedence over the top-level profile field if they apply. They are evaluation from top to bottom and the first one that matches, applies.", +} + +func (Audit) SwaggerDoc() map[string]string { + return map_Audit +} + +var map_AuditCustomRule = map[string]string{ + "": "AuditCustomRule describes a custom rule for an audit profile that takes precedence over the top-level profile.", + "group": "group is a name of group a request user must be member of in order to this profile to apply.", + "profile": "profile specifies the name of the desired audit policy configuration to be deployed to all OpenShift-provided API servers in the cluster.\n\nThe following profiles are provided: - Default: the existing default policy. - WriteRequestBodies: like 'Default', but logs request and response HTTP payloads for write requests (create, update, patch). - AllRequestBodies: like 'WriteRequestBodies', but also logs request and response HTTP payloads for read requests (get, list). - None: no requests are logged at all, not even oauthaccesstokens and oauthauthorizetokens.\n\nIf unset, the 'Default' profile is used as the default.", +} + +func (AuditCustomRule) SwaggerDoc() map[string]string { + return map_AuditCustomRule +} + +var map_Authentication = map[string]string{ + "": "Authentication specifies cluster-wide settings for authentication (like OAuth and webhook token authenticators). The canonical name of an instance is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Authentication) SwaggerDoc() map[string]string { + return map_Authentication +} + +var map_AuthenticationList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (AuthenticationList) SwaggerDoc() map[string]string { + return map_AuthenticationList +} + +var map_AuthenticationSpec = map[string]string{ + "type": "type identifies the cluster managed, user facing authentication mode in use. Specifically, it manages the component that responds to login attempts. The default is IntegratedOAuth.", + "oauthMetadata": "oauthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for an external OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 If oauthMetadata.name is non-empty, this value has precedence over any metadata reference stored in status. The key \"oauthMetadata\" is used to locate the data. If specified and the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config.", + "webhookTokenAuthenticators": "webhookTokenAuthenticators is DEPRECATED, setting it has no effect.", + "webhookTokenAuthenticator": "webhookTokenAuthenticator configures a remote token reviewer. These remote authentication webhooks can be used to verify bearer tokens via the tokenreviews.authentication.k8s.io REST API. This is required to honor bearer tokens that are provisioned by an external authentication service.", + "serviceAccountIssuer": "serviceAccountIssuer is the identifier of the bound service account token issuer. The default is https://kubernetes.default.svc WARNING: Updating this field will not result in immediate invalidation of all bound tokens with the previous issuer value. Instead, the tokens issued by previous service account issuer will continue to be trusted for a time period chosen by the platform (currently set to 24h). This time period is subject to change over time. This allows internal components to transition to use new service account issuer without service distruption.", +} + +func (AuthenticationSpec) SwaggerDoc() map[string]string { + return map_AuthenticationSpec +} + +var map_AuthenticationStatus = map[string]string{ + "integratedOAuthMetadata": "integratedOAuthMetadata contains the discovery endpoint data for OAuth 2.0 Authorization Server Metadata for the in-cluster integrated OAuth server. This discovery document can be viewed from its served location: oc get --raw '/.well-known/oauth-authorization-server' For further details, see the IETF Draft: https://tools.ietf.org/html/draft-ietf-oauth-discovery-04#section-2 This contains the observed value based on cluster state. An explicitly set value in spec.oauthMetadata has precedence over this field. This field has no meaning if authentication spec.type is not set to IntegratedOAuth. The key \"oauthMetadata\" is used to locate the data. If the config map or expected key is not found, no metadata is served. If the specified metadata is not valid, no metadata is served. The namespace for this config map is openshift-config-managed.", +} + +func (AuthenticationStatus) SwaggerDoc() map[string]string { + return map_AuthenticationStatus +} + +var map_DeprecatedWebhookTokenAuthenticator = map[string]string{ + "": "deprecatedWebhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator. It's the same as WebhookTokenAuthenticator but it's missing the 'required' validation on KubeConfig field.", + "kubeConfig": "kubeConfig contains kube config file data which describes how to access the remote webhook service. For further details, see: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication The key \"kubeConfig\" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored. The namespace for this secret is determined by the point of use.", +} + +func (DeprecatedWebhookTokenAuthenticator) SwaggerDoc() map[string]string { + return map_DeprecatedWebhookTokenAuthenticator +} + +var map_WebhookTokenAuthenticator = map[string]string{ + "": "webhookTokenAuthenticator holds the necessary configuration options for a remote token authenticator", + "kubeConfig": "kubeConfig references a secret that contains kube config file data which describes how to access the remote webhook service. The namespace for the referenced secret is openshift-config.\n\nFor further details, see:\n\nhttps://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication\n\nThe key \"kubeConfig\" is used to locate the data. If the secret or expected key is not found, the webhook is not honored. If the specified kube config data is not valid, the webhook is not honored.", +} + +func (WebhookTokenAuthenticator) SwaggerDoc() map[string]string { + return map_WebhookTokenAuthenticator +} + +var map_Build = map[string]string{ + "": "Build configures the behavior of OpenShift builds for the entire cluster. This includes default settings that can be overridden in BuildConfig objects, and overrides which are applied to all builds.\n\nThe canonical name is \"cluster\"\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Spec holds user-settable values for the build controller configuration", +} + +func (Build) SwaggerDoc() map[string]string { + return map_Build +} + +var map_BuildDefaults = map[string]string{ + "defaultProxy": "DefaultProxy contains the default proxy settings for all build operations, including image pull/push and source download.\n\nValues can be overrode by setting the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables in the build config's strategy.", + "gitProxy": "GitProxy contains the proxy settings for git operations only. If set, this will override any Proxy settings for all git commands, such as git clone.\n\nValues that are not set here will be inherited from DefaultProxy.", + "env": "Env is a set of default environment variables that will be applied to the build if the specified variables do not exist on the build", + "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. User can override a default label by providing a label with the same name in their Build/BuildConfig.", + "resources": "Resources defines resource requirements to execute the build.", +} + +func (BuildDefaults) SwaggerDoc() map[string]string { + return map_BuildDefaults +} + +var map_BuildList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (BuildList) SwaggerDoc() map[string]string { + return map_BuildList +} + +var map_BuildOverrides = map[string]string{ + "imageLabels": "ImageLabels is a list of docker labels that are applied to the resulting image. If user provided a label in their Build/BuildConfig with the same name as one in this list, the user's label will be overwritten.", + "nodeSelector": "NodeSelector is a selector which must be true for the build pod to fit on a node", + "tolerations": "Tolerations is a list of Tolerations that will override any existing tolerations set on a build pod.", + "forcePull": "ForcePull overrides, if set, the equivalent value in the builds, i.e. false disables force pull for all builds, true enables force pull for all builds, independently of what each build specifies itself", +} + +func (BuildOverrides) SwaggerDoc() map[string]string { + return map_BuildOverrides +} + +var map_BuildSpec = map[string]string{ + "additionalTrustedCA": "AdditionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted for image pushes and pulls during builds. The namespace for this config map is openshift-config.\n\nDEPRECATED: Additional CAs for image pull and push should be set on image.config.openshift.io/cluster instead.", + "buildDefaults": "BuildDefaults controls the default information for Builds", + "buildOverrides": "BuildOverrides controls override settings for builds", +} + +func (BuildSpec) SwaggerDoc() map[string]string { + return map_BuildSpec +} + +var map_ImageLabel = map[string]string{ + "name": "Name defines the name of the label. It must have non-zero length.", + "value": "Value defines the literal value of the label.", +} + +func (ImageLabel) SwaggerDoc() map[string]string { + return map_ImageLabel +} + +var map_ClusterOperator = map[string]string{ + "": "ClusterOperator is the Custom Resource object which holds the current state of an operator. This object is used by operators to convey their state to the rest of the cluster.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds configuration that could apply to any operator.", + "status": "status holds the information about the state of an operator. It is consistent with status information across the Kubernetes ecosystem.", +} + +func (ClusterOperator) SwaggerDoc() map[string]string { + return map_ClusterOperator +} + +var map_ClusterOperatorList = map[string]string{ + "": "ClusterOperatorList is a list of OperatorStatus resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ClusterOperatorList) SwaggerDoc() map[string]string { + return map_ClusterOperatorList +} + +var map_ClusterOperatorSpec = map[string]string{ + "": "ClusterOperatorSpec is empty for now, but you could imagine holding information like \"pause\".", +} + +func (ClusterOperatorSpec) SwaggerDoc() map[string]string { + return map_ClusterOperatorSpec +} + +var map_ClusterOperatorStatus = map[string]string{ + "": "ClusterOperatorStatus provides information about the status of the operator.", + "conditions": "conditions describes the state of the operator's managed and monitored components.", + "versions": "versions is a slice of operator and operand version tuples. Operators which manage multiple operands will have multiple operand entries in the array. Available operators must report the version of the operator itself with the name \"operator\". An operator reports a new \"operator\" version when it has rolled out the new version to all of its operands.", + "relatedObjects": "relatedObjects is a list of objects that are \"interesting\" or related to this operator. Common uses are: 1. the detailed resource driving the operator 2. operator namespaces 3. operand namespaces", + "extension": "extension contains any additional status information specific to the operator which owns this status object.", +} + +func (ClusterOperatorStatus) SwaggerDoc() map[string]string { + return map_ClusterOperatorStatus +} + +var map_ClusterOperatorStatusCondition = map[string]string{ + "": "ClusterOperatorStatusCondition represents the state of the operator's managed and monitored components.", + "type": "type specifies the aspect reported by this condition.", + "status": "status of the condition, one of True, False, Unknown.", + "lastTransitionTime": "lastTransitionTime is the time of the last update to the current status property.", + "reason": "reason is the CamelCase reason for the condition's current status.", + "message": "message provides additional information about the current condition. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines.", +} + +func (ClusterOperatorStatusCondition) SwaggerDoc() map[string]string { + return map_ClusterOperatorStatusCondition +} + +var map_ObjectReference = map[string]string{ + "": "ObjectReference contains enough information to let you inspect or modify the referred object.", + "group": "group of the referent.", + "resource": "resource of the referent.", + "namespace": "namespace of the referent.", + "name": "name of the referent.", +} + +func (ObjectReference) SwaggerDoc() map[string]string { + return map_ObjectReference +} + +var map_OperandVersion = map[string]string{ + "name": "name is the name of the particular operand this version is for. It usually matches container images, not operators.", + "version": "version indicates which version of a particular operand is currently being managed. It must always match the Available operand. If 1.0.0 is Available, then this must indicate 1.0.0 even if the operator is trying to rollout 1.1.0", +} + +func (OperandVersion) SwaggerDoc() map[string]string { + return map_OperandVersion +} + +var map_ClusterCondition = map[string]string{ + "": "ClusterCondition is a union of typed cluster conditions. The 'type' property determines which of the type-specific properties are relevant. When evaluated on a cluster, the condition may match, not match, or fail to evaluate.", + "type": "type represents the cluster-condition type. This defines the members and semantics of any additional properties.", + "promql": "promQL represents a cluster condition based on PromQL.", +} + +func (ClusterCondition) SwaggerDoc() map[string]string { + return map_ClusterCondition +} + +var map_ClusterVersion = map[string]string{ + "": "ClusterVersion is the configuration for the ClusterVersionOperator. This is where parameters related to automatic updates can be set.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec is the desired state of the cluster version - the operator will work to ensure that the desired version is applied to the cluster.", + "status": "status contains information about the available updates and any in-progress updates.", +} + +func (ClusterVersion) SwaggerDoc() map[string]string { + return map_ClusterVersion +} + +var map_ClusterVersionCapabilitiesSpec = map[string]string{ + "": "ClusterVersionCapabilitiesSpec selects the managed set of optional, core cluster components.", + "baselineCapabilitySet": "baselineCapabilitySet selects an initial set of optional capabilities to enable, which can be extended via additionalEnabledCapabilities. If unset, the cluster will choose a default, and the default may change over time. The current default is vCurrent.", + "additionalEnabledCapabilities": "additionalEnabledCapabilities extends the set of managed capabilities beyond the baseline defined in baselineCapabilitySet. The default is an empty set.", +} + +func (ClusterVersionCapabilitiesSpec) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesSpec +} + +var map_ClusterVersionCapabilitiesStatus = map[string]string{ + "": "ClusterVersionCapabilitiesStatus describes the state of optional, core cluster components.", + "enabledCapabilities": "enabledCapabilities lists all the capabilities that are currently managed.", + "knownCapabilities": "knownCapabilities lists all the capabilities known to the current cluster.", +} + +func (ClusterVersionCapabilitiesStatus) SwaggerDoc() map[string]string { + return map_ClusterVersionCapabilitiesStatus +} + +var map_ClusterVersionList = map[string]string{ + "": "ClusterVersionList is a list of ClusterVersion resources.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ClusterVersionList) SwaggerDoc() map[string]string { + return map_ClusterVersionList +} + +var map_ClusterVersionSpec = map[string]string{ + "": "ClusterVersionSpec is the desired version state of the cluster. It includes the version the cluster should be at, how the cluster is identified, and where the cluster should look for version updates.", + "clusterID": "clusterID uniquely identifies this cluster. This is expected to be an RFC4122 UUID value (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in hexadecimal values). This is a required field.", + "desiredUpdate": "desiredUpdate is an optional field that indicates the desired value of the cluster version. Setting this value will trigger an upgrade (if the current version does not match the desired version). The set of recommended update values is listed as part of available updates in status, and setting values outside that range may cause the upgrade to fail.\n\nSome of the fields are inter-related with restrictions and meanings described here. 1. image is specified, version is specified, architecture is specified. API validation error. 2. image is specified, version is specified, architecture is not specified. You should not do this. version is silently ignored and image is used. 3. image is specified, version is not specified, architecture is specified. API validation error. 4. image is specified, version is not specified, architecture is not specified. image is used. 5. image is not specified, version is specified, architecture is specified. version and desired architecture are used to select an image. 6. image is not specified, version is specified, architecture is not specified. version and current architecture are used to select an image. 7. image is not specified, version is not specified, architecture is specified. API validation error. 8. image is not specified, version is not specified, architecture is not specified. API validation error.\n\nIf an upgrade fails the operator will halt and report status about the failing component. Setting the desired update value back to the previous version will cause a rollback to be attempted. Not all rollbacks will succeed.", + "upstream": "upstream may be used to specify the preferred update server. By default it will use the appropriate update server for the cluster and region.", + "channel": "channel is an identifier for explicitly requesting that a non-default set of updates be applied to this cluster. The default channel will be contain stable updates that are appropriate for production clusters.", + "capabilities": "capabilities configures the installation of optional, core cluster components. A null value here is identical to an empty object; see the child properties for default semantics.", + "overrides": "overrides is list of overides for components that are managed by cluster version operator. Marking a component unmanaged will prevent the operator from creating or updating the object.", +} + +func (ClusterVersionSpec) SwaggerDoc() map[string]string { + return map_ClusterVersionSpec +} + +var map_ClusterVersionStatus = map[string]string{ + "": "ClusterVersionStatus reports the status of the cluster versioning, including any upgrades that are in progress. The current field will be set to whichever version the cluster is reconciling to, and the conditions array will report whether the update succeeded, is in progress, or is failing.", + "desired": "desired is the version that the cluster is reconciling towards. If the cluster is not yet fully initialized desired will be set with the information available, which may be an image or a tag.", + "history": "history contains a list of the most recent versions applied to the cluster. This value may be empty during cluster startup, and then will be updated when a new update is being applied. The newest update is first in the list and it is ordered by recency. Updates in the history have state Completed if the rollout completed - if an update was failing or halfway applied the state will be Partial. Only a limited amount of update history is preserved.", + "observedGeneration": "observedGeneration reports which version of the spec is being synced. If this value is not equal to metadata.generation, then the desired and conditions fields may represent a previous version.", + "versionHash": "versionHash is a fingerprint of the content that the cluster will be updated with. It is used by the operator to avoid unnecessary work and is for internal use only.", + "capabilities": "capabilities describes the state of optional, core cluster components.", + "conditions": "conditions provides information about the cluster version. The condition \"Available\" is set to true if the desiredUpdate has been reached. The condition \"Progressing\" is set to true if an update is being applied. The condition \"Degraded\" is set to true if an update is currently blocked by a temporary or permanent error. Conditions are only valid for the current desiredUpdate when metadata.generation is equal to status.generation.", + "availableUpdates": "availableUpdates contains updates recommended for this cluster. Updates which appear in conditionalUpdates but not in availableUpdates may expose this cluster to known issues. This list may be empty if no updates are recommended, if the update service is unavailable, or if an invalid channel has been specified.", + "conditionalUpdates": "conditionalUpdates contains the list of updates that may be recommended for this cluster if it meets specific required conditions. Consumers interested in the set of updates that are actually recommended for this cluster should use availableUpdates. This list may be empty if no updates are recommended, if the update service is unavailable, or if an empty or invalid channel has been specified.", +} + +func (ClusterVersionStatus) SwaggerDoc() map[string]string { + return map_ClusterVersionStatus +} + +var map_ComponentOverride = map[string]string{ + "": "ComponentOverride allows overriding cluster version operator's behavior for a component.", + "kind": "kind indentifies which object to override.", + "group": "group identifies the API group that the kind is in.", + "namespace": "namespace is the component's namespace. If the resource is cluster scoped, the namespace should be empty.", + "name": "name is the component's name.", + "unmanaged": "unmanaged controls if cluster version operator should stop managing the resources in this cluster. Default: false", +} + +func (ComponentOverride) SwaggerDoc() map[string]string { + return map_ComponentOverride +} + +var map_ConditionalUpdate = map[string]string{ + "": "ConditionalUpdate represents an update which is recommended to some clusters on the version the current cluster is reconciling, but which may not be recommended for the current cluster.", + "release": "release is the target of the update.", + "risks": "risks represents the range of issues associated with updating to the target release. The cluster-version operator will evaluate all entries, and only recommend the update if there is at least one entry and all entries recommend the update.", + "conditions": "conditions represents the observations of the conditional update's current status. Known types are: * Evaluating, for whether the cluster-version operator will attempt to evaluate any risks[].matchingRules. * Recommended, for whether the update is recommended for the current cluster.", +} + +func (ConditionalUpdate) SwaggerDoc() map[string]string { + return map_ConditionalUpdate +} + +var map_ConditionalUpdateRisk = map[string]string{ + "": "ConditionalUpdateRisk represents a reason and cluster-state for not recommending a conditional update.", + "url": "url contains information about this risk.", + "name": "name is the CamelCase reason for not recommending a conditional update, in the event that matchingRules match the cluster state.", + "message": "message provides additional information about the risk of updating, in the event that matchingRules match the cluster state. This is only to be consumed by humans. It may contain Line Feed characters (U+000A), which should be rendered as new lines.", + "matchingRules": "matchingRules is a slice of conditions for deciding which clusters match the risk and which do not. The slice is ordered by decreasing precedence. The cluster-version operator will walk the slice in order, and stop after the first it can successfully evaluate. If no condition can be successfully evaluated, the update will not be recommended.", +} + +func (ConditionalUpdateRisk) SwaggerDoc() map[string]string { + return map_ConditionalUpdateRisk +} + +var map_PromQLClusterCondition = map[string]string{ + "": "PromQLClusterCondition represents a cluster condition based on PromQL.", + "promql": "PromQL is a PromQL query classifying clusters. This query query should return a 1 in the match case and a 0 in the does-not-match case. Queries which return no time series, or which return values besides 0 or 1, are evaluation failures.", +} + +func (PromQLClusterCondition) SwaggerDoc() map[string]string { + return map_PromQLClusterCondition +} + +var map_Release = map[string]string{ + "": "Release represents an OpenShift release image and associated metadata.", + "version": "version is a semantic version identifying the update version. When this field is part of spec, version is optional if image is specified.", + "image": "image is a container image location that contains the update. When this field is part of spec, image is optional if version is specified and the availableUpdates field contains a matching version.", + "url": "url contains information about this release. This URL is set by the 'url' metadata property on a release or the metadata returned by the update API and should be displayed as a link in user interfaces. The URL field may not be set for test or nightly releases.", + "channels": "channels is the set of Cincinnati channels to which the release currently belongs.", +} + +func (Release) SwaggerDoc() map[string]string { + return map_Release +} + +var map_Update = map[string]string{ + "": "Update represents an administrator update request.", + "architecture": "architecture is an optional field that indicates the desired value of the cluster architecture. In this context cluster architecture means either a single architecture or a multi architecture. architecture can only be set to Multi thereby only allowing updates from single to multi architecture. If architecture is set, image cannot be set and version must be set. Valid values are 'Multi' and empty.", + "version": "version is a semantic version identifying the update version. version is ignored if image is specified and required if architecture is specified.", + "image": "image is a container image location that contains the update. image should be used when the desired version does not exist in availableUpdates or history. When image is set, version is ignored. When image is set, version should be empty. When image is set, architecture cannot be specified.", + "force": "force allows an administrator to update to an image that has failed verification or upgradeable checks. This option should only be used when the authenticity of the provided image has been verified out of band because the provided image will run with full administrative access to the cluster. Do not use this flag with images that comes from unknown or potentially malicious sources.", +} + +func (Update) SwaggerDoc() map[string]string { + return map_Update +} + +var map_UpdateHistory = map[string]string{ + "": "UpdateHistory is a single attempted update to the cluster.", + "state": "state reflects whether the update was fully applied. The Partial state indicates the update is not fully applied, while the Completed state indicates the update was successfully rolled out at least once (all parts of the update successfully applied).", + "startedTime": "startedTime is the time at which the update was started.", + "completionTime": "completionTime, if set, is when the update was fully applied. The update that is currently being applied will have a null completion time. Completion time will always be set for entries that are not the current update (usually to the started time of the next update).", + "version": "version is a semantic version identifying the update version. If the requested image does not define a version, or if a failure occurs retrieving the image, this value may be empty.", + "image": "image is a container image location that contains the update. This value is always populated.", + "verified": "verified indicates whether the provided update was properly verified before it was installed. If this is false the cluster may not be trusted. Verified does not cover upgradeable checks that depend on the cluster state at the time when the update target was accepted.", + "acceptedRisks": "acceptedRisks records risks which were accepted to initiate the update. For example, it may menition an Upgradeable=False or missing signature that was overriden via desiredUpdate.force, or an update that was initiated despite not being in the availableUpdates set of recommended update targets.", +} + +func (UpdateHistory) SwaggerDoc() map[string]string { + return map_UpdateHistory +} + +var map_Console = map[string]string{ + "": "Console holds cluster-wide configuration for the web console, including the logout URL, and reports the public URL of the console. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Console) SwaggerDoc() map[string]string { + return map_Console +} + +var map_ConsoleAuthentication = map[string]string{ + "": "ConsoleAuthentication defines a list of optional configuration for console authentication.", + "logoutRedirect": "An optional, absolute URL to redirect web browsers to after logging out of the console. If not specified, it will redirect to the default login page. This is required when using an identity provider that supports single sign-on (SSO) such as: - OpenID (Keycloak, Azure) - RequestHeader (GSSAPI, SSPI, SAML) - OAuth (GitHub, GitLab, Google) Logging out of the console will destroy the user's token. The logoutRedirect provides the user the option to perform single logout (SLO) through the identity provider to destroy their single sign-on session.", +} + +func (ConsoleAuthentication) SwaggerDoc() map[string]string { + return map_ConsoleAuthentication +} + +var map_ConsoleList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ConsoleList) SwaggerDoc() map[string]string { + return map_ConsoleList +} + +var map_ConsoleSpec = map[string]string{ + "": "ConsoleSpec is the specification of the desired behavior of the Console.", +} + +func (ConsoleSpec) SwaggerDoc() map[string]string { + return map_ConsoleSpec +} + +var map_ConsoleStatus = map[string]string{ + "": "ConsoleStatus defines the observed status of the Console.", + "consoleURL": "The URL for the console. This will be derived from the host for the route that is created for the console.", +} + +func (ConsoleStatus) SwaggerDoc() map[string]string { + return map_ConsoleStatus +} + +var map_DNS = map[string]string{ + "": "DNS holds cluster-wide information about DNS. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (DNS) SwaggerDoc() map[string]string { + return map_DNS +} + +var map_DNSList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (DNSList) SwaggerDoc() map[string]string { + return map_DNSList +} + +var map_DNSSpec = map[string]string{ + "baseDomain": "baseDomain is the base domain of the cluster. All managed DNS records will be sub-domains of this base.\n\nFor example, given the base domain `openshift.example.com`, an API server DNS record may be created for `cluster-api.openshift.example.com`.\n\nOnce set, this field cannot be changed.", + "publicZone": "publicZone is the location where all the DNS records that are publicly accessible to the internet exist.\n\nIf this field is nil, no public records should be created.\n\nOnce set, this field cannot be changed.", + "privateZone": "privateZone is the location where all the DNS records that are only available internally to the cluster exist.\n\nIf this field is nil, no private records should be created.\n\nOnce set, this field cannot be changed.", +} + +func (DNSSpec) SwaggerDoc() map[string]string { + return map_DNSSpec +} + +var map_DNSZone = map[string]string{ + "": "DNSZone is used to define a DNS hosted zone. A zone can be identified by an ID or tags.", + "id": "id is the identifier that can be used to find the DNS hosted zone.\n\non AWS zone can be fetched using `ID` as id in [1] on Azure zone can be fetched using `ID` as a pre-determined name in [2], on GCP zone can be fetched using `ID` as a pre-determined name in [3].\n\n[1]: https://docs.aws.amazon.com/cli/latest/reference/route53/get-hosted-zone.html#options [2]: https://docs.microsoft.com/en-us/cli/azure/network/dns/zone?view=azure-cli-latest#az-network-dns-zone-show [3]: https://cloud.google.com/dns/docs/reference/v1/managedZones/get", + "tags": "tags can be used to query the DNS hosted zone.\n\non AWS, resourcegroupstaggingapi [1] can be used to fetch a zone using `Tags` as tag-filters,\n\n[1]: https://docs.aws.amazon.com/cli/latest/reference/resourcegroupstaggingapi/get-resources.html#options", +} + +func (DNSZone) SwaggerDoc() map[string]string { + return map_DNSZone +} + +var map_CustomFeatureGates = map[string]string{ + "enabled": "enabled is a list of all feature gates that you want to force on", + "disabled": "disabled is a list of all feature gates that you want to force off", +} + +func (CustomFeatureGates) SwaggerDoc() map[string]string { + return map_CustomFeatureGates +} + +var map_FeatureGate = map[string]string{ + "": "Feature holds cluster-wide information about feature gates. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (FeatureGate) SwaggerDoc() map[string]string { + return map_FeatureGate +} + +var map_FeatureGateAttributes = map[string]string{ + "name": "name is the name of the FeatureGate.", +} + +func (FeatureGateAttributes) SwaggerDoc() map[string]string { + return map_FeatureGateAttributes +} + +var map_FeatureGateDetails = map[string]string{ + "version": "version matches the version provided by the ClusterVersion and in the ClusterOperator.Status.Versions field.", + "enabled": "enabled is a list of all feature gates that are enabled in the cluster for the named version.", + "disabled": "disabled is a list of all feature gates that are disabled in the cluster for the named version.", +} + +func (FeatureGateDetails) SwaggerDoc() map[string]string { + return map_FeatureGateDetails +} + +var map_FeatureGateList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (FeatureGateList) SwaggerDoc() map[string]string { + return map_FeatureGateList +} + +var map_FeatureGateSelection = map[string]string{ + "featureSet": "featureSet changes the list of features in the cluster. The default is empty. Be very careful adjusting this setting. Turning on or off features may cause irreversible changes in your cluster which cannot be undone.", + "customNoUpgrade": "customNoUpgrade allows the enabling or disabling of any feature. Turning this feature set on IS NOT SUPPORTED, CANNOT BE UNDONE, and PREVENTS UPGRADES. Because of its nature, this setting cannot be validated. If you have any typos or accidentally apply invalid combinations your cluster may fail in an unrecoverable way. featureSet must equal \"CustomNoUpgrade\" must be set to use this field.", +} + +func (FeatureGateSelection) SwaggerDoc() map[string]string { + return map_FeatureGateSelection +} + +var map_FeatureGateStatus = map[string]string{ + "conditions": "conditions represent the observations of the current state. Known .status.conditions.type are: \"DeterminationDegraded\"", + "featureGates": "featureGates contains a list of enabled and disabled featureGates that are keyed by payloadVersion. Operators other than the CVO and cluster-config-operator, must read the .status.featureGates, locate the version they are managing, find the enabled/disabled featuregates and make the operand and operator match. The enabled/disabled values for a particular version may change during the life of the cluster as various .spec.featureSet values are selected. Operators may choose to restart their processes to pick up these changes, but remembering past enable/disable lists is beyond the scope of this API and is the responsibility of individual operators. Only featureGates with .version in the ClusterVersion.status will be present in this list.", +} + +func (FeatureGateStatus) SwaggerDoc() map[string]string { + return map_FeatureGateStatus +} + +var map_Image = map[string]string{ + "": "Image governs policies related to imagestream imports and runtime configuration for external registries. It allows cluster admins to configure which registries OpenShift is allowed to import images from, extra CA trust bundles for external registries, and policies to block or allow registry hostnames. When exposing OpenShift's image registry to the public, this also lets cluster admins specify the external hostname.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Image) SwaggerDoc() map[string]string { + return map_Image +} + +var map_ImageList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageList) SwaggerDoc() map[string]string { + return map_ImageList +} + +var map_ImageSpec = map[string]string{ + "allowedRegistriesForImport": "allowedRegistriesForImport limits the container image registries that normal users may import images from. Set this list to the registries that you trust to contain valid Docker images and that you want applications to be able to import from. Users with permission to create Images or ImageStreamMappings via the API are not affected by this policy - typically only administrators or system integrations will have those permissions.", + "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", + "additionalTrustedCA": "additionalTrustedCA is a reference to a ConfigMap containing additional CAs that should be trusted during imagestream import, pod image pull, build image pull, and imageregistry pullthrough. The namespace for this config map is openshift-config.", + "registrySources": "registrySources contains configuration that determines how the container runtime should treat individual registries when accessing images for builds+pods. (e.g. whether or not to allow insecure access). It does not contain configuration for the internal cluster registry.", +} + +func (ImageSpec) SwaggerDoc() map[string]string { + return map_ImageSpec +} + +var map_ImageStatus = map[string]string{ + "internalRegistryHostname": "internalRegistryHostname sets the hostname for the default internal image registry. The value must be in \"hostname[:port]\" format. This value is set by the image registry operator which controls the internal registry hostname. For backward compatibility, users can still use OPENSHIFT_DEFAULT_REGISTRY environment variable but this setting overrides the environment variable.", + "externalRegistryHostnames": "externalRegistryHostnames provides the hostnames for the default external image registry. The external hostname should be set only when the image registry is exposed externally. The first value is used in 'publicDockerImageRepository' field in ImageStreams. The value must be in \"hostname[:port]\" format.", +} + +func (ImageStatus) SwaggerDoc() map[string]string { + return map_ImageStatus +} + +var map_RegistryLocation = map[string]string{ + "": "RegistryLocation contains a location of the registry specified by the registry domain name. The domain name might include wildcards, like '*' or '??'.", + "domainName": "domainName specifies a domain name for the registry In case the registry use non-standard (80 or 443) port, the port should be included in the domain name as well.", + "insecure": "insecure indicates whether the registry is secure (https) or insecure (http) By default (if not specified) the registry is assumed as secure.", +} + +func (RegistryLocation) SwaggerDoc() map[string]string { + return map_RegistryLocation +} + +var map_RegistrySources = map[string]string{ + "": "RegistrySources holds cluster-wide information about how to handle the registries config.", + "insecureRegistries": "insecureRegistries are registries which do not have a valid TLS certificates or only support HTTP connections.", + "blockedRegistries": "blockedRegistries cannot be used for image pull and push actions. All other registries are permitted.\n\nOnly one of BlockedRegistries or AllowedRegistries may be set.", + "allowedRegistries": "allowedRegistries are the only registries permitted for image pull and push actions. All other registries are denied.\n\nOnly one of BlockedRegistries or AllowedRegistries may be set.", + "containerRuntimeSearchRegistries": "containerRuntimeSearchRegistries are registries that will be searched when pulling images that do not have fully qualified domains in their pull specs. Registries will be searched in the order provided in the list. Note: this search list only works with the container runtime, i.e CRI-O. Will NOT work with builds or imagestream imports.", +} + +func (RegistrySources) SwaggerDoc() map[string]string { + return map_RegistrySources +} + +var map_ImageContentPolicy = map[string]string{ + "": "ImageContentPolicy holds cluster-wide information about how to handle registry mirror rules. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", +} + +func (ImageContentPolicy) SwaggerDoc() map[string]string { + return map_ImageContentPolicy +} + +var map_ImageContentPolicyList = map[string]string{ + "": "ImageContentPolicyList lists the items in the ImageContentPolicy CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageContentPolicyList) SwaggerDoc() map[string]string { + return map_ImageContentPolicyList +} + +var map_ImageContentPolicySpec = map[string]string{ + "": "ImageContentPolicySpec is the specification of the ImageContentPolicy CRD.", + "repositoryDigestMirrors": "repositoryDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in RepositoryDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To pull image from mirrors by tags, should set the \"allowMirrorByTags\".\n\nEach “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified.", +} + +func (ImageContentPolicySpec) SwaggerDoc() map[string]string { + return map_ImageContentPolicySpec +} + +var map_RepositoryDigestMirrors = map[string]string{ + "": "RepositoryDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source is the repository that users refer to, e.g. in image pull specifications.", + "allowMirrorByTags": "allowMirrorByTags if true, the mirrors can be used to pull the images that are referenced by their tags. Default is false, the mirrors only work when pulling the images that are referenced by their digests. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Forcing digest-pulls for mirrors avoids that issue.", + "mirrors": "mirrors is zero or more repositories that may also contain the same images. If the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec. No mirror will be configured. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. Other cluster configuration, including (but not limited to) other repositoryDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering.", +} + +func (RepositoryDigestMirrors) SwaggerDoc() map[string]string { + return map_RepositoryDigestMirrors +} + +var map_ImageDigestMirrorSet = map[string]string{ + "": "ImageDigestMirrorSet holds cluster-wide information about how to handle registry mirror rules on using digest pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageDigestMirrorSet) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSet +} + +var map_ImageDigestMirrorSetList = map[string]string{ + "": "ImageDigestMirrorSetList lists the items in the ImageDigestMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageDigestMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetList +} + +var map_ImageDigestMirrorSetSpec = map[string]string{ + "": "ImageDigestMirrorSetSpec is the specification of the ImageDigestMirrorSet CRD.", + "imageDigestMirrors": "imageDigestMirrors allows images referenced by image digests in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageDigestMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using tag specification, users should configure a list of mirrors using \"ImageTagMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagedigestmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a specific order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageDigestMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageDigestMirrorSetSpec +} + +var map_ImageDigestMirrors = map[string]string{ + "": "ImageDigestMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their digests. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\" Other cluster configuration, including (but not limited to) other imageDigestMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageDigestMirrors) SwaggerDoc() map[string]string { + return map_ImageDigestMirrors +} + +var map_ImageTagMirrorSet = map[string]string{ + "": "ImageTagMirrorSet holds cluster-wide information about how to handle registry mirror rules on using tag pull specification. When multiple policies are defined, the outcome of the behavior is defined on each field.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status contains the observed state of the resource.", +} + +func (ImageTagMirrorSet) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSet +} + +var map_ImageTagMirrorSetList = map[string]string{ + "": "ImageTagMirrorSetList lists the items in the ImageTagMirrorSet CRD.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ImageTagMirrorSetList) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetList +} + +var map_ImageTagMirrorSetSpec = map[string]string{ + "": "ImageTagMirrorSetSpec is the specification of the ImageTagMirrorSet CRD.", + "imageTagMirrors": "imageTagMirrors allows images referenced by image tags in pods to be pulled from alternative mirrored repository locations. The image pull specification provided to the pod will be compared to the source locations described in imageTagMirrors and the image may be pulled down from any of the mirrors in the list instead of the specified repository allowing administrators to choose a potentially faster mirror. To use mirrors to pull images using digest specification only, users should configure a list of mirrors using \"ImageDigestMirrorSet\" CRD.\n\nIf the image pull specification matches the repository of \"source\" in multiple imagetagmirrorset objects, only the objects which define the most specific namespace match will be used. For example, if there are objects using quay.io/libpod and quay.io/libpod/busybox as the \"source\", only the objects using quay.io/libpod/busybox are going to apply for pull specification quay.io/libpod/busybox. Each “source” repository is treated independently; configurations for different “source” repositories don’t interact.\n\nIf the \"mirrors\" is not specified, the image will continue to be pulled from the specified repository in the pull spec.\n\nWhen multiple policies are defined for the same “source” repository, the sets of defined mirrors will be merged together, preserving the relative order of the mirrors, if possible. For example, if policy A has mirrors `a, b, c` and policy B has mirrors `c, d, e`, the mirrors will be used in the order `a, b, c, d, e`. If the orders of mirror entries conflict (e.g. `a, b` vs. `b, a`) the configuration is not rejected but the resulting order is unspecified. Users who want to use a deterministic order of mirrors, should configure them into one list of mirrors using the expected order.", +} + +func (ImageTagMirrorSetSpec) SwaggerDoc() map[string]string { + return map_ImageTagMirrorSetSpec +} + +var map_ImageTagMirrors = map[string]string{ + "": "ImageTagMirrors holds cluster-wide information about how to handle mirrors in the registries config.", + "source": "source matches the repository that users refer to, e.g. in image pull specifications. Setting source to a registry hostname e.g. docker.io. quay.io, or registry.redhat.io, will match the image pull specification of corressponding registry. \"source\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo [*.]host for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrors": "mirrors is zero or more locations that may also contain the same images. No mirror will be configured if not specified. Images can be pulled from these mirrors only if they are referenced by their tags. The mirrored location is obtained by replacing the part of the input reference that matches source by the mirrors entry, e.g. for registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io, mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used. Pulling images by tag can potentially yield different images, depending on which endpoint we pull from. Configuring a list of mirrors using \"ImageDigestMirrorSet\" CRD and forcing digest-pulls for mirrors avoids that issue. The order of mirrors in this list is treated as the user's desired priority, while source is by default considered lower priority than all mirrors. If no mirror is specified or all image pulls from the mirror list fail, the image will continue to be pulled from the repository in the pull spec unless explicitly prohibited by \"mirrorSourcePolicy\". Other cluster configuration, including (but not limited to) other imageTagMirrors objects, may impact the exact order mirrors are contacted in, or some mirrors may be contacted in parallel, so this should be considered a preference rather than a guarantee of ordering. \"mirrors\" uses one of the following formats: host[:port] host[:port]/namespace[/namespace…] host[:port]/namespace[/namespace…]/repo for more information about the format, see the document about the location field: https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table", + "mirrorSourcePolicy": "mirrorSourcePolicy defines the fallback policy if fails to pull image from the mirrors. If unset, the image will continue to be pulled from the repository in the pull spec. sourcePolicy is valid configuration only when one or more mirrors are in the mirror list.", +} + +func (ImageTagMirrors) SwaggerDoc() map[string]string { + return map_ImageTagMirrors +} + +var map_AWSPlatformSpec = map[string]string{ + "": "AWSPlatformSpec holds the desired state of the Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", +} + +func (AWSPlatformSpec) SwaggerDoc() map[string]string { + return map_AWSPlatformSpec +} + +var map_AWSPlatformStatus = map[string]string{ + "": "AWSPlatformStatus holds the current status of the Amazon Web Services infrastructure provider.", + "region": "region holds the default AWS region for new AWS resources created by the cluster.", + "serviceEndpoints": "ServiceEndpoints list contains custom endpoints which will override default service endpoint of AWS Services. There must be only one ServiceEndpoint for a service.", + "resourceTags": "resourceTags is a list of additional tags to apply to AWS resources created for the cluster. See https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html for information on tagging AWS resources. AWS supports a maximum of 50 tags per resource. OpenShift reserves 25 tags for its use, leaving 25 tags available for the user.", +} + +func (AWSPlatformStatus) SwaggerDoc() map[string]string { + return map_AWSPlatformStatus +} + +var map_AWSResourceTag = map[string]string{ + "": "AWSResourceTag is a tag to apply to AWS resources created for the cluster.", + "key": "key is the key of the tag", + "value": "value is the value of the tag. Some AWS service do not support empty values. Since tags are added to resources in many services, the length of the tag value must meet the requirements of all services.", +} + +func (AWSResourceTag) SwaggerDoc() map[string]string { + return map_AWSResourceTag +} + +var map_AWSServiceEndpoint = map[string]string{ + "": "AWSServiceEndpoint store the configuration of a custom url to override existing defaults of AWS Services.", + "name": "name is the name of the AWS service. The list of all the service names can be found at https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html This must be provided and cannot be empty.", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty.", +} + +func (AWSServiceEndpoint) SwaggerDoc() map[string]string { + return map_AWSServiceEndpoint +} + +var map_AlibabaCloudPlatformSpec = map[string]string{ + "": "AlibabaCloudPlatformSpec holds the desired state of the Alibaba Cloud infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (AlibabaCloudPlatformSpec) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformSpec +} + +var map_AlibabaCloudPlatformStatus = map[string]string{ + "": "AlibabaCloudPlatformStatus holds the current status of the Alibaba Cloud infrastructure provider.", + "region": "region specifies the region for Alibaba Cloud resources created for the cluster.", + "resourceGroupID": "resourceGroupID is the ID of the resource group for the cluster.", + "resourceTags": "resourceTags is a list of additional tags to apply to Alibaba Cloud resources created for the cluster.", +} + +func (AlibabaCloudPlatformStatus) SwaggerDoc() map[string]string { + return map_AlibabaCloudPlatformStatus +} + +var map_AlibabaCloudResourceTag = map[string]string{ + "": "AlibabaCloudResourceTag is the set of tags to add to apply to resources.", + "key": "key is the key of the tag.", + "value": "value is the value of the tag.", +} + +func (AlibabaCloudResourceTag) SwaggerDoc() map[string]string { + return map_AlibabaCloudResourceTag +} + +var map_AzurePlatformSpec = map[string]string{ + "": "AzurePlatformSpec holds the desired state of the Azure infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (AzurePlatformSpec) SwaggerDoc() map[string]string { + return map_AzurePlatformSpec +} + +var map_AzurePlatformStatus = map[string]string{ + "": "AzurePlatformStatus holds the current status of the Azure infrastructure provider.", + "resourceGroupName": "resourceGroupName is the Resource Group for new Azure resources created for the cluster.", + "networkResourceGroupName": "networkResourceGroupName is the Resource Group for network resources like the Virtual Network and Subnets used by the cluster. If empty, the value is same as ResourceGroupName.", + "cloudName": "cloudName is the name of the Azure cloud environment which can be used to configure the Azure SDK with the appropriate Azure API endpoints. If empty, the value is equal to `AzurePublicCloud`.", + "armEndpoint": "armEndpoint specifies a URL to use for resource management in non-soverign clouds such as Azure Stack.", + "resourceTags": "resourceTags is a list of additional tags to apply to Azure resources created for the cluster. See https://docs.microsoft.com/en-us/rest/api/resources/tags for information on tagging Azure resources. Due to limitations on Automation, Content Delivery Network, DNS Azure resources, a maximum of 15 tags may be applied. OpenShift reserves 5 tags for internal use, allowing 10 tags for user configuration.", +} + +func (AzurePlatformStatus) SwaggerDoc() map[string]string { + return map_AzurePlatformStatus +} + +var map_AzureResourceTag = map[string]string{ + "": "AzureResourceTag is a tag to apply to Azure resources created for the cluster.", + "key": "key is the key part of the tag. A tag key can have a maximum of 128 characters and cannot be empty. Key must begin with a letter, end with a letter, number or underscore, and must contain only alphanumeric characters and the following special characters `_ . -`.", + "value": "value is the value part of the tag. A tag value can have a maximum of 256 characters and cannot be empty. Value must contain only alphanumeric characters and the following special characters `_ + , - . / : ; < = > ? @`.", +} + +func (AzureResourceTag) SwaggerDoc() map[string]string { + return map_AzureResourceTag +} + +var map_BareMetalPlatformLoadBalancer = map[string]string{ + "": "BareMetalPlatformLoadBalancer defines the load balancer used by the cluster on BareMetal platform.", + "type": "type defines the type of load balancer used by the cluster on BareMetal platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (BareMetalPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_BareMetalPlatformLoadBalancer +} + +var map_BareMetalPlatformSpec = map[string]string{ + "": "BareMetalPlatformSpec holds the desired state of the BareMetal infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (BareMetalPlatformSpec) SwaggerDoc() map[string]string { + return map_BareMetalPlatformSpec +} + +var map_BareMetalPlatformStatus = map[string]string{ + "": "BareMetalPlatformStatus holds the current status of the BareMetal infrastructure provider. For more information about the network architecture used with the BareMetal platform type, see: https://github.com/openshift/installer/blob/master/docs/design/baremetal/networking-infrastructure.md", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for BareMetal deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (BareMetalPlatformStatus) SwaggerDoc() map[string]string { + return map_BareMetalPlatformStatus +} + +var map_EquinixMetalPlatformSpec = map[string]string{ + "": "EquinixMetalPlatformSpec holds the desired state of the Equinix Metal infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (EquinixMetalPlatformSpec) SwaggerDoc() map[string]string { + return map_EquinixMetalPlatformSpec +} + +var map_EquinixMetalPlatformStatus = map[string]string{ + "": "EquinixMetalPlatformStatus holds the current status of the Equinix Metal infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", +} + +func (EquinixMetalPlatformStatus) SwaggerDoc() map[string]string { + return map_EquinixMetalPlatformStatus +} + +var map_ExternalPlatformSpec = map[string]string{ + "": "ExternalPlatformSpec holds the desired state for the generic External infrastructure provider.", + "platformName": "PlatformName holds the arbitrary string representing the infrastructure provider name, expected to be set at the installation time. This field is solely for informational and reporting purposes and is not expected to be used for decision-making.", +} + +func (ExternalPlatformSpec) SwaggerDoc() map[string]string { + return map_ExternalPlatformSpec +} + +var map_ExternalPlatformStatus = map[string]string{ + "": "ExternalPlatformStatus holds the current status of the generic External infrastructure provider.", +} + +func (ExternalPlatformStatus) SwaggerDoc() map[string]string { + return map_ExternalPlatformStatus +} + +var map_GCPPlatformSpec = map[string]string{ + "": "GCPPlatformSpec holds the desired state of the Google Cloud Platform infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (GCPPlatformSpec) SwaggerDoc() map[string]string { + return map_GCPPlatformSpec +} + +var map_GCPPlatformStatus = map[string]string{ + "": "GCPPlatformStatus holds the current status of the Google Cloud Platform infrastructure provider.", + "projectID": "resourceGroupName is the Project ID for new GCP resources created for the cluster.", + "region": "region holds the region for new GCP resources created for the cluster.", +} + +func (GCPPlatformStatus) SwaggerDoc() map[string]string { + return map_GCPPlatformStatus +} + +var map_IBMCloudPlatformSpec = map[string]string{ + "": "IBMCloudPlatformSpec holds the desired state of the IBMCloud infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (IBMCloudPlatformSpec) SwaggerDoc() map[string]string { + return map_IBMCloudPlatformSpec +} + +var map_IBMCloudPlatformStatus = map[string]string{ + "": "IBMCloudPlatformStatus holds the current status of the IBMCloud infrastructure provider.", + "location": "Location is where the cluster has been deployed", + "resourceGroupName": "ResourceGroupName is the Resource Group for new IBMCloud resources created for the cluster.", + "providerType": "ProviderType indicates the type of cluster that was created", + "cisInstanceCRN": "CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", +} + +func (IBMCloudPlatformStatus) SwaggerDoc() map[string]string { + return map_IBMCloudPlatformStatus +} + +var map_Infrastructure = map[string]string{ + "": "Infrastructure holds cluster-wide information about Infrastructure. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Infrastructure) SwaggerDoc() map[string]string { + return map_Infrastructure +} + +var map_InfrastructureList = map[string]string{ + "": "InfrastructureList is\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (InfrastructureList) SwaggerDoc() map[string]string { + return map_InfrastructureList +} + +var map_InfrastructureSpec = map[string]string{ + "": "InfrastructureSpec contains settings that apply to the cluster infrastructure.", + "cloudConfig": "cloudConfig is a reference to a ConfigMap containing the cloud provider configuration file. This configuration file is used to configure the Kubernetes cloud provider integration when using the built-in cloud provider integration or the external cloud controller manager. The namespace for this config map is openshift-config.\n\ncloudConfig should only be consumed by the kube_cloud_config controller. The controller is responsible for using the user configuration in the spec for various platforms and combining that with the user provided ConfigMap in this field to create a stitched kube cloud config. The controller generates a ConfigMap `kube-cloud-config` in `openshift-config-managed` namespace with the kube cloud config is stored in `cloud.conf` key. All the clients are expected to use the generated ConfigMap only.", + "platformSpec": "platformSpec holds desired information specific to the underlying infrastructure provider.", +} + +func (InfrastructureSpec) SwaggerDoc() map[string]string { + return map_InfrastructureSpec +} + +var map_InfrastructureStatus = map[string]string{ + "": "InfrastructureStatus describes the infrastructure the cluster is leveraging.", + "infrastructureName": "infrastructureName uniquely identifies a cluster with a human friendly name. Once set it should not be changed. Must be of max length 27 and must have only alphanumeric or hyphen characters.", + "platform": "platform is the underlying infrastructure provider for the cluster.\n\nDeprecated: Use platformStatus.type instead.", + "platformStatus": "platformStatus holds status information specific to the underlying infrastructure provider.", + "etcdDiscoveryDomain": "etcdDiscoveryDomain is the domain used to fetch the SRV records for discovering etcd servers and clients. For more info: https://github.com/etcd-io/etcd/blob/329be66e8b3f9e2e6af83c123ff89297e49ebd15/Documentation/op-guide/clustering.md#dns-discovery deprecated: as of 4.7, this field is no longer set or honored. It will be removed in a future release.", + "apiServerURL": "apiServerURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerURL can be used by components like the web console to tell users where to find the Kubernetes API.", + "apiServerInternalURI": "apiServerInternalURL is a valid URI with scheme 'https', address and optionally a port (defaulting to 443). apiServerInternalURL can be used by components like kubelets, to contact the Kubernetes API server using the infrastructure provider rather than Kubernetes networking.", + "controlPlaneTopology": "controlPlaneTopology expresses the expectations for operands that normally run on control nodes. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation The 'External' mode indicates that the control plane is hosted externally to the cluster and that its components are not visible within the cluster.", + "infrastructureTopology": "infrastructureTopology expresses the expectations for infrastructure services that do not run on control plane nodes, usually indicated by a node selector for a `role` value other than `master`. The default is 'HighlyAvailable', which represents the behavior operators have in a \"normal\" cluster. The 'SingleReplica' mode will be used in single-node deployments and the operators should not configure the operand for highly-available operation NOTE: External topology mode is not applicable for this field.", + "cpuPartitioning": "cpuPartitioning expresses if CPU partitioning is a currently enabled feature in the cluster. CPU Partitioning means that this cluster can support partitioning workloads to specific CPU Sets. Valid values are \"None\" and \"AllNodes\". When omitted, the default value is \"None\". The default value of \"None\" indicates that no nodes will be setup with CPU partitioning. The \"AllNodes\" value indicates that all nodes have been setup with CPU partitioning, and can then be further configured via the PerformanceProfile API.", +} + +func (InfrastructureStatus) SwaggerDoc() map[string]string { + return map_InfrastructureStatus +} + +var map_KubevirtPlatformSpec = map[string]string{ + "": "KubevirtPlatformSpec holds the desired state of the kubevirt infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (KubevirtPlatformSpec) SwaggerDoc() map[string]string { + return map_KubevirtPlatformSpec +} + +var map_KubevirtPlatformStatus = map[string]string{ + "": "KubevirtPlatformStatus holds the current status of the kubevirt infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.", +} + +func (KubevirtPlatformStatus) SwaggerDoc() map[string]string { + return map_KubevirtPlatformStatus +} + +var map_NutanixPlatformLoadBalancer = map[string]string{ + "": "NutanixPlatformLoadBalancer defines the load balancer used by the cluster on Nutanix platform.", + "type": "type defines the type of load balancer used by the cluster on Nutanix platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (NutanixPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_NutanixPlatformLoadBalancer +} + +var map_NutanixPlatformSpec = map[string]string{ + "": "NutanixPlatformSpec holds the desired state of the Nutanix infrastructure provider. This only includes fields that can be modified in the cluster.", + "prismCentral": "prismCentral holds the endpoint address and port to access the Nutanix Prism Central. When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", + "prismElements": "prismElements holds one or more endpoint address and port data to access the Nutanix Prism Elements (clusters) of the Nutanix Prism Central. Currently we only support one Prism Element (cluster) for an OpenShift cluster, where all the Nutanix resources (VMs, subnets, volumes, etc.) used in the OpenShift cluster are located. In the future, we may support Nutanix resources (VMs, etc.) spread over multiple Prism Elements (clusters) of the Prism Central.", +} + +func (NutanixPlatformSpec) SwaggerDoc() map[string]string { + return map_NutanixPlatformSpec +} + +var map_NutanixPlatformStatus = map[string]string{ + "": "NutanixPlatformStatus holds the current status of the Nutanix infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (NutanixPlatformStatus) SwaggerDoc() map[string]string { + return map_NutanixPlatformStatus +} + +var map_NutanixPrismElementEndpoint = map[string]string{ + "": "NutanixPrismElementEndpoint holds the name and endpoint data for a Prism Element (cluster)", + "name": "name is the name of the Prism Element (cluster). This value will correspond with the cluster field configured on other resources (eg Machines, PVCs, etc).", + "endpoint": "endpoint holds the endpoint address and port data of the Prism Element (cluster). When a cluster-wide proxy is installed, by default, this endpoint will be accessed via the proxy. Should you wish for communication with this endpoint not to be proxied, please add the endpoint to the proxy spec.noProxy list.", +} + +func (NutanixPrismElementEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismElementEndpoint +} + +var map_NutanixPrismEndpoint = map[string]string{ + "": "NutanixPrismEndpoint holds the endpoint address and port to access the Nutanix Prism Central or Element (cluster)", + "address": "address is the endpoint address (DNS name or IP address) of the Nutanix Prism Central or Element (cluster)", + "port": "port is the port number to access the Nutanix Prism Central or Element (cluster)", +} + +func (NutanixPrismEndpoint) SwaggerDoc() map[string]string { + return map_NutanixPrismEndpoint +} + +var map_OpenStackPlatformLoadBalancer = map[string]string{ + "": "OpenStackPlatformLoadBalancer defines the load balancer used by the cluster on OpenStack platform.", + "type": "type defines the type of load balancer used by the cluster on OpenStack platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OpenStackPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OpenStackPlatformLoadBalancer +} + +var map_OpenStackPlatformSpec = map[string]string{ + "": "OpenStackPlatformSpec holds the desired state of the OpenStack infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (OpenStackPlatformSpec) SwaggerDoc() map[string]string { + return map_OpenStackPlatformSpec +} + +var map_OpenStackPlatformStatus = map[string]string{ + "": "OpenStackPlatformStatus holds the current status of the OpenStack infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "cloudName": "cloudName is the name of the desired OpenStack cloud in the client configuration file (`clouds.yaml`).", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for OpenStack deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (OpenStackPlatformStatus) SwaggerDoc() map[string]string { + return map_OpenStackPlatformStatus +} + +var map_OvirtPlatformLoadBalancer = map[string]string{ + "": "OvirtPlatformLoadBalancer defines the load balancer used by the cluster on Ovirt platform.", + "type": "type defines the type of load balancer used by the cluster on Ovirt platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (OvirtPlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_OvirtPlatformLoadBalancer +} + +var map_OvirtPlatformSpec = map[string]string{ + "": "OvirtPlatformSpec holds the desired state of the oVirt infrastructure provider. This only includes fields that can be modified in the cluster.", +} + +func (OvirtPlatformSpec) SwaggerDoc() map[string]string { + return map_OvirtPlatformSpec +} + +var map_OvirtPlatformStatus = map[string]string{ + "": "OvirtPlatformStatus holds the current status of the oVirt infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "deprecated: as of 4.6, this field is no longer set or honored. It will be removed in a future release.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (OvirtPlatformStatus) SwaggerDoc() map[string]string { + return map_OvirtPlatformStatus +} + +var map_PlatformSpec = map[string]string{ + "": "PlatformSpec holds the desired state specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "Azure contains settings specific to the Azure infrastructure provider.", + "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "BareMetal contains settings specific to the BareMetal platform.", + "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "PowerVS contains settings specific to the IBM Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "Nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "ExternalPlatformType represents generic infrastructure provider. Platform-specific components should be supplemented separately.", +} + +func (PlatformSpec) SwaggerDoc() map[string]string { + return map_PlatformSpec +} + +var map_PlatformStatus = map[string]string{ + "": "PlatformStatus holds the current status specific to the underlying infrastructure provider of the current cluster. Since these are used at status-level for the underlying cluster, it is supposed that only one of the status structs is set.", + "type": "type is the underlying infrastructure provider for the cluster. This value controls whether infrastructure automation such as service load balancers, dynamic volume provisioning, machine creation and deletion, and other integrations are enabled. If None, no infrastructure automation is enabled. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.\n\nThis value will be synced with to the `status.platform` and `status.platformStatus.type`. Currently this value cannot be changed once set.", + "aws": "AWS contains settings specific to the Amazon Web Services infrastructure provider.", + "azure": "Azure contains settings specific to the Azure infrastructure provider.", + "gcp": "GCP contains settings specific to the Google Cloud Platform infrastructure provider.", + "baremetal": "BareMetal contains settings specific to the BareMetal platform.", + "openstack": "OpenStack contains settings specific to the OpenStack infrastructure provider.", + "ovirt": "Ovirt contains settings specific to the oVirt infrastructure provider.", + "vsphere": "VSphere contains settings specific to the VSphere infrastructure provider.", + "ibmcloud": "IBMCloud contains settings specific to the IBMCloud infrastructure provider.", + "kubevirt": "Kubevirt contains settings specific to the kubevirt infrastructure provider.", + "equinixMetal": "EquinixMetal contains settings specific to the Equinix Metal infrastructure provider.", + "powervs": "PowerVS contains settings specific to the Power Systems Virtual Servers infrastructure provider.", + "alibabaCloud": "AlibabaCloud contains settings specific to the Alibaba Cloud infrastructure provider.", + "nutanix": "Nutanix contains settings specific to the Nutanix infrastructure provider.", + "external": "External contains settings specific to the generic External infrastructure provider.", +} + +func (PlatformStatus) SwaggerDoc() map[string]string { + return map_PlatformStatus +} + +var map_PowerVSPlatformSpec = map[string]string{ + "": "PowerVSPlatformSpec holds the desired state of the IBM Power Systems Virtual Servers infrastructure provider. This only includes fields that can be modified in the cluster.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", +} + +func (PowerVSPlatformSpec) SwaggerDoc() map[string]string { + return map_PowerVSPlatformSpec +} + +var map_PowerVSPlatformStatus = map[string]string{ + "": "PowerVSPlatformStatus holds the current status of the IBM Power Systems Virtual Servers infrastrucutre provider.", + "region": "region holds the default Power VS region for new Power VS resources created by the cluster.", + "zone": "zone holds the default zone for the new Power VS resources created by the cluster. Note: Currently only single-zone OCP clusters are supported", + "resourceGroup": "resourceGroup is the resource group name for new IBMCloud resources created for a cluster. The resource group specified here will be used by cluster-image-registry-operator to set up a COS Instance in IBMCloud for the cluster registry. More about resource groups can be found here: https://cloud.ibm.com/docs/account?topic=account-rgs. When omitted, the image registry operator won't be able to configure storage, which results in the image registry cluster operator not being in an available state.", + "serviceEndpoints": "serviceEndpoints is a list of custom endpoints which will override the default service endpoints of a Power VS service.", + "cisInstanceCRN": "CISInstanceCRN is the CRN of the Cloud Internet Services instance managing the DNS zone for the cluster's base domain", + "dnsInstanceCRN": "DNSInstanceCRN is the CRN of the DNS Services instance managing the DNS zone for the cluster's base domain", +} + +func (PowerVSPlatformStatus) SwaggerDoc() map[string]string { + return map_PowerVSPlatformStatus +} + +var map_PowerVSServiceEndpoint = map[string]string{ + "": "PowervsServiceEndpoint stores the configuration of a custom url to override existing defaults of PowerVS Services.", + "name": "name is the name of the Power VS service. Few of the services are IAM - https://cloud.ibm.com/apidocs/iam-identity-token-api ResourceController - https://cloud.ibm.com/apidocs/resource-controller/resource-controller Power Cloud - https://cloud.ibm.com/apidocs/power-cloud", + "url": "url is fully qualified URI with scheme https, that overrides the default generated endpoint for a client. This must be provided and cannot be empty.", +} + +func (PowerVSServiceEndpoint) SwaggerDoc() map[string]string { + return map_PowerVSServiceEndpoint +} + +var map_VSpherePlatformFailureDomainSpec = map[string]string{ + "": "VSpherePlatformFailureDomainSpec holds the region and zone failure domain and the vCenter topology of that failure domain.", + "name": "name defines the arbitrary but unique name of a failure domain.", + "region": "region defines the name of a region tag that will be attached to a vCenter datacenter. The tag category in vCenter must be named openshift-region.", + "zone": "zone defines the name of a zone tag that will be attached to a vCenter cluster. The tag category in vCenter must be named openshift-zone.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "topology": "Topology describes a given failure domain using vSphere constructs", +} + +func (VSpherePlatformFailureDomainSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformFailureDomainSpec +} + +var map_VSpherePlatformLoadBalancer = map[string]string{ + "": "VSpherePlatformLoadBalancer defines the load balancer used by the cluster on VSphere platform.", + "type": "type defines the type of load balancer used by the cluster on VSphere platform which can be a user-managed or openshift-managed load balancer that is to be used for the OpenShift API and Ingress endpoints. When set to OpenShiftManagedDefault the static pods in charge of API and Ingress traffic load-balancing defined in the machine config operator will be deployed. When set to UserManaged these static pods will not be deployed and it is expected that the load balancer is configured out of band by the deployer. When omitted, this means no opinion and the platform is left to choose a reasonable default. The default value is OpenShiftManagedDefault.", +} + +func (VSpherePlatformLoadBalancer) SwaggerDoc() map[string]string { + return map_VSpherePlatformLoadBalancer +} + +var map_VSpherePlatformNodeNetworking = map[string]string{ + "": "VSpherePlatformNodeNetworking holds the external and internal node networking spec.", + "external": "external represents the network configuration of the node that is externally routable.", + "internal": "internal represents the network configuration of the node that is routable only within the cluster.", +} + +func (VSpherePlatformNodeNetworking) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworking +} + +var map_VSpherePlatformNodeNetworkingSpec = map[string]string{ + "": "VSpherePlatformNodeNetworkingSpec holds the network CIDR(s) and port group name for including and excluding IP ranges in the cloud provider. This would be used for example when multiple network adapters are attached to a guest to help determine which IP address the cloud config manager should use for the external and internal node networking.", + "networkSubnetCidr": "networkSubnetCidr IP address on VirtualMachine's network interfaces included in the fields' CIDRs that will be used in respective status.addresses fields.", + "network": "network VirtualMachine's VM Network names that will be used to when searching for status.addresses fields. Note that if internal.networkSubnetCIDR and external.networkSubnetCIDR are not set, then the vNIC associated to this network must only have a single IP address assigned to it. The available networks (port groups) can be listed using `govc ls 'network/*'`", + "excludeNetworkSubnetCidr": "excludeNetworkSubnetCidr IP addresses in subnet ranges will be excluded when selecting the IP address from the VirtualMachine's VM for use in the status.addresses fields.", +} + +func (VSpherePlatformNodeNetworkingSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformNodeNetworkingSpec +} + +var map_VSpherePlatformSpec = map[string]string{ + "": "VSpherePlatformSpec holds the desired state of the vSphere infrastructure provider. In the future the cloud provider operator, storage operator and machine operator will use these fields for configuration.", + "vcenters": "vcenters holds the connection details for services to communicate with vCenter. Currently, only a single vCenter is supported.", + "failureDomains": "failureDomains contains the definition of region, zone and the vCenter topology. If this is omitted failure domains (regions and zones) will not be used.", + "nodeNetworking": "nodeNetworking contains the definition of internal and external network constraints for assigning the node's networking. If this field is omitted, networking defaults to the legacy address selection behavior which is to only support a single address and return the first one found.", +} + +func (VSpherePlatformSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformSpec +} + +var map_VSpherePlatformStatus = map[string]string{ + "": "VSpherePlatformStatus holds the current status of the vSphere infrastructure provider.", + "apiServerInternalIP": "apiServerInternalIP is an IP address to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. It is the IP that the Infrastructure.status.apiServerInternalURI points to. It is the IP for a self-hosted load balancer in front of the API servers.\n\nDeprecated: Use APIServerInternalIPs instead.", + "apiServerInternalIPs": "apiServerInternalIPs are the IP addresses to contact the Kubernetes API server that can be used by components inside the cluster, like kubelets using the infrastructure rather than Kubernetes networking. These are the IPs for a self-hosted load balancer in front of the API servers. In dual stack clusters this list contains two IPs otherwise only one.", + "ingressIP": "ingressIP is an external IP which routes to the default ingress controller. The IP is a suitable target of a wildcard DNS record used to resolve default route host names.\n\nDeprecated: Use IngressIPs instead.", + "ingressIPs": "ingressIPs are the external IPs which route to the default ingress controller. The IPs are suitable targets of a wildcard DNS record used to resolve default route host names. In dual stack clusters this list contains two IPs otherwise only one.", + "nodeDNSIP": "nodeDNSIP is the IP address for the internal DNS used by the nodes. Unlike the one managed by the DNS operator, `NodeDNSIP` provides name resolution for the nodes themselves. There is no DNS-as-a-service for vSphere deployments. In order to minimize necessary changes to the datacenter DNS, a DNS service is hosted as a static pod to serve those hostnames to the nodes in the cluster.", + "loadBalancer": "loadBalancer defines how the load balancer used by the cluster is configured.", +} + +func (VSpherePlatformStatus) SwaggerDoc() map[string]string { + return map_VSpherePlatformStatus +} + +var map_VSpherePlatformTopology = map[string]string{ + "": "VSpherePlatformTopology holds the required and optional vCenter objects - datacenter, computeCluster, networks, datastore and resourcePool - to provision virtual machines.", + "datacenter": "datacenter is the name of vCenter datacenter in which virtual machines will be located. The maximum length of the datacenter name is 80 characters.", + "computeCluster": "computeCluster the absolute path of the vCenter cluster in which virtual machine will be located. The absolute path is of the form //host/. The maximum length of the path is 2048 characters.", + "networks": "networks is the list of port group network names within this failure domain. Currently, we only support a single interface per RHCOS virtual machine. The available networks (port groups) can be listed using `govc ls 'network/*'` The single interface should be the absolute path of the form //network/.", + "datastore": "datastore is the absolute path of the datastore in which the virtual machine is located. The absolute path is of the form //datastore/ The maximum length of the path is 2048 characters.", + "resourcePool": "resourcePool is the absolute path of the resource pool where virtual machines will be created. The absolute path is of the form //host//Resources/. The maximum length of the path is 2048 characters.", + "folder": "folder is the absolute path of the folder where virtual machines are located. The absolute path is of the form //vm/. The maximum length of the path is 2048 characters.", +} + +func (VSpherePlatformTopology) SwaggerDoc() map[string]string { + return map_VSpherePlatformTopology +} + +var map_VSpherePlatformVCenterSpec = map[string]string{ + "": "VSpherePlatformVCenterSpec stores the vCenter connection fields. This is used by the vSphere CCM.", + "server": "server is the fully-qualified domain name or the IP address of the vCenter server.", + "port": "port is the TCP port that will be used to communicate to the vCenter endpoint. When omitted, this means the user has no opinion and it is up to the platform to choose a sensible default, which is subject to change over time.", + "datacenters": "The vCenter Datacenters in which the RHCOS vm guests are located. This field will be used by the Cloud Controller Manager. Each datacenter listed here should be used within a topology.", +} + +func (VSpherePlatformVCenterSpec) SwaggerDoc() map[string]string { + return map_VSpherePlatformVCenterSpec +} + +var map_AWSIngressSpec = map[string]string{ + "": "AWSIngressSpec holds the desired state of the Ingress for Amazon Web Services infrastructure provider. This only includes fields that can be modified in the cluster.", + "type": "type allows user to set a load balancer type. When this field is set the default ingresscontroller will get created using the specified LBType. If this field is not set then the default ingress controller of LBType Classic will be created. Valid values are:\n\n* \"Classic\": A Classic Load Balancer that makes routing decisions at either\n the transport layer (TCP/SSL) or the application layer (HTTP/HTTPS). See\n the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#clb\n\n* \"NLB\": A Network Load Balancer that makes routing decisions at the\n transport layer (TCP/SSL). See the following for additional details:\n\n https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#nlb", +} + +func (AWSIngressSpec) SwaggerDoc() map[string]string { + return map_AWSIngressSpec +} + +var map_ComponentRouteSpec = map[string]string{ + "": "ComponentRouteSpec allows for configuration of a route's hostname and serving certificate.", + "namespace": "namespace is the namespace of the route to customize.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized.", + "name": "name is the logical name of the route to customize.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of status.componentRoutes if the route is to be customized.", + "hostname": "hostname is the hostname that should be used by the route.", + "servingCertKeyPairSecret": "servingCertKeyPairSecret is a reference to a secret of type `kubernetes.io/tls` in the openshift-config namespace. The serving cert/key pair must match and will be used by the operator to fulfill the intent of serving with this name. If the custom hostname uses the default routing suffix of the cluster, the Secret specification for a serving certificate will not be needed.", +} + +func (ComponentRouteSpec) SwaggerDoc() map[string]string { + return map_ComponentRouteSpec +} + +var map_ComponentRouteStatus = map[string]string{ + "": "ComponentRouteStatus contains information allowing configuration of a route's hostname and serving certificate.", + "namespace": "namespace is the namespace of the route to customize. It must be a real namespace. Using an actual namespace ensures that no two components will conflict and the same component can be installed multiple times.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of spec.componentRoutes if the route is to be customized.", + "name": "name is the logical name of the route to customize. It does not have to be the actual name of a route resource but it cannot be renamed.\n\nThe namespace and name of this componentRoute must match a corresponding entry in the list of spec.componentRoutes if the route is to be customized.", + "defaultHostname": "defaultHostname is the hostname of this route prior to customization.", + "consumingUsers": "consumingUsers is a slice of ServiceAccounts that need to have read permission on the servingCertKeyPairSecret secret.", + "currentHostnames": "currentHostnames is the list of current names used by the route. Typically, this list should consist of a single hostname, but if multiple hostnames are supported by the route the operator may write multiple entries to this list.", + "conditions": "conditions are used to communicate the state of the componentRoutes entry.\n\nSupported conditions include Available, Degraded and Progressing.\n\nIf available is true, the content served by the route can be accessed by users. This includes cases where a default may continue to serve content while the customized route specified by the cluster-admin is being configured.\n\nIf Degraded is true, that means something has gone wrong trying to handle the componentRoutes entry. The currentHostnames field may or may not be in effect.\n\nIf Progressing is true, that means the component is taking some action related to the componentRoutes entry.", + "relatedObjects": "relatedObjects is a list of resources which are useful when debugging or inspecting how spec.componentRoutes is applied.", +} + +func (ComponentRouteStatus) SwaggerDoc() map[string]string { + return map_ComponentRouteStatus +} + +var map_Ingress = map[string]string{ + "": "Ingress holds cluster-wide information about ingress, including the default ingress domain used for routes. The canonical name is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Ingress) SwaggerDoc() map[string]string { + return map_Ingress +} + +var map_IngressList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (IngressList) SwaggerDoc() map[string]string { + return map_IngressList +} + +var map_IngressPlatformSpec = map[string]string{ + "": "IngressPlatformSpec holds the desired state of Ingress specific to the underlying infrastructure provider of the current cluster. Since these are used at spec-level for the underlying cluster, it is supposed that only one of the spec structs is set.", + "type": "type is the underlying infrastructure provider for the cluster. Allowed values are \"AWS\", \"Azure\", \"BareMetal\", \"GCP\", \"Libvirt\", \"OpenStack\", \"VSphere\", \"oVirt\", \"KubeVirt\", \"EquinixMetal\", \"PowerVS\", \"AlibabaCloud\", \"Nutanix\" and \"None\". Individual components may not support all platforms, and must handle unrecognized platforms as None if they do not support that platform.", + "aws": "aws contains settings specific to the Amazon Web Services infrastructure provider.", +} + +func (IngressPlatformSpec) SwaggerDoc() map[string]string { + return map_IngressPlatformSpec +} + +var map_IngressSpec = map[string]string{ + "domain": "domain is used to generate a default host name for a route when the route's host name is empty. The generated host name will follow this pattern: \"..\".\n\nIt is also used as the default wildcard domain suffix for ingress. The default ingresscontroller domain will follow this pattern: \"*.\".\n\nOnce set, changing domain is not currently supported.", + "appsDomain": "appsDomain is an optional domain to use instead of the one specified in the domain field when a Route is created without specifying an explicit host. If appsDomain is nonempty, this value is used to generate default host values for Route. Unlike domain, appsDomain may be modified after installation. This assumes a new ingresscontroller has been setup with a wildcard certificate.", + "componentRoutes": "componentRoutes is an optional list of routes that are managed by OpenShift components that a cluster-admin is able to configure the hostname and serving certificate for. The namespace and name of each route in this list should match an existing entry in the status.componentRoutes list.\n\nTo determine the set of configurable Routes, look at namespace and name of entries in the .status.componentRoutes list, where participating operators write the status of configurable routes.", + "requiredHSTSPolicies": "requiredHSTSPolicies specifies HSTS policies that are required to be set on newly created or updated routes matching the domainPattern/s and namespaceSelector/s that are specified in the policy. Each requiredHSTSPolicy must have at least a domainPattern and a maxAge to validate a route HSTS Policy route annotation, and affect route admission.\n\nA candidate route is checked for HSTS Policies if it has the HSTS Policy route annotation: \"haproxy.router.openshift.io/hsts_header\" E.g. haproxy.router.openshift.io/hsts_header: max-age=31536000;preload;includeSubDomains\n\n- For each candidate route, if it matches a requiredHSTSPolicy domainPattern and optional namespaceSelector, then the maxAge, preloadPolicy, and includeSubdomainsPolicy must be valid to be admitted. Otherwise, the route is rejected. - The first match, by domainPattern and optional namespaceSelector, in the ordering of the RequiredHSTSPolicies determines the route's admission status. - If the candidate route doesn't match any requiredHSTSPolicy domainPattern and optional namespaceSelector, then it may use any HSTS Policy annotation.\n\nThe HSTS policy configuration may be changed after routes have already been created. An update to a previously admitted route may then fail if the updated route does not conform to the updated HSTS policy configuration. However, changing the HSTS policy configuration will not cause a route that is already admitted to stop working.\n\nNote that if there are no RequiredHSTSPolicies, any HSTS Policy annotation on the route is valid.", + "loadBalancer": "loadBalancer contains the load balancer details in general which are not only specific to the underlying infrastructure provider of the current cluster and are required for Ingress Controller to work on OpenShift.", +} + +func (IngressSpec) SwaggerDoc() map[string]string { + return map_IngressSpec +} + +var map_IngressStatus = map[string]string{ + "componentRoutes": "componentRoutes is where participating operators place the current route status for routes whose hostnames and serving certificates can be customized by the cluster-admin.", + "defaultPlacement": "defaultPlacement is set at installation time to control which nodes will host the ingress router pods by default. The options are control-plane nodes or worker nodes.\n\nThis field works by dictating how the Cluster Ingress Operator will consider unset replicas and nodePlacement fields in IngressController resources when creating the corresponding Deployments.\n\nSee the documentation for the IngressController replicas and nodePlacement fields for more information.\n\nWhen omitted, the default value is Workers", +} + +func (IngressStatus) SwaggerDoc() map[string]string { + return map_IngressStatus +} + +var map_LoadBalancer = map[string]string{ + "platform": "platform holds configuration specific to the underlying infrastructure provider for the ingress load balancers. When omitted, this means the user has no opinion and the platform is left to choose reasonable defaults. These defaults are subject to change over time.", +} + +func (LoadBalancer) SwaggerDoc() map[string]string { + return map_LoadBalancer +} + +var map_ClusterNetworkEntry = map[string]string{ + "": "ClusterNetworkEntry is a contiguous block of IP addresses from which pod IPs are allocated.", + "cidr": "The complete block for pod IPs.", + "hostPrefix": "The size (prefix) of block to allocate to each node. If this field is not used by the plugin, it can be left unset.", +} + +func (ClusterNetworkEntry) SwaggerDoc() map[string]string { + return map_ClusterNetworkEntry +} + +var map_ExternalIPConfig = map[string]string{ + "": "ExternalIPConfig specifies some IP blocks relevant for the ExternalIP field of a Service resource.", + "policy": "policy is a set of restrictions applied to the ExternalIP field. If nil or empty, then ExternalIP is not allowed to be set.", + "autoAssignCIDRs": "autoAssignCIDRs is a list of CIDRs from which to automatically assign Service.ExternalIP. These are assigned when the service is of type LoadBalancer. In general, this is only useful for bare-metal clusters. In Openshift 3.x, this was misleadingly called \"IngressIPs\". Automatically assigned External IPs are not affected by any ExternalIPPolicy rules. Currently, only one entry may be provided.", +} + +func (ExternalIPConfig) SwaggerDoc() map[string]string { + return map_ExternalIPConfig +} + +var map_ExternalIPPolicy = map[string]string{ + "": "ExternalIPPolicy configures exactly which IPs are allowed for the ExternalIP field in a Service. If the zero struct is supplied, then none are permitted. The policy controller always allows automatically assigned external IPs.", + "allowedCIDRs": "allowedCIDRs is the list of allowed CIDRs.", + "rejectedCIDRs": "rejectedCIDRs is the list of disallowed CIDRs. These take precedence over allowedCIDRs.", +} + +func (ExternalIPPolicy) SwaggerDoc() map[string]string { + return map_ExternalIPPolicy +} + +var map_MTUMigration = map[string]string{ + "": "MTUMigration contains infomation about MTU migration.", + "network": "Network contains MTU migration configuration for the default network.", + "machine": "Machine contains MTU migration configuration for the machine's uplink.", +} + +func (MTUMigration) SwaggerDoc() map[string]string { + return map_MTUMigration +} + +var map_MTUMigrationValues = map[string]string{ + "": "MTUMigrationValues contains the values for a MTU migration.", + "to": "To is the MTU to migrate to.", + "from": "From is the MTU to migrate from.", +} + +func (MTUMigrationValues) SwaggerDoc() map[string]string { + return map_MTUMigrationValues +} + +var map_Network = map[string]string{ + "": "Network holds cluster-wide information about Network. The canonical name is `cluster`. It is used to configure the desired network configuration, such as: IP address pools for services/pod IPs, network plugin, etc. Please view network.spec for an explanation on what applies when configuring this resource.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Network) SwaggerDoc() map[string]string { + return map_Network +} + +var map_NetworkList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NetworkList) SwaggerDoc() map[string]string { + return map_NetworkList +} + +var map_NetworkMigration = map[string]string{ + "": "NetworkMigration represents the cluster network configuration.", + "networkType": "NetworkType is the target plugin that is to be deployed. Currently supported values are: OpenShiftSDN, OVNKubernetes", + "mtu": "MTU contains the MTU migration configuration.", +} + +func (NetworkMigration) SwaggerDoc() map[string]string { + return map_NetworkMigration +} + +var map_NetworkSpec = map[string]string{ + "": "NetworkSpec is the desired network configuration. As a general rule, this SHOULD NOT be read directly. Instead, you should consume the NetworkStatus, as it indicates the currently deployed configuration. Currently, most spec fields are immutable after installation. Please view the individual ones for further details on each.", + "clusterNetwork": "IP address pool to use for pod IPs. This field is immutable after installation.", + "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here. This field is immutable after installation.", + "networkType": "NetworkType is the plugin that is to be deployed (e.g. OpenShiftSDN). This should match a value that the cluster-network-operator understands, or else no networking will be installed. Currently supported values are: - OpenShiftSDN This field is immutable after installation.", + "externalIP": "externalIP defines configuration for controllers that affect Service.ExternalIP. If nil, then ExternalIP is not allowed to be set.", + "serviceNodePortRange": "The port range allowed for Services of type NodePort. If not specified, the default of 30000-32767 will be used. Such Services without a NodePort specified will have one automatically allocated from this range. This parameter can be updated after the cluster is installed.", +} + +func (NetworkSpec) SwaggerDoc() map[string]string { + return map_NetworkSpec +} + +var map_NetworkStatus = map[string]string{ + "": "NetworkStatus is the current network configuration.", + "clusterNetwork": "IP address pool to use for pod IPs.", + "serviceNetwork": "IP address pool for services. Currently, we only support a single entry here.", + "networkType": "NetworkType is the plugin that is deployed (e.g. OpenShiftSDN).", + "clusterNetworkMTU": "ClusterNetworkMTU is the MTU for inter-pod networking.", + "migration": "Migration contains the cluster network migration configuration.", +} + +func (NetworkStatus) SwaggerDoc() map[string]string { + return map_NetworkStatus +} + +var map_Node = map[string]string{ + "": "Node holds cluster-wide information about node specific features.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values.", +} + +func (Node) SwaggerDoc() map[string]string { + return map_Node +} + +var map_NodeList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (NodeList) SwaggerDoc() map[string]string { + return map_NodeList +} + +var map_NodeSpec = map[string]string{ + "cgroupMode": "CgroupMode determines the cgroups version on the node", + "workerLatencyProfile": "WorkerLatencyProfile determins the how fast the kubelet is updating the status and corresponding reaction of the cluster", +} + +func (NodeSpec) SwaggerDoc() map[string]string { + return map_NodeSpec +} + +var map_BasicAuthIdentityProvider = map[string]string{ + "": "BasicAuthPasswordIdentityProvider provides identities for users authenticating using HTTP basic auth credentials", +} + +func (BasicAuthIdentityProvider) SwaggerDoc() map[string]string { + return map_BasicAuthIdentityProvider +} + +var map_GitHubIdentityProvider = map[string]string{ + "": "GitHubIdentityProvider provides identities for users authenticating using GitHub credentials", + "clientID": "clientID is the oauth client ID", + "clientSecret": "clientSecret is a required reference to the secret by name containing the oauth client secret. The key \"clientSecret\" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config.", + "organizations": "organizations optionally restricts which organizations are allowed to log in", + "teams": "teams optionally restricts which teams are allowed to log in. Format is /.", + "hostname": "hostname is the optional domain (e.g. \"mycompany.com\") for use with a hosted instance of GitHub Enterprise. It must match the GitHub Enterprise settings value configured at /setup/settings#hostname.", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. This can only be configured when hostname is set to a non-empty value. The namespace for this config map is openshift-config.", +} + +func (GitHubIdentityProvider) SwaggerDoc() map[string]string { + return map_GitHubIdentityProvider +} + +var map_GitLabIdentityProvider = map[string]string{ + "": "GitLabIdentityProvider provides identities for users authenticating using GitLab credentials", + "clientID": "clientID is the oauth client ID", + "clientSecret": "clientSecret is a required reference to the secret by name containing the oauth client secret. The key \"clientSecret\" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config.", + "url": "url is the oauth server base URL", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config.", +} + +func (GitLabIdentityProvider) SwaggerDoc() map[string]string { + return map_GitLabIdentityProvider +} + +var map_GoogleIdentityProvider = map[string]string{ + "": "GoogleIdentityProvider provides identities for users authenticating using Google credentials", + "clientID": "clientID is the oauth client ID", + "clientSecret": "clientSecret is a required reference to the secret by name containing the oauth client secret. The key \"clientSecret\" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config.", + "hostedDomain": "hostedDomain is the optional Google App domain (e.g. \"mycompany.com\") to restrict logins to", +} + +func (GoogleIdentityProvider) SwaggerDoc() map[string]string { + return map_GoogleIdentityProvider +} + +var map_HTPasswdIdentityProvider = map[string]string{ + "": "HTPasswdPasswordIdentityProvider provides identities for users authenticating using htpasswd credentials", + "fileData": "fileData is a required reference to a secret by name containing the data to use as the htpasswd file. The key \"htpasswd\" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. If the specified htpasswd data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config.", +} + +func (HTPasswdIdentityProvider) SwaggerDoc() map[string]string { + return map_HTPasswdIdentityProvider +} + +var map_IdentityProvider = map[string]string{ + "": "IdentityProvider provides identities for users authenticating using credentials", + "name": "name is used to qualify the identities returned by this provider. - It MUST be unique and not shared by any other identity provider used - It MUST be a valid path segment: name cannot equal \".\" or \"..\" or contain \"/\" or \"%\" or \":\"\n Ref: https://godoc.org/github.com/openshift/origin/pkg/user/apis/user/validation#ValidateIdentityProviderName", + "mappingMethod": "mappingMethod determines how identities from this provider are mapped to users Defaults to \"claim\"", +} + +func (IdentityProvider) SwaggerDoc() map[string]string { + return map_IdentityProvider +} + +var map_IdentityProviderConfig = map[string]string{ + "": "IdentityProviderConfig contains configuration for using a specific identity provider", + "type": "type identifies the identity provider type for this entry.", + "basicAuth": "basicAuth contains configuration options for the BasicAuth IdP", + "github": "github enables user authentication using GitHub credentials", + "gitlab": "gitlab enables user authentication using GitLab credentials", + "google": "google enables user authentication using Google credentials", + "htpasswd": "htpasswd enables user authentication using an HTPasswd file to validate credentials", + "keystone": "keystone enables user authentication using keystone password credentials", + "ldap": "ldap enables user authentication using LDAP credentials", + "openID": "openID enables user authentication using OpenID credentials", + "requestHeader": "requestHeader enables user authentication using request header credentials", +} + +func (IdentityProviderConfig) SwaggerDoc() map[string]string { + return map_IdentityProviderConfig +} + +var map_KeystoneIdentityProvider = map[string]string{ + "": "KeystonePasswordIdentityProvider provides identities for users authenticating using keystone password credentials", + "domainName": "domainName is required for keystone v3", +} + +func (KeystoneIdentityProvider) SwaggerDoc() map[string]string { + return map_KeystoneIdentityProvider +} + +var map_LDAPAttributeMapping = map[string]string{ + "": "LDAPAttributeMapping maps LDAP attributes to OpenShift identity fields", + "id": "id is the list of attributes whose values should be used as the user ID. Required. First non-empty attribute is used. At least one attribute is required. If none of the listed attribute have a value, authentication fails. LDAP standard identity attribute is \"dn\"", + "preferredUsername": "preferredUsername is the list of attributes whose values should be used as the preferred username. LDAP standard login attribute is \"uid\"", + "name": "name is the list of attributes whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity LDAP standard display name attribute is \"cn\"", + "email": "email is the list of attributes whose values should be used as the email address. Optional. If unspecified, no email is set for the identity", +} + +func (LDAPAttributeMapping) SwaggerDoc() map[string]string { + return map_LDAPAttributeMapping +} + +var map_LDAPIdentityProvider = map[string]string{ + "": "LDAPPasswordIdentityProvider provides identities for users authenticating using LDAP credentials", + "url": "url is an RFC 2255 URL which specifies the LDAP search parameters to use. The syntax of the URL is: ldap://host:port/basedn?attribute?scope?filter", + "bindDN": "bindDN is an optional DN to bind with during the search phase.", + "bindPassword": "bindPassword is an optional reference to a secret by name containing a password to bind with during the search phase. The key \"bindPassword\" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config.", + "insecure": "insecure, if true, indicates the connection should not use TLS WARNING: Should not be set to `true` with the URL scheme \"ldaps://\" as \"ldaps://\" URLs always\n attempt to connect using TLS, even when `insecure` is set to `true`\nWhen `true`, \"ldap://\" URLS connect insecurely. When `false`, \"ldap://\" URLs are upgraded to a TLS connection using StartTLS as specified in https://tools.ietf.org/html/rfc2830.", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config.", + "attributes": "attributes maps LDAP attributes to identities", +} + +func (LDAPIdentityProvider) SwaggerDoc() map[string]string { + return map_LDAPIdentityProvider +} + +var map_OAuth = map[string]string{ + "": "OAuth holds cluster-wide information about OAuth. The canonical name is `cluster`. It is used to configure the integrated OAuth server. This configuration is only honored when the top level Authentication config has type set to IntegratedOAuth.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (OAuth) SwaggerDoc() map[string]string { + return map_OAuth +} + +var map_OAuthList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (OAuthList) SwaggerDoc() map[string]string { + return map_OAuthList +} + +var map_OAuthRemoteConnectionInfo = map[string]string{ + "": "OAuthRemoteConnectionInfo holds information necessary for establishing a remote connection", + "url": "url is the remote URL to connect to", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config.", + "tlsClientCert": "tlsClientCert is an optional reference to a secret by name that contains the PEM-encoded TLS client certificate to present when connecting to the server. The key \"tls.crt\" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config.", + "tlsClientKey": "tlsClientKey is an optional reference to a secret by name that contains the PEM-encoded TLS private key for the client certificate referenced in tlsClientCert. The key \"tls.key\" is used to locate the data. If specified and the secret or expected key is not found, the identity provider is not honored. If the specified certificate data is not valid, the identity provider is not honored. The namespace for this secret is openshift-config.", +} + +func (OAuthRemoteConnectionInfo) SwaggerDoc() map[string]string { + return map_OAuthRemoteConnectionInfo +} + +var map_OAuthSpec = map[string]string{ + "": "OAuthSpec contains desired cluster auth configuration", + "identityProviders": "identityProviders is an ordered list of ways for a user to identify themselves. When this list is empty, no identities are provisioned for users.", + "tokenConfig": "tokenConfig contains options for authorization and access tokens", + "templates": "templates allow you to customize pages like the login page.", +} + +func (OAuthSpec) SwaggerDoc() map[string]string { + return map_OAuthSpec +} + +var map_OAuthStatus = map[string]string{ + "": "OAuthStatus shows current known state of OAuth server in the cluster", +} + +func (OAuthStatus) SwaggerDoc() map[string]string { + return map_OAuthStatus +} + +var map_OAuthTemplates = map[string]string{ + "": "OAuthTemplates allow for customization of pages like the login page", + "login": "login is the name of a secret that specifies a go template to use to render the login page. The key \"login.html\" is used to locate the template data. If specified and the secret or expected key is not found, the default login page is used. If the specified template is not valid, the default login page is used. If unspecified, the default login page is used. The namespace for this secret is openshift-config.", + "providerSelection": "providerSelection is the name of a secret that specifies a go template to use to render the provider selection page. The key \"providers.html\" is used to locate the template data. If specified and the secret or expected key is not found, the default provider selection page is used. If the specified template is not valid, the default provider selection page is used. If unspecified, the default provider selection page is used. The namespace for this secret is openshift-config.", + "error": "error is the name of a secret that specifies a go template to use to render error pages during the authentication or grant flow. The key \"errors.html\" is used to locate the template data. If specified and the secret or expected key is not found, the default error page is used. If the specified template is not valid, the default error page is used. If unspecified, the default error page is used. The namespace for this secret is openshift-config.", +} + +func (OAuthTemplates) SwaggerDoc() map[string]string { + return map_OAuthTemplates +} + +var map_OpenIDClaims = map[string]string{ + "": "OpenIDClaims contains a list of OpenID claims to use when authenticating with an OpenID identity provider", + "preferredUsername": "preferredUsername is the list of claims whose values should be used as the preferred username. If unspecified, the preferred username is determined from the value of the sub claim", + "name": "name is the list of claims whose values should be used as the display name. Optional. If unspecified, no display name is set for the identity", + "email": "email is the list of claims whose values should be used as the email address. Optional. If unspecified, no email is set for the identity", + "groups": "groups is the list of claims value of which should be used to synchronize groups from the OIDC provider to OpenShift for the user. If multiple claims are specified, the first one with a non-empty value is used.", +} + +func (OpenIDClaims) SwaggerDoc() map[string]string { + return map_OpenIDClaims +} + +var map_OpenIDIdentityProvider = map[string]string{ + "": "OpenIDIdentityProvider provides identities for users authenticating using OpenID credentials", + "clientID": "clientID is the oauth client ID", + "clientSecret": "clientSecret is a required reference to the secret by name containing the oauth client secret. The key \"clientSecret\" is used to locate the data. If the secret or expected key is not found, the identity provider is not honored. The namespace for this secret is openshift-config.", + "ca": "ca is an optional reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. The key \"ca.crt\" is used to locate the data. If specified and the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. If empty, the default system roots are used. The namespace for this config map is openshift-config.", + "extraScopes": "extraScopes are any scopes to request in addition to the standard \"openid\" scope.", + "extraAuthorizeParameters": "extraAuthorizeParameters are any custom parameters to add to the authorize request.", + "issuer": "issuer is the URL that the OpenID Provider asserts as its Issuer Identifier. It must use the https scheme with no query or fragment component.", + "claims": "claims mappings", +} + +func (OpenIDIdentityProvider) SwaggerDoc() map[string]string { + return map_OpenIDIdentityProvider +} + +var map_RequestHeaderIdentityProvider = map[string]string{ + "": "RequestHeaderIdentityProvider provides identities for users authenticating using request header credentials", + "loginURL": "loginURL is a URL to redirect unauthenticated /authorize requests to Unauthenticated requests from OAuth clients which expect interactive logins will be redirected here ${url} is replaced with the current URL, escaped to be safe in a query parameter\n https://www.example.com/sso-login?then=${url}\n${query} is replaced with the current query string\n https://www.example.com/auth-proxy/oauth/authorize?${query}\nRequired when login is set to true.", + "challengeURL": "challengeURL is a URL to redirect unauthenticated /authorize requests to Unauthenticated requests from OAuth clients which expect WWW-Authenticate challenges will be redirected here. ${url} is replaced with the current URL, escaped to be safe in a query parameter\n https://www.example.com/sso-login?then=${url}\n${query} is replaced with the current query string\n https://www.example.com/auth-proxy/oauth/authorize?${query}\nRequired when challenge is set to true.", + "ca": "ca is a required reference to a config map by name containing the PEM-encoded CA bundle. It is used as a trust anchor to validate the TLS certificate presented by the remote server. Specifically, it allows verification of incoming requests to prevent header spoofing. The key \"ca.crt\" is used to locate the data. If the config map or expected key is not found, the identity provider is not honored. If the specified ca data is not valid, the identity provider is not honored. The namespace for this config map is openshift-config.", + "clientCommonNames": "clientCommonNames is an optional list of common names to require a match from. If empty, any client certificate validated against the clientCA bundle is considered authoritative.", + "headers": "headers is the set of headers to check for identity information", + "preferredUsernameHeaders": "preferredUsernameHeaders is the set of headers to check for the preferred username", + "nameHeaders": "nameHeaders is the set of headers to check for the display name", + "emailHeaders": "emailHeaders is the set of headers to check for the email address", +} + +func (RequestHeaderIdentityProvider) SwaggerDoc() map[string]string { + return map_RequestHeaderIdentityProvider +} + +var map_TokenConfig = map[string]string{ + "": "TokenConfig holds the necessary configuration options for authorization and access tokens", + "accessTokenMaxAgeSeconds": "accessTokenMaxAgeSeconds defines the maximum age of access tokens", + "accessTokenInactivityTimeoutSeconds": "accessTokenInactivityTimeoutSeconds - DEPRECATED: setting this field has no effect.", + "accessTokenInactivityTimeout": "accessTokenInactivityTimeout defines the token inactivity timeout for tokens granted by any client. The value represents the maximum amount of time that can occur between consecutive uses of the token. Tokens become invalid if they are not used within this temporal window. The user will need to acquire a new token to regain access once a token times out. Takes valid time duration string such as \"5m\", \"1.5h\" or \"2h45m\". The minimum allowed value for duration is 300s (5 minutes). If the timeout is configured per client, then that value takes precedence. If the timeout value is not specified and the client does not override the value, then tokens are valid until their lifetime.\n\nWARNING: existing tokens' timeout will not be affected (lowered) by changing this value", +} + +func (TokenConfig) SwaggerDoc() map[string]string { + return map_TokenConfig +} + +var map_HubSource = map[string]string{ + "": "HubSource is used to specify the hub source and its configuration", + "name": "name is the name of one of the default hub sources", + "disabled": "disabled is used to disable a default hub source on cluster", +} + +func (HubSource) SwaggerDoc() map[string]string { + return map_HubSource +} + +var map_HubSourceStatus = map[string]string{ + "": "HubSourceStatus is used to reflect the current state of applying the configuration to a default source", + "status": "status indicates success or failure in applying the configuration", + "message": "message provides more information regarding failures", +} + +func (HubSourceStatus) SwaggerDoc() map[string]string { + return map_HubSourceStatus +} + +var map_OperatorHub = map[string]string{ + "": "OperatorHub is the Schema for the operatorhubs API. It can be used to change the state of the default hub sources for OperatorHub on the cluster from enabled to disabled and vice versa.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (OperatorHub) SwaggerDoc() map[string]string { + return map_OperatorHub +} + +var map_OperatorHubList = map[string]string{ + "": "OperatorHubList contains a list of OperatorHub\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (OperatorHubList) SwaggerDoc() map[string]string { + return map_OperatorHubList +} + +var map_OperatorHubSpec = map[string]string{ + "": "OperatorHubSpec defines the desired state of OperatorHub", + "disableAllDefaultSources": "disableAllDefaultSources allows you to disable all the default hub sources. If this is true, a specific entry in sources can be used to enable a default source. If this is false, a specific entry in sources can be used to disable or enable a default source.", + "sources": "sources is the list of default hub sources and their configuration. If the list is empty, it implies that the default hub sources are enabled on the cluster unless disableAllDefaultSources is true. If disableAllDefaultSources is true and sources is not empty, the configuration present in sources will take precedence. The list of default hub sources and their current state will always be reflected in the status block.", +} + +func (OperatorHubSpec) SwaggerDoc() map[string]string { + return map_OperatorHubSpec +} + +var map_OperatorHubStatus = map[string]string{ + "": "OperatorHubStatus defines the observed state of OperatorHub. The current state of the default hub sources will always be reflected here.", + "sources": "sources encapsulates the result of applying the configuration for each hub source", +} + +func (OperatorHubStatus) SwaggerDoc() map[string]string { + return map_OperatorHubStatus +} + +var map_Project = map[string]string{ + "": "Project holds cluster-wide information about Project. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Project) SwaggerDoc() map[string]string { + return map_Project +} + +var map_ProjectList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProjectList) SwaggerDoc() map[string]string { + return map_ProjectList +} + +var map_ProjectSpec = map[string]string{ + "": "ProjectSpec holds the project creation configuration.", + "projectRequestMessage": "projectRequestMessage is the string presented to a user if they are unable to request a project via the projectrequest api endpoint", + "projectRequestTemplate": "projectRequestTemplate is the template to use for creating projects in response to projectrequest. This must point to a template in 'openshift-config' namespace. It is optional. If it is not specified, a default template is used.", +} + +func (ProjectSpec) SwaggerDoc() map[string]string { + return map_ProjectSpec +} + +var map_TemplateReference = map[string]string{ + "": "TemplateReference references a template in a specific namespace. The namespace must be specified at the point of use.", + "name": "name is the metadata.name of the referenced project request template", +} + +func (TemplateReference) SwaggerDoc() map[string]string { + return map_TemplateReference +} + +var map_Proxy = map[string]string{ + "": "Proxy holds cluster-wide information on how to configure default proxies for the cluster. The canonical name is `cluster`\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "Spec holds user-settable values for the proxy configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Proxy) SwaggerDoc() map[string]string { + return map_Proxy +} + +var map_ProxyList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (ProxyList) SwaggerDoc() map[string]string { + return map_ProxyList +} + +var map_ProxySpec = map[string]string{ + "": "ProxySpec contains cluster proxy creation configuration.", + "httpProxy": "httpProxy is the URL of the proxy for HTTP requests. Empty means unset and will not result in an env var.", + "httpsProxy": "httpsProxy is the URL of the proxy for HTTPS requests. Empty means unset and will not result in an env var.", + "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs and/or IPs for which the proxy should not be used. Empty means unset and will not result in an env var.", + "readinessEndpoints": "readinessEndpoints is a list of endpoints used to verify readiness of the proxy.", + "trustedCA": "trustedCA is a reference to a ConfigMap containing a CA certificate bundle. The trustedCA field should only be consumed by a proxy validator. The validator is responsible for reading the certificate bundle from the required key \"ca-bundle.crt\", merging it with the system default trust bundle, and writing the merged trust bundle to a ConfigMap named \"trusted-ca-bundle\" in the \"openshift-config-managed\" namespace. Clients that expect to make proxy connections must use the trusted-ca-bundle for all HTTPS requests to the proxy, and may use the trusted-ca-bundle for non-proxy HTTPS requests as well.\n\nThe namespace for the ConfigMap referenced by trustedCA is \"openshift-config\". Here is an example ConfigMap (in yaml):\n\napiVersion: v1 kind: ConfigMap metadata:\n name: user-ca-bundle\n namespace: openshift-config\n data:\n ca-bundle.crt: |", +} + +func (ProxySpec) SwaggerDoc() map[string]string { + return map_ProxySpec +} + +var map_ProxyStatus = map[string]string{ + "": "ProxyStatus shows current known state of the cluster proxy.", + "httpProxy": "httpProxy is the URL of the proxy for HTTP requests.", + "httpsProxy": "httpsProxy is the URL of the proxy for HTTPS requests.", + "noProxy": "noProxy is a comma-separated list of hostnames and/or CIDRs for which the proxy should not be used.", +} + +func (ProxyStatus) SwaggerDoc() map[string]string { + return map_ProxyStatus +} + +var map_Scheduler = map[string]string{ + "": "Scheduler holds cluster-wide config information to run the Kubernetes Scheduler and influence its placement decisions. The canonical name for this config is `cluster`.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec holds user settable values for configuration", + "status": "status holds observed values from the cluster. They may not be overridden.", +} + +func (Scheduler) SwaggerDoc() map[string]string { + return map_Scheduler +} + +var map_SchedulerList = map[string]string{ + "": "Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", +} + +func (SchedulerList) SwaggerDoc() map[string]string { + return map_SchedulerList +} + +var map_SchedulerSpec = map[string]string{ + "policy": "DEPRECATED: the scheduler Policy API has been deprecated and will be removed in a future release. policy is a reference to a ConfigMap containing scheduler policy which has user specified predicates and priorities. If this ConfigMap is not available scheduler will default to use DefaultAlgorithmProvider. The namespace for this configmap is openshift-config.", + "profile": "profile sets which scheduling profile should be set in order to configure scheduling decisions for new pods.\n\nValid values are \"LowNodeUtilization\", \"HighNodeUtilization\", \"NoScoring\" Defaults to \"LowNodeUtilization\"", + "defaultNodeSelector": "defaultNodeSelector helps set the cluster-wide default node selector to restrict pod placement to specific nodes. This is applied to the pods created in all namespaces and creates an intersection with any existing nodeSelectors already set on a pod, additionally constraining that pod's selector. For example, defaultNodeSelector: \"type=user-node,region=east\" would set nodeSelector field in pod spec to \"type=user-node,region=east\" to all pods created in all namespaces. Namespaces having project-wide node selectors won't be impacted even if this field is set. This adds an annotation section to the namespace. For example, if a new namespace is created with node-selector='type=user-node,region=east', the annotation openshift.io/node-selector: type=user-node,region=east gets added to the project. When the openshift.io/node-selector annotation is set on the project the value is used in preference to the value we are setting for defaultNodeSelector field. For instance, openshift.io/node-selector: \"type=user-node,region=west\" means that the default of \"type=user-node,region=east\" set in defaultNodeSelector would not be applied.", + "mastersSchedulable": "MastersSchedulable allows masters nodes to be schedulable. When this flag is turned on, all the master nodes in the cluster will be made schedulable, so that workload pods can run on them. The default value for this field is false, meaning none of the master nodes are schedulable. Important Note: Once the workload pods start running on the master nodes, extreme care must be taken to ensure that cluster-critical control plane components are not impacted. Please turn on this field after doing due diligence.", +} + +func (SchedulerSpec) SwaggerDoc() map[string]string { + return map_SchedulerSpec +} + +var map_CustomTLSProfile = map[string]string{ + "": "CustomTLSProfile is a user-defined TLS security profile. Be extremely careful using a custom TLS profile as invalid configurations can be catastrophic.", +} + +func (CustomTLSProfile) SwaggerDoc() map[string]string { + return map_CustomTLSProfile +} + +var map_IntermediateTLSProfile = map[string]string{ + "": "IntermediateTLSProfile is a TLS security profile based on: https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29", +} + +func (IntermediateTLSProfile) SwaggerDoc() map[string]string { + return map_IntermediateTLSProfile +} + +var map_ModernTLSProfile = map[string]string{ + "": "ModernTLSProfile is a TLS security profile based on: https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility", +} + +func (ModernTLSProfile) SwaggerDoc() map[string]string { + return map_ModernTLSProfile +} + +var map_OldTLSProfile = map[string]string{ + "": "OldTLSProfile is a TLS security profile based on: https://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility", +} + +func (OldTLSProfile) SwaggerDoc() map[string]string { + return map_OldTLSProfile +} + +var map_TLSProfileSpec = map[string]string{ + "": "TLSProfileSpec is the desired behavior of a TLSSecurityProfile.", + "ciphers": "ciphers is used to specify the cipher algorithms that are negotiated during the TLS handshake. Operators may remove entries their operands do not support. For example, to use DES-CBC3-SHA (yaml):\n\n ciphers:\n - DES-CBC3-SHA", + "minTLSVersion": "minTLSVersion is used to specify the minimal version of the TLS protocol that is negotiated during the TLS handshake. For example, to use TLS versions 1.1, 1.2 and 1.3 (yaml):\n\n minTLSVersion: TLSv1.1\n\nNOTE: currently the highest minTLSVersion allowed is VersionTLS12", +} + +func (TLSProfileSpec) SwaggerDoc() map[string]string { + return map_TLSProfileSpec +} + +var map_TLSSecurityProfile = map[string]string{ + "": "TLSSecurityProfile defines the schema for a TLS security profile. This object is used by operators to apply TLS security settings to operands.", + "type": "type is one of Old, Intermediate, Modern or Custom. Custom provides the ability to specify individual TLS security profile parameters. Old, Intermediate and Modern are TLS security profiles based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations\n\nThe profiles are intent based, so they may change over time as new ciphers are developed and existing ciphers are found to be insecure. Depending on precisely which ciphers are available to a process, the list may be reduced.\n\nNote that the Modern profile is currently not supported because it is not yet well adopted by common software libraries.", + "old": "old is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Old_backward_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n - DHE-RSA-CHACHA20-POLY1305\n - ECDHE-ECDSA-AES128-SHA256\n - ECDHE-RSA-AES128-SHA256\n - ECDHE-ECDSA-AES128-SHA\n - ECDHE-RSA-AES128-SHA\n - ECDHE-ECDSA-AES256-SHA384\n - ECDHE-RSA-AES256-SHA384\n - ECDHE-ECDSA-AES256-SHA\n - ECDHE-RSA-AES256-SHA\n - DHE-RSA-AES128-SHA256\n - DHE-RSA-AES256-SHA256\n - AES128-GCM-SHA256\n - AES256-GCM-SHA384\n - AES128-SHA256\n - AES256-SHA256\n - AES128-SHA\n - AES256-SHA\n - DES-CBC3-SHA\n minTLSVersion: TLSv1.0", + "intermediate": "intermediate is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28recommended.29\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES256-GCM-SHA384\n - ECDHE-RSA-AES256-GCM-SHA384\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - DHE-RSA-AES128-GCM-SHA256\n - DHE-RSA-AES256-GCM-SHA384\n minTLSVersion: TLSv1.2", + "modern": "modern is a TLS security profile based on:\n\nhttps://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility\n\nand looks like this (yaml):\n\n ciphers:\n - TLS_AES_128_GCM_SHA256\n - TLS_AES_256_GCM_SHA384\n - TLS_CHACHA20_POLY1305_SHA256\n minTLSVersion: TLSv1.3\n\nNOTE: Currently unsupported.", + "custom": "custom is a user-defined TLS security profile. Be extremely careful using a custom profile as invalid configurations can be catastrophic. An example custom profile looks like this:\n\n ciphers:\n - ECDHE-ECDSA-CHACHA20-POLY1305\n - ECDHE-RSA-CHACHA20-POLY1305\n - ECDHE-RSA-AES128-GCM-SHA256\n - ECDHE-ECDSA-AES128-GCM-SHA256\n minTLSVersion: TLSv1.1", +} + +func (TLSSecurityProfile) SwaggerDoc() map[string]string { + return map_TLSSecurityProfile +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/github.com/openshift/api/route/v1/Makefile b/vendor/github.com/openshift/api/route/v1/Makefile new file mode 100644 index 00000000..0e605762 --- /dev/null +++ b/vendor/github.com/openshift/api/route/v1/Makefile @@ -0,0 +1,3 @@ +.PHONY: test +test: + make -C ../../tests test GINKGO_EXTRA_ARGS=--focus="route.openshift.io/v1" diff --git a/vendor/github.com/openshift/api/route/v1/generated.pb.go b/vendor/github.com/openshift/api/route/v1/generated.pb.go index 977fa261..c80012bc 100644 --- a/vendor/github.com/openshift/api/route/v1/generated.pb.go +++ b/vendor/github.com/openshift/api/route/v1/generated.pb.go @@ -328,80 +328,80 @@ func init() { } var fileDescriptor_373b8fa7ff738721 = []byte{ - // 1163 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xfa, 0x5f, 0xe2, 0x71, 0x1b, 0xc8, 0x40, 0xa9, 0x1b, 0x29, 0x76, 0xba, 0x07, 0x94, - 0xa2, 0xb2, 0x4b, 0x42, 0x81, 0x4a, 0x88, 0x43, 0x9d, 0x22, 0x48, 0xe3, 0xa4, 0xd1, 0xd8, 0xa2, - 0xa2, 0xea, 0x81, 0xc9, 0xee, 0x78, 0x3d, 0xd8, 0x9e, 0x5d, 0x66, 0xc6, 0x29, 0xbe, 0xa0, 0x4a, - 0x7c, 0x81, 0xf2, 0x6d, 0xb8, 0x73, 0xc9, 0xb1, 0xc7, 0x1e, 0x90, 0x45, 0xcc, 0x91, 0x6f, 0x90, - 0x13, 0x9a, 0xd9, 0xb1, 0x77, 0xed, 0x38, 0xa9, 0x0b, 0xb7, 0xdd, 0xf7, 0x7e, 0xbf, 0xdf, 0x7b, - 0xf3, 0xde, 0x9b, 0x37, 0x60, 0x3b, 0xa0, 0xb2, 0xdd, 0x3f, 0x76, 0xbc, 0xb0, 0xe7, 0x86, 0x11, - 0x61, 0xa2, 0x4d, 0x5b, 0xd2, 0xc5, 0x11, 0x75, 0x79, 0xd8, 0x97, 0xc4, 0x3d, 0xd9, 0x76, 0x03, - 0xc2, 0x08, 0xc7, 0x92, 0xf8, 0x4e, 0xc4, 0x43, 0x19, 0xc2, 0xdb, 0x09, 0xc5, 0x99, 0x50, 0x1c, - 0x1c, 0x51, 0x47, 0x53, 0x9c, 0x93, 0xed, 0xf5, 0x8f, 0x53, 0xaa, 0x41, 0x18, 0x84, 0xae, 0x66, - 0x1e, 0xf7, 0x5b, 0xfa, 0x4f, 0xff, 0xe8, 0xaf, 0x58, 0x71, 0xdd, 0xee, 0xdc, 0x17, 0x0e, 0x0d, - 0x75, 0x58, 0x2f, 0xe4, 0xf3, 0xa2, 0xae, 0xdf, 0x4b, 0x30, 0x3d, 0xec, 0xb5, 0x29, 0x23, 0x7c, - 0xe0, 0x46, 0x9d, 0x40, 0x19, 0x84, 0xdb, 0x23, 0x12, 0xcf, 0x63, 0x7d, 0x7e, 0x19, 0x8b, 0xf7, - 0x99, 0xa4, 0x3d, 0xe2, 0x0a, 0xaf, 0x4d, 0x7a, 0xf8, 0x02, 0xef, 0xd3, 0xcb, 0x78, 0x7d, 0x49, - 0xbb, 0x2e, 0x65, 0x52, 0x48, 0x3e, 0x4b, 0xb2, 0x7f, 0xcb, 0x80, 0x3c, 0x52, 0x25, 0x80, 0x3f, - 0x80, 0x15, 0x95, 0x91, 0x8f, 0x25, 0x2e, 0x5b, 0x9b, 0xd6, 0x56, 0x69, 0xe7, 0x13, 0x27, 0x56, - 0x74, 0xd2, 0x8a, 0x4e, 0xd4, 0x09, 0x94, 0x41, 0x38, 0x0a, 0xed, 0x9c, 0x6c, 0x3b, 0x8f, 0x8f, - 0x7f, 0x24, 0x9e, 0x3c, 0x20, 0x12, 0xd7, 0xe0, 0xe9, 0xb0, 0xba, 0x34, 0x1a, 0x56, 0x41, 0x62, - 0x43, 0x13, 0x55, 0x78, 0x08, 0x72, 0x22, 0x22, 0x5e, 0x39, 0xa3, 0xd5, 0xef, 0x3a, 0x6f, 0xec, - 0x89, 0xa3, 0x33, 0x6b, 0x44, 0xc4, 0xab, 0x5d, 0x33, 0xca, 0x39, 0xf5, 0x87, 0xb4, 0x0e, 0xfc, - 0x0e, 0x14, 0x84, 0xc4, 0xb2, 0x2f, 0xca, 0x59, 0xad, 0xe8, 0x2c, 0xac, 0xa8, 0x59, 0xb5, 0x55, - 0xa3, 0x59, 0x88, 0xff, 0x91, 0x51, 0xb3, 0x7f, 0xcd, 0x82, 0x6b, 0x1a, 0xb7, 0xc7, 0x02, 0x4e, - 0x84, 0x80, 0x9b, 0x20, 0xd7, 0x0e, 0x85, 0xd4, 0x65, 0x29, 0x26, 0xa9, 0x7c, 0x1b, 0x0a, 0x89, - 0xb4, 0x07, 0xee, 0x00, 0xa0, 0x43, 0xf0, 0x43, 0xdc, 0x23, 0xfa, 0x80, 0xc5, 0xa4, 0x18, 0x68, - 0xe2, 0x41, 0x29, 0x14, 0xec, 0x02, 0xe0, 0x85, 0xcc, 0xa7, 0x92, 0x86, 0x4c, 0x1d, 0x21, 0xbb, - 0x55, 0xda, 0xb9, 0xbf, 0xe8, 0x11, 0x4c, 0x6a, 0xbb, 0x63, 0x81, 0x24, 0xda, 0xc4, 0x24, 0x50, - 0x4a, 0x1f, 0x36, 0xc1, 0xea, 0x73, 0xda, 0xf5, 0x3d, 0xcc, 0xfd, 0xa3, 0xb0, 0x4b, 0xbd, 0x41, - 0x39, 0xa7, 0xb3, 0xbc, 0x6b, 0x78, 0xab, 0x4f, 0xa6, 0xbc, 0xe7, 0xc3, 0x2a, 0x9c, 0xb6, 0x34, - 0x07, 0x11, 0x41, 0x33, 0x1a, 0xf0, 0x7b, 0x70, 0x33, 0x3e, 0xd1, 0x2e, 0x66, 0x21, 0xa3, 0x1e, - 0xee, 0xaa, 0xa2, 0x30, 0x55, 0x84, 0xbc, 0x96, 0xaf, 0x1a, 0xf9, 0x9b, 0x68, 0x3e, 0x0c, 0x5d, - 0xc6, 0xb7, 0xff, 0xc9, 0x80, 0x1b, 0x73, 0x8f, 0x0a, 0xbf, 0x02, 0x39, 0x39, 0x88, 0x88, 0x69, - 0xc7, 0x9d, 0x71, 0x3b, 0x54, 0x82, 0xe7, 0xc3, 0xea, 0xad, 0xb9, 0x24, 0x9d, 0xbd, 0xa6, 0xc1, - 0xfa, 0x64, 0x6c, 0xe2, 0x3e, 0xdd, 0x9b, 0x1e, 0x83, 0xf3, 0x61, 0x75, 0xce, 0xdd, 0x76, 0x26, - 0x4a, 0xd3, 0xc3, 0x02, 0x3f, 0x04, 0x05, 0x4e, 0xb0, 0x08, 0x99, 0x1e, 0xc2, 0x62, 0x32, 0x54, - 0x48, 0x5b, 0x91, 0xf1, 0xc2, 0x3b, 0x60, 0xb9, 0x47, 0x84, 0xc0, 0x01, 0x31, 0x85, 0x7f, 0xc7, - 0x00, 0x97, 0x0f, 0x62, 0x33, 0x1a, 0xfb, 0x21, 0x07, 0xb0, 0x8b, 0x85, 0x6c, 0x72, 0xcc, 0x44, - 0x9c, 0x3c, 0x35, 0xf5, 0x2c, 0xed, 0x7c, 0xb4, 0xd8, 0x9d, 0x54, 0x8c, 0xda, 0x07, 0xa3, 0x61, - 0x15, 0xd6, 0x2f, 0x28, 0xa1, 0x39, 0xea, 0xf6, 0xef, 0x16, 0x28, 0xea, 0xc2, 0xd5, 0xa9, 0x90, - 0xf0, 0xd9, 0x85, 0x5d, 0xe0, 0x2c, 0x16, 0x57, 0xb1, 0xf5, 0x26, 0x78, 0xd7, 0x9c, 0x6e, 0x65, - 0x6c, 0x49, 0xed, 0x81, 0x03, 0x90, 0xa7, 0x92, 0xf4, 0x54, 0xfd, 0xd5, 0xcc, 0x6f, 0x2d, 0x3a, - 0xf3, 0xb5, 0xeb, 0x46, 0x34, 0xbf, 0xa7, 0xe8, 0x28, 0x56, 0xb1, 0x7f, 0x32, 0x99, 0x1f, 0x85, - 0x5c, 0x42, 0x1f, 0x00, 0x89, 0x79, 0x40, 0xa4, 0xfa, 0x7b, 0xe3, 0x1e, 0x53, 0x9b, 0xd1, 0x89, - 0x37, 0xa3, 0xb3, 0xc7, 0xe4, 0x63, 0xde, 0x90, 0x9c, 0xb2, 0x20, 0xb9, 0x4c, 0xcd, 0x89, 0x16, - 0x4a, 0xe9, 0xda, 0x7f, 0xe4, 0x4c, 0x4c, 0xb5, 0x8d, 0x16, 0x58, 0x0f, 0x2e, 0x28, 0x8a, 0xfe, - 0xb1, 0x1f, 0xf6, 0x30, 0x65, 0xe5, 0x15, 0x0d, 0x5b, 0x33, 0xb0, 0x62, 0x63, 0xec, 0x40, 0x09, - 0x46, 0x49, 0x46, 0x58, 0xb6, 0xcd, 0x84, 0x4e, 0x24, 0x8f, 0xb0, 0x6c, 0x23, 0xed, 0x81, 0x0d, - 0x90, 0x91, 0xa1, 0x59, 0x7c, 0x5f, 0x2c, 0x5a, 0xc1, 0xf8, 0x38, 0x88, 0xb4, 0x08, 0x27, 0xcc, - 0x23, 0x35, 0x60, 0x84, 0x33, 0xcd, 0x10, 0x65, 0x64, 0x08, 0x5f, 0x58, 0x60, 0x0d, 0x77, 0x25, - 0xe1, 0x0c, 0x4b, 0x52, 0xc3, 0x5e, 0x87, 0x30, 0x5f, 0x94, 0x73, 0xba, 0x4d, 0xff, 0x39, 0xc8, - 0x2d, 0x13, 0x64, 0xed, 0xc1, 0xac, 0x32, 0xba, 0x18, 0x0c, 0x3e, 0x02, 0xb9, 0x48, 0xb5, 0x2e, - 0xff, 0x76, 0x8f, 0x84, 0x6a, 0x4b, 0x6d, 0x45, 0xd7, 0x48, 0x35, 0x4b, 0x6b, 0xc0, 0x6f, 0x40, - 0x56, 0x76, 0x45, 0xb9, 0xb0, 0xb0, 0x54, 0xb3, 0xde, 0xd8, 0x0d, 0x59, 0x8b, 0x06, 0xb5, 0xe5, - 0xd1, 0xb0, 0x9a, 0x6d, 0xd6, 0x1b, 0x48, 0x29, 0xcc, 0x59, 0x9e, 0xcb, 0xff, 0x7f, 0x79, 0xda, - 0x14, 0x94, 0x52, 0xcf, 0x11, 0x7c, 0x0a, 0x96, 0x69, 0xbc, 0xb5, 0xca, 0x96, 0xae, 0xb8, 0xfb, - 0x96, 0x8f, 0x41, 0xb2, 0x52, 0x8c, 0x01, 0x8d, 0x05, 0xed, 0x5f, 0xc0, 0xfb, 0xf3, 0x7a, 0xa3, - 0xe6, 0xac, 0x43, 0x99, 0x3f, 0x3b, 0xba, 0xfb, 0x94, 0xf9, 0x48, 0x7b, 0x14, 0x82, 0x25, 0x6f, - 0xda, 0x04, 0xa1, 0x5f, 0x33, 0xed, 0x81, 0x36, 0x28, 0x3c, 0x27, 0x34, 0x68, 0x4b, 0x3d, 0x8d, - 0xf9, 0x1a, 0x50, 0xdb, 0xef, 0x89, 0xb6, 0x20, 0xe3, 0xb1, 0x43, 0x73, 0x54, 0xde, 0x68, 0x63, - 0xee, 0xeb, 0xfb, 0xa0, 0x3e, 0xf4, 0x6b, 0x69, 0xcd, 0xdc, 0x87, 0xb1, 0x03, 0x25, 0x18, 0x45, - 0xf0, 0x99, 0x68, 0xf4, 0x5b, 0x2d, 0xfa, 0xb3, 0x49, 0x65, 0x42, 0x78, 0x78, 0xd8, 0x88, 0x1d, - 0x28, 0xc1, 0xd8, 0x7f, 0x66, 0x41, 0x71, 0xd2, 0x4d, 0xb8, 0x0f, 0x4a, 0x92, 0xf0, 0x1e, 0x65, - 0x58, 0x2d, 0xbc, 0x99, 0x87, 0xa3, 0xd4, 0x4c, 0x5c, 0xaa, 0x73, 0xcd, 0x7a, 0x23, 0x65, 0xd1, - 0x9d, 0x4b, 0xb3, 0xe1, 0x67, 0xa0, 0xe4, 0x11, 0x2e, 0x69, 0x8b, 0x7a, 0x58, 0x8e, 0x0b, 0xf3, - 0xde, 0x58, 0x6c, 0x37, 0x71, 0xa1, 0x34, 0x0e, 0x6e, 0x80, 0x6c, 0x87, 0x0c, 0xcc, 0x2b, 0x51, - 0x32, 0xf0, 0xec, 0x3e, 0x19, 0x20, 0x65, 0x87, 0x5f, 0x82, 0xeb, 0x1e, 0x4e, 0x91, 0xcd, 0x2b, - 0x71, 0xc3, 0x00, 0xaf, 0xef, 0x3e, 0x48, 0x2b, 0x4f, 0x63, 0xe1, 0x33, 0x50, 0xf6, 0x89, 0x90, - 0x26, 0xc3, 0x29, 0xa8, 0x79, 0x87, 0x37, 0x8d, 0x4e, 0xf9, 0xe1, 0x25, 0x38, 0x74, 0xa9, 0x02, - 0x7c, 0x69, 0x81, 0x0d, 0xca, 0x04, 0xf1, 0xfa, 0x9c, 0x7c, 0xed, 0x07, 0x24, 0x55, 0x1d, 0x73, - 0x1b, 0x0a, 0x3a, 0xc6, 0x23, 0x13, 0x63, 0x63, 0xef, 0x2a, 0xf0, 0xf9, 0xb0, 0x7a, 0xfb, 0x4a, - 0x80, 0xae, 0xf8, 0xd5, 0x01, 0x6b, 0x5b, 0xa7, 0x67, 0x95, 0xa5, 0x57, 0x67, 0x95, 0xa5, 0xd7, - 0x67, 0x95, 0xa5, 0x17, 0xa3, 0x8a, 0x75, 0x3a, 0xaa, 0x58, 0xaf, 0x46, 0x15, 0xeb, 0xf5, 0xa8, - 0x62, 0xfd, 0x35, 0xaa, 0x58, 0x2f, 0xff, 0xae, 0x2c, 0x3d, 0xcd, 0x9c, 0x6c, 0xff, 0x1b, 0x00, - 0x00, 0xff, 0xff, 0x26, 0x8b, 0x83, 0xf6, 0x2d, 0x0c, 0x00, 0x00, + // 1168 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcf, 0x6f, 0x1b, 0xc5, + 0x17, 0xcf, 0xfa, 0x57, 0xe2, 0x71, 0xdb, 0xef, 0xb7, 0x03, 0xa5, 0x6e, 0xa4, 0xd8, 0xc9, 0x1e, + 0x50, 0x8a, 0xca, 0x2e, 0x09, 0x05, 0x2a, 0x21, 0x0e, 0x75, 0x8a, 0x4a, 0x1a, 0x27, 0x8d, 0xc6, + 0x16, 0x15, 0x55, 0x0f, 0x4c, 0x76, 0xc7, 0xeb, 0xc1, 0xf6, 0xec, 0x32, 0x33, 0x4e, 0xf1, 0x05, + 0x55, 0xe2, 0x1f, 0x28, 0xff, 0x0d, 0x77, 0x2e, 0x39, 0xf6, 0xd8, 0x03, 0xb2, 0x88, 0x39, 0xf2, + 0x1f, 0xe4, 0x84, 0x66, 0x76, 0xec, 0x5d, 0x3b, 0x4e, 0xe2, 0xc2, 0xcd, 0xfb, 0xde, 0xe7, 0xf3, + 0x79, 0x6f, 0xde, 0x7b, 0xf3, 0x46, 0x06, 0x5b, 0x01, 0x95, 0xed, 0xfe, 0x91, 0xe3, 0x85, 0x3d, + 0x37, 0x8c, 0x08, 0x13, 0x6d, 0xda, 0x92, 0x2e, 0x8e, 0xa8, 0xcb, 0xc3, 0xbe, 0x24, 0xee, 0xf1, + 0x96, 0x1b, 0x10, 0x46, 0x38, 0x96, 0xc4, 0x77, 0x22, 0x1e, 0xca, 0x10, 0x6e, 0x24, 0x14, 0x67, + 0x42, 0x71, 0x70, 0x44, 0x1d, 0x4d, 0x71, 0x8e, 0xb7, 0x56, 0x3f, 0x4e, 0xa9, 0x06, 0x61, 0x10, + 0xba, 0x9a, 0x79, 0xd4, 0x6f, 0xe9, 0x2f, 0xfd, 0xa1, 0x7f, 0xc5, 0x8a, 0xab, 0x76, 0xe7, 0x81, + 0x70, 0x68, 0xa8, 0xc3, 0x7a, 0x21, 0x9f, 0x17, 0x75, 0xf5, 0x7e, 0x82, 0xe9, 0x61, 0xaf, 0x4d, + 0x19, 0xe1, 0x03, 0x37, 0xea, 0x04, 0xca, 0x20, 0xdc, 0x1e, 0x91, 0x78, 0x1e, 0xeb, 0xf3, 0x8b, + 0x58, 0xbc, 0xcf, 0x24, 0xed, 0x11, 0x57, 0x78, 0x6d, 0xd2, 0xc3, 0xe7, 0x78, 0x9f, 0x5e, 0xc4, + 0xeb, 0x4b, 0xda, 0x75, 0x29, 0x93, 0x42, 0xf2, 0x59, 0x92, 0xfd, 0x6b, 0x06, 0xe4, 0x91, 0x2a, + 0x01, 0xfc, 0x1e, 0xac, 0xa8, 0x8c, 0x7c, 0x2c, 0x71, 0xd9, 0x5a, 0xb7, 0x36, 0x4b, 0xdb, 0x9f, + 0x38, 0xb1, 0xa2, 0x93, 0x56, 0x74, 0xa2, 0x4e, 0xa0, 0x0c, 0xc2, 0x51, 0x68, 0xe7, 0x78, 0xcb, + 0x79, 0x7a, 0xf4, 0x03, 0xf1, 0xe4, 0x3e, 0x91, 0xb8, 0x06, 0x4f, 0x86, 0xd5, 0xa5, 0xd1, 0xb0, + 0x0a, 0x12, 0x1b, 0x9a, 0xa8, 0xc2, 0x03, 0x90, 0x13, 0x11, 0xf1, 0xca, 0x19, 0xad, 0x7e, 0xcf, + 0xb9, 0xb2, 0x27, 0x8e, 0xce, 0xac, 0x11, 0x11, 0xaf, 0x76, 0xcd, 0x28, 0xe7, 0xd4, 0x17, 0xd2, + 0x3a, 0xf0, 0x5b, 0x50, 0x10, 0x12, 0xcb, 0xbe, 0x28, 0x67, 0xb5, 0xa2, 0xb3, 0xb0, 0xa2, 0x66, + 0xd5, 0x6e, 0x18, 0xcd, 0x42, 0xfc, 0x8d, 0x8c, 0x9a, 0xfd, 0x4b, 0x16, 0x5c, 0xd3, 0xb8, 0x5d, + 0x16, 0x70, 0x22, 0x04, 0x5c, 0x07, 0xb9, 0x76, 0x28, 0xa4, 0x2e, 0x4b, 0x31, 0x49, 0xe5, 0x9b, + 0x50, 0x48, 0xa4, 0x3d, 0x70, 0x1b, 0x00, 0x1d, 0x82, 0x1f, 0xe0, 0x1e, 0xd1, 0x07, 0x2c, 0x26, + 0xc5, 0x40, 0x13, 0x0f, 0x4a, 0xa1, 0x60, 0x17, 0x00, 0x2f, 0x64, 0x3e, 0x95, 0x34, 0x64, 0xea, + 0x08, 0xd9, 0xcd, 0xd2, 0xf6, 0x83, 0x45, 0x8f, 0x60, 0x52, 0xdb, 0x19, 0x0b, 0x24, 0xd1, 0x26, + 0x26, 0x81, 0x52, 0xfa, 0xb0, 0x09, 0x6e, 0xbc, 0xa4, 0x5d, 0xdf, 0xc3, 0xdc, 0x3f, 0x0c, 0xbb, + 0xd4, 0x1b, 0x94, 0x73, 0x3a, 0xcb, 0x7b, 0x86, 0x77, 0xe3, 0xd9, 0x94, 0xf7, 0x6c, 0x58, 0x85, + 0xd3, 0x96, 0xe6, 0x20, 0x22, 0x68, 0x46, 0x03, 0x7e, 0x07, 0x6e, 0xc7, 0x27, 0xda, 0xc1, 0x2c, + 0x64, 0xd4, 0xc3, 0x5d, 0x55, 0x14, 0xa6, 0x8a, 0x90, 0xd7, 0xf2, 0x55, 0x23, 0x7f, 0x1b, 0xcd, + 0x87, 0xa1, 0x8b, 0xf8, 0xf6, 0xdf, 0x19, 0x70, 0x6b, 0xee, 0x51, 0xe1, 0x57, 0x20, 0x27, 0x07, + 0x11, 0x31, 0xed, 0xb8, 0x3b, 0x6e, 0x87, 0x4a, 0xf0, 0x6c, 0x58, 0xbd, 0x33, 0x97, 0xa4, 0xb3, + 0xd7, 0x34, 0x58, 0x9f, 0x8c, 0x4d, 0xdc, 0xa7, 0xfb, 0xd3, 0x63, 0x70, 0x36, 0xac, 0xce, 0xb9, + 0xdb, 0xce, 0x44, 0x69, 0x7a, 0x58, 0xe0, 0x87, 0xa0, 0xc0, 0x09, 0x16, 0x21, 0xd3, 0x43, 0x58, + 0x4c, 0x86, 0x0a, 0x69, 0x2b, 0x32, 0x5e, 0x78, 0x17, 0x2c, 0xf7, 0x88, 0x10, 0x38, 0x20, 0xa6, + 0xf0, 0xff, 0x33, 0xc0, 0xe5, 0xfd, 0xd8, 0x8c, 0xc6, 0x7e, 0xc8, 0x01, 0xec, 0x62, 0x21, 0x9b, + 0x1c, 0x33, 0x11, 0x27, 0x4f, 0x4d, 0x3d, 0x4b, 0xdb, 0x1f, 0x2d, 0x76, 0x27, 0x15, 0xa3, 0xf6, + 0xc1, 0x68, 0x58, 0x85, 0xf5, 0x73, 0x4a, 0x68, 0x8e, 0xba, 0xfd, 0x9b, 0x05, 0x8a, 0xba, 0x70, + 0x75, 0x2a, 0x24, 0x7c, 0x71, 0x6e, 0x17, 0x38, 0x8b, 0xc5, 0x55, 0x6c, 0xbd, 0x09, 0xfe, 0x6f, + 0x4e, 0xb7, 0x32, 0xb6, 0xa4, 0xf6, 0xc0, 0x3e, 0xc8, 0x53, 0x49, 0x7a, 0xaa, 0xfe, 0x6a, 0xe6, + 0x37, 0x17, 0x9d, 0xf9, 0xda, 0x75, 0x23, 0x9a, 0xdf, 0x55, 0x74, 0x14, 0xab, 0xd8, 0x3f, 0x9a, + 0xcc, 0x0f, 0x43, 0x2e, 0xa1, 0x0f, 0x80, 0xc4, 0x3c, 0x20, 0x52, 0x7d, 0x5d, 0xb9, 0xc7, 0xd4, + 0x66, 0x74, 0xe2, 0xcd, 0xe8, 0xec, 0x32, 0xf9, 0x94, 0x37, 0x24, 0xa7, 0x2c, 0x48, 0x2e, 0x53, + 0x73, 0xa2, 0x85, 0x52, 0xba, 0xf6, 0xef, 0x39, 0x13, 0x53, 0x6d, 0xa3, 0x05, 0xd6, 0x83, 0x0b, + 0x8a, 0xa2, 0x7f, 0xe4, 0x87, 0x3d, 0x4c, 0x59, 0x79, 0x45, 0xc3, 0x6e, 0x1a, 0x58, 0xb1, 0x31, + 0x76, 0xa0, 0x04, 0xa3, 0x24, 0x23, 0x2c, 0xdb, 0x66, 0x42, 0x27, 0x92, 0x87, 0x58, 0xb6, 0x91, + 0xf6, 0xc0, 0x06, 0xc8, 0xc8, 0xd0, 0x2c, 0xbe, 0x2f, 0x16, 0xad, 0x60, 0x7c, 0x1c, 0x44, 0x5a, + 0x84, 0x13, 0xe6, 0x91, 0x1a, 0x30, 0xc2, 0x99, 0x66, 0x88, 0x32, 0x32, 0x84, 0xaf, 0x2c, 0x70, + 0x13, 0x77, 0x25, 0xe1, 0x0c, 0x4b, 0x52, 0xc3, 0x5e, 0x87, 0x30, 0x5f, 0x94, 0x73, 0xba, 0x4d, + 0xff, 0x3a, 0xc8, 0x1d, 0x13, 0xe4, 0xe6, 0xc3, 0x59, 0x65, 0x74, 0x3e, 0x18, 0x7c, 0x02, 0x72, + 0x91, 0x6a, 0x5d, 0xfe, 0xdd, 0x1e, 0x09, 0xd5, 0x96, 0xda, 0x8a, 0xae, 0x91, 0x6a, 0x96, 0xd6, + 0x80, 0x8f, 0x41, 0x56, 0x76, 0x45, 0xb9, 0xb0, 0xb0, 0x54, 0xb3, 0xde, 0xd8, 0x09, 0x59, 0x8b, + 0x06, 0xb5, 0xe5, 0xd1, 0xb0, 0x9a, 0x6d, 0xd6, 0x1b, 0x48, 0x29, 0xcc, 0x59, 0x9e, 0xcb, 0xff, + 0x7d, 0x79, 0xda, 0x14, 0x94, 0x52, 0xcf, 0x11, 0x7c, 0x0e, 0x96, 0x69, 0xbc, 0xb5, 0xca, 0x96, + 0xae, 0xb8, 0xfb, 0x8e, 0x8f, 0x41, 0xb2, 0x52, 0x8c, 0x01, 0x8d, 0x05, 0xed, 0x9f, 0xc1, 0xfb, + 0xf3, 0x7a, 0xa3, 0xe6, 0xac, 0x43, 0x99, 0x3f, 0x3b, 0xba, 0x7b, 0x94, 0xf9, 0x48, 0x7b, 0x14, + 0x82, 0x25, 0x6f, 0xda, 0x04, 0xa1, 0x5f, 0x33, 0xed, 0x81, 0x36, 0x28, 0xbc, 0x24, 0x34, 0x68, + 0x4b, 0x3d, 0x8d, 0xf9, 0x1a, 0x50, 0xdb, 0xef, 0x99, 0xb6, 0x20, 0xe3, 0xb1, 0x43, 0x73, 0x54, + 0xde, 0x68, 0x63, 0xee, 0xeb, 0xfb, 0xa0, 0x7e, 0xe8, 0xd7, 0xd2, 0x9a, 0xb9, 0x0f, 0x63, 0x07, + 0x4a, 0x30, 0x8a, 0xe0, 0x33, 0xd1, 0xe8, 0xb7, 0x5a, 0xf4, 0x27, 0x93, 0xca, 0x84, 0xf0, 0xe8, + 0xa0, 0x11, 0x3b, 0x50, 0x82, 0xb1, 0xff, 0xc8, 0x82, 0xe2, 0xa4, 0x9b, 0x70, 0x0f, 0x94, 0x24, + 0xe1, 0x3d, 0xca, 0xb0, 0x5a, 0x78, 0x33, 0x0f, 0x47, 0xa9, 0x99, 0xb8, 0x54, 0xe7, 0x9a, 0xf5, + 0x46, 0xca, 0xa2, 0x3b, 0x97, 0x66, 0xc3, 0xcf, 0x40, 0xc9, 0x23, 0x5c, 0xd2, 0x16, 0xf5, 0xb0, + 0x1c, 0x17, 0xe6, 0xbd, 0xb1, 0xd8, 0x4e, 0xe2, 0x42, 0x69, 0x1c, 0x5c, 0x03, 0xd9, 0x0e, 0x19, + 0x98, 0x57, 0xa2, 0x64, 0xe0, 0xd9, 0x3d, 0x32, 0x40, 0xca, 0x0e, 0xbf, 0x04, 0xd7, 0x3d, 0x9c, + 0x22, 0x9b, 0x57, 0xe2, 0x96, 0x01, 0x5e, 0xdf, 0x79, 0x98, 0x56, 0x9e, 0xc6, 0xc2, 0x17, 0xa0, + 0xec, 0x13, 0x21, 0x4d, 0x86, 0x53, 0x50, 0xf3, 0x0e, 0xaf, 0x1b, 0x9d, 0xf2, 0xa3, 0x0b, 0x70, + 0xe8, 0x42, 0x05, 0xf8, 0xda, 0x02, 0x6b, 0x94, 0x09, 0xe2, 0xf5, 0x39, 0xf9, 0xda, 0x0f, 0x48, + 0xaa, 0x3a, 0xe6, 0x36, 0x14, 0x74, 0x8c, 0x27, 0x26, 0xc6, 0xda, 0xee, 0x65, 0xe0, 0xb3, 0x61, + 0x75, 0xe3, 0x52, 0x80, 0xae, 0xf8, 0xe5, 0x01, 0x6b, 0x8f, 0x4f, 0x4e, 0x2b, 0x4b, 0x6f, 0x4e, + 0x2b, 0x4b, 0x6f, 0x4f, 0x2b, 0x4b, 0xaf, 0x46, 0x15, 0xeb, 0x64, 0x54, 0xb1, 0xde, 0x8c, 0x2a, + 0xd6, 0xdb, 0x51, 0xc5, 0xfa, 0x73, 0x54, 0xb1, 0x5e, 0xff, 0x55, 0x59, 0x7a, 0xbe, 0x71, 0xe5, + 0x1f, 0x85, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x8e, 0xb3, 0x95, 0x4c, 0x0c, 0x00, 0x00, } func (m *Route) Marshal() (dAtA []byte, err error) { @@ -1391,10 +1391,7 @@ func (m *Route) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1606,10 +1603,7 @@ func (m *RouteIngress) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1823,10 +1817,7 @@ func (m *RouteIngressCondition) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -1943,10 +1934,7 @@ func (m *RouteList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2029,10 +2017,7 @@ func (m *RoutePort) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2349,10 +2334,7 @@ func (m *RouteSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2436,10 +2418,7 @@ func (m *RouteStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2573,10 +2552,7 @@ func (m *RouteTargetReference) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2690,10 +2666,7 @@ func (m *RouterShard) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2935,10 +2908,7 @@ func (m *TLSConfig) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/openshift/api/route/v1/generated.proto b/vendor/github.com/openshift/api/route/v1/generated.proto index 42031b34..b2fd879b 100644 --- a/vendor/github.com/openshift/api/route/v1/generated.proto +++ b/vendor/github.com/openshift/api/route/v1/generated.proto @@ -11,7 +11,7 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". -option go_package = "v1"; +option go_package = "github.com/openshift/api/route/v1"; // A route allows developers to expose services through an HTTP(S) aware load balancing and proxy // layer via a public DNS entry. The route may further specify TLS options and a certificate, or @@ -38,7 +38,12 @@ option go_package = "v1"; // connection re-use/coalescing. Routes that do not have their own // custom certificate will not be HTTP/2 ALPN-enabled on either the // frontend or the backend. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 message Route { + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // spec is the desired state of the route @@ -72,7 +77,7 @@ message RouteIngress { // router. message RouteIngressCondition { // Type is the type of the condition. - // Currently only Ready. + // Currently only Admitted. optional string type = 1; // Status is the status of the condition. @@ -91,7 +96,12 @@ message RouteIngressCondition { } // RouteList is a collection of Routes. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 message RouteList { + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; // items is a list of routes @@ -126,7 +136,10 @@ message RouteSpec { // If not specified a route name will typically be automatically // chosen. // Must follow DNS952 subdomain conventions. + // // +optional + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$` optional string host = 1; // subdomain is a DNS subdomain that is requested within the ingress controller's @@ -143,9 +156,14 @@ message RouteSpec { // `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. // // +optional + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$` optional string subdomain = 8; // path that the router watches for, to route traffic for to the service. Optional + // + // +optional + // +kubebuilder:validation:Pattern=`^/` optional string path = 2; // to is an object the route should use as the primary backend. Only the Service kind @@ -156,6 +174,8 @@ message RouteSpec { // alternateBackends allows up to 3 additional backends to be assigned to the route. // Only the Service kind is allowed, and it will be defaulted to Service. // Use the weight field in RouteTargetReference object to specify relative preference. + // + // +kubebuilder:validation:MaxItems=3 repeated RouteTargetReference alternateBackends = 4; // If specified, the port to be used by the router. Most routers will use all @@ -168,6 +188,9 @@ message RouteSpec { // Wildcard policy if any for the route. // Currently only 'Subdomain' or 'None' is allowed. + // + // +kubebuilder:validation:Enum=None;Subdomain;"" + // +kubebuilder:default=None optional string wildcardPolicy = 7; } @@ -184,14 +207,23 @@ message RouteStatus { // kind is allowed. Use 'weight' field to emphasize one over others. message RouteTargetReference { // The kind of target that the route is referring to. Currently, only 'Service' is allowed + // + // +kubebuilder:validation:Enum=Service;"" + // +kubebuilder:default=Service optional string kind = 1; // name of the service/target that is being referred to. e.g. name of the service + // + // +kubebuilder:validation:MinLength=1 optional string name = 2; // weight as an integer between 0 and 256, default 100, that specifies the target's relative weight // against other target reference objects. 0 suppresses requests to this backend. + // // +optional + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=256 + // +kubebuilder:default=100 optional int32 weight = 3; } @@ -199,7 +231,7 @@ message RouteTargetReference { // generate host names and routing table entries when a routing shard is // allocated for a specific route. // Caveat: This is WIP and will likely undergo modifications when sharding -// support is added. +// support is added. message RouterShard { // shardName uniquely identifies a router shard in the "set" of // routers used for routing traffic to the services. @@ -216,9 +248,12 @@ message TLSConfig { // * edge - TLS termination is done by the router and http is used to communicate with the backend (default) // * passthrough - Traffic is sent straight to the destination without the router providing TLS termination // * reencrypt - TLS termination is done by the router and https is used to communicate with the backend + // + // +kubebuilder:validation:Enum=edge;reencrypt;passthrough optional string termination = 1; - // certificate provides certificate contents + // certificate provides certificate contents. This should be a single serving certificate, not a certificate + // chain. Do not include a CA certificate. optional string certificate = 2; // key provides key file contents diff --git a/vendor/github.com/openshift/api/route/v1/route.crd.yaml b/vendor/github.com/openshift/api/route/v1/route.crd.yaml new file mode 100644 index 00000000..84aba660 --- /dev/null +++ b/vendor/github.com/openshift/api/route/v1/route.crd.yaml @@ -0,0 +1,298 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/1228 + name: routes.route.openshift.io +spec: + group: route.openshift.io + names: + kind: Route + plural: routes + singular: route + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.ingress[0].host + name: Host + type: string + - jsonPath: .status.ingress[0].conditions[?(@.type=="Admitted")].status + name: Admitted + type: string + - jsonPath: .spec.to.name + name: Service + type: string + - jsonPath: .spec.tls.type + name: TLS + type: string + name: v1 + schema: + openAPIV3Schema: + description: "A route allows developers to expose services through an HTTP(S) aware load balancing and proxy layer via a public DNS entry. The route may further specify TLS options and a certificate, or specify a public CNAME that the router should also accept for HTTP and HTTPS traffic. An administrator typically configures their router to be visible outside the cluster firewall, and may also add additional security, caching, or traffic controls on the service content. Routers usually talk directly to the service endpoints. \n Once a route is created, the `host` field may not be changed. Generally, routers use the oldest route with a given host when resolving conflicts. \n Routers are subject to additional customization and may support additional controls via the annotations field. \n Because administrators may configure multiple routers, the route status field is used to return information to clients about the names and states of the route under each router. If a client chooses a duplicate name, for instance, the route status conditions are used to indicate the route cannot be chosen. \n To enable HTTP/2 ALPN on a route it requires a custom (non-wildcard) certificate. This prevents connection coalescing by clients, notably web browsers. We do not support HTTP/2 ALPN on routes that use the default certificate because of the risk of connection re-use/coalescing. Routes that do not have their own custom certificate will not be HTTP/2 ALPN-enabled on either the frontend or the backend. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + allOf: + - anyOf: + - properties: + path: + maxLength: 0 + - properties: + tls: + enum: + - null + - not: + properties: + tls: + properties: + termination: + enum: + - passthrough + - anyOf: + - not: + properties: + host: + maxLength: 0 + - not: + properties: + wildcardPolicy: + enum: + - Subdomain + description: spec is the desired state of the route + properties: + alternateBackends: + description: alternateBackends allows up to 3 additional backends to be assigned to the route. Only the Service kind is allowed, and it will be defaulted to Service. Use the weight field in RouteTargetReference object to specify relative preference. + items: + description: RouteTargetReference specifies the target that resolve into endpoints. Only the 'Service' kind is allowed. Use 'weight' field to emphasize one over others. + properties: + kind: + default: Service + description: The kind of target that the route is referring to. Currently, only 'Service' is allowed + enum: + - Service + - "" + type: string + name: + description: name of the service/target that is being referred to. e.g. name of the service + minLength: 1 + type: string + weight: + default: 100 + description: weight as an integer between 0 and 256, default 100, that specifies the target's relative weight against other target reference objects. 0 suppresses requests to this backend. + format: int32 + maximum: 256 + minimum: 0 + type: integer + required: + - kind + - name + type: object + maxItems: 3 + type: array + host: + description: host is an alias/DNS that points to the service. Optional. If not specified a route name will typically be automatically chosen. Must follow DNS952 subdomain conventions. + maxLength: 253 + pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ + type: string + path: + description: path that the router watches for, to route traffic for to the service. Optional + pattern: ^/ + type: string + port: + description: If specified, the port to be used by the router. Most routers will use all endpoints exposed by the service by default - set this value to instruct routers which port to use. + properties: + targetPort: + allOf: + - not: + enum: + - 0 + - not: + enum: + - "" + x-kubernetes-int-or-string: true + required: + - targetPort + type: object + subdomain: + description: "subdomain is a DNS subdomain that is requested within the ingress controller's domain (as a subdomain). If host is set this field is ignored. An ingress controller may choose to ignore this suggested name, in which case the controller will report the assigned name in the status.ingress array or refuse to admit the route. If this value is set and the server does not support this field host will be populated automatically. Otherwise host is left empty. The field may have multiple parts separated by a dot, but not all ingress controllers may honor the request. This field may not be changed after creation except by a user with the update routes/custom-host permission. \n Example: subdomain `frontend` automatically receives the router subdomain `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`." + maxLength: 253 + pattern: ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ + type: string + tls: + allOf: + - anyOf: + - properties: + caCertificate: + maxLength: 0 + certificate: + maxLength: 0 + destinationCACertificate: + maxLength: 0 + key: + maxLength: 0 + - not: + properties: + termination: + enum: + - passthrough + - anyOf: + - properties: + destinationCACertificate: + maxLength: 0 + - not: + properties: + termination: + enum: + - edge + - anyOf: + - properties: + insecureEdgeTerminationPolicy: + enum: + - "" + - None + - Allow + - Redirect + - not: + properties: + termination: + enum: + - edge + - reencrypt + - anyOf: + - properties: + insecureEdgeTerminationPolicy: + enum: + - "" + - None + - Redirect + - not: + properties: + termination: + enum: + - passthrough + description: The tls field provides the ability to configure certificates and termination for the route. + properties: + caCertificate: + description: caCertificate provides the cert authority certificate contents + type: string + certificate: + description: certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate. + type: string + destinationCACertificate: + description: destinationCACertificate provides the contents of the ca certificate of the final destination. When using reencrypt termination this file should be provided in order to have routers use it for health checks on the secure connection. If this field is not specified, the router may provide its own destination CA and perform hostname validation using the short service name (service.namespace.svc), which allows infrastructure generated certificates to automatically verify. + type: string + insecureEdgeTerminationPolicy: + description: "insecureEdgeTerminationPolicy indicates the desired behavior for insecure connections to a route. While each router may make its own decisions on which ports to expose, this is normally port 80. \n * Allow - traffic is sent to the server on the insecure port (default) * Disable - no traffic is allowed on the insecure port. * Redirect - clients are redirected to the secure port." + type: string + key: + description: key provides key file contents + type: string + termination: + description: "termination indicates termination type. \n * edge - TLS termination is done by the router and http is used to communicate with the backend (default) * passthrough - Traffic is sent straight to the destination without the router providing TLS termination * reencrypt - TLS termination is done by the router and https is used to communicate with the backend" + enum: + - edge + - reencrypt + - passthrough + type: string + required: + - termination + type: object + to: + description: to is an object the route should use as the primary backend. Only the Service kind is allowed, and it will be defaulted to Service. If the weight field (0-256 default 100) is set to zero, no traffic will be sent to this backend. + properties: + kind: + default: Service + description: The kind of target that the route is referring to. Currently, only 'Service' is allowed + enum: + - Service + - "" + type: string + name: + description: name of the service/target that is being referred to. e.g. name of the service + minLength: 1 + type: string + weight: + default: 100 + description: weight as an integer between 0 and 256, default 100, that specifies the target's relative weight against other target reference objects. 0 suppresses requests to this backend. + format: int32 + maximum: 256 + minimum: 0 + type: integer + required: + - kind + - name + type: object + wildcardPolicy: + default: None + description: Wildcard policy if any for the route. Currently only 'Subdomain' or 'None' is allowed. + enum: + - None + - Subdomain + - "" + type: string + required: + - to + type: object + status: + description: status is the current state of the route + properties: + ingress: + description: ingress describes the places where the route may be exposed. The list of ingress points may contain duplicate Host or RouterName values. Routes are considered live once they are `Ready` + items: + description: RouteIngress holds information about the places where a route is exposed. + properties: + conditions: + description: Conditions is the state of the route, may be empty. + items: + description: RouteIngressCondition contains details for the current condition of this route on a particular router. + properties: + lastTransitionTime: + description: RFC 3339 date and time when this condition last transitioned + format: date-time + type: string + message: + description: Human readable message indicating details about last transition. + type: string + reason: + description: (brief) reason for the condition's last transition, and is usually a machine and human readable constant + type: string + status: + description: Status is the status of the condition. Can be True, False, Unknown. + type: string + type: + description: Type is the type of the condition. Currently only Admitted. + type: string + required: + - status + - type + type: object + type: array + host: + description: Host is the host string under which the route is exposed; this value is required + type: string + routerCanonicalHostname: + description: CanonicalHostname is the external host name for the router that can be used as a CNAME for the host requested for this route. This value is optional and may not be set in all cases. + type: string + routerName: + description: Name is a name chosen by the router to identify itself; this value is required + type: string + wildcardPolicy: + description: Wildcard policy is the wildcard policy that was allowed where this route is exposed. + type: string + type: object + type: array + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch b/vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch new file mode 100644 index 00000000..47fbb5da --- /dev/null +++ b/vendor/github.com/openshift/api/route/v1/route.crd.yaml-patch @@ -0,0 +1,86 @@ +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/allOf + value: + # spec.path must be empty when using passthrough TLS. + - anyOf: + - properties: + path: + maxLength: 0 + - properties: + tls: + enum: [null] + - not: + properties: + tls: + properties: + termination: + enum: ["passthrough"] + # spec.host must be nonempty for a wildcard route. + - anyOf: + - not: + properties: + host: + maxLength: 0 + - not: + properties: + wildcardPolicy: + enum: ["Subdomain"] +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/port/properties/targetPort + value: + # spec.port.targetPort cannot be the integer 0 or the empty string. (Note + # that negative integer values are allowed, as is the string "0".) + allOf: + - not: + enum: [0] + - not: + enum: [""] + x-kubernetes-int-or-string: true +- op: add + path: /spec/versions/name=v1/schema/openAPIV3Schema/properties/spec/properties/tls/allOf + value: + # spec.tls.certificate, spec.tls.key, spec.tls.caCertificate, and + # spec.tls.destinationCACertificate must omitted when using passthrough TLS. + - anyOf: + - properties: + certificate: + maxLength: 0 + key: + maxLength: 0 + caCertificate: + maxLength: 0 + destinationCACertificate: + maxLength: 0 + - not: + properties: + termination: + enum: ["passthrough"] + # spec.tls.destinationCACertificate must be omitted when using edge-terminated + # TLS. + - anyOf: + - properties: + destinationCACertificate: + maxLength: 0 + - not: + properties: + termination: + enum: ["edge"] + # Any insecure edge-termination policy may be used if we terminate TLS. + - anyOf: + - properties: + insecureEdgeTerminationPolicy: + enum: ["", "None", "Allow", "Redirect"] + - not: + properties: + termination: + enum: ["edge","reencrypt"] + # Any insecure edge-termination policy *except* for "Allow" maybe used when + # using passthrough TLS. + - anyOf: + - properties: + insecureEdgeTerminationPolicy: + enum: ["", "None", "Redirect"] + - not: + properties: + termination: + enum: ["passthrough"] diff --git a/vendor/github.com/openshift/api/route/v1/stable.route.testsuite.yaml b/vendor/github.com/openshift/api/route/v1/stable.route.testsuite.yaml new file mode 100644 index 00000000..68e144b6 --- /dev/null +++ b/vendor/github.com/openshift/api/route/v1/stable.route.testsuite.yaml @@ -0,0 +1,22 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] Route" +crd: route.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal Route + initial: | + apiVersion: route.openshift.io/v1 + kind: Route + spec: + to: + kind: Service + name: foo + expected: | + apiVersion: route.openshift.io/v1 + kind: Route + spec: + to: + kind: Service + name: foo + weight: 100 + wildcardPolicy: None diff --git a/vendor/github.com/openshift/api/route/v1/test-route-validation.sh b/vendor/github.com/openshift/api/route/v1/test-route-validation.sh new file mode 100644 index 00000000..f1192d4a --- /dev/null +++ b/vendor/github.com/openshift/api/route/v1/test-route-validation.sh @@ -0,0 +1,476 @@ +#!/bin/bash + +# This shell script runs a series of `oc` commands to create various OpenShift +# route objects, some invalid and some valid, and verifies that the API rejects +# the invalid ones and admits the valid ones. Note that this script does not +# verify defaulting behavior and does not examine the rejection reason; it only +# checks whether the `oc create` command succeeds or fails. This script +# requires a cluster and a kubeconfig in a location where oc will find it. + +set -uo pipefail + +expect_pass() { + rc=$? + if [[ $rc != 0 ]] + then + tput setaf 1 + echo "expected success: $*, got exit code $rc" + tput sgr0 + exit 1 + fi + tput setaf 2 + echo "got expected success: $*" + tput sgr0 +} + +expect_fail() { + rc=$? + if [[ $rc = 0 ]] + then + tput setaf 1 + echo "expected failure: $*, got exit code $rc" + exit 1 + fi + tput setaf 2 + echo "got expected failure: $*" + tput sgr0 +} + +delete_route() { + oc -n openshift-ingress delete routes.route/testroute || exit 1 +} + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + path: / + tls: + termination: passthrough + to: + kind: Service + name: router-internal-default +EOF +expect_fail 'passthrough with nonempty path' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + path: / + to: + kind: Service + name: router-internal-default +EOF +expect_pass 'non-TLS with nonempty path' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + path: / + tls: + termination: edge + to: + kind: Service + name: router-internal-default +EOF +expect_pass 'edge-terminated with nonempty path' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + path: x + tls: + termination: edge + to: + kind: Service + name: router-internal-default +EOF +expect_fail 'path starting with non-slash character' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + to: + kind: Service + name: router-internal-default + wildcardPolicy: Subdomain +EOF +expect_fail 'spec.wildcardPolicy: Subdomain requires a nonempty value for spec.host' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + port: + targetPort: "" +EOF +expect_fail 'cannot have empty spec.port.targetPort' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + port: + targetPort: 0 +EOF +expect_fail 'cannot have numeric 0 value for spec.port.targetPort' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + port: + targetPort: "0" +EOF +expect_pass 'can have string "0" value for spec.port.targetPort' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + port: + targetPort: 1 +EOF +expect_pass 'can have numeric 1 value for spec.port.targetPort' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + port: + targetPort: x +EOF +expect_pass 'can have string "x" value for spec.port.targetPort' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + tls: + termination: passthrough + to: + kind: Nonsense + name: router-internal-default +EOF +expect_fail 'nonsense value for spec.to.kind' + + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + tls: + termination: passthrough + to: + kind: Service + name: "" +EOF +expect_fail 'spec.to.name cannot be empty' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + weight: -1 +EOF +expect_fail 'spec.to.weight cannot be negative' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + weight: 300 +EOF +expect_fail 'spec.to.weight cannot exceed 256' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + weight: 100 +EOF +expect_pass 'spec.to.weight has a valid value' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + alternateBackends: + - name: router-internal-default + - name: router-internal-default + - name: router-internal-default + - name: router-internal-default +EOF +expect_fail 'cannot have >3 values under spec.alternateBackends' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + alternateBackends: + - name: router-internal-default + - name: "" + - name: router-internal-default +EOF +expect_fail 'cannot have empty spec.alternateBackends[*].name' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + alternateBackends: + - name: router-internal-default + - name: router-internal-default + - name: router-internal-default +EOF +expect_pass 'valid spec.alternateBackends' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + certificate: "x" +EOF +expect_fail 'cannot have both spec.tls.termination: passthrough and nonempty spec.tls.certificate' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + key: "x" +EOF +expect_fail 'cannot have both spec.tls.termination: passthrough and nonempty spec.tls.key' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + caCertificate: "x" +EOF +expect_fail 'cannot have both spec.tls.termination: passthrough and nonempty spec.tls.caCertificate' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + destinationCACertificate: "x" +EOF +expect_fail 'cannot have both spec.tls.termination: passthrough and nonempty spec.tls.destinationCACertificate' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: edge + destinationCACertificate: "x" +EOF +expect_fail 'cannot have both spec.tls.termination: edge and nonempty spec.tls.destinationCACertificate' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: edge + insecureEdgeTerminationPolicy: nonsense +EOF +expect_fail 'cannot have nonsense value for spec.tls.insecureEdgeTerminationPolicy' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + insecureEdgeTerminationPolicy: Allow +EOF +expect_fail 'cannot have both spec.tls.termination: passthrough and spec.tls.insecureEdgeTerminationPolicy: Allow' + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + insecureEdgeTerminationPolicy: Redirect +EOF +expect_pass 'spec.tls.termination: passthrough is compatible with spec.tls.insecureEdgeTerminationPolicy: Redirect' +delete_route + +oc create -f - <<'EOF' +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + namespace: openshift-ingress + name: testroute +spec: + host: test.foo + to: + name: router-internal-default + tls: + termination: passthrough + insecureEdgeTerminationPolicy: None +EOF +expect_pass 'spec.tls.termination: passthrough is compatible with spec.tls.insecureEdgeTerminationPolicy: None' +delete_route diff --git a/vendor/github.com/openshift/api/route/v1/types.go b/vendor/github.com/openshift/api/route/v1/types.go index e36e192d..eed8d69e 100644 --- a/vendor/github.com/openshift/api/route/v1/types.go +++ b/vendor/github.com/openshift/api/route/v1/types.go @@ -8,6 +8,8 @@ import ( // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status // A route allows developers to expose services through an HTTP(S) aware load balancing and proxy // layer via a public DNS entry. The route may further specify TLS options and a certificate, or @@ -34,8 +36,14 @@ import ( // connection re-use/coalescing. Routes that do not have their own // custom certificate will not be HTTP/2 ALPN-enabled on either the // frontend or the backend. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type Route struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // spec is the desired state of the route @@ -48,8 +56,14 @@ type Route struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // RouteList is a collection of Routes. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type RouteList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // items is a list of routes @@ -76,7 +90,10 @@ type RouteSpec struct { // If not specified a route name will typically be automatically // chosen. // Must follow DNS952 subdomain conventions. + // // +optional + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$` Host string `json:"host,omitempty" protobuf:"bytes,1,opt,name=host"` // subdomain is a DNS subdomain that is requested within the ingress controller's // domain (as a subdomain). If host is set this field is ignored. An ingress @@ -92,9 +109,14 @@ type RouteSpec struct { // `apps.mycluster.com` to have a full hostname `frontend.apps.mycluster.com`. // // +optional + // +kubebuilder:validation:MaxLength=253 + // +kubebuilder:validation:Pattern=`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$` Subdomain string `json:"subdomain,omitempty" protobuf:"bytes,8,opt,name=subdomain"` // path that the router watches for, to route traffic for to the service. Optional + // + // +optional + // +kubebuilder:validation:Pattern=`^/` Path string `json:"path,omitempty" protobuf:"bytes,2,opt,name=path"` // to is an object the route should use as the primary backend. Only the Service kind @@ -105,6 +127,8 @@ type RouteSpec struct { // alternateBackends allows up to 3 additional backends to be assigned to the route. // Only the Service kind is allowed, and it will be defaulted to Service. // Use the weight field in RouteTargetReference object to specify relative preference. + // + // +kubebuilder:validation:MaxItems=3 AlternateBackends []RouteTargetReference `json:"alternateBackends,omitempty" protobuf:"bytes,4,rep,name=alternateBackends"` // If specified, the port to be used by the router. Most routers will use all @@ -117,6 +141,9 @@ type RouteSpec struct { // Wildcard policy if any for the route. // Currently only 'Subdomain' or 'None' is allowed. + // + // +kubebuilder:validation:Enum=None;Subdomain;"" + // +kubebuilder:default=None WildcardPolicy WildcardPolicyType `json:"wildcardPolicy,omitempty" protobuf:"bytes,7,opt,name=wildcardPolicy"` } @@ -124,14 +151,23 @@ type RouteSpec struct { // kind is allowed. Use 'weight' field to emphasize one over others. type RouteTargetReference struct { // The kind of target that the route is referring to. Currently, only 'Service' is allowed + // + // +kubebuilder:validation:Enum=Service;"" + // +kubebuilder:default=Service Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` // name of the service/target that is being referred to. e.g. name of the service + // + // +kubebuilder:validation:MinLength=1 Name string `json:"name" protobuf:"bytes,2,opt,name=name"` // weight as an integer between 0 and 256, default 100, that specifies the target's relative weight // against other target reference objects. 0 suppresses requests to this backend. + // // +optional + // +kubebuilder:validation:Minimum=0 + // +kubebuilder:validation:Maximum=256 + // +kubebuilder:default=100 Weight *int32 `json:"weight" protobuf:"varint,3,opt,name=weight"` } @@ -181,7 +217,7 @@ const ( // router. type RouteIngressCondition struct { // Type is the type of the condition. - // Currently only Ready. + // Currently only Admitted. Type RouteIngressConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=RouteIngressConditionType"` // Status is the status of the condition. // Can be True, False, Unknown. @@ -199,7 +235,7 @@ type RouteIngressCondition struct { // generate host names and routing table entries when a routing shard is // allocated for a specific route. // Caveat: This is WIP and will likely undergo modifications when sharding -// support is added. +// support is added. type RouterShard struct { // shardName uniquely identifies a router shard in the "set" of // routers used for routing traffic to the services. @@ -216,9 +252,12 @@ type TLSConfig struct { // * edge - TLS termination is done by the router and http is used to communicate with the backend (default) // * passthrough - Traffic is sent straight to the destination without the router providing TLS termination // * reencrypt - TLS termination is done by the router and https is used to communicate with the backend + // + // +kubebuilder:validation:Enum=edge;reencrypt;passthrough Termination TLSTerminationType `json:"termination" protobuf:"bytes,1,opt,name=termination,casttype=TLSTerminationType"` - // certificate provides certificate contents + // certificate provides certificate contents. This should be a single serving certificate, not a certificate + // chain. Do not include a CA certificate. Certificate string `json:"certificate,omitempty" protobuf:"bytes,2,opt,name=certificate"` // key provides key file contents @@ -282,3 +321,32 @@ const ( // Note that this will not match acme.test only *.acme.test WildcardPolicySubdomain WildcardPolicyType = "Subdomain" ) + +// Route Annotations +const ( + // AllowNonDNSCompliantHostAnnotation indicates that the host name in a route + // configuration is not required to follow strict DNS compliance. + // Unless the annotation is set to true, the route host name must have at least one label. + // Labels must have no more than 63 characters from the set of + // alphanumeric characters, '-' or '.', and must start and end with an alphanumeric + // character. A trailing dot is not allowed. The total host name length must be no more + // than 253 characters. + // + // When the annotation is set to true, the host name must pass a smaller set of + // requirements, i.e.: character set as described above, and total host name + // length must be no more than 253 characters. + // + // NOTE: use of this annotation may validate routes that cannot be admitted and will + // not function. The annotation is provided to allow a custom scenario, e.g. a custom + // ingress controller that relies on the route API, but for some customized purpose + // needs to use routes with invalid hosts. + AllowNonDNSCompliantHostAnnotation = "route.openshift.io/allow-non-dns-compliant-host" +) + +// Ingress-to-route controller +const ( + // IngressToRouteIngressClassControllerName is the name of the + // controller that translates ingresses into routes. This value is + // intended to be used for the spec.controller field of ingressclasses. + IngressToRouteIngressClassControllerName = "openshift.io/ingress-to-route" +) diff --git a/vendor/github.com/openshift/api/route/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/route/v1/zz_generated.deepcopy.go index a9576c41..ad8aa77f 100644 --- a/vendor/github.com/openshift/api/route/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/route/v1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated // Code generated by deepcopy-gen. DO NOT EDIT. diff --git a/vendor/github.com/openshift/api/route/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/route/v1/zz_generated.swagger_doc_generated.go index 83b92816..7cb17d00 100644 --- a/vendor/github.com/openshift/api/route/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/route/v1/zz_generated.swagger_doc_generated.go @@ -12,9 +12,10 @@ package v1 // AUTO-GENERATED FUNCTIONS START HERE var map_Route = map[string]string{ - "": "A route allows developers to expose services through an HTTP(S) aware load balancing and proxy layer via a public DNS entry. The route may further specify TLS options and a certificate, or specify a public CNAME that the router should also accept for HTTP and HTTPS traffic. An administrator typically configures their router to be visible outside the cluster firewall, and may also add additional security, caching, or traffic controls on the service content. Routers usually talk directly to the service endpoints.\n\nOnce a route is created, the `host` field may not be changed. Generally, routers use the oldest route with a given host when resolving conflicts.\n\nRouters are subject to additional customization and may support additional controls via the annotations field.\n\nBecause administrators may configure multiple routers, the route status field is used to return information to clients about the names and states of the route under each router. If a client chooses a duplicate name, for instance, the route status conditions are used to indicate the route cannot be chosen.\n\nTo enable HTTP/2 ALPN on a route it requires a custom (non-wildcard) certificate. This prevents connection coalescing by clients, notably web browsers. We do not support HTTP/2 ALPN on routes that use the default certificate because of the risk of connection re-use/coalescing. Routes that do not have their own custom certificate will not be HTTP/2 ALPN-enabled on either the frontend or the backend.", - "spec": "spec is the desired state of the route", - "status": "status is the current state of the route", + "": "A route allows developers to expose services through an HTTP(S) aware load balancing and proxy layer via a public DNS entry. The route may further specify TLS options and a certificate, or specify a public CNAME that the router should also accept for HTTP and HTTPS traffic. An administrator typically configures their router to be visible outside the cluster firewall, and may also add additional security, caching, or traffic controls on the service content. Routers usually talk directly to the service endpoints.\n\nOnce a route is created, the `host` field may not be changed. Generally, routers use the oldest route with a given host when resolving conflicts.\n\nRouters are subject to additional customization and may support additional controls via the annotations field.\n\nBecause administrators may configure multiple routers, the route status field is used to return information to clients about the names and states of the route under each router. If a client chooses a duplicate name, for instance, the route status conditions are used to indicate the route cannot be chosen.\n\nTo enable HTTP/2 ALPN on a route it requires a custom (non-wildcard) certificate. This prevents connection coalescing by clients, notably web browsers. We do not support HTTP/2 ALPN on routes that use the default certificate because of the risk of connection re-use/coalescing. Routes that do not have their own custom certificate will not be HTTP/2 ALPN-enabled on either the frontend or the backend.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "spec": "spec is the desired state of the route", + "status": "status is the current state of the route", } func (Route) SwaggerDoc() map[string]string { @@ -36,7 +37,7 @@ func (RouteIngress) SwaggerDoc() map[string]string { var map_RouteIngressCondition = map[string]string{ "": "RouteIngressCondition contains details for the current condition of this route on a particular router.", - "type": "Type is the type of the condition. Currently only Ready.", + "type": "Type is the type of the condition. Currently only Admitted.", "status": "Status is the status of the condition. Can be True, False, Unknown.", "reason": "(brief) reason for the condition's last transition, and is usually a machine and human readable constant", "message": "Human readable message indicating details about last transition.", @@ -48,8 +49,9 @@ func (RouteIngressCondition) SwaggerDoc() map[string]string { } var map_RouteList = map[string]string{ - "": "RouteList is a collection of Routes.", - "items": "items is a list of routes", + "": "RouteList is a collection of Routes.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of routes", } func (RouteList) SwaggerDoc() map[string]string { @@ -102,7 +104,7 @@ func (RouteTargetReference) SwaggerDoc() map[string]string { } var map_RouterShard = map[string]string{ - "": "RouterShard has information of a routing shard and is used to generate host names and routing table entries when a routing shard is allocated for a specific route. Caveat: This is WIP and will likely undergo modifications when sharding\n support is added.", + "": "RouterShard has information of a routing shard and is used to generate host names and routing table entries when a routing shard is allocated for a specific route. Caveat: This is WIP and will likely undergo modifications when sharding support is added.", "shardName": "shardName uniquely identifies a router shard in the \"set\" of routers used for routing traffic to the services.", "dnsSuffix": "dnsSuffix for the shard ala: shard-1.v3.openshift.com", } @@ -114,7 +116,7 @@ func (RouterShard) SwaggerDoc() map[string]string { var map_TLSConfig = map[string]string{ "": "TLSConfig defines config used to secure a route and provide termination", "termination": "termination indicates termination type.\n\n* edge - TLS termination is done by the router and http is used to communicate with the backend (default) * passthrough - Traffic is sent straight to the destination without the router providing TLS termination * reencrypt - TLS termination is done by the router and https is used to communicate with the backend", - "certificate": "certificate provides certificate contents", + "certificate": "certificate provides certificate contents. This should be a single serving certificate, not a certificate chain. Do not include a CA certificate.", "key": "key provides key file contents", "caCertificate": "caCertificate provides the cert authority certificate contents", "destinationCACertificate": "destinationCACertificate provides the contents of the ca certificate of the final destination. When using reencrypt termination this file should be provided in order to have routers use it for health checks on the secure connection. If this field is not specified, the router may provide its own destination CA and perform hostname validation using the short service name (service.namespace.svc), which allows infrastructure generated certificates to automatically verify.", diff --git a/vendor/github.com/openshift/api/security/v1/0000_03_security-openshift_01_scc.crd.yaml b/vendor/github.com/openshift/api/security/v1/0000_03_security-openshift_01_scc.crd.yaml index 480f7b27..f08d1657 100644 --- a/vendor/github.com/openshift/api/security/v1/0000_03_security-openshift_01_scc.crd.yaml +++ b/vendor/github.com/openshift/api/security/v1/0000_03_security-openshift_01_scc.crd.yaml @@ -1,362 +1,279 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: - name: securitycontextconstraints.security.openshift.io annotations: + api-approved.openshift.io: https://github.com/openshift/api/pull/470 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" + name: securitycontextconstraints.security.openshift.io spec: group: security.openshift.io - scope: Cluster names: kind: SecurityContextConstraints listKind: SecurityContextConstraintsList plural: securitycontextconstraints singular: securitycontextconstraints + scope: Cluster versions: - - name: v1 - served: true - storage: true - additionalPrinterColumns: - - name: Priv - type: string - jsonPath: .allowPrivilegedContainer - description: Determines if a container can request to be run as privileged - - name: Caps - type: string - jsonPath: .allowedCapabilities - description: A list of capabilities that can be requested to add to the container - - name: SELinux - type: string - jsonPath: .seLinuxContext.type - description: Strategy that will dictate what labels will be set in the SecurityContext - - name: RunAsUser - type: string - jsonPath: .runAsUser.type - description: Strategy that will dictate what RunAsUser is used in the SecurityContext - - name: FSGroup - type: string - jsonPath: .fsGroup.type - description: Strategy that will dictate what fs group is used by the SecurityContext - - name: SupGroup - type: string - jsonPath: .supplementalGroups.type - description: Strategy that will dictate what supplemental groups are used by - the SecurityContext - - name: Priority - type: string - jsonPath: .priority - description: Sort order of SCCs - - name: ReadOnlyRootFS - type: string - jsonPath: .readOnlyRootFilesystem - description: Force containers to run with a read only root file system - - name: Volumes - type: string - jsonPath: .volumes - description: White list of allowed volume plugins - schema: - openAPIV3Schema: - description: SecurityContextConstraints governs the ability to make requests - that affect the SecurityContext that will be applied to a container. For - historical reasons SCC was exposed under the core Kubernetes API group. - That exposure is deprecated and will be removed in a future release - users - should instead use the security.openshift.io group to manage SecurityContextConstraints. - type: object - required: - - allowHostDirVolumePlugin - - allowHostIPC - - allowHostNetwork - - allowHostPID - - allowHostPorts - - allowPrivilegedContainer - - allowedCapabilities - - defaultAddCapabilities - - priority - - readOnlyRootFilesystem - - requiredDropCapabilities - - volumes - properties: - allowHostDirVolumePlugin: - description: AllowHostDirVolumePlugin determines if the policy allow containers - to use the HostDir volume plugin - type: boolean - allowHostIPC: - description: AllowHostIPC determines if the policy allows host ipc in - the containers. - type: boolean - allowHostNetwork: - description: AllowHostNetwork determines if the policy allows the use - of HostNetwork in the pod spec. - type: boolean - allowHostPID: - description: AllowHostPID determines if the policy allows host pid in - the containers. - type: boolean - allowHostPorts: - description: AllowHostPorts determines if the policy allows host ports - in the containers. - type: boolean - allowPrivilegeEscalation: - description: AllowPrivilegeEscalation determines if a pod can request - to allow privilege escalation. If unspecified, defaults to true. - type: boolean - nullable: true - allowPrivilegedContainer: - description: AllowPrivilegedContainer determines if a container can request - to be run as privileged. - type: boolean - allowedCapabilities: - description: AllowedCapabilities is a list of capabilities that can be - requested to add to the container. Capabilities in this field maybe - added at the pod author's discretion. You must not list a capability - in both AllowedCapabilities and RequiredDropCapabilities. To allow all - capabilities you may use '*'. - type: array - items: - description: Capability represent POSIX capabilities type + - additionalPrinterColumns: + - description: Determines if a container can request to be run as privileged + jsonPath: .allowPrivilegedContainer + name: Priv + type: string + - description: A list of capabilities that can be requested to add to the container + jsonPath: .allowedCapabilities + name: Caps + type: string + - description: Strategy that will dictate what labels will be set in the SecurityContext + jsonPath: .seLinuxContext.type + name: SELinux + type: string + - description: Strategy that will dictate what RunAsUser is used in the SecurityContext + jsonPath: .runAsUser.type + name: RunAsUser + type: string + - description: Strategy that will dictate what fs group is used by the SecurityContext + jsonPath: .fsGroup.type + name: FSGroup + type: string + - description: Strategy that will dictate what supplemental groups are used by the SecurityContext + jsonPath: .supplementalGroups.type + name: SupGroup + type: string + - description: Sort order of SCCs + jsonPath: .priority + name: Priority + type: string + - description: Force containers to run with a read only root file system + jsonPath: .readOnlyRootFilesystem + name: ReadOnlyRootFS + type: string + - description: White list of allowed volume plugins + jsonPath: .volumes + name: Volumes + type: string + name: v1 + schema: + openAPIV3Schema: + description: "SecurityContextConstraints governs the ability to make requests that affect the SecurityContext that will be applied to a container. For historical reasons SCC was exposed under the core Kubernetes API group. That exposure is deprecated and will be removed in a future release - users should instead use the security.openshift.io group to manage SecurityContextConstraints. \n Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer)." + type: object + required: + - allowHostDirVolumePlugin + - allowHostIPC + - allowHostNetwork + - allowHostPID + - allowHostPorts + - allowPrivilegedContainer + - allowedCapabilities + - defaultAddCapabilities + - priority + - readOnlyRootFilesystem + - requiredDropCapabilities + - volumes + properties: + allowHostDirVolumePlugin: + description: AllowHostDirVolumePlugin determines if the policy allow containers to use the HostDir volume plugin + type: boolean + allowHostIPC: + description: AllowHostIPC determines if the policy allows host ipc in the containers. + type: boolean + allowHostNetwork: + description: AllowHostNetwork determines if the policy allows the use of HostNetwork in the pod spec. + type: boolean + allowHostPID: + description: AllowHostPID determines if the policy allows host pid in the containers. + type: boolean + allowHostPorts: + description: AllowHostPorts determines if the policy allows host ports in the containers. + type: boolean + allowPrivilegeEscalation: + description: AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true. + type: boolean + nullable: true + allowPrivilegedContainer: + description: AllowPrivilegedContainer determines if a container can request to be run as privileged. + type: boolean + allowedCapabilities: + description: AllowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field maybe added at the pod author's discretion. You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities. To allow all capabilities you may use '*'. + type: array + items: + description: Capability represent POSIX capabilities type + type: string + nullable: true + allowedFlexVolumes: + description: AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the "Volumes" field. + type: array + items: + description: AllowedFlexVolume represents a single Flexvolume that is allowed to be used. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the Flexvolume driver. + type: string + nullable: true + allowedUnsafeSysctls: + description: "AllowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection. \n Examples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc." + type: array + items: + type: string + nullable: true + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string - nullable: true - allowedFlexVolumes: - description: AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty - or nil indicates that all Flexvolumes may be used. This parameter is - effective only when the usage of the Flexvolumes is allowed in the "Volumes" - field. - type: array - items: - description: AllowedFlexVolume represents a single Flexvolume that is - allowed to be used. + defaultAddCapabilities: + description: DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capabiility in both DefaultAddCapabilities and RequiredDropCapabilities. + type: array + items: + description: Capability represent POSIX capabilities type + type: string + nullable: true + defaultAllowPrivilegeEscalation: + description: DefaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process. + type: boolean + nullable: true + forbiddenSysctls: + description: "ForbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. \n Examples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc." + type: array + items: + type: string + nullable: true + fsGroup: + description: FSGroup is the strategy that will dictate what fs group is used by the SecurityContext. type: object - required: - - driver properties: - driver: - description: Driver is the name of the Flexvolume driver. + ranges: + description: Ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. + type: array + items: + description: 'IDRange provides a min/max of an allowed range of IDs. TODO: this could be reused for UIDs.' + type: object + properties: + max: + description: Max is the end of the range, inclusive. + type: integer + format: int64 + min: + description: Min is the start of the range, inclusive. + type: integer + format: int64 + type: + description: Type is the strategy that will dictate what FSGroup is used in the SecurityContext. type: string - nullable: true - allowedUnsafeSysctls: - description: "AllowedUnsafeSysctls is a list of explicitly allowed unsafe - sysctls, defaults to none. Each entry is either a plain sysctl name - or ends in \"*\" in which case it is considered as a prefix of allowed - sysctls. Single * means all unsafe sysctls are allowed. Kubelet has - to whitelist all allowed unsafe sysctls explicitly to avoid rejection. - \n Examples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. - \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc." - type: array - items: - type: string - nullable: true - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - defaultAddCapabilities: - description: DefaultAddCapabilities is the default set of capabilities - that will be added to the container unless the pod spec specifically - drops the capability. You may not list a capabiility in both DefaultAddCapabilities - and RequiredDropCapabilities. - type: array - items: - description: Capability represent POSIX capabilities type - type: string - nullable: true - defaultAllowPrivilegeEscalation: - description: DefaultAllowPrivilegeEscalation controls the default setting - for whether a process can gain more privileges than its parent process. - type: boolean - nullable: true - forbiddenSysctls: - description: "ForbiddenSysctls is a list of explicitly forbidden sysctls, - defaults to none. Each entry is either a plain sysctl name or ends in - \"*\" in which case it is considered as a prefix of forbidden sysctls. - Single * means all sysctls are forbidden. \n Examples: e.g. \"foo/*\" - forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", - \"foo.baz\", etc." - type: array - items: - type: string - nullable: true - fsGroup: - description: FSGroup is the strategy that will dictate what fs group is - used by the SecurityContext. - type: object - properties: - ranges: - description: Ranges are the allowed ranges of fs groups. If you would - like to force a single fs group then supply a single range with - the same start and end. - type: array - items: - description: 'IDRange provides a min/max of an allowed range of - IDs. TODO: this could be reused for UIDs.' - type: object - properties: - max: - description: Max is the end of the range, inclusive. - type: integer - format: int64 - min: - description: Min is the start of the range, inclusive. - type: integer - format: int64 - type: - description: Type is the strategy that will dictate what FSGroup is - used in the SecurityContext. + nullable: true + groups: + description: The groups that have permission to use this security context constraints + type: array + items: type: string - nullable: true - groups: - description: The groups that have permission to use this security context - constraints - type: array - items: - type: string - nullable: true - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - priority: - description: Priority influences the sort order of SCCs when evaluating - which SCCs to try first for a given pod request based on access in the - Users and Groups fields. The higher the int, the higher priority. An - unset value is considered a 0 priority. If scores for multiple SCCs - are equal they will be sorted from most restrictive to least restrictive. - If both priorities and restrictions are equal the SCCs will be sorted - by name. - type: integer - format: int32 - nullable: true - readOnlyRootFilesystem: - description: ReadOnlyRootFilesystem when set to true will force containers - to run with a read only root file system. If the container specifically - requests to run with a non-read only root file system the SCC should - deny the pod. If set to false the container may run with a read only - root file system if it wishes but it will not be forced to. - type: boolean - requiredDropCapabilities: - description: RequiredDropCapabilities are the capabilities that will be - dropped from the container. These are required to be dropped and cannot - be added. - type: array - items: - description: Capability represent POSIX capabilities type + nullable: true + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string - nullable: true - runAsUser: - description: RunAsUser is the strategy that will dictate what RunAsUser - is used in the SecurityContext. - type: object - properties: - type: - description: Type is the strategy that will dictate what RunAsUser - is used in the SecurityContext. - type: string - uid: - description: UID is the user id that containers must run as. Required - for the MustRunAs strategy if not using namespace/service account - allocated uids. - type: integer - format: int64 - uidRangeMax: - description: UIDRangeMax defines the max value for a strategy that - allocates by range. - type: integer - format: int64 - uidRangeMin: - description: UIDRangeMin defines the min value for a strategy that - allocates by range. - type: integer - format: int64 - nullable: true - seLinuxContext: - description: SELinuxContext is the strategy that will dictate what labels - will be set in the SecurityContext. - type: object - properties: - seLinuxOptions: - description: seLinuxOptions required to run as; required for MustRunAs - type: object - properties: - level: - description: Level is SELinux level label that applies to the - container. - type: string - role: - description: Role is a SELinux role label that applies to the - container. - type: string - type: - description: Type is a SELinux type label that applies to the - container. - type: string - user: - description: User is a SELinux user label that applies to the - container. - type: string - type: - description: Type is the strategy that will dictate what SELinux context - is used in the SecurityContext. + metadata: + type: object + priority: + description: Priority influences the sort order of SCCs when evaluating which SCCs to try first for a given pod request based on access in the Users and Groups fields. The higher the int, the higher priority. An unset value is considered a 0 priority. If scores for multiple SCCs are equal they will be sorted from most restrictive to least restrictive. If both priorities and restrictions are equal the SCCs will be sorted by name. + type: integer + format: int32 + nullable: true + readOnlyRootFilesystem: + description: ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the SCC should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to. + type: boolean + requiredDropCapabilities: + description: RequiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added. + type: array + items: + description: Capability represent POSIX capabilities type type: string - nullable: true - seccompProfiles: - description: "SeccompProfiles lists the allowed profiles that may be set - for the pod or container's seccomp annotations. An unset (nil) or empty - value means that no profiles may be specifid by the pod or container.\tThe - wildcard '*' may be used to allow all profiles. When used to generate - a value for a pod the first non-wildcard profile will be used as the - default." - type: array - items: - type: string - nullable: true - supplementalGroups: - description: SupplementalGroups is the strategy that will dictate what - supplemental groups are used by the SecurityContext. - type: object - properties: - ranges: - description: Ranges are the allowed ranges of supplemental groups. If - you would like to force a single supplemental group then supply - a single range with the same start and end. - type: array - items: - description: 'IDRange provides a min/max of an allowed range of - IDs. TODO: this could be reused for UIDs.' + nullable: true + runAsUser: + description: RunAsUser is the strategy that will dictate what RunAsUser is used in the SecurityContext. + type: object + properties: + type: + description: Type is the strategy that will dictate what RunAsUser is used in the SecurityContext. + type: string + uid: + description: UID is the user id that containers must run as. Required for the MustRunAs strategy if not using namespace/service account allocated uids. + type: integer + format: int64 + uidRangeMax: + description: UIDRangeMax defines the max value for a strategy that allocates by range. + type: integer + format: int64 + uidRangeMin: + description: UIDRangeMin defines the min value for a strategy that allocates by range. + type: integer + format: int64 + nullable: true + seLinuxContext: + description: SELinuxContext is the strategy that will dictate what labels will be set in the SecurityContext. + type: object + properties: + seLinuxOptions: + description: seLinuxOptions required to run as; required for MustRunAs type: object properties: - max: - description: Max is the end of the range, inclusive. - type: integer - format: int64 - min: - description: Min is the start of the range, inclusive. - type: integer - format: int64 - type: - description: Type is the strategy that will dictate what supplemental - groups is used in the SecurityContext. + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + type: + description: Type is the strategy that will dictate what SELinux context is used in the SecurityContext. + type: string + nullable: true + seccompProfiles: + description: "SeccompProfiles lists the allowed profiles that may be set for the pod or container's seccomp annotations. An unset (nil) or empty value means that no profiles may be specifid by the pod or container.\tThe wildcard '*' may be used to allow all profiles. When used to generate a value for a pod the first non-wildcard profile will be used as the default." + type: array + items: type: string - nullable: true - users: - description: The users who have permissions to use this security context - constraints - type: array - items: - type: string - nullable: true - volumes: - description: Volumes is a white list of allowed volume plugins. FSType - corresponds directly with the field names of a VolumeSource (azureFile, - configMap, emptyDir). To allow all volumes you may use "*". To allow - no volumes, set to ["none"]. - type: array - items: - description: FS Type gives strong typing to different file systems that - are used by volumes. - type: string - nullable: true + nullable: true + supplementalGroups: + description: SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. + type: object + properties: + ranges: + description: Ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end. + type: array + items: + description: 'IDRange provides a min/max of an allowed range of IDs. TODO: this could be reused for UIDs.' + type: object + properties: + max: + description: Max is the end of the range, inclusive. + type: integer + format: int64 + min: + description: Min is the start of the range, inclusive. + type: integer + format: int64 + type: + description: Type is the strategy that will dictate what supplemental groups is used in the SecurityContext. + type: string + nullable: true + users: + description: The users who have permissions to use this security context constraints + type: array + items: + type: string + nullable: true + volumes: + description: Volumes is a white list of allowed volume plugins. FSType corresponds directly with the field names of a VolumeSource (azureFile, configMap, emptyDir). To allow all volumes you may use "*". To allow no volumes, set to ["none"]. + type: array + items: + description: FS Type gives strong typing to different file systems that are used by volumes. + type: string + nullable: true + served: true + storage: true diff --git a/vendor/github.com/openshift/api/security/v1/Makefile b/vendor/github.com/openshift/api/security/v1/Makefile new file mode 100644 index 00000000..096e6fa2 --- /dev/null +++ b/vendor/github.com/openshift/api/security/v1/Makefile @@ -0,0 +1,3 @@ +.PHONY: test +test: + make -C ../../tests test GINKGO_EXTRA_ARGS=--focus="security.openshift.io/v1" diff --git a/vendor/github.com/openshift/api/security/v1/generated.pb.go b/vendor/github.com/openshift/api/security/v1/generated.pb.go index 7ee402af..d57b162c 100644 --- a/vendor/github.com/openshift/api/security/v1/generated.pb.go +++ b/vendor/github.com/openshift/api/security/v1/generated.pb.go @@ -592,117 +592,117 @@ func init() { } var fileDescriptor_af65d9655aa67551 = []byte{ - // 1748 bytes of a gzipped FileDescriptorProto + // 1750 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6f, 0x1c, 0x49, - 0x15, 0x77, 0x7b, 0xfc, 0x35, 0x65, 0xc7, 0x1f, 0x65, 0xc7, 0xe9, 0x35, 0xeb, 0x19, 0xd3, 0x0e, - 0x2b, 0x0b, 0xd8, 0x19, 0x1c, 0x2d, 0x6c, 0xd0, 0xb2, 0xd1, 0x4e, 0x7b, 0xd6, 0x59, 0x23, 0x27, - 0x99, 0xad, 0x59, 0x47, 0x28, 0x8a, 0x10, 0xe5, 0x9e, 0x9a, 0x71, 0xc5, 0xfd, 0x45, 0x57, 0xf5, - 0xc4, 0x23, 0x2e, 0x91, 0xb8, 0x70, 0x44, 0xe2, 0x8a, 0x38, 0xc3, 0x3f, 0xc0, 0x05, 0x01, 0xd7, - 0x48, 0x20, 0x91, 0x13, 0xca, 0x69, 0x44, 0x06, 0x71, 0xe2, 0xc8, 0x2d, 0x27, 0x54, 0x35, 0x35, - 0x1f, 0xdd, 0xd3, 0x3d, 0x9e, 0x84, 0x24, 0xe2, 0x36, 0xfd, 0x3e, 0x7e, 0xbf, 0xf7, 0x5e, 0xbf, - 0x7e, 0xf5, 0x6a, 0xc0, 0x47, 0x0d, 0xca, 0xcf, 0xc2, 0xd3, 0x82, 0xe5, 0x39, 0x45, 0xcf, 0x27, - 0x2e, 0x3b, 0xa3, 0x75, 0x5e, 0xc4, 0x3e, 0x2d, 0x32, 0x62, 0x85, 0x01, 0xe5, 0xad, 0x62, 0x73, - 0xbf, 0xd8, 0x20, 0x2e, 0x09, 0x30, 0x27, 0xb5, 0x82, 0x1f, 0x78, 0xdc, 0x83, 0xd7, 0x07, 0x5e, - 0x85, 0xbe, 0x57, 0x01, 0xfb, 0xb4, 0xd0, 0xf3, 0x2a, 0x34, 0xf7, 0xb7, 0x3e, 0x1c, 0xc2, 0x6e, - 0x78, 0x0d, 0xaf, 0x28, 0x9d, 0x4f, 0xc3, 0xba, 0x7c, 0x92, 0x0f, 0xf2, 0x57, 0x17, 0x74, 0xcb, - 0x38, 0xbf, 0xc9, 0x0a, 0xd4, 0x93, 0xe4, 0x96, 0x17, 0x90, 0x04, 0xe2, 0xad, 0x8f, 0x06, 0x36, - 0x0e, 0xb6, 0xce, 0xa8, 0x4b, 0x82, 0x56, 0xd1, 0x3f, 0x6f, 0x08, 0x01, 0x2b, 0x3a, 0x84, 0xe3, - 0x24, 0xaf, 0xef, 0xa5, 0x79, 0x05, 0xa1, 0xcb, 0xa9, 0x43, 0x8a, 0xcc, 0x3a, 0x23, 0x0e, 0x8e, - 0xfb, 0x19, 0x9f, 0x80, 0xb5, 0x92, 0x6d, 0x7b, 0x8f, 0x49, 0xed, 0xd0, 0x26, 0x17, 0xf7, 0x3d, - 0x3b, 0x74, 0x08, 0xfc, 0x00, 0xcc, 0xd5, 0x02, 0xda, 0x24, 0x81, 0xae, 0xed, 0x68, 0x7b, 0x59, - 0x73, 0xf9, 0x69, 0x3b, 0x3f, 0xd5, 0x69, 0xe7, 0xe7, 0xca, 0x52, 0x8a, 0x94, 0xd6, 0xf8, 0xad, - 0x06, 0x36, 0x0f, 0xab, 0xb7, 0x03, 0x2f, 0xf4, 0xab, 0x5c, 0xa0, 0x36, 0x5a, 0xf7, 0x7c, 0x4e, - 0x3d, 0x97, 0xc1, 0x8f, 0xc1, 0x0c, 0x6f, 0xf9, 0x44, 0x01, 0xec, 0x2a, 0x80, 0x99, 0xaf, 0x5a, - 0x3e, 0x79, 0xd9, 0xce, 0xaf, 0xc7, 0xbc, 0x84, 0x18, 0x49, 0x07, 0x78, 0x02, 0xe6, 0x02, 0xec, - 0x36, 0x08, 0xd3, 0xa7, 0x77, 0x32, 0x7b, 0x8b, 0x37, 0x3e, 0x2c, 0x4c, 0xf2, 0x22, 0x0a, 0x47, - 0x65, 0x24, 0xbc, 0x06, 0xa1, 0xca, 0x47, 0x86, 0x14, 0x98, 0x71, 0x1b, 0xcc, 0x2b, 0x13, 0xb8, - 0x0d, 0x32, 0x0e, 0x75, 0x65, 0x64, 0x19, 0x73, 0x51, 0xd9, 0x67, 0xee, 0x50, 0x17, 0x09, 0xb9, - 0x54, 0xe3, 0x0b, 0x7d, 0x3a, 0xa6, 0xc6, 0x17, 0x48, 0xc8, 0x8d, 0x7f, 0x6b, 0xe0, 0x5a, 0xc5, - 0xab, 0x55, 0x15, 0x77, 0xc5, 0xb3, 0xa9, 0xd5, 0x42, 0xa4, 0x49, 0xc9, 0x63, 0x68, 0x81, 0x19, - 0xe6, 0x13, 0x4b, 0x42, 0x2f, 0xde, 0x28, 0x4d, 0x16, 0x79, 0x0a, 0x58, 0xd5, 0x27, 0x96, 0xb9, - 0xd4, 0xab, 0x9b, 0x78, 0x42, 0x12, 0x1c, 0x9e, 0x83, 0x39, 0xc6, 0x31, 0x0f, 0x99, 0x0c, 0x71, - 0xf1, 0xc6, 0xc1, 0xff, 0x46, 0x23, 0xa1, 0x06, 0x65, 0xeb, 0x3e, 0x23, 0x45, 0x61, 0xfc, 0x41, - 0x03, 0x5f, 0x1b, 0x13, 0x20, 0xfc, 0x12, 0x2c, 0x70, 0xe2, 0xf8, 0x36, 0xe6, 0x44, 0x65, 0xbd, - 0x5b, 0xe8, 0x76, 0xa2, 0x0c, 0x40, 0xf4, 0xb8, 0x22, 0xff, 0x4a, 0x99, 0xc9, 0xbc, 0x56, 0x15, - 0xdd, 0x42, 0x4f, 0x8a, 0xfa, 0x30, 0xf0, 0x08, 0xac, 0x33, 0x12, 0x34, 0xa9, 0x45, 0x4a, 0x96, - 0xe5, 0x85, 0x2e, 0xbf, 0x8b, 0x1d, 0xd5, 0x0d, 0x59, 0xf3, 0x5a, 0xa7, 0x9d, 0x5f, 0xaf, 0x8e, - 0xaa, 0x51, 0x92, 0x8f, 0xf1, 0x17, 0x0d, 0x6c, 0x8f, 0xcd, 0x1b, 0xfe, 0x4e, 0x03, 0x9b, 0xb8, - 0xdb, 0xff, 0x51, 0x54, 0xa6, 0x6b, 0xb2, 0xfd, 0xbe, 0x9c, 0xac, 0xba, 0x51, 0xe7, 0xf1, 0xb5, - 0xce, 0xa9, 0xe4, 0x37, 0x4b, 0x89, 0xc4, 0x28, 0x25, 0x20, 0xe3, 0x17, 0xd3, 0xc0, 0x18, 0x41, - 0xae, 0x12, 0xbb, 0x5e, 0x0d, 0x4f, 0x1f, 0x11, 0x8b, 0xab, 0x26, 0x74, 0x23, 0x4d, 0x78, 0xfc, - 0x9a, 0xdd, 0x31, 0x82, 0x9b, 0xda, 0x8f, 0x41, 0xac, 0x1f, 0x7f, 0xf8, 0xba, 0x8c, 0x11, 0xb6, - 0xf1, 0x6d, 0xf9, 0x33, 0xf0, 0xc1, 0x64, 0x11, 0xbf, 0x85, 0x06, 0x35, 0x9e, 0x4c, 0x83, 0xdc, - 0xf8, 0xe8, 0xe1, 0xa3, 0xc8, 0x3b, 0xf8, 0xe2, 0x8d, 0x54, 0xe4, 0xff, 0xa9, 0xfe, 0x7f, 0xd4, - 0x92, 0x5a, 0xf1, 0x1d, 0x14, 0x1f, 0xee, 0x80, 0x99, 0x90, 0x91, 0x40, 0xe6, 0x9a, 0x1d, 0xd4, - 0xe3, 0x84, 0x91, 0x00, 0x49, 0x0d, 0x34, 0xc0, 0x5c, 0x43, 0x9c, 0x2d, 0x4c, 0xcf, 0xc8, 0x91, - 0x01, 0x44, 0xfc, 0xf2, 0xb4, 0x61, 0x48, 0x69, 0x8c, 0xff, 0x68, 0xe0, 0xfa, 0x24, 0x05, 0x80, - 0x15, 0x90, 0x55, 0x5f, 0xa3, 0xd9, 0x1a, 0x97, 0xc2, 0x3d, 0xe5, 0x5a, 0x27, 0x01, 0x71, 0x2d, - 0x62, 0x5e, 0xe9, 0xb4, 0xf3, 0xd9, 0x52, 0xcf, 0x13, 0x0d, 0x40, 0xc4, 0xd9, 0x1a, 0x10, 0xcc, - 0x3c, 0x57, 0xa5, 0x30, 0x38, 0xb0, 0xa4, 0x14, 0x29, 0x6d, 0xa4, 0x76, 0x99, 0x37, 0xd3, 0xb8, - 0xbf, 0xd7, 0xc0, 0x8a, 0x3c, 0x02, 0x45, 0x60, 0x16, 0x16, 0x07, 0x35, 0xfc, 0x09, 0x58, 0x10, - 0x2b, 0x45, 0x0d, 0x73, 0xac, 0xf2, 0xfb, 0xce, 0x10, 0x4d, 0x7f, 0x95, 0x28, 0xf8, 0xe7, 0x0d, - 0x21, 0x60, 0x05, 0x61, 0x3d, 0xc8, 0xf8, 0x0e, 0xe1, 0xd8, 0x84, 0x8a, 0x13, 0x0c, 0x64, 0xa8, - 0x8f, 0x0a, 0x77, 0xc1, 0xac, 0x3c, 0x83, 0x55, 0xbe, 0x57, 0x94, 0xf1, 0xac, 0x8c, 0x04, 0x75, - 0x75, 0xf0, 0x7d, 0x30, 0x23, 0x43, 0x10, 0x99, 0x2e, 0x99, 0x0b, 0xe2, 0x95, 0x96, 0x31, 0xc7, - 0x48, 0x4a, 0x8d, 0xbf, 0x69, 0x60, 0x3d, 0x16, 0xf8, 0x31, 0x65, 0x1c, 0x3e, 0x1c, 0x09, 0xbe, - 0x30, 0x59, 0xf0, 0xc2, 0x5b, 0x86, 0xde, 0x2f, 0x57, 0x4f, 0x32, 0x14, 0xf8, 0x03, 0x30, 0x4b, - 0x39, 0x71, 0x7a, 0x8b, 0xc8, 0x77, 0x27, 0xfb, 0xae, 0x62, 0x71, 0x0e, 0xf2, 0x3d, 0x12, 0x58, - 0xa8, 0x0b, 0x69, 0xfc, 0x5d, 0x03, 0x3a, 0x0a, 0xdd, 0x12, 0x13, 0x8d, 0x1b, 0xdf, 0x9d, 0xbe, - 0x1f, 0xd9, 0x9d, 0xbe, 0x11, 0xdb, 0x9d, 0xae, 0x8e, 0xf8, 0x0d, 0x6d, 0x4f, 0xef, 0x81, 0x4c, - 0x48, 0x6b, 0x6a, 0x79, 0x99, 0x17, 0x8b, 0xcb, 0xc9, 0x51, 0x19, 0x09, 0x19, 0xdc, 0x07, 0x8b, - 0x21, 0xad, 0xc9, 0xf0, 0xee, 0x50, 0x57, 0x56, 0x3a, 0x63, 0xae, 0x74, 0xda, 0xf9, 0xc5, 0x13, - 0xb5, 0x19, 0x89, 0x15, 0x68, 0xd8, 0x26, 0xe2, 0x82, 0x2f, 0xf4, 0x99, 0x04, 0x17, 0x7c, 0x81, - 0x86, 0x6d, 0x8c, 0x3f, 0x6b, 0x60, 0xbb, 0xfa, 0xf9, 0x31, 0x75, 0xc3, 0x8b, 0x03, 0xcf, 0xe5, - 0xe4, 0x82, 0xc7, 0xb3, 0xbb, 0x15, 0xc9, 0xee, 0x9b, 0xb1, 0xec, 0xb6, 0x92, 0x9d, 0x87, 0x52, - 0xfc, 0x31, 0x58, 0x66, 0x44, 0xda, 0x28, 0x44, 0x35, 0xf7, 0x8c, 0xa4, 0xcf, 0x43, 0xa1, 0x29, - 0x4b, 0x13, 0x76, 0xda, 0xf9, 0xe5, 0xa8, 0x0c, 0xc5, 0xd0, 0x8c, 0x5f, 0xaf, 0x81, 0xad, 0xde, - 0x60, 0x50, 0x51, 0x1c, 0x78, 0x2e, 0xe3, 0x01, 0xa6, 0x2e, 0x67, 0xef, 0xe0, 0x83, 0xd9, 0x03, - 0x0b, 0x7e, 0x40, 0x3d, 0xc1, 0x2f, 0x53, 0x9b, 0x35, 0x97, 0x44, 0x87, 0x56, 0x94, 0x0c, 0xf5, - 0xb5, 0xf0, 0x21, 0xd0, 0xe5, 0x60, 0xa9, 0x04, 0xb4, 0x49, 0x6d, 0xd2, 0x20, 0x35, 0x11, 0x30, - 0x16, 0x01, 0xc8, 0xf7, 0xbb, 0x60, 0xee, 0x28, 0x26, 0xbd, 0x94, 0x62, 0x87, 0x52, 0x11, 0x20, - 0x03, 0x9b, 0x35, 0x52, 0xc7, 0xa1, 0xcd, 0x4b, 0xb5, 0xda, 0x01, 0xf6, 0xf1, 0x29, 0xb5, 0x29, - 0xa7, 0x84, 0xe9, 0x33, 0x72, 0xb0, 0x7e, 0x22, 0x76, 0x98, 0x72, 0xa2, 0xc5, 0xcb, 0x76, 0x7e, - 0x7b, 0xf4, 0xaa, 0x53, 0xe8, 0x9b, 0xb4, 0x50, 0x0a, 0x34, 0x6c, 0x01, 0x3d, 0x20, 0x3f, 0x0d, - 0x69, 0x40, 0x6a, 0xe5, 0xc0, 0xf3, 0x23, 0xb4, 0xb3, 0x92, 0xf6, 0x53, 0x91, 0x0e, 0x4a, 0xb1, - 0xb9, 0x9c, 0x38, 0x15, 0x1e, 0x3e, 0x02, 0xeb, 0x6a, 0x4c, 0x47, 0x58, 0xe7, 0x24, 0xeb, 0x4d, - 0xb1, 0x78, 0x96, 0x46, 0xd5, 0x97, 0x13, 0x26, 0x81, 0xf6, 0xdf, 0xdc, 0x17, 0x1e, 0xe3, 0x65, - 0x1a, 0x74, 0xef, 0x5d, 0x15, 0x3b, 0x6c, 0x50, 0x57, 0x9f, 0x4f, 0x78, 0x73, 0x09, 0x76, 0x28, - 0x15, 0x01, 0x16, 0xc1, 0x7c, 0x53, 0x3e, 0x33, 0x7d, 0x41, 0x46, 0x7f, 0xb5, 0xd3, 0xce, 0xcf, - 0x77, 0x4d, 0x44, 0xc4, 0x73, 0x87, 0x55, 0xf9, 0x41, 0xf5, 0xac, 0xe0, 0xcf, 0x35, 0x00, 0x71, - 0xfc, 0x1a, 0xc8, 0xf4, 0xab, 0x72, 0xf0, 0x7d, 0x3c, 0xd9, 0xe0, 0x1b, 0xb9, 0x46, 0x9a, 0x5b, - 0x2a, 0x05, 0x38, 0xa2, 0x62, 0x28, 0x81, 0x0e, 0x96, 0xc1, 0x6a, 0x3f, 0xa5, 0xbb, 0x84, 0x3f, - 0xf6, 0x82, 0x73, 0x3d, 0x2b, 0x8b, 0xa1, 0x2b, 0xa4, 0xd5, 0x52, 0x4c, 0x8f, 0x46, 0x3c, 0xe0, - 0x2d, 0xb0, 0xdc, 0x97, 0x55, 0xbc, 0x80, 0x33, 0x1d, 0x48, 0x8c, 0x4d, 0x85, 0xb1, 0x5c, 0x8a, - 0x68, 0x51, 0xcc, 0x1a, 0xde, 0x04, 0x4b, 0x03, 0xc9, 0x51, 0x59, 0x5f, 0x94, 0xde, 0x1b, 0xca, - 0x7b, 0xa9, 0x34, 0xa4, 0x43, 0x11, 0xcb, 0x88, 0xe7, 0x51, 0xe5, 0x40, 0x5f, 0x4a, 0xf1, 0x3c, - 0xaa, 0x1c, 0xa0, 0x88, 0x25, 0x74, 0x40, 0xbe, 0xf7, 0x3d, 0x44, 0xbe, 0xc6, 0xcf, 0x99, 0x85, - 0x6d, 0x79, 0x8e, 0xe8, 0x9b, 0x12, 0x6c, 0xb7, 0xd3, 0xce, 0xe7, 0xcb, 0xe3, 0x4d, 0xd1, 0x65, - 0x58, 0xf0, 0x47, 0xf1, 0xb9, 0x31, 0xc4, 0x73, 0x4d, 0xf2, 0xbc, 0x3f, 0x3a, 0x33, 0x86, 0x08, - 0x52, 0xbd, 0x45, 0x23, 0xf5, 0xe6, 0xa9, 0x9a, 0x9d, 0xfa, 0x95, 0x57, 0xb9, 0xa5, 0x8e, 0x3d, - 0x3a, 0x06, 0xaf, 0x30, 0x6a, 0x86, 0x62, 0x94, 0xd0, 0x03, 0xd9, 0xa0, 0x77, 0x48, 0xea, 0xcb, - 0x92, 0xff, 0xd6, 0x84, 0xa7, 0x77, 0xca, 0x99, 0x6c, 0xae, 0x29, 0xea, 0x6c, 0xdf, 0x02, 0x0d, - 0x38, 0xe0, 0xaf, 0x34, 0x00, 0x59, 0xe8, 0xfb, 0x36, 0x71, 0x88, 0xcb, 0xb1, 0xdd, 0x5d, 0x37, - 0xf5, 0x15, 0x49, 0x7d, 0x7b, 0xc2, 0xd4, 0x47, 0xfc, 0xe3, 0x31, 0xf4, 0xbf, 0xa7, 0x51, 0x53, - 0x94, 0x40, 0x0f, 0x1b, 0x60, 0xbe, 0xce, 0xe4, 0x6f, 0x7d, 0x55, 0x46, 0xf2, 0x83, 0xc9, 0x22, - 0x49, 0xfe, 0x4b, 0xc7, 0x5c, 0x51, 0xf4, 0xf3, 0x4a, 0x8f, 0x7a, 0xe8, 0xf0, 0x3e, 0xd8, 0x0c, - 0x08, 0xae, 0xdd, 0x73, 0xed, 0x16, 0xf2, 0x3c, 0x7e, 0x48, 0x6d, 0xc2, 0x5a, 0x8c, 0x13, 0x47, - 0x5f, 0x93, 0xdd, 0xd4, 0xbf, 0xf1, 0xa2, 0x44, 0x2b, 0x94, 0xe2, 0x0d, 0xf3, 0x60, 0x56, 0xac, - 0xf4, 0x4c, 0x87, 0x72, 0x8a, 0x65, 0xc5, 0x1a, 0x25, 0xea, 0xcd, 0x50, 0x57, 0x3e, 0xb4, 0xeb, - 0xaf, 0xa7, 0xed, 0xfa, 0xf0, 0x53, 0xb0, 0xc2, 0x88, 0x65, 0x79, 0x8e, 0x5f, 0x09, 0xbc, 0xba, - 0x00, 0xd7, 0x37, 0xa4, 0xf1, 0x7a, 0xa7, 0x9d, 0x5f, 0xa9, 0x46, 0x55, 0x28, 0x6e, 0x0b, 0x8f, - 0xc1, 0x86, 0x1a, 0x55, 0x27, 0x2e, 0xc3, 0x75, 0x52, 0x6d, 0x31, 0x8b, 0xdb, 0x4c, 0xd7, 0x25, - 0x86, 0xde, 0x69, 0xe7, 0x37, 0x4a, 0x09, 0x7a, 0x94, 0xe8, 0x05, 0x3f, 0x03, 0xab, 0x75, 0x2f, - 0x38, 0xa5, 0xb5, 0x1a, 0x71, 0x7b, 0x48, 0xef, 0x49, 0xa4, 0x0d, 0x31, 0xde, 0x0e, 0x63, 0x3a, - 0x34, 0x62, 0x6d, 0xfc, 0x4b, 0x03, 0xb9, 0xf4, 0xf5, 0xe4, 0x1d, 0xac, 0xc5, 0x24, 0xba, 0x16, - 0x7f, 0x36, 0xe9, 0x1f, 0x24, 0x69, 0x21, 0xa7, 0x6c, 0xc8, 0xbf, 0x99, 0x06, 0xdf, 0x7a, 0x85, - 0x7f, 0x55, 0xe0, 0x5f, 0x35, 0x70, 0xdd, 0x9f, 0xe0, 0x4a, 0xa7, 0x2a, 0xf2, 0x26, 0x6f, 0xc9, - 0xdf, 0x56, 0x09, 0x4c, 0x74, 0xa5, 0x44, 0x13, 0x45, 0x29, 0xee, 0xb9, 0x2e, 0x76, 0x48, 0xfc, - 0x9e, 0x7b, 0x17, 0x3b, 0x04, 0x49, 0x8d, 0xf1, 0x27, 0x0d, 0x7c, 0xfd, 0xd2, 0x99, 0x01, 0xcd, - 0xc8, 0xb6, 0x5d, 0x88, 0x6d, 0xdb, 0xb9, 0x74, 0x80, 0xb7, 0xfe, 0x97, 0xac, 0xb9, 0xf7, 0xf4, - 0x45, 0x6e, 0xea, 0xd9, 0x8b, 0xdc, 0xd4, 0xf3, 0x17, 0xb9, 0xa9, 0x27, 0x9d, 0x9c, 0xf6, 0xb4, - 0x93, 0xd3, 0x9e, 0x75, 0x72, 0xda, 0xf3, 0x4e, 0x4e, 0xfb, 0x47, 0x27, 0xa7, 0xfd, 0xf2, 0x9f, - 0xb9, 0xa9, 0x07, 0xd3, 0xcd, 0xfd, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x93, 0x11, 0x3a, 0xff, - 0xc2, 0x17, 0x00, 0x00, + 0x15, 0x77, 0x7b, 0xfc, 0x35, 0x65, 0xc7, 0x1f, 0x65, 0xc7, 0xe9, 0x35, 0xeb, 0x19, 0xd3, 0x36, + 0xab, 0x08, 0xd8, 0x19, 0x12, 0x2d, 0x6c, 0xd0, 0xb2, 0xd1, 0x4e, 0x7b, 0xd6, 0x59, 0xaf, 0x9c, + 0x64, 0xb6, 0x66, 0xbd, 0x42, 0xab, 0x15, 0xa2, 0xdc, 0x53, 0x33, 0xae, 0xb8, 0xbf, 0xe8, 0xaa, + 0x76, 0x3c, 0xe2, 0x12, 0x89, 0x0b, 0x47, 0x24, 0xae, 0x88, 0x33, 0xfc, 0x03, 0x5c, 0x10, 0x70, + 0x8d, 0x04, 0x12, 0x39, 0xa1, 0x9c, 0x46, 0x64, 0x10, 0x27, 0x8e, 0xdc, 0x72, 0x42, 0x55, 0x53, + 0xf3, 0xd1, 0x3d, 0xdd, 0xe3, 0x4e, 0x48, 0xa2, 0xbd, 0x4d, 0xbf, 0x8f, 0xdf, 0xef, 0xbd, 0xd7, + 0xaf, 0x5f, 0xbd, 0x1a, 0xf0, 0x5e, 0x8b, 0xf2, 0xd3, 0xf0, 0xa4, 0x64, 0x79, 0x4e, 0xd9, 0xf3, + 0x89, 0xcb, 0x4e, 0x69, 0x93, 0x97, 0xb1, 0x4f, 0xcb, 0x8c, 0x58, 0x61, 0x40, 0x79, 0xbb, 0x7c, + 0x7e, 0xa3, 0xdc, 0x22, 0x2e, 0x09, 0x30, 0x27, 0x8d, 0x92, 0x1f, 0x78, 0xdc, 0x83, 0x7b, 0x43, + 0xaf, 0xd2, 0xc0, 0xab, 0x84, 0x7d, 0x5a, 0xea, 0x7b, 0x95, 0xce, 0x6f, 0x6c, 0xbd, 0x3b, 0x82, + 0xdd, 0xf2, 0x5a, 0x5e, 0x59, 0x3a, 0x9f, 0x84, 0x4d, 0xf9, 0x24, 0x1f, 0xe4, 0xaf, 0x1e, 0xe8, + 0x96, 0x71, 0x76, 0x8b, 0x95, 0xa8, 0x27, 0xc9, 0x2d, 0x2f, 0x20, 0x09, 0xc4, 0x5b, 0xef, 0x0d, + 0x6d, 0x1c, 0x6c, 0x9d, 0x52, 0x97, 0x04, 0xed, 0xb2, 0x7f, 0xd6, 0x12, 0x02, 0x56, 0x76, 0x08, + 0xc7, 0x49, 0x5e, 0x3f, 0x48, 0xf3, 0x0a, 0x42, 0x97, 0x53, 0x87, 0x94, 0x99, 0x75, 0x4a, 0x1c, + 0x1c, 0xf7, 0x33, 0x3e, 0x00, 0x6b, 0x15, 0xdb, 0xf6, 0x1e, 0x92, 0xc6, 0x81, 0x4d, 0x2e, 0xbe, + 0xf0, 0xec, 0xd0, 0x21, 0xf0, 0x1d, 0x30, 0xd7, 0x08, 0xe8, 0x39, 0x09, 0x74, 0x6d, 0x47, 0xbb, + 0x9e, 0x37, 0x97, 0x1f, 0x77, 0x8a, 0x53, 0xdd, 0x4e, 0x71, 0xae, 0x2a, 0xa5, 0x48, 0x69, 0x8d, + 0xdf, 0x69, 0x60, 0xf3, 0xa0, 0x7e, 0x27, 0xf0, 0x42, 0xbf, 0xce, 0x05, 0x6a, 0xab, 0x7d, 0xdf, + 0xe7, 0xd4, 0x73, 0x19, 0x7c, 0x1f, 0xcc, 0xf0, 0xb6, 0x4f, 0x14, 0xc0, 0xae, 0x02, 0x98, 0xf9, + 0xbc, 0xed, 0x93, 0xe7, 0x9d, 0xe2, 0x7a, 0xcc, 0x4b, 0x88, 0x91, 0x74, 0x80, 0xc7, 0x60, 0x2e, + 0xc0, 0x6e, 0x8b, 0x30, 0x7d, 0x7a, 0x27, 0x77, 0x7d, 0xf1, 0xe6, 0xbb, 0xa5, 0x2c, 0x2f, 0xa2, + 0x74, 0x58, 0x45, 0xc2, 0x6b, 0x18, 0xaa, 0x7c, 0x64, 0x48, 0x81, 0x19, 0x77, 0xc0, 0xbc, 0x32, + 0x81, 0xdb, 0x20, 0xe7, 0x50, 0x57, 0x46, 0x96, 0x33, 0x17, 0x95, 0x7d, 0xee, 0x2e, 0x75, 0x91, + 0x90, 0x4b, 0x35, 0xbe, 0xd0, 0xa7, 0x63, 0x6a, 0x7c, 0x81, 0x84, 0xdc, 0xf8, 0x8f, 0x06, 0xae, + 0xd5, 0xbc, 0x46, 0x5d, 0x71, 0xd7, 0x3c, 0x9b, 0x5a, 0x6d, 0x44, 0xce, 0x29, 0x79, 0x08, 0x2d, + 0x30, 0xc3, 0x7c, 0x62, 0x49, 0xe8, 0xc5, 0x9b, 0x95, 0x6c, 0x91, 0xa7, 0x80, 0xd5, 0x7d, 0x62, + 0x99, 0x4b, 0xfd, 0xba, 0x89, 0x27, 0x24, 0xc1, 0xe1, 0x19, 0x98, 0x63, 0x1c, 0xf3, 0x90, 0xc9, + 0x10, 0x17, 0x6f, 0xee, 0xff, 0x7f, 0x34, 0x12, 0x6a, 0x58, 0xb6, 0xde, 0x33, 0x52, 0x14, 0xc6, + 0x1f, 0x35, 0xf0, 0x8d, 0x09, 0x01, 0xc2, 0xcf, 0xc0, 0x02, 0x27, 0x8e, 0x6f, 0x63, 0x4e, 0x54, + 0xd6, 0xbb, 0xa5, 0x5e, 0x27, 0xca, 0x00, 0x44, 0x8f, 0x2b, 0xf2, 0xcf, 0x95, 0x99, 0xcc, 0x6b, + 0x55, 0xd1, 0x2d, 0xf4, 0xa5, 0x68, 0x00, 0x03, 0x0f, 0xc1, 0x3a, 0x23, 0xc1, 0x39, 0xb5, 0x48, + 0xc5, 0xb2, 0xbc, 0xd0, 0xe5, 0xf7, 0xb0, 0xa3, 0xba, 0x21, 0x6f, 0x5e, 0xeb, 0x76, 0x8a, 0xeb, + 0xf5, 0x71, 0x35, 0x4a, 0xf2, 0x31, 0xfe, 0xaa, 0x81, 0xed, 0x89, 0x79, 0xc3, 0xdf, 0x6b, 0x60, + 0x13, 0xf7, 0xfa, 0x3f, 0x8a, 0xca, 0x74, 0x4d, 0xb6, 0xdf, 0x67, 0xd9, 0xaa, 0x1b, 0x75, 0x9e, + 0x5c, 0xeb, 0x82, 0x4a, 0x7e, 0xb3, 0x92, 0x48, 0x8c, 0x52, 0x02, 0x32, 0x7e, 0x39, 0x0d, 0x8c, + 0x31, 0xe4, 0x3a, 0xb1, 0x9b, 0xf5, 0xf0, 0xe4, 0x01, 0xb1, 0xb8, 0x6a, 0x42, 0x37, 0xd2, 0x84, + 0x47, 0x2f, 0xd9, 0x1d, 0x63, 0xb8, 0xa9, 0xfd, 0x18, 0xc4, 0xfa, 0xf1, 0xd3, 0x97, 0x65, 0x8c, + 0xb0, 0x4d, 0x6e, 0xcb, 0x9f, 0x83, 0x77, 0xb2, 0x45, 0xfc, 0x1a, 0x1a, 0xd4, 0x78, 0x34, 0x0d, + 0x0a, 0x93, 0xa3, 0x87, 0x0f, 0x22, 0xef, 0xe0, 0x93, 0x57, 0x52, 0x91, 0xaf, 0x53, 0xfd, 0xff, + 0xa4, 0x25, 0xb5, 0xe2, 0x1b, 0x28, 0x3e, 0xdc, 0x01, 0x33, 0x21, 0x23, 0x81, 0xcc, 0x35, 0x3f, + 0xac, 0xc7, 0x31, 0x23, 0x01, 0x92, 0x1a, 0x68, 0x80, 0xb9, 0x96, 0x38, 0x5b, 0x98, 0x9e, 0x93, + 0x23, 0x03, 0x88, 0xf8, 0xe5, 0x69, 0xc3, 0x90, 0xd2, 0x18, 0xff, 0xd5, 0xc0, 0x5e, 0x96, 0x02, + 0xc0, 0x1a, 0xc8, 0xab, 0xaf, 0xd1, 0x6c, 0x4f, 0x4a, 0xe1, 0xbe, 0x72, 0x6d, 0x92, 0x80, 0xb8, + 0x16, 0x31, 0xaf, 0x74, 0x3b, 0xc5, 0x7c, 0xa5, 0xef, 0x89, 0x86, 0x20, 0xe2, 0x6c, 0x0d, 0x08, + 0x66, 0x9e, 0xab, 0x52, 0x18, 0x1e, 0x58, 0x52, 0x8a, 0x94, 0x36, 0x52, 0xbb, 0xdc, 0xab, 0x69, + 0xdc, 0x3f, 0x68, 0x60, 0x45, 0x1e, 0x81, 0x22, 0x30, 0x0b, 0x8b, 0x83, 0x1a, 0xfe, 0x14, 0x2c, + 0x88, 0x95, 0xa2, 0x81, 0x39, 0x56, 0xf9, 0x7d, 0x6f, 0x84, 0x66, 0xb0, 0x4a, 0x94, 0xfc, 0xb3, + 0x96, 0x10, 0xb0, 0x92, 0xb0, 0x1e, 0x66, 0x7c, 0x97, 0x70, 0x6c, 0x42, 0xc5, 0x09, 0x86, 0x32, + 0x34, 0x40, 0x85, 0xbb, 0x60, 0x56, 0x9e, 0xc1, 0x2a, 0xdf, 0x2b, 0xca, 0x78, 0x56, 0x46, 0x82, + 0x7a, 0x3a, 0xf8, 0x36, 0x98, 0x91, 0x21, 0x88, 0x4c, 0x97, 0xcc, 0x05, 0xf1, 0x4a, 0xab, 0x98, + 0x63, 0x24, 0xa5, 0xc6, 0xdf, 0x35, 0xb0, 0x1e, 0x0b, 0xfc, 0x88, 0x32, 0x0e, 0xbf, 0x1a, 0x0b, + 0xbe, 0x94, 0x2d, 0x78, 0xe1, 0x2d, 0x43, 0x1f, 0x94, 0xab, 0x2f, 0x19, 0x09, 0xfc, 0x4b, 0x30, + 0x4b, 0x39, 0x71, 0xfa, 0x8b, 0xc8, 0xf7, 0xb3, 0x7d, 0x57, 0xb1, 0x38, 0x87, 0xf9, 0x1e, 0x0a, + 0x2c, 0xd4, 0x83, 0x34, 0xfe, 0xa1, 0x01, 0x1d, 0x85, 0x6e, 0x85, 0x89, 0xc6, 0x8d, 0xef, 0x4e, + 0x3f, 0x8c, 0xec, 0x4e, 0xdf, 0x8a, 0xed, 0x4e, 0x57, 0xc7, 0xfc, 0x46, 0xb6, 0xa7, 0xb7, 0x40, + 0x2e, 0xa4, 0x0d, 0xb5, 0xbc, 0xcc, 0x8b, 0xc5, 0xe5, 0xf8, 0xb0, 0x8a, 0x84, 0x0c, 0xde, 0x00, + 0x8b, 0x21, 0x6d, 0xc8, 0xf0, 0xee, 0x52, 0x57, 0x56, 0x3a, 0x67, 0xae, 0x74, 0x3b, 0xc5, 0xc5, + 0x63, 0xb5, 0x19, 0x89, 0x15, 0x68, 0xd4, 0x26, 0xe2, 0x82, 0x2f, 0xf4, 0x99, 0x04, 0x17, 0x7c, + 0x81, 0x46, 0x6d, 0x8c, 0xbf, 0x68, 0x60, 0xbb, 0xfe, 0xf1, 0x11, 0x75, 0xc3, 0x8b, 0x7d, 0xcf, + 0xe5, 0xe4, 0x82, 0xc7, 0xb3, 0xbb, 0x1d, 0xc9, 0xee, 0xdb, 0xb1, 0xec, 0xb6, 0x92, 0x9d, 0x47, + 0x52, 0xfc, 0x09, 0x58, 0x66, 0x44, 0xda, 0x28, 0x44, 0x35, 0xf7, 0x8c, 0xa4, 0xcf, 0x43, 0xa1, + 0x29, 0x4b, 0x13, 0x76, 0x3b, 0xc5, 0xe5, 0xa8, 0x0c, 0xc5, 0xd0, 0x8c, 0xdf, 0xac, 0x81, 0xad, + 0xfe, 0x60, 0x50, 0x51, 0xec, 0x7b, 0x2e, 0xe3, 0x01, 0xa6, 0x2e, 0x67, 0x6f, 0xe0, 0x83, 0xb9, + 0x0e, 0x16, 0xfc, 0x80, 0x7a, 0x82, 0x5f, 0xa6, 0x36, 0x6b, 0x2e, 0x89, 0x0e, 0xad, 0x29, 0x19, + 0x1a, 0x68, 0xe1, 0x57, 0x40, 0x97, 0x83, 0xa5, 0x16, 0xd0, 0x73, 0x6a, 0x93, 0x16, 0x69, 0x88, + 0x80, 0xb1, 0x08, 0x40, 0xbe, 0xdf, 0x05, 0x73, 0x47, 0x31, 0xe9, 0x95, 0x14, 0x3b, 0x94, 0x8a, + 0x00, 0x19, 0xd8, 0x6c, 0x90, 0x26, 0x0e, 0x6d, 0x5e, 0x69, 0x34, 0xf6, 0xb1, 0x8f, 0x4f, 0xa8, + 0x4d, 0x39, 0x25, 0x4c, 0x9f, 0x91, 0x83, 0xf5, 0x03, 0xb1, 0xc3, 0x54, 0x13, 0x2d, 0x9e, 0x77, + 0x8a, 0xdb, 0xe3, 0x57, 0x9d, 0xd2, 0xc0, 0xa4, 0x8d, 0x52, 0xa0, 0x61, 0x1b, 0xe8, 0x01, 0xf9, + 0x59, 0x48, 0x03, 0xd2, 0xa8, 0x06, 0x9e, 0x1f, 0xa1, 0x9d, 0x95, 0xb4, 0x1f, 0x8a, 0x74, 0x50, + 0x8a, 0xcd, 0xe5, 0xc4, 0xa9, 0xf0, 0xf0, 0x01, 0x58, 0x57, 0x63, 0x3a, 0xc2, 0x3a, 0x27, 0x59, + 0x6f, 0x89, 0xc5, 0xb3, 0x32, 0xae, 0xbe, 0x9c, 0x30, 0x09, 0x74, 0xf0, 0xe6, 0x3e, 0xf1, 0x18, + 0xaf, 0xd2, 0xa0, 0x77, 0xef, 0xaa, 0xd9, 0x61, 0x8b, 0xba, 0xfa, 0x7c, 0xc2, 0x9b, 0x4b, 0xb0, + 0x43, 0xa9, 0x08, 0xb0, 0x0c, 0xe6, 0xcf, 0xe5, 0x33, 0xd3, 0x17, 0x64, 0xf4, 0x57, 0xbb, 0x9d, + 0xe2, 0x7c, 0xcf, 0x44, 0x44, 0x3c, 0x77, 0x50, 0x97, 0x1f, 0x54, 0xdf, 0x0a, 0xfe, 0x42, 0x03, + 0x10, 0xc7, 0xaf, 0x81, 0x4c, 0xbf, 0x2a, 0x07, 0xdf, 0xfb, 0xd9, 0x06, 0xdf, 0xd8, 0x35, 0xd2, + 0xdc, 0x52, 0x29, 0xc0, 0x31, 0x15, 0x43, 0x09, 0x74, 0xb0, 0x0a, 0x56, 0x07, 0x29, 0xdd, 0x23, + 0xfc, 0xa1, 0x17, 0x9c, 0xe9, 0x79, 0x59, 0x0c, 0x5d, 0x21, 0xad, 0x56, 0x62, 0x7a, 0x34, 0xe6, + 0x01, 0x6f, 0x83, 0xe5, 0x81, 0xac, 0xe6, 0x05, 0x9c, 0xe9, 0x40, 0x62, 0x6c, 0x2a, 0x8c, 0xe5, + 0x4a, 0x44, 0x8b, 0x62, 0xd6, 0xf0, 0x16, 0x58, 0x1a, 0x4a, 0x0e, 0xab, 0xfa, 0xa2, 0xf4, 0xde, + 0x50, 0xde, 0x4b, 0x95, 0x11, 0x1d, 0x8a, 0x58, 0x46, 0x3c, 0x0f, 0x6b, 0xfb, 0xfa, 0x52, 0x8a, + 0xe7, 0x61, 0x6d, 0x1f, 0x45, 0x2c, 0xa1, 0x03, 0x8a, 0xfd, 0xef, 0x21, 0xf2, 0x35, 0x7e, 0xcc, + 0x2c, 0x6c, 0xcb, 0x73, 0x44, 0xdf, 0x94, 0x60, 0xbb, 0xdd, 0x4e, 0xb1, 0x58, 0x9d, 0x6c, 0x8a, + 0x2e, 0xc3, 0x82, 0x3f, 0x8e, 0xcf, 0x8d, 0x11, 0x9e, 0x6b, 0x92, 0xe7, 0xed, 0xf1, 0x99, 0x31, + 0x42, 0x90, 0xea, 0x2d, 0x1a, 0xa9, 0x3f, 0x4f, 0xd5, 0xec, 0xd4, 0xaf, 0xbc, 0xc8, 0x2d, 0x75, + 0xe2, 0xd1, 0x31, 0x7c, 0x85, 0x51, 0x33, 0x14, 0xa3, 0x84, 0x1e, 0xc8, 0x07, 0xfd, 0x43, 0x52, + 0x5f, 0x96, 0xfc, 0xb7, 0x33, 0x9e, 0xde, 0x29, 0x67, 0xb2, 0xb9, 0xa6, 0xa8, 0xf3, 0x03, 0x0b, + 0x34, 0xe4, 0x80, 0xbf, 0xd6, 0x00, 0x64, 0xa1, 0xef, 0xdb, 0xc4, 0x21, 0x2e, 0xc7, 0x76, 0x6f, + 0xdd, 0xd4, 0x57, 0x24, 0xf5, 0x9d, 0x8c, 0xa9, 0x8f, 0xf9, 0xc7, 0x63, 0x18, 0x7c, 0x4f, 0xe3, + 0xa6, 0x28, 0x81, 0x1e, 0xb6, 0xc0, 0x7c, 0x93, 0xc9, 0xdf, 0xfa, 0xaa, 0x8c, 0xe4, 0x47, 0xd9, + 0x22, 0x49, 0xfe, 0x4b, 0xc7, 0x5c, 0x51, 0xf4, 0xf3, 0x4a, 0x8f, 0xfa, 0xe8, 0xf0, 0x0b, 0xb0, + 0x19, 0x10, 0xdc, 0xb8, 0xef, 0xda, 0x6d, 0xe4, 0x79, 0xfc, 0x80, 0xda, 0x84, 0xb5, 0x19, 0x27, + 0x8e, 0xbe, 0x26, 0xbb, 0x69, 0x70, 0xe3, 0x45, 0x89, 0x56, 0x28, 0xc5, 0x1b, 0x16, 0xc1, 0xac, + 0x58, 0xe9, 0x99, 0x0e, 0xe5, 0x14, 0xcb, 0x8b, 0x35, 0x4a, 0xd4, 0x9b, 0xa1, 0x9e, 0x7c, 0x64, + 0xd7, 0x5f, 0x4f, 0xdb, 0xf5, 0xe1, 0x87, 0x60, 0x85, 0x11, 0xcb, 0xf2, 0x1c, 0xbf, 0x16, 0x78, + 0x4d, 0x01, 0xae, 0x6f, 0x48, 0xe3, 0xf5, 0x6e, 0xa7, 0xb8, 0x52, 0x8f, 0xaa, 0x50, 0xdc, 0x16, + 0x1e, 0x81, 0x0d, 0x35, 0xaa, 0x8e, 0x5d, 0x86, 0x9b, 0xa4, 0xde, 0x66, 0x16, 0xb7, 0x99, 0xae, + 0x4b, 0x0c, 0xbd, 0xdb, 0x29, 0x6e, 0x54, 0x12, 0xf4, 0x28, 0xd1, 0x0b, 0x7e, 0x04, 0x56, 0x9b, + 0x5e, 0x70, 0x42, 0x1b, 0x0d, 0xe2, 0xf6, 0x91, 0xde, 0x92, 0x48, 0x1b, 0x62, 0xbc, 0x1d, 0xc4, + 0x74, 0x68, 0xcc, 0xda, 0xf8, 0xb7, 0x06, 0x0a, 0xe9, 0xeb, 0xc9, 0x1b, 0x58, 0x8b, 0x49, 0x74, + 0x2d, 0xfe, 0x28, 0xeb, 0x1f, 0x24, 0x69, 0x21, 0xa7, 0x6c, 0xc8, 0xbf, 0x9d, 0x06, 0xdf, 0x79, + 0x81, 0x7f, 0x55, 0xe0, 0xdf, 0x34, 0xb0, 0xe7, 0x67, 0xb8, 0xd2, 0xa9, 0x8a, 0xbc, 0xca, 0x5b, + 0xf2, 0x77, 0x55, 0x02, 0x99, 0xae, 0x94, 0x28, 0x53, 0x94, 0xe2, 0x9e, 0xeb, 0x62, 0x87, 0xc4, + 0xef, 0xb9, 0xf7, 0xb0, 0x43, 0x90, 0xd4, 0x18, 0x7f, 0xd6, 0xc0, 0x37, 0x2f, 0x9d, 0x19, 0xd0, + 0x8c, 0x6c, 0xdb, 0xa5, 0xd8, 0xb6, 0x5d, 0x48, 0x07, 0x78, 0xed, 0x7f, 0xc9, 0x9a, 0x9f, 0x3e, + 0x7e, 0x56, 0x98, 0x7a, 0xf2, 0xac, 0x30, 0xf5, 0xf4, 0x59, 0x61, 0xea, 0x51, 0xb7, 0xa0, 0x3d, + 0xee, 0x16, 0xb4, 0x27, 0xdd, 0x82, 0xf6, 0xb4, 0x5b, 0xd0, 0xfe, 0xd9, 0x2d, 0x68, 0xbf, 0xfa, + 0x57, 0x61, 0xea, 0xcb, 0xbd, 0x2c, 0xff, 0xde, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x31, + 0x4b, 0x4e, 0xe4, 0x17, 0x00, 0x00, } func (m *AllowedFlexVolume) Marshal() (dAtA []byte, err error) { @@ -2437,10 +2437,7 @@ func (m *AllowedFlexVolume) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2556,10 +2553,7 @@ func (m *FSGroupStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2647,10 +2641,7 @@ func (m *IDRange) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2766,10 +2757,7 @@ func (m *PodSecurityPolicyReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2884,10 +2872,7 @@ func (m *PodSecurityPolicyReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -2971,10 +2956,7 @@ func (m *PodSecurityPolicyReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3090,10 +3072,7 @@ func (m *PodSecurityPolicySelfSubjectReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3176,10 +3155,7 @@ func (m *PodSecurityPolicySelfSubjectReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3295,10 +3271,7 @@ func (m *PodSecurityPolicySubjectReview) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3445,10 +3418,7 @@ func (m *PodSecurityPolicySubjectReviewSpec) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3599,10 +3569,7 @@ func (m *PodSecurityPolicySubjectReviewStatus) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3751,10 +3718,7 @@ func (m *RangeAllocation) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -3871,10 +3835,7 @@ func (m *RangeAllocationList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4016,10 +3977,7 @@ func (m *RunAsUserStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4137,10 +4095,7 @@ func (m *SELinuxContextStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4879,10 +4834,7 @@ func (m *SecurityContextConstraints) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -4999,10 +4951,7 @@ func (m *SecurityContextConstraintsList) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5117,10 +5066,7 @@ func (m *ServiceAccountPodSecurityPolicyReviewStatus) Unmarshal(dAtA []byte) err if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { @@ -5236,10 +5182,7 @@ func (m *SupplementalGroupsStrategyOptions) Unmarshal(dAtA []byte) error { if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthGenerated } if (iNdEx + skippy) > l { diff --git a/vendor/github.com/openshift/api/security/v1/generated.proto b/vendor/github.com/openshift/api/security/v1/generated.proto index 53534b56..d842079a 100644 --- a/vendor/github.com/openshift/api/security/v1/generated.proto +++ b/vendor/github.com/openshift/api/security/v1/generated.proto @@ -10,7 +10,7 @@ import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; // Package-wide variables from generator "generated". -option go_package = "v1"; +option go_package = "github.com/openshift/api/security/v1"; // AllowedFlexVolume represents a single Flexvolume that is allowed to be used. message AllowedFlexVolume { @@ -39,6 +39,9 @@ message IDRange { } // PodSecurityPolicyReview checks which service accounts (not users, since that would be cluster-wide) can create the `PodTemplateSpec` in question. +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 message PodSecurityPolicyReview { // spec is the PodSecurityPolicy to check. optional PodSecurityPolicyReviewSpec spec = 1; @@ -69,6 +72,9 @@ message PodSecurityPolicyReviewStatus { } // PodSecurityPolicySelfSubjectReview checks whether this user/SA tuple can create the PodTemplateSpec +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 message PodSecurityPolicySelfSubjectReview { // spec defines specification the PodSecurityPolicySelfSubjectReview. optional PodSecurityPolicySelfSubjectReviewSpec spec = 1; @@ -84,6 +90,9 @@ message PodSecurityPolicySelfSubjectReviewSpec { } // PodSecurityPolicySubjectReview checks whether a particular user/SA tuple can create the PodTemplateSpec. +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 message PodSecurityPolicySubjectReview { // spec defines specification for the PodSecurityPolicySubjectReview. optional PodSecurityPolicySubjectReviewSpec spec = 1; @@ -124,7 +133,12 @@ message PodSecurityPolicySubjectReviewStatus { } // RangeAllocation is used so we can easily expose a RangeAllocation typed for security group +// +// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support. +// +openshift:compatibility-gen:level=4 message RangeAllocation { + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // range is a string representing a unique label for a range of uids, "1000000000-2000000000/10000". @@ -136,7 +150,12 @@ message RangeAllocation { } // RangeAllocationList is a list of RangeAllocations objects +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 message RangeAllocationList { + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; // List of RangeAllocations. @@ -174,6 +193,8 @@ message SELinuxContextStrategyOptions { // That exposure is deprecated and will be removed in a future release - users // should instead use the security.openshift.io group to manage // SecurityContextConstraints. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +kubebuilder:printcolumn:name="Priv",type=string,JSONPath=`.allowPrivilegedContainer`,description="Determines if a container can request to be run as privileged" // +kubebuilder:printcolumn:name="Caps",type=string,JSONPath=`.allowedCapabilities`,description="A list of capabilities that can be requested to add to the container" // +kubebuilder:printcolumn:name="SELinux",type=string,JSONPath=`.seLinuxContext.type`,description="Strategy that will dictate what labels will be set in the SecurityContext" @@ -184,7 +205,10 @@ message SELinuxContextStrategyOptions { // +kubebuilder:printcolumn:name="ReadOnlyRootFS",type=string,JSONPath=`.readOnlyRootFilesystem`,description="Force containers to run with a read only root file system" // +kubebuilder:printcolumn:name="Volumes",type=string,JSONPath=`.volumes`,description="White list of allowed volume plugins" // +kubebuilder:singular=securitycontextconstraint +// +openshift:compatibility-gen:level=1 message SecurityContextConstraints { + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Priority influences the sort order of SCCs when evaluating which SCCs to try first for @@ -324,7 +348,12 @@ message SecurityContextConstraints { } // SecurityContextConstraintsList is a list of SecurityContextConstraints objects +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 message SecurityContextConstraintsList { + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; // List of security context constraints. diff --git a/vendor/github.com/openshift/api/security/v1/stable.securitycontextconstraints.testsuite.yaml b/vendor/github.com/openshift/api/security/v1/stable.securitycontextconstraints.testsuite.yaml new file mode 100644 index 00000000..d663b94c --- /dev/null +++ b/vendor/github.com/openshift/api/security/v1/stable.securitycontextconstraints.testsuite.yaml @@ -0,0 +1,36 @@ +apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this +name: "[Stable] SecurityContextConstraints" +crd: 0000_03_security-openshift_01_scc.crd.yaml +tests: + onCreate: + - name: Should be able to create a minimal SecurityContextConstraints + initial: | + apiVersion: security.openshift.io/v1 + kind: SecurityContextConstraints + allowHostDirVolumePlugin: false + allowHostIPC: false + allowHostNetwork: false + allowHostPID: false + allowHostPorts: false + allowPrivilegedContainer: false + allowedCapabilities: [] + defaultAddCapabilities: [] + priority: 0 + readOnlyRootFilesystem: false + requiredDropCapabilities: [] + volumes: [] + expected: | + apiVersion: security.openshift.io/v1 + kind: SecurityContextConstraints + allowHostDirVolumePlugin: false + allowHostIPC: false + allowHostNetwork: false + allowHostPID: false + allowHostPorts: false + allowPrivilegedContainer: false + allowedCapabilities: [] + defaultAddCapabilities: [] + priority: 0 + readOnlyRootFilesystem: false + requiredDropCapabilities: [] + volumes: [] diff --git a/vendor/github.com/openshift/api/security/v1/types.go b/vendor/github.com/openshift/api/security/v1/types.go index 8cf82cc5..3e208210 100644 --- a/vendor/github.com/openshift/api/security/v1/types.go +++ b/vendor/github.com/openshift/api/security/v1/types.go @@ -20,6 +20,8 @@ var AllowAllCapabilities corev1.Capability = "*" // That exposure is deprecated and will be removed in a future release - users // should instead use the security.openshift.io group to manage // SecurityContextConstraints. +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). // +kubebuilder:printcolumn:name="Priv",type=string,JSONPath=`.allowPrivilegedContainer`,description="Determines if a container can request to be run as privileged" // +kubebuilder:printcolumn:name="Caps",type=string,JSONPath=`.allowedCapabilities`,description="A list of capabilities that can be requested to add to the container" // +kubebuilder:printcolumn:name="SELinux",type=string,JSONPath=`.seLinuxContext.type`,description="Strategy that will dictate what labels will be set in the SecurityContext" @@ -30,8 +32,12 @@ var AllowAllCapabilities corev1.Capability = "*" // +kubebuilder:printcolumn:name="ReadOnlyRootFS",type=string,JSONPath=`.readOnlyRootFilesystem`,description="Force containers to run with a read only root file system" // +kubebuilder:printcolumn:name="Volumes",type=string,JSONPath=`.volumes`,description="White list of allowed volume plugins" // +kubebuilder:singular=securitycontextconstraint +// +openshift:compatibility-gen:level=1 type SecurityContextConstraints struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Priority influences the sort order of SCCs when evaluating which SCCs to try first for @@ -287,8 +293,14 @@ const ( // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // SecurityContextConstraintsList is a list of SecurityContextConstraints objects +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type SecurityContextConstraintsList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // List of security context constraints. @@ -300,6 +312,9 @@ type SecurityContextConstraintsList struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PodSecurityPolicySubjectReview checks whether a particular user/SA tuple can create the PodTemplateSpec. +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 type PodSecurityPolicySubjectReview struct { metav1.TypeMeta `json:",inline"` @@ -346,6 +361,9 @@ type PodSecurityPolicySubjectReviewStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PodSecurityPolicySelfSubjectReview checks whether this user/SA tuple can create the PodTemplateSpec +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 type PodSecurityPolicySelfSubjectReview struct { metav1.TypeMeta `json:",inline"` @@ -367,6 +385,9 @@ type PodSecurityPolicySelfSubjectReviewSpec struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PodSecurityPolicyReview checks which service accounts (not users, since that would be cluster-wide) can create the `PodTemplateSpec` in question. +// +// Compatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=2 type PodSecurityPolicyReview struct { metav1.TypeMeta `json:",inline"` @@ -411,8 +432,14 @@ type ServiceAccountPodSecurityPolicyReviewStatus struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // RangeAllocation is used so we can easily expose a RangeAllocation typed for security group +// +// Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support. +// +openshift:compatibility-gen:level=4 type RangeAllocation struct { - metav1.TypeMeta `json:",inline"` + metav1.TypeMeta `json:",inline"` + + // metadata is the standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // range is a string representing a unique label for a range of uids, "1000000000-2000000000/10000". @@ -426,8 +453,14 @@ type RangeAllocation struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // RangeAllocationList is a list of RangeAllocations objects +// +// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer). +// +openshift:compatibility-gen:level=1 type RangeAllocationList struct { metav1.TypeMeta `json:",inline"` + + // metadata is the standard list's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // List of RangeAllocations. diff --git a/vendor/github.com/openshift/api/security/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/security/v1/zz_generated.deepcopy.go index e6587b04..26c88f7d 100644 --- a/vendor/github.com/openshift/api/security/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/security/v1/zz_generated.deepcopy.go @@ -1,3 +1,4 @@ +//go:build !ignore_autogenerated // +build !ignore_autogenerated // Code generated by deepcopy-gen. DO NOT EDIT. diff --git a/vendor/github.com/openshift/api/security/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/security/v1/zz_generated.swagger_doc_generated.go index 1077c040..a72b8ecf 100644 --- a/vendor/github.com/openshift/api/security/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/security/v1/zz_generated.swagger_doc_generated.go @@ -41,7 +41,7 @@ func (IDRange) SwaggerDoc() map[string]string { } var map_PodSecurityPolicyReview = map[string]string{ - "": "PodSecurityPolicyReview checks which service accounts (not users, since that would be cluster-wide) can create the `PodTemplateSpec` in question.", + "": "PodSecurityPolicyReview checks which service accounts (not users, since that would be cluster-wide) can create the `PodTemplateSpec` in question.\n\nCompatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer).", "spec": "spec is the PodSecurityPolicy to check.", "status": "status represents the current information/status for the PodSecurityPolicyReview.", } @@ -70,7 +70,7 @@ func (PodSecurityPolicyReviewStatus) SwaggerDoc() map[string]string { } var map_PodSecurityPolicySelfSubjectReview = map[string]string{ - "": "PodSecurityPolicySelfSubjectReview checks whether this user/SA tuple can create the PodTemplateSpec", + "": "PodSecurityPolicySelfSubjectReview checks whether this user/SA tuple can create the PodTemplateSpec\n\nCompatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer).", "spec": "spec defines specification the PodSecurityPolicySelfSubjectReview.", "status": "status represents the current information/status for the PodSecurityPolicySelfSubjectReview.", } @@ -89,7 +89,7 @@ func (PodSecurityPolicySelfSubjectReviewSpec) SwaggerDoc() map[string]string { } var map_PodSecurityPolicySubjectReview = map[string]string{ - "": "PodSecurityPolicySubjectReview checks whether a particular user/SA tuple can create the PodTemplateSpec.", + "": "PodSecurityPolicySubjectReview checks whether a particular user/SA tuple can create the PodTemplateSpec.\n\nCompatibility level 2: Stable within a major release for a minimum of 9 months or 3 minor releases (whichever is longer).", "spec": "spec defines specification for the PodSecurityPolicySubjectReview.", "status": "status represents the current information/status for the PodSecurityPolicySubjectReview.", } @@ -121,9 +121,10 @@ func (PodSecurityPolicySubjectReviewStatus) SwaggerDoc() map[string]string { } var map_RangeAllocation = map[string]string{ - "": "RangeAllocation is used so we can easily expose a RangeAllocation typed for security group", - "range": "range is a string representing a unique label for a range of uids, \"1000000000-2000000000/10000\".", - "data": "data is a byte array representing the serialized state of a range allocation. It is a bitmap with each bit set to one to represent a range is taken.", + "": "RangeAllocation is used so we can easily expose a RangeAllocation typed for security group\n\nCompatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "range": "range is a string representing a unique label for a range of uids, \"1000000000-2000000000/10000\".", + "data": "data is a byte array representing the serialized state of a range allocation. It is a bitmap with each bit set to one to represent a range is taken.", } func (RangeAllocation) SwaggerDoc() map[string]string { @@ -131,8 +132,9 @@ func (RangeAllocation) SwaggerDoc() map[string]string { } var map_RangeAllocationList = map[string]string{ - "": "RangeAllocationList is a list of RangeAllocations objects", - "items": "List of RangeAllocations.", + "": "RangeAllocationList is a list of RangeAllocations objects\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "List of RangeAllocations.", } func (RangeAllocationList) SwaggerDoc() map[string]string { @@ -162,7 +164,8 @@ func (SELinuxContextStrategyOptions) SwaggerDoc() map[string]string { } var map_SecurityContextConstraints = map[string]string{ - "": "SecurityContextConstraints governs the ability to make requests that affect the SecurityContext that will be applied to a container. For historical reasons SCC was exposed under the core Kubernetes API group. That exposure is deprecated and will be removed in a future release - users should instead use the security.openshift.io group to manage SecurityContextConstraints.", + "": "SecurityContextConstraints governs the ability to make requests that affect the SecurityContext that will be applied to a container. For historical reasons SCC was exposed under the core Kubernetes API group. That exposure is deprecated and will be removed in a future release - users should instead use the security.openshift.io group to manage SecurityContextConstraints.\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", "priority": "Priority influences the sort order of SCCs when evaluating which SCCs to try first for a given pod request based on access in the Users and Groups fields. The higher the int, the higher priority. An unset value is considered a 0 priority. If scores for multiple SCCs are equal they will be sorted from most restrictive to least restrictive. If both priorities and restrictions are equal the SCCs will be sorted by name.", "allowPrivilegedContainer": "AllowPrivilegedContainer determines if a container can request to be run as privileged.", "defaultAddCapabilities": "DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capabiility in both DefaultAddCapabilities and RequiredDropCapabilities.", @@ -194,8 +197,9 @@ func (SecurityContextConstraints) SwaggerDoc() map[string]string { } var map_SecurityContextConstraintsList = map[string]string{ - "": "SecurityContextConstraintsList is a list of SecurityContextConstraints objects", - "items": "List of security context constraints.", + "": "SecurityContextConstraintsList is a list of SecurityContextConstraints objects\n\nCompatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).", + "metadata": "metadata is the standard list's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "List of security context constraints.", } func (SecurityContextConstraintsList) SwaggerDoc() map[string]string { diff --git a/vendor/github.com/pborman/uuid/time.go b/vendor/github.com/pborman/uuid/time.go index 5c0960d8..7286824d 100644 --- a/vendor/github.com/pborman/uuid/time.go +++ b/vendor/github.com/pborman/uuid/time.go @@ -29,7 +29,7 @@ func GetTime() (Time, uint16, error) { return guuid.GetTime() } // for func ClockSequence() int { return guuid.ClockSequence() } -// SetClockSeq sets the clock sequence to the lower 14 bits of seq. Setting to +// SetClockSequence sets the clock sequence to the lower 14 bits of seq. Setting to // -1 causes a new sequence to be generated. func SetClockSequence(seq int) { guuid.SetClockSequence(seq) } diff --git a/vendor/github.com/pborman/uuid/version4.go b/vendor/github.com/pborman/uuid/version4.go index b459d46d..767dd0c3 100644 --- a/vendor/github.com/pborman/uuid/version4.go +++ b/vendor/github.com/pborman/uuid/version4.go @@ -6,7 +6,7 @@ package uuid import guuid "github.com/google/uuid" -// Random returns a Random (Version 4) UUID or panics. +// NewRandom returns a Random (Version 4) UUID or panics. // // The strength of the UUIDs is based on the strength of the crypto/rand // package. diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 3bb22a97..95d8e59d 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -1,6 +1,7 @@ package assert import ( + "bytes" "fmt" "reflect" "time" @@ -32,7 +33,8 @@ var ( stringType = reflect.TypeOf("") - timeType = reflect.TypeOf(time.Time{}) + timeType = reflect.TypeOf(time.Time{}) + bytesType = reflect.TypeOf([]byte{}) ) func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { @@ -323,6 +325,26 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64) } + case reflect.Slice: + { + // We only care about the []byte type. + if !canConvert(obj1Value, bytesType) { + break + } + + // []byte can be compared! + bytesObj1, ok := obj1.([]byte) + if !ok { + bytesObj1 = obj1Value.Convert(bytesType).Interface().([]byte) + + } + bytesObj2, ok := obj2.([]byte) + if !ok { + bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte) + } + + return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true + } } return compareEqual, false diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go index df22c47f..da867903 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go @@ -9,7 +9,7 @@ package assert import "reflect" -// Wrapper around reflect.Value.CanConvert, for compatability +// Wrapper around reflect.Value.CanConvert, for compatibility // reasons. func canConvert(value reflect.Value, to reflect.Type) bool { return value.CanConvert(to) diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index 27e2420e..7880b8f9 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -736,6 +736,16 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) } +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return WithinRange(t, actual, start, end, append([]interface{}{msg}, args...)...) +} + // YAMLEqf asserts that two YAML strings are equivalent. func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index d9ea368d..339515b8 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -1461,6 +1461,26 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta return WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRangef(a.t, actual, start, end, msg, args...) +} + // YAMLEq asserts that two YAML strings are equivalent. func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 0357b223..fa1245b1 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -8,6 +8,7 @@ import ( "fmt" "math" "os" + "path/filepath" "reflect" "regexp" "runtime" @@ -144,7 +145,8 @@ func CallerInfo() []string { if len(parts) > 1 { dir := parts[len(parts)-2] if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { - callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + path, _ := filepath.Abs(file) + callers = append(callers, fmt.Sprintf("%s:%d", path, line)) } } @@ -563,16 +565,17 @@ func isEmpty(object interface{}) bool { switch objValue.Kind() { // collection types are empty when they have no element - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + case reflect.Chan, reflect.Map, reflect.Slice: return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty + // pointers are empty if nil or if the value they point to is empty case reflect.Ptr: if objValue.IsNil() { return true } deref := objValue.Elem().Interface() return isEmpty(deref) - // for all other types, compare against the zero value + // for all other types, compare against the zero value + // array types are empty when they match their zero-initialized state default: zero := reflect.Zero(objValue.Type()) return reflect.DeepEqual(object, zero.Interface()) @@ -815,7 +818,6 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok return true // we consider nil to be equal to the nil set } - subsetValue := reflect.ValueOf(subset) defer func() { if e := recover(); e != nil { ok = false @@ -825,14 +827,32 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok listKind := reflect.TypeOf(list).Kind() subsetKind := reflect.TypeOf(subset).Kind() - if listKind != reflect.Array && listKind != reflect.Slice { + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } - if subsetKind != reflect.Array && subsetKind != reflect.Slice { + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } + subsetValue := reflect.ValueOf(subset) + if subsetKind == reflect.Map && listKind == reflect.Map { + listValue := reflect.ValueOf(list) + subsetKeys := subsetValue.MapKeys() + + for i := 0; i < len(subsetKeys); i++ { + subsetKey := subsetKeys[i] + subsetElement := subsetValue.MapIndex(subsetKey).Interface() + listElement := listValue.MapIndex(subsetKey).Interface() + + if !ObjectsAreEqual(subsetElement, listElement) { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, subsetElement), msgAndArgs...) + } + } + + return true + } + for i := 0; i < subsetValue.Len(); i++ { element := subsetValue.Index(i).Interface() ok, found := containsElement(list, element) @@ -859,7 +879,6 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...) } - subsetValue := reflect.ValueOf(subset) defer func() { if e := recover(); e != nil { ok = false @@ -869,14 +888,32 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) listKind := reflect.TypeOf(list).Kind() subsetKind := reflect.TypeOf(subset).Kind() - if listKind != reflect.Array && listKind != reflect.Slice { + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } - if subsetKind != reflect.Array && subsetKind != reflect.Slice { + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } + subsetValue := reflect.ValueOf(subset) + if subsetKind == reflect.Map && listKind == reflect.Map { + listValue := reflect.ValueOf(list) + subsetKeys := subsetValue.MapKeys() + + for i := 0; i < len(subsetKeys); i++ { + subsetKey := subsetKeys[i] + subsetElement := subsetValue.MapIndex(subsetKey).Interface() + listElement := listValue.MapIndex(subsetKey).Interface() + + if !ObjectsAreEqual(subsetElement, listElement) { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) + } + for i := 0; i < subsetValue.Len(); i++ { element := subsetValue.Index(i).Interface() ok, found := containsElement(list, element) @@ -1109,6 +1146,27 @@ func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, return true } +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if end.Before(start) { + return Fail(t, "Start should be before end", msgAndArgs...) + } + + if actual.Before(start) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is before the range", actual, start, end), msgAndArgs...) + } else if actual.After(end) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is after the range", actual, start, end), msgAndArgs...) + } + + return true +} + func toFloat(x interface{}) (float64, bool) { var xf float64 xok := true diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go index 59c48277..880853f5 100644 --- a/vendor/github.com/stretchr/testify/require/require.go +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -1864,6 +1864,32 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim t.FailNow() } +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRange(t, actual, start, end, msgAndArgs...) { + return + } + t.FailNow() +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRangef(t, actual, start, end, msg, args...) { + return + } + t.FailNow() +} + // YAMLEq asserts that two YAML strings are equivalent. func YAMLEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go index 5bb07c89..960bf6f2 100644 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -1462,6 +1462,26 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRangef(a.t, actual, start, end, msg, args...) +} + // YAMLEq asserts that two YAML strings are equivalent. func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go index a2ecf5c3..93eb5ae6 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_generic.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_generic.go @@ -12,7 +12,7 @@ import ( "errors" "math/bits" - "golang.org/x/crypto/internal/subtle" + "golang.org/x/crypto/internal/alias" ) const ( @@ -189,7 +189,7 @@ func (s *Cipher) XORKeyStream(dst, src []byte) { panic("chacha20: output smaller than input") } dst = dst[:len(src)] - if subtle.InexactOverlap(dst, src) { + if alias.InexactOverlap(dst, src) { panic("chacha20: invalid buffer overlap") } diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go index c5898db4..4652247b 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.go @@ -15,6 +15,7 @@ const bufSize = 256 // xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only // be called when the vector facility is available. Implementation in asm_s390x.s. +// //go:noescape func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32) diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go index cda3fdd3..bc62161d 100644 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go @@ -9,7 +9,8 @@ package curve25519 // import "golang.org/x/crypto/curve25519" import ( "crypto/subtle" - "fmt" + "errors" + "strconv" "golang.org/x/crypto/curve25519/internal/field" ) @@ -124,10 +125,10 @@ func X25519(scalar, point []byte) ([]byte, error) { func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { var in [32]byte if l := len(scalar); l != 32 { - return nil, fmt.Errorf("bad scalar length: %d, expected %d", l, 32) + return nil, errors.New("bad scalar length: " + strconv.Itoa(l) + ", expected 32") } if l := len(point); l != 32 { - return nil, fmt.Errorf("bad point length: %d, expected %d", l, 32) + return nil, errors.New("bad point length: " + strconv.Itoa(l) + ", expected 32") } copy(in[:], scalar) if &point[0] == &Basepoint[0] { @@ -138,7 +139,7 @@ func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) { copy(base[:], point) ScalarMult(dst, &in, &base) if subtle.ConstantTimeCompare(dst[:], zero[:]) == 1 { - return nil, fmt.Errorf("bad input point: low order point") + return nil, errors.New("bad input point: low order point") } } return dst[:], nil diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go index 44dc8e8c..edcf163c 100644 --- a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go +++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go @@ -1,13 +1,16 @@ // Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT. +//go:build amd64 && gc && !purego // +build amd64,gc,!purego package field // feMul sets out = a * b. It works like feMulGeneric. +// //go:noescape func feMul(out *Element, a *Element, b *Element) // feSquare sets out = a * a. It works like feSquareGeneric. +// //go:noescape func feSquare(out *Element, a *Element) diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go index 71ad917d..a7828345 100644 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go @@ -1,13 +1,7 @@ -// Copyright 2016 The Go Authors. All rights reserved. +// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// In Go 1.13, the ed25519 package was promoted to the standard library as -// crypto/ed25519, and this package became a wrapper for the standard library one. -// -//go:build !go1.13 -// +build !go1.13 - // Package ed25519 implements the Ed25519 signature algorithm. See // https://ed25519.cr.yp.to/. // @@ -16,21 +10,15 @@ // representation includes a public key suffix to make multiple signing // operations with the same key more efficient. This package refers to the RFC // 8032 private key as the “seed”. +// +// Beginning with Go 1.13, the functionality of this package was moved to the +// standard library as crypto/ed25519. This package only acts as a compatibility +// wrapper. package ed25519 -// This code is a port of the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - import ( - "bytes" - "crypto" - cryptorand "crypto/rand" - "crypto/sha512" - "errors" + "crypto/ed25519" "io" - "strconv" - - "golang.org/x/crypto/ed25519/internal/edwards25519" ) const ( @@ -45,57 +33,21 @@ const ( ) // PublicKey is the type of Ed25519 public keys. -type PublicKey []byte +// +// This type is an alias for crypto/ed25519's PublicKey type. +// See the crypto/ed25519 package for the methods on this type. +type PublicKey = ed25519.PublicKey // PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. -type PrivateKey []byte - -// Public returns the PublicKey corresponding to priv. -func (priv PrivateKey) Public() crypto.PublicKey { - publicKey := make([]byte, PublicKeySize) - copy(publicKey, priv[32:]) - return PublicKey(publicKey) -} - -// Seed returns the private key seed corresponding to priv. It is provided for -// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds -// in this package. -func (priv PrivateKey) Seed() []byte { - seed := make([]byte, SeedSize) - copy(seed, priv[:32]) - return seed -} - -// Sign signs the given message with priv. -// Ed25519 performs two passes over messages to be signed and therefore cannot -// handle pre-hashed messages. Thus opts.HashFunc() must return zero to -// indicate the message hasn't been hashed. This can be achieved by passing -// crypto.Hash(0) as the value for opts. -func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) { - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("ed25519: cannot sign hashed message") - } - - return Sign(priv, message), nil -} +// +// This type is an alias for crypto/ed25519's PrivateKey type. +// See the crypto/ed25519 package for the methods on this type. +type PrivateKey = ed25519.PrivateKey // GenerateKey generates a public/private key pair using entropy from rand. // If rand is nil, crypto/rand.Reader will be used. func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { - if rand == nil { - rand = cryptorand.Reader - } - - seed := make([]byte, SeedSize) - if _, err := io.ReadFull(rand, seed); err != nil { - return nil, nil, err - } - - privateKey := NewKeyFromSeed(seed) - publicKey := make([]byte, PublicKeySize) - copy(publicKey, privateKey[32:]) - - return publicKey, privateKey, nil + return ed25519.GenerateKey(rand) } // NewKeyFromSeed calculates a private key from a seed. It will panic if @@ -103,121 +55,17 @@ func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { // with RFC 8032. RFC 8032's private keys correspond to seeds in this // package. func NewKeyFromSeed(seed []byte) PrivateKey { - if l := len(seed); l != SeedSize { - panic("ed25519: bad seed length: " + strconv.Itoa(l)) - } - - digest := sha512.Sum512(seed) - digest[0] &= 248 - digest[31] &= 127 - digest[31] |= 64 - - var A edwards25519.ExtendedGroupElement - var hBytes [32]byte - copy(hBytes[:], digest[:]) - edwards25519.GeScalarMultBase(&A, &hBytes) - var publicKeyBytes [32]byte - A.ToBytes(&publicKeyBytes) - - privateKey := make([]byte, PrivateKeySize) - copy(privateKey, seed) - copy(privateKey[32:], publicKeyBytes[:]) - - return privateKey + return ed25519.NewKeyFromSeed(seed) } // Sign signs the message with privateKey and returns a signature. It will // panic if len(privateKey) is not PrivateKeySize. func Sign(privateKey PrivateKey, message []byte) []byte { - if l := len(privateKey); l != PrivateKeySize { - panic("ed25519: bad private key length: " + strconv.Itoa(l)) - } - - h := sha512.New() - h.Write(privateKey[:32]) - - var digest1, messageDigest, hramDigest [64]byte - var expandedSecretKey [32]byte - h.Sum(digest1[:0]) - copy(expandedSecretKey[:], digest1[:]) - expandedSecretKey[0] &= 248 - expandedSecretKey[31] &= 63 - expandedSecretKey[31] |= 64 - - h.Reset() - h.Write(digest1[32:]) - h.Write(message) - h.Sum(messageDigest[:0]) - - var messageDigestReduced [32]byte - edwards25519.ScReduce(&messageDigestReduced, &messageDigest) - var R edwards25519.ExtendedGroupElement - edwards25519.GeScalarMultBase(&R, &messageDigestReduced) - - var encodedR [32]byte - R.ToBytes(&encodedR) - - h.Reset() - h.Write(encodedR[:]) - h.Write(privateKey[32:]) - h.Write(message) - h.Sum(hramDigest[:0]) - var hramDigestReduced [32]byte - edwards25519.ScReduce(&hramDigestReduced, &hramDigest) - - var s [32]byte - edwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced) - - signature := make([]byte, SignatureSize) - copy(signature[:], encodedR[:]) - copy(signature[32:], s[:]) - - return signature + return ed25519.Sign(privateKey, message) } // Verify reports whether sig is a valid signature of message by publicKey. It // will panic if len(publicKey) is not PublicKeySize. func Verify(publicKey PublicKey, message, sig []byte) bool { - if l := len(publicKey); l != PublicKeySize { - panic("ed25519: bad public key length: " + strconv.Itoa(l)) - } - - if len(sig) != SignatureSize || sig[63]&224 != 0 { - return false - } - - var A edwards25519.ExtendedGroupElement - var publicKeyBytes [32]byte - copy(publicKeyBytes[:], publicKey) - if !A.FromBytes(&publicKeyBytes) { - return false - } - edwards25519.FeNeg(&A.X, &A.X) - edwards25519.FeNeg(&A.T, &A.T) - - h := sha512.New() - h.Write(sig[:32]) - h.Write(publicKey[:]) - h.Write(message) - var digest [64]byte - h.Sum(digest[:0]) - - var hReduced [32]byte - edwards25519.ScReduce(&hReduced, &digest) - - var R edwards25519.ProjectiveGroupElement - var s [32]byte - copy(s[:], sig[32:]) - - // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in - // the range [0, order) in order to prevent signature malleability. - if !edwards25519.ScMinimal(&s) { - return false - } - - edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s) - - var checkR [32]byte - R.ToBytes(&checkR) - return bytes.Equal(sig[:32], checkR[:]) + return ed25519.Verify(publicKey, message, sig) } diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go b/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go deleted file mode 100644 index b5974dc8..00000000 --- a/vendor/golang.org/x/crypto/ed25519/ed25519_go113.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.13 -// +build go1.13 - -// Package ed25519 implements the Ed25519 signature algorithm. See -// https://ed25519.cr.yp.to/. -// -// These functions are also compatible with the “Ed25519” function defined in -// RFC 8032. However, unlike RFC 8032's formulation, this package's private key -// representation includes a public key suffix to make multiple signing -// operations with the same key more efficient. This package refers to the RFC -// 8032 private key as the “seed”. -// -// Beginning with Go 1.13, the functionality of this package was moved to the -// standard library as crypto/ed25519. This package only acts as a compatibility -// wrapper. -package ed25519 - -import ( - "crypto/ed25519" - "io" -) - -const ( - // PublicKeySize is the size, in bytes, of public keys as used in this package. - PublicKeySize = 32 - // PrivateKeySize is the size, in bytes, of private keys as used in this package. - PrivateKeySize = 64 - // SignatureSize is the size, in bytes, of signatures generated and verified by this package. - SignatureSize = 64 - // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. - SeedSize = 32 -) - -// PublicKey is the type of Ed25519 public keys. -// -// This type is an alias for crypto/ed25519's PublicKey type. -// See the crypto/ed25519 package for the methods on this type. -type PublicKey = ed25519.PublicKey - -// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. -// -// This type is an alias for crypto/ed25519's PrivateKey type. -// See the crypto/ed25519 package for the methods on this type. -type PrivateKey = ed25519.PrivateKey - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { - return ed25519.GenerateKey(rand) -} - -// NewKeyFromSeed calculates a private key from a seed. It will panic if -// len(seed) is not SeedSize. This function is provided for interoperability -// with RFC 8032. RFC 8032's private keys correspond to seeds in this -// package. -func NewKeyFromSeed(seed []byte) PrivateKey { - return ed25519.NewKeyFromSeed(seed) -} - -// Sign signs the message with privateKey and returns a signature. It will -// panic if len(privateKey) is not PrivateKeySize. -func Sign(privateKey PrivateKey, message []byte) []byte { - return ed25519.Sign(privateKey, message) -} - -// Verify reports whether sig is a valid signature of message by publicKey. It -// will panic if len(publicKey) is not PublicKeySize. -func Verify(publicKey PublicKey, message, sig []byte) bool { - return ed25519.Verify(publicKey, message, sig) -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go deleted file mode 100644 index e39f086c..00000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go +++ /dev/null @@ -1,1422 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package edwards25519 - -// These values are from the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// d is a constant in the Edwards curve equation. -var d = FieldElement{ - -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, -} - -// d2 is 2*d. -var d2 = FieldElement{ - -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199, -} - -// SqrtM1 is the square-root of -1 in the field. -var SqrtM1 = FieldElement{ - -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482, -} - -// A is a constant in the Montgomery-form of curve25519. -var A = FieldElement{ - 486662, 0, 0, 0, 0, 0, 0, 0, 0, 0, -} - -// bi contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var bi = [8]PreComputedGroupElement{ - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877}, - FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951}, - FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784}, - }, - { - FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436}, - FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918}, - FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877}, - }, - { - FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800}, - FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305}, - FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300}, - }, - { - FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876}, - FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619}, - FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683}, - }, -} - -// base contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var base = [32][8]PreComputedGroupElement{ - { - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303}, - FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081}, - FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540}, - FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397}, - FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777}, - FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737}, - FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726}, - FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955}, - FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425}, - }, - }, - { - { - FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171}, - FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510}, - FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660}, - }, - { - FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639}, - FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963}, - FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950}, - }, - { - FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568}, - FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335}, - FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628}, - }, - { - FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007}, - FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772}, - FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653}, - }, - { - FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567}, - FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686}, - FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372}, - }, - { - FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887}, - FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954}, - FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953}, - }, - { - FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833}, - FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532}, - FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876}, - }, - { - FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268}, - FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214}, - FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038}, - }, - }, - { - { - FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800}, - FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645}, - FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664}, - }, - { - FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933}, - FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182}, - FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222}, - }, - { - FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991}, - FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880}, - FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092}, - }, - { - FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295}, - FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788}, - FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553}, - }, - { - FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026}, - FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347}, - FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033}, - }, - { - FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395}, - FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278}, - FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890}, - }, - { - FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995}, - FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596}, - FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891}, - }, - { - FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060}, - FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608}, - FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606}, - }, - }, - { - { - FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389}, - FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016}, - FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341}, - }, - { - FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505}, - FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553}, - FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655}, - }, - { - FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220}, - FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631}, - FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099}, - }, - { - FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556}, - FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749}, - FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930}, - }, - { - FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391}, - FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253}, - FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066}, - }, - { - FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958}, - FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082}, - FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383}, - }, - { - FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521}, - FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807}, - FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948}, - }, - { - FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134}, - FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455}, - FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629}, - }, - }, - { - { - FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069}, - FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746}, - FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919}, - }, - { - FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837}, - FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906}, - FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771}, - }, - { - FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817}, - FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098}, - FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409}, - }, - { - FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504}, - FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727}, - FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420}, - }, - { - FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003}, - FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605}, - FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384}, - }, - { - FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701}, - FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683}, - FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708}, - }, - { - FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563}, - FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260}, - FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387}, - }, - { - FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672}, - FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686}, - FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665}, - }, - }, - { - { - FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182}, - FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277}, - FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628}, - }, - { - FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474}, - FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539}, - FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822}, - }, - { - FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970}, - FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756}, - FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508}, - }, - { - FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683}, - FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655}, - FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158}, - }, - { - FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125}, - FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839}, - FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664}, - }, - { - FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294}, - FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899}, - FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070}, - }, - { - FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294}, - FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949}, - FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083}, - }, - { - FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420}, - FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940}, - FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396}, - }, - }, - { - { - FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567}, - FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127}, - FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294}, - }, - { - FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887}, - FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964}, - FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195}, - }, - { - FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244}, - FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999}, - FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762}, - }, - { - FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274}, - FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236}, - FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605}, - }, - { - FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761}, - FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884}, - FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482}, - }, - { - FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638}, - FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490}, - FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170}, - }, - { - FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736}, - FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124}, - FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392}, - }, - { - FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029}, - FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048}, - FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958}, - }, - }, - { - { - FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593}, - FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071}, - FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692}, - }, - { - FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687}, - FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441}, - FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001}, - }, - { - FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460}, - FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007}, - FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762}, - }, - { - FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005}, - FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674}, - FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035}, - }, - { - FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590}, - FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957}, - FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812}, - }, - { - FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740}, - FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122}, - FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158}, - }, - { - FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885}, - FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140}, - FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857}, - }, - { - FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155}, - FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260}, - FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483}, - }, - }, - { - { - FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677}, - FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815}, - FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751}, - }, - { - FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203}, - FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208}, - FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230}, - }, - { - FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850}, - FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389}, - FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968}, - }, - { - FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689}, - FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880}, - FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304}, - }, - { - FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632}, - FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412}, - FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566}, - }, - { - FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038}, - FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232}, - FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943}, - }, - { - FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856}, - FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738}, - FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971}, - }, - { - FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718}, - FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697}, - FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883}, - }, - }, - { - { - FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912}, - FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358}, - FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849}, - }, - { - FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307}, - FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977}, - FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335}, - }, - { - FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644}, - FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616}, - FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735}, - }, - { - FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099}, - FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341}, - FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336}, - }, - { - FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646}, - FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425}, - FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388}, - }, - { - FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743}, - FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822}, - FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462}, - }, - { - FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985}, - FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702}, - FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797}, - }, - { - FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293}, - FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100}, - FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688}, - }, - }, - { - { - FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186}, - FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610}, - FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707}, - }, - { - FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220}, - FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025}, - FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044}, - }, - { - FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992}, - FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027}, - FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197}, - }, - { - FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901}, - FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952}, - FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878}, - }, - { - FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390}, - FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730}, - FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730}, - }, - { - FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180}, - FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272}, - FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715}, - }, - { - FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970}, - FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772}, - FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865}, - }, - { - FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750}, - FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373}, - FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348}, - }, - }, - { - { - FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144}, - FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195}, - FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086}, - }, - { - FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684}, - FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518}, - FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233}, - }, - { - FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793}, - FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794}, - FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435}, - }, - { - FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921}, - FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518}, - FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563}, - }, - { - FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278}, - FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024}, - FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030}, - }, - { - FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783}, - FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717}, - FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844}, - }, - { - FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333}, - FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048}, - FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760}, - }, - { - FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760}, - FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757}, - FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112}, - }, - }, - { - { - FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468}, - FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184}, - FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289}, - }, - { - FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066}, - FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882}, - FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226}, - }, - { - FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101}, - FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279}, - FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811}, - }, - { - FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709}, - FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714}, - FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121}, - }, - { - FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464}, - FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847}, - FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400}, - }, - { - FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414}, - FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158}, - FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045}, - }, - { - FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415}, - FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459}, - FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079}, - }, - { - FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412}, - FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743}, - FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836}, - }, - }, - { - { - FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022}, - FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429}, - FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065}, - }, - { - FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861}, - FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000}, - FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101}, - }, - { - FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815}, - FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642}, - FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966}, - }, - { - FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574}, - FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742}, - FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689}, - }, - { - FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020}, - FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772}, - FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982}, - }, - { - FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953}, - FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218}, - FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265}, - }, - { - FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073}, - FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325}, - FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798}, - }, - { - FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870}, - FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863}, - FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927}, - }, - }, - { - { - FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267}, - FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663}, - FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862}, - }, - { - FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673}, - FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943}, - FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020}, - }, - { - FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238}, - FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064}, - FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795}, - }, - { - FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052}, - FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904}, - FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531}, - }, - { - FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979}, - FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841}, - FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431}, - }, - { - FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324}, - FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940}, - FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320}, - }, - { - FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184}, - FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114}, - FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878}, - }, - { - FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784}, - FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091}, - FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585}, - }, - }, - { - { - FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208}, - FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864}, - FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661}, - }, - { - FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233}, - FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212}, - FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525}, - }, - { - FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068}, - FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397}, - FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988}, - }, - { - FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889}, - FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038}, - FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697}, - }, - { - FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875}, - FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905}, - FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656}, - }, - { - FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818}, - FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714}, - FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203}, - }, - { - FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931}, - FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024}, - FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084}, - }, - { - FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204}, - FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817}, - FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667}, - }, - }, - { - { - FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504}, - FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768}, - FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255}, - }, - { - FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790}, - FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438}, - FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333}, - }, - { - FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971}, - FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905}, - FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409}, - }, - { - FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409}, - FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499}, - FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363}, - }, - { - FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664}, - FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324}, - FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940}, - }, - { - FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990}, - FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914}, - FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290}, - }, - { - FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257}, - FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433}, - FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236}, - }, - { - FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045}, - FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093}, - FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347}, - }, - }, - { - { - FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191}, - FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507}, - FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906}, - }, - { - FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018}, - FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109}, - FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926}, - }, - { - FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528}, - FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625}, - FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286}, - }, - { - FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033}, - FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866}, - FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896}, - }, - { - FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075}, - FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347}, - FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437}, - }, - { - FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165}, - FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588}, - FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193}, - }, - { - FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017}, - FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883}, - FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961}, - }, - { - FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043}, - FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663}, - FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362}, - }, - }, - { - { - FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860}, - FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466}, - FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063}, - }, - { - FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997}, - FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295}, - FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369}, - }, - { - FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385}, - FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109}, - FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906}, - }, - { - FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424}, - FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185}, - FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962}, - }, - { - FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325}, - FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593}, - FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404}, - }, - { - FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644}, - FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801}, - FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804}, - }, - { - FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884}, - FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577}, - FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849}, - }, - { - FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473}, - FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644}, - FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319}, - }, - }, - { - { - FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599}, - FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768}, - FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084}, - }, - { - FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328}, - FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369}, - FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920}, - }, - { - FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815}, - FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025}, - FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397}, - }, - { - FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448}, - FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981}, - FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165}, - }, - { - FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501}, - FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073}, - FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861}, - }, - { - FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845}, - FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211}, - FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870}, - }, - { - FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096}, - FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803}, - FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168}, - }, - { - FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965}, - FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505}, - FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598}, - }, - }, - { - { - FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782}, - FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900}, - FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479}, - }, - { - FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208}, - FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232}, - FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719}, - }, - { - FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271}, - FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326}, - FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132}, - }, - { - FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300}, - FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570}, - FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670}, - }, - { - FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994}, - FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913}, - FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317}, - }, - { - FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730}, - FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096}, - FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078}, - }, - { - FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411}, - FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905}, - FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654}, - }, - { - FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870}, - FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498}, - FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579}, - }, - }, - { - { - FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677}, - FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647}, - FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743}, - }, - { - FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468}, - FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375}, - FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155}, - }, - { - FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725}, - FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612}, - FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943}, - }, - { - FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944}, - FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928}, - FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406}, - }, - { - FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139}, - FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963}, - FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693}, - }, - { - FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734}, - FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680}, - FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410}, - }, - { - FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931}, - FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654}, - FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710}, - }, - { - FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180}, - FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684}, - FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895}, - }, - }, - { - { - FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501}, - FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413}, - FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880}, - }, - { - FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874}, - FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962}, - FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899}, - }, - { - FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152}, - FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063}, - FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080}, - }, - { - FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146}, - FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183}, - FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133}, - }, - { - FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421}, - FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622}, - FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197}, - }, - { - FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663}, - FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753}, - FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755}, - }, - { - FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862}, - FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118}, - FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171}, - }, - { - FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380}, - FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824}, - FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270}, - }, - }, - { - { - FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438}, - FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584}, - FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562}, - }, - { - FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471}, - FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610}, - FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269}, - }, - { - FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650}, - FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369}, - FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461}, - }, - { - FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462}, - FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793}, - FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218}, - }, - { - FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226}, - FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019}, - FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037}, - }, - { - FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171}, - FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132}, - FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841}, - }, - { - FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181}, - FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210}, - FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040}, - }, - { - FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935}, - FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105}, - FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814}, - }, - }, - { - { - FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852}, - FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581}, - FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646}, - }, - { - FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844}, - FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025}, - FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453}, - }, - { - FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068}, - FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192}, - FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921}, - }, - { - FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259}, - FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426}, - FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072}, - }, - { - FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305}, - FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832}, - FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943}, - }, - { - FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011}, - FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447}, - FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494}, - }, - { - FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245}, - FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859}, - FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915}, - }, - { - FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707}, - FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848}, - FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224}, - }, - }, - { - { - FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391}, - FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215}, - FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101}, - }, - { - FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713}, - FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849}, - FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930}, - }, - { - FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940}, - FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031}, - FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404}, - }, - { - FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243}, - FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116}, - FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525}, - }, - { - FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509}, - FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883}, - FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865}, - }, - { - FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660}, - FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273}, - FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138}, - }, - { - FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560}, - FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135}, - FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941}, - }, - { - FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739}, - FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756}, - FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819}, - }, - }, - { - { - FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347}, - FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028}, - FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075}, - }, - { - FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799}, - FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609}, - FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817}, - }, - { - FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989}, - FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523}, - FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278}, - }, - { - FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045}, - FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377}, - FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480}, - }, - { - FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016}, - FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426}, - FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525}, - }, - { - FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396}, - FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080}, - FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892}, - }, - { - FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275}, - FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074}, - FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140}, - }, - { - FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717}, - FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101}, - FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127}, - }, - }, - { - { - FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632}, - FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415}, - FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160}, - }, - { - FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876}, - FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625}, - FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478}, - }, - { - FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164}, - FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595}, - FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248}, - }, - { - FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858}, - FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193}, - FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184}, - }, - { - FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942}, - FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635}, - FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948}, - }, - { - FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935}, - FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415}, - FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416}, - }, - { - FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018}, - FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778}, - FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659}, - }, - { - FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385}, - FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503}, - FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329}, - }, - }, - { - { - FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056}, - FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838}, - FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948}, - }, - { - FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691}, - FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118}, - FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517}, - }, - { - FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269}, - FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904}, - FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589}, - }, - { - FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193}, - FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910}, - FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930}, - }, - { - FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667}, - FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481}, - FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876}, - }, - { - FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640}, - FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278}, - FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112}, - }, - { - FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272}, - FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012}, - FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221}, - }, - { - FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046}, - FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345}, - FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310}, - }, - }, - { - { - FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937}, - FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636}, - FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008}, - }, - { - FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429}, - FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576}, - FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066}, - }, - { - FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490}, - FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104}, - FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053}, - }, - { - FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275}, - FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511}, - FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095}, - }, - { - FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439}, - FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939}, - FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424}, - }, - { - FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310}, - FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608}, - FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079}, - }, - { - FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101}, - FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418}, - FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576}, - }, - { - FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356}, - FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996}, - FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099}, - }, - }, - { - { - FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728}, - FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658}, - FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242}, - }, - { - FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001}, - FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766}, - FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373}, - }, - { - FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458}, - FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628}, - FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657}, - }, - { - FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062}, - FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616}, - FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014}, - }, - { - FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383}, - FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814}, - FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718}, - }, - { - FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417}, - FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222}, - FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444}, - }, - { - FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597}, - FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970}, - FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799}, - }, - { - FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647}, - FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511}, - FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032}, - }, - }, - { - { - FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834}, - FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461}, - FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062}, - }, - { - FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516}, - FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547}, - FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240}, - }, - { - FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038}, - FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741}, - FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103}, - }, - { - FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747}, - FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323}, - FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016}, - }, - { - FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373}, - FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228}, - FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141}, - }, - { - FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399}, - FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831}, - FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376}, - }, - { - FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313}, - FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958}, - FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577}, - }, - { - FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743}, - FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684}, - FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476}, - }, - }, -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go deleted file mode 100644 index fd03c252..00000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go +++ /dev/null @@ -1,1793 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package edwards25519 - -import "encoding/binary" - -// This code is a port of the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// FieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type FieldElement [10]int32 - -var zero FieldElement - -func FeZero(fe *FieldElement) { - copy(fe[:], zero[:]) -} - -func FeOne(fe *FieldElement) { - FeZero(fe) - fe[0] = 1 -} - -func FeAdd(dst, a, b *FieldElement) { - dst[0] = a[0] + b[0] - dst[1] = a[1] + b[1] - dst[2] = a[2] + b[2] - dst[3] = a[3] + b[3] - dst[4] = a[4] + b[4] - dst[5] = a[5] + b[5] - dst[6] = a[6] + b[6] - dst[7] = a[7] + b[7] - dst[8] = a[8] + b[8] - dst[9] = a[9] + b[9] -} - -func FeSub(dst, a, b *FieldElement) { - dst[0] = a[0] - b[0] - dst[1] = a[1] - b[1] - dst[2] = a[2] - b[2] - dst[3] = a[3] - b[3] - dst[4] = a[4] - b[4] - dst[5] = a[5] - b[5] - dst[6] = a[6] - b[6] - dst[7] = a[7] - b[7] - dst[8] = a[8] - b[8] - dst[9] = a[9] - b[9] -} - -func FeCopy(dst, src *FieldElement) { - copy(dst[:], src[:]) -} - -// Replace (f,g) with (g,g) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func FeCMove(f, g *FieldElement, b int32) { - b = -b - f[0] ^= b & (f[0] ^ g[0]) - f[1] ^= b & (f[1] ^ g[1]) - f[2] ^= b & (f[2] ^ g[2]) - f[3] ^= b & (f[3] ^ g[3]) - f[4] ^= b & (f[4] ^ g[4]) - f[5] ^= b & (f[5] ^ g[5]) - f[6] ^= b & (f[6] ^ g[6]) - f[7] ^= b & (f[7] ^ g[7]) - f[8] ^= b & (f[8] ^ g[8]) - f[9] ^= b & (f[9] ^ g[9]) -} - -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -func load4(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - r |= int64(in[3]) << 24 - return r -} - -func FeFromBytes(dst *FieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := (load3(src[29:]) & 8388607) << 2 - - FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -func FeIsNegative(f *FieldElement) byte { - var s [32]byte - FeToBytes(&s, f) - return s[0] & 1 -} - -func FeIsNonZero(f *FieldElement) int32 { - var s [32]byte - FeToBytes(&s, f) - var x uint8 - for _, b := range s { - x |= b - } - x |= x >> 4 - x |= x >> 2 - x |= x >> 1 - return int32(x & 1) -} - -// FeNeg sets h = -f -// -// Preconditions: -// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeNeg(h, f *FieldElement) { - h[0] = -f[0] - h[1] = -f[1] - h[2] = -f[2] - h[3] = -f[3] - h[4] = -f[4] - h[5] = -f[5] - h[6] = -f[6] - h[7] = -f[7] - h[8] = -f[8] - h[9] = -f[9] -} - -func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64 - - /* - |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.51*2^58 */ - /* |h5| <= 1.51*2^58 */ - - c1 = (h1 + (1 << 24)) >> 25 - h2 += c1 - h1 -= c1 << 25 - c5 = (h5 + (1 << 24)) >> 25 - h6 += c5 - h5 -= c5 << 25 - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.21*2^59 */ - /* |h6| <= 1.21*2^59 */ - - c2 = (h2 + (1 << 25)) >> 26 - h3 += c2 - h2 -= c2 << 26 - c6 = (h6 + (1 << 25)) >> 26 - h7 += c6 - h6 -= c6 << 26 - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.51*2^58 */ - /* |h7| <= 1.51*2^58 */ - - c3 = (h3 + (1 << 24)) >> 25 - h4 += c3 - h3 -= c3 << 25 - c7 = (h7 + (1 << 24)) >> 25 - h8 += c7 - h7 -= c7 << 25 - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.52*2^33 */ - /* |h8| <= 1.52*2^33 */ - - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - c8 = (h8 + (1 << 25)) >> 26 - h9 += c8 - h8 -= c8 << 26 - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.51*2^58 */ - - c9 = (h9 + (1 << 24)) >> 25 - h0 += c9 * 19 - h9 -= c9 << 25 - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.8*2^37 */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// FeMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs, can squeeze carries into int32. -func FeMul(h, f, g *FieldElement) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - - f1_2 := int64(2 * f[1]) - f3_2 := int64(2 * f[3]) - f5_2 := int64(2 * f[5]) - f7_2 := int64(2 * f[7]) - f9_2 := int64(2 * f[9]) - - g0 := int64(g[0]) - g1 := int64(g[1]) - g2 := int64(g[2]) - g3 := int64(g[3]) - g4 := int64(g[4]) - g5 := int64(g[5]) - g6 := int64(g[6]) - g7 := int64(g[7]) - g8 := int64(g[8]) - g9 := int64(g[9]) - - g1_19 := int64(19 * g[1]) /* 1.4*2^29 */ - g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */ - g3_19 := int64(19 * g[3]) - g4_19 := int64(19 * g[4]) - g5_19 := int64(19 * g[5]) - g6_19 := int64(19 * g[6]) - g7_19 := int64(19 * g[7]) - g8_19 := int64(19 * g[8]) - g9_19 := int64(19 * g[9]) - - h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19 - h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19 - h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19 - h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19 - h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19 - h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19 - h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19 - h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19 - h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19 - h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - f0_2 := int64(2 * f[0]) - f1_2 := int64(2 * f[1]) - f2_2 := int64(2 * f[2]) - f3_2 := int64(2 * f[3]) - f4_2 := int64(2 * f[4]) - f5_2 := int64(2 * f[5]) - f6_2 := int64(2 * f[6]) - f7_2 := int64(2 * f[7]) - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - - h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38 - h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19 - h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19 - h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38 - h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38 - h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19 - h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19 - h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38 - h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38 - h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5 - - return -} - -// FeSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeSquare(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeSquare2 sets h = 2 * f * f -// -// Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -// See fe_mul.c for discussion of implementation strategy. -func FeSquare2(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - - h0 += h0 - h1 += h1 - h2 += h2 - h3 += h3 - h4 += h4 - h5 += h5 - h6 += h6 - h7 += h7 - h8 += h8 - h9 += h9 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func FeInvert(out, z *FieldElement) { - var t0, t1, t2, t3 FieldElement - var i int - - FeSquare(&t0, z) // 2^1 - FeSquare(&t1, &t0) // 2^2 - for i = 1; i < 2; i++ { // 2^3 - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) // 2^3 + 2^0 - FeMul(&t0, &t0, &t1) // 2^3 + 2^1 + 2^0 - FeSquare(&t2, &t0) // 2^4 + 2^2 + 2^1 - FeMul(&t1, &t1, &t2) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 - FeSquare(&t2, &t1) // 5,4,3,2,1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 19..0 - FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 39..0 - FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 49..0 - FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 99..0 - FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 199..0 - FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 249..0 - FeSquare(&t1, &t1) // 250..1 - for i = 1; i < 5; i++ { // 254..5 - FeSquare(&t1, &t1) - } - FeMul(out, &t1, &t0) // 254..5,3,1,0 -} - -func fePow22523(out, z *FieldElement) { - var t0, t1, t2 FieldElement - var i int - - FeSquare(&t0, z) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeSquare(&t1, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) - FeMul(&t0, &t0, &t1) - FeSquare(&t0, &t0) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 5; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 20; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 100; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t0, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t0, &t0) - } - FeMul(out, &t0, z) -} - -// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 * -// y^2 where d = -121665/121666. -// -// Several representations are used: -// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// PreComputedGroupElement: (y+x,y-x,2dxy) - -type ProjectiveGroupElement struct { - X, Y, Z FieldElement -} - -type ExtendedGroupElement struct { - X, Y, Z, T FieldElement -} - -type CompletedGroupElement struct { - X, Y, Z, T FieldElement -} - -type PreComputedGroupElement struct { - yPlusX, yMinusX, xy2d FieldElement -} - -type CachedGroupElement struct { - yPlusX, yMinusX, Z, T2d FieldElement -} - -func (p *ProjectiveGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) -} - -func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) { - var t0 FieldElement - - FeSquare(&r.X, &p.X) - FeSquare(&r.Z, &p.Y) - FeSquare2(&r.T, &p.Z) - FeAdd(&r.Y, &p.X, &p.Y) - FeSquare(&t0, &r.Y) - FeAdd(&r.Y, &r.Z, &r.X) - FeSub(&r.Z, &r.Z, &r.X) - FeSub(&r.X, &t0, &r.Y) - FeSub(&r.T, &r.T, &r.Z) -} - -func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) - FeZero(&p.T) -} - -func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) { - var q ProjectiveGroupElement - p.ToProjective(&q) - q.Double(r) -} - -func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) { - FeAdd(&r.yPlusX, &p.Y, &p.X) - FeSub(&r.yMinusX, &p.Y, &p.X) - FeCopy(&r.Z, &p.Z) - FeMul(&r.T2d, &p.T, &d2) -} - -func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeCopy(&r.X, &p.X) - FeCopy(&r.Y, &p.Y) - FeCopy(&r.Z, &p.Z) -} - -func (p *ExtendedGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool { - var u, v, v3, vxx, check FieldElement - - FeFromBytes(&p.Y, s) - FeOne(&p.Z) - FeSquare(&u, &p.Y) - FeMul(&v, &u, &d) - FeSub(&u, &u, &p.Z) // y = y^2-1 - FeAdd(&v, &v, &p.Z) // v = dy^2+1 - - FeSquare(&v3, &v) - FeMul(&v3, &v3, &v) // v3 = v^3 - FeSquare(&p.X, &v3) - FeMul(&p.X, &p.X, &v) - FeMul(&p.X, &p.X, &u) // x = uv^7 - - fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8) - FeMul(&p.X, &p.X, &v3) - FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8) - - var tmpX, tmp2 [32]byte - - FeSquare(&vxx, &p.X) - FeMul(&vxx, &vxx, &v) - FeSub(&check, &vxx, &u) // vx^2-u - if FeIsNonZero(&check) == 1 { - FeAdd(&check, &vxx, &u) // vx^2+u - if FeIsNonZero(&check) == 1 { - return false - } - FeMul(&p.X, &p.X, &SqrtM1) - - FeToBytes(&tmpX, &p.X) - for i, v := range tmpX { - tmp2[31-i] = v - } - } - - if FeIsNegative(&p.X) != (s[31] >> 7) { - FeNeg(&p.X, &p.X) - } - - FeMul(&p.T, &p.X, &p.Y) - return true -} - -func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) -} - -func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) - FeMul(&r.T, &p.X, &p.Y) -} - -func (p *PreComputedGroupElement) Zero() { - FeOne(&p.yPlusX) - FeOne(&p.yMinusX) - FeZero(&p.xy2d) -} - -func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func slide(r *[256]int8, a *[32]byte) { - for i := range r { - r[i] = int8(1 & (a[i>>3] >> uint(i&7))) - } - - for i := range r { - if r[i] != 0 { - for b := 1; b <= 6 && i+b < 256; b++ { - if r[i+b] != 0 { - if r[i]+(r[i+b]<= -15 { - r[i] -= r[i+b] << uint(b) - for k := i + b; k < 256; k++ { - if r[k] == 0 { - r[k] = 1 - break - } - r[k] = 0 - } - } else { - break - } - } - } - } - } -} - -// GeDoubleScalarMultVartime sets r = a*A + b*B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) { - var aSlide, bSlide [256]int8 - var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A - var t CompletedGroupElement - var u, A2 ExtendedGroupElement - var i int - - slide(&aSlide, a) - slide(&bSlide, b) - - A.ToCached(&Ai[0]) - A.Double(&t) - t.ToExtended(&A2) - - for i := 0; i < 7; i++ { - geAdd(&t, &A2, &Ai[i]) - t.ToExtended(&u) - u.ToCached(&Ai[i+1]) - } - - r.Zero() - - for i = 255; i >= 0; i-- { - if aSlide[i] != 0 || bSlide[i] != 0 { - break - } - } - - for ; i >= 0; i-- { - r.Double(&t) - - if aSlide[i] > 0 { - t.ToExtended(&u) - geAdd(&t, &u, &Ai[aSlide[i]/2]) - } else if aSlide[i] < 0 { - t.ToExtended(&u) - geSub(&t, &u, &Ai[(-aSlide[i])/2]) - } - - if bSlide[i] > 0 { - t.ToExtended(&u) - geMixedAdd(&t, &u, &bi[bSlide[i]/2]) - } else if bSlide[i] < 0 { - t.ToExtended(&u) - geMixedSub(&t, &u, &bi[(-bSlide[i])/2]) - } - - t.ToProjective(r) - } -} - -// equal returns 1 if b == c and 0 otherwise, assuming that b and c are -// non-negative. -func equal(b, c int32) int32 { - x := uint32(b ^ c) - x-- - return int32(x >> 31) -} - -// negative returns 1 if b < 0 and 0 otherwise. -func negative(b int32) int32 { - return (b >> 31) & 1 -} - -func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) { - FeCMove(&t.yPlusX, &u.yPlusX, b) - FeCMove(&t.yMinusX, &u.yMinusX, b) - FeCMove(&t.xy2d, &u.xy2d, b) -} - -func selectPoint(t *PreComputedGroupElement, pos int32, b int32) { - var minusT PreComputedGroupElement - bNegative := negative(b) - bAbs := b - (((-bNegative) & b) << 1) - - t.Zero() - for i := int32(0); i < 8; i++ { - PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1)) - } - FeCopy(&minusT.yPlusX, &t.yMinusX) - FeCopy(&minusT.yMinusX, &t.yPlusX) - FeNeg(&minusT.xy2d, &t.xy2d) - PreComputedGroupElementCMove(t, &minusT, bNegative) -} - -// GeScalarMultBase computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. -// -// Preconditions: -// a[31] <= 127 -func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) { - var e [64]int8 - - for i, v := range a { - e[2*i] = int8(v & 15) - e[2*i+1] = int8((v >> 4) & 15) - } - - // each e[i] is between 0 and 15 and e[63] is between 0 and 7. - - carry := int8(0) - for i := 0; i < 63; i++ { - e[i] += carry - carry = (e[i] + 8) >> 4 - e[i] -= carry << 4 - } - e[63] += carry - // each e[i] is between -8 and 8. - - h.Zero() - var t PreComputedGroupElement - var r CompletedGroupElement - for i := int32(1); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } - - var s ProjectiveGroupElement - - h.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToExtended(h) - - for i := int32(0); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } -} - -// The scalars are GF(2^252 + 27742317777372353535851937790883648493). - -// Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScMulAdd(s, a, b, c *[32]byte) { - a0 := 2097151 & load3(a[:]) - a1 := 2097151 & (load4(a[2:]) >> 5) - a2 := 2097151 & (load3(a[5:]) >> 2) - a3 := 2097151 & (load4(a[7:]) >> 7) - a4 := 2097151 & (load4(a[10:]) >> 4) - a5 := 2097151 & (load3(a[13:]) >> 1) - a6 := 2097151 & (load4(a[15:]) >> 6) - a7 := 2097151 & (load3(a[18:]) >> 3) - a8 := 2097151 & load3(a[21:]) - a9 := 2097151 & (load4(a[23:]) >> 5) - a10 := 2097151 & (load3(a[26:]) >> 2) - a11 := (load4(a[28:]) >> 7) - b0 := 2097151 & load3(b[:]) - b1 := 2097151 & (load4(b[2:]) >> 5) - b2 := 2097151 & (load3(b[5:]) >> 2) - b3 := 2097151 & (load4(b[7:]) >> 7) - b4 := 2097151 & (load4(b[10:]) >> 4) - b5 := 2097151 & (load3(b[13:]) >> 1) - b6 := 2097151 & (load4(b[15:]) >> 6) - b7 := 2097151 & (load3(b[18:]) >> 3) - b8 := 2097151 & load3(b[21:]) - b9 := 2097151 & (load4(b[23:]) >> 5) - b10 := 2097151 & (load3(b[26:]) >> 2) - b11 := (load4(b[28:]) >> 7) - c0 := 2097151 & load3(c[:]) - c1 := 2097151 & (load4(c[2:]) >> 5) - c2 := 2097151 & (load3(c[5:]) >> 2) - c3 := 2097151 & (load4(c[7:]) >> 7) - c4 := 2097151 & (load4(c[10:]) >> 4) - c5 := 2097151 & (load3(c[13:]) >> 1) - c6 := 2097151 & (load4(c[15:]) >> 6) - c7 := 2097151 & (load3(c[18:]) >> 3) - c8 := 2097151 & load3(c[21:]) - c9 := 2097151 & (load4(c[23:]) >> 5) - c10 := 2097151 & (load3(c[26:]) >> 2) - c11 := (load4(c[28:]) >> 7) - var carry [23]int64 - - s0 := c0 + a0*b0 - s1 := c1 + a0*b1 + a1*b0 - s2 := c2 + a0*b2 + a1*b1 + a2*b0 - s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0 - s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0 - s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0 - s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0 - s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0 - s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0 - s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0 - s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0 - s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0 - s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1 - s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2 - s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3 - s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4 - s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5 - s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6 - s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7 - s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8 - s20 := a9*b11 + a10*b10 + a11*b9 - s21 := a10*b11 + a11*b10 - s22 := a11 * b11 - s23 := int64(0) - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - carry[18] = (s18 + (1 << 20)) >> 21 - s19 += carry[18] - s18 -= carry[18] << 21 - carry[20] = (s20 + (1 << 20)) >> 21 - s21 += carry[20] - s20 -= carry[20] << 21 - carry[22] = (s22 + (1 << 20)) >> 21 - s23 += carry[22] - s22 -= carry[22] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - carry[17] = (s17 + (1 << 20)) >> 21 - s18 += carry[17] - s17 -= carry[17] << 21 - carry[19] = (s19 + (1 << 20)) >> 21 - s20 += carry[19] - s19 -= carry[19] << 21 - carry[21] = (s21 + (1 << 20)) >> 21 - s22 += carry[21] - s21 -= carry[21] << 21 - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - s[0] = byte(s0 >> 0) - s[1] = byte(s0 >> 8) - s[2] = byte((s0 >> 16) | (s1 << 5)) - s[3] = byte(s1 >> 3) - s[4] = byte(s1 >> 11) - s[5] = byte((s1 >> 19) | (s2 << 2)) - s[6] = byte(s2 >> 6) - s[7] = byte((s2 >> 14) | (s3 << 7)) - s[8] = byte(s3 >> 1) - s[9] = byte(s3 >> 9) - s[10] = byte((s3 >> 17) | (s4 << 4)) - s[11] = byte(s4 >> 4) - s[12] = byte(s4 >> 12) - s[13] = byte((s4 >> 20) | (s5 << 1)) - s[14] = byte(s5 >> 7) - s[15] = byte((s5 >> 15) | (s6 << 6)) - s[16] = byte(s6 >> 2) - s[17] = byte(s6 >> 10) - s[18] = byte((s6 >> 18) | (s7 << 3)) - s[19] = byte(s7 >> 5) - s[20] = byte(s7 >> 13) - s[21] = byte(s8 >> 0) - s[22] = byte(s8 >> 8) - s[23] = byte((s8 >> 16) | (s9 << 5)) - s[24] = byte(s9 >> 3) - s[25] = byte(s9 >> 11) - s[26] = byte((s9 >> 19) | (s10 << 2)) - s[27] = byte(s10 >> 6) - s[28] = byte((s10 >> 14) | (s11 << 7)) - s[29] = byte(s11 >> 1) - s[30] = byte(s11 >> 9) - s[31] = byte(s11 >> 17) -} - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScReduce(out *[32]byte, s *[64]byte) { - s0 := 2097151 & load3(s[:]) - s1 := 2097151 & (load4(s[2:]) >> 5) - s2 := 2097151 & (load3(s[5:]) >> 2) - s3 := 2097151 & (load4(s[7:]) >> 7) - s4 := 2097151 & (load4(s[10:]) >> 4) - s5 := 2097151 & (load3(s[13:]) >> 1) - s6 := 2097151 & (load4(s[15:]) >> 6) - s7 := 2097151 & (load3(s[18:]) >> 3) - s8 := 2097151 & load3(s[21:]) - s9 := 2097151 & (load4(s[23:]) >> 5) - s10 := 2097151 & (load3(s[26:]) >> 2) - s11 := 2097151 & (load4(s[28:]) >> 7) - s12 := 2097151 & (load4(s[31:]) >> 4) - s13 := 2097151 & (load3(s[34:]) >> 1) - s14 := 2097151 & (load4(s[36:]) >> 6) - s15 := 2097151 & (load3(s[39:]) >> 3) - s16 := 2097151 & load3(s[42:]) - s17 := 2097151 & (load4(s[44:]) >> 5) - s18 := 2097151 & (load3(s[47:]) >> 2) - s19 := 2097151 & (load4(s[49:]) >> 7) - s20 := 2097151 & (load4(s[52:]) >> 4) - s21 := 2097151 & (load3(s[55:]) >> 1) - s22 := 2097151 & (load4(s[57:]) >> 6) - s23 := (load4(s[60:]) >> 3) - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - var carry [17]int64 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - out[0] = byte(s0 >> 0) - out[1] = byte(s0 >> 8) - out[2] = byte((s0 >> 16) | (s1 << 5)) - out[3] = byte(s1 >> 3) - out[4] = byte(s1 >> 11) - out[5] = byte((s1 >> 19) | (s2 << 2)) - out[6] = byte(s2 >> 6) - out[7] = byte((s2 >> 14) | (s3 << 7)) - out[8] = byte(s3 >> 1) - out[9] = byte(s3 >> 9) - out[10] = byte((s3 >> 17) | (s4 << 4)) - out[11] = byte(s4 >> 4) - out[12] = byte(s4 >> 12) - out[13] = byte((s4 >> 20) | (s5 << 1)) - out[14] = byte(s5 >> 7) - out[15] = byte((s5 >> 15) | (s6 << 6)) - out[16] = byte(s6 >> 2) - out[17] = byte(s6 >> 10) - out[18] = byte((s6 >> 18) | (s7 << 3)) - out[19] = byte(s7 >> 5) - out[20] = byte(s7 >> 13) - out[21] = byte(s8 >> 0) - out[22] = byte(s8 >> 8) - out[23] = byte((s8 >> 16) | (s9 << 5)) - out[24] = byte(s9 >> 3) - out[25] = byte(s9 >> 11) - out[26] = byte((s9 >> 19) | (s10 << 2)) - out[27] = byte(s10 >> 6) - out[28] = byte((s10 >> 14) | (s11 << 7)) - out[29] = byte(s11 >> 1) - out[30] = byte(s11 >> 9) - out[31] = byte(s11 >> 17) -} - -// order is the order of Curve25519 in little-endian form. -var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000} - -// ScMinimal returns true if the given scalar is less than the order of the -// curve. -func ScMinimal(scalar *[32]byte) bool { - for i := 3; ; i-- { - v := binary.LittleEndian.Uint64(scalar[i*8:]) - if v > order[i] { - return false - } else if v < order[i] { - break - } else if i == 0 { - return false - } - } - - return true -} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/vendor/golang.org/x/crypto/internal/alias/alias.go similarity index 84% rename from vendor/golang.org/x/crypto/internal/subtle/aliasing.go rename to vendor/golang.org/x/crypto/internal/alias/alias.go index 4fad24f8..69c17f82 100644 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go +++ b/vendor/golang.org/x/crypto/internal/alias/alias.go @@ -5,9 +5,8 @@ //go:build !purego // +build !purego -// Package subtle implements functions that are often useful in cryptographic -// code but require careful thought to use correctly. -package subtle // import "golang.org/x/crypto/internal/subtle" +// Package alias implements memory aliasing tests. +package alias import "unsafe" diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go similarity index 86% rename from vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go rename to vendor/golang.org/x/crypto/internal/alias/alias_purego.go index 80ccbed2..4775b0a4 100644 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing_purego.go +++ b/vendor/golang.org/x/crypto/internal/alias/alias_purego.go @@ -5,9 +5,8 @@ //go:build purego // +build purego -// Package subtle implements functions that are often useful in cryptographic -// code but require careful thought to use correctly. -package subtle // import "golang.org/x/crypto/internal/subtle" +// Package alias implements memory aliasing tests. +package alias // This is the Google App Engine standard variant based on reflect // because the unsafe package and cgo are disallowed. diff --git a/vendor/golang.org/x/crypto/poly1305/bits_compat.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/bits_compat.go rename to vendor/golang.org/x/crypto/internal/poly1305/bits_compat.go diff --git a/vendor/golang.org/x/crypto/poly1305/bits_go1.13.go b/vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/bits_go1.13.go rename to vendor/golang.org/x/crypto/internal/poly1305/bits_go1.13.go diff --git a/vendor/golang.org/x/crypto/poly1305/mac_noasm.go b/vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/mac_noasm.go rename to vendor/golang.org/x/crypto/internal/poly1305/mac_noasm.go diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305.go b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go similarity index 98% rename from vendor/golang.org/x/crypto/poly1305/poly1305.go rename to vendor/golang.org/x/crypto/internal/poly1305/poly1305.go index 9d7a6af0..4aaea810 100644 --- a/vendor/golang.org/x/crypto/poly1305/poly1305.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/poly1305.go @@ -15,7 +15,7 @@ // used with a fixed key in order to generate one-time keys from an nonce. // However, in this package AES isn't used and the one-time key is specified // directly. -package poly1305 // import "golang.org/x/crypto/poly1305" +package poly1305 import "crypto/subtle" diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/sum_amd64.go rename to vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.go diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/sum_amd64.s rename to vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s diff --git a/vendor/golang.org/x/crypto/poly1305/sum_generic.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go similarity index 99% rename from vendor/golang.org/x/crypto/poly1305/sum_generic.go rename to vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go index c942a659..e041da5e 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_generic.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_generic.go @@ -136,7 +136,7 @@ func shiftRightBy2(a uint128) uint128 { // updateGeneric absorbs msg into the state.h accumulator. For each chunk m of // 128 bits of message, it computes // -// h₊ = (h + m) * r mod 2¹³⁰ - 5 +// h₊ = (h + m) * r mod 2¹³⁰ - 5 // // If the msg length is not a multiple of TagSize, it assumes the last // incomplete chunk is the final one. @@ -278,8 +278,7 @@ const ( // finalize completes the modular reduction of h and computes // -// out = h + s mod 2¹²⁸ -// +// out = h + s mod 2¹²⁸ func finalize(out *[TagSize]byte, h *[3]uint64, s *[2]uint64) { h0, h1, h2 := h[0], h[1], h[2] diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/sum_ppc64le.go rename to vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.go diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s similarity index 100% rename from vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s rename to vendor/golang.org/x/crypto/internal/poly1305/sum_ppc64le.s diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go similarity index 99% rename from vendor/golang.org/x/crypto/poly1305/sum_s390x.go rename to vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go index 62cc9f84..ec959668 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.go @@ -14,6 +14,7 @@ import ( // updateVX is an assembly implementation of Poly1305 that uses vector // instructions. It must only be called if the vector facility (vx) is // available. +// //go:noescape func updateVX(state *macState, msg []byte) diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s similarity index 99% rename from vendor/golang.org/x/crypto/poly1305/sum_s390x.s rename to vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s index 69c64f84..aa9e0494 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_s390x.s @@ -18,7 +18,7 @@ // value. These limbs are, for the most part, zero extended and // placed into 64-bit vector register elements. Each vector // register is 128-bits wide and so holds 2 of these elements. -// Using 26-bit limbs allows us plenty of headroom to accomodate +// Using 26-bit limbs allows us plenty of headroom to accommodate // accumulations before and after multiplication without // overflowing either 32-bits (before multiplication) or 64-bits // (after multiplication). diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go index 916c840b..fc04d03e 100644 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -14,8 +14,10 @@ import ( "time" ) -// These constants from [PROTOCOL.certkeys] represent the algorithm names -// for certificate types supported by this package. +// Certificate algorithm names from [PROTOCOL.certkeys]. These values can appear +// in Certificate.Type, PublicKey.Type, and ClientConfig.HostKeyAlgorithms. +// Unlike key algorithm names, these are not passed to AlgorithmSigner and don't +// appear in the Signature.Format field. const ( CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" @@ -25,6 +27,21 @@ const ( CertAlgoSKECDSA256v01 = "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com" CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" CertAlgoSKED25519v01 = "sk-ssh-ed25519-cert-v01@openssh.com" + + // CertAlgoRSASHA256v01 and CertAlgoRSASHA512v01 can't appear as a + // Certificate.Type (or PublicKey.Type), but only in + // ClientConfig.HostKeyAlgorithms. + CertAlgoRSASHA256v01 = "rsa-sha2-256-cert-v01@openssh.com" + CertAlgoRSASHA512v01 = "rsa-sha2-512-cert-v01@openssh.com" +) + +const ( + // Deprecated: use CertAlgoRSAv01. + CertSigAlgoRSAv01 = CertAlgoRSAv01 + // Deprecated: use CertAlgoRSASHA256v01. + CertSigAlgoRSASHA2256v01 = CertAlgoRSASHA256v01 + // Deprecated: use CertAlgoRSASHA512v01. + CertSigAlgoRSASHA2512v01 = CertAlgoRSASHA512v01 ) // Certificate types distinguish between host and user @@ -234,7 +251,7 @@ type algorithmOpenSSHCertSigner struct { // private key is held by signer. It returns an error if the public key in cert // doesn't match the key used by signer. func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { - if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { + if !bytes.Equal(cert.Key.Marshal(), signer.PublicKey().Marshal()) { return nil, errors.New("ssh: signer and cert have different public key") } @@ -423,6 +440,16 @@ func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { } c.SignatureKey = authority.PublicKey() + // Default to KeyAlgoRSASHA512 for ssh-rsa signers. + if v, ok := authority.(AlgorithmSigner); ok && v.PublicKey().Type() == KeyAlgoRSA { + sig, err := v.SignWithAlgorithm(rand, c.bytesForSigning(), KeyAlgoRSASHA512) + if err != nil { + return err + } + c.Signature = sig + return nil + } + sig, err := authority.Sign(rand, c.bytesForSigning()) if err != nil { return err @@ -431,26 +458,42 @@ func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { return nil } -var certAlgoNames = map[string]string{ - KeyAlgoRSA: CertAlgoRSAv01, - KeyAlgoDSA: CertAlgoDSAv01, - KeyAlgoECDSA256: CertAlgoECDSA256v01, - KeyAlgoECDSA384: CertAlgoECDSA384v01, - KeyAlgoECDSA521: CertAlgoECDSA521v01, - KeyAlgoSKECDSA256: CertAlgoSKECDSA256v01, - KeyAlgoED25519: CertAlgoED25519v01, - KeyAlgoSKED25519: CertAlgoSKED25519v01, +// certKeyAlgoNames is a mapping from known certificate algorithm names to the +// corresponding public key signature algorithm. +// +// This map must be kept in sync with the one in agent/client.go. +var certKeyAlgoNames = map[string]string{ + CertAlgoRSAv01: KeyAlgoRSA, + CertAlgoRSASHA256v01: KeyAlgoRSASHA256, + CertAlgoRSASHA512v01: KeyAlgoRSASHA512, + CertAlgoDSAv01: KeyAlgoDSA, + CertAlgoECDSA256v01: KeyAlgoECDSA256, + CertAlgoECDSA384v01: KeyAlgoECDSA384, + CertAlgoECDSA521v01: KeyAlgoECDSA521, + CertAlgoSKECDSA256v01: KeyAlgoSKECDSA256, + CertAlgoED25519v01: KeyAlgoED25519, + CertAlgoSKED25519v01: KeyAlgoSKED25519, +} + +// underlyingAlgo returns the signature algorithm associated with algo (which is +// an advertised or negotiated public key or host key algorithm). These are +// usually the same, except for certificate algorithms. +func underlyingAlgo(algo string) string { + if a, ok := certKeyAlgoNames[algo]; ok { + return a + } + return algo } -// certToPrivAlgo returns the underlying algorithm for a certificate algorithm. -// Panics if a non-certificate algorithm is passed. -func certToPrivAlgo(algo string) string { - for privAlgo, pubAlgo := range certAlgoNames { - if pubAlgo == algo { - return privAlgo +// certificateAlgo returns the certificate algorithms that uses the provided +// underlying signature algorithm. +func certificateAlgo(algo string) (certAlgo string, ok bool) { + for certName, algoName := range certKeyAlgoNames { + if algoName == algo { + return certName, true } } - panic("unknown cert algorithm") + return "", false } func (cert *Certificate) bytesForSigning() []byte { @@ -494,13 +537,13 @@ func (c *Certificate) Marshal() []byte { return result } -// Type returns the key name. It is part of the PublicKey interface. +// Type returns the certificate algorithm name. It is part of the PublicKey interface. func (c *Certificate) Type() string { - algo, ok := certAlgoNames[c.Key.Type()] + certName, ok := certificateAlgo(c.Key.Type()) if !ok { - panic("unknown cert key type " + c.Key.Type()) + panic("unknown certificate type for key type " + c.Key.Type()) } - return algo + return certName } // Verify verifies a signature against the certificate's public diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index 8bd6b3da..87f48552 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -15,10 +15,9 @@ import ( "fmt" "hash" "io" - "io/ioutil" "golang.org/x/crypto/chacha20" - "golang.org/x/crypto/poly1305" + "golang.org/x/crypto/internal/poly1305" ) const ( @@ -97,13 +96,13 @@ func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, // are not supported and will not be negotiated, even if explicitly requested in // ClientConfig.Crypto.Ciphers. var cipherModes = map[string]*cipherMode{ - // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms + // Ciphers from RFC 4344, which introduced many CTR-based ciphers. Algorithms // are defined in the order specified in the RFC. "aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, "aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, "aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, - // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. + // Ciphers from RFC 4345, which introduces security-improved arcfour ciphers. // They are defined in the order specified in the RFC. "arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, "arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, @@ -111,7 +110,7 @@ var cipherModes = map[string]*cipherMode{ // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and // RC4) has problems with weak keys, and should be used with caution." - // RFC4345 introduces improved versions of Arcfour. + // RFC 4345 introduces improved versions of Arcfour. "arcfour": {16, 0, streamCipherMode(0, newRC4)}, // AEAD ciphers @@ -394,6 +393,10 @@ func (c *gcmCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) } c.incIV() + if len(plain) == 0 { + return nil, errors.New("ssh: empty packet") + } + padding := plain[0] if padding < 4 { // padding is a byte, so it automatically satisfies @@ -493,7 +496,7 @@ func (c *cbcCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error) // data, to make distinguishing between // failing MAC and failing length check more // difficult. - io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) + io.CopyN(io.Discard, r, int64(c.oracleCamouflage)) } } return p, err @@ -636,9 +639,9 @@ const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" // chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com // AEAD, which is described here: // -// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 +// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 // -// the methods here also implement padding, which RFC4253 Section 6 +// the methods here also implement padding, which RFC 4253 Section 6 // also requires of stream ciphers. type chacha20Poly1305Cipher struct { lengthKey [32]byte @@ -710,6 +713,10 @@ func (c *chacha20Poly1305Cipher) readCipherPacket(seqNum uint32, r io.Reader) ([ plain := c.buf[4:contentEnd] s.XORKeyStream(plain, plain) + if len(plain) == 0 { + return nil, errors.New("ssh: empty packet") + } + padding := plain[0] if padding < 4 { // padding is a byte, so it automatically satisfies diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go index 99f68bd3..bdc356cb 100644 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ b/vendor/golang.org/x/crypto/ssh/client.go @@ -113,14 +113,18 @@ func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) e return c.clientAuthenticate(config) } -// verifyHostKeySignature verifies the host key obtained in the key -// exchange. -func verifyHostKeySignature(hostKey PublicKey, result *kexResult) error { +// verifyHostKeySignature verifies the host key obtained in the key exchange. +// algo is the negotiated algorithm, and may be a certificate type. +func verifyHostKeySignature(hostKey PublicKey, algo string, result *kexResult) error { sig, rest, ok := parseSignatureBody(result.Signature) if len(rest) > 0 || !ok { return errors.New("ssh: signature parse error") } + if a := underlyingAlgo(algo); sig.Format != a { + return fmt.Errorf("ssh: invalid signature algorithm %q, expected %q", sig.Format, a) + } + return hostKey.Verify(result.H, sig) } @@ -224,11 +228,11 @@ type ClientConfig struct { // be used for the connection. If empty, a reasonable default is used. ClientVersion string - // HostKeyAlgorithms lists the key types that the client will - // accept from the server as host key, in order of + // HostKeyAlgorithms lists the public key algorithms that the client will + // accept from the server for host key authentication, in order of // preference. If empty, a reasonable default is used. Any - // string returned from PublicKey.Type method may be used, or - // any of the CertAlgoXxxx and KeyAlgoXxxx constants. + // string returned from a PublicKey.Type method may be used, or + // any of the CertAlgo and KeyAlgo constants. HostKeyAlgorithms []string // Timeout is the maximum amount of time for the TCP connection to establish. diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index c611aeb6..409b5ea1 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "io" + "strings" ) type authResult int @@ -29,6 +30,33 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { if err != nil { return err } + // The server may choose to send a SSH_MSG_EXT_INFO at this point (if we + // advertised willingness to receive one, which we always do) or not. See + // RFC 8308, Section 2.4. + extensions := make(map[string][]byte) + if len(packet) > 0 && packet[0] == msgExtInfo { + var extInfo extInfoMsg + if err := Unmarshal(packet, &extInfo); err != nil { + return err + } + payload := extInfo.Payload + for i := uint32(0); i < extInfo.NumExtensions; i++ { + name, rest, ok := parseString(payload) + if !ok { + return parseError(msgExtInfo) + } + value, rest, ok := parseString(rest) + if !ok { + return parseError(msgExtInfo) + } + extensions[string(name)] = value + payload = rest + } + packet, err = c.transport.readPacket() + if err != nil { + return err + } + } var serviceAccept serviceAcceptMsg if err := Unmarshal(packet, &serviceAccept); err != nil { return err @@ -41,7 +69,7 @@ func (c *connection) clientAuthenticate(config *ClientConfig) error { sessionID := c.transport.getSessionID() for auth := AuthMethod(new(noneAuth)); auth != nil; { - ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand) + ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand, extensions) if err != nil { return err } @@ -93,7 +121,7 @@ type AuthMethod interface { // If authentication is not successful, a []string of alternative // method names is returned. If the slice is nil, it will be ignored // and the previous set of possible methods will be reused. - auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) + auth(session []byte, user string, p packetConn, rand io.Reader, extensions map[string][]byte) (authResult, []string, error) // method returns the RFC 4252 method name. method() string @@ -102,7 +130,7 @@ type AuthMethod interface { // "none" authentication, RFC 4252 section 5.2. type noneAuth int -func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { +func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader, _ map[string][]byte) (authResult, []string, error) { if err := c.writePacket(Marshal(&userAuthRequestMsg{ User: user, Service: serviceSSH, @@ -122,7 +150,7 @@ func (n *noneAuth) method() string { // a function call, e.g. by prompting the user. type passwordCallback func() (password string, err error) -func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { +func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader, _ map[string][]byte) (authResult, []string, error) { type passwordAuthMsg struct { User string `sshtype:"50"` Service string @@ -189,7 +217,46 @@ func (cb publicKeyCallback) method() string { return "publickey" } -func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { +func pickSignatureAlgorithm(signer Signer, extensions map[string][]byte) (as AlgorithmSigner, algo string) { + keyFormat := signer.PublicKey().Type() + + // Like in sendKexInit, if the public key implements AlgorithmSigner we + // assume it supports all algorithms, otherwise only the key format one. + as, ok := signer.(AlgorithmSigner) + if !ok { + return algorithmSignerWrapper{signer}, keyFormat + } + + extPayload, ok := extensions["server-sig-algs"] + if !ok { + // If there is no "server-sig-algs" extension, fall back to the key + // format algorithm. + return as, keyFormat + } + + // The server-sig-algs extension only carries underlying signature + // algorithm, but we are trying to select a protocol-level public key + // algorithm, which might be a certificate type. Extend the list of server + // supported algorithms to include the corresponding certificate algorithms. + serverAlgos := strings.Split(string(extPayload), ",") + for _, algo := range serverAlgos { + if certAlgo, ok := certificateAlgo(algo); ok { + serverAlgos = append(serverAlgos, certAlgo) + } + } + + keyAlgos := algorithmsForKeyFormat(keyFormat) + algo, err := findCommon("public key signature algorithm", keyAlgos, serverAlgos) + if err != nil { + // If there is no overlap, try the key anyway with the key format + // algorithm, to support servers that fail to list all supported + // algorithms. + return as, keyFormat + } + return as, algo +} + +func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader, extensions map[string][]byte) (authResult, []string, error) { // Authentication is performed by sending an enquiry to test if a key is // acceptable to the remote. If the key is acceptable, the client will // attempt to authenticate with the valid key. If not the client will repeat @@ -201,7 +268,10 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand } var methods []string for _, signer := range signers { - ok, err := validateKey(signer.PublicKey(), user, c) + pub := signer.PublicKey() + as, algo := pickSignatureAlgorithm(signer, extensions) + + ok, err := validateKey(pub, algo, user, c) if err != nil { return authFailure, nil, err } @@ -209,13 +279,13 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand continue } - pub := signer.PublicKey() pubKey := pub.Marshal() - sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{ + data := buildDataSignedForAuth(session, userAuthRequestMsg{ User: user, Service: serviceSSH, Method: cb.method(), - }, []byte(pub.Type()), pubKey)) + }, algo, pubKey) + sign, err := as.SignWithAlgorithm(rand, data, underlyingAlgo(algo)) if err != nil { return authFailure, nil, err } @@ -229,7 +299,7 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand Service: serviceSSH, Method: cb.method(), HasSig: true, - Algoname: pub.Type(), + Algoname: algo, PubKey: pubKey, Sig: sig, } @@ -266,26 +336,25 @@ func containsMethod(methods []string, method string) bool { } // validateKey validates the key provided is acceptable to the server. -func validateKey(key PublicKey, user string, c packetConn) (bool, error) { +func validateKey(key PublicKey, algo string, user string, c packetConn) (bool, error) { pubKey := key.Marshal() msg := publickeyAuthMsg{ User: user, Service: serviceSSH, Method: "publickey", HasSig: false, - Algoname: key.Type(), + Algoname: algo, PubKey: pubKey, } if err := c.writePacket(Marshal(&msg)); err != nil { return false, err } - return confirmKeyAck(key, c) + return confirmKeyAck(key, algo, c) } -func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { +func confirmKeyAck(key PublicKey, algo string, c packetConn) (bool, error) { pubKey := key.Marshal() - algoname := key.Type() for { packet, err := c.readPacket() @@ -302,14 +371,14 @@ func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { if err := Unmarshal(packet, &msg); err != nil { return false, err } - if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) { + if msg.Algo != algo || !bytes.Equal(msg.PubKey, pubKey) { return false, nil } return true, nil case msgUserAuthFailure: return false, nil default: - return false, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + return false, unexpectedMessageError(msgUserAuthPubKeyOk, packet[0]) } } } @@ -330,6 +399,7 @@ func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMet // along with a list of remaining authentication methods to try next and // an error if an unexpected response was received. func handleAuthResponse(c packetConn) (authResult, []string, error) { + gotMsgExtInfo := false for { packet, err := c.readPacket() if err != nil { @@ -341,6 +411,12 @@ func handleAuthResponse(c packetConn) (authResult, []string, error) { if err := handleBannerResponse(c, packet); err != nil { return authFailure, nil, err } + case msgExtInfo: + // Ignore post-authentication RFC 8308 extensions, once. + if gotMsgExtInfo { + return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + } + gotMsgExtInfo = true case msgUserAuthFailure: var msg userAuthFailureMsg if err := Unmarshal(packet, &msg); err != nil { @@ -380,10 +456,10 @@ func handleBannerResponse(c packetConn, packet []byte) error { // disabling echoing (e.g. for passwords), and return all the answers. // Challenge may be called multiple times in a single session. After // successful authentication, the server may send a challenge with no -// questions, for which the user and instruction messages should be +// questions, for which the name and instruction messages should be // printed. RFC 4256 section 3.3 details how the UI should behave for // both CLI and GUI environments. -type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) +type KeyboardInteractiveChallenge func(name, instruction string, questions []string, echos []bool) (answers []string, err error) // KeyboardInteractive returns an AuthMethod using a prompt/response // sequence controlled by the server. @@ -395,7 +471,7 @@ func (cb KeyboardInteractiveChallenge) method() string { return "keyboard-interactive" } -func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { +func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader, _ map[string][]byte) (authResult, []string, error) { type initiateMsg struct { User string `sshtype:"50"` Service string @@ -412,6 +488,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe return authFailure, nil, err } + gotMsgExtInfo := false for { packet, err := c.readPacket() if err != nil { @@ -425,6 +502,13 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe return authFailure, nil, err } continue + case msgExtInfo: + // Ignore post-authentication RFC 8308 extensions, once. + if gotMsgExtInfo { + return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) + } + gotMsgExtInfo = true + continue case msgUserAuthInfoRequest: // OK case msgUserAuthFailure: @@ -465,7 +549,7 @@ func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packe return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") } - answers, err := cb(msg.User, msg.Instruction, prompts, echos) + answers, err := cb(msg.Name, msg.Instruction, prompts, echos) if err != nil { return authFailure, nil, err } @@ -497,9 +581,9 @@ type retryableAuthMethod struct { maxTries int } -func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { +func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader, extensions map[string][]byte) (ok authResult, methods []string, err error) { for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { - ok, methods, err = r.authMethod.auth(session, user, c, rand) + ok, methods, err = r.authMethod.auth(session, user, c, rand, extensions) if ok != authFailure || err != nil { // either success, partial success or error terminate return ok, methods, err } @@ -542,7 +626,7 @@ type gssAPIWithMICCallback struct { target string } -func (g *gssAPIWithMICCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { +func (g *gssAPIWithMICCallback) auth(session []byte, user string, c packetConn, rand io.Reader, _ map[string][]byte) (authResult, []string, error) { m := &userAuthRequestMsg{ User: user, Service: serviceSSH, diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index 290382d0..7a5ff2d2 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -44,11 +44,11 @@ var preferredCiphers = []string{ // supportedKexAlgos specifies the supported key-exchange algorithms in // preference order. var supportedKexAlgos = []string{ - kexAlgoCurve25519SHA256, + kexAlgoCurve25519SHA256, kexAlgoCurve25519SHA256LibSSH, // P384 and P521 are not constant-time yet, but since we don't // reuse ephemeral keys, using them for ECDH should be OK. kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, - kexAlgoDH14SHA1, kexAlgoDH1SHA1, + kexAlgoDH14SHA256, kexAlgoDH14SHA1, kexAlgoDH1SHA1, } // serverForbiddenKexAlgos contains key exchange algorithms, that are forbidden @@ -61,18 +61,20 @@ var serverForbiddenKexAlgos = map[string]struct{}{ // preferredKexAlgos specifies the default preference for key-exchange algorithms // in preference order. var preferredKexAlgos = []string{ - kexAlgoCurve25519SHA256, + kexAlgoCurve25519SHA256, kexAlgoCurve25519SHA256LibSSH, kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, - kexAlgoDH14SHA1, + kexAlgoDH14SHA256, kexAlgoDH14SHA1, } // supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods // of authenticating servers) in preference order. var supportedHostKeyAlgos = []string{ + CertAlgoRSASHA512v01, CertAlgoRSASHA256v01, CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, + KeyAlgoRSASHA512, KeyAlgoRSASHA256, KeyAlgoRSA, KeyAlgoDSA, KeyAlgoED25519, @@ -87,19 +89,33 @@ var supportedMACs = []string{ var supportedCompressions = []string{compressionNone} -// hashFuncs keeps the mapping of supported algorithms to their respective -// hashes needed for signature verification. +// hashFuncs keeps the mapping of supported signature algorithms to their +// respective hashes needed for signing and verification. var hashFuncs = map[string]crypto.Hash{ - KeyAlgoRSA: crypto.SHA1, - KeyAlgoDSA: crypto.SHA1, - KeyAlgoECDSA256: crypto.SHA256, - KeyAlgoECDSA384: crypto.SHA384, - KeyAlgoECDSA521: crypto.SHA512, - CertAlgoRSAv01: crypto.SHA1, - CertAlgoDSAv01: crypto.SHA1, - CertAlgoECDSA256v01: crypto.SHA256, - CertAlgoECDSA384v01: crypto.SHA384, - CertAlgoECDSA521v01: crypto.SHA512, + KeyAlgoRSA: crypto.SHA1, + KeyAlgoRSASHA256: crypto.SHA256, + KeyAlgoRSASHA512: crypto.SHA512, + KeyAlgoDSA: crypto.SHA1, + KeyAlgoECDSA256: crypto.SHA256, + KeyAlgoECDSA384: crypto.SHA384, + KeyAlgoECDSA521: crypto.SHA512, + // KeyAlgoED25519 doesn't pre-hash. + KeyAlgoSKECDSA256: crypto.SHA256, + KeyAlgoSKED25519: crypto.SHA256, +} + +// algorithmsForKeyFormat returns the supported signature algorithms for a given +// public key format (PublicKey.Type), in order of preference. See RFC 8332, +// Section 2. See also the note in sendKexInit on backwards compatibility. +func algorithmsForKeyFormat(keyFormat string) []string { + switch keyFormat { + case KeyAlgoRSA: + return []string{KeyAlgoRSASHA256, KeyAlgoRSASHA512, KeyAlgoRSA} + case CertAlgoRSAv01: + return []string{CertAlgoRSASHA256v01, CertAlgoRSASHA512v01, CertAlgoRSAv01} + default: + return []string{keyFormat} + } } // unexpectedMessageError results when the SSH message that we received didn't @@ -133,7 +149,7 @@ type directionAlgorithms struct { // rekeyBytes returns a rekeying intervals in bytes. func (a *directionAlgorithms) rekeyBytes() int64 { - // According to RFC4344 block ciphers should rekey after + // According to RFC 4344 block ciphers should rekey after // 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is // 128. switch a.Cipher { @@ -142,10 +158,15 @@ func (a *directionAlgorithms) rekeyBytes() int64 { } - // For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. + // For others, stick with RFC 4253 recommendation to rekey after 1 Gb of data. return 1 << 30 } +var aeadCiphers = map[string]bool{ + gcmCipherID: true, + chacha20Poly1305ID: true, +} + type algorithms struct { kex string hostKey string @@ -181,14 +202,18 @@ func findAgreedAlgorithms(isClient bool, clientKexInit, serverKexInit *kexInitMs return } - ctos.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) - if err != nil { - return + if !aeadCiphers[ctos.Cipher] { + ctos.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) + if err != nil { + return + } } - stoc.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) - if err != nil { - return + if !aeadCiphers[stoc.Cipher] { + stoc.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) + if err != nil { + return + } } ctos.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) @@ -272,8 +297,9 @@ func (c *Config) SetDefaults() { } // buildDataSignedForAuth returns the data that is signed in order to prove -// possession of a private key. See RFC 4252, section 7. -func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { +// possession of a private key. See RFC 4252, section 7. algo is the advertised +// algorithm, and may be a certificate type. +func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo string, pubKey []byte) []byte { data := struct { Session []byte Type byte @@ -281,7 +307,7 @@ func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubK Service string Method string Sign bool - Algo []byte + Algo string PubKey []byte }{ sessionID, diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go index fd6b0681..35661a52 100644 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ b/vendor/golang.org/x/crypto/ssh/connection.go @@ -52,7 +52,7 @@ type Conn interface { // SendRequest sends a global request, and returns the // reply. If wantReply is true, it returns the response status - // and payload. See also RFC4254, section 4. + // and payload. See also RFC 4254, section 4. SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) // OpenChannel tries to open an channel. If the request is diff --git a/vendor/golang.org/x/crypto/ssh/doc.go b/vendor/golang.org/x/crypto/ssh/doc.go index 67b7322c..f6bff60d 100644 --- a/vendor/golang.org/x/crypto/ssh/doc.go +++ b/vendor/golang.org/x/crypto/ssh/doc.go @@ -12,8 +12,9 @@ the multiplexed nature of SSH is exposed to users that wish to support others. References: - [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD - [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 + + [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD + [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 This package does not fall under the stability promise of the Go language itself, so its API may be changed when pressing needs arise. diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 2b10b05a..653dc4d2 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -455,14 +455,38 @@ func (t *handshakeTransport) sendKexInit() error { } io.ReadFull(rand.Reader, msg.Cookie[:]) - if len(t.hostKeys) > 0 { + isServer := len(t.hostKeys) > 0 + if isServer { for _, k := range t.hostKeys { - msg.ServerHostKeyAlgos = append( - msg.ServerHostKeyAlgos, k.PublicKey().Type()) + // If k is an AlgorithmSigner, presume it supports all signature algorithms + // associated with the key format. (Ideally AlgorithmSigner would have a + // method to advertise supported algorithms, but it doesn't. This means that + // adding support for a new algorithm is a breaking change, as we will + // immediately negotiate it even if existing implementations don't support + // it. If that ever happens, we'll have to figure something out.) + // If k is not an AlgorithmSigner, we can only assume it only supports the + // algorithms that matches the key format. (This means that Sign can't pick + // a different default.) + keyFormat := k.PublicKey().Type() + if _, ok := k.(AlgorithmSigner); ok { + msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algorithmsForKeyFormat(keyFormat)...) + } else { + msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, keyFormat) + } } } else { msg.ServerHostKeyAlgos = t.hostKeyAlgorithms + + // As a client we opt in to receiving SSH_MSG_EXT_INFO so we know what + // algorithms the server supports for public key authentication. See RFC + // 8308, Section 2.1. + if firstKeyExchange := t.sessionID == nil; firstKeyExchange { + msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1) + msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...) + msg.KexAlgos = append(msg.KexAlgos, "ext-info-c") + } } + packet := Marshal(msg) // writePacket destroys the contents, so save a copy. @@ -582,9 +606,9 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { var result *kexResult if len(t.hostKeys) > 0 { - result, err = t.server(kex, t.algorithms, &magics) + result, err = t.server(kex, &magics) } else { - result, err = t.client(kex, t.algorithms, &magics) + result, err = t.client(kex, &magics) } if err != nil { @@ -611,19 +635,52 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { return nil } -func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { - var hostKey Signer - for _, k := range t.hostKeys { - if algs.hostKey == k.PublicKey().Type() { - hostKey = k +// algorithmSignerWrapper is an AlgorithmSigner that only supports the default +// key format algorithm. +// +// This is technically a violation of the AlgorithmSigner interface, but it +// should be unreachable given where we use this. Anyway, at least it returns an +// error instead of panicing or producing an incorrect signature. +type algorithmSignerWrapper struct { + Signer +} + +func (a algorithmSignerWrapper) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { + if algorithm != underlyingAlgo(a.PublicKey().Type()) { + return nil, errors.New("ssh: internal error: algorithmSignerWrapper invoked with non-default algorithm") + } + return a.Sign(rand, data) +} + +func pickHostKey(hostKeys []Signer, algo string) AlgorithmSigner { + for _, k := range hostKeys { + if algo == k.PublicKey().Type() { + return algorithmSignerWrapper{k} + } + k, ok := k.(AlgorithmSigner) + if !ok { + continue + } + for _, a := range algorithmsForKeyFormat(k.PublicKey().Type()) { + if algo == a { + return k + } } } + return nil +} + +func (t *handshakeTransport) server(kex kexAlgorithm, magics *handshakeMagics) (*kexResult, error) { + hostKey := pickHostKey(t.hostKeys, t.algorithms.hostKey) + if hostKey == nil { + return nil, errors.New("ssh: internal error: negotiated unsupported signature type") + } - r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey) + r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey, t.algorithms.hostKey) return r, err } -func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { +func (t *handshakeTransport) client(kex kexAlgorithm, magics *handshakeMagics) (*kexResult, error) { result, err := kex.Client(t.conn, t.config.Rand, magics) if err != nil { return nil, err @@ -634,7 +691,7 @@ func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics * return nil, err } - if err := verifyHostKeySignature(hostKey, result); err != nil { + if err := verifyHostKeySignature(hostKey, t.algorithms.hostKey, result); err != nil { return nil, err } diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go index 766e9293..927a90cd 100644 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ b/vendor/golang.org/x/crypto/ssh/kex.go @@ -20,12 +20,14 @@ import ( ) const ( - kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" - kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" - kexAlgoECDH256 = "ecdh-sha2-nistp256" - kexAlgoECDH384 = "ecdh-sha2-nistp384" - kexAlgoECDH521 = "ecdh-sha2-nistp521" - kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" + kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" + kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" + kexAlgoDH14SHA256 = "diffie-hellman-group14-sha256" + kexAlgoECDH256 = "ecdh-sha2-nistp256" + kexAlgoECDH384 = "ecdh-sha2-nistp384" + kexAlgoECDH521 = "ecdh-sha2-nistp521" + kexAlgoCurve25519SHA256LibSSH = "curve25519-sha256@libssh.org" + kexAlgoCurve25519SHA256 = "curve25519-sha256" // For the following kex only the client half contains a production // ready implementation. The server half only consists of a minimal @@ -75,8 +77,9 @@ func (m *handshakeMagics) write(w io.Writer) { // kexAlgorithm abstracts different key exchange algorithms. type kexAlgorithm interface { // Server runs server-side key agreement, signing the result - // with a hostkey. - Server(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error) + // with a hostkey. algo is the negotiated algorithm, and may + // be a certificate type. + Server(p packetConn, rand io.Reader, magics *handshakeMagics, s AlgorithmSigner, algo string) (*kexResult, error) // Client runs the client-side key agreement. Caller is // responsible for verifying the host key signature. @@ -86,6 +89,7 @@ type kexAlgorithm interface { // dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement. type dhGroup struct { g, p, pMinus1 *big.Int + hashFunc crypto.Hash } func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { @@ -96,8 +100,6 @@ func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, } func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { - hashFunc := crypto.SHA1 - var x *big.Int for { var err error @@ -132,7 +134,7 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha return nil, err } - h := hashFunc.New() + h := group.hashFunc.New() magics.write(h) writeString(h, kexDHReply.HostKey) writeInt(h, X) @@ -146,12 +148,11 @@ func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handsha K: K, HostKey: kexDHReply.HostKey, Signature: kexDHReply.Signature, - Hash: crypto.SHA1, + Hash: group.hashFunc, }, nil } -func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - hashFunc := crypto.SHA1 +func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv AlgorithmSigner, algo string) (result *kexResult, err error) { packet, err := c.readPacket() if err != nil { return @@ -179,7 +180,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha hostKeyBytes := priv.PublicKey().Marshal() - h := hashFunc.New() + h := group.hashFunc.New() magics.write(h) writeString(h, hostKeyBytes) writeInt(h, kexDHInit.X) @@ -193,7 +194,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha // H is already a hash, but the hostkey signing will apply its // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, randSource, H) + sig, err := signAndMarshal(priv, randSource, H, algo) if err != nil { return nil, err } @@ -211,7 +212,7 @@ func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handsha K: K, HostKey: hostKeyBytes, Signature: sig, - Hash: crypto.SHA1, + Hash: group.hashFunc, }, err } @@ -314,7 +315,7 @@ func validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool { return true } -func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { +func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv AlgorithmSigner, algo string) (result *kexResult, err error) { packet, err := c.readPacket() if err != nil { return nil, err @@ -359,7 +360,7 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p // H is already a hash, but the hostkey signing will apply its // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, rand, H) + sig, err := signAndMarshal(priv, rand, H, algo) if err != nil { return nil, err } @@ -384,39 +385,62 @@ func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, p }, nil } +// ecHash returns the hash to match the given elliptic curve, see RFC +// 5656, section 6.2.1 +func ecHash(curve elliptic.Curve) crypto.Hash { + bitSize := curve.Params().BitSize + switch { + case bitSize <= 256: + return crypto.SHA256 + case bitSize <= 384: + return crypto.SHA384 + } + return crypto.SHA512 +} + var kexAlgoMap = map[string]kexAlgorithm{} func init() { - // This is the group called diffie-hellman-group1-sha1 in RFC - // 4253 and Oakley Group 2 in RFC 2409. + // This is the group called diffie-hellman-group1-sha1 in + // RFC 4253 and Oakley Group 2 in RFC 2409. p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, - pMinus1: new(big.Int).Sub(p, bigOne), + g: new(big.Int).SetInt64(2), + p: p, + pMinus1: new(big.Int).Sub(p, bigOne), + hashFunc: crypto.SHA1, } - // This is the group called diffie-hellman-group14-sha1 in RFC - // 4253 and Oakley Group 14 in RFC 3526. + // This are the groups called diffie-hellman-group14-sha1 and + // diffie-hellman-group14-sha256 in RFC 4253 and RFC 8268, + // and Oakley Group 14 in RFC 3526. p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) - - kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ + group14 := &dhGroup{ g: new(big.Int).SetInt64(2), p: p, pMinus1: new(big.Int).Sub(p, bigOne), } + kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ + g: group14.g, p: group14.p, pMinus1: group14.pMinus1, + hashFunc: crypto.SHA1, + } + kexAlgoMap[kexAlgoDH14SHA256] = &dhGroup{ + g: group14.g, p: group14.p, pMinus1: group14.pMinus1, + hashFunc: crypto.SHA256, + } + kexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()} kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} + kexAlgoMap[kexAlgoCurve25519SHA256LibSSH] = &curve25519sha256{} kexAlgoMap[kexAlgoDHGEXSHA1] = &dhGEXSHA{hashFunc: crypto.SHA1} kexAlgoMap[kexAlgoDHGEXSHA256] = &dhGEXSHA{hashFunc: crypto.SHA256} } -// curve25519sha256 implements the curve25519-sha256@libssh.org key -// agreement protocol, as described in -// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt +// curve25519sha256 implements the curve25519-sha256 (formerly known as +// curve25519-sha256@libssh.org) key exchange method, as described in RFC 8731. type curve25519sha256 struct{} type curve25519KeyPair struct { @@ -486,7 +510,7 @@ func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handsh }, nil } -func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { +func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv AlgorithmSigner, algo string) (result *kexResult, err error) { packet, err := c.readPacket() if err != nil { return @@ -527,7 +551,7 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh H := h.Sum(nil) - sig, err := signAndMarshal(priv, rand, H) + sig, err := signAndMarshal(priv, rand, H, algo) if err != nil { return nil, err } @@ -553,7 +577,6 @@ func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handsh // diffie-hellman-group-exchange-sha256 key agreement protocols, // as described in RFC 4419 type dhGEXSHA struct { - g, p *big.Int hashFunc crypto.Hash } @@ -563,14 +586,7 @@ const ( dhGroupExchangeMaximumBits = 8192 ) -func (gex *dhGEXSHA) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { - if theirPublic.Sign() <= 0 || theirPublic.Cmp(gex.p) >= 0 { - return nil, fmt.Errorf("ssh: DH parameter out of bounds") - } - return new(big.Int).Exp(theirPublic, myPrivate, gex.p), nil -} - -func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { +func (gex *dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { // Send GexRequest kexDHGexRequest := kexDHGexRequestMsg{ MinBits: dhGroupExchangeMinimumBits, @@ -587,35 +603,29 @@ func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshake return nil, err } - var kexDHGexGroup kexDHGexGroupMsg - if err = Unmarshal(packet, &kexDHGexGroup); err != nil { + var msg kexDHGexGroupMsg + if err = Unmarshal(packet, &msg); err != nil { return nil, err } // reject if p's bit length < dhGroupExchangeMinimumBits or > dhGroupExchangeMaximumBits - if kexDHGexGroup.P.BitLen() < dhGroupExchangeMinimumBits || kexDHGexGroup.P.BitLen() > dhGroupExchangeMaximumBits { - return nil, fmt.Errorf("ssh: server-generated gex p is out of range (%d bits)", kexDHGexGroup.P.BitLen()) + if msg.P.BitLen() < dhGroupExchangeMinimumBits || msg.P.BitLen() > dhGroupExchangeMaximumBits { + return nil, fmt.Errorf("ssh: server-generated gex p is out of range (%d bits)", msg.P.BitLen()) } - gex.p = kexDHGexGroup.P - gex.g = kexDHGexGroup.G - - // Check if g is safe by verifing that g > 1 and g < p - 1 - one := big.NewInt(1) - var pMinusOne = &big.Int{} - pMinusOne.Sub(gex.p, one) - if gex.g.Cmp(one) != 1 && gex.g.Cmp(pMinusOne) != -1 { + // Check if g is safe by verifying that 1 < g < p-1 + pMinusOne := new(big.Int).Sub(msg.P, bigOne) + if msg.G.Cmp(bigOne) <= 0 || msg.G.Cmp(pMinusOne) >= 0 { return nil, fmt.Errorf("ssh: server provided gex g is not safe") } // Send GexInit - var pHalf = &big.Int{} - pHalf.Rsh(gex.p, 1) + pHalf := new(big.Int).Rsh(msg.P, 1) x, err := rand.Int(randSource, pHalf) if err != nil { return nil, err } - X := new(big.Int).Exp(gex.g, x, gex.p) + X := new(big.Int).Exp(msg.G, x, msg.P) kexDHGexInit := kexDHGexInitMsg{ X: X, } @@ -634,13 +644,13 @@ func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshake return nil, err } - kInt, err := gex.diffieHellman(kexDHGexReply.Y, x) - if err != nil { - return nil, err + if kexDHGexReply.Y.Cmp(bigOne) <= 0 || kexDHGexReply.Y.Cmp(pMinusOne) >= 0 { + return nil, errors.New("ssh: DH parameter out of bounds") } + kInt := new(big.Int).Exp(kexDHGexReply.Y, x, msg.P) - // Check if k is safe by verifing that k > 1 and k < p - 1 - if kInt.Cmp(one) != 1 && kInt.Cmp(pMinusOne) != -1 { + // Check if k is safe by verifying that k > 1 and k < p - 1 + if kInt.Cmp(bigOne) <= 0 || kInt.Cmp(pMinusOne) >= 0 { return nil, fmt.Errorf("ssh: derived k is not safe") } @@ -650,8 +660,8 @@ func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshake binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) - writeInt(h, gex.p) - writeInt(h, gex.g) + writeInt(h, msg.P) + writeInt(h, msg.G) writeInt(h, X) writeInt(h, kexDHGexReply.Y) K := make([]byte, intLength(kInt)) @@ -670,7 +680,7 @@ func (gex dhGEXSHA) Client(c packetConn, randSource io.Reader, magics *handshake // Server half implementation of the Diffie Hellman Key Exchange with SHA1 and SHA256. // // This is a minimal implementation to satisfy the automated tests. -func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { +func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv AlgorithmSigner, algo string) (result *kexResult, err error) { // Receive GexRequest packet, err := c.readPacket() if err != nil { @@ -681,35 +691,17 @@ func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshake return } - // smoosh the user's preferred size into our own limits - if kexDHGexRequest.PreferedBits > dhGroupExchangeMaximumBits { - kexDHGexRequest.PreferedBits = dhGroupExchangeMaximumBits - } - if kexDHGexRequest.PreferedBits < dhGroupExchangeMinimumBits { - kexDHGexRequest.PreferedBits = dhGroupExchangeMinimumBits - } - // fix min/max if they're inconsistent. technically, we could just pout - // and hang up, but there's no harm in giving them the benefit of the - // doubt and just picking a bitsize for them. - if kexDHGexRequest.MinBits > kexDHGexRequest.PreferedBits { - kexDHGexRequest.MinBits = kexDHGexRequest.PreferedBits - } - if kexDHGexRequest.MaxBits < kexDHGexRequest.PreferedBits { - kexDHGexRequest.MaxBits = kexDHGexRequest.PreferedBits - } - // Send GexGroup // This is the group called diffie-hellman-group14-sha1 in RFC // 4253 and Oakley Group 14 in RFC 3526. p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) - gex.p = p - gex.g = big.NewInt(2) + g := big.NewInt(2) - kexDHGexGroup := kexDHGexGroupMsg{ - P: gex.p, - G: gex.g, + msg := &kexDHGexGroupMsg{ + P: p, + G: g, } - if err := c.writePacket(Marshal(&kexDHGexGroup)); err != nil { + if err := c.writePacket(Marshal(msg)); err != nil { return nil, err } @@ -723,19 +715,19 @@ func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshake return } - var pHalf = &big.Int{} - pHalf.Rsh(gex.p, 1) + pHalf := new(big.Int).Rsh(p, 1) y, err := rand.Int(randSource, pHalf) if err != nil { return } + Y := new(big.Int).Exp(g, y, p) - Y := new(big.Int).Exp(gex.g, y, gex.p) - kInt, err := gex.diffieHellman(kexDHGexInit.X, y) - if err != nil { - return nil, err + pMinusOne := new(big.Int).Sub(p, bigOne) + if kexDHGexInit.X.Cmp(bigOne) <= 0 || kexDHGexInit.X.Cmp(pMinusOne) >= 0 { + return nil, errors.New("ssh: DH parameter out of bounds") } + kInt := new(big.Int).Exp(kexDHGexInit.X, y, p) hostKeyBytes := priv.PublicKey().Marshal() @@ -745,8 +737,8 @@ func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshake binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMinimumBits)) binary.Write(h, binary.BigEndian, uint32(dhGroupExchangePreferredBits)) binary.Write(h, binary.BigEndian, uint32(dhGroupExchangeMaximumBits)) - writeInt(h, gex.p) - writeInt(h, gex.g) + writeInt(h, p) + writeInt(h, g) writeInt(h, kexDHGexInit.X) writeInt(h, Y) @@ -758,7 +750,7 @@ func (gex dhGEXSHA) Server(c packetConn, randSource io.Reader, magics *handshake // H is already a hash, but the hostkey signing will apply its // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, randSource, H) + sig, err := signAndMarshal(priv, randSource, H, algo) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 31f26349..72969804 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -30,8 +30,9 @@ import ( "golang.org/x/crypto/ssh/internal/bcrypt_pbkdf" ) -// These constants represent the algorithm names for key types supported by this -// package. +// Public key algorithms names. These values can appear in PublicKey.Type, +// ClientConfig.HostKeyAlgorithms, Signature.Format, or as AlgorithmSigner +// arguments. const ( KeyAlgoRSA = "ssh-rsa" KeyAlgoDSA = "ssh-dss" @@ -41,16 +42,21 @@ const ( KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" KeyAlgoED25519 = "ssh-ed25519" KeyAlgoSKED25519 = "sk-ssh-ed25519@openssh.com" + + // KeyAlgoRSASHA256 and KeyAlgoRSASHA512 are only public key algorithms, not + // public key formats, so they can't appear as a PublicKey.Type. The + // corresponding PublicKey.Type is KeyAlgoRSA. See RFC 8332, Section 2. + KeyAlgoRSASHA256 = "rsa-sha2-256" + KeyAlgoRSASHA512 = "rsa-sha2-512" ) -// These constants represent non-default signature algorithms that are supported -// as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See -// [PROTOCOL.agent] section 4.5.1 and -// https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10 const ( - SigAlgoRSA = "ssh-rsa" - SigAlgoRSASHA2256 = "rsa-sha2-256" - SigAlgoRSASHA2512 = "rsa-sha2-512" + // Deprecated: use KeyAlgoRSA. + SigAlgoRSA = KeyAlgoRSA + // Deprecated: use KeyAlgoRSASHA256. + SigAlgoRSASHA2256 = KeyAlgoRSASHA256 + // Deprecated: use KeyAlgoRSASHA512. + SigAlgoRSASHA2512 = KeyAlgoRSASHA512 ) // parsePubKey parses a public key of the given algorithm. @@ -70,7 +76,7 @@ func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err err case KeyAlgoSKED25519: return parseSKEd25519(in) case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: - cert, err := parseCert(in, certToPrivAlgo(algo)) + cert, err := parseCert(in, certKeyAlgoNames[algo]) if err != nil { return nil, nil, err } @@ -178,7 +184,7 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey return "", nil, nil, "", nil, io.EOF } -// ParseAuthorizedKeys parses a public key from an authorized_keys +// ParseAuthorizedKey parses a public key from an authorized_keys // file used in OpenSSH according to the sshd(8) manual page. func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { for len(in) > 0 { @@ -289,18 +295,21 @@ func MarshalAuthorizedKey(key PublicKey) []byte { return b.Bytes() } -// PublicKey is an abstraction of different types of public keys. +// PublicKey represents a public key using an unspecified algorithm. +// +// Some PublicKeys provided by this package also implement CryptoPublicKey. type PublicKey interface { - // Type returns the key's type, e.g. "ssh-rsa". + // Type returns the key format name, e.g. "ssh-rsa". Type() string - // Marshal returns the serialized key data in SSH wire format, - // with the name prefix. To unmarshal the returned data, use - // the ParsePublicKey function. + // Marshal returns the serialized key data in SSH wire format, with the name + // prefix. To unmarshal the returned data, use the ParsePublicKey function. Marshal() []byte - // Verify that sig is a signature on the given data using this - // key. This function will hash the data appropriately first. + // Verify that sig is a signature on the given data using this key. This + // method will hash the data appropriately first. sig.Format is allowed to + // be any signature algorithm compatible with the key type, the caller + // should check if it has more stringent requirements. Verify(data []byte, sig *Signature) error } @@ -311,25 +320,32 @@ type CryptoPublicKey interface { } // A Signer can create signatures that verify against a public key. +// +// Some Signers provided by this package also implement AlgorithmSigner. type Signer interface { - // PublicKey returns an associated PublicKey instance. + // PublicKey returns the associated PublicKey. PublicKey() PublicKey - // Sign returns raw signature for the given data. This method - // will apply the hash specified for the keytype to the data. + // Sign returns a signature for the given data. This method will hash the + // data appropriately first. The signature algorithm is expected to match + // the key format returned by the PublicKey.Type method (and not to be any + // alternative algorithm supported by the key format). Sign(rand io.Reader, data []byte) (*Signature, error) } -// A AlgorithmSigner is a Signer that also supports specifying a specific -// algorithm to use for signing. +// An AlgorithmSigner is a Signer that also supports specifying an algorithm to +// use for signing. +// +// An AlgorithmSigner can't advertise the algorithms it supports, so it should +// be prepared to be invoked with every algorithm supported by the public key +// format. type AlgorithmSigner interface { Signer - // SignWithAlgorithm is like Signer.Sign, but allows specification of a - // non-default signing algorithm. See the SigAlgo* constants in this - // package for signature algorithms supported by this package. Callers may - // pass an empty string for the algorithm in which case the AlgorithmSigner - // will use its default algorithm. + // SignWithAlgorithm is like Signer.Sign, but allows specifying a desired + // signing algorithm. Callers may pass an empty string for the algorithm in + // which case the AlgorithmSigner will use a default algorithm. This default + // doesn't currently control any behavior in this package. SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) } @@ -381,17 +397,11 @@ func (r *rsaPublicKey) Marshal() []byte { } func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { - var hash crypto.Hash - switch sig.Format { - case SigAlgoRSA: - hash = crypto.SHA1 - case SigAlgoRSASHA2256: - hash = crypto.SHA256 - case SigAlgoRSASHA2512: - hash = crypto.SHA512 - default: + supportedAlgos := algorithmsForKeyFormat(r.Type()) + if !contains(supportedAlgos, sig.Format) { return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) } + hash := hashFuncs[sig.Format] h := hash.New() h.Write(data) digest := h.Sum(nil) @@ -466,7 +476,7 @@ func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error { if sig.Format != k.Type() { return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } - h := crypto.SHA1.New() + h := hashFuncs[sig.Format].New() h.Write(data) digest := h.Sum(nil) @@ -499,7 +509,7 @@ func (k *dsaPrivateKey) PublicKey() PublicKey { } func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { - return k.SignWithAlgorithm(rand, data, "") + return k.SignWithAlgorithm(rand, data, k.PublicKey().Type()) } func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { @@ -507,7 +517,7 @@ func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) } - h := crypto.SHA1.New() + h := hashFuncs[k.PublicKey().Type()].New() h.Write(data) digest := h.Sum(nil) r, s, err := dsa.Sign(rand, k.PrivateKey, digest) @@ -603,19 +613,6 @@ func supportedEllipticCurve(curve elliptic.Curve) bool { return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521() } -// ecHash returns the hash to match the given elliptic curve, see RFC -// 5656, section 6.2.1 -func ecHash(curve elliptic.Curve) crypto.Hash { - bitSize := curve.Params().BitSize - switch { - case bitSize <= 256: - return crypto.SHA256 - case bitSize <= 384: - return crypto.SHA384 - } - return crypto.SHA512 -} - // parseECDSA parses an ECDSA key according to RFC 5656, section 3.1. func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { var w struct { @@ -671,7 +668,7 @@ func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } - h := ecHash(k.Curve).New() + h := hashFuncs[sig.Format].New() h.Write(data) digest := h.Sum(nil) @@ -775,7 +772,7 @@ func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error { return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) } - h := ecHash(k.Curve).New() + h := hashFuncs[sig.Format].New() h.Write([]byte(k.application)) appDigest := h.Sum(nil) @@ -874,7 +871,7 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error { return fmt.Errorf("invalid size %d for Ed25519 public key", l) } - h := sha256.New() + h := hashFuncs[sig.Format].New() h.Write([]byte(k.application)) appDigest := h.Sum(nil) @@ -961,44 +958,20 @@ func (s *wrappedSigner) PublicKey() PublicKey { } func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { - return s.SignWithAlgorithm(rand, data, "") + return s.SignWithAlgorithm(rand, data, s.pubKey.Type()) } func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { - var hashFunc crypto.Hash - - if _, ok := s.pubKey.(*rsaPublicKey); ok { - // RSA keys support a few hash functions determined by the requested signature algorithm - switch algorithm { - case "", SigAlgoRSA: - algorithm = SigAlgoRSA - hashFunc = crypto.SHA1 - case SigAlgoRSASHA2256: - hashFunc = crypto.SHA256 - case SigAlgoRSASHA2512: - hashFunc = crypto.SHA512 - default: - return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) - } - } else { - // The only supported algorithm for all other key types is the same as the type of the key - if algorithm == "" { - algorithm = s.pubKey.Type() - } else if algorithm != s.pubKey.Type() { - return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) - } + if algorithm == "" { + algorithm = s.pubKey.Type() + } - switch key := s.pubKey.(type) { - case *dsaPublicKey: - hashFunc = crypto.SHA1 - case *ecdsaPublicKey: - hashFunc = ecHash(key.Curve) - case ed25519PublicKey: - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } + supportedAlgos := algorithmsForKeyFormat(s.pubKey.Type()) + if !contains(supportedAlgos, algorithm) { + return nil, fmt.Errorf("ssh: unsupported signature algorithm %q for key format %q", algorithm, s.pubKey.Type()) } + hashFunc := hashFuncs[algorithm] var digest []byte if hashFunc != 0 { h := hashFunc.New() diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go index ac41a416..19bc67c4 100644 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ b/vendor/golang.org/x/crypto/ssh/messages.go @@ -141,6 +141,14 @@ type serviceAcceptMsg struct { Service string `sshtype:"6"` } +// See RFC 8308, section 2.3 +const msgExtInfo = 7 + +type extInfoMsg struct { + NumExtensions uint32 `sshtype:"7"` + Payload []byte `ssh:"rest"` +} + // See RFC 4252, section 5. const msgUserAuthRequest = 50 @@ -180,11 +188,11 @@ const msgUserAuthInfoRequest = 60 const msgUserAuthInfoResponse = 61 type userAuthInfoRequestMsg struct { - User string `sshtype:"60"` - Instruction string - DeprecatedLanguage string - NumPrompts uint32 - Prompts []byte `ssh:"rest"` + Name string `sshtype:"60"` + Instruction string + Language string + NumPrompts uint32 + Prompts []byte `ssh:"rest"` } // See RFC 4254, section 5.1. @@ -782,6 +790,8 @@ func decode(packet []byte) (interface{}, error) { msg = new(serviceRequestMsg) case msgServiceAccept: msg = new(serviceAcceptMsg) + case msgExtInfo: + msg = new(extInfoMsg) case msgKexInit: msg = new(kexInitMsg) case msgKexDHInit: @@ -843,6 +853,7 @@ var packetTypeNames = map[byte]string{ msgDisconnect: "disconnectMsg", msgServiceRequest: "serviceRequestMsg", msgServiceAccept: "serviceAcceptMsg", + msgExtInfo: "extInfoMsg", msgKexInit: "kexInitMsg", msgKexDHInit: "kexDHInitMsg", msgKexDHReply: "kexDHReplyMsg", diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index b6911e83..2260b20a 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -68,8 +68,16 @@ type ServerConfig struct { // NoClientAuth is true if clients are allowed to connect without // authenticating. + // To determine NoClientAuth at runtime, set NoClientAuth to true + // and the optional NoClientAuthCallback to a non-nil value. NoClientAuth bool + // NoClientAuthCallback, if non-nil, is called when a user + // attempts to authenticate with auth method "none". + // NoClientAuth must also be set to true for this be used, or + // this func is unused. + NoClientAuthCallback func(ConnMetadata) (*Permissions, error) + // MaxAuthTries specifies the maximum number of authentication attempts // permitted per connection. If set to a negative number, the number of // attempts are unlimited. If set to zero, the number of attempts are limited @@ -120,7 +128,7 @@ type ServerConfig struct { } // AddHostKey adds a private key as a host key. If an existing host -// key exists with the same algorithm, it is overwritten. Each server +// key exists with the same public key format, it is replaced. Each server // config must have at least one host key. func (s *ServerConfig) AddHostKey(key Signer) { for i, k := range s.hostKeys { @@ -212,9 +220,10 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha } // signAndMarshal signs the data with the appropriate algorithm, -// and serializes the result in SSH wire format. -func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) { - sig, err := k.Sign(rand, data) +// and serializes the result in SSH wire format. algo is the negotiate +// algorithm and may be a certificate type. +func signAndMarshal(k AlgorithmSigner, rand io.Reader, data []byte, algo string) ([]byte, error) { + sig, err := k.SignWithAlgorithm(rand, data, underlyingAlgo(algo)) if err != nil { return nil, err } @@ -284,7 +293,7 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) func isAcceptableAlgo(algo string) bool { switch algo { - case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoSKECDSA256, KeyAlgoED25519, KeyAlgoSKED25519, + case KeyAlgoRSA, KeyAlgoRSASHA256, KeyAlgoRSASHA512, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoSKECDSA256, KeyAlgoED25519, KeyAlgoSKED25519, CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: return true } @@ -454,7 +463,11 @@ userAuthLoop: switch userAuthReq.Method { case "none": if config.NoClientAuth { - authErr = nil + if config.NoClientAuthCallback != nil { + perms, authErr = config.NoClientAuthCallback(s) + } else { + authErr = nil + } } // allow initial attempt of 'none' without penalty @@ -553,6 +566,7 @@ userAuthLoop: if !ok || len(payload) > 0 { return nil, parseError(msgUserAuthRequest) } + // Ensure the public key algo and signature algo // are supported. Compare the private key // algorithm name that corresponds to algo with @@ -562,7 +576,12 @@ userAuthLoop: authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) break } - signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) + if underlyingAlgo(algo) != sig.Format { + authErr = fmt.Errorf("ssh: signature %q not compatible with selected algorithm %q", sig.Format, algo) + break + } + + signedData := buildDataSignedForAuth(sessionID, userAuthReq, algo, pubKeyData) if err := pubKey.Verify(signedData, sig); err != nil { return nil, err @@ -633,6 +652,30 @@ userAuthLoop: } authFailures++ + if config.MaxAuthTries > 0 && authFailures >= config.MaxAuthTries { + // If we have hit the max attempts, don't bother sending the + // final SSH_MSG_USERAUTH_FAILURE message, since there are + // no more authentication methods which can be attempted, + // and this message may cause the client to re-attempt + // authentication while we send the disconnect message. + // Continue, and trigger the disconnect at the start of + // the loop. + // + // The SSH specification is somewhat confusing about this, + // RFC 4252 Section 5.1 requires each authentication failure + // be responded to with a respective SSH_MSG_USERAUTH_FAILURE + // message, but Section 4 says the server should disconnect + // after some number of attempts, but it isn't explicit which + // message should take precedence (i.e. should there be a failure + // message than a disconnect message, or if we are going to + // disconnect, should we only send that message.) + // + // Either way, OpenSSH disconnects immediately after the last + // failed authnetication attempt, and given they are typically + // considered the golden implementation it seems reasonable + // to match that behavior. + continue + } var failureMsg userAuthFailureMsg if config.PasswordCallback != nil { @@ -670,7 +713,7 @@ type sshClientKeyboardInteractive struct { *connection } -func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) { +func (c *sshClientKeyboardInteractive) Challenge(name, instruction string, questions []string, echos []bool) (answers []string, err error) { if len(questions) != len(echos) { return nil, errors.New("ssh: echos and questions must have equal length") } @@ -682,6 +725,7 @@ func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, quest } if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{ + Name: name, Instruction: instruction, NumPrompts: uint32(len(questions)), Prompts: prompts, diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go index d3321f6b..acef6225 100644 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -13,7 +13,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "sync" ) @@ -85,6 +84,7 @@ const ( IXANY = 39 IXOFF = 40 IMAXBEL = 41 + IUTF8 = 42 // RFC 8160 ISIG = 50 ICANON = 51 XCASE = 52 @@ -123,7 +123,7 @@ type Session struct { // output and error. // // If either is nil, Run connects the corresponding file - // descriptor to an instance of ioutil.Discard. There is a + // descriptor to an instance of io.Discard. There is a // fixed amount of buffering that is shared for the two streams. // If either blocks it may eventually cause the remote // command to block. @@ -505,7 +505,7 @@ func (s *Session) stdout() { return } if s.Stdout == nil { - s.Stdout = ioutil.Discard + s.Stdout = io.Discard } s.copyFuncs = append(s.copyFuncs, func() error { _, err := io.Copy(s.Stdout, s.ch) @@ -518,7 +518,7 @@ func (s *Session) stderr() { return } if s.Stderr == nil { - s.Stderr = ioutil.Discard + s.Stderr = io.Discard } s.copyFuncs = append(s.copyFuncs, func() error { _, err := io.Copy(s.Stderr, s.ch.Stderr()) diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index 49ddc2e7..acf5a21b 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -238,15 +238,19 @@ var ( // (to setup server->client keys) or clientKeys (for client->server keys). func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { cipherMode := cipherModes[algs.Cipher] - macMode := macModes[algs.MAC] iv := make([]byte, cipherMode.ivSize) key := make([]byte, cipherMode.keySize) - macKey := make([]byte, macMode.keySize) generateKeyMaterial(iv, d.ivTag, kex) generateKeyMaterial(key, d.keyTag, kex) - generateKeyMaterial(macKey, d.macKeyTag, kex) + + var macKey []byte + if !aeadCiphers[algs.Cipher] { + macMode := macModes[algs.MAC] + macKey = make([]byte, macMode.keySize) + generateKeyMaterial(macKey, d.macKeyTag, kex) + } return cipherModes[algs.Cipher].create(key, iv, macKey, algs) } diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go index 822ed42a..7a96eae3 100644 --- a/vendor/golang.org/x/net/html/doc.go +++ b/vendor/golang.org/x/net/html/doc.go @@ -92,6 +92,21 @@ example, to process each anchor node in depth-first order: The relevant specifications include: https://html.spec.whatwg.org/multipage/syntax.html and https://html.spec.whatwg.org/multipage/syntax.html#tokenization + +# Security Considerations + +Care should be taken when parsing and interpreting HTML, whether full documents +or fragments, within the framework of the HTML specification, especially with +regard to untrusted inputs. + +This package provides both a tokenizer and a parser. Only the parser constructs +a DOM according to the HTML specification, resolving malformed and misplaced +tags where appropriate. The tokenizer simply tokenizes the HTML presented to it, +and as such does not resolve issues that may exist in the processed HTML, +producing a literal interpretation of the input. + +If your use case requires semantically well-formed HTML, as defined by the +WHATWG specifiction, the parser should be used rather than the tokenizer. */ package html // import "golang.org/x/net/html" diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go index d8561396..04c6bec2 100644 --- a/vendor/golang.org/x/net/html/escape.go +++ b/vendor/golang.org/x/net/html/escape.go @@ -193,6 +193,87 @@ func lower(b []byte) []byte { return b } +// escapeComment is like func escape but escapes its input bytes less often. +// Per https://github.com/golang/go/issues/58246 some HTML comments are (1) +// meaningful and (2) contain angle brackets that we'd like to avoid escaping +// unless we have to. +// +// "We have to" includes the '&' byte, since that introduces other escapes. +// +// It also includes those bytes (not including EOF) that would otherwise end +// the comment. Per the summary table at the bottom of comment_test.go, this is +// the '>' byte that, per above, we'd like to avoid escaping unless we have to. +// +// Studying the summary table (and T actions in its '>' column) closely, we +// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the +// start of the comment data. State 52 is after a '!'. The other three states +// are after a '-'. +// +// Our algorithm is thus to escape every '&' and to escape '>' if and only if: +// - The '>' is after a '!' or '-' (in the unescaped data) or +// - The '>' is at the start of the comment data (after the opening ""); err != nil { diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go index ae24a6fd..5c2a1f4e 100644 --- a/vendor/golang.org/x/net/html/token.go +++ b/vendor/golang.org/x/net/html/token.go @@ -110,7 +110,7 @@ func (t Token) String() string { case SelfClosingTagToken: return "<" + t.tagString() + "/>" case CommentToken: - return "" + return "" case DoctypeToken: return "" } @@ -598,6 +598,11 @@ scriptDataDoubleEscapeEnd: // readComment reads the next comment token starting with "") return + } else if c == '-' { + dashCount = 1 + beginning = false + continue } } } @@ -645,6 +649,35 @@ func (z *Tokenizer) readComment() { } } +func (z *Tokenizer) calculateAbruptCommentDataEnd() int { + raw := z.Raw() + const prefixLen = len("